Die Herausforderung ist einfach: Schreiben Sie ein Programm oder eine Funktion, die bei einer endlichen nicht-negativen Ganzzahl ein verschachteltes Array ausgibt.
Die Regeln
- Ihr Code muss für jede Ganzzahl 0 ≤ n <2 31 ein eindeutiges gültiges verschachteltes Array erzeugen .
- Innerhalb dieses Bereichs muss jedes mögliche verschachtelte Array mit bis zu 16 offenen Klammern ausgegeben werden. (Dies bedeutet nicht, dass Ihr Code niemals ein verschachteltes Array mit mehr als 16 offenen Klammern ausgeben kann.)
- Ihr Code gibt möglicherweise eine Zeichenfolgendarstellung des verschachtelten Arrays anstelle eines tatsächlichen Arrays (mit oder ohne Kommas) aus.
Eine mögliche Zuordnung:
0 -> []
1 -> [[]]
2 -> [[[]]]
3 -> [[], []]
4 -> [[[[]]]]
5 -> [[[], []]]
6 -> [[[]], []]
7 -> [[], [[]]]
8 -> [[], [], []]
9 -> [[[[[]]]]]
etc.
Wertung
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes.
code-golf
array-manipulation
balanced-string
ETHproductions
quelle
quelle
Antworten:
Python 2.7,
172 149 124118 BytesErläuterung:
Definieren Sie eine Bijektion mit
[
↔1
und]
↔0
. Jede Anordnung von Klammern kann dann als Binärzahl geschrieben werden und umgekehrt, zum Beispiel[][]
↔1010
(10) und[[][]]
↔110100
(52). Alle gültigen Anordnungen von bis zu 15 offenen Klammern (insgesamt 30 Klammern) werden durch Zahlen mit bis zu 30 Bits (ohne führende Nullen) abgedeckt, bei denen es sich genau um Zahlen unter 2 31 handelt .Die erste for-Schleife gibt die Umkehrung dieses Bijektors an und konvertiert eine Zahl in eine Anordnung von Klammern, während überprüft wird, ob die Anordnung gültig ist.
Ungültige Anordnungen werden in der Druckanweisung durch lange Reihen von Klammern ersetzt, um Kollisionen zu vermeiden. Zum Beispiel ist
11
(3) ↔[[
nicht gültig, also verketten wir stattdessen 3 + 16 Klammern. Dies stellt sicher, dass alle Arrangements einzigartig sind.Die resultierende Anordnung wird in ein Paar von Klammern gesetzt, um ein verschachteltes Array zu bilden, so dass
1010
(10) wird[[][]]
und110100
(52) wird[[[][]]]
. Die zusätzliche offene Klammer bedeutet, dass wir jetzt alle Arrays mit 16 offenen Klammern abgedeckt haben.Das folgende Programm kann verwendet werden, um die Nummer für ein bestimmtes Array mit bis zu 16 Klammern zu ermitteln.
quelle
Python,
153128 BytesWir ordnen einer verschachtelten Liste eine Zahl n zu, indem wir ihre Binärziffern von links nach rechts betrachten. Dieser Algorithmus funktioniert für jede Zahl, nicht nur für unter 2 32 .
[
.][
.][
.]
.Zum Schluss schließen wir alle geöffneten Klammern.
quelle
Löffel , 63 Bytes (501 Bits)
Dies ist das folgende Brainfuck-Programm, das in Löffel umgewandelt wurde:
Liest eine Ganzzahl in binär auf stdin und gibt die verschachtelte Liste auf stdin aus. Erfordert die Eingabe von 0 als leere Zeichenfolge (keine Ziffern) und einen Brainfuck-Interpreter mit 8-Bit-Zellen. Gleicher Algorithmus wie meine Python-Antwort.
Lesbare Version:
quelle
Gelee , 28 Bytes
Diese iteriert über alle Saiten der Zeichen
[
und]
beginnen mit dem[
und am Ende mit einem]
, überprüft , ob die Klammern entsprechen, und druckt die n - te Spiel.Probieren Sie es online!
quelle
Perl,
8079 BytesVerwendet wieder den Algorithmus von orlp , aber dieses Mal habe ich zuerst geprüft, ob es funktioniert ...
Beinhaltet +1 für
-p
Geben Sie die Eingangsnummer für STDIN ein
nest.pl
:Linus 'Lösung ist 64 Bytes in Perl:
Dennis 'Lösung ist 59 Bytes in Perl (zunehmend langsamer für große Zahlen):
quelle
-p
als 1 extra Byte gezähltPython 3,
120114 BytesTeste es auf Ideone .
Wie es funktioniert
Die definierte Funktion f nimmt den Eingang n und initialisiert k auf 0 . Wir werden k so lange inkrementieren, bis n + 1 Werte von k eine gültige Ausgabe ergeben. Jedes Mal, wenn wir einen solchen Wert von k finden , wird n dekrementiert, sobald es -1 erreicht ,
~n
ergibt 0 und die Liste r , die dem letzten Wert von k entspricht wird gedruckt.Die teilweise Zuordnung der positiven Ganzzahlen zu verschachtelten Listen (dh k ↦ r ) muss bijektiv sein, es gibt jedoch keine anderen Einschränkungen. Die in dieser Antwort verwendete Methode funktioniert wie folgt.
Wandle k in eine binäre Zeichenfolgendarstellung um und starre mit 0b .
Zum Beispiel 44 ≤ "0b101100" .
Ersetzen Sie alle 0 's (Codepunkt 48 ) in der String - Darstellung mit der Zeichenkette "]" , und all 1 ' s (Codepunkt 49 ) mit [ .
Zum Beispiel "0b101100" ↦ "], b [], [[],]," .
Entfernen Sie die ersten drei Zeichen (sie entsprechen "0b") ) und das Zeichen (hoffentlich ein Komma).
Zum Beispiel "], b [], [[],]," ↦ "[], [[],]" .
Versuchen Sie, den generierten Code auszuwerten. Wenn dies zu einem Fehler führt, wird k keiner Liste zugeordnet.
Zum Beispiel "[], [[],]" ↦ ([], [[]]) .
Verketten Sie das Ergebnis (falls vorhanden) mit der leeren Liste. Wenn dies zu einem Fehler führt, wird k keiner Liste zugeordnet.
Zum Beispiel ([], []]) + [] Fehler, da + Listen und Tupel nicht verketten kann.
quelle
Haskell, 71 Bytes
Die Hauptfunktion in der letzten Zeile indiziert eine Liste aller verschachtelten Arrays, sortiert nach Größe (Anzahl der offenen Klammern). Daher werden alle Arrays mit einer Größe von höchstens 16 zuerst aufgelistet.
Schauen wir uns zuerst Code an, der schöner und kürzer ist, aber Haskells Typechecker lehnt es ab, ihn zu akzeptieren.
Die Funktion
p
bei der Eingaben
gibt eine Liste aller verschachtelten Arrays der Größen
(offene Klammern). Dies erfolgt rekursiv. Jedes solche Array besteht aus einem Kopfh
(erstes Glied) von Größek
und einem Schwanzt
(andere Elemente) der Größen-k
, wobei beide Größen ungleich Null sind. Oder es ist das leere Array für die Größen==1
.Der Ausdruck wird
p=<<[1..]
dann flacherp(1), p(2), ...
zu einer einzigen unendlichen Liste aller Arrays, sortiert nach Größe, zusammengefasstund die Hauptfunktion indiziert es.
... Oder es wäre, wenn Haskell nicht darüber jammern würde, "den unendlichen Typ zu konstruieren: t ~ [t]". Haskell kann die unendliche Liste nicht darstellen, deren Elemente willkürlich verschachtelte Arrays sind. Alle seine Elemente müssen denselben Typ haben, ein Typ t kann jedoch nicht mit einer Liste von t identisch sein. In der Tat ist die Funktion
p
selbst kein konsistenter Typ ohne abhängige Typisierung zugewiesen werden, der Haskell fehlt.Also arbeiten wir stattdessen an Klammerfolgen und simulieren die Nachteile, indem wir auf
[
und]
Zeichen einwirken . Dies benötigt zusätzliche 9 Bytes. Die Gefahren des Golfspiels in einer typsicheren Sprache.quelle
Haskell,
8782 BytesGibt die Array-Elemente aus. Anwendungsbeispiel:
(([0..]>>= \y->y#y)!!) 3
->"[][]"
.Function erstellt
#
alle verschachtelten Arrays als Zeichenfolgen fürn
offene undm
geschlossene Klammern, indem protokolliert wird, wie viele davon noch übrig sind. Beginnt immer mitn == m
. Die Hauptfunktion rufty # y
jeden aufy <- [0,1,...]
und wählt das Element an dem von der Eingabe angegebenen Index aus.quelle
MATL , 31 Bytes
Probieren Sie es online! Oder überprüfen Sie die ersten Testfälle (dauert einige Sekunden).
Das erstellte Mapping ist:
Erläuterung
Der Code testet immer mehr Binärzahlen, wobei die Ziffer
0
durch ersetzt wird-1
. das heißt, mit1
und-1
als Ziffern. Die Ziffer1
repräsentiert'['
und-1
repräsentiert']'
.Das Programm zählt, bis n + 1 gültige Nummern erhalten wurden. Eine Zahl ist gültig, wenn die folgenden zwei Bedingungen erfüllt sind:
1
und-1
)1
Ziffernanzahl übersteigt immer die von-1
), außer am Ende (wo sie gemäß Bedingung 1 Null ist).Sobald n + 1 gültige Zahlen erhalten wurden, wird die letzte durch Ändern
1
in[
und-1
in transliteriert]
und dann angezeigt.Code:
quelle