チックタックトー辞書


17

TicTacToeゲームは、プレイヤーが自分の行動を起こすような位置のシーケンスを示す文字列で表すことができます。

0 1 2
3 4 5
6 7 8

X常に最初にプレイすると仮定します。

「012345678」の文字列はゲームを示します

XOX
OXO
XOX

プレイヤーがをXマークするとゲームは既に勝ち6、その時点でゲームが終了し、に勝ちを与えXます。(つまり、プレーヤーが勝ったら残りの動きを無視します)

あなたの課題(コード)は、すべてのゲーム(ソート順)とその結果を印刷することです。

フォーマット

<movesequence>:<result>\n

例えば:

012345678:X
012345687:X
012345768:X
...

意味X受賞第一のプレーヤーのために、O第二のプレーヤーのための、およびD描画のために。

あります9!(362880)ゲーム。

結果を確認するためのデータを次に示します。

'X' Wins: 212256 
'O' Wins: 104544 
Draws : 46080 

これはcodegolfであり、実行時間は1分以内でなければなりません。楽しんで!

編集:余分な詳細を削除し、そのまま印刷しstdoutます。ファイルを作成する必要はありません。


2
私はここで異なる数字を取得しています:Xで212256勝、Oで104544勝、および46080引き分け(そしてウィキペディアは同意するようです)。
ヴェンテロ

@Ventero、再確認しますが、ページにこれらの番号への参照は表示されません。
st0le

@Ventero、あなたは正しい、私はその部分を編集します。md5sumをすぐに投稿します。
st0le

1
Rubyの回答は最短ではないため、採点基準(code-golf)に従って受け入れられる回答であってはなりません。
mbomb007

回答:


3

Ruby 1.9、201文字

r=*[*l=0..8,0,3,6,1,4,7,2,5,8,0,4,8,2,4,6].each_slice(3)
w=->a{r.any?{|b|b&a==b}}
[*l].permutation(9){|a|u=[[],[]];i=-1
u[i%2]<<a[i+=1]while !((x=w[u[1]])||o=w[u[0]])&&i<8
puts a*""+":#{x ??X:o ??O:?D}"}

今のところ少しゴルフをしています。ここで完了するには約45秒かかります。

  • 編集:(268-> 249)ファイルの代わりに標準出力に書き込む
  • 編集:(249-> 222)各プレイヤーの動きで配列を事前に埋めないでください。
  • 編集:(222-> 208)プレイヤーが勝ったかどうかを調べるより短い方法
  • 編集:(208-> 213)213に戻ると、以前のソリューションは遅すぎました。
  • 編集:(213-> 201)いくつかの再配置、空白の削除

質問を少し編集しました。今すぐファイルを作成する必要はなく、印刷するだけです。
st0le

4

J、124文字

((],~':',~1":[){&'DOX'@(</+2*>/)@:(<./"1)@:(((2{m/.@|.),(2{m/.),m"1,>./)"2)@(<:@(>:%2|]),:(%(2|>:)))@(3 3$]))"1((i.!9)A.i.9)

X勝、O勝、ドローカウントのチェックアウト。

しかし、デバッグするのは少し苦痛でした。:)


3

Haskell、224 222文字

import Data.List
p=sort.permutations
a(e:_:z)=e:a z;a z=z
[c,d]%(e:z)|any((`elem`words"012 345 678 036 147 258 048 246").take 3).p.a.reverse$e=c|1<3=[d,c]%z;_%[]='D'
main=putStr$p['0'..'8']>>=(\s->s++':':"OX"%inits s:"\n")

悲しいかな、permutationsからの関数Data.Listは辞書順で順列を生成しません。そのため、ソートに6文字を費やす必要がありました。


2

APL(139)

これはおそらくもっと短くすることができますが、そのままでは十分に困難でした。信じられないかもしれませんが、コンピューターで約45秒で実行されます(画面に出力するとき、すべてを出力するのにかかる時間を除く)。

