Amacınız Wythoff's Nim oyunu için mükemmel bir oyuncu yazmak .
Wythoff's Nim Kuralları
Wythoff's Nim, aynı sayaçlardan oluşan iki yığınla oynanan deterministik iki oyunculu bir oyundur. Oyuncular bunlardan birini yaptıkları alternatif dönüşler:
- İlk desteden bir veya daha fazla sayacı kaldırma
- İkinci desteden bir veya daha fazla sayacı çıkarın
- Hem birinci desteden hem de ikinci desteden eşit sayıda sayacı (bir veya daha fazla) çıkarın.
Tabii ki, kazıklar negatif olamaz, ancak 0 yapabilir. Hangi oyuncu genel olarak son sayacı kaldırırsa oyunu kazanır.
Daha geometrik düşünen, burada bu uygulamada oynayabileceğiniz eşdeğer bir formülasyon . Tek bir kraliçe, köşesi sol altta olan çeyrek sonsuz bir satranç tahtasının bazı meydanında başlar. Oyuncular, bir satranç kraliçesi gibi hareket eden ancak üç yönle sınırlı olan kraliçeyi hareket ettirir:
- Aşağı
- Ayrıldı
- Çapraz aşağı ve sol
Kraliçeyi köşeye hareket ettiren kazanır.
Kraliçenin koordinatlarını (köşeli (0,0)
) ilgili yığınların boyutlarıyla ilişkilendirerek, her iki oyunun da aynı olduğunu görmek kolaydır.
Mükemmel oyun
(Mükemmel oyun ve kazanan hamle kavramlarına aşina iseniz bunu atlayabilirsiniz.)
Wythoff's Nim sonlu ve deterministik bir oyun olduğu için mükemmel bir oyun anlayışına sahiptir . Mükemmel bir oyuncu, her zaman teorik olarak kazanılmış bir konumdan kazanacak bir stratejidir, yani kazanmayı garanti eden bir stratejinin olduğu bir konumdur.
Kazanan bir strateji olmak için, yeni hareket eden ve dolayısıyla bir sonraki oyuncuya gitmeyen oyuncu için her zaman teorik bir kazanma pozisyonuna geçmek için hareket etmek yeterlidir. Bu kazanan konumlardan ilki ( soğuk pozisyonlar da denir ) (0,0), (1,2), (2,1), (3,5), (5,3)
. Bkz Wikipedia makalesiWythoff's Nim için kazanan bir strateji bulmak için bir algoritmanın açıklaması ve kazanma pozisyonları oluşturmak için bir formül için .
Program gereksinimleri
Bir program veya işlev yazmak , konumu giriş olarak alır ve bu hareketten sonra konum şeklinde kazanan bir hareket çıkarır. En az bayt kazanır.
Kazanan bir hareket yoksa, yani pozisyon teorik bir kayıpsa, programınız bunu belirtmeli ve kaybetmelidir.
Programınızın makul bir süre içinde çalışması gerekir. Bu nedenle, üstel bir özyinelemeli oyun ağacı araması yeterli olmayacaktır. Bir stratejiyi önceden hesaplamak ve kodlamak istiyorsanız, sorun değil.
Giriş
(i,j)
Her biri en fazla yığın boyutunu temsil eden negatif olmayan bir çift sayı 99
. Bu iki sayı, bir demet, bir liste veya tercih ettiğiniz herhangi bir kap olabilir.
Çıktı
Hareketten sonra pozisyonu tekrar iki sayı veya bir kap olarak yazdırın veya çıktı alın. Bu kazanan bir konuma yasal bir hamle olmalıdır. Bu tür birden fazla hareket varsa, herhangi biri iyi, ancak sadece bir tane.
Kazanan bir hareket yoksa, bunu çıktıda belirtmelisiniz. , 0 veya benzeri herhangi bir çıktı False
, yasal bir konum olmadığı sürece ve kaybedilen her giriş için aynıdır.None
(-1,-1)
Örnek çalıştırmalar
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)