Ordnung und Chaos und Codegolf

10

Order and Chaos ist eine Variante von Tic-Tac-Toe, die auf einem 6x6-Brett gespielt wird. Was das Spiel jedoch einzigartig macht, ist, dass beide Spieler entweder ein X oder ein O platzieren können! In jeder Runde (beginnend mit Reihenfolge) platziert ein Spieler ein X oder O auf einem freien Feld.
Gewinnen ist einfach. Die Reihenfolge gewinnt, wenn sich 5 Xs oder Os (vertikal, horizontal oder diagonal) in einer Reihe auf dem Brett befinden. Chaos gewinnt, wenn das Brett gefüllt ist und keine Zeichenfolgen von 5 Xs oder Os auf dem Brett sind. Deine Arbeit? Nun, da dies Programming Puzzles und Code Golf ist, werden Sie das Spiel programmieren und Golf spielen.

Die Regeln

  • Sie müssen Eingaben als x y t, wo xund yKoordinaten akzeptieren und tist der Kacheltyp ( Xoder O). Die Koordinaten beginnen 0 0in der oberen linken Ecke und steigen bis zu 5 5(der unteren rechten Ecke) an.
  • Sie müssen das qBeenden und Drucken akzeptieren , INVALIDwenn der Benutzer ungültige Koordinaten, Kacheln oder Eingaben eingibt, die nicht in Form von vorliegen x y t, oder versucht, eine Kachel dort zu platzieren, wo bereits eine vorhanden ist. (Die einzige Ausnahme ist q, da dies das Programm beendet.)
  • Wenn Order gewinnt, werden Sie ausgeben P1 WINS. Wenn Chaos gewinnt, werden Sie ausgeben P2 WINS.
  • Bestellung muss zuerst gehen.
  • Ein Leerzeichen wird durch dargestellt ..
  • Kacheln sind Xund O(Großbuchstaben). Sie müssen keine Kleinbuchstaben akzeptieren, aber Großbuchstaben sind erforderlich.
  • Ihr Board darf nur bestehen aus .XO.
  • Sie simulieren tatsächlich beide Spieler, die das Spiel spielen, ohne ein Brett zu bekommen und zu überprüfen, wer gewinnt. Es akzeptiert einen Zug als Eingabe, druckt dann das Brett, akzeptiert einen weiteren Zug usw., bis ein Spieler gewinnt.

Das Startbrett sieht so aus:

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

Und nach den Eingaben des ersten Spielers (Reihenfolge) 1 2 Xsollte es so aussehen:

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

Wenn der nächste Spieler (Chaos) eingibt 3 3 O, sieht es ebenfalls so aus:

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

Und das geht so lange weiter, bis ein Spieler gewinnt.

Wie immer sind Standardlücken verboten, die den Spaß an allem nehmen.

Der Gewinner ist derjenige mit dem kürzesten Code am 15. Juni, 00:00 UTC (ungefähr einen Monat nach Veröffentlichung dieser Herausforderung).

ASCIIThenANSI
quelle
Was ist, wenn ein Spieler eine Position einnimmt, die bereits besetzt ist?
Loovjo
@Loovjo Es kehrt zurück INVALID. Ich habe das jetzt bearbeitet, danke.
ASCIIThenANSI
1
Sollte das Spiel beendet werden, sobald 5 Kacheln hintereinander erkannt wurden?
Kyle Kanos
1
Vielleicht habe ich es übersehen, aber muss es das Board auf den Bildschirm drucken oder einfach den Status des Boards überprüfen und ausgeben, welcher Spieler gewinnt?
Kodos Johnson
@ Andrew Ich wollte eigentlich das Spiel simulieren. Sie akzeptieren die Eingaben jedes Spielers nacheinander und prüfen dann, ob ein Spieler in jeder Runde gewonnen hat. Ist die Beschreibung unklar?
ASCIIThenANSI

Antworten:

1

PHP, 316

Hier ist meine Vorlage. Es muss von PHP in der Kommandozeile ausgeführt werden.

Beachten Sie, dass dieser Code aufgrund einiger von mir vorgenommener Verknüpfungen Hinweise erzeugt. Lassen Sie mich wissen, ob dies in Ordnung ist. Ich kann es beheben, indem ich ein paar weitere Zeichen hinzufüge. Ich habe diese Seite überprüft und in der oberen Antwort wird davon ausgegangen, dass die Fehlerberichterstattung deaktiviert ist, wenn keine Erwähnung erfolgt.

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

Und hier ist die nicht Golfversion des Codes:

<?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
quelle
Ja, Hinweise sind in Ordnung.
ASCIIThenANSI
4

JavaScript, 360

Bearbeiten Modifiziertes interaktives Spiel, sollte auch in MSIE laufen

Wie gewünscht, textbasiertes Spiel, Eingabe über Popup, Ausgabe in der Konsole (um eine monospaced Schriftart zu haben).

Beenden Sie das Spiel mit 'q' oder klicken Sie an der Eingabeaufforderung auf 'Abbrechen'.

Ohne ES5-Funktionen sollte es in jedem moderierten Browser ausgeführt werden (wo Sie ein JS-Konsolenfenster haben können).

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")

Führen Sie jetzt eine weitere unterhaltsame interaktive und grafische Version aus, um das Snippet abzuspielen.

edc65
quelle
Schöne klickbare Version! (Kleiner Vorschlag: Sie könnten Rechts- / Linksklick anstelle der Optionsfelder verwenden.)
Xebtl
@xebtl Ich werde es versuchen
edc65
1

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

Dies ist wahrscheinlich der längste Code-Golf aller Zeiten. Ich bin wirklich nicht gut darin.

Loovjo
quelle
1

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

Die Implementierung ist recht unkompliziert, der einzige echte „Trick“, mit format plusdem das Drucken erledigt werden kann. Hier ist eine kommentierte Version:

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

Aufgrund der Anforderung, die Eingabesyntax und -gültigkeit zu überprüfen, wird im Code fread()jeweils ein Zeichen gelesen.

Ich habe darauf geachtet, das Board und die Nachrichten ordentlich auszugeben. Wenn eine zusätzliche Ausgabe akzeptabel ist, könnte ich ein paar Bytes sparen. Bei Verwendung des automatischen Drucks (nein disp(F)) wird die Karte beispielsweise als angezeigt

F =

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

Außerdem habe ich interpretiert, dass jeder Zug in einer separaten Zeile angegeben wird.


Beispielinteraktion (der -qSchalter dient nur zur Unterdrückung des Octave-Headers):

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

Die ungültige Verschiebung führte zum Beenden des Programms (nicht sicher, ob dies beabsichtigt war).

xebtl
quelle
Nur um sicherzugehen (weil es früher einige Verwirrung gab), nimmt dies Eingaben von beiden Spielern entgegen und simuliert das Spiel tatsächlich, anstatt nur zu überprüfen, ob ein bestimmtes Brett gewinnt?
ASCIIThenANSI
@ASCIIThenANSI Nur so. Es erwartet jede Bewegung des Formulars x y tin einer separaten Zeile (und keine andere Eingabe).
Xebtl
Und es druckt die Karte nach jeder Eingabe?
ASCIIThenANSI
@ASCIIThenANSI Ja, siehe bearbeitete Antwort.
Xebtl