Orden y Caos y Codegolf

10

Order and Chaos es una variante de Tic-Tac-Toe jugado en un tablero de 6x6. ¡Sin embargo, lo que hace que el juego sea único es que ambos jugadores pueden colocar una X o una O! Cada turno (comenzando con Orden), un jugador coloca una X o una O en cualquier casilla desocupada.
Ganar es simple. El orden gana si hay 5 X u Os (vertical, horizontal o diagonal) en una fila en el tablero. El caos gana si el tablero está lleno y no hay cadenas de 5 X u Os en el tablero. ¿Tu trabajo? Bueno, dado que esto es Programando Puzzles y Code Golf, vas a programar el juego y jugarlo.

Las normas

  • Debe aceptar la entrada como x y t, donde xy yson coordenadas, y tes el tipo de mosaico ( Xo O). Las coordenadas comienzan 0 0en la esquina superior izquierda y aumentan hasta 5 5(la esquina inferior derecha).
  • Debe aceptar qdejar de fumar e imprimir INVALIDsi el usuario ingresa coordenadas inválidas, mosaicos, cualquier entrada que no esté en forma x y to intente colocar un mosaico donde ya haya uno. (La única excepción es q, ya que esto cierra el programa).
  • Si Order gana, saldrá P1 WINS. Si gana el Caos, saldrás P2 WINS.
  • El orden debe ir primero.
  • Un espacio en blanco está representado por ..
  • Las fichas son Xy O(mayúsculas). No tiene que aceptar minúsculas, pero sí mayúsculas.
  • Su tablero solo debe consistir en .XO.
  • En realidad, estás simulando a ambos jugadores jugando, sin que te den un tablero y controlando quién gana. Acepta un movimiento como entrada, luego imprime el tablero, acepta otro movimiento, y así sucesivamente, hasta que un jugador gana.

El tablero de inicio se ve así:

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

Y después de las entradas del primer jugador (Orden) 1 2 X, debería verse así:

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

Del mismo modo, cuando el próximo jugador (Caos) ingrese 3 3 O, se verá así:

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

Y esto continúa hasta que un jugador gana.

Como siempre, las lagunas estándar que eliminan la diversión de todo están prohibidas.

El ganador es el que tiene el código más corto el 15 de junio a las 00:00 UTC (aproximadamente un mes desde el momento en que se publicó este desafío).

ASCIIThenANSI
fuente
¿Qué pasa si un jugador escribe en una posición que ya está ocupada?
Loovjo
@Loovjo Regresa INVALID. Lo he editado ahora, gracias.
ASCIIThenANSI
1
¿Debería salir el juego una vez que se detectan 5 fichas seguidas?
Kyle Kanos
1
Tal vez lo pasé por alto, pero ¿tiene que imprimir el tablero en la pantalla o simplemente verificar el estado del tablero y mostrar qué jugador gana?
Kodos Johnson
@ Andrew En realidad quería simular el juego. Acepta la entrada de cada jugador, un turno a la vez, y luego verifica si un jugador ha ganado cada turno. ¿No está clara la descripción?
ASCIIThenANSI

Respuestas:

1

PHP, 316

Aquí está mi presentación. Tiene que ser ejecutado por php en la línea de comando.

Tenga en cuenta que este código produce avisos debido a algunos atajos que hice. Avísame si esto está bien. Puedo arreglarlo agregando algunos caracteres más. Revisé esta página y la respuesta principal dice asumir que los informes de errores están desactivados si no hay ninguna mención al respecto.

<?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");}

Y aquí está la versión sin golf del código:

<?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");
}
Kodos Johnson
fuente
Sí, los avisos están bien.
ASCIIThenANSI
4

JavaScript, 360

Editar juego interactivo modificado, debe ejecutarse incluso en MSIE

Según lo solicitado, juego basado en texto, entrada por ventana emergente, salida en consola (para tener una fuente monoespaciada).

Salga del juego con 'q' o haga clic en 'cancelar' cuando se le solicite.

Al no utilizar las funciones de ES5, debería ejecutarse en cualquier navegador moderno (donde puede tener un panel de consola 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")

Ahora, una versión más interactiva y gráfica más divertida , ejecute el fragmento para jugar.

edc65
fuente
Buena versión clicable! (Sugerencia menor: puede usar el botón derecho / izquierdo en lugar de los botones de
opción
@xebtl Lo intentaré
edc65
1

Java, 565 caracteres 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);}}

Este es probablemente el código de golf más largo de la historia. Realmente no soy bueno en esto.

Loovjo
fuente
1

Octava, 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

La implementación es bastante sencilla, el único "truco" real para usar format pluspara encargarse de la impresión. Aquí hay una versión comentada:

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;                     # assign
  disp(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

Debido al requisito de verificar la sintaxis y la validez de entrada, el código se usa fread()para leer un carácter a la vez.

Me ocupé de enviar el tablero y los mensajes de manera ordenada. Si se acepta alguna salida adicional, podría reducir un par de bytes. Por ejemplo, usando la impresión automática (no disp(F)), la pizarra se mostraría como

F =

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

Además, interpreté que cada movimiento se da en una línea separada.


Interacción de muestra (el -qcambio es solo para suprimir el encabezado de Octave):

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

El movimiento no válido provocó la salida del programa (no estoy seguro de si eso era lo que se pretendía).

xebtl
fuente
Solo para asegurarme (porque hubo cierta confusión antes), ¿esto toma información de ambos jugadores y realmente simula el juego, en lugar de simplemente verificar si un tablero dado gana?
ASCIIThenANSI
@ASCIIThenANSI Solo así. Espera cada movimiento del formulario x y ten una línea separada (y ninguna otra entrada).
xebtl
¿E imprime la placa después de cada entrada?
ASCIIThenANSI
@ASCIIThenANSI Sí, vea la respuesta editada.
xebtl