Temukan Permainan Diffy


27

Gim yang asyik dimainkan jika Anda bosan adalah Permainan Diffy . Ini adalah permainan satu pemain yang cukup sederhana dan dapat menghabiskan banyak waktu Anda.

Gim Diffy bekerja seperti berikut: Anda mulai dengan daftar bilangan bulat non-negatif, dalam contoh ini kita akan gunakan

3 4 5 8

Kemudian Anda mengambil perbedaan absolut antara angka-angka yang berdekatan

 (8)  3   4   5   8
    5   1   1   3

Lalu kamu ulangi. Anda ulangi sampai Anda menyadari bahwa Anda telah memasukkan satu lingkaran. Dan kemudian umumnya permainan dimulai dari awal lagi.

3 4 5 8
5 1 1 3
2 4 0 2
0 2 4 2
2 2 2 2
0 0 0 0
0 0 0 0

Seringkali permainan tidak memiliki tujuan, Anda hanya menunggu waktu dengan melakukan aritmatika di kepala Anda. Namun ketika saya merasa senang memainkan permainan ini, tujuan saya adalah selalu untuk mencoba dan memilih periode dan mencoba untuk membangun permainan yang loop dengan periode tertentu.

Tidak semua game periodik, contoh di atas tidak periodik misalnya karena pada akhirnya mencapai game dengan semua nol dan dengan demikian tidak pernah bisa membuatnya kembali ke posisi semula. Bahkan tampaknya sebagian besar gim tidak berkala membuat beberapa gim yang merupakan permata langka.


Mengingat game yang loop dengan periode tertentu, itu sepele untuk membuat game lain yang loop dengan periode yang sama hanya dengan menggandakan urutan. Misalnya gim:

1 0 1

Dimainkan persis sama dengan gim:

1 0 1 1 0 1

Faktanya, kita dapat mempertimbangkan bahwa keduanya benar-benar permainan yang berulang tanpa batas:

... 1 0 1 ...

Kami akan menganggap mereka satu pertandingan demi tantangan ini.

Dengan cara yang sama, mengalikan seluruh urutan dengan konstanta juga akan secara sepele mempertahankan periode sehingga kita sekali lagi akan menghitung dua game yang berbeda dengan faktor konstan menjadi game yang sama.


String tanpa batas ... 1 0 1 ...dan ... 0 1 1 ...jelas string yang sama digeser oleh satu karakter. Kami tidak akan menghitung ini sebagai game yang berbeda, tetapi ketika satu mencapai yang lain, itu tidak akan dianggap sebagai akhir dari siklus ketika menentukan periode permainan. Sebagai contoh:

Dua pertandingan itu

... 0 0 0 1 0 1 ...  = A
... 0 0 1 1 1 1 ...  = B
... 0 1 0 0 0 1 ...  = A << 4
... 1 1 0 0 1 1 ...  = B << 4
... 0 1 0 1 0 0 ...  = A << 2
... 1 1 1 1 0 0 ...  = B << 2

dan

... 0 0 1 0 1 0 ...  = A << 1
... 0 1 1 1 1 0 ...  = B << 1
... 1 0 0 0 1 0 ...  = A << 5
... 1 0 0 1 1 1 ...  = B << 5
... 1 0 1 0 0 0 ...  = A << 3
... 1 1 1 0 0 1 ...  = B << 3

keduanya adalah game dengan periode 6. Mereka tidak berbagi istilah dengan satu sama lain di setiap titik di loop mereka (tidak seperti ... 1 1 0 ...dan ... 1 0 1 ...yang mencapai satu sama lain) tetapi karena mereka adalah versi bergeser satu sama lain, mereka dianggap permainan yang sama ketika menghitung.


Merefleksikan (atau membalikkan) string tak terbatas pada dasarnya memberikan perilaku yang sama, tetapi tidak selalu memberikan periode yang sama. Pertimbangkan, misalnya,

... 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 ...

dan pantulannya

... 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 ...

Jika kami menganggap generasi berikutnya diproduksi pada titik setengah jalan antara karakter:

... 0 0 0 1 0 0 1 1 0 1 0 1 1 1 1 ...
 ... 0 0 1 1 0 1 0 1 1 1 1 0 0 0 1 ...

... 1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 ...
 ... 0 0 0 1 1 1 1 0 1 0 1 1 0 0 1 ...

