พจนานุกรม Tic Tac Toe


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ว่าผู้เล่นคนที่ 1 ชนะOสำหรับผู้เล่นที่สองและDเสมอ

จะมี9!เกม (362880)

นี่คือข้อมูลบางอย่างเพื่อยืนยันผลลัพธ์ของคุณ

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

นี่คือ codegolf และควรดำเนินการภายในหนึ่งนาที มีความสุข!

แก้ไข:stdoutลบออกรายละเอียดส่วนเกินและเพียงแค่พิมพ์บน ไม่จำเป็นต้องสร้างไฟล์


2
ฉันได้รับหมายเลขต่างกันที่นี่: 212256 ชนะสำหรับ X, 104544 ชนะสำหรับ O และ 46080 เสมอ (และ Wikipedia ดูเหมือนจะเห็นด้วยกับฉัน )
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) เขียนไปยัง 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 จำนวนการตรวจสอบ

แม้ว่าการแก้ไขข้อบกพร่องจะเจ็บปวดเล็กน้อย :)


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 ภายในโปรแกรมนี้ใช้ 1..9 แทน 0..8
  • {... }: ฟังก์ชันเพื่อรับการเรียงสับเปลี่ยนทั้งหมด:
    • 1≥⍴⍵:↑,↓⍵: ถ้าความยาวน้อยกว่าหรือเท่ากับ 1 ให้ส่งคืนอาร์กิวเมนต์เป็นเมทริกซ์
    • ⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵: มิฉะนั้นให้ลบอักขระแต่ละตัวออกจากรับพีชคณิตของนั้นและเพิ่มตัวละครกลับเข้าไป
  • ¨↓: สำหรับการเปลี่ยนแปลงแต่ละครั้ง ...
  • {... }: ฟังก์ชันที่ให้ผู้ชนะสำหรับการเรียงสับเปลี่ยน:
    • ⊃,/(,/⍕¨⍵-1),':',{... }⍵: รับการเรียงสับเปลี่ยนเป็นสตริงโดยตัวเลขทั้งหมดลดลง 1 (เพื่อให้ได้ผลลัพธ์ 0..8 แทน 1..9) ตามด้วยเครื่องหมายโคลอนตามด้วยอักขระที่แสดงถึงผู้ชนะ:
      • ⍉5 2⍴0,⍨⍵: แยกการเคลื่อนไหวโดย X ออกจากการเคลื่อนไหวโดย O เนื่องจาก O มีการเคลื่อนไหวน้อยกว่า X การเว้นวรรคนั้นเต็มไปด้วย0ซึ่งไม่ได้ใช้งานดังนั้นจึงไม่มีผลต่อผลลัพธ์
      • {... }¨↓: สำหรับทั้งกระดาน X และกระดาน O ให้เรียกใช้ฟังก์ชั่นต่อไปนี้ซึ่งกำหนดว่าจะมีการชนะในหนึ่งในเก้าการประทับเวลาหรือไม่:
        • (M∘.≥M)∧[2]M∊⍵: สร้าง bitboard จากตัวเลขการย้ายและandbitboard นี้กับ bitstrings 100000000, 110000000... 111111111ที่จะได้รับสถานะของคณะกรรมการในแต่ละช่วงเวลาที่เก้าในเวลา
        • {... }¨↓: สำหรับแต่ละรายการให้เรียกใช้ฟังก์ชันต่อไปนี้:
          • ⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔': รับ bitboards สำหรับแต่ละสถานการณ์ที่ชนะ
          • ⍵∘{⍵≡⍵∧⍺}¨↓: andแต่ละรัฐที่ชนะด้วย bitboard ปัจจุบันและตรวจสอบว่ารัฐที่ชนะนั้นยังอยู่ที่นั่นหรือไม่
        • ∨/↑: orเหล่านี้เข้าด้วยกันโดยให้ว่ามีการชนะบน bitboard นี้หรือไม่
      • 1∊T←↑: สร้างเมทริกซ์ 9x2 พร้อมกับ 9 X-timesteps ในแถวแรกและ 9 O-timesteps ในแถวที่สอง เก็บมันไว้ใน T หากมี 1 ในเมทริกซ์นี้มีคนชนะ
      • :'XO'[1+</+/T]: ถ้ามีคนชนะให้ 'X' หรือ 'O' ขึ้นอยู่กับว่าใคร1เป็นคนแรก
      • ⋄'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]

คุณไม่ต้องการพารามิเตอร์ที่สองใน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.