Ecco un problema interessante che ho pensato l'altro giorno, che coinvolge bit di codice in competizione con altri bit di codice non solo in una proprietà del codice, ma giocando un gioco contro quegli altri bit di codice.
Il tuo compito è costruire un programma che prenda lo stato attuale di una Go board e determina quale mossa fare o passare.
Il tuo programma accetterà quanto segue come input:
19 righe, ognuna con 19 caratteri, che rappresentano i pezzi attualmente sul tabellone. Un personaggio di
0
rappresenta un quadrato vuoto,1
è nero ed2
è bianco.Due numeri che rappresentano il numero di pezzi prigionieri di ogni giocatore (nero, poi bianco).
Un numero che rappresenta di chi si sposta (bianco o nero). Come sopra,
1
è nero ed2
è bianco.
e genera uno dei seguenti:
Una coppia di coordinate che
a b
rappresentano le coordinate su cui muoversi.1 1
è il quadrato in alto a sinistra, e il primo e il secondo numero rappresentano rispettivamente lo spostamento verso il basso e verso destra.La stringa
pass
, che rappresenta una mossa da passare.
Ad esempio, il programma potrebbe ricevere il seguente input:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000000000000000000
0001210000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
0 0 1
che rappresenta un gioco in cui sono state giocate solo poche mosse.
Quindi il programma potrebbe emettere 6 5
, il che significa "metti una pietra nera sul punto 6 dall'alto e 5 ° da sinistra". Ciò catturerebbe la pietra bianca a 7 5
. Lo stato del consiglio cambierebbe quindi in:
0000000000000000000
0000000000000000000
0000000000000000000
0001000000000002000
0000000000000000000
0000100000000000000
0001010000000000000
0000100000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0000000000000000000
0002000000000001000
0000000000000000000
0000000000000000000
0000000000000000000
1 0 2
(Nota che sebbene sia stata catturata una pietra bianca, conta come un prigioniero per il nero.)
Il codice deve inoltre soddisfare le seguenti proprietà:
Se al tuo programma viene assegnato lo stesso stato di input, deve sempre produrre lo stesso output. Questo è il determinismo di Go AI. Non deve avere un componente casuale.
Il programma non deve richiedere più di circa 60 secondi per determinare quale mossa fare. Questa regola non sarà applicata rigorosamente a causa delle variazioni della potenza di calcolo, ma deve fare una mossa in un ragionevole lasso di tempo.
Il codice sorgente del programma non deve superare un totale di 1 megabyte (1.048.576 byte).
Il tuo programma deve sempre fare mosse legali. Il tuo programma non può fare una mossa dove esiste già una pietra, e non può posizionare un pezzo che provocherebbe la cattura di un gruppo di pietre. (Un'eccezione alle regole ai fini di questa sfida è che un programma è autorizzato a creare una posizione che era originariamente lì - poiché è data solo la posizione corrente di una tavola, non ci si può aspettare che memorizzi quali mosse sono state fatte prima.)
La tua sottomissione giocherà quindi in un torneo a tutto campo contro tutte le altre sottomissioni, in una partita di Go in cui lo stato del tabellone inizia come vuoto, e ogni programma a turno viene alimentato dalla posizione del tabellone e fa una mossa .
Ogni coppia di presentazioni giocherà due round - uno a turno con ogni giocatore nero. Poiché gli AI in questo problema sono completamente deterministici, due degli stessi AI che giocano insieme comporteranno sempre esattamente lo stesso gioco.
Le condizioni per una vittoria sono tali:
Se il tuo programma si gioca fino alla fine del gioco, per determinare il vincitore verranno utilizzate le regole cinesi per il punteggio di Go. Nessun komi verrà applicato.
Se il tuo programma gioca al punto da raggiungere uno stato precedente, causando così un ciclo infinito, i due programmi verranno dichiarati vincolati.
Il tuo invio verrà valutato in base al numero di punti ottenuti rispetto ad altri invii. Una vittoria vale 1 punto e un pareggio vale mezzo punto. La presentazione con il maggior numero di punti è il vincitore assoluto.
Questa è una sfida da re della collina, in cui chiunque può pubblicare una nuova voce in qualsiasi momento, e le classifiche saranno rivalutate periodicamente quando ciò accade.