↑{⊃,/(,/⍕¨⍵-1),':',{1∊T←↑{∨/↑{⍵∘{⍵≡⍵∧⍺}¨↓⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔'}¨↓(M∘.≥M)∧[2]M∊⍵}¨↓⍉5 2⍴0,⍨⍵:'XO'[1+</+/T]⋄'D'}⍵}¨↓{1≥⍴⍵:↑,↓⍵⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵}M←⍳9

説明:

  • M←⍳9:Mに1〜9の数字を保存します。内部的には、このプログラムは0..8ではなく1..9を使用します。
  • {... }:すべての順列を取得する関数:
    • 1≥⍴⍵:↑,↓⍵:長さが1以下の場合、引数を行列として返します。
    • ⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵:それ以外の場合、fromの各文字を削除し、その順列を取得して、文字を追加し直します。
  • ¨↓:順列ごとに...
  • {... }:その順列の勝者を与える関数:
    • ⊃,/(,/⍕¨⍵-1),':',{... }⍵:順列を文字列として取得し、すべての数値を1ずつ減らして(1..9の代わりに必要な0..8の出力を取得するため)、その後にコロン、その後に勝者を示す文字が続きます。
      • ⍉5 2⍴0,⍨⍵:Xによる移動をOによる移動から分離します。OにはXよりも1つの移動が少ないため、そのスペースはで埋められ0、未使用であり、結果に影響しません。
      • {... }¨↓:XボードとOボードの両方について、9つのタイムステップのいずれかで勝ちがあるかどうかを決定する次の関数を実行します。
        • (M∘.≥M)∧[2]M∊⍵:移動番号からビットボード、および生成andビット文字列で、このビットボードを100000000110000000... 111111111時間で9つの瞬間のそれぞれのボードの状態を取得します。
        • {... }¨↓:これらのそれぞれについて、次の関数を実行します。
          • ⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔':勝つ可能性のある状況ごとにビットボードを取得する
          • ⍵∘{⍵≡⍵∧⍺}¨↓and現在のビットボードでの各勝利状態と、その勝利状態がまだ存在するかどうかを確認
        • ∨/↑orこれらを合わせて、このビットボードに勝利があるかどうかを示します
      • 1∊T←↑:最初の行に9つのXタイムステップ、2番目の行に9つのOタイムステップを使用して、9x2行列を作成します。これをTに保存します。このマトリックスに1があれば、誰かが勝ちました。
      • :'XO'[1+</+/T]:誰かが勝った場合、誰1が最初かによって「X」または「O」を与えます。
      • ⋄'D':誰も勝っていない場合は、「D」を与えます。
  • :これらからマトリックスを作成し、それぞれが別々の行に表示されるようにします。

1

Python Ungolfed

from itertools import*
r=range
W=[[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8],[0,4,8],[2,4,6]]
def c(B):
    for i in r(8):
                if B[W[i][0]]==B[W[i][1]]==B[W[i][2]]:
                        return 1
        return 0

for i in permutations('012345678',9):
    B=[]
    for j in r(9):
        B.append(-(j+1))
    k=0
    F=1
    for j in r(9):
        k=[1,0][k]
        B[int(i[j])]=k
        if c(B):
            F=0
            break
    print "".join(i),':',[['0','X'][k],'D'][F]

2番目のパラメーターは必要ありませんpermutations
st0le

3
プログラムをゴルフしてください。
mbomb007

1

C ++ Ungolfed

#include<iostream>
using namespace std;
#include<algorithm>

int check(int B[])
{
        for (int i=0;i<3;i++)
                if ((B[3*i]==B[3*i+1]&&B[3*i]==B[3*i+2]) || (B[i]==B[i+3]&&B[i]==B[i+6]))
                        return 1;
        if ((B[2]==B[4]&&B[2]==B[6]) || (B[0]==B[4]&&B[0]==B[8]))
                return 1;
        return 0;               
}
int main()
{
        char c[11]="012345678";
        int B[9],i,j;
        do{
                for (i=0;i<9;i++)B[i]=-(i+1);
                for (i=0,j=1;i<9;i++,j=j?0:1)
                {
                        B[c[i]-'0']=j;
                        if (check(B))
                                break;
                }
                printf("%s:%c\n",c,i<9?j?'X':'O':'D');
        }while (next_permutation(c,c+9));
}

4
プログラムをゴルフしてください。
mbomb007

1

Python 2.7(237)

from itertools import*
for z in permutations('012345678'):
 k,F=0,[9]*9
 for h in z:
    F[int(h)]=k=1-k
    if any(sum(a)in(0,3)for a in(F[:3],F[3:6],F[6:],F[::3],F[1::3],F[2::3],F[::4],F[2:8:2])):break
 else:k=2
 print"".join(z)+':','OXD'[k]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.