折りたたみとつぶしのプロセスでのサイクルのカウント


8

カオス理論馬蹄マップは混乱が折りたたみと潰しの簡単なプロセスで発生方法の例です。それは次のようになります。架空の生地を取り出し、折りたたみ、最後に元のサイズに潰します。カオスは、n回の反復の後、生地の断片が最終的な配置にどのように到達するかというパターンで発生します。

不変測度の例

今回のケースでは、単純なバイナリパターンが折りたたまれ、押しつぶされるときにどのように動作するかを見ていきます。以下は、8ビットの例(201またはのバイナリ表現11001001)の手順です。

  1. 同じ長さの2つの断片にビットをカットします(奇数のビットがある場合は、最初に「0」を追加します)。

    1100 | 1001

  2. 前半を後半に折ります。折りたたみながら回転させると、前半の順序が逆になることに注意してください。

    0011
    1001

  3. 元の形にスカッシュします。スカッシュ中、上位ビットは元の位置の下のビットに左にシフトされます。

    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回の反復後のサイクル)。これにより、サイクル数を計算する代わりに、基になるパターンを使用してコード長を最適化する興味深い機会が生まれます。


反復中に数値のビット長が短くなった場合、元のビット長を使用してカットしてフォールドするのですか、それとも現在のビット長を使用するのですか?
xnor、

2
@xnor私は元のものを想定します、そうでなければあなたはサイクルを完了することは決してないでしょう?
マーティンエンダー

回答:



3

Python 2、175 154 149バイト

i=bin(input())[2:]
i=o='0'+i if len(i)%2 else i
c=0
j=len(i)/2
while i!=o or c==0:
 a=''
 for x,y in zip(i[:j][::-1],i[j:]):a+=x+y
 i,c=a,c+1
print c

イデオネリンク

27バイトのagtoeverに感謝!


1
ラムダは必要ありません。長さが均一になると、均一になります。
agtoever 2015年

素晴らしい点、ありがとう!
Celeo、2013年

`while 1`をで変更しwhile i!=o|c==0てドロップしif i==o:breakます。節約5.たぶん(確かに)あなたも必要ありませんa。だけを使用してくださいi。割り当てを保存します(4バイト)。また、jの割り当てはループの外に置くことができます。
agtoever 2015年

追加の保存、@ agtoeverをありがとう。while i!=c|c==0置換を実装しようとしたときにTypeErrorが発生しましたが、標準の `または`でいくつかのバイトを保存することができました。
Celeo

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.