Questa sfida è quella di scrivere una funzione minimax in una lingua a tua scelta, per produrre la mossa migliore successiva in un gioco NxN di tic-tac-toe dato l' attuale stato del board . L'input della scheda può essere accettato come Matrix, collezione 2D o qualsiasi altra cosa che abbia senso per te, ma aderisce alle regole . L'output è la mossa migliore per chi è il turno in cui è attualmente , dove X è considerato iniziato .
Sfondo rapido sull'algoritmo Minimax
L'idea di base dell'algoritmo minimax è quella di enumerare tutti i possibili risultati come DAG, quindi ponderarli in base al vantaggio che la sequenza di mosse ha sul giocatore, regolato dalla prima mossa effettuata. Tutti i possibili risultati vengono quindi "messi a segno" dalla prima mossa e vengono assegnati in base alla somma di tutti i risultati (-1 per una perdita, 0 per un pareggio e 1 per una vittoria). Nelle implementazioni che richiedono a più giocatori di giocare, si elencano tutte le possibili mosse da parte del giocatore e tutte le possibili risposte anche degli avversari. Ad esempio, in una partita di tic-tac-toe (dopo la prima mossa) ci sono 8 possibili prime mosse che puoi fare, e possono sembrare tutte uguali quando si analizza solo il turno successivo. Ma ripetendo tutti i possibili risultati per ogni possibile serie di mosse che si traducono in un risultato finale e riassumendoli tutti,
Per un riepilogo migliore, più approfondito e contestuale dell'algoritmo mini-max in termini di tic-tac-toe, leggi di più qui: http://neverstopbuilding.com/minimax
XKCD (solo soluzione 3x3)
Le regole
- È possibile utilizzare qualsiasi linguaggio, ma non sono consentite librerie esterne minimax.
- L'output può essere una coordinata (0-n, 0-n) o un numero (1-n * n) indicativo della migliore mossa successiva.
- Inoltre, devi essere in grado di identificare quando lo scenario migliore è una perdita o un pareggio anziché una vittoria.
- Il modo in cui indichi una perdita o un pareggio dipende ancora una volta da te.
- L'input deve usare le X e le O tradizionali, e devi assumere prima le mosse X; gli spazi vuoti possono essere rappresentati da qualsiasi cosa.
- Puoi presumere che tutti gli input che entrano nel tuo programma abbiano n O e n + 1 X, in altre parole puoi supporre che stai ottenendo una scheda ben formata.
- Lo stato corrente della scheda deve essere l'unico input per il programma, se si utilizza la ricorsione, è necessario creare metodi di supporto per facilitare i requisiti di input. Vedi /codegolf//a/92851/59376 per chiarimenti.
- È necessario supportare qualsiasi valore di 10> = n> = 1; se il tuo programma "scade" per n> 10, lo trovo anche accettabile, poiché alcune lingue hanno una potenza di elaborazione significativamente inferiore (specialmente utilizzando le console rivolte al web).
A giudicare
- Questo è code-golf, quindi vince il conteggio di byte più basso del programma e le scappatoie standard sono universalmente vietate.
- In caso di pareggio, vincerà il programma che supporta la più grande "n".
Ingressi di esempio
2x2
[[X,O]
[-,-]]
Output: 2 o [0,1] (3 o [1,1] sarebbero anche probabilmente corretti) (Qualche forma di indicazione della posizione, arbitraria a condizione che tu possa facilmente spiegare il formato che hai usato)
3x3
[[X,O,X]
[O,X,-]
[-,-,-]]
Uscita: -1 (Perdita)
Ancora una volta è consentito qualsiasi formato di input desiderato, ma è necessario utilizzare X e O, gli esempi forniti non sono stati concepiti per vincolare a quel formato, ma solo per ispirare.