Ketertiban dan Kekacauan dan Codegolf

10

Order and Chaos adalah varian dari Tic-Tac-Toe yang dimainkan di papan 6x6. Apa yang membuat gim ini unik, adalah bahwa kedua pemain dapat menempatkan X atau O! Setiap belokan (dimulai dengan Pesanan), pemain menempatkan X atau O di kotak kosong mana pun.
Menang itu sederhana. Pesanan menang jika ada 5 X atau O (vertikal, horizontal, atau diagonal) berturut-turut di papan tulis. Chaos menang jika papan diisi dan tidak ada string 5 Xs atau Os di papan tulis. Pekerjaan Anda? Nah, karena ini adalah Puzzles Pemrograman dan Golf Code, Anda akan memprogram gim ini, dan membuatnya golf.

Aturan

  • Anda harus menerima input sebagai x y t, di mana xdan ymerupakan koordinat, dan tmerupakan jenis ubin ( Xatau O). Koordinat mulai dengan 0 0di sudut kiri atas dan naik hingga 5 5(sudut kanan bawah).
  • Anda harus menerima quntuk keluar, dan mencetak INVALIDjika pengguna memasukkan koordinat, petak yang tidak valid, input apa pun dalam bentuk x y t, atau mencoba menempatkan petak di mana sudah ada. (Satu-satunya pengecualian adalah q, karena ini keluar dari program.)
  • Jika Pesanan menang, Anda akan menampilkan P1 WINS. Jika Chaos menang, Anda akan keluar P2 WINS.
  • Pesanan harus duluan.
  • Ruang kosong diwakili oleh ..
  • Ubin adalah Xdan O(huruf besar). Anda tidak harus menerima huruf kecil, tetapi huruf besar diperlukan.
  • Papan Anda hanya terdiri dari .XO.
  • Anda sebenarnya sedang mensimulasikan kedua pemain yang bermain, tidak diberi papan dan memeriksa siapa yang menang. Ia menerima gerakan sebagai input, lalu mencetak papan, menerima gerakan lain, dan seterusnya, hingga satu pemain menang.

Papan awal terlihat seperti ini:

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

Dan setelah input pemain pertama (Pesanan) 1 2 X, akan terlihat seperti ini:

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

Demikian juga, ketika pemain berikutnya (Chaos) masuk 3 3 O, akan terlihat seperti ini:

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

Dan ini berlanjut sampai satu pemain menang.

Seperti biasa, celah standar yang menghilangkan kesenangan dari segala hal dilarang.

Pemenangnya adalah kode dengan kode terpendek pada 15 Juni 00:00 UTC (sekitar satu bulan sejak tantangan ini diposting).

ASCIIThenANSI
sumber
Bagaimana jika pemain mengetik di posisi yang sudah diambil?
Loovjo
@ Loojo Ia kembali INVALID. Saya sudah mengeditnya sekarang, terima kasih.
ASCIIThenANSI
1
Haruskah game keluar setelah 5 ubin berturut-turut terdeteksi?
Kyle Kanos
1
Mungkin saya mengabaikannya tetapi apakah itu harus mencetak papan ke layar atau hanya memeriksa keadaan papan dan output pemain yang menang?
Kodos Johnson
@Andrew Saya sebenarnya bermaksud mensimulasikan permainan. Anda menerima input setiap pemain, satu giliran pada satu waktu, dan kemudian memeriksa apakah seorang pemain telah memenangkan setiap belokan. Apakah uraiannya tidak jelas?
ASCIIThenANSI

Jawaban:

1

PHP, 316

Ini kiriman saya. Itu harus dieksekusi oleh php di baris perintah.

Perhatikan bahwa kode ini menghasilkan pemberitahuan karena beberapa pintasan yang saya buat. Beri tahu saya jika ini ok. Saya dapat memperbaikinya dengan menambahkan beberapa karakter lagi. Saya memeriksa halaman ini dan jawaban teratas mengatakan untuk berasumsi bahwa pelaporan kesalahan dimatikan jika tidak ada yang menyebutkannya.

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

Dan ini adalah versi kode yang tidak golf:

<?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
sumber
Ya, pemberitahuan itu OK.
ASCIIThenANSI
4

JavaScript, 360

Edit Game interaktif yang dimodifikasi, harus dijalankan bahkan di MSIE

Seperti yang diminta, permainan berbasis teks, input melalui popup, output di konsol (sehingga memiliki font monospace).

Keluar dari game dengan 'q' atau mengklik 'batal' saat diminta.

Tidak menggunakan fitur ES5, itu harus dijalankan pada browser moderat (di mana Anda dapat memiliki panel konsol 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")

Sekarang, beberapa versi Interaktif dan grafis yang lebih menyenangkan , jalankan cuplikan untuk bermain.

edc65
sumber
Versi bagus dan dapat diklik! (Saran kecil: Anda dapat menggunakan klik kanan / kiri alih-alih tombol radio.)
xebtl
@ xebtl Saya akan mencobanya
edc65
1

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

Ini mungkin golf kode terpanjang yang pernah ada. Saya benar-benar tidak pandai dalam hal ini.

Loovjo
sumber
1

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

Implementasinya cukup mudah, satu-satunya "trik" nyata yang digunakan format plusuntuk mengurus pencetakan. Ini adalah versi yang dikomentari:

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

Karena persyaratan untuk memeriksa sintaks input dan validitas, kode ini digunakan fread()untuk membaca satu karakter pada satu waktu.

Saya berhati-hati untuk mengeluarkan papan dan pesan dengan rapi. Jika beberapa output tambahan dapat diterima, saya bisa memotong beberapa byte. Misalnya, menggunakan pencetakan otomatis (tidak disp(F)), papan akan ditampilkan sebagai

F =

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

Juga, saya menafsirkan bahwa setiap gerakan diberikan pada baris yang terpisah.


Interaksi sampel ( -qsaklar hanya untuk menekan header Octave):

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

Langkah yang tidak valid menyebabkan program keluar (tidak yakin apakah itu dimaksudkan).

xebtl
sumber
Hanya untuk memastikan (karena ada beberapa kebingungan sebelumnya), ini membutuhkan input dari kedua pemain, dan benar-benar mensimulasikan permainan, daripada hanya memeriksa apakah papan yang diberikan menang?
ASCIIThenANSI
@ASCIIThenANSI Persis seperti itu. Ia mengharapkan setiap gerakan formulir x y tpada baris terpisah (dan tidak ada input lain)
xebtl
Dan itu mencetak papan setelah setiap input?
ASCIIThenANSI
@ ASCIIThenANSI Ya, lihat jawaban yang diedit.
xebtl