Düzen ve Kaos ve Codegolf


10

Order and Chaos , 6x6 tahtasında oynanan bir Tic-Tac-Toe çeşididir. Ancak oyunu benzersiz kılan, her iki oyuncunun da X veya O yerleştirebilmesidir! Her tur (Sipariş ile başlayan), oyuncu boş bir kareye bir X veya O yerleştirir.
Kazanmak basit. Tahtadaki bir satırda 5 X veya O (dikey, yatay veya çapraz) varsa kazanır. Kart doldurulursa ve kartta 5 X veya Os dizesi yoksa kaos kazanır. Senin işin? Bu, Programlama Bulmacaları ve Kod Golfü olduğundan, oyunu programlayacak ve golf oynayacaksınız.

Kurallar

  • Girdiyi x y t, nerede xve ykoordinat olarak kabul etmelisiniz tve döşeme türü ( Xveya O). Koordinatlar 0 0sol üst köşeden başlar ve 5 5(sağ alt köşeye) kadar artar .
  • Kullanıcı geçersiz koordinatlar, kutucuklar, biçiminde olmayan herhangi bir girdi girerse ya da zaten bir kutucuğu döşemeye yerleştirmeye çalışırsa , çıkmayı qve yazdırmayı kabul etmelisiniz . (Tek istisna, programdan çıkılmasıdır.)INVALIDx y tq
  • Order kazanırsa, çıktı alırsınız P1 WINS. Eğer Chaos kazanırsa, çıktı alırsınız P2 WINS.
  • Sipariş önce gitmeli.
  • Boş bir alan ile gösterilir ..
  • Fayans Xve O(büyük harf) vardır. Küçük harf kabul etmek zorunda değilsiniz, ancak büyük harf gereklidir.
  • Tahtanız sadece şunlardan oluşmalıdır .XO.
  • Aslında her iki oyuncuyu da oyun oynuyor, simüle etmiyorsunuz ve kimin kazandığını kontrol ediyorsunuz. Bir hamleyi giriş olarak kabul eder, sonra tahtayı yazdırır, bir oyuncu kazanana kadar başka bir hamleyi kabul eder ve bu böyle devam eder.

Başlangıç ​​kartı şuna benzer:

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

Ve ilk oyuncu (Sıra) girişlerinden sonra 1 2 X, şöyle görünmelidir:

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

Benzer şekilde, bir sonraki oyuncu (Kaos) girdiğinde 3 3 O, şöyle görünecektir:

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

Ve bu bir oyuncu kazanana kadar devam eder.

Her zaman olduğu gibi , eğlenceyi her şeyden alan standart boşluklar yasaktır.

Kazanan, en kısa kodu 15 Haziran 00:00 UTC'de kazanır (bu zorluğun yayınlanmasından yaklaşık bir ay sonra).


Bir oyuncu daha önceden alınmış bir pozisyonda yazarsa ne olur?
Loovjo

@Loovjo Geri döner INVALID. Bunu şimdi düzenledim, teşekkürler.
ASCIIThenANSI

1
Arka arkaya 5 taş tespit edildiğinde oyundan çıkılmalı mı?
Kyle Kanos

1
Belki de gözden kaçırdım, ancak kartı ekrana yazdırmak veya sadece tahtanın durumunu kontrol etmek ve hangi oyuncunun kazandığını çıkarmak zorunda mı?
Kodos Johnson

@Andrew Aslında oyunu simüle etmek istedim. Her oyuncunun girişini kabul edin, her seferinde bir tur ve sonra bir oyuncunun her turu kazanıp kazanmadığını kontrol edin. Açıklama net değil mi?
ASCIIThenANSI

Yanıtlar:


1

PHP, 316

İşte benim sunumum. Komut satırında php tarafından yürütülmelidir.

Bu kodun yaptığım bazı kısayollar nedeniyle bildirimler oluşturduğunu unutmayın. Bunun iyi olup olmadığını bana bildirin. Birkaç karakter daha ekleyerek bunu düzeltebilirim. Bu sayfayı kontrol ettim ve üstteki yanıt, bundan bahsedilmemesi durumunda hata raporlamanın kapalı olduğunu varsaydığını söylüyor.

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

Ve işte kodun golf edilmemiş versiyonu:

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

Evet, bildirimler iyi.
ASCIIThenANSI

4

JavaScript, 360

Değiştirilmiş interaktif oyunu Düzenle , MSIE'de bile çalışmalıdır

İstendiği gibi, metin tabanlı oyun, pop-up üzerinden giriş, konsolda çıkış (tek aralıklı yazı tipine sahip olmak için).

'Q' ile oyundan çıkın veya istemde 'iptal' düğmesine tıklayın.

ES5 özelliklerini kullanmıyorsanız, herhangi bir moder tarayıcısında (bir JS konsol paneline sahip olabileceğiniz) çalışmalıdır.

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

Şimdi, biraz daha eğlenceli İnteraktif ve grafik versiyonu, oynamak için snippet'i çalıştırın.


Güzel tıklanabilir sürüm! (Küçük öneri: radyo düğmeleri yerine sağ / sol tıklamayı kullanabilirsiniz.)
xebtl

@xebtl Bir deneyeceğim
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);}}

Bu muhtemelen şimdiye kadarki en uzun kod golf. Bu konuda gerçekten iyi değilim.


1

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

Uygulama oldukça basittir, format plusbaskıya bakmak için kullanılacak tek gerçek “hile” dir . İşte yorumlanmış bir sürüm:

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

Giriş sözdizimini ve geçerliliğini denetleme gereksinimi nedeniyle, kod fread()bir kerede bir karakter okumak için kullanılır.

Kurulu ve mesajları düzenli bir şekilde çıkarmaya özen gösterdim. Bazı ekstra çıktılar kabul edilebilirse, birkaç bayt tıraş edebilirim. Örneğin, otomatik baskı (hayır disp(F)) kullanıldığında, kart şu şekilde gösterilir:

F =

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

Ayrıca, her hareketin ayrı bir satırda verildiğini yorumladım.


Örnek etkileşim ( -qanahtar sadece Octave başlığını bastırmak içindir):

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

Geçersiz taşıma programın çıkmasına neden oldu (amaçlandığından emin değilim).


Sadece emin olmak için (daha önce biraz karışıklık olduğu için), bu, her iki oyuncudan da girdi alır ve sadece verilen bir tahtanın kazanıp kazanmadığını kontrol etmek yerine oyunu taklit eder mi?
ASCIIThenANSI

@ASCIIThenANSI Aynen öyle. Formun her hareketini x y tayrı bir satırda (ve başka bir girdi olmadan) bekler .
xebtl

Ve her girdiden sonra kartı yazdırır?
ASCIIThenANSI

@ASCIIThenANSI Evet, düzenlenen cevaba bakınız.
xebtl
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.