maka keduanya akan menggeser posisi dengan 3,5 elemen Namun, kami tidak menganggap generasi berikutnya akan diproduksi dengan offset setengah elemen itu, jadi satu putaran hingga pergeseran 4 elemen memberikan periode 15, dan putaran lainnya turun ke pergeseran 3 elemen memberikan periode dari 5.

Untuk alasan ini kami menganggap string asimetris dan refleksinya berbeda, meskipun siklusnya dalam beberapa hal isomorfis. Tentu saja, jika mereka membentuk bagian dari siklus yang sama maka itu hanya dihitung sebagai satu siklus.


Dengan batasan-batasan ini sedikit matematika dapat menunjukkan bahwa sebenarnya ada sejumlah siklus Diffy dengan periode terbatas yang diberikan. Selain itu, setiap string tanpa batas dengan periode terbatas adalah pengulangan tanpa batas dari string hingga.

Perhatikan bahwa string dapat lebih besar atau lebih pendek dari periode. Misalnya, ada string dengan panjang 5 dengan periode 15, dan string dengan panjang 15 dengan periode 5. Semua string dengan periode 19 memiliki panjang 9709.

Tugas

Diberikan angka nsehingga n lebih besar dari 1 melalui metode input standar menentukan jumlah siklus Diffy yang berbeda dengan periode tepat n.

(Tampaknya, dalam literatur, 0sering kali tidak dianggap sebagai permainan Diffy berkala. Karena ini adalah wilayah abu-abu, saya tidak akan meminta Anda untuk menyelesaikannya n = 1)

Ini adalah , jadi tujuannya adalah untuk meminimalkan jumlah byte dalam kode sumber Anda.

Uji Kasus

2  ->   0
3  ->   1
4  ->   0
5  ->   1
6  ->   1
7  ->   3
8  ->   0
9  ->   4
10 ->   4
11 ->   3
12 ->   5
13 ->   5
14 ->  24
15 ->  77
16 ->   0
17 -> 259
18 -> 259
19 ->  27
20 -> 272
21 -> 811
22 -> 768
23 ->  91
24 -> 340
25 -> 656

Petunjuk

Semua game Dific Berkala hanya akan berisi nol dan satu konstanta tunggal, ini berarti setiap game periodik akan isomorfik untuk beberapa game diffy yang hanya terdiri dari nol dan satu.


Oke, saya sudah membuat ruang obrolan: chat.stackexchange.com/rooms/56459/diffy-games
Peter Taylor

Apakah 010001->111001->000101->100111->010100->011110->010001dan 110110->101101->011011->110110berbeda?
Mirac7

@ Mirac7 Maaf sudah lama sekali, saya cukup yakin game-game itu berbeda
Wheat Wizard

Jawaban:


6

Python 2 , 181 byte

n=input()
m=2**n
a=[m]*m
r=lambda i:[i*-~m>>k&m-1 for k in range(n)]
def s(i):
 if a[i]&m:a[i]=i;a[i]=s(min(r(i^i*2)))
 return a[i]
print sum(min(r(i)[1:])>i==s(i)for i in range(m))

Cobalah online!

Bagaimana itu bekerja

Aturan yang mengubah setiap baris dari permainan biner diferensial ke baris berikutnya adalah sama dengan aturan yang mengubah setiap kolom menjadi kolom berikutnya. Oleh karena itu, sudah cukup untuk menemukan semua siklus yang berbeda dalam grafik semua panjang-kanonik n kolom, di mana kolom adalah “kanonik” jika leksikografi lebih kecil dari semua rotasi nya (ini secara otomatis tidak termasuk kolom dengan periode lebih kecil dari n ).

Dengan kolom yang ditampilkan sebagai angka biner 0 ≤ i <2 n , aturan mengirimkan i ke rotasi terkecil dari i XOR ( i ⋅2). (Jika saya kanonik, bit tinggi adalah nol dan kami tidak perlu khawatir tentang sampulnya di sini.)

Jadi kami mengulangi semua kolom i yang mungkin , periksa kanonisitas, lalu berulang kali menerapkan aturan tersebut hingga kami menemukan kolom yang telah kami kunjungi sebelumnya, memoisasi kolom yang ditinjau kembali yang pertama. Tepat satu kolom dalam setiap siklus akan menjadi kolom yang ditinjau kembali sendiri pertama.


1
Bagaimana cara kerjanya?
Wheat Wizard

@WheatWizard Menambahkan penjelasan.
Anders Kaseorg

Pekerjaan yang baik! Anda mendapatkan hadiahnya. @AndersKaseorg
FantaC
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.