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.
101010
en su notación de muestra).