Erzeugen Sie bei einer positiven k > 1
und einer nicht negativen ganzen Zahl i
ein k
Tupel (oder einen k
dimensionalen Vektor) von nicht negativen ganzen Zahlen. Für jeden k
, die Karte von n zu n k , muss bijektiv sein . Das heißt, jede Eingabe i
sollte ein anderes Tupel erzeugen, und jedes mögliche Tupel muss von einer Eingabe erzeugt werden i
.
Sie können ein Programm oder eine Funktion schreiben, indem Sie eine Eingabe über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) ausgeben.
Sie können für die Ausgabe jedes bequeme, eindeutige und flache Listenformat verwenden.
Ihre Lösung sollte keine künstlichen Grenzen setzen k
und i
Sie können davon ausgehen, dass sie in die native Ganzzahlgröße Ihrer Sprache passen. Zumindest müssen Sie Werte bis zu einer 255
nativen Ganzzahlgröße unterstützen, die kleiner ist.
Für alle 1 < k < 32
, sollten Sie Ihren Code ein Ergebnis in wenigen Sekunden erzeugen (natürlich nur , wenn Ihre Antwort nicht unterstützt , dass große aufgrund der vorherigen Regel wird die Grenze entsprechend angepasst). Dies sollte kein Problem sein: Es ist möglich, diese Herausforderung so zu lösen, dass sie in wenigen Sekunden bis zu 2 128 funktioniert , aber das Limit besteht darin, Antworten zu vermeiden, die tatsächlich von bis iterieren , um das Ergebnis zu finden.i < 231
i
0
i
Bitte geben Sie in Ihrer Antwort eine Beschreibung der von Ihnen gewählten Zuordnung und eine Begründung an, warum sie bijektiv ist (dies muss kein formaler Beweis sein).
Dies ist Code Golf, die kürzeste Antwort (in Bytes) gewinnt.
Verwandte Herausforderungen
quelle
q~2bW%1$Te]/zWf%2fbp
(entgegengesetzte Eingabereihenfolge)CJam, 18 Bytes
Es benutzt eine dummere Formel.
Probieren Sie es hier aus .
Erläuterung
Zusammenfassend wird eine positive Ganzzahl zugeordnet zu:
quelle
Python 2, 62
Dieser Code ist hässlich und golfen, aber die Idee ist sehr einfach.
Packen Sie
k
binäre Erweiterungen in eine, indem Sie jedek
Ziffer mit unterschiedlichen Offsets lesen . Beispiel: Mitk=3
der Eingabe wird357
Folgendes zugeordnet(3,0,7)
:Wenn Sie die Zahlen wieder zusammenzippen, wird dies rückgängig gemacht. Stellen Sie sich dabei die binären Erweiterungen als unendlich viele führende Nullen vor.
quelle
J,
382827 BytesDies ist ein stillschweigendes, dyadisches Verb, das i und k als linkes und rechtes Argument verwendet. Versuchen Sie es online mit J.js .
Idee
Wir definieren eine Abbildung f: N → N k durch f (i): = (α 1 , ... α k-1 , p 1 α k ... p 2 α k + 1 ... - 1), wobei⟨p n ⟩ist Folge von Primzahlen undi + 1 = p 1 α 1 p 2 α 2 ….
Nach dem Fundamental Arithmetic Theorem ist die durch g (i): = (α 1 , α 2 ,…) definierte Abbildung g: N → N ω (Exponenten der Primfaktorisierung von i + 1 ) bijektiv.
Da f (i) = (g 1 (i), ... g k-1 (i), g -1 (g k (i), g k + 1 (i), ...)) , die Karte f bijektiv ist als Gut.
Code
quelle
Python 2, 72
Die Funktion
q
wirkt auf Binärzahlen, indem jedes zweite Bit vom Ende an genommen wird. Infolgedessenq(z), q(z>>1)
gibt es zwei Zahlen, deren Binärziffern sich streuenz
. Zum Beispiel teilt sich 594 in 12 und 17.Dies ist ein Misserfolg, da wir die Nummern wieder zusammenzippen können, um die ursprüngliche Nummer wiederherzustellen.
Die Funktion
g
wendet diese Bijektionszeitenk-1
an und erweitert sie von einem einzelnen Element zu einem Paar zu einem Dreifachen ... zu einemk
-Tupel. Jedes Mal wird das letzte Element auf zwei Elemente erweitert. Dies geschieht rekursiv, indem die Eingabe über die Bijektion einem Paar zugeordnet wird, das erste Element des Paares für den ersten Eintrag der Ausgabe verwendet und die Funktion rekursiv mit angewendet wirdk-1
auf das zweite Element angewendet wird, um die verbleibenden Einträge zu erzeugen.quelle