Tulis program yang menampilkan semua kemungkinan posisi Tic Tac Toe termasuk hasil permainan yang sesuai. Hindari output duplikat dari posisi yang sama.
Program tidak menerima input.
Aturan:
- Output posisi harus terdiri dari 9 karakter, menggunakan
X
danO
untuk kotak yang diambil, dan karakter non-spasi putih sewenang-wenang untuk kotak kosong - Setiap posisi harus dicetak dalam 3 baris / kolom, dengan garis kosong sebagai pemisah antara dua posisi.
- Ruang kosong / karakter garis / kotak kosong tambahan dipersilakan
- Pemain X berjalan lebih dulu
The hasilnya dapat berupa:
- X telah menang
- O telah menang
- Seri
- Permainan sedang berlangsung
Anda bebas memilih visualisasi hasil posisi yang sesuai, misalnya sebagai teks berwarna, atau sebagai anotasi teks, asalkan ditempatkan dekat posisi yang sesuai.
- Posisi dianggap sama jika satu dapat diperoleh dari yang lain dengan rotasi atau mirroring. Posisi rangkap tidak boleh dicetak. (Dengan kata lain, cetak kelas kesetaraan saja.)
Misalnya, cetak hanya satu dari yang berikut ini:
X•• ••X ••• •••
••• ••• ••• •••
••• ••• X•• ••X
- Ini kode-golf , jadi kode terpendek menang!
Output sampel:
•••
•••
••• -
X••
•••
••• -
•X•
•••
••• -
•••
•X•
••• -
[…]
XXO
OOX
XXO /
OXO
XXX
OXO X
Petunjuk: Ada 765 posisi, dengan 91 kemenangan untuk X, 44 kemenangan untuk O, dan 3 seri.
Sebuah pertanyaan serupa telah diminta sebelumnya, tapi yang satu ini berbeda.
code-golf
tic-tac-toe
ThomasR
sumber
sumber
Jawaban:
Jelly ,
192179168 byteCobalah online! (Butuh sekitar 30 detik, jadi bersabarlah).
Bagaimana itu bekerja
Ikhtisar tingkat tinggi:
Dalam langkah menengah, ini menyimpan X as
1
, unplaced as0
, dan O as-1
. Program ini menghasilkan semua 3 ^ 9 kemungkinan, kemudian hanya menyimpan posisi yang valid berdasarkan memenuhi tiga kriteria:Kemudian, program ini mengganti setiap kondisi permainan dengan semua rotasi dan pantulannya untuk mendapatkan daftar semua kelas ekivalensi. Ini adalah operasi yang menghabiskan sebagian besar waktu.
Status permainan pertama diambil dari masing-masing kelas kesetaraan, lalu siapa yang menang dihitung.
Di mana ini terjadi Baris diberi nomor agar mudah dibaca
sumber
Ruby, 305 byte
Ini bekerja sama dengan jawaban lain karena menghasilkan semua
3**9
papan kemudian menyaring yang valid. Secara internal, kami menggunakan nomor terner0=X 1=. 2=O
di mana dalam output. Iterasic
melalui 3 nilai yang mungkin untuk pusat, dans
melalui3**8 = 6561
nilai untuk perimeter. Sebelum mengonversii/3
ke representasi string dari nomor terner, kami mengalikannya dengan6562
menduplikasi semua digit, dan menambahkan3**16
untuk memulai angka dengan 1, untuk memastikan ada nol di depan yang berlaku.w
adalah kondisi menang - atur ini ke nol.Untuk setiap papan Iterate melalui 4 rotasi digit
s
untuk menemukan versi terendah secara leksikal dari nomor terner 8 digit saat ini yang mewakili perimeter. Pada saat yang sama, tambahkan nilai ascii dari 3 digit pertama (baris teratas dari rotasi saat ini) dan gunakan ini untuk memeriksa kemenangan. Juga, tambahkan nilai asciic
dan sepasang angka yang berlawanan secara diametris untuk memeriksa apakah ada kemenangan melalui center.Periksa apakah outputnya valid - Jika bit 1 dan 64 bit
w
ditetapkan, kedua belah pihak menang - ini tidak valid. Periksa saldo X dan O (jika belum ada pemenang, itu bisa sama dengan X dan O atau satu lagi X - tetapi jika permainan dimenangkan, hanya ada satu nilai yang mungkin, karena pemenang harus yang terakhir.) Untuk menghindari menunjukkan rotasi yang berbeda dari papan yang sama, hanya keluaran jika versi perimeter terendah secara leksikal sesuai dengan nilai saat inis[2,9]
.Keluarkan papan , melestarikan simbol
tr("012","X.O")
. Status permainan ditampilkan di bawah papan. Jika w = 0, ini adalahtrue
jika masih ada kotak kosong (permainan masih berlangsung) danfalse
jika papan penuh. Jikaw
bukan nol kita mengeluarkan1
jika pemain 1 (X) telah menang atau64%31==2
jika pemain 2 (O) telah menang.Tidak disatukan
Skema memeriksa
Diagram di bawah ini menunjukkan skema rotasi (dan win checking, dalam huruf kapital). Diagram ditampilkan tidak diputar. Empat rotasi berbeda diambil sebagai substring dari salinan ganda
i/3
, dengan 3 huruf kapital berurutan pada perimeter setiap diagram ("atas" per rotasi saat ini) menjadi 3 karakter pertama dalam substring 9 karakter. Untuk setiap rotasi, pembalikan 9-karakter (flip diagonal tentang AE atau sumbu CG) juga dicoba. Papan hanya keluaran jika nilai saat inii/3
adalah yang terendah secara leksikal dari semua rotasi dan cermin.sumber
Python 2 ,
648620 byteCobalah online!
Mungkin sedikit bermain golf kecil di sini dengan pendekatan ini; tapi tidak banyak.
Sunting: Thx to ovs, yang mencatat tweak mendapatkan 28 byte; dan 3 dari Artemis Fowl
Batalkan kode golf
Ide dasarnya di sini adalah: brute force masing-masing dari 3 ^ 9 = 19683 kemungkinan papan pengkodean. Melacak konjugat (rotasi dan refleksi) dari papan yang telah diperiksa sehingga Anda tidak menggandakan entri. Minimal, dewan yang valid harus memiliki jumlah X dan O yang sama atau lebih dari X daripada O. Tidak mungkin memiliki kemenangan untuk X dan kemenangan untuk O; ditambah beberapa kendala rewel tambahan.
sumber
Counter
. Anda dapat menggantinya denganc=b.count;d=c(x)-c(o)
return
bisareturn 0if d not in[0,1]else 0if w and v else(x*(d==1))if w else(o*(d==0))if v else'.'if'.'in b else'/'