でカオス理論、馬蹄マップは混乱が折りたたみと潰しの簡単なプロセスで発生方法の例です。それは次のようになります。架空の生地を取り出し、折りたたみ、最後に元のサイズに潰します。カオスは、n回の反復の後、生地の断片が最終的な配置にどのように到達するかというパターンで発生します。
今回のケースでは、単純なバイナリパターンが折りたたまれ、押しつぶされるときにどのように動作するかを見ていきます。以下は、8ビットの例(201またはのバイナリ表現11001001
)の手順です。
同じ長さの2つの断片にビットをカットします(奇数のビットがある場合は、最初に「0」を追加します)。
1100 | 1001
前半を後半に折ります。折りたたみながら回転させると、前半の順序が逆になることに注意してください。
0011
1001
元の形にスカッシュします。スカッシュ中、上位ビットは元の位置の下のビットに左にシフトされます。
01001011
この例でこれを繰り返すと、4回の反復の後、元のビット文字列に戻っていることがわかります。
Start bits: 11001001
Iteration 1: 01001011
Iteration 2: 01001101
Iteration 3: 01011001
Iteration 4: 11001001
したがって、10進数の201の場合、サイクル数は4です。
チャレンジ
- 10進数を入力として受け取り、上記のバイナリスカッシュアンドフォールドプロセスで繰り返すのに必要なサイクル数を出力する完全なプログラムを記述します。
- (10進数)入力はstdinから取得する必要があります(範囲:1からGoogolまたは10 ^ 100まで)。
- (10進数)出力はstdoutに書き込む必要があります。
- スコアは、コードのバイト数です。
- 回答は[プログラミング言語]-[バイト単位のスコア]で始まる必要があります
- 標準の抜け穴は許可されていません。
例
7 --> 3
43 --> 5
178 --> 4
255 --> 1
65534 --> 1
65537 --> 12
1915195950546866338219593388801304344938837974777392666909760090332935537657862595345445466245217915 --> 329
最後のメモ
興味深いのは、サイクル数はバイナリ表現の長さに関連していることです。ただし、ビット文字列のパターンのためにサイクル数が短いいくつかの例外は例外です(たとえば111110
、1回の反復後のサイクル)。これにより、サイクル数を計算する代わりに、基になるパターンを使用してコード長を最適化する興味深い機会が生まれます。