Porządek, Chaos i Codegolf

10

Order and Chaos to odmiana kół w kółko i krzyżyk, rozgrywana na planszy 6x6. Jednak gra wyróżnia się tym, że obaj gracze mogą umieścić X lub O! W każdej turze (poczynając od Rozkazu) gracz umieszcza X lub O na dowolnym niezajętym polu.
Wygrywanie jest proste. Kolejność wygrywa, jeśli na planszy znajduje się 5 X lub OS (pionowo, poziomo lub po przekątnej). Chaos wygrywa, jeśli plansza jest zapełniona, a na planszy nie ma ciągów 5 X lub OS. Twoja praca? Ponieważ jest to Programowanie łamigłówek i Code Golf, będziesz programować grę i grać w golfa.

Zasady

  • Musisz zaakceptować dane wejściowe jako współrzędne x y t, gdzie xi ytto typ kafelka ( Xlub O). Współrzędne zaczynają się od 0 0w lewym górnym rogu i wzrastają do 5 5(prawy dolny róg).
  • Musisz zaakceptować qwyjście i wydrukować, INVALIDjeśli użytkownik wprowadzi nieprawidłowe współrzędne, kafelki, wszelkie dane wejściowe, które nie są w formie x y t, lub spróbuje umieścić kafelek tam, gdzie już jest. (Jedynym wyjątkiem jest to q, że powoduje to zamknięcie programu).
  • Jeśli Zamówienie wygra, otrzymasz wynik P1 WINS. Jeśli Chaos wygra, wydasz wynik P2 WINS.
  • Zamówienie musi być pierwsze.
  • Puste miejsce jest reprezentowane przez ..
  • Płytki są Xi O(wielkie litery). Nie musisz akceptować małych liter, ale wymagana jest wielka litera.
  • Twoja tablica musi składać się tylko z .XO.
  • W rzeczywistości symulujesz obu graczy, nie otrzymując planszy i nie sprawdzając, kto wygra. Akceptuje ruch jako dane wejściowe, a następnie drukuje planszę, akceptuje kolejny ruch i tak dalej, dopóki jeden gracz nie wygra.

Tablica startowa wygląda następująco:

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

Po wejściu pierwszego gracza (zamówienia) 1 2 Xpowinno to wyglądać następująco:

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

Podobnie, gdy 3 3 Owejdzie następny gracz (Chaos) , będzie wyglądać następująco:

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

I to trwa, dopóki jeden gracz nie wygra.

Jak zawsze, standardowe luki, które zabierają zabawę ze wszystkiego, są zabronione.

Zwycięzcą jest ten, który ma najkrótszy kod 15 czerwca, 00:00 UTC (około miesiąca od opublikowania tego wyzwania).

ASCIIThenANSI
źródło
Co się stanie, jeśli gracz wpisze pozycję, która jest już zajęta?
Loovjo,
@Loovjo Powraca INVALID. Zredagowałem to teraz, dzięki.
ASCIIThenANSI
1
Czy gra powinna wyjść z gry po wykryciu 5 płytek z rzędu?
Kyle Kanos
1
Może przeoczyłem to, ale czy musi wydrukować planszę na ekranie, czy po prostu sprawdzić stan planszy i wyjście, który gracz wygrywa?
Kodos Johnson
@Andrew Chciałem symulować grę. Akceptujesz wkład każdego gracza, po jednej turze na raz, a następnie sprawdzasz, czy gracz wygrał w każdej turze. Czy opis jest niejasny?
ASCIIThenANSI

Odpowiedzi:

1

PHP, 316

Oto moje zgłoszenie. Musi to zostać wykonane przez php w wierszu poleceń.

Pamiętaj, że ten kod generuje powiadomienia z powodu niektórych wprowadzonych przeze mnie skrótów. Daj mi znać, jeśli to jest w porządku. Mogę to naprawić, dodając kilka dodatkowych znaków. Sprawdziłem tę stronę, a najwyższa odpowiedź mówi, że zakładam, że raportowanie błędów jest wyłączone, jeśli nie ma o tym wzmianki.

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

A oto wersja kodu bez gry w golfa:

<?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
źródło
Tak, powiadomienia są w porządku.
ASCIIThenANSI
4

JavaScript, 360

Edytuj Zmodyfikowana interaktywna gra, powinna działać nawet w MSIE

Zgodnie z życzeniem, gra tekstowa, wprowadzanie za pomocą wyskakującego okienka, wyświetlanie w konsoli (aby mieć czcionkę o stałej szerokości).

Wyjdź z gry, naciskając „q” lub klikając „anuluj” w odpowiedzi na monit.

Nieużywając funkcji ES5, powinien działać na dowolnej moderowanej przeglądarce (gdzie możesz mieć panel konsoli 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")

Teraz, trochę więcej zabawy Interaktywna i graficzna wersja, uruchom snippet, aby zagrać.

edc65
źródło
Ładna wersja do kliknięcia! (Drobna sugestia: zamiast przycisków opcji możesz użyć prawego / lewego przycisku myszy).
xebtl
@xebtl Spróbuję
edc65
1

Java, 565 znaków 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);}}

Jest to prawdopodobnie najdłuższy golf w historii. Naprawdę nie jestem w tym dobry.

Loovjo
źródło
1

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

Wdrożenie jest dość proste, jedyna prawdziwa „sztuczka”, której można użyć format plusdo zadbania o druk. Oto skomentowana wersja:

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

Ze względu na wymóg sprawdzania składni i poprawności danych wejściowych kod używa fread()do odczytu jednego znaku na raz.

Zadbałem o uporządkowane wyświetlanie tablicy i wiadomości. Jeśli jakieś dodatkowe dane wyjściowe są dopuszczalne, mógłbym zgolić kilka bajtów. Na przykład przy użyciu automatycznego drukowania (nie disp(F)) tablica będzie wyświetlana jako

F =

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

Zinterpretowałem również, że każdy ruch jest podany w osobnej linii.


Przykładowa interakcja ( -qprzełącznik służy tylko do tłumienia nagłówka Octave):

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

Nieprawidłowy ruch spowodował zamknięcie programu (nie jestem pewien, czy było to zamierzone).

xebtl
źródło
Żeby się upewnić (ponieważ wcześniej było pewne zamieszanie), wymaga to obu graczy i faktycznie symuluje grę, a nie tylko sprawdzenie, czy dana tablica wygrywa?
ASCIIThenANSI
@ASCIIThenANSI Właśnie tak. Oczekuje każdego ruchu formularza x y tw osobnej linii (i żadnych innych danych wejściowych).
xebtl
I drukuje tablicę po każdym wejściu?
ASCIIThenANSI
@ASCIIThenANSI Tak, patrz zredagowana odpowiedź.
xebtl