Ordem, Caos e Codegolf

10

Order and Chaos é uma variante de Tic-Tac-Toe jogada em um tabuleiro 6x6. O que torna o jogo único, no entanto, é que ambos os jogadores podem colocar um X ou um O! Cada turno (começando com Ordem), um jogador coloca um X ou O em qualquer quadrado desocupado.
Ganhar é simples. A ordem ganha se houver 5 Xs ou Os (vertical, horizontal ou diagonal) seguidos no quadro. O caos vence se o tabuleiro estiver cheio e não houver 5 Xs ou Os no tabuleiro. Seu emprego? Bem, como se trata de Programação de quebra-cabeças e código de golfe, você vai programar o jogo e jogar golfe.

As regras

  • Você deve aceitar a entrada como x y t, onde xe ysão coordenadas e té o tipo de bloco ( Xou O). As coordenadas começam com 0 0no canto superior esquerdo e aumentam até 5 5(o canto inferior direito).
  • Você deve aceitar qsair e imprimir INVALIDse o usuário digitar coordenadas inválidas, blocos, qualquer entrada que não esteja na forma de x y tou tentar colocar um bloco onde já houver um. (A única exceção é que q, ao sair do programa).
  • Se o pedido vencer, você produzirá P1 WINS. Se o Caos vencer, você produzirá P2 WINS.
  • A ordem deve ir primeiro.
  • Um espaço em branco é representado por ..
  • As peças são Xe O(maiúsculas). Você não precisa aceitar letras minúsculas, mas letras maiúsculas são necessárias.
  • Seu conselho deve consistir apenas em .XO.
  • Na verdade, você está simulando os dois jogadores que jogam o jogo, sem receber uma placa e verificando quem ganha. Ele aceita uma jogada como entrada, depois imprime o tabuleiro, aceita outra jogada e assim por diante, até que um jogador ganhe.

O quadro de partida é assim:

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

E após as entradas do primeiro player (Order) 1 2 X, deve ficar assim:

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

Da mesma forma, quando o próximo player (Chaos) entrar 3 3 O, ele ficará assim:

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

E isso continua até que um jogador vence.

Como sempre, são proibidas as brechas padrão que tiram a diversão de tudo .

O vencedor é aquele com o código mais curto em 15 de junho, 00:00 UTC (cerca de um mês após o lançamento deste desafio).

ASCIIThenANSI
fonte
E se um jogador digitar em uma posição que já está ocupada?
Loovjo 15/05
@Loovjo Ele retorna INVALID. Eu editei isso agora, obrigado.
ASCIIThenANSI
11
O jogo deve sair assim que 5 peças seguidas forem detectadas?
Kyle Kanos
11
Talvez eu tenha esquecido isso, mas ele precisa imprimir o quadro na tela ou apenas verificar o estado do quadro e produzir qual jogador vence?
Kodos Johnson
@ Andrew, eu realmente pretendia simular o jogo. Você aceita a entrada de cada jogador, um turno de cada vez, e depois verifica se um jogador venceu cada turno. A descrição não está clara?
ASCIIThenANSI

Respostas:

1

PHP, 316

Aqui está a minha submissão. Ele deve ser executado pelo php na linha de comando.

Observe que esse código produz avisos devido a alguns atalhos que eu fiz. Deixe-me saber se está tudo bem. Eu posso consertá-lo adicionando mais alguns caracteres. Verifiquei esta página e a resposta principal diz que o relatório de erros está desativado se não houver menção a ele.

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

E aqui está a versão un-golfed do 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
fonte
Sim, os avisos estão OK.
ASCIIThenANSI
4

JavaScript, 360

Editar jogo interativo modificado, deve rodar mesmo no MSIE

Conforme solicitado, jogo baseado em texto, entrada via pop-up, saída no console (para ter uma fonte monoespaçada).

Saia do jogo com 'q' ou clique em 'cancelar' no prompt.

Não usando os recursos do ES5, ele deve ser executado em qualquer navegador moderado (onde você pode ter um painel do 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")

Agora, uma versão interativa e gráfica mais divertida , execute o snippet para jogar.

edc65
fonte
Boa versão clicável! (Minor sugestão: você pode usar para a direita / esquerda clique em vez dos botões de rádio.)
xebtl
@xebtl eu vou experimentá
lo
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 é provavelmente o código de golfe mais longo de todos os tempos. Eu realmente não sou bom nisso.

Loovjo
fonte
1

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

A implementação é bastante direta, o único "truque" real a ser usado format pluspara cuidar da impressão. Aqui está uma versão 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;                     # 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

Devido ao requisito de verificar a sintaxe e a validade da entrada, o código usa fread()para ler um caractere de cada vez.

Tomei o cuidado de exibir o quadro e as mensagens de maneira organizada. Se alguma saída extra for aceitável, eu poderia economizar alguns bytes. Por exemplo, usando a impressão automática (não disp(F)), o quadro seria mostrado como

F =

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

Também interpretei que cada movimento é dado em uma linha separada.


Exemplo de interação (a -qopção é apenas para suprimir o cabeçalho do Octave):

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

A movimentação inválida causou a saída do programa (não tenho certeza se isso foi planejado).

xebtl
fonte
Apenas para ter certeza (porque houve alguma confusão anteriormente), isso recebe informações de ambos os jogadores e simula o jogo, em vez de apenas verificar se um determinado tabuleiro vence?
ASCIIThenANSI
@ASCIIThenANSI Just so. Ele espera cada movimentação do formulário x y tem uma linha separada (e nenhuma outra entrada).
Xebtl
E ele imprime o quadro após cada entrada?
ASCIIThenANSI
@ASCIIThenANSI Sim, veja a resposta editada.
Xebtl