Słownik Tic Tac Toe

17

TicTacToeGra może być reprezentowany przez ciąg oznaczający kolejność pozycji jak gracze zrobić ich ruch.

0 1 2
3 4 5
6 7 8

Zakładaj, że Xzawsze gra pierwszy.

Więc ciąg „012345678” oznacza grę

XOX
OXO
XOX

Zauważ, że gra jest już wygrana, gdy gracz Xoznaczy 6, w tym momencie gra się kończy, przyznając wygraną X. (tzn. zignoruj ​​pozostałe ruchy, gdy gracz wygra)

Wyzwaniem (kodem) jest wydrukowanie wszystkich gier (posortowana kolejność) i ich wyników.

Format

<movesequence>:<result>\n

na przykład:

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

Oznacz Xwygraną pierwszego gracza, Odrugiego gracza i Dlosowania.

Będą 9!(362880) gry.

Oto kilka danych umożliwiających sprawdzenie wyników.

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

To jest codegolf, a czas działania powinien być w ciągu minuty. Baw się dobrze!

EDYCJA: Usunąłem nadmiar szczegółów i po prostu wydrukowałem stdout. Nie ma potrzeby tworzenia pliku.

st0le
źródło
2
Dostaję tutaj różne liczby: 212256 zwycięstw dla X, 104544 zwycięstw dla O i 46080 remisów (i Wikipedia zdaje się ze mną zgadzać ).
Ventero
@ Ventero, sprawdzę ponownie, ale nie widzę żadnych odniesień do tych liczb na stronie.
st0le
@Ventero, masz rację, będę edytować tę część. wkrótce opublikuje md5sum.
st0le
1
Odpowiedź Ruby nie jest najkrótsza, więc nie powinna być odpowiedzią zaakceptowaną zgodnie z twoimi kryteriami punktacji (code-golf).
mbomb007

Odpowiedzi:

3

Ruby 1.9, 201 znaków

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

Jak dotąd lekko golfa. Wykonanie tutaj zajmuje około 45 sekund.

  • Edycja: (268 -> 249) Napisz do standardowego pliku zamiast do pliku
  • Edycja: (249 -> 222) Nie wypełniaj tablicy ruchami każdego gracza.
  • Edycja: (222 -> 208) Krótszy sposób, aby dowiedzieć się, czy gracz wygrał
  • Edycja: (208 -> 213) Powrót do 213, poprzednie rozwiązanie było zbyt wolne.
  • Edycja: (213 -> 201) Niektóre zmiany układu, usunięte białe znaki
Ventero
źródło
Trochę zredagowałem pytanie, nie musisz teraz tworzyć pliku, po prostu go wydrukuj.
st0le
4

J, 124 znaki

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

X wygrana, O wygrana i remis liczą się.

Debiut był nieco bolesny. :)

randomra
źródło
3

Haskell, 224 222 znaków

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

Niestety permutationsfunkcja from Data.Listnie tworzy permutacji w porządku leksykalnym. Musiałem więc wydać 6 postaci na ten rodzaj.

MtnViewMark
źródło
2

APL (139)

Prawdopodobnie można to jeszcze bardziej skrócić, ale było wystarczająco trudne. Wierzcie lub nie, ale działa na moim komputerze w ciągu około 45 sekund (z wyłączeniem czasu potrzebnego na wyprowadzenie wszystkiego, gdy jest wyświetlany na ekranie).

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

Wyjaśnienie:

  • M←⍳9: Przechowuj w M liczby od 1 do 9. Wewnętrznie ten program używa 1..9 zamiast 0..8.
  • {... }: funkcja pozwalająca uzyskać wszystkie permutacje:
    • 1≥⍴⍵:↑,↓⍵: jeśli długość jest mniejsza lub równa 1, zwróć argument jako macierz.
    • ⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵: w przeciwnym razie usuń każdy znak z , uzyskaj permutacje tego i dodaj znak z powrotem.
  • ¨↓: dla każdej permutacji ...
  • {... }: funkcja, która daje zwycięzcy tej permutacji:
    • ⊃,/(,/⍕¨⍵-1),':',{... }⍵: pobierz permutację jako ciąg znaków, wszystkie liczby zmniejszone o 1 (aby uzyskać wymaganą wartość wyjściową 0..8 zamiast 1..9), następnie dwukropek, a następnie znak oznaczający zwycięzcę:
      • ⍉5 2⍴0,⍨⍵: oddziel ruchy X od ruchów O. Ponieważ O ma jeden ruch mniejszy niż X, to miejsce jest wypełniane 0, co jest niewykorzystane i dlatego nie wpływa na wynik.
      • {... }¨↓: zarówno dla planszy X, jak i planszy O, uruchom następującą funkcję, która określa, czy jest wygrana w jednym z dziewięciu kroków czasowych:
        • (M∘.≥M)∧[2]M∊⍵: Wygeneruj bitboard z liczb ruchów i andtę bitboard z ciągami bitów 100000000, 110000000... 111111111aby uzyskać stan planszy w każdej z dziewięciu chwil.
        • {... }¨↓: dla każdego z nich uruchom następującą funkcję:
          • ⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔': zdobądź bitboardy dla każdej możliwej wygranej sytuacji
          • ⍵∘{⍵≡⍵∧⍺}¨↓: andkażdy stan wygranej z bieżącą płytą główną i sprawdź, czy wspomniany stan wygranej nadal istnieje
        • ∨/↑: orte razem, podając, czy na tej płycie głównej jest wygrana
      • 1∊T←↑: utwórz macierz 9x2 z 9 krokami czasu X w pierwszym rzędzie i 9 krokami czasu O w drugim rzędzie. Przechowuj to w T. Jeśli w tej matrycy jest 1, ktoś wygrał.
      • :'XO'[1+</+/T]: Jeśli ktoś wygrał, podaj „X” lub „O” w zależności od tego, kto 1był pierwszy.
      • ⋄'D': Jeśli nikt nie wygrał, podaj „D”.
  • : utwórz z nich macierz, aby każda z nich była wyświetlana w osobnym rzędzie.
marinus
źródło
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]
fR0DDY
źródło
nie potrzebujesz drugiego parampermutations
st0le
3
Proszę zagrać w golfa w swoim programie.
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));
}
fR0DDY
źródło
4
Proszę zagrać w golfa w swoim programie.
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]
Daniel
źródło