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.
quelle
101010
in Ihrer Beispielnotation)?Antworten:
Python 3 ,
480433406364309299295 BytesSah nach einem guten Zeitpunkt aus, um meine PPCG-Karriere zu beginnen (oder nicht?).
Probieren Sie es online!
Bearbeitungen:
D
undX
, und an einigen Golfplätzen ein wenig optimiert.m
. (Komplexe Zahlen sind wirklich ein starkes, aber oft ignoriertes Golf-Feature; angepasst von der Lösung von xnor für eine andere Herausforderung )LFR
Zeichenfolgendarstellung wurde in-1,0,1
Tupel geändert und die Ausführungszeit für die verrückte Reduzierung der Bytezahl (!) Geopfert. Jetzt ist die Lösung theoretisch korrekt, es treten jedoch Zeitüberschreitungen auf, bevor das Ergebnis für 15 ausgegeben wird.r
. ENDLICH UNTER 300 BYTES !!!1j
kann man sich an nichts anderes halten, ohne den Parser (-2B) zu verwirren, undnot
hat eine wahnsinnig niedrige Priorität (-2B).Veraltete Version (480 Bytes):
Probieren Sie es online!
Ungolfed Lösung mit Kommentaren:
Probieren Sie es online!
Wir brauchen das nicht mehr und jetzt ist es dank der integrierten komplexen Zahl garantiert für jede beliebige Eingabegröße richtig.m = 999
wird gewählt, weil es exponentiell lange dauert, alles zu zählen, und es bereits ~ 8s dauert, um zu berechnenn = 1..15
. Vielleicht ist es in Ordnung, 1 Byte zu speichern, indem Sie stattdessen 99 verwenden.quelle
APL (Dyalog Unicode) ,
70 bis65 ByteProbieren Sie es online!
Vollständige Programmversion des folgenden Codes, danke an Adám.
APL (Dyalog Unicode) , 70 Byte
Probieren Sie es online!
Wie es funktioniert
Der obige Code entspricht der folgenden Definition:
Dies funktioniert wie die Python-Lösung, jedoch in einer anderen Reihenfolge. Es
gen
löschtLFR
-Längenstreifenn-2
,canonicalize
s jeden Streifen, nimmt∪
spezielle Streifen,test
s jeden Streifen, wenn er sich selbst berührt (1, wenn er sich nicht berührt, 0, wenn er sich nicht berührt), und summiert+/
das Boolesche Ergebnis.gen
canonicalize
test
quelle