Il tuo obiettivo è quello di scrivere un giocatore perfetto per il gioco di Wythoff's Nim .
Regole di Wythoff's Nim
Wythoff's Nim è un gioco deterministico per due giocatori giocato con due pile di segnalini identici. I giocatori alternano i turni, in cui svolgono una di queste:
- Rimuovi uno o più segnalini dalla prima pila
- Rimuovi uno o più segnalini dalla seconda pila
- Rimuovi un numero uguale di segnalini (uno o più), sia dalla prima pila che dalla seconda pila.
Ovviamente, le pile non possono diventare negative, ma possono a 0. Qualunque giocatore rimuova l'ultimo segnalino in generale vince la partita.
Per i più geometrici, ecco una formulazione equivalente del gioco che puoi giocare su questa applet . Una sola regina inizia su un quadrato di una scacchiera di un quarto di infinito il cui angolo è in basso a sinistra. I giocatori si alternano muovendo la regina, che si muove come una regina degli scacchi ma limitata a tre direzioni:
- Giù
- Sinistra
- Diagonalmente in basso e a sinistra
Chi muove la regina in un angolo vince.
Associando le coordinate della regina (con l'angolo (0,0)
) alle dimensioni delle rispettive pile, è facile vedere che entrambi i giochi sono uguali.
Gioco perfetto
(Puoi saltare questo se hai familiarità con le nozioni di gioco perfetto e mosse vincenti.)
Dato che il Nim di Wythoff è un gioco finito e deterministico, ha una nozione di gioco perfetto . Un giocatore perfetto è una strategia che vincerà sempre da una posizione teoricamente conquistata, ovvero una posizione in cui esiste una strategia che garantisce una vittoria.
Per essere una strategia vincente, è sufficiente spostarsi per spostarsi sempre in una posizione di vincita teorica per il giocatore che si è appena mosso, e quindi il giocatore non va avanti. Le prime posizioni vincenti (chiamate anche posizioni fredde ) sono (0,0), (1,2), (2,1), (3,5), (5,3)
. Vedi l' articolo di Wikipedia per una spiegazione di un algoritmo per trovare una strategia vincente per il Nim di Wythoff, nonché una formula per generare posizioni vincenti.
Requisiti del programma
Scrivere un programma o una funzione prende una posizione come input ed emette una mossa vincente nella forma della posizione dopo quella mossa. Vince il minor numero di byte.
Se non esiste alcuna mossa vincente, ovvero la posizione è una perdita teorica, il programma dovrebbe indicarlo e rinunciare.
Il programma deve essere eseguito entro un periodo di tempo ragionevole. Pertanto, una ricerca esponenziale ricorsiva dell'albero del gioco non sarà sufficiente. Se vuoi precompilare e codificare una strategia, va bene.
Ingresso
Una coppia (i,j)
di numeri non negativi che rappresentano le dimensioni della pila, ciascuno al massimo 99
. Possono essere due numeri, una tupla, un elenco o qualunque contenitore preferiate.
Produzione
Stampa o stampa la posizione dopo lo spostamento, sempre come due numeri o un suo contenitore. Questa deve essere una mossa legale verso una posizione vincente. Se ci sono più di queste mosse, ognuna va bene, ma solo una.
Se non ci sono mosse vincenti, è necessario indicarlo nell'output. Qualsiasi output come False
, None
, 0, o (-1,-1)
farà, fintanto che non è una posizione giuridica, ed è lo stesso per ogni ingresso perdente.
L'esempio funziona
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)