Uno de los juguetes favoritos de mis hijos es un set como este . En realidad, es uno de mis juguetes favoritos: he estado jugando con él y me ha estado dando algunas ideas de desafío de PPCG. Aquí hay uno:
Escriba un programa o función que tome un dibujo lineal ASCII como entrada y decida si se pliega o no en un cubo.
Entrada
La entrada consistirá en exactamente un hexomino construido a partir de cuadrados como este:
+-+
| |
+-+
Por ejemplo, una entrada válida heximino es:
+-+
| |
+-+-+-+-+
| | | | |
+-+-+-+-+
| |
+-+
Salida
- Un valor verdadero si el hexomino se puede plegar en un cubo, o
- Un valor falso de lo contrario.
Para ahorrarnos un poco de trabajo, wikipedia tiene buenos gráficos de:
- Los 35 hexominoes:
- Los 11 hexominós que se pliegan en cubos:
Notas
- Los hexominoes de entrada pueden tener cualquier rotación o reflexión, no solo los que se muestran en las imágenes de arriba
- Los hexominós de entrada pueden tener espacios iniciales, pero se alinearán correctamente con respecto a ellos mismos
- Los hexominós de entrada pueden tener espacio final al final de las líneas y líneas nuevas al final de la entrada
code-golf
ascii-art
kolmogorov-complexity
geometry
Trauma digital
fuente
fuente
Respuestas:
PMA / Caracoles , 130
o más "legible",
Inusualmente, surgió un problema que puede ser manejado por la cantidad limitada de características implementadas hasta ahora. El
!(z\ )
patrón determina que la posición actual está en el espacio en el medio de un cuadrado usando una afirmación negativa de que hay un espacio en alguna dirección "octilineal". La idea general es verificar un patrón que coloque un cuadrado en cada una de las 5 ubicaciones necesarias en relación con el cuadrado en el que comienza la coincidencia. Además, debe verificar que no esté en un bloque de cuadrados de 2x2. Antes de que el programa funcionara, tuve que corregir un error con el análisis de paréntesis.Si el hexomino no mapea un cubo,
0
se imprime. Si lo hace, se imprime un número entero positivo (número de coincidencias).He adaptado este generador poliominó para crear todos los posibles casos de prueba:
fuente
Ruby,
173148145143bytesÚltimo cambio:
/2
en el lado derecho de<
reemplazado por*2
en el lado izquierdo. Permite la eliminación de un conjunto de()
Explicación
El código consta de dos partes: una función principal sin nombre que realiza el análisis y una función auxiliar sin nombre asignada a la variable
h
que realiza la comprobación.La función principal escanea bytewise a través de la cadena, agregando las coordenadas x e y
i,j
de todos los+
símbolos encontrados enx[]
yy[]
. Luego llamah
dos veces. La primera vez que asume que el hexomino es horizontal (x[]
contiene los largos yy[]
los anchos) y la segunda vez que asume que es vertical.La función
h
toma las coordenadas longitudinales en la matriz yb
luego las coordenadas a lo ancho en la matrizc
. Calcula la longitud (en cuadrados) por la expresión(b.max.b.min)/2
. Si esto es menor o igual a 3, el hexomino debe evaluarse en la otra dirección para queh
regresefalse
.La inspección de los hexominos mostrará que si la longitud es 4, esos hexominos que se doblarán en un cubo no tienen más de 2 cuadrados (3
+
símbolos) en la primera y última fila . La mayoría de los cuadrados se concentran en la fila central, que se convertirá en el ecuador del cubo. Esta condición resulta necesaria y suficiente para un hexomino de longitud 4 que se pliega en un cubo.Solo hay un hexomino de longitud 5 que se doblará en un cubo. Tiene 3 cuadrados (4
+
símbolos) en su primera y última fila. Todos los demás hexominos de longitud 5 tienen 5 o más+
símbolos en la primera o última fila.Solo hay un hexomino de longitud 6. Tiene 7
+
símbolos en cada fila.Al juntar todo esto, es suficiente verificar que la longitud del hexomino sea mayor que 3, y que la cantidad de
+
símbolos en la primera y última fila (la que sea mayor) sea menor que la longitud.Sin golf en el programa de prueba
fuente
JavaScript (ES6), 443
431Editar corrección de errores, problema durante el análisis de entrada, eliminar columnas en blanco
Eso es muy largo, e incluso más, ya que analizar la entrada es una gran parte de la tarea.
Lo que hago es verificar si la entrada dada es uno de los 11 hexominós plegables.
Cada hexomino plegable se puede asignar a un mapa de bits de 5x5 (hasta 8 diferentes, con simmetría y rotaciones). Tomado los mapas de bits como un número de 25 bits, he encontrado los valores mínimos para los 11 hexominós anotados, usando el siguiente código (con un formato de entrada muy simple)
Eso da
[1505,2530,3024,4578,252,6552,2529,4577,2499,4547,7056]
Entonces, dada la cadena de entrada, tengo que hacer lo mismo para encontrar el mapa de bits mínimo, luego devolver verdadero si este número está presente en mi lista de precalc.
Ejecute el fragmento para probar en Firefox
Mostrar fragmento de código
fuente
,\nt=t
desde el final de la segunda línea / el comienzo de la tercera línea?