Tujuan Anda adalah menulis pemain yang sempurna untuk permainan Wythoff's Nim .
Aturan Wythoff's Nim
Wythoff's Nim adalah permainan dua pemain deterministik yang dimainkan dengan dua tumpukan counter identik. Pemain bergantian bergantian, di mana mereka melakukan salah satunya:
- Hapus satu atau lebih penghitung dari tumpukan pertama
- Hapus satu atau lebih penghitung dari tumpukan kedua
- Hapus jumlah penghitung yang sama (satu atau lebih), dari tumpukan pertama dan tumpukan kedua.
Tentu saja, tumpukan tidak bisa menjadi negatif, tetapi mereka bisa ke 0. Pemain mana saja yang menghapus counter terakhir secara keseluruhan memenangkan permainan.
Untuk yang lebih berpikiran geometris, berikut ini adalah rumusan setara game yang dapat Anda mainkan di applet ini . Seorang ratu tunggal mulai di atas papan catur berukuran seperempat tak terbatas yang sudutnya ada di kiri bawah. Pemain bergantian memindahkan sang ratu, yang bergerak seperti ratu catur tetapi terbatas pada tiga arah:
- Turun
- Kiri
- Diagonal ke bawah dan kiri
Siapa pun yang memindahkan ratu ke sudut akan menang.
Mengaitkan koordinat ratu (dengan sudut (0,0)
) dengan ukuran tumpukan masing-masing, mudah untuk melihat kedua permainan itu sama.
Bermain sempurna
(Anda dapat melewati ini jika terbiasa dengan gagasan bermain sempurna dan gerakan menang.)
Karena Wythoff's Nim adalah permainan yang terbatas dan deterministik, ia memiliki gagasan permainan yang sempurna . Seorang pemain yang sempurna adalah strategi yang akan selalu menang dari posisi yang dimenangkan secara teoritis, artinya posisi di mana ada strategi yang menjamin kemenangan.
Untuk menjadi strategi kemenangan, cukuplah bergerak untuk selalu pindah ke posisi kemenangan teoretis untuk pemain yang baru saja pindah, dan dengan demikian pemain tidak akan maju berikutnya. Posisi pemenang pertama (juga disebut posisi dingin ) adalah (0,0), (1,2), (2,1), (3,5), (5,3)
. Lihat artikel Wikipedia untuk penjelasan tentang algoritma untuk menemukan strategi kemenangan untuk Wythoff's Nim, serta formula untuk menghasilkan posisi menang.
Persyaratan program
Menulis suatu program atau fungsi mengambil posisi sebagai input dan menghasilkan langkah kemenangan dalam bentuk posisi setelah langkah itu. Bytes paling sedikit menang.
Jika tidak ada langkah yang menang, yaitu, posisi itu adalah kerugian teoritis, program Anda harus menunjukkan begitu dan kehilangan.
Program Anda harus berjalan dalam jumlah waktu yang wajar. Jadi, pencarian pohon game rekursif eksponensial tidak akan cukup. Jika Anda ingin melakukan precompute dan melakukan hard-code sebuah strategi, itu tidak masalah.
Memasukkan
Sepasang (i,j)
angka non-negatif yang mewakili ukuran tumpukan, masing-masing paling banyak 99
. Ini dapat berupa dua angka, tupel, daftar, atau wadah apa pun yang Anda inginkan.
Keluaran
Cetak atau keluarkan posisi setelah Anda bergerak, sekali lagi sebagai dua angka atau wadahnya. Ini harus menjadi langkah hukum ke posisi yang menang. Jika ada beberapa gerakan seperti itu, ada yang baik-baik saja, tetapi hanya satu.
Jika tidak ada langkah kemenangan, Anda harus menunjukkan ini di output. Setiap output seperti False
,, None
0, atau (-1,-1)
akan dilakukan, selama itu bukan posisi hukum, dan sama untuk setiap input yang hilang.
Contoh berjalan
f(5,0) = (0,0)
f(2,2) = (1,2) # Or (2,1) or (0,0)
f(1,2) = False
f(13,9) = (13,8) # Or (10,6)
f(10,6) = False
f(5,10) = (5,3)
f(25,30) = (8,13)