Membuat program deterministik untuk bermain n d tic-tac-toe dengan kontestan lain.
Program Anda harus bekerja ketika n
(lebar) dan d
(nomor dimensi) berada dalam rentang ini:
n∈[3,∞)∩ℕ ie a natural number greater than 2
d∈[2,∞)∩ℕ ie a natural number greater than 1
n = 3; d = 2
(3 2 yaitu 3 oleh 3):
[][][]
[][][]
[][][]
n = 3; d = 3
(3 3 yaitu 3 oleh 3 oleh 3):
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
[][][]
n = 6; d = 2
(6 2 yaitu 6 oleh 6):
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
[][][][][][]
Dan seterusnya.
Memasukkan:
Masukan akan ke STDIN. Baris input pertama adalah dua angka, n
dan d
dalam bentuk n,d
.
Setelah ini akan menjadi garis yang terdiri dari koordinat yang menentukan langkah-langkah yang telah dilakukan. Koordinat akan terdaftar dalam bentuk: 1,1;2,2;3,3
. Pojok kiri atas adalah asal (0,0 untuk 2D). Dalam kasus umum, daftar ini akan seperti di 1,2,...,1,4;4,0,...,6,0;...
mana angka pertama mewakili kiri-kanan, kedua naik ke atas, ketiga melalui dimensi ke-3, dll. Perhatikan bahwa koordinat pertama adalah X
giliran pertama, yang kedua adalah O
giliran pertama, ....
Jika ini merupakan langkah pertama, input akan berupa angka diikuti oleh 1 baris kosong.
Untuk konsistensi, input akan selalu diakhiri dengan baris baru. Input Sampel (\ n adalah baris baru):
10,10\n0,0,0,0,0,0,0,0,0,0;0,2,3,4,5,6,7,8,9,0;0,1,2,3,4,5,6,7,8,9\n
Untuk langkah pertama:
10,10\n\n
di mana \n
karakter baris baru.
Keluaran:
Keluarkan langkah yang ingin Anda buat dalam format yang sama dengan input (daftar yang dipisahkan koma). Langkah yang tidak valid (yaitu yang sudah diambil) akan menghasilkan kerugian untuk permainan.
Catatan: Anda dapat menggunakan generator angka acak, asalkan Anda menaburnya dengan nilai sedemikian rupa sehingga setiap proses akan sama dengan kondisi yang sama. Dengan kata lain, program harus bersifat deterministik.
Catatan: hanya gerakan yang sah yang diizinkan.
Winning Games (Jika Anda telah memainkan cukup banyak tac toe tic multi-dimensi, ini adalah sama.)
Agar menang, satu pemain harus memiliki semua kotak yang berdekatan di sepanjang garis. Artinya, pemain itu harus n
bergerak pada garis untuk menjadi pemenang.
Berdekatan:
- setiap ubin adalah sebuah titik; misalnya (0,0,0,0,0) adalah titik di
d=5
- ubin yang berdekatan adalah ubin sedemikian rupa sehingga keduanya merupakan titik pada unit d-cube yang sama. Dengan kata lain, jarak Chebyshev antara ubin adalah 1.
- dengan kata lain, jika suatu titik
p
berbatasan dengan suatu titikq
, maka setiap koordinat dalamp
koordinat yang sesuaiq
berbeda darinya dengan tidak lebih dari satu. Selain itu, setidaknya pada pasangan koordinat berbeda dengan tepat satu.
Garis:
- Garis ditentukan oleh vektor dan ubin. Garis adalah setiap ubin yang terkena persamaan:
p0 + t
<
some vector with the same number of coordinates as p0>
Kondisi Simulasi dan Menang:
Nyatakan jawaban Anda jika siap untuk dinilai. Artinya, jelas menunjukkan apakah jawaban Anda sudah selesai atau belum.
Jika jawaban Anda ditandai sudah selesai, ia tidak akan dinilai setidaknya 24 jam setelah pengeditan terakhir pada kode.
Program harus bekerja offline. Jika suatu program terbukti curang, maka secara otomatis akan menerima skor
-1
, dan tidak akan dinilai lebih lanjut. (Bagaimana orang akan berakhir dengan program mereka curang?)Jika program Anda menghasilkan output yang tidak valid, itu langsung dihitung sebagai kerugian untuk game
Jika program Anda gagal menghasilkan output setelah 1 menit, itu langsung dihitung sebagai kerugian untuk permainan. Jika perlu, optimalkan kecepatannya. Saya tidak mau harus menunggu satu jam untuk menguji program dari yang lain.
Setiap program akan dijalankan terhadap program lain dua kali untuk masing-masing
n
dalam jangkauan[3,6]
dan masing-masingd
dalam jangkauan[2,5]
, sekali sebagaiX
dan sekali sebagaiO
. Ini satu putaran.Untuk setiap permainan, sebuah program menang, ia
+3
mencapai skornya. Jika program diikat (1 menang dan 1 kalah dalam satu putaran atau seri untuk kedua game), maka itu didapat+1
. Jika program hilang, maka ia mendapat+0
(yaitu tidak ada perubahan).Program dengan skor tertinggi menang. Jika ada seri, maka program dengan jumlah game yang kalah paling sedikit (dari kontestan yang diikat) menang.
Catatan: Bergantung pada jumlah jawaban, saya mungkin perlu bantuan menjalankan tes.
Semoga berhasil! Dan semoga simulasi berjalan sesuai keinginan Anda!
sumber
Jawaban:
Python 3
Ini hanyalah ai acak. Ini secara acak memilih langkah keluar dari langkah yang masih tersedia.
sumber
Python 2.7
Ini adalah karya dalam proses yang saya berikan untuk memberikan kerangka / inspirasi kepada penjawab lain. Ini bekerja dengan mendaftar setiap kemungkinan garis kemenangan, kemudian menerapkan beberapa heuristik untuk mencetak garis itu sesuai dengan betapa berharganya itu. Saat ini, heuristik kosong (pekerjaan super rahasia). Saya juga menambahkan penanganan kesalahan menang dan bentrok.
Catatan tentang masalahnya
Ada berapa garis kemenangan? Pertimbangkan kasus 1 dimensi; ada 2 simpul, 1 tepi, dan 1 garis. Dalam 2 dimensi, kami memiliki 4 simpul yang bergabung dengan 2 garis, dan 4 ujung yang bergabung dengan 2 * n garis. Dalam 3 dimensi, kami memiliki 8 simpul bergabung dengan 4 garis, 12 tepi bergabung dengan 6 * n garis, dan 6 wajah bergabung dengan
3*n^2
garis.Secara umum, mari kita sebut simpul 0-segi, tepi 1-segi, dll. Lalu mari
N(i)
menyatakan jumlah i-segi,d
jumlah dimensi, dann
panjang sisi. Maka jumlah baris yang menang adalah0.5*sum(N(i)*n^i,i=0..d-1)
.Per wikipedia,
N(i)=2^(d-i)*d!/(i!*(n-1)!)
jadi rumus terakhirnya adalah:sum(2^(d-i-1) n^i d! / (i! * (n-i)!),i=0..d-1)
yang wolfram | alpha tidak terlalu suka. Ini menjadi sangat besar dengan sangat cepat, jadi saya tidak berharap program saya memiliki runtime yang dapat dikelola untuk d> 8.
Beberapa hasil (maaf tentang pemformatan:
I / O
Saat ini, input perlu dimasukkan sebagai:
tictactoe.py <ret> n,d <ret> move;move <ret>
- perhatikan beberapa baris dan tidak ada akhir;
.Outputnya seperti
(x_1,x_2,x_3...)
, misalnya:tictactoe.py <ret> 6,5 <ret> <ret>
=>0, 0, 0, 0, 0
tictactoe.py <ret> 6,5 <ret> 0,0,0,0,0;0,0,0,0,5 <ret>
=>0, 0, 0, 5, 0
Sunting: untuk I / O, tambahkan logika. Saya percaya ini sekarang siap untuk ditandai
Perhatikan bahwa komentar ini awalnya adalah placeholder yang saya hapus dan batalkan penghapusan.
sumber
Python 2
Sebagian besar kode persis sama dengan AI acak Quincunx . Alih-alih memilih langkah secara acak, ia memilih langkah yang tersedia pertama secara leksikografis (yaitu (0,0, ... 0), lalu (0,0, ... 1), lalu (0,0, ... 2) , dll.).
Ini adalah strategi sampah yang cukup, tetapi hampir selalu mengalahkan secara acak.
sumber