秩序とカオスとコードゴルフ


10

Order and Chaosは、6x6ボードでプレイされるTic-Tac-Toeのバリアントです。ただし、このゲームのユニークな点は、両方のプレイヤーがXまたはOを配置できることです。プレイヤーは(順番で始まる)ターンごとに、占有されていないマスにXまたはOを配置します。
勝つことは簡単です。ボード上に5つのXまたはO(垂直、水平、または斜め)が並んでいる場合、勝ちとなります。ボードがいっぱいで、ボードに5個のXまたはOのストリングがない場合、カオスが勝ちます。あなたの仕事?さて、これはプログラミングパズルとコードゴルフなので、ゲームをプログラミングしてゴルフします。

ルール

  • として入力を受け入れる必要がありますx y txyは座標であり、tはタイルタイプ(XまたはO)です。座標0 0は左上隅から始まり、5 5右下隅まで増加します。
  • ユーザーが無効な座標、タイル、の形式ではない入力を入力した場合、または既に存在する場所にタイルを配置しようとした場合は、q終了して印刷することを受け入れる必要があります。(唯一の例外は、これによりプログラムが終了するためです。)INVALIDx y tq
  • 注文が勝った場合は、が出力されますP1 WINS。カオスが勝利した場合、出力されますP2 WINS
  • 最初に注文する必要があります。
  • 空白スペースはで表され.ます。
  • タイルはXand O(大文字)です。小文字を受け入れる必要はありませんが、大文字は必須です。
  • ボードはのみで構成されている必要があります.XO
  • あなたは実際にゲームをプレイする両方のプレイヤーをシミュレートしており、ボードは与えられず、誰が勝ったかを確認しています。1つのプレイヤーが勝つまで、入力として動きを受け入れ、次にボードを印刷し、別の動きを受け入れます。

スターティングボードは次のようになります。

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

そして、最初のプレイヤー(Order)が入力した後、次の1 2 Xようになります。

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

同様に、次のプレイヤー(カオス)がを入力すると、次の3 3 Oようになります。

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

そして、これは一人のプレイヤーが勝つまで続きます。

いつものように、すべての面白さを取り除く標準の抜け穴は禁止されています。

勝者は、6月15日00:00 UTC(このチャレンジが投稿されてから約1か月)のコードが最も短いものです。


プレーヤーがすでに採用されているポジションをタイプするとどうなりますか?
Loovjo

@Loovjoを返しますINVALID。私はそれを今編集しました、ありがとう。
ASCIIThenANSI

1
5つのタイルが並んでいるとゲームは終了しますか?
カイルカノス2015年

1
見落としたかもしれませんが、ボードを画面に印刷するか、ボードの状態を確認して、どのプレイヤーが勝ったかを出力する必要がありますか?
コドスジョンソン

@Andrew私は実際にゲームをシミュレートするつもりでした。各プレーヤーの入力を一度に1ターンずつ受け入れ、プレーヤーが各ターンで勝利したかどうかを確認します。説明は不明確ですか?
ASCIIThenANSI 2015年

回答:


1

PHP、316

これが私の提出物です。コマンドラインでphpによって実行される必要があります。

このコードは、私が作成したいくつかのショートカットのために通知を生成することに注意してください。これでいいかどうか教えてください。あと数文字追加して直せます。私はこのページをチェックしましたが、一番上の答えは、それについて言及されていない場合、エラー報告がオフになっていると仮定することです。

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

そして、ここにコードのゴルフされていないバージョンがあります:

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

はい、通知はOKです。
ASCIIThenANSI 2015年

4

JavaScript、360

修正されたインタラクティブゲームの編集、MSIEでも実行可能

要求に応じて、テキストベースのゲーム、ポップアップからの入力、コンソールでの出力(モノスペースフォントにするため)。

「q」でゲームを終了するか、プロンプトで「キャンセル」をクリックします。

ES5機能を使用せず、任意のモデラーブラウザ(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")

さあ、もっと楽しいインタラクティブバージョンとグラフィックバージョンを実行して、スニペットを実行します。


素敵なクリック可能なバージョン!(マイナーな提案:ラジオボタンの代わりに右/左クリックを使用できます。)
xebtl

@xebtl試してみる
edc65

1

Java、565文字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);}}

これはおそらくこれまでで最も長いコードゴルフです。本当に下手です。


1

オクターブ、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

実装は非常に簡単で、format plus印刷を処理するために使用する唯一の「トリック」です。これはコメント付きバージョンです:

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

入力構文と有効性をチェックする必要があるため、コードはfread()一度に1文字を読み取るために使用します。

掲示板やメッセージをきちんと出力するように気をつけました。余分な出力が許容できる場合は、数バイトを削ることができます。たとえば、自動印刷(no disp(F))を使用すると、ボードは次のように表示されます。

F =

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

また、私はそれぞれの動きが別々の行に与えられていると解釈しました。


相互作用の例(-qスイッチはOctaveのヘッダーを抑制するためのものです):

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

無効な移動が原因でプログラムが終了しました(意図したものかどうかは不明です)。


確認するために(以前に混乱があったため)、これは両方のプレイヤーからの入力を受け取り、実際にゲームをシミュレートします。特定のボードが勝ったかどうかを確認するだけではありませんか?
ASCIIThenANSI

@ASCIIThenANSIちょうどそうです。フォームの各移動がx y t別の行にあることが期待されます(他の入力はありません)。
xebtl

そして、すべての入力後にボードを印刷しますか?
ASCIIThenANSI

@ASCIIThenANSIはい、編集された回答を参照してください。
xebtl
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.