Die Collatz-Vermutung geht davon aus , dass Sie den folgenden Algorithmus genügend oft wiederholen sollten, wenn Sie eine positive ganze Zahl verwenden:
if number is odd, then multiply by three and add one
if number is even, then divide by two
Sie werden schließlich bei 1 enden. Es scheint immer zu funktionieren, aber es ist nie bewiesen worden, dass es immer funktioniert.
Sie haben bereits damit gerechnet, wie lange es dauert, bis 1 erreicht ist , und ich dachte, ich würde die Dinge ein wenig auf den Kopf stellen .
Berechnen Sie ausgehend von einer bestimmten positiven Ganzzahl, wie lange es dauert, bis 1 erreicht ist (die "Stoppzeit"). Finden Sie dann die Stoppzeit dieser Zahl.
Wiederholen Sie diesen Vorgang, bis Sie 1 erreichen oder bis Sie das völlig willkürliche Limit von 100 Iterationen erreichen. Geben Sie im ersten Fall an, wie viele Iterationen erforderlich waren. In letzterem Fall geben Sie "Fail" oder eine andere konsistente Ausgabe Ihrer Wahl aus, sofern es sich nicht um eine Ganzzahl handelt 1≤n≤100
. Sie können für diese Option keine leere Zeichenfolge ausgeben. Die Ausgabe einer Ganzzahl außerhalb des Bereichs [1, 100] ist jedoch zulässig.
Beispiele:
Input: 2
2->1
Output: 1
Input: 5
5->5->5->5->5->...
Output: Fail
Input: 10
10->6->8->3->7->16->4->2->1
Output: 8
Input: 100
100->25->23->15->17->12->9->19->20->7->16->4->2->1
Output: 13
Input: 10^100
10^100->684->126->108->113->12->9->19->20->7->16->4->2->1
Output: 13
Input: 12345678901234567890
12345678901234567890->286->104->12->9->19->20->7->16->4->2->1
Output: 11
Input: 1
--Depending on your code, one of two things may happen. Both are valid for the purposes of this question.
1
Output: 0
--Or:
1->3->7->16->4->2->1
Output: 6
Da ich eine Sprache berechnet 10^100
und 12345678901234567890
verwendet habe, die nur Real für diese Größe unterstützt, erhalten Sie bei genauerer Sprache möglicherweise unterschiedliche Ergebnisse für diese.
Wertung
Da es sich um Code-Golf , die Antwort mit der kürzesten Menge von Bytes gewinnt.
quelle
Antworten:
Gelee , 24 Bytes
Probieren Sie es online!
quelle
³
anstelle vonȷ2
ist zulässig ).Python 2 , 70 Bytes
Gibt 199 für hundert oder mehr Iterationen zurück.
Probieren Sie es online!
quelle
Attache , 40 Bytes
Probieren Sie es online!
Dies ist eine neue Sprache, die ich gemacht habe. Ich wollte herumkommen, um eine richtige Infix-Sprache zu erstellen, und das ist das Ergebnis: ein Mathematica-Knock-off. Hurra?
Erläuterung
Dies ist eine Zusammenstellung einiger Funktionen. Diese Funktionen sind:
PeriodicSteps[CollatzSize@Max&1]
Dies ergibt eine Funktion, die ihr Argument anwendet, bis die Ergebnisse ein doppeltes Element enthalten. Diese FunktionCollatzSize@Max&1
giltCollatzSize
für die größere der Eingaben und1
, um ungültige Eingaben0
in CollatSize zu vermeiden.`#
ist ein börsennotierter Betreiber; in diesem Sinne monadisch angewandt, erhält es die Größe seines Arguments`-&3
ist eine gebundene Funktion, die das Argument3
an die Funktion bindet`-
, die "minus 3" lautet. Dies liegt daran, dass die PeriodicSteps-Anwendung0
s ergibt , die berücksichtigt werden müssen. (Es handhabt auch ordentlich out-of-bounds Zahlen wie5
, denen zuordnen-1
.)quelle
J ,
4945 Bytes-4 Bytes dank kürzerem Collatz Sequence Code aus dem Kommentar von @ randomra hier .
Ausgaben
101
für ungültige Ergebnisse.Probieren Sie es online!
Erläuterung
Es überrascht nicht, dass diese Erklärung schnell veraltet ist. Ich lasse es in Bezug auf die alte 49-Byte-Antwort, die ich hatte, die ich unten einschließe. Wenn Sie ein Update wünschen, lassen Sie es mich einfach wissen. Die Art und Weise, wie die Länge der rekursiven Sequenz ermittelt wird, bleibt gleich. Ich habe gerade eine kürzere Collatz-Sequenzmethode verwendet.
Ermitteln der Länge der Collatz-Sequenz
Dieser Abschnitt des Codes ist der folgende
Hier ist die Erklärung:
Leider
^:
speichert das Verb apply ( ) beim Speichern von Ergebnissen auch den Anfangswert, was bedeutet, dass wir (wie immer) um eins versetzt sind. Deshalb subtrahieren wir 1.Ermitteln der Länge der rekursiven Sequenz
quelle
*i.~(<101)1&(#@}.a:2&(<*|{%~,*+1+])])]
sollten äquivalent seinC (gcc) , 75 Bytes
Gibt
-1
fürn>=100
Iterationen zurück.Probieren Sie es online!
C (gcc) , 73 Bytes
Gibt
0
fürn>=100
Iterationen zurück.Probieren Sie es online!
quelle
JavaScript (ES6), 57 Byte
Gibt zurück,
true
wenn es fehlschlägt. Rückgabe0
für1
.Testfälle
Code-Snippet anzeigen
quelle
APL (Dyalog Unicode) ,
3960535249 Bytes-3 Bytes dank @ngn
Probieren Sie es online!
Verwendet @ngn-Code für Collatz, zuvor jedoch @Uriels Code.
Hier ist die alte Version, die der Spezifikation nicht entsprach:
quelle
2|⍵:1+∇1+3×⍵⋄1+∇⍵÷2
->1+∇⊃⍵⌽0 1+.5 3×⍵
Perl 6 , 56 Bytes
Probieren Sie es online!
Gibt
101
für eine nicht terminierende Sequenz zurück.quelle
Schale , 21 Bytes
Probieren Sie es online! Gibt
-1
bei Fehlern und0
Eingaben zurück1
.Erläuterung
quelle
C (GCC) ,
7073 BytesProbieren Sie es online!
Gibt zurück,
101
wenn die Anzahl der Iterationen 100 überschreitet.quelle
m=0
in Ihr einfügenf
(wahrscheinlich sogar mit dem derzeit leerenfor
Intiailiser, um einen zu speichern;
).Sauber ,
146... 86 Bytes-11 Bytes dank Ørjan Johansen
Als Teilfunktion wörtlich.
Probieren Sie es online!
Bricht mit ab,
hd of []
wenn die Anzahl der Iterationen 100 überschreitet.Beendet mit
Heap Full
für Eingaben über ~, es2^23
sei denn, Sie geben eine größere Heap-Größe an.quelle
j f l n=hd[u\\1<-iterate f n&u<-l]
.\a=...a
Teil nicht, es kommt drauf an. (Oder eta reduziert.)Python 2 ,
999897 Bytesc and t or f
anstelle von ein Byte gespeichertt if c else f
.-1
anstelle vonf
oder'f'
für nicht unterbrechende Eingaben gespeichert .Probieren Sie es online!
quelle
BiwaScheme , 151 Zeichen
Sie können es hier ausprobieren .
quelle
R ,
119107 BytesVerwendet teilweise den Collatz-Code von Jarko Dubbeldam von hier . Gibt
0
für> 100 Iterationen zurück (Fehler).Probieren Sie es online!
quelle
APL NARS, 115 Byte, 63 Zeichen
Wahrscheinlich mit Schleifen wäre es klarer ... Es gibt 4 Funktionen, 2 verschachtelt und rückwirkend, und die erste nur zum Definieren und Initialisieren von = 0, der Variablen d, gesehen von der 2. Funktion als globaler Variablenzähler.
Diese 3. Funktion wäre die Funktion, die zurückgibt, wie viele Aufrufe es gibt, um die Collatz-Vermutung für ihr Argument aufzulösen
Dies ist die 2. Funktion, wenn ihr Argument = 1 ist, stoppen Sie ihre Rekursion und geben Sie d zurück, wie oft sie sich selbst nennt-1; Wenn else selbst mehr als 99 Mal aufgerufen wird, wird die Rekursion gestoppt und -1 (fail) zurückgegeben. else berechnet die Collatz-Vermutung für das Argument und ruft sich selbst für den Längenwert der Collatz-Sequenz auf. Für mich, auch wenn dies alles so aussieht, als würde es ein großes Problem sein, wenn eine globale Variable und eine Variable in einer Funktion mit demselben Namen definiert werden, wenn der Programmierer sie nur als lokale Variable ansieht.
quelle
(Emacs, Common, ...) Lisp, 105 Bytes
Gibt t für Iterationen> 100 zurück
Erweitert:
quelle