Eine De Bruijn-Folge ist interessant: Es ist die kürzeste, zyklische Folge, die alle möglichen Folgen eines gegebenen Alphabets einer gegebenen Länge enthält. Wenn wir zum Beispiel das Alphabet A, B, C und eine Länge von 3 betrachten, ist eine mögliche Ausgabe:
AAABBBCCCABCACCBBAACBCBABAC
Sie werden feststellen , dass jede mögliche 3-Zeichen - Sequenz mit den Buchstaben A
, B
und C
sind da drin.
Ihre Herausforderung besteht darin, eine De Bruijn-Sequenz mit möglichst wenigen Zeichen zu generieren. Ihre Funktion sollte zwei Parameter haben, eine Ganzzahl, die die Länge der Sequenzen darstellt, und eine Liste mit dem Alphabet. Ihre Ausgabe sollte die Reihenfolge in Listenform sein.
Sie können davon ausgehen, dass jedes Element im Alphabet unterschiedlich ist.
Einen Beispielgenerator finden Sie hier
Es gelten Standardlücken
quelle
Antworten:
Pyth, 31 Bytes
Dies ist die direkte Konvertierung des in meiner CJam-Antwort verwendeten Algorithmus . Golftipps willkommen!
Dieser Code definiert eine Funktion,
g
die zwei Argumente akzeptiert, die Zeichenfolge und die Zahl.Anwendungsbeispiel:
Ausgabe:
Code-Erweiterung:
Probieren Sie es hier aus
quelle
CJam,
52 4948 BytesDas ist überraschend lang. Hier kann man viel Golf spielen und dabei Tipps aus der Pyth-Übersetzung berücksichtigen.
Die Eingabe geht so
dh - Zeichenfolge der Liste der Zeichen und der Länge.
und die Ausgabe ist die De Bruijn-Zeichenfolge
Probieren Sie es hier online aus
quelle
CJam,
5249 BytesHier ist ein anderer Ansatz in CJam:
Nimmt Eingaben wie folgt vor:
und produziert eine Lyndon Arbeit wie
Probieren Sie es hier aus.
Dies nutzt die Beziehung zu Lyndon-Wörtern . Es generiert alle Lyndon-Wörter der Länge n in lexikografischer Reihenfolge (wie in diesem Wikipedia-Artikel beschrieben) und löscht dann diejenigen, deren Länge n nicht teilt . Dies ergibt bereits die De Bruijn-Sequenz, aber da ich die Lyndon-Wörter als Ziffernfolgen generiere, muss ich diese auch am Ende durch die entsprechenden Buchstaben ersetzen.
Aus Golfgründen betrachte ich die späteren Buchstaben des Alphabets als weniger lexikografisch.
quelle
JavaScript (ES6) 143
Mit Lyndon-Wörtern, wie Martin's Aswer, nur dreimal lang ...
Test In FireFox / Firebug - Konsole
Ausgabe
quelle
Python 2, 114 Bytes
Ich bin mir aufgrund meiner Herangehensweise nicht sicher, wie ich mehr Golf spielen soll.
Probieren Sie es online aus
Ungolfed:
Dieser Code ist eine triviale Modifikation von meiner Lösung zu einer neueren Herausforderung.
Der einzige Grund, der
[:1-n]
benötigt wird, ist, dass die Sequenz den Wrap-Around enthält.quelle
Powershell,
16496 Bytes-68 Bytes mit -match
O($n*2^n)
statt rekursivem GeneratorO(n*log(n))
Ungolfed & Testskript:
Ausgabe:
Siehe auch: Ein Ring, um alle zu regieren. Ein String für alle
quelle