Heute schauen wir uns eine Sequenz a an , die mit der Collatz-Funktion f zusammenhängt :
Wir nennen eine Folge der Form z, f (z), f (f (z)), ... eine Collatz-Folge .
Die erste Zahl in unserer Sequenz, a (1) , ist 0 . Bei wiederholter Anwendung von f fällt es in einen Zyklus 0 → 0 →…
Die kleinste Zahl, die wir noch nicht gesehen haben, ist 1, was a (2) = 1 ergibt . Bei wiederholter Anwendung von f fällt es in einen Zyklus 1 → 4 → 2 → 1 →…
Jetzt haben wir die Zahl 2 im obigen Zyklus gesehen, also ist die nächstkleinere Zahl a (3) = 3 und fällt in den Zyklus 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 → 4 → 2 → 1 →…
In allen obigen Zyklen haben wir bereits 4 und 5 gesehen , die nächste Zahl ist also a (4) = 6 .
Inzwischen sollten Sie auf die Idee kommen. a (n) ist die kleinste Zahl, die nicht Teil einer Collatz-Sequenz für alle a (1),…, a (n - 1) war .
Schreiben Sie ein Programm oder eine Funktion, die bei einer positiven Ganzzahl n a (n) zurückgibt . Kürzester Code in Bytes gewinnt.
Testfälle:
1 -> 0
2 -> 1
3 -> 3
4 -> 6
5 -> 7
6 -> 9
7 -> 12
8 -> 15
9 -> 18
10 -> 19
50 -> 114
(Dies ist die OEIS-Sequenz A061641 .)
quelle
n
0-basiert sein?a(n+1) = a(n) odd: 3*a(n)+1, or a(n) even: a(n)/2
a
nicht 0-basiert Ich verstehe nicht, warum Sie hier zu "sprechen 0-basiert" scheinen:a(n) is the smallest number that was not part of any Collatz sequences for all a(0), …, a(n − 1).
Antworten:
Jelly ,
20 bis19 BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
Nach n Iterationen steht der Wert von a (n + 1) am Anfang des Arrays. Da wir das neue Array mit einer umgekehrten Kopie des alten verketten, bedeutet dies, dass a (n) am Ende steht.
quelle
Haskell,
9392 BytesAnwendungsbeispiel:
([y|y<-[-1..],all(/=y)$c=<<[0..y-1]]!!) 10
->19
.c x
ist der Collatz-Zyklus fürx
mit ein bisschen Schummeln fürx == 1
. Die Hauptfunktionen durchlaufen alle ganzen Zahlen und halten diejenigen, die nicht inc x
fürx
in[0..y-1]
. Ziemlich direkte Umsetzung der Definition. Da der Haskell-Indexoperator auf!!
0 basiert, beginne ich mit-1
dem Voranstellen einer (ansonsten nutzlosen) Zahl, um den Index zu reparieren.quelle
MATL ,
4640 BytesProbieren Sie es online!
Erläuterung
Der Code hat eine äußere
for
Schleife, dien
Collatz-Sequenzen erzeugt , eine in jeder Iteration. Jede Sequenz wird von einer innerendo...while
Schleife generiert , die neue Werte berechnet und in einem Sequenzvektor speichert, bis ein1
oder0
erhalten wird. Wenn wir mit der Sequenz fertig sind, wird der Vektor umgekehrt und zu einem globalen Vektor verkettet , der die Werte aller vorherigen Sequenzen enthält. Dieser Vektor kann wiederholte Werte enthalten. Die Umkehrung des Sequenzvektors stellt sicher, dass am Ende der äußeren Schleife das gewünschte Ergebnis (der Startwert der letzten Sequenz) am Ende des globalen Vektors liegt.Pseudocode :
Kommentierter Code :
quelle
Brachylog ,
7067656362 BytesProbieren Sie es online!
quelle
Python 2,
9796 BytesNutzt die Tatsache aus, dass alle Vielfachen von 3 rein sind. Teste es auf Ideone .
Wie es funktioniert
In der ersten Zeile
r,=s={-1}
setzen Sie s = {-1} (set) und r = -1 .Als nächstes lesen wir eine Ganzzahl aus STDIN, wiederholen einen bestimmten String so oft wie möglich und führen ihn dann aus. Dies entspricht dem folgenden Python-Code.
In jeder Iteration beginnen wir damit, das kleinste Mitglied von {r + 1, r + 2, r + 3} zu finden , das nicht zu s gehört . In der ersten Iteration initialisiert dies r als 0 .
In allen nachfolgenden Läufen kann (und wird) s einige von r + 1 , r + 2 und r + 3 enthalten , jedoch niemals alle, da alle Vielfachen von 3 rein sind. Beachten Sie zur Überprüfung dieser Aussage, dass kein Vielfaches m von 3 die Form 3k + 1 hat . Somit verbleiben 2 m als einzig mögliches Vorbild, was ebenfalls ein Vielfaches von 3 ist . Daher kann m in der Collatz-Folge nicht mit einer Zahl vorkommen, die kleiner als m ist , und ist daher rein.
Nachdem wir r identifiziert und n initialisiert haben , wenden wir die Collatz-Funktion mit an
n=(n/2,3*n+1)[n%2]
und addieren jeden Zwischenwert von n zu der Menge s mits|={n}
. Sobald wir auf eine Zahl n stoßen , die bereits in s enthalten ist , erhalten wir{n}-s
eine leere Menge, und die Iteration stoppt.Der letzte Wert von r ist das gewünschte Element der Sequenz.
quelle
Pyth , 32 Bytes
Testsuite.
quelle
Java, 148 Bytes
Ideone es! (Warnung: Exponentielle Komplexität durch Nulloptimierung.)
Das Umwandeln von einer
do...while
Schleife in einefor
Schleife wäre golfer, aber ich habe Probleme damit.Golftipps sind wie gewohnt willkommen.
quelle
for(b=1,i=1;i<n;i++)
auffor(b=1,i=0;++i<n;)
. Übrigens, ich verstehe, warum Ihrer Ideone der Testfall für 50 fehlt, aber warum fehlen auch die 10? Es kann problemlos damit umgehen.int a(int n){if(n<2)return 0;int f=a(n-1),b=0,i,c;for(;b<1;){f++;for(b=1,i=1;i<n;i++)for(c=i==2?4:a(i);c>1;c=c%2>0?c*3+1:c/2)b=c==f?0:b;}return f;}
Perl6, 96
Basierend auf der Perl 5-Antwort . Etwas länger, da die Perl6-Syntax weniger verzeihend ist als die Perl5-Syntax, aber damit werde ich mich vorerst abfinden.
quelle
PHP,
233124 Bytes+4 für Funktion:
quelle
Perl 5 - 74 Bytes
Dies ist eine ziemlich einfache Lösung. Die Collatz-Funktion wird wiederholt auf die Variable angewendet
$a
und im Array gespeichert,@c
dass der Wert gesehen wurde. Nach Erreichen von 0 oder 1 wird inkrementiert,$a
bis es sich um eine Zahl handelt, die noch nicht gesehen wurde. Dies wird eine Anzahl von Malen wiederholt, die der Eingabe minus 2 entsprechen, und schließlich wird der Wert von$a
ausgegeben.quelle
Mathematica, 134 Bytes
Einfacher zu lesendes Format:
quelle