Collatz予想は非常によく知られている予想です。正の整数をとります。偶数の場合は、2で割り、それ以外の場合は、3を掛けて1を加えます。到達する1か、何か他のことが起こるまで繰り返します。推測では、このプロセスは常にに達し1ます。
プロセスを逆にすることもできます。で開始し1、2を掛け、multiply by 3 and add 1数値に分岐するには1 (mod 3)、偶数、つまり1に達したときに、1を引いて3で割ります。
Collatzパスは2つを組み合わせて、4つの演算で1つの数値から別の数値に移動しようとします。
たとえば、次の場所に移動するに20は1:
1 *2
2 *2
4 *2
8 *2
16 *2
5 (-1)/3
10 *2
20 *2
1を引いて3で割ることによっても、3そこから得ることができ10ます。
これらのツールを使用すると、ある番号から別の番号にCollatzパスをトラバースできます。例えば、からパス20には、3(3による除算、1を引く)、(2分周)です。
つまり、使用可能な操作は次のとおりです。
n * 2 always
n // 2 if n % 2 == 0
n * 3 + 1 if n % 2 == 1
(n-1) // 3 if n % 6 == 4
注:すべてのCollatzパスが短いわけではありません。a(7,3)走れる
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 5, 16, 8, 4, 2, 1, 2, 4, 8, 16, 5, 10, 3
しかし、より短いパスは
7, 22, 11, 34, 17, 52, 26, 13, 40, 20, 10, 3
チャレンジ
任意の2つの正の整数間の最短このCollatzパスの長さを見つけ、pとq。
- 入力は、
2^20整数オーバーフローを回避するために、2未満の正の整数です。入力方法はゴルファーの裁量に任されています。整数は同じである場合があり0ます。その場合、Collatzパスの長さはです。 - 出力は、
pとの間の最短Collatzパスの長さを示す1つの整数である必要がありqます。
テストケース
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
この課題を明確にしてくれたorlpに感謝します。
いつものように、問題が不明な場合はお知らせください。幸運と良いゴルフを!