Diese Herausforderung stellte einen Algorithmus zum Codieren einer Ganzzahl n
als eine andere Ganzzahl dar r
. Was folgt, ist eine kurze Erklärung dieses Algorithmus am n=60
Beispiel.
Der ursprüngliche Algorithmus
Zuerst codieren wir die Zahl als eine Klammer.
- Wenn
n = 1
, geben Sie eine leere Zeichenfolge zurück. - Andernfalls nehmen wir die
n
aufsteigende Primzerlegung sortiert und ersetzen jedes Element durch seinen Primindex (1-indiziert) in Klammern.60 = 2*2*3*5 => [1][1][2][3]
- Tun Sie dies rekursiv, bis wir nur noch Klammern haben.
[1][1][2][3] => [][][[1]][[2]] => [][][[]][[[1]]] => [][][[]][[[]]]
- Wenn
Sobald wir unsere Klammer haben, konvertieren wir diese mit dem folgenden Prozess in eine Ganzzahl.
- Konvertieren Sie jede öffnende Klammer in a
1
und jede schließende Klammer in a0
.[][][[]][[[]]] => 10101100111000
- Entfernen Sie alle nachfolgenden
0
s und das Finale1
.10101100111000 => 1010110011
- Konvertieren Sie die letzte Zeichenfolge von
0
s und1
s von binär in eine Ganzzahl.1010110011 => 691
- Konvertieren Sie jede öffnende Klammer in a
Dekodierung dieser Kodierung
Eine interessante Eigenschaft dieses Algorithmus ist, dass er nicht surjektiv ist. Nicht jede Ganzzahl kann das Ergebnis dieser Codierung sein.
- Erstens muss die binäre Darstellung des Ergebnisses darin bestehen
r
,balance-able
dass die Anzahl von0
s niemals die Anzahl von1
s überschreiten darf . Ein kurzer Falsey-Testfall ist4
, der100
binär ist. - Zweitens müssen die Klammern in der Binärdarstellung stehen,
sorted ascending
wenn das letzte1
und das nachfolgende0
s erneut angehängt werden. Ein kurzer Falsey-Testfall ist12 <= 1100 <= 110010 <= (())()
.
Nur zu bestimmen, ob eine Zahl auf diese Weise decodierbar ist, würde eine kurze Herausforderung darstellen. Stattdessen besteht die Herausforderung darin , eine bestimmte Eingabe wiederholt zu decodieren , bis entweder eine nicht decodierbare Zahl oder ein Zyklus erreicht ist, und die resultierende Folge von Zahlen zurückzugeben.
Die Herausforderung
- Geben Sie bei einer gegebenen Zahl
1 <= r <= 2**20 = 1048576
die Folge von Zahlen zurück , in dier
nacheinander dekodiert wird, beginnend mit sichr
selbst und endend mit einer nicht dekodierbaren Zahl oder einem Zyklus. - Wenn eine nicht decodierbare Nummer als Eingabe angegeben wird, z. B.
4
oder12
, wird eine Liste zurückgegeben, die nur die Eingabe enthält. - Eine Sequenz, die in einem Zyklus endet, sollte auf irgendeine Weise angezeigt werden, entweder durch Anhängen oder Voranstellen eines Markers (wählen Sie eine nicht positive Ganzzahl, Zeichenfolge, Liste usw. als Marker aus, aber halten Sie sie konsistent) oder durch Wiederholen des Zyklus in auf irgendeine Weise (Wiederholung des ersten Elements, Wiederholung des gesamten Zyklus, unendliche Wiederholung usw.).
- Betrachten Sie es als undefiniertes Verhalten, wenn eine der Sequenzen nicht unendlich ist (z. B. indem Sie für immer zunehmen).
- Das ist Code Golf. Die kleinste Anzahl von Bytes gewinnt.
Ein funktionierendes Beispiel für die Dekodierung
1 -> 1 -> 1100 -> [[]] -> [2] -> 3
-> 3 -> 11 -> 111000 -> [[[]]] -> [[2]] -> [3] -> 5
-> 5 -> 101 -> 101100 -> [][[]] -> 2*[2] -> 2*3 -> 6
-> 6 -> 110 -> 110100 -> [[][]] -> [2*2] -> [4] -> 7
-> 7 -> 111 -> 11110000 -> [[[[]]]] -> [[[2]]] -> [[3]] -> [5] -> 11
-> 11 -> 1011 -> 10111000 -> [][[[]]] -> 2*[[2]] -> 2*[3] -> 2*5 -> 10
-> 10 -> 1010 -> 101010 -> [][][] -> 2*2*2 -> 8
-> 8 -> 1000 ERROR: Unbalanced string
Testfälle
4 -> [4]
12 -> [12]
1 -> [1, 3, 5, 6, 7, 11, 10, 8]
2 -> [2, 4]
13 -> [13, 13] # cycle is repeated once
23 -> [23, 22, 14, 17]
51 -> [51, 15, 31, 127, 5381]
691 -> [691, 60]
126 -> [126, 1787, 90907]
1019 -> [1019, 506683, 359087867, 560390368728]
Vorschläge und Feedback zu dieser Herausforderung sind herzlich willkommen. Viel Glück und gutes Golfen!
quelle
1
es3
?1
- (Anhängen einer1
und nachfolgende Nullen) ->1100
->[[]]
->[[1]]
->[2]
->3
6
->110
->110100
was ist nicht gültig, oder? Also sollte Input1
geben[1,3,5,6]
?7
->111
->11110000
->[[[[]]]]
-> 4. Primzahl = 7? Vielleicht verstehe ich den Algorithmus nichtAntworten:
Python 3 ,
379358339337327310304 BytesVermutung: Ist
13
die einzige Zahl, die zu einem Zyklus führt? (Es gibt keine Ausnahmen kleiner als 10 6. )Fehler und -7 Bytes dank Sherlock9 behoben .
-3 Byte dank Jonathan Frech .
-16 Bytes dank Ovs .
-6 Bytes dank Mr. Xcoder .
Wenn es einen Zyklus gibt, wird der gesamte Zyklus wiederholt.
Probieren Sie es online aus!
Erläuterung:
quelle
Pyth, 62 Bytes
Testsuite
Zeigt einen Zyklus an, indem die endgültige Zahl wiederholt wird.
quelle