Ordine, caos e codegolf


10

Order and Chaos è una variante del Tic-Tac-Toe giocata su una tavola 6x6. Ciò che rende unico il gioco, tuttavia, è che entrambi i giocatori possono posizionare una X o una O! Ad ogni turno (a partire da Ordine), un giocatore piazza una X o O in qualsiasi quadrato non occupato.
Vincere è semplice. L'ordine vince se ci sono 5 X o O (verticale, orizzontale o diagonale) in fila sul tabellone. Il caos vince se il board è pieno e non ci sono stringhe di 5 X o Os sul board. Il tuo lavoro? Bene, dato che si tratta di Puzzle di programmazione e Code Golf, programmerai il gioco e lo golferai.

Le regole

  • È necessario accettare input come x y t, dove xe ysono coordinate, ed tè il tipo di riquadro ( Xo O). Le coordinate iniziano con 0 0nell'angolo in alto a sinistra e aumentano fino a 5 5(nell'angolo in basso a destra).
  • Devi accettare qdi uscire e stampare INVALIDse l'utente inserisce coordinate, riquadri non validi, qualsiasi input non in forma x y to cerca di posizionare un riquadro in cui ne esiste già uno. (L'unica eccezione è q, poiché questo chiude il programma.)
  • Se l'ordine vince, uscirai P1 WINS. Se Chaos vince, uscirai P2 WINS.
  • L'ordine deve essere il primo.
  • Uno spazio vuoto è rappresentato da ..
  • Le piastrelle sono Xe O(maiuscole). Non è necessario accettare lettere minuscole, ma è richiesto il maiuscolo.
  • La tua scheda deve essere composta solo da .XO.
  • In realtà stai simulando entrambi i giocatori durante il gioco, non ti viene data una tavola e controlla chi vince. Accetta una mossa come input, quindi stampa il tabellone, accetta un'altra mossa e così via, fino a quando un giocatore vince.

La tavola di partenza si presenta così:

......
...... 
......
......
......
...... 

E dopo gli input del primo giocatore (Ordine) 1 2 X, dovrebbe apparire così:

......
...... 
.X....
......
......
......  

Allo stesso modo, quando il prossimo giocatore (Chaos) 3 3 Oentrerà, apparirà così:

......
...... 
.X....
...O..
......
......  

E questo continua fino a quando un giocatore vince.

Come sempre, sono vietate le scappatoie standard che tolgono il divertimento da tutto .

Il vincitore è quello con il codice più corto il 15 giugno, 00:00 UTC (circa un mese da quando è stata pubblicata questa sfida).


Cosa succede se un giocatore digita in una posizione che è già stata presa?
Loovjo,

@Loovjo Ritorna INVALID. L'ho modificato ora, grazie.
ASCIIThenANSI

1
Il gioco dovrebbe uscire una volta rilevate 5 tessere di fila?
Kyle Kanos,

1
Forse l'ho trascurato, ma deve stampare il tabellone sullo schermo o semplicemente controllare lo stato del tabellone e produrre quale giocatore vince?
Kodos Johnson,

@Andrew In realtà intendevo simulare il gioco. Accettate l'input di ciascun giocatore, un turno alla volta, quindi controllate se un giocatore ha vinto ogni turno. La descrizione non è chiara?
ASCIIThenANSI

Risposte:


1

PHP, 316

Ecco la mia presentazione. Deve essere eseguito da php nella riga di comando.

Si noti che questo codice produce avvisi a causa di alcune scorciatoie che ho creato. Fammi sapere se va bene. Posso risolverlo aggiungendo qualche altro personaggio. Ho controllato questa pagina e la risposta principale dice che si presume che la segnalazione degli errori sia disattivata se non viene menzionata.

<?for(;$i++<6;)$b.='......|';while(($a=trim(fgets(STDIN)))!='q'){preg_match('/^([0-5]) ([0-5]) ([XO])$/',$a,$d)&($b[$c=$d[2]*7+$d[1]]=='.')?$b[$c]=$d[3]:print"INVALID\n";echo str_replace("|","\n",$b); foreach([0,5,6,7]as$e)preg_match('/(X|O)(.{'.$e.'}\1){4}/',$b)-1?:die("P1 Wins");strstr($b,'.')?'':die("P2 Wins");}

Ed ecco la versione non giocata del codice:

<?php
error_reporting(E_ALL & ~E_NOTICE);

for(;$i++<6;)$b.='......|';
while(($a=trim(fgets(STDIN)))!='q'){

    #Validate and assign 
    preg_match('/^([0-5]) ([0-5]) ([XO])$/',$a,$d)&($b[$c=$d[2]*7+$d[1]]=='.')?$b[$c]=$d[3]:print"INVALID\n";

    #Output
    echo str_replace("|","\n",$b); 

    #Check if Order wins
    foreach([0,5,6,7]as$e) {
        preg_match('/(X|O)(.{'.$e.'}\1){4}/',$b)-1?:die("P1 Wins");
    }

    #Check if Chaos wins
    strstr($b,'.')?'':die("P2 Wins");
}

Sì, gli avvisi sono OK.
ASCIIThenANSI

4

JavaScript, 360

Modifica gioco interattivo modificato, dovrebbe essere eseguito anche in MSIE

Come richiesto, gioco basato su testo, input tramite popup, output in console (in modo da avere un carattere a spaziatura fissa).

Esci dal gioco con 'q' o facendo clic su 'annulla' al prompt.

Non utilizzando le funzionalità ES5, dovrebbe essere eseguito su qualsiasi browser moder (dove è possibile avere un pannello console JS)

