TicTacToe
Gra 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 X
zawsze gra pierwszy.
Więc ciąg „012345678” oznacza grę
XOX OXO XOX
Zauważ, że gra jest już wygrana, gdy gracz X
oznaczy 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 X
wygraną pierwszego gracza, O
drugiego gracza i D
losowania.
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.
Odpowiedzi:
Ruby 1.9, 201 znaków
Jak dotąd lekko golfa. Wykonanie tutaj zajmuje około 45 sekund.
źródło
J, 124 znaki
X wygrana, O wygrana i remis liczą się.
Debiut był nieco bolesny. :)
źródło
Haskell,
224222 znakówNiestety
permutations
funkcja fromData.List
nie tworzy permutacji w porządku leksykalnym. Musiałem więc wydać 6 postaci na ten rodzaj.źródło
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).
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łniane0
, 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 iand
tę bitboard z ciągami bitów100000000
,110000000
...111111111
aby 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⍵∘{⍵≡⍵∧⍺}¨↓
:and
każdy stan wygranej z bieżącą płytą główną i sprawdź, czy wspomniany stan wygranej nadal istnieje∨/↑
:or
te razem, podając, czy na tej płycie głównej jest wygrana1∊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, kto1
był 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.źródło
Python Ungolfed
źródło
permutations
C ++ Ungolfed
źródło
Python 2.7 (237)
źródło