Ordre et Chaos et Codegolf

10

Order and Chaos est une variante du Tic-Tac-Toe joué sur un plateau 6x6. Ce qui rend le jeu unique, cependant, c'est que les deux joueurs peuvent placer un X ou un O! Chaque tour (en commençant par Ordre), un joueur place un X ou un O dans n'importe quelle case inoccupée.
Gagner est simple. L'ordre gagne s'il y a 5 X ou O (verticalement, horizontalement ou en diagonale) d'affilée sur le plateau. Chaos gagne si le plateau est rempli et qu'il n'y a pas de chaînes de 5 X ou Os sur le plateau. Votre travail? Eh bien, puisqu'il s'agit de la programmation d' énigmes et de Code Golf, vous allez programmer le jeu et le jouer au golf.

Les règles

  • Vous devez accepter l'entrée comme x y t, où xet ysont des coordonnées, et test le type de tuile ( Xou O). Les coordonnées commencent par 0 0dans le coin supérieur gauche et augmentent jusqu'à 5 5(le coin inférieur droit).
  • Vous devez accepter qde quitter et d'imprimer INVALIDsi l'utilisateur entre des coordonnées non valides, des tuiles, toute entrée qui n'est pas sous la forme de x y t, ou essaie de placer une tuile là où il y en a déjà une. (La seule exception est q, car cela quitte le programme.)
  • Si la commande gagne, vous afficherez P1 WINS. Si le chaos gagne, vous sortirez P2 WINS.
  • L'ordre doit passer en premier.
  • Un espace vide est représenté par ..
  • Les tuiles sont Xet O(majuscules). Vous n'êtes pas obligé d'accepter les minuscules, mais les majuscules sont obligatoires.
  • Votre planche ne doit être composée que de .XO.
  • En fait, vous simulez les deux joueurs jouant au jeu, sans recevoir de plateau et vérifier qui gagne. Il accepte un coup en entrée, puis imprime le tableau, accepte un autre coup, et ainsi de suite, jusqu'à ce qu'un joueur gagne.

Le tableau de départ ressemble à ceci:

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

Et après les premières entrées du joueur (Ordre) 1 2 X, cela devrait ressembler à ceci:

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

De même, lorsque le prochain joueur (Chaos) 3 3 Oentrera, cela ressemblera à ceci:

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

Et cela continue jusqu'à ce qu'un joueur gagne.

Comme toujours, les failles standard qui prennent le plaisir de tout sont interdites.

Le gagnant est celui avec le code le plus court le 15 juin à 00h00 UTC (environ un mois à compter de la publication de ce défi.)

ASCIIThenANSI
la source
Et si un joueur tape dans une position qui est déjà prise?
Loovjo
@Loovjo Il revient INVALID. J'ai édité ça maintenant, merci.
ASCIIThenANSI
1
Le jeu doit-il sortir une fois que 5 tuiles consécutives sont détectées?
Kyle Kanos
1
Peut-être que je l'ai ignoré, mais faut-il imprimer le tableau à l'écran ou simplement vérifier l'état du tableau et afficher quel joueur gagne?
Kodos Johnson
@Andrew, je voulais en fait simuler le jeu. Vous acceptez l'entrée de chaque joueur, un tour à la fois, puis vérifiez si un joueur a gagné à chaque tour. La description n'est-elle pas claire?
ASCIIThenANSI

Réponses:

1

PHP, 316

Voici ma soumission. Il doit être exécuté par php dans la ligne de commande.

Notez que ce code génère des notifications en raison de certains raccourcis que j'ai créés. Faites-moi savoir si ça va. Je peux le corriger en ajoutant quelques caractères supplémentaires. J'ai vérifié cette page et la première réponse dit de supposer que le rapport d'erreurs est désactivé s'il n'y a aucune mention à ce sujet.

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

Et voici la version non golfée du code:

<?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
la source
Oui, les avis sont OK.
ASCIIThenANSI
4

JavaScript, 360

Modifier le jeu interactif modifié, devrait fonctionner même dans MSIE

Comme demandé, jeu basé sur du texte, entrée via popup, sortie dans la console (pour avoir une police à espacement fixe).

Quittez le jeu avec 'q' ou cliquez sur 'annuler' à l'invite.

N'utilisant pas les fonctionnalités ES5, il devrait fonctionner sur n'importe quel navigateur moder (où vous pouvez avoir un panneau de 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")

Maintenant, une version interactive et graphique plus amusante , exécutez l'extrait pour jouer.

edc65
la source
Belle version cliquable! (Suggestion mineure: vous pouvez utiliser le clic droit / gauche au lieu des boutons radio.)
xebtl
@xebtl Je vais essayer
edc65
1

Java, 565 caractères 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);}}

C'est probablement le golf de code le plus long jamais créé. Je ne suis vraiment pas bon à ça.

Loovjo
la source
1

Octave, 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'implémentation est assez simple, la seule véritable «astuce» à utiliser format pluspour prendre en charge l'impression. Voici une version commentée:

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

En raison de l'obligation de vérifier la syntaxe et la validité des entrées, le code utilise fread()pour lire un caractère à la fois.

J'ai pris soin de sortir le tableau et les messages de manière ordonnée. Si une sortie supplémentaire est acceptable, je pourrais raser quelques octets. Par exemple, en utilisant l'impression automatique (non disp(F)), le tableau serait affiché comme

F =

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

Aussi, j'ai interprété que chaque coup est donné sur une ligne distincte.


Exemple d'interaction (le -qcommutateur est juste pour supprimer l'en-tête d'Octave):

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

Le déplacement non valide a provoqué la fermeture du programme (vous ne savez pas si cela était prévu).

xebtl
la source
Juste pour être sûr (car il y avait une certaine confusion plus tôt), cela prend la contribution des deux joueurs et simule réellement le jeu, plutôt que de simplement vérifier si un plateau donné gagne?
ASCIIThenANSI
@ASCIIThenANSI Exactement. Il attend chaque déplacement du formulaire x y tsur une ligne distincte (et aucune autre entrée).
xebtl
Et il imprime la carte après chaque entrée?
ASCIIThenANSI
@ASCIIThenANSI Oui, voir la réponse modifiée.
xebtl