Connect Four Validator


20

introduzione

Connect Four è un gioco in cui si tenta di ottenerne quattro di seguito: in orizzontale, in verticale o in diagonale. In questo codice golf, proveremo a trovare chi ha vinto, dato un tabellone. Ci sarà sempre un vincitore e un solo vincitore.


Compito

Data una scheda Connect Four, capire chi è il vincitore: Xo Y. Ci sarà sempre un vincitore e un solo vincitore. Le dimensioni del tabellone saranno sempre 6 per 7, come nel modo in cui il tabellone è nella foto.

Data una tavola la seguente tavola, in questo caso, Xè rossa ed Yè blu:

inserisci qui la descrizione dell'immagine

Il tuo contributo sarebbe:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOXOO
OOOXXOO
OOXYYYY

Puoi separare le righe del gioco in base al carattere di nuova riga (come sopra), nessun carattere di divisione, dividere le righe in una matrice o in un elenco oppure puoi inserire una matrice di personaggi.

Uscita corretta per questo esempio:

Y

Y ne ha quattro di fila; quindi, Y è il vincitore. Quindi, abbiamo prodotto Y.


Casi test

Ingresso:

OOOOOOO
OOOOOOO
OOOOOOO
OOOOOOO
OOYYOOO
OYXXXXO

Produzione:

X

Ingresso:

OOOOOOO
OOOOOOO
OOOOOOO
XXXXOOO
YXYYOOO
YXYYXYX

Produzione:

X

Ingresso:

YXYYXOO
XYXXYOO
XXXYYOO
YYYXXOO
XXYYYYO
XXYYXXO

Produzione:

Y

Ingresso:

OOOOOOO
OOOOOOO
OYOOOOO
OOYOOOO
OOOYOOO
OOOOYOO

Produzione:

Y

Ingresso:

OOOOOOO
OOOOOOO
OYOOOOX
OOYOOOX
OOOXOOX
OXOXYOX

Produzione:

X

punteggio

Vince il minor numero di byte!


Questa è la sfida perfetta per PMA / Snails codegolf.stackexchange.com/questions/47311/…
Jerry Jeremiah

2
Possiamo presumere che il vincitore avrà sempre un gettone in più rispetto al perdente?
drogato di matematica il

1
@mathjunkie Ho sbagliato, non puoi supporre che.
Neil,

3
@nfnneil l'output deve essere X o Y o possiamo scegliere altri due output coerenti per indicare il vincitore?
Martin Ender,

1
Possiamo scegliere di usare altri caratteri come input? O per inserire una matrice numerica?
Luis Mendo,

Risposte:


2

Gelatina , 19 byte

UŒD;ŒD;Z;ṡ€4;/ṢEÞṪṪ

Provalo online!

Il nucleo di questa risposta viene copiato dalla mia risposta a questa domanda molto simile .

Spiegazione

UŒD;ŒD;Z;ṡ€4;/ṢEÞṪṪ
   ;  ; ;             Append {the input} and the following three values:
UŒD                     the antidiagonals of {the input};
    ŒD                  the diagonals of {the input};
       Z                the transposed {input}.
         ṡ 4          Find all length-4 substrings
          €             of each subarray within that.
            ;/        Flatten one level.
                Þ     Sort, with the following sort order:
               E        If all elements are the same, sort later.
              Ṣ         Tiebreak via lexicographical order.
                 ṪṪ   Take the last element of the last element.

Abbastanza semplice: prendiamo tutte le righe, colonne, diagonali e antidiagonali (proprio come nel validatore n-queens), quindi prendiamo tutte le sottostringhe di lunghezza 4 di quelle, quindi le ordiniamo in modo tale che la linea vincente di 4 tipi la fine. (Abbiamo bisogno del tiebreak nel caso in cui ci sia un OOOOin aggiunta al XXXXo YYYY.) Prendi l'ultimo elemento dell'ultimo elemento, e sarà Xo Ycome richiesto.


6

Retina, 51 48 byte

Grazie a Martin Ender per aver salvato 3 byte

