Từ điển Tic Tac


17

Một TicTacToetrò chơi có thể được thể hiện bằng một chuỗi biểu thị chuỗi các vị trí khi người chơi di chuyển.

0 1 2
3 4 5
6 7 8

Giả sử Xluôn chơi đầu tiên.

Vì vậy, một chuỗi "012345678" biểu thị trò chơi

XOX
OXO
XOX

Lưu ý, trò chơi đã chiến thắng khi Người chơi Xđánh dấu 6, tại thời điểm đó, trò chơi kết thúc, trao chiến thắng cho X. (nghĩa là bỏ qua các nước đi còn lại sau khi người chơi thắng)

Thử thách (mã) của bạn là in tất cả các trò chơi (thứ tự được sắp xếp) và kết quả của nó.

Định dạng

<movesequence>:<result>\n

ví dụ:

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

Biểu thị Xcho người chơi thứ nhất chiến thắng, Ocho người chơi thứ hai và Dcho Draws.

Sẽ có 9!(362880) trò chơi.

Dưới đây là một số dữ liệu để xác minh kết quả của bạn.

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

Đây là một codegolf và thời gian chạy sẽ trong vòng một phút. Chúc vui vẻ!

EDIT: Đã xóa các chi tiết thừa và chỉ cần in nó lên stdout. Không cần phải tạo một tập tin.


2
Tôi đang nhận được các số khác nhau ở đây: 212256 chiến thắng cho X, 104544 chiến thắng cho O và 46080 trận hòa (và Wikipedia dường như đồng ý với tôi ).
Ventero

@Ventero, tôi sẽ kiểm tra lại, nhưng tôi không thấy bất kỳ tài liệu tham khảo nào về những con số đó trên trang.
st0le

@Ventero, Bạn nói đúng, tôi sẽ chỉnh sửa phần đó. sẽ đăng md5sum sớm.
st0le

1
Câu trả lời của Ruby không phải là câu trả lời ngắn nhất, vì vậy nó không phải là câu trả lời được chấp nhận theo tiêu chí chấm điểm của bạn (code-golf).
mbomb007

Câu trả lời:


3

Ruby 1.9, 201 ký tự

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

Hơi bị đánh golf cho đến nay. Mất khoảng 45 giây để hoàn thành ở đây.

  • Chỉnh sửa: (268 -> 249) Viết vào thiết bị xuất chuẩn thay vì tệp
  • Chỉnh sửa: (249 -> 222) Không điền trước mảng với mỗi lần di chuyển của người chơi.
  • Chỉnh sửa: (222 -> 208) Cách ngắn hơn để tìm hiểu xem người chơi có thắng không
  • Chỉnh sửa: (208 -> 213) Quay lại 213, giải pháp trước đó quá chậm.
  • Chỉnh sửa: (213 -> 201) Một số sắp xếp lại, xóa khoảng trắng

Tôi đã chỉnh sửa câu hỏi một chút, bạn không cần tạo tệp ngay bây giờ, chỉ cần in nó.
st0le

4

J, 124 ký tự

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

X thắng, O thắng và Rút ra kiểm tra.

Đã có một chút đau đớn để gỡ lỗi mặc dù. :)


3

Haskell, 224 222 ký tự

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

Than ôi, permutationschức năng từ Data.Listkhông tạo ra hoán vị theo thứ tự từ vựng. Vì vậy, tôi đã phải tiêu tốn 6 ký tự cho việc sắp xếp.


2

APL (139)

Điều này có thể được rút ngắn nhiều hơn, nhưng nó đã đủ khó như nó là. Dù bạn có tin hay không, nó chạy trong khoảng 45 giây trên máy tính của tôi (không kể thời gian cần thiết để xuất mọi thứ, khi xuất ra màn hình).

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

Giải trình:

  • M←⍳9: Lưu trữ trong M các số từ 1 đến 9. Trong nội bộ, chương trình này sử dụng 1..9 thay vì 0..8.
  • {... }: một chức năng để có được tất cả các hoán vị:
    • 1≥⍴⍵:↑,↓⍵: nếu độ dài nhỏ hơn hoặc bằng 1, trả về đối số dưới dạng ma trận.
    • ⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵: nếu không, hãy xóa từng ký tự từ , lấy hoán vị của ký tự đó và thêm ký tự trở lại.
  • ¨↓: cho mỗi hoán vị ...
  • {... }: một chức năng mang lại cho người chiến thắng cho hoán vị đó:
    • ⊃,/(,/⍕¨⍵-1),':',{... }⍵: lấy hoán vị dưới dạng chuỗi, với tất cả các số giảm 1 (để có đầu ra 0..8 thay vì 1..9), theo sau là dấu hai chấm, theo sau là ký tự biểu thị người chiến thắng:
      • ⍉5 2⍴0,⍨⍵: tách các di chuyển của X khỏi các di chuyển bằng O. Bởi vì O có một di chuyển nhỏ hơn X, không gian đó được lấp đầy 0, không được sử dụng và do đó không ảnh hưởng đến kết quả.
      • {... }¨↓: cho cả bảng X và bảng O, hãy chạy chức năng sau để xác định xem có chiến thắng ở một trong chín dấu thời gian hay không:
        • (M∘.≥M)∧[2]M∊⍵: Tạo bảng andbit từ các số di chuyển và bảng bit này với bitstrings 100000000, 110000000... 111111111để có được trạng thái của bảng tại mỗi thời điểm trong chín thời điểm.
        • {... }¨↓: cho mỗi thứ này, hãy chạy chức năng sau:
          • ⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔': lấy bitboard cho mỗi tình huống chiến thắng có thể
          • ⍵∘{⍵≡⍵∧⍺}¨↓: andmỗi trạng thái chiến thắng với bitboard hiện tại và kiểm tra xem trạng thái chiến thắng có còn không
        • ∨/↑: ornhững thứ này cùng nhau, đưa ra liệu có chiến thắng trên bitboard này không
      • 1∊T←↑: tạo ma trận 9x2, với 9 dấu thời gian X ở hàng đầu tiên và 9 dấu thời gian O trên hàng thứ hai. Lưu trữ này trong T. Nếu có 1 trong ma trận này, ai đó đã thắng.
      • :'XO'[1+</+/T]: Nếu ai đó đã thắng, hãy đưa ra 'X' hoặc 'O' tùy thuộc vào người 1đầu tiên.
      • ⋄'D': Nếu không có ai giành chiến thắng, hãy cho 'D'.
  • : tạo một ma trận trong số này để chúng được hiển thị trên một hàng riêng biệt.

1

Con trăn

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]

bạn không cần thông số thứ hai trongpermutations
st0le

3
Hãy chơi golf chương trình của bạn.
mbomb007

1

C ++

#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
Hãy chơi golf chương trình của bạn.
mbomb007

1

Con trăn 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]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.