Rejillas Triangulares: Poliamantes Simplemente Conectados

9

Mientras estamos en una patada de cuadrículas triangulares , me gustaría señalar que hay un equivalente a los poliominós en una cuadrícula triangular. Se llaman poliiamantes , y son formas formadas al pegar triángulos equiláteros a lo largo de sus bordes. En este desafío, usted decidirá qué subconjuntos de una cuadrícula triangular son poliiamantes y si tienen agujeros en ellos. Debido a que solo se necesitan 9 triángulos para hacer un polyiamond con un agujero, su código debe ser lo más corto posible.

La cuadrícula

Utilizaremos el diseño de cuadrícula triangular de Martin para la entrada:

una cuadrícula triangular

Presta atención al hecho de que los centros de los triángulos forman una cuadrícula aproximadamente rectangular y que el triángulo superior izquierdo "apunta" hacia arriba. Podemos describir un subconjunto de esta cuadrícula, entonces, dando un "mapa estelar" rectangular que indique qué triángulos están incluidos y cuáles no. Por ejemplo, este mapa:

** **
*****

corresponde al poliamond más pequeño que contiene un agujero:

9-iamond con agujero

Agujeros

Un polyiamond que contiene un agujero como el ejemplo anterior (una región que no forma parte del polyiamond, que está rodeada por todos lados por regiones que lo son ) no está, topológicamente hablando, simplemente conectado .

El reto

Escriba una función o programa que tome como entrada un "mapa estelar" como se describió anteriormente y genere una verdad si y solo si el subconjunto indicado de la cuadrícula triangular es un poliamond simplemente conectado .

Más ejemplos

*** ***
*******

corresponde al polyiamond

13-iamond sin agujero

que simplemente está conectado


*   *
** **
 ***

corresponde al polyiamond

9-iamond sin agujero

que simplemente está conectado


**  **
*** **
 ****

corresponde a la no- polyiamond

13 triángulos que no son nada interesantes

que no estaría simplemente conectado incluso si fuera un poliamante.

Especificación de entrada

  • La entrada consistirá solo en asteriscos, espacios y saltos de línea.
  • El primer carácter de entrada siempre será un espacio o un asterisco (correspondiente al triángulo que apunta hacia arriba en la esquina superior izquierda de la cuadrícula).
  • Siempre habrá al menos un asterisco en la primera y última línea.
  • NO hay garantía de que las líneas después de la primera línea no estén vacías. Dos avances de línea seguidos pueden aparecer en una entrada legítima.
  • Las longitudes de línea no necesitan ser todas iguales.

Condición ganadora

Este es el , por lo que la respuesta más corta en bytes gana.

Casos de prueba

Mapas de verdad:

1) *

2) *
   *

3) **

4) *** ***
   *******

5) *   *
   ** **
    ***

6) *
   **
    *

7)    **
     ***
   ****

8) ****
   **   *
    *****

9) ***********
   **    **  **
    ****  **  **
              **
   ************

Mapas de falsa:

1) *
   *
   *

2) * *

3) *
    *

4)  **
   **

5) ***

   ***

6) ** **
   *****

7) **  **
   *** **
    ****

8)  *
    *

9) *****
   **   *
    *****
quintapia
fuente
1
buena pregunta. Si las cuadrículas triangulares van a convertirse en una cosa, puedo sugerir que se representen como, por ejemplo, en AV VA\nVAVAVlugar de hacerlo ** **\n*****, ya que facilita la visualización de un humano. Ya hice una edición en uno de los diagramas ASCII de Martin.
Level River St
No estaba particularmente preocupado por la legibilidad humana, no. Quería hacer lo que fuera más fácil de leer para un programa sin dejar de ser pequeño.
quintopia
Entonces, básicamente, ¿falso si hay una sección solo "conectada" por esquinas?
Michael Klein
1
O si hay partes que no están conectadas en absoluto. Martin lo expresó de esta manera: es cierto si la figura y el suelo están conectados a lo largo de los bordes, de modo que 2 rellenos de inundación son suficientes para cambiar el color del avión.
quintopia

Respuestas:

4

Caracoles , 95 bytes

F&
lr|=((ul.)2 ,l~a~)d|!((ul.)2 ,l~a~)u}\*}+l\ ,~a~|{\ (lr|=((ul.)2 ,l~a~)d|!((ul.)2 ,l~a~)u}+~

Esto realmente sufrió duplicación, ya que no he implementado macros ni ningún tipo de referencia. Lo que hace es verificar que para cada estrella, exista un camino hacia la estrella más a la izquierda en la línea superior; y para cada espacio, hay un camino hacia un borde de la cuadrícula.

F&                         ,, option F: pad lines with spaces to the length of the longest
                           ,, option &: print 1 iff match succeeds from every cell
lr                         ,, direction left or right, or
      | =((ul.)2 ,l~a~) d  ,, direction down, if we are an even number of orthogonal moves from the top left
      | !((ul.)2 ,l~a~) u  ,, or, direction up if we are odd number of moves from the top left
    }  \*                  ,, literal '*'
}+                         ,, 1 or more times
l\ ,~a~                    ,, check that we are on the leftmost * in the top line

|                          ,, the part before this is for starting on '*'; part after for starting on ' '

{ \                        ,, literal ' '
    (   lr                 ,, direction left or right, or
      | =((ul.)2 ,l~a~) d  ,, same drill as before...
      | !((ul.)2 ,l~a~) u 
}+                         ,, 1 or more times
~                          ,, end on an out of bounds cell
Feersum
fuente
No entiendo cómo funciona, pero funciona totalmente.
quintopia
3

CJam, 101 98 bytes

qN/_z,f{' e]}{S2*f+W%z}4*:eeee::f+:~{_(aL{+_{_2,.+1$2,.-@_:+1&!2*(a.+}%2${a1$&},\;@1$-@@}h;\;-}2*!

Pruébalo en línea.

Finalmente superé mi miedo a implementar un relleno de inundación en CJam. Es tan feo como esperaba, y definitivamente se puede jugar al golf.

La idea general es realizar dos rellenos de inundación (que en realidad se implementan como eliminaciones de la lista de celdas no visitadas). La primera pasada eliminará todos los espacios accesibles desde el borde. La segunda pasada luego elegirá la primera *en orden de lectura y eliminará todos los triángulos a los que se pueda llegar. Si y solo si la lista resultante está vacía, el polyiamond simplemente se conectó:

  • Si el polyiamond tenía un agujero, el primer relleno de inundación no puede alcanzar y quitar ese agujero.
  • Si la entrada consta de varios poliiamantes desconectados, el segundo relleno de inundación no puede alcanzarlos y eliminarlos.
Martin Ender
fuente