박하 사탕 발가락 사전


17

TicTacToe게임은 플레이어가 이동을 같은 위치의 순서를 나타내는 문자열로 표현 될 수있다.

0 1 2
3 4 5
6 7 8

X항상 먼저 재생 한다고 가정하십시오 .

"012345678"문자열은 게임을 나타냅니다

XOX
옥소
XOX

Player가 Xmark를 표시 6하면 그 시점에서 게임이 종료되고에 승리를 거두면 게임이 이미 승리 한 것 X입니다. (즉, 플레이어가 이기면 남은 움직임을 무시하십시오)

당신의 도전 (코드)은 모든 게임 (정렬 된 순서)과 결과를 인쇄하는 것입니다.

체재

<movesequence>:<result>\n

예 :

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

넣어야 X, 경력 1 플레이어 O두 번째 플레이어 및 D위해가립니다.

있을 것이다 9!(362880) 게임.

결과를 확인하기위한 몇 가지 데이터가 있습니다.

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

이것은 코드 골프이며 런타임은 1 분 이내에 있어야합니다. 즐기세요!

편집 : 초과 세부 정보를 제거하고에 인쇄하십시오 stdout. 파일을 만들 필요가 없습니다.


2
나는 다른 숫자를 얻고 있습니다 : X의 경우 212256 승리, O의 경우 104544 승리 및 46080의 무승부 (그리고 Wikipedia는 에게 동의하는 것 같습니다 ).
Ventero

@Ventero, 다시 확인하지만 페이지에 해당 숫자에 대한 참조가 없습니다.
st0le

@ Ventero, 당신 말이 맞아요, 그 부분을 편집하겠습니다. 곧 md5sum을 게시합니다.
st0le

1
루비 답변은 가장 짧은 것이 아니므로 점수 기준 (코드 골프)에 따라 허용되는 답변이되어서는 안됩니다.
mbomb007

답변:


3

루비 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) 파일 대신 stdout에 쓰기
  • 편집 : (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 win, O win 및 Draw counts 체크 아웃.

그래도 디버깅하기가 약간 어려웠습니다. :)


3

하스켈, 224222

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

아아, permutationsfrom 의 함수 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: 1에서 9까지의 숫자를 M에 저장합니다. 내부적으로이 프로그램은 0..8 대신 1..9를 사용합니다.
  • {... }: 모든 순열을 얻는 함수 :
    • 1≥⍴⍵:↑,↓⍵: 길이가 1보다 작거나 같은 경우 인수를 행렬로 반환합니다.
    • ⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵: 그렇지 않으면, 각 문자를 제거 에서 그 순열을 얻을, 그리고의 문자 등을 추가 할 수 있습니다.
  • ¨↓: 각 순열에 대해 ...
  • {... }: 해당 순열의 승자를 제공하는 함수 :
    • ⊃,/(,/⍕¨⍵-1),':',{... }⍵: 순열을 문자열로 가져옵니다. 모든 숫자가 1 씩 감소하고 (1.9 대신 필요한 0..8 출력을 얻음) 콜론과 승자를 나타내는 문자가 차례로 나타납니다.
      • ⍉5 2⍴0,⍨⍵: X에 의한 이동과 O에 의한 이동을 분리합니다. O에 X보다 적은 이동이 하나 있기 때문에 해당 공간은로 채워져 0사용되지 않으므로 결과에 영향을 미치지 않습니다.
      • {... }¨↓: X 보드와 O 보드 모두 9 개의 타임 스텝 중 하나에 승리가 있는지 여부를 결정하는 다음 기능을 실행합니다.
        • (M∘.≥M)∧[2]M∊⍵: 이동 숫자에서 bitboard 및 생성 and비트 스트링이 bitboard를 100000000, 110000000... 111111111시간에 아홉 순간의 각각의 보드의 상태를 얻을 수 있습니다.
        • {... }¨↓: 이들 각각에 대해 다음 기능을 실행하십시오.
          • ⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔': 가능한 각 승리 상황에 대한 비트 보드를 가져옵니다
          • ⍵∘{⍵≡⍵∧⍺}¨↓: and현재 비트 보드가있는 각 당첨 상태 및 해당 당첨 상태가 여전히 존재하는지 확인
        • ∨/↑: or이 비트 보드에 승리 여부를 알려주는
      • 1∊T←↑: 9x2 행렬을 만듭니다. 첫 번째 행에는 9 X 타임 스텝이 있고 두 번째 행에는 9 O 타임 스텝이 있습니다. 이것을 T에 저장하십시오.이 매트릭스에 1이 있으면 누군가 이겼습니다.
      • :'XO'[1+</+/T]: 누군가 이겼다면, 1누가 처음인지 에 따라 'X'또는 'O'를 줍니다.
      • ⋄'D': 아무도 이겼지 않으면 'D'를주십시오.
  • : 이들을 매트릭스로 만들어 각각 별도의 행에 표시되도록합니다.

1

파이썬 언 골프

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]

당신은 두 번째 매개 변수가 필요하지 않습니다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

파이썬 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.