Polystreifen sind eine Untergruppe von Polyominoen, die den folgenden Regeln entsprechen:
- Jedes Stück besteht aus einer oder mehreren Zellen
- Keine Zelle kann mehr als zwei Nachbarn haben
- Die Zellen sollten kein Loch einschließen
Freie Polyominoes unterscheiden sich, wenn keines eine starre Transformation (Translation, Rotation, Reflektion oder Gleitreflexion) eines anderen ist (Stücke, die aufgenommen und umgedreht werden können). Das Verschieben, Drehen, Reflektieren oder Gleiten eines freien Polyominos ändert seine Form nicht ( Wikipedia )
Zum Beispiel gibt es 30 freie Heptastrips (Polystrips mit der Länge 7). Hier sind alle in einem 14x15-Raster verpackt.
Tor
Schreiben Sie ein Programm / eine Funktion, die eine positive Ganzzahl n
als Eingabe verwendet und die verschiedenen freien n
Streifen auflistet.
n = 1 -> 1 (Ein einzelnes Quadrat)
n = 2 -> 1 (Es gibt nur einen möglichen 2-Polystreifen aus 2 Quadraten)
n = 3 -> 2 (Eines besteht aus 3 in einer Linie verbundenen Quadraten und das andere ist L-förmig)
n = 4 -> 3 (eine gerade, eine L-förmige und eine Z-förmige)
. . .
Testfälle:
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
Wertung
Das ist Code-Golf , also ist der kürzere Code besser. Ich würde mich sehr über detaillierte Erklärungen des Algorithmus und des Codes freuen.
Teilweise Referenzimplementierung in J
Ich habe beschlossen, jedes Stück im "Vektor" -Format zu beschreiben, und ich benötige nur n-2 Blöcke, um ein n-Polystrip-Stück zu beschreiben (es gibt nur 1 2-Polystrip und es wird explizit zurückgegeben). Die Blöcke beschreiben die relative Richtung: 0 - keine Änderung; 1 - links abbiegen; 2 - rechts abbiegen. Es spielt keine Rolle, in welche Richtung man startet, sondern nur, um anzuzeigen, wo die nächste Zelle platziert werden soll. Es kann eine beliebige Anzahl aufeinanderfolgender Nullen geben, aber Einsen und Zweisen sind immer einzeln. Diese Implementierung ist teilweise, da sie die Löcher nicht berücksichtigt - Lösungen für n> 6 zählen auch die Teile mit Löchern.
101010
in Ihrer Beispielnotation)?