Wir definieren eine Collatz- ähnliche Sequenz s
mit 4 positiven ganzen Zahlen:
n
Startwertd > 1
Divisorm > 1
Multiplikatori
Zuwachs
(In der Original-Collatz-Sequenz d = 2
m = 3
und i = 1
.)
Ausgehend von diesen ganzen Zahlen s
wird auf folgende Weise erstellt:
s(0) = n
- wenn
k > 0
unds(k-1) mod d = 0
danns(k) = s(k-1) / d
- wenn
k > 0
unds(k-1) mod d != 0
danns(k) = s(k-1) * m + i
Eine Beispielsequenz mit d = 2, m = 3, i = 5
und n = 80
wird sein s = 80, 40, 20, 10, 5, 20, 10, 5, 20, ...
.
Jede Sequenz erreicht entweder höhere Werte als eine bestimmte Grenze (dh die Sequenz ist divergent) oder gerät in eine Endlosschleife, wenn für einige t
und u
( t!=u
) die s(t) = s(u)
Gleichheit wahr ist.
In unserem Problem gilt die Sequenz als divergent, wenn der Wert eines Sequenzelements größer ist als 10^9
oder es keine Elementwiederholung vor dem 1000
dritten Element gibt.
Die Aufgabe
Sie sollten ein Programm oder eine Funktion schreiben, die die positiven ganzen Zahlen verwendet d
m
und i
alle Endtypen der Folgen (Endlosschleifen und Divergenz), die die Startwerte erzeugen n = 1, 2, 3, ... 999, 1000
können, als Ein- und Ausgänge verwendet.
Eingabedetails
- Die Eingabe ist eine Zeichenfolge oder Liste (oder Äquivalente in Ihrer Sprache) , die (in gewohnter Weise) drei positive ganze Zahlen sind
d
,m
undi
in dieser Reihenfolge.d
undm
sind zumindest2
. Weder Nummer ist größer als100
.
Ausgabedetails
Die Ausgabespezifikation ist etwas wortreich. Vielleicht lohnt es sich, zuerst die Beispiele zu lesen.
- Sie sollten auf die Standardausgabe (oder die nächstgelegene Alternative) ausgeben oder eine Zeichenfolge zurückgeben.
- Wenn eine abweichende Reihenfolge möglich ist, sollte die erste Zeile sein
DIVERGENT
. - Eine eindeutige Darstellung der Schleife einer Sequenz ist die Drehung, bei der die kleinste Zahl durch Leerzeichen getrennt ist. ZB wenn
s = 2 1 4 2 1 4 2 1
die Schleife ist4 2 1
. - In jeder folgenden Zeile sollten Sie jede einzelne Schleife genau einmal vor dem Wort ausgeben
LOOP
. Z.BLOOP 4 2 1
- Die Schleifen sollten in Bezug auf ihr letztes Element in aufsteigender Reihenfolge sein.
- Der Zeilenumbruch ist optional.
Beispiele:
Die ersten Zeilen sind die Eingänge und die folgenden, bis eine leere Zeile die Ausgänge sind.
2 3 1
LOOP 4 2 1
2 2 6
LOOP 8 4 2 1
LOOP 12 6 3
3 7 8
DIVERGENT
LOOP 15 5 43 309 103 729 243 81 27 9 3 1
LOOP 22 162 54 18 6 2
LOOP 36 12 4
3 9 1
DIVERGENT
6 9 9
DIVERGENT
LOOP 18 3 36 6 1
LOOP 27 252 42 7 72 12 2
LOOP 45 414 69 630 105 954 159 1440 240 40 369 3330 555 5004 834 139 1260 210 35 324 54 9 90 15 144 24 4
LOOP 81 738 123 1116 186 31 288 48 8
LOOP 99 900 150 25 234 39 360 60 10
LOOP 126 21 198 33 306 51 468 78 13
10 10 10
LOOP 20 2 30 3 40 4 50 5 60 6 70 7 80 8 90 9 100 10 1
93 91 92
DIVERGENT
LOOP 2185 198927 2139 23
LOOP 4278 46
Referenzimplementierung in Python 3 auf Ideone.
Dies ist Code-Golf, also gewinnt der kürzeste Einstieg.