Alice , 14 12 Bytes
/O
\i@/t&Yd&
Probieren Sie es online!
Inverse Funktion (nicht golfen):
/o Q
\i@/~~\ /dt&Z
Probieren Sie es online!
Erläuterung
Alice hat eine eingebaute Bijektion zwischen ℤ und ℤ 2 , die mit Y
(auspacken) und seiner Umkehrung Z
(packen) berechnet werden kann . Hier ist ein Auszug aus den Dokumenten, in denen die Bijektion erklärt wird:
Die Details der Bijektion sind für die meisten Anwendungsfälle wahrscheinlich irrelevant. Der wichtigste Punkt ist, dass der Benutzer zwei Ganzzahlen in einer codieren und die beiden Ganzzahlen später erneut extrahieren kann. Durch wiederholtes Anwenden des Befehls pack können ganze Listen oder ganze Zahlenbäume in einer einzigen Zahl gespeichert werden (obwohl dies nicht besonders speichereffizient ist). Die durch die Packoperation berechnete Abbildung ist eine bijektive Funktion ℤ 2 → ℤ (dh eine Eins-zu-Eins-Abbildung). Zunächst werden die Ganzzahlen {..., -2, -1, 0, 1, 2, ...} auf die natürlichen Zahlen (einschließlich Null) wie {..., 3, 1, 0, 2, 4 abgebildet , ...} (mit anderen Worten, negative Ganzzahlen werden ungeraden natürlichen und nicht -negative ganze Zahlen sind sogar natürlichen Werten zugeordnet). Die beiden natürlichen Zahlen werden dann über die Taste 1 zugeordnetCantor Pairing-Funktion , bei der die Naturals entlang der Diagonalen des ersten Quadranten des Ganzzahlgitters geschrieben werden. Insbesondere {(0,0), (1,0), (0,1), (2,0), (1,1), (0,2), (3,0), ...} sind zugeordnet auf {0, 1, 2, 3, 4, 5, 6, ...} . Die resultierende natürliche Zahl wird dann unter Verwendung der Umkehrung der früheren Bijektion auf die ganzen Zahlen zurück abgebildet. Der Befehl unpack berechnet genau die Umkehrung dieser Zuordnung.
Wie oben erwähnt, können wir diese auspacken Betrieb verwenden , um Karte z zu z k als auch. Nachdem wir es auf die anfängliche Ganzzahl angewendet haben, können wir die zweite Ganzzahl des Ergebnisses wieder entpacken, wodurch wir eine Liste mit drei Ganzzahlen erhalten. Also geben k-1- Anwendungen von Y
uns k ganze Zahlen als Ergebnis.
Wir können die Inverse berechnen, indem wir die Liste Z
von Ende an mit packen .
Das Programm selbst hat also diese Struktur:
/O
\i@/...d&
Dies ist nur eine grundlegende Vorlage für ein Programm, das eine variable Anzahl von Dezimalzahlen als Eingabe liest und als Ergebnis eine variable Anzahl ausgibt. Der eigentliche Code ist also wirklich nur:
t Decrement k.
& Repeat the next command k-1 times.
Y Unpack.
Eine Sache, die ich ansprechen möchte, ist: "Warum sollte Alice ein eingebautes ℤ → ℤ 2- Bijection haben, ist das nicht ein Gebiet der Golfsprache ?" Wie bei den meisten von Alices weirder Einbauten, ist der Hauptgrund Alices Konstruktionsprinzip , dass jeder Befehl hat zwei Bedeutungen, eine für Cardinal (integer) Modus und einen für Ordinal (string) Modus, und diese beiden Bedeutungen werden sollte irgendwie im Zusammenhang zu geben , Kardinal- und Ordinalmodus das Gefühl, dass sie Spiegeluniversen sind, in denen die Dinge irgendwie gleich, aber auch verschieden sind. Und ziemlich oft hatte ich einen Befehl für einen der beiden Modi, die ich hinzufügen wollte, und musste dann herausfinden, mit welchem anderen Befehl ich ihn koppeln wollte.
Im Fall von Y
und war der Z
Ordnungsmodus das erste: Ich wollte eine Funktion zum Verschachteln von zwei Zeichenfolgen (zip) und zum erneuten Trennen (unzip). Die Qualität davon, die ich im Kardinalmodus erfassen wollte, bestand darin, eine Ganzzahl aus zwei zu bilden und die beiden Ganzzahlen später wieder extrahieren zu können, was eine solche Bijektion zur natürlichen Wahl macht.
Ich dachte mir auch, dass dies außerhalb des Golfsports sehr nützlich wäre, da Sie damit eine ganze Liste oder sogar einen ganzen Baum von Zahlen in einer einzigen Speichereinheit (Stapelelement, Bandzelle oder Gitterzelle) speichern können.
k
undx
anstelle von ganzen Zahlen zu verwenden?