Determina il vincitore di Connect 4


19

Ti viene fornita una griglia Connect 4 parzialmente riempita (7x6).

O X             
O X          
X O X O     O
X O X O   X X
O X X X O O X
O O O X X O X

(L'input può essere dato come un array 1D o 2D e come lettere o numeri, ecc.)

Supponiamo che

  • X ha iniziato il gioco.
  • Nessuno ha ancora vinto.
  • I giocatori potrebbero non aver giocato bene fino ad ora, ma ora in poi entrambi impiegheranno strategie ottimali.
  • La griglia di input non è difettosa.

Devi generare un singolo valore che indica quale giocatore vince (o un pareggio)

Code golf challenge; così vince il codice più breve. Il tuo programma non deve effettivamente calcolare l'output in un ragionevole lasso di tempo, ma dovresti essere in grado di dimostrare che l'output verrà ottenuto correttamente in un tempo limitato.



@ MartinBüttner Significa che verrò annullato il voto o va bene lasciare qui la mia domanda?
ghosts_in_the_code

4
Significa solo che le domande sono correlate, niente di più, niente di meno. Lo scopo di pubblicare il collegamento è che le sfide appaiano nella barra laterale "Collegata", in modo che le persone possano trovare più facilmente le sfide correlate. Se avessi considerato la tua domanda un duplicato, l'avrei detto (o appena chiusa), quindi non preoccuparti. :)
Martin Ender,

2
Il "gioco ottimale" è ben definito? In tal caso, puoi fornire un link che descriva l'algoritmo per un gioco ottimale?
Rainbolt,

2
@Rainbolt È stato risolto e esistono anche algoritmi perfetti . Leggi Wikipedia per ulteriori informazioni.
ghosts_in_the_code l'

Risposte:


16

Perl, 119 118 117 byte

Include +4 per -0p

Dai una tavola ruotata imbottita di spazi su STDIN (la gravità tira le pietre a destra)

connect4.pl
  OXXX
   XOO
    OX
  OOXX
  XXXO
XXOOXO
OOXXOO
^D

connect4.pl:

#!/usr/bin/perl -p0
y/XO/OX/if$^S|y/X//>y/O//;$_=$$_||=/Z@{[map"|O".".{$_}O"x3,0,5..7]}/sx||s% (?! )%$_="$`X$'";do$0%eg?/1/?3:1+/2/:2

Stampa 3se il giocatore che si muove vince, 1se il giocatore che si muove perde e 2per un pareggio.

Sui perl più vecchi puoi usare un valore letterale ^Sper guadagnare un byte. Se non ti dispiace dell'estrema inefficienza, puoi tralasciare la $$_||=(tabella di trasposizione) e guadagnare altri 6 byte. Se lo lasci fuori $_=ti mostrerà dove giocare invece del risultato (gioca 1e vinci se ce n'è uno, gioca 2e pesca se ce n'è uno o gioca su qualsiasi 3e perdi)

Costruisce e valuta un albero minimox completo. Si esaurirà la memoria e il tempo a meno che la scheda non sia già ragionevolmente ben riempita.


2
Perché mai qualcuno ha votato? Il golf è davvero sorprendente (io gioco a golf con Perl e ottenere una soluzione del genere è estremamente difficile - non sono sicuro che nessun altro giocatore di golf Perl che conosco avrebbe potuto inventare quel codice). E il codice ha il comportamento richiesto.
Dada,

Questo mi fa male al cervello. +1!
levelonehuman,

@Dada come fai a sapere che questa risposta è sotto votata? Vedo 3 come voto ...
RosLuP,

@RosLuP quando ho visto questo post per la prima volta, aveva 1 voto negativo. Inoltre, quando hai abbastanza rappresentante, puoi vedere quanti voti su e giù ha un post: in quel caso, ora ha 4 su e 1 su.
Dada,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.