b='\n......'.repeat(6).split('');
for(h=t=0;!h&t<36;)
{
  i=prompt();
  if(i=='q')i=null;
  i=i.match(/([0-5]) ([0-5]) ([XO])/);
  m='INVALID';
  if(b[p=i?i[2]*7-~i[1]:0]=='.')
  {
    ++t;
    b[p]=i[3];
    m=b.join('');
    for(x=z='',c=0;c++<6;)
      for(x+='_',z+='_',r=0;r<6;r++)
        x+=b[c+r*7],z+=b[c<4?c-1+r*8:c+1+r*6];
    h=(/X{5}|O{5}/.test(b.join('')+x+z))
  }
  console.log(m);
}
console.log("P"+(2-h)+" WINS")

Ora, qualche versione interattiva e grafica più divertente , esegui lo snippet per giocare.


Bella versione cliccabile! (Suggerimento minore: è possibile utilizzare il clic destro / sinistro anziché i pulsanti di
opzione

@xebtl Ci proverò
edc65

1

Java, 565 caratteri D:

public class M{public static void main(String[]r){int[]p=new int[36];int u=0;for(;;){String l=new java.util.Scanner(System.in).nextLine();if(l == "q")break;int a=l.charAt(0)-'0'+(l.charAt(2)-'0')*6,i=p[a]==0?1:0;if(i>0)p[a]=l.charAt(4);u+=i;r(i==0?"INVALID\n":"");if(u==36){r("P2 WINS");break;}for(int x=0;x<6;x++)for(int y=0;y<6;y++)for(int d=0;d<3;d++)try{int e=1,c=p[x+y*6],z=x,h=y;if(c=='X'||c=='Y'){for(;e<6;e++){if(d%2==0)z++;if(d>0)h++;if(p[z+h*6]!=c)break;}if(e==5){r("P1 WINS");return;}}}catch(Exception e){}}}static void r(Object o){System.out.print(o);}}

Questo è probabilmente il code-golf più lungo di sempre. Non sono davvero bravo in questo.


1

Ottava, 453

format plus 'XO.'
disp(F=zeros(6))
r=@()fread(0,1);R=@()r()-47;q=@(m)printf(m)&&quit;e=@()q("INVALID");l=@(n)n<1||n>6&&e();s=@()r()==32||e();w="P1 WINS";f=@(v)abs(sum(v))==22.5&&q(w);g=@(m)any(abs(sum(m))==22.5)&&q(w);d=@diag;while 1
i=R();i==66&&quit;l(i);s();l(j=R());s();F(j,i)&&e();abs(v=R()-36.5)==4.5||e();F(j,i)=v;disp(F)
r();f(d(F,-1));f(d(F,0)(2:6));f(d(F,0)(1:5));f(d(F,1));g(F(1:5,:));g(F(2:6,:));g(F(:,1:5)');g(F(:,2:6)');F&&q("P2 WINS");end

L'implementazione è piuttosto semplice, l'unico vero "trucco" da utilizzare format plusper occuparsi della stampa. Ecco una versione commentata:

format plus 'XO.'               # this is where the magic happens

## initialize and print empty board
disp(F=zeros(6))

## shortcuts
r=@()fread(0,1);
R=@()r()-47;
q=@(m)printf(m)&&quit;
e=@()q("INVALID");
l=@(n)n<1||n>6&&e();
s=@()r()==32||e();
w="P1 WINS";
f=@(v)abs(sum(v))==22.5&&q(w);
g=@(m)any(abs(sum(m))==22.5)&&q(w);
d=@diag;

while 1
  i=R();                        # read index 1
  i==66&&quit;                  # ‘q’?
  l(i);                         # check bounds
  s();                          # read and check space
  l(j=R());                     # read and check index 2
  s();                          # read and check space
  F(j,i)&&e();                  # square already filled?
  abs(v=R()-36.5)==4.5||e();    # valid mark?
  F(j,i)=v;                     # assigndisp(F)                       # and print board
  r();                          # read off newline

  ## check diagonals
  f(d(F,-1));
  f(d(F,0)(2:6));
  f(d(F,0)(1:5));
  f(d(F,1));

  ## check rows
  g(F(1:5,:));
  g(F(2:6,:));

  ## check columns
  g(F(:,1:5)');
  g(F(:,2:6)');

  ## check chaos
  F&&q("P2 WINS");
end

A causa della necessità di verificare la sintassi e la validità dell'input, il codice utilizza fread()per leggere un carattere alla volta.

Mi sono preoccupato di distribuire la lavagna e i messaggi in modo ordinato. Se un output aggiuntivo è accettabile, potrei radere via un paio di byte. Ad esempio, utilizzando la stampa automatica (no disp(F)), la scheda verrà visualizzata come

F =

......
......
......
......
......
......

Inoltre, ho interpretato che ogni mossa è data su una riga separata.


Interazione di esempio (l' -qinterruttore è solo per sopprimere l'intestazione di Octave):

$ octave -q order_chaos.m 
......
......
......
......
......
......
3 3 X
......
......
......
...X..
......
......
2 3 O
......
......
......
..OX..
......
......
3 3 O
INVALID

Lo spostamento non valido ha causato la chiusura del programma (non sono sicuro che fosse previsto).


Giusto per essere sicuri (perché prima c'era un po 'di confusione), questo prende input da entrambi i giocatori e simula effettivamente il gioco, piuttosto che verificare se vince una determinata scheda?
ASCIIThenANSI

@ASCIIThenANSI Proprio così. Si aspetta ogni spostamento del modulo x y tsu una riga separata (e nessun altro input).
xebtl,

E stampa la scheda dopo ogni input?
ASCIIThenANSI

@ASCIIThenANSI Sì, vedi risposta modificata.
xebtl,
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.