I polistrip sono un sottoinsieme di poliomino conformi alle seguenti regole:
- ogni pezzo è composto da 1 o più celle
- nessuna cellula può avere più di due vicini
- le celle non dovrebbero racchiudere un buco
I poliomino liberi sono distinti quando nessuno è una trasformazione rigida (traslazione, rotazione, riflessione o riflessione di planata) di un altro (pezzi che possono essere raccolti e capovolti). Tradurre, ruotare, riflettere o scivolare riflettendo un poliamino libero non cambia forma ( Wikipedia )
Ad esempio, ci sono 30 heptastrips gratuiti (polystrips con lunghezza 7). Eccoli tutti, confezionati in una griglia 14x15.
Credito d'immagine: Miroslav Vicher
Obbiettivo
Scrivi un programma / funzione che accetta un intero positivo n
come input ed enumera le distinte n
-polystrips distinte .
n = 1 -> 1 (un singolo quadrato)
n = 2 -> 1 (Esiste solo una possibile 2 polistrip composta da 2 quadrati)
n = 3 -> 2 (uno è composto da 3 quadrati uniti in una linea e l'altro a forma di L)
n = 4 -> 3 (uno dritto, uno a L e uno a Z)
. . .
Casi test:
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
punteggio
Questo è code-golf , quindi il codice più corto è migliore. Apprezzerei molto le spiegazioni dettagliate dell'algoritmo e del codice.
Implementazione parziale di riferimento in J
Ho deciso di descrivere ogni pezzo in formato "vettoriale" e ho solo bisogno di blocchi n-2 per descrivere un pezzo n-polystrip (c'è solo 1 polistrip 2 ed è restituito esplicitamente). I blocchi descrivono la direzione relativa: 0 - nessuna modifica; 1 - svolta a sinistra; 2 - girare a destra. Non importa quale direzione si inizierà, ma solo per indicare dove deve essere posizionata la cella successiva. Può esserci un numero qualsiasi di 0 consecutivi, ma 1 e 2 sono sempre singoli. Questa implementazione è parziale, perché non tiene conto dei fori - le soluzioni per n> 6 contano anche i pezzi con fori.
101010
nella notazione del campione)?