Tic Tac Toe Sözlüğü


17

Bir TicTacToeoyun, oyuncular hareket ettikçe pozisyon sırasını gösteren bir dize ile temsil edilebilir.

0 1 2
3 4 5
6 7 8

XHer zaman önce oynadığını varsayın .

Yani "012345678" dizesi oyunu

XOX
OXO
XOX

Dikkat edin, Oyuncu Xişaretlediğinde oyun zaten kazanılır 6, bu noktada oyun biter ve kazanır X. (yani, bir oyuncu kazandığında kalan hamleleri görmezden gelin)

Zorluğunuz (kod) tüm oyunları (sıralı sıra) ve sonuçlarını yazdırmaktır.

Biçim

<movesequence>:<result>\n

Örneğin:

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

Göstermek X, kazanan 1 oyuncu için Oikinci bir oyuncu için, ve Diçin çizer.

Olacaktır 9!(362.880) oyunlar.

Sonuçlarınızı doğrulamak için bazı veriler.

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

Bu bir codegolf ve çalışma zamanı bir dakika içinde olmalı. İyi eğlenceler!

EDIT: Fazla ayrıntı kaldırıldı ve sadece üzerine yazdırın stdout. Dosya oluşturmaya gerek yok.


2
Burada farklı sayılar alıyorum: X için 212256 galibiyet, O ve 46080 çekilişler için 104544 galibiyet (ve Wikipedia benimle aynı fikirde görünüyor ).
Ventero

@Ventero, tekrar kontrol edeceğim, ancak sayfada bu sayılara herhangi bir referans göremiyorum.
st0le

@Ventero, Haklısın, o kısmı düzenleyeceğim. yakında md5sum gönderecektir.
st0le

1
Ruby cevabı en kısa değil, bu yüzden puanlama kriterlerinize (kod golf) göre kabul edilen cevap olmamalıdır.
mbomb007

Yanıtlar:


3

Yakut 1.9, 201 karakter

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

Biraz golf oynadı. Burada tamamlanması yaklaşık 45 saniye sürer.

  • Düzenleme: (268 -> 249) Dosya yerine stdout'a yaz
  • Düzenleme: (249 -> 222) Her oyuncunun hamleleri ile diziyi önceden doldurmayın.
  • Edit: (222 -> 208) Bir oyuncunun kazanıp kazanmadığını öğrenmenin daha kısa yolu
  • Düzenleme: (208 -> 213) 213 yılına kadar, önceki çözüm çok yavaştı.
  • Düzenleme: (213 -> 201) Bazı düzenlemeler kaldırıldı boşluk

Soruyu biraz düzenledim, şimdi bir dosya oluşturmanıza gerek yok, sadece yazdırın.
st0le

4

J, 124 karakter

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

X kazanmak, O kazanmak ve Beraberlik sayar kontrol.

Yine de hata ayıklamak biraz acı vericiydi. :)


3

Haskell, 224222 karakter

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

Ne yazık ki, gelen permutationsişlev Data.Listsözlükbilimsel düzende permütasyon üretmez. Bu yüzden 6 karakter harcamam gerekiyordu.


2

APL (139)

Bu muhtemelen daha fazla kısaltılabilir, ancak olduğu gibi yeterince zordu. İster inanın ister inanmayın, bilgisayarımda yaklaşık 45 saniye içinde çalışır (ekrana çıktı alındığında her şeyi çıkarmak için geçen süre hariç).

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

Açıklama:

  • M←⍳9: 1'den 9'a kadar olan sayıları M'de saklayın. Dahili olarak, bu program 0..8 yerine 1..9 kullanır.
  • {...} : tüm permütasyonları almak için bir fonksiyon:
    • 1≥⍴⍵:↑,↓⍵: uzunluk 1'den küçük veya 1'e eşitse, bağımsız değişkeni bir matris olarak döndürün.
    • ⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵: Aksi, her karakteri kaldırın gelen bu PERMÜTASYON olsun ve karakter geri ekleyin.
  • ¨↓: her permütasyon için ...
  • {...} : kazanana bu permütasyon veren bir fonksiyon:
    • ⊃,/(,/⍕¨⍵-1),':',{...}⍵ : permütasyonu dize olarak al, tüm sayılar 1 azaldı (1..9 yerine gerekli 0..8 çıktıyı almak için), ardından iki nokta üst üste ve ardından kazananı gösteren karakter:
      • ⍉5 2⍴0,⍨⍵: X hareketlerini O hareketlerinden ayırın. O'nun X'ten daha az bir hareketi olduğu için, bu boşluk doldurulur 0, bu kullanılmaz ve sonucu etkilemez.
      • {... }¨↓: hem X kartı hem de O kartı için, dokuz zaman adımından birinde bir kazanç olup olmadığını belirleyen aşağıdaki işlevi çalıştırın:
        • (M∘.≥M)∧[2]M∊⍵: Hareket numaralarından bir bitboard andve bit dizeleri ile bu bitboard 100000000, 110000000... 111111111dokuz anın her birinde panonun durumunu almak için.
        • {... }¨↓: bunların her biri için aşağıdaki işlevi çalıştırın:
          • ⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔': her olası kazanma durumu için bitboard'ları alın
          • ⍵∘{⍵≡⍵∧⍺}¨↓: andmevcut bitboard ile her kazanan devlet ve söz konusu kazanan devletin hala orada olup olmadığını kontrol edin
        • ∨/↑: orbunlar birlikte, bu bitboard'da bir kazanç olup olmadığını veriyor
      • 1∊T←↑: 9x2 matrisi yapın, ilk satırda 9 X zaman aralığı ve ikinci satırda 9 O zaman aralığı. Bunu T'de saklayın. Bu matriste 1 varsa, birisi kazanmış demektir.
      • :'XO'[1+</+/T]: Birisi kazanırsa, 1ilk kim olduğuna bağlı olarak 'X' veya 'O' verin .
      • ⋄'D': Kimse kazanmadıysa, 'D' verin.
  • : her biri ayrı bir satırda görüntülenecek şekilde bunlardan bir matris oluşturun.

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]

ikinci parametreye ihtiyacınız yokpermutations
st0le

3
Lütfen programınızı golf oynayın.
mbomb007

1

C ++ Açık

#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
Lütfen programınızı golf oynayın.
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]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.