M`X((.{6}X){3}|(.{8}X){3}|(.{7}X){3}|XXX)
T`d`YX

Provalo online!

Accetta input come un elenco di righe separato da virgole


È possibile salvare alcuni byte utilizzando una fase di abbinamento e accorciando (.{7}X){3}|XXXa (.{7}X|X)\4\4: tio.run/nexus/retina#fc4xCsMwDAXQPfcI2GC6NDS5QaeipcP/…
Martin Ender,

1
@MartinEnder Non vedo come puoi usare \4- vuoi ripetere l'effetto della .{7}stringa, non quella corrispondente. (E i gruppi di bilanciamento sarebbero probabilmente troppo lunghi.)
Neil

1
@Neil oh sì, non importa, in qualche modo non ho considerato che ci sono altre celle OXY oltre alla partita nella griglia. usando la fase di match si salva comunque 3 byte.
Martin Ender,

5

Javascript (ES6), 54 55

Modifica 1 byte salvato grazie a @Arnauld

Controllo solo se X è il vincitore, poiché ci sarà sempre un vincitore e un solo vincitore

L'input è una stringa con qualsiasi separatore, come nella risposta di @ Arnauld

F=    
b=>'YX'[+[0,6,7,8].some(x=>b.match(`X(.{${x}}X){3}`))]

;['OOOOOOO OOOOOOO OOXOOOO OOXOOOO OOXOOOO OOXOYYY'
 ,'OOOOOOO OOOOOOO OOXOOOO OOYXOOO OOYOXOO OOYYOXY'
 ,'OOOOOOO,OOOOOOO,OOOOOOO,OOOOOOO,OOYYOOO,OYXXXXO'
 ,'OOOOOOO,OOOOOOO,OOOOOOO,XXXXOOO,YXYYOOO,YXYYXYX'
 ,'YXYYXOO,XYXXYOO,XXXYYOO,YYYXXOO,XXYYYYO,XXYYXXO']
.forEach(s => console.log(s,F(s)))


@Arnauld giusto, grazie
edc65,

4

Gelatina , 25 22 byte

ŒgL⁼¥Ðf
;UŒD€;Z;$ç€4FṀ

Prende un elenco di stringhe (o un elenco di elenchi di caratteri) formato da X, Ye O(funzionerebbe anche con sostituzioni in modo tale che lo spazio abbia un ordinale inferiore rispetto a entrambi i contatori).

Provalo online! oppure esegui una versione aumentata che accetta una stringa multilinea.

Come?

ŒgL⁼¥Ðf - Link 1, runs of given length: list A, length B  e.g. "XYYYXXO", 4
Œg      - group runs of equal elements of A                     ["X","YYY","XX","O"]
     Ðf - filter keep:
    ¥   -     last two links as a dyad:
  L     -         length                                         1   3     2    1
   ⁼    -         equal to B?         (none kept in this case->) 0   0     0    0

;UŒD€;Z;$ç€4FṀ - Main link: list of list of chars (or list of stings) I
 U             - reverse each row of I
;              - I concatenated with that
  ŒD€          - positive diagonals of €ach (positive and negative diagonals)
        $      - last two links as a monad:
      Z        -     transpose of I (i.e. the columns)
       ;       -     concatenated with I (columns + rows)
     ;         - concatenate (all the required directional slices)
         ç€4   - call the last link (1) as a dyad for €ach with right argument = 4
            F  - flatten the result
             Ṁ - take the maximum ('Y'>'X'>'O') - this has the bonus effect of returning:
                               'Y' or 'X' for a winning board; and
                               'O' or '' for a (valid) game in progress.

4

JavaScript (ES6), 77 76 69 byte

Salvataggio di 7 byte grazie a Neil

Prende l'input come una stringa separata da qualcosa , in cui qualcosa è praticamente qualsiasi carattere.

b=>[...'XXXXYYYY'].find((c,i)=>b.match(`(${c}.{${(i%4+6)%9}}){3}`+c))

Casi test


Perché non usare b.match()? Dovrebbe risparmiare sulla RegExpchiamata.
Neil,

@Neil Ho completamente dimenticato che match()stava facendo una conversione implicita in RegExp. Grazie!
Arnauld,

3

Python 2 , 143 byte

m=input()
u=[r[::-1]for r in m]
print"YX"[any(any('X'*4in''.join(t[i][j-i]for i in range(j+1))for j in range(6))for t in(m[::-1],m,u,u[::-1]))]

Prende un elenco di stringhe o un elenco di elenchi di caratteri. Hardcoded per 6 righe per 7 colonne, come garantisce la specifica.

Provalo online!



2

Python 2 , 201 143 129 128 107 byte

Ho deciso di aggiungere insieme orizzontale, verticale e diagonale in un elenco e quindi aggiungere l'incremento, quindi cercare X per i tempi in esso. E poiché ci sarà sempre un vincitore, posso presumere che Y abbia vinto se X non lo ha fatto. Questo codice prende una matrice di tutti i diversi pezzi e luoghi vuoti.

lambda m:"YX"[any("X"*4in"".join(a)for a in zip(*m)+m+zip(*["0"*(7-i)+m[i]+"00"*i+m[i]for i in range(6)]))]

Provalo online!

Titoli di coda


È perfettamente accettabile rispondere autonomamente.
Jonathan Allan,

Senza guardare troppo in esso, sembra esserci spazi bianchi inutili a: i:] for, i, r, r] fore 1 for.
Yytsi,

@TuukkaX Grazie per l'input, aggiornato.
Neil,

Inoltre, *(len(m)-1)potrebbe essere *~-len(m). Come funziona.
Yytsi,

Il ] fore 1 forsono ancora lì.
Yytsi,

1

K (ngn / k) , 58 55 byte

{"XY"@|/&/'88<x ./:/:,/{x+/:/:+3+[4#1-+!3 3]\&4}'+!6 7}

Provalo online!

{ } funzione con argomento x

+!6 7 tutte le possibili coppie di 0..5 e 0..6

{ }' per ognuno di loro

4#1-+!3 3 sono 4 delle 8 direzioni orto-diagonali: (1 1;1 0;1 -1;0 1)

3+[ ]\&4inizia con un elenco di quattro zeri ( &4) e fai 3 passi in ciascuna delle direzioni

x+/:/: iniziare da ogni posizione possibile e fare i passi in ogni direzione possibile

,/concatenare. a questo punto abbiamo una matrice di 4 liste di coppie di coordinate, alcune delle quali si estendono oltre il bordo

x ./:/: cercare le celle corrispondenti da x

88<quali di loro sono "Y"-s? (88 è il codice ascii di "X")

&/'quali 4 liste sono composte solo da "Y"-s? (e-ridurre-each)

|/ce n'è almeno uno di questi? (O-ridurre)

"XY"@se restituisce falso "X", se restituisce vero"Y"


1

Zsh , 207 ... 159 byte

Cronologia delle versioni: 4 iterazioni per ~ 25 byte la prima settimana; quindi altre 3 iterazioni per ~ 25 byte 6 mesi dopo.

t(){a=($^a-$^@_);for s l (${w:^^argv})s+=$l&&for ((i=0;i++<$#s;))a[i]+=$s[i];}
w=(+)
t $@
for s;w[++j]=${(l:j:)}_
t $@
t ${(Oa)@}
[[ $a = *XXXX* ]]&&<<<X||<<<Y

( primo ) ( secondo ) ( terzo ) ( quarto ) ( quinto ) ( sesto ) Provalo online!

Nel piè di pagina, stampo sia la scheda di input che l'array che costruiamo da essa su stderr. Scorri verso il basso per eseguire il debug per vederli. L'array che costruiamo è molto più lungo ora, poiché tfa un prodotto cartesiano con scheda di input ad ogni chiamata. (Ehi, ha ridotto il codice di qualche byte.)

C'è molto da trattare qui, quindi ho spostato i commenti (sesta edizione) in una nota annotata .

(tl; dr: concatena le trasposizioni dell'array originale, ma assicurati di tenerle separate)

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.