前書き
中間二乗法は、擬似乱数の生成に使用されます。ただし、これは実際には有効な方法ではありません。その期間は通常非常に短く、いくつかの深刻な弱点があるためです。これはどのように作動しますか?例を見てみましょう:
シードについては、次のものを選択し123456
ます。
Seed 123456
シードの2乗(シード×シード)は、次と等しい:
Seed² 15241383936
6桁の数字から始めました。つまり、シードの2乗は12桁の数値を提供するはずです。そうでない場合は、先行ゼロを追加して補正します。
Seed² 015241383936
次に、シードと同じサイズの数値の中央部分を取得します。
Seed² 015241383936
^^^^^^
これが新しい種です:241383
。上記と同じプロセスを繰り返します。次のものが得られます。
0: 123456
015241383936
| |
1: 241383
058265752689
| |
2: 265752
070624125504
| |
3: 624125
389532015625
| |
4: 532015
283039960225
| |
5: 039960
001596801600
| |
6: 596801
そして、これはしばらく続きます...さて、中間二乗法が何であるかがわかったので、挑戦に行きましょう:
タスク
すべての種にはピリオドがあります。n桁のシードの期間は8 nより長くすることはできません。たとえば、シード82
。これにより、次のシーケンスが得られます。
82 > 72 > 18 > 32 > 02 > 00 > 00 > 00 > 00 > 00
|____|____|____|____|____|____|____|____|____|___...
0 1 2 3 4 5 6 7 8 9
同じ数字が再び含まれる前に、期間が5に等しいことがわかります。あなたのタスクは、先行ゼロを含まない0より大きいシードが与えられると、シードの期間を出力します。したがって、この場合、を出力する必要があります5
。
別の例は24
次のとおりです。
24 > 57 > 24
|____|____|___...
0 1 2
ご覧のとおり、すべてのシーケンスがで終わるわけではありません0
。このサイクルの周期は1です。
テストケース
Input > Output
24 > 1
82 > 5
123456 > 146
8989 > 68
789987 > 226
以下のための配列とpastebins 123456、8989、789987
これはcode-golfであるため、バイト数が最小の提出が勝ちです!
入力の桁数が不均一になることはないと想定できます。
24
(期間2で、私が言うと思います)、周期的82
で、最終的に、定期的(期間1)。