Menghitung siklus dalam proses lipat dan squashing

8

Dalam teori chaos , peta tapal kuda adalah contoh bagaimana kekacauan muncul dalam proses sederhana melipat dan meremas. Bunyinya seperti ini: ambil adonan imajiner, lipat, dan akhirnya remas ke ukuran aslinya. Kekacauan muncul dalam pola bagaimana potongan-potongan adonan berakhir dalam pengaturan akhir setelah pengulangan.

Contoh ukuran invarian

Dalam kasus kami, kami akan melihat bagaimana pola biner sederhana berperilaku ketika kita lipat dan remas . Berikut adalah langkah-langkah dengan contoh 8-bit (representasi biner 201 atau 11001001).

  1. Potong bit menjadi dua bagian dengan panjang yang sama (tambahkan '0' di awal jika ada jumlah bit yang ganjil).

    1100 | 1001

  2. Lipat bagian pertama dari babak kedua. Perhatikan bahwa urutan babak pertama terbalik, karena kami memutar sambil melipat.

    0011
    1001

  3. Labu ke bentuk aslinya. Saat tergencet, bit atas digeser ke kiri ke bit di bawah posisi aslinya.

    01001011

Jika kita mengulangi ini untuk contoh ini, kita dapat melihat bahwa setelah 4 iterasi, kita kembali ke bitstring asli:

Start  bits: 11001001
Iteration 1: 01001011
Iteration 2: 01001101
Iteration 3: 01011001
Iteration 4: 11001001

Jadi, untuk nilai desimal 201, jumlah siklus adalah 4.

Tantangan

  • Tulis program lengkap yang menggunakan angka desimal sebagai input dan hasilkan jumlah siklus yang diperlukan untuk mengulangi proses squash-and-fold biner yang dijelaskan di atas.
  • Input (desimal) harus diambil dari stdin (rentang: dari 1 hingga Googol atau 10 ^ 100).
  • Output (desimal) harus ditulis ke stdout.
  • Skor Anda adalah jumlah byte kode Anda.
  • Jawaban Anda harus dimulai dengan [Bahasa pemrograman] - [Skor dalam byte]
  • Tidak ada celah standar.

Contohnya

7 --> 3
43 --> 5
178 --> 4
255 --> 1
65534 --> 1
65537 --> 12
1915195950546866338219593388801304344938837974777392666909760090332935537657862595345445466245217915 --> 329

Catatan akhir

Yang menarik adalah bahwa jumlah siklus terkait dengan panjang representasi biner, kecuali untuk beberapa pengecualian di mana jumlah siklus lebih pendek karena pola dalam bitstring (misalnya 111110siklus setelah 1 iterasi). Ini menciptakan peluang menarik untuk mengoptimalkan panjang kode menggunakan pola yang mendasarinya alih-alih menghitung jumlah siklus.

agtoever
sumber
Jika panjang bit nomor lebih pendek selama iterasi, apakah kita memotong dan melipat menggunakan panjang bit asli, atau yang sekarang?
xnor
2
@ xnor Saya akan menganggap yang asli, kalau tidak Anda tidak akan pernah menyelesaikan siklus, kan?
Martin Ender

Jawaban:

4

CJam, 34 byte

q~2b_,2%,\+{__,2//~\W%.\_W$=!}g;],

Tidak ada yang mewah, itu hanya berlaku peta sampai kita kembali ke input, dan mencetak jumlah iterasi yang diperlukan.

Uji di sini.

Martin Ender
sumber
Pertama! Lihat dirimu, tembak kode lebih cepat dari bayanganmu!
agtoever
3

Python 2, 175 154 149 byte

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

Tautan ideone

Terima kasih agtoever untuk 27 byte!

Celeo
sumber
1
Tidak perlu untuk lambda. Begitu panjangnya genap, itu tetap genap.
agtoever
Poin luar biasa, terima kasih!
Celeo
Ubah `while 1` dengan while i!=o|c==0dan jatuhkan if i==o:break. Menghemat 5. Mungkin (perlu diketahui) Anda juga tidak perlu a. Gunakan saja i. Menghemat tugas (4 byte) Juga tugas j dapat diletakkan di luar loop.
agtoever
Terima kasih untuk penyelamatan tambahan, @agtoever. Saya mendapat TypeError ketika mencoba menerapkan while i!=c|c==0penggantian, tetapi masih dapat menyimpan beberapa byte dengan standar `atau`.
Celeo
2

Pyth, 21 byte

Saya mengetik ini di ponsel saya, jadi pastikan untuk memberi tahu saya jika ada kesalahan.

fqu.i_hc2Gec2GTJ.BQJ1

Cobalah online.

PurkkaKoodari
sumber