Las tiras de polis son un subconjunto de poliominós que se ajustan a las siguientes reglas:
- cada pieza consta de 1 o más celdas
- ninguna celda puede tener más de dos vecinos
- las celdas no deben encerrar un agujero
Los poliominoes libres son distintos cuando ninguno es una transformación rígida (traslación, rotación, reflexión o reflexión de deslizamiento) de otra (piezas que pueden recogerse y voltearse). Traducir, rotar, reflejar o deslizar reflejando un poliomino libre no cambia su forma ( Wikipedia )
Por ejemplo, hay 30 heptastrips libres (polystrips con longitud 7). Aquí están todos, empaquetados en una cuadrícula de 14x15.
Crédito de imagen: Miroslav Vicher
Objetivo
Escriba un programa / función que tome un entero positivo n
como entrada y enumere las distintas n
franjas de polystrips libres .
n = 1 -> 1 (un solo cuadrado)
n = 2 -> 1 (solo hay una posible 2-polystrip hecha de 2 cuadrados)
n = 3 -> 2 (uno está compuesto por 3 cuadrados unidos en una línea y el otro tiene forma de L)
n = 4 -> 3 (uno recto, uno en forma de L y uno en forma de Z)
. . .
Casos de prueba:
n polystrips
1 1
2 1
3 2
4 3
5 7
6 13
7 30
8 64
9 150
10 338
11 794
12 1836
13 4313
14 10067
15 23621
Puntuación
Este es el código de golf , por lo que el código más corto es mejor. Apreciaría mucho las explicaciones detalladas del algoritmo y el código.
Implementación de referencia parcial en J
Decidí describir cada pieza en formato "vector" y solo necesito bloques n-2 para describir una pieza de n-polystrip (solo hay 1 2-polystrip y se devuelve explícitamente). Los bloques describen la dirección relativa: 0: sin cambios; 1 - gire a la izquierda; 2 - gire a la derecha. No importa en qué dirección comenzará, sino solo para indicar dónde se colocará la siguiente celda. Puede haber cualquier número de ceros consecutivos, pero 1 y 2 siempre son únicos. Esta implementación es parcial porque no tiene en cuenta los agujeros: las soluciones para n> 6 también cuentan las piezas con agujeros.
fuente
101010
en su notación de muestra).Respuestas:
Python 3 ,
480433406364309299295 bytesParecía un buen punto para comenzar mi carrera PPCG (¿o no?).
Pruébalo en línea!
Ediciones:
D
yX
, y ajusté un poco en algunos puntos de golf.m
. (Los números complejos son realmente una característica de golf fuerte pero a menudo ignorada; adaptada de la solución de xnor para otro desafío )LFR
representación de cadena a-1,0,1
tuplas y sacrificó el tiempo de ejecución por una cantidad loca de reducción de bytes (!). Ahora la solución es teóricamente correcta, pero se agota el tiempo de espera antes de generar el resultado para 15.r
. ¡FINALMENTE BAJO 300 BYTES!1j
puede adherirse a cualquier otra cosa sin confundir al analizador (-2B), ynot
tiene una precedencia increíblemente baja (-2B).Versión obsoleta (480 bytes):
Pruébalo en línea!
Solución sin golf con comentarios:
Pruébalo en línea!
Ya no necesitamos esto, y ahora está garantizado que es correcto para el tamaño de entrada arbitrario, gracias al complejo número incorporado.m = 999
se elige porque se necesita un tiempo exponencial para contarlo todo, y ya se tarda unos 8 segundos en calcularlon = 1..15
. Tal vez esté bien guardar 1 byte usando 99 en su lugar.fuente
APL (Dyalog Unicode) ,
7065 bytesPruébalo en línea!
Versión completa del programa del siguiente código, gracias a Adám.
APL (Dyalog Unicode) , 70 bytes
Pruébalo en línea!
Cómo funciona
El código anterior es equivalente a la siguiente definición:
Esto funciona como la solución Python, pero en un orden diferente. Se
gen
eratesLFR
-strips de longitudn-2
,canonicalize
es cada tira, lleva∪
tiras nique,test
es cada tira si toca en sí (1 si no se tocan, 0 en caso contrario), y resume+/
el resultado booleano.gen
canonicalize
test
fuente