Sebuah TicTacToe
permainan dapat diwakili oleh string yang menunjukkan urutan posisi saat para pemain bergerak.
0 1 2 3 4 5 6 7 8
Asumsikan X
selalu bermain dulu.
Jadi string "012345678" menunjukkan permainan
XOX OXO XOX
Perhatikan, permainan sudah dimenangkan ketika Pemain X
menandai 6
, pada saat itu permainan berakhir, memberikan kemenangan kepada X
. (yaitu, abaikan gerakan yang tersisa setelah pemain menang)
Tantangan Anda (kode) adalah untuk mencetak semua game (urutan diurutkan) dan hasilnya.
Format
<movesequence>:<result>\n
misalnya:
012345678:X
012345687:X
012345768:X
...
Dinotasikan X
untuk pemain pertama yang menang, O
untuk pemain kedua, dan D
untuk Draws.
Akan ada 9!
(362880) game.
Berikut adalah beberapa data untuk memverifikasi hasil Anda.
'X' Wins: 212256
'O' Wins: 104544
Draws : 46080
Ini adalah codegolf, dan runtime harus dalam satu menit. Selamat bersenang-senang!
EDIT: Menghapus rincian berlebih, dan cukup mencetaknya stdout
. Tidak perlu membuat file.
Jawaban:
Ruby 1.9, 201 karakter
Sejauh ini golf sedikit. Butuh sekitar 45 detik untuk menyelesaikannya di sini.
sumber
J, 124 karakter
X win, O win dan Draw counts lihat.
Agak menyakitkan untuk di-debug. :)
sumber
Haskell,
224222 karakterSayangnya,
permutations
fungsi dariData.List
tidak menghasilkan permutasi dalam urutan leksografis. Jadi saya harus mengeluarkan 6 karakter semacam itu.sumber
APL (139)
Ini mungkin dapat dipersingkat lebih, tapi itu cukup sulit. Percaya atau tidak, itu berjalan dalam waktu sekitar 45 detik di komputer saya (tidak termasuk waktu yang dibutuhkan untuk output semuanya, ketika output ke layar).
Penjelasan:
M←⍳9
: Simpan dalam M angka dari 1 hingga 9. Secara internal, program ini menggunakan 1..9 bukannya 0..8.{
...}
: fungsi untuk mendapatkan semua permutasi:1≥⍴⍵:↑,↓⍵
: jika panjangnya lebih kecil atau sama dengan 1, kembalikan argumen sebagai matriks.⋄↑⍪/⍵,∘∇¨⍵∘~¨⍵
: jika tidak, hapus setiap karakter⍵
dari⍵
, dapatkan permutasi dari itu, dan tambahkan kembali karakter.¨↓
: untuk setiap permutasi ...{
...}
: fungsi yang memberikan pemenang untuk permutasi itu:⊃,/(,/⍕¨⍵-1),':',{
...}⍵
: dapatkan permutasi sebagai string, dengan semua angka dikurangi 1 (untuk mendapatkan output 0..8 yang diperlukan, bukan 1..9), diikuti oleh titik dua, diikuti oleh karakter yang menunjukkan pemenang:⍉5 2⍴0,⍨⍵
: pisahkan gerakan oleh X dari gerakan oleh O. Karena O memiliki satu gerakan kurang dari X, ruang itu diisi oleh0
, yang tidak digunakan dan tidak mempengaruhi hasilnya.{
...}¨↓
: untuk papan X dan papan O, jalankan fungsi berikut yang menentukan apakah ada kemenangan di salah satu dari sembilan catatan waktu:(M∘.≥M)∧[2]M∊⍵
: Hasilkan bitboard dari nomor bergerak, danand
bitboard ini dengan bitstrings100000000
,110000000
...111111111
untuk mendapatkan status papan pada masing-masing dari sembilan momen dalam waktu.{
...}¨↓
: untuk masing-masing ini, jalankan fungsi berikut:⍉(9⍴2)⊤⎕UCS'㗀㐇㔤㑉㔑㑔'
: dapatkan bitboard untuk setiap situasi kemenangan yang memungkinkan⍵∘{⍵≡⍵∧⍺}¨↓
:and
setiap negara pemenang dengan bitboard saat ini dan periksa apakah negara yang menang masih ada∨/↑
:or
ini bersama, memberi apakah ada kemenangan di papan bit ini1∊T←↑
: buat matriks 9x2, dengan 9 X-timesteps di baris pertama dan 9 O-timesteps di baris kedua. Simpan ini dalam T. Jika ada 1 dalam matriks ini, seseorang telah menang.:'XO'[1+</+/T]
: Jika seseorang menang, berikan 'X' atau 'O' tergantung pada siapa1
yang pertama.⋄'D'
: Jika tidak ada yang menang, berikan 'D'.↑
: buat matriks dari ini sehingga masing-masing ditampilkan pada baris terpisah.sumber
Python Ungolfed
sumber
permutations
C ++ Tidak Disatukan
sumber
Python 2.7 (237)
sumber