Die Collatz-Vermutung ist eine sehr bekannte Vermutung. Nehmen Sie eine positive ganze Zahl; Wenn es gerade ist, dividieren Sie durch 2, andernfalls multiplizieren Sie mit 3 und addieren Sie 1. Wiederholen Sie diesen Vorgang, bis Sie erreichen 1
oder etwas anderes passiert. Die Vermutung ist, dass dieser Prozess immer erreicht 1
.
Sie können den Vorgang auch umkehren. Beginnen Sie mit 1
, multiplizieren Sie mit 2 und verzweigen Sie zu multiply by 3 and add 1
Zahlen, wenn Sie eine gerade Zahl erreichen 1 (mod 3)
, dh subtrahieren Sie 1 und dividieren Sie durch 3.
Ein Collatz-Pfad kombiniert die beiden und versucht, mit diesen vier Operationen von einer Zahl zur nächsten zu gelangen.
Zum Beispiel, um zu gelangen 20
von 1
:
1 *2
2 *2
4 *2
8 *2
16 *2
5 (-1)/3
10 *2
20 *2
Sie können erhalten auch 3
von 10
um 1 subtrahiert und dividiert durch 3.
Mit diesen Werkzeugen können Sie einen Collatz-Pfad von einer Zahl zur anderen durchlaufen. Zum Beispiel ist der Pfad von 20
bis 3
(durch 2 teilen) (1 subtrahieren, durch 3 teilen).
Kurz gesagt, die verfügbaren Operationen sind:
n * 2 always
n // 2 if n % 2 == 0
n * 3 + 1 if n % 2 == 1
(n-1) // 3 if n % 6 == 4
Hinweis: Nicht alle Collatz-Pfade sind kurz. a(7,3)
könnte funktionieren
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 2, 4, 8, 16, 5, 10, 3
aber ein kürzerer Weg ist
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 3
Die Herausforderung
Finden Sie die Länge des kürzesten Collatz-Pfades zwischen zwei beliebigen positiven ganzen Zahlen p
und q
.
- Die Eingabe ist zwei beliebige positive Ganzzahlen kleiner als
2^20
zur Vermeidung eines Ganzzahlüberlaufs. Die Eingabemethode liegt im Ermessen des Golfers. Die ganzen Zahlen können gleich sein. In diesem Fall ist die Länge des Collatz-Pfades gleich0
. - Die Ausgabe sollte eine Ganzzahl sein und die Länge des kürzesten Collatz-Pfades zwischen
p
und angebenq
.
Testfälle
a(2,1)
1
a(4,1)
1 # 4 -> 1
a(3,1)
6 # 3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 1
a(11,12)
11 # 11 -> 34 -> 17 -> 52 -> 26 -> 13
# -> 40 -> 20 -> 10 -> 3 -> 6 -> 12
a(15,9)
20 # 46 -> 23 -> 70 -> 35 -> 106 -> 53 -> 160 -> 80 -> 40 -> 13
# -> 26 -> 52 -> 17 -> 34 -> 11 -> 22 -> 7 -> 14 -> 28 -> 9
Vielen Dank an orlp für ihre Hilfe bei der Klärung dieser Herausforderung.
Wie immer, wenn das Problem unklar ist, lassen Sie es mich bitte wissen. Viel Glück und gutes Golfen!
Antworten:
Haskell,
170 158 157 146 143 137 135 112 109 108 106 10099 BytesIch hatte nicht erwartet, dass meine Originalversion so viel golffähiger ist, das ist auch die Arbeit von @nimi @Lynn und @Laikoni!
Danke @Laikoni für ein Byte, @Lynn für
11 14 2021 Bytes, @nimi für 8 Bytes!Dies erweitert den Baum der besuchten Nummern (beginnend mit
a
) Schritt für Schritt und prüft in jedem Schritt, ob wir zu der angegebenen Nummer gekommen sindb
.quelle
iterate s [a] -> iterate s[a]
s
spart drei weitere Bytes!iterate(nub.concat.map f)[a]
Brauchen Sie das wirklichnub
?break
undspan
wirklich nützlich![div n 2,n*3+1]!!mod n 2
mitcycle[div n 2,n*3+1]!!n
spart ein weiteres Byte :)Python 2, 110 Bytes
quelle
Pyth, 30 Bytes
Probieren Sie es online aus
Wie es funktioniert
Nehmen Sie die Länge der symmetrischen Differenz der beiden Vorwärts-Collatz-Sequenzen, beginnend bei den beiden Eingangsnummern und endend bei 2. Die einzige Ausnahme ist, ob die Eingabe
[1, 2]
oder ist[2, 1]
, was wir im Sonderfall tun.quelle
Python 2,
156179191209181172177171 BytesDa ein Collatz-Pfad als die erste Zahl vorgestellt
a(1,p)
unda(1,q)
verbunden werden kann, die beiden Sequenzen gemeinsama(1,n)
ist und die ursprüngliche Collatz-Vermutung ist, berechnet diese Funktion die Collatz-Sequenz vonp
undq
und berechnet die Länge von dort. Dies ist kein schönes Golfspiel, daher sind Golfvorschläge sehr willkommen. Die einzige Ausnahme ist wannp or q == 1
. Da wir dann im Gegensatz zu einer regulären Collatz-Sequenz direkt von4
nach überspringen können1
, müssen wir einen Schritt vom Ergebnis abziehen.Bearbeiten: Viele Fehlerbehebungen.
Bearbeiten: Viele, viele Fehlerbehebungen
Probieren Sie es online aus!
quelle
a(3,1)
gibt 7 zurück, während er 6 zurückgeben sollte, da der kürzeste Weg ist3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 1
f
bezeichnen einen Schritt vorwärts,b
einen Schritt zurück in der Collatz - Sequenz. Das Musterb->f
kann sich nicht auf einem kürzesten Weg befinden, da es sich um die Identität handelt (f
wirdb
auf jeden Fall rückgängig gemacht ). Der kürzeste Weg kann also nur aus Mustern bestehenf->f
,f->b
undb->b
. Das bedeutet wieder, dass der kürzeste Weg immer die Formf->f->...->f
oderb->b->...->b
oderf->...->f->b->...->b
JavaScript (ES6), 135 Byte
Führt eine Breitensuche durch.
x
ist die Startnummer,y
das Ziel,a
eine Anordnung von Testwerten,s
eine Anordnung von der Anzahl der Schritte , einschließlich der Kette ausx
,z
der aktuellen Wertes. Wennz
undy
nicht gleich sind , berechnenz*2
,z/2
und entwederz*3+1
oder(z-1)/3
, je nachdem , obz
gerade oder ungerade ist, dann Fraktionen herauszufiltern und vorher gesehen Werte und fügen Sie sie in der Suchliste.quelle
Python 2, 80 Bytes
Nehmen Sie die Länge der symmetrischen Differenz der beiden Vorwärts-Collatz-Sequenzen, beginnend bei den beiden Eingangsnummern und endend bei 2. Die einzige Ausnahme ist, wenn die Eingabe 1, 2 oder 2, 1 ist, was wir im Sonderfall tun.
quelle