Buat program terpendek untuk memeriksa yang telah memenangkan dalam sebuah n d tic tac toe game.
Program Anda harus bekerja ketika n
(lebar) dan d
(nomor dimensi) berada dalam rentang ini:
n∈[3,6]∩ℕ ie a number from this list: 3,4,5,6
d∈[2,5]∩ℕ ie a number from this list: 2,3,4,5
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.
Menang (Jika Anda telah memainkan cukup banyak tac toe tic multi-dimensi, ini 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>
Memasukkan :
Masukan akan ke STDIN. Baris input pertama adalah dua angka, n
dand
dalam bentuk n,d
.
Setelah ini akan menjadi garis yang terdiri dari koordinat yang menentukan gerakan 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, ....
Input akan diikuti oleh baris baru.
Keluaran :
Output akan ke STDOUT. Cukup tunjukkan siapa yang menang jika seseorang menang, atau apakah itu seri. Jika ini bukan seri atau kemenangan, jangan hasilkan apa pun.
Selain itu, tunjukkan jika ada bentrokan gerakan, yaitu, jika ada setidaknya dua gerakan di lokasi yang sama.
Jika ada win / draw sebelum input berakhir, program Anda dapat melakukan apa pun yang diinginkan.
Test case (ada yang mau menyarankan lagi?):
Memasukkan:
4,3
0,0,0;1,1,1;1,0,1;2,0,2;0,0,1;2,0,0;2,0,1;3,0,2;3,0,1
Contoh Output:
X wins
Output lain yang mungkin (memerlukan penjelasan):
1
sumber
n
langkah untuk menjadi pemenang. (Maaf karena tidak memposting komentar ini di kotak pasir tetapi saya bahkan tidak punya waktu untuk melihatnya di sana karena itu diposting begitu cepat setelah sandboxing.)Jawaban:
Python,
745578 KarakterSaya membuat beberapa perubahan dan sedikit menyusut. Perhatikan bahwa kembalinya True berarti x telah menang, Salah berarti y menang, dan, berarti bahwa langkah yang tidak valid telah dibuat.
sumber
import *
keimport*
. Gunakan1
untuk Benar, dan0
untuk Salah (hapusT
danF
).return -1
bisareturn-1
(lihat menghapus spasi). Ubah nama metode Anda menjadi metode char tunggal. Lihatlah kiat untuk optimisasi lebih lanjut.if l<>q:
bukanif not l==q:
.Bukan jawaban - Jawa
Saya ingin tahu berapa banyak cara yang berbeda untuk menang untuk suatu n, d jadi saya menulis kode ini untuk mendaftar semuanya.
Saya mengujinya secara langsung pada n, d = 2..3,2..3 dan tampaknya berfungsi ... setelah itu jumlah cara yang mungkin untuk menang tumbuh dengan cepat seperti yang ditunjukkan di bawah ini:
Setelah menghasilkan semua set kemenangan, saya dapat memperluas program untuk memeriksa input yang diberikan terhadap set kemenangan, tetapi, tentu saja, metode itu tidak akan pernah memenangkan golf. Jadi saya puas untuk berhenti di sini - kecuali sepertinya saya bisa menemukan solusi bentuk tertutup untuk jumlah cara untuk menang sebagai fungsi dari n dan d ... Ini adalah Jumlah cara untuk menang = 0,5 ((n + 2) ^ d - n ^ d).
sumber
C ++ 794
849karakterOutputnya adalah: "X" (X menang), "O" (O menang), atau "!" (upaya langkah ilegal).
Ini hanya memetakan titik-titik ke dalam array linier dan memeriksa semua himpunan bagian yang mungkin dari ukuran n, pertama untuk menjadi konstan pada X atau O, dan kemudian untuk berada dalam garis. Untuk memeriksa apakah ada dalam suatu garis, koordinat titik-titik dalam setiap subset diperiksa satu per satu; masing-masing harus meningkat dari 0 ke n-1, menurun dari n-1 ke 0, atau konstan. Poin secara alami dipesan dalam array linier, jadi masuk akal untuk memanggil koordinat yang bertambah atau berkurang untuk set poin yang diberikan.
Terima kasih kepada Howard karena telah menunjukkan kesalahan serius pada versi pertama.
Dalam solidaritas dengan Quincunx, saya harus menunjukkan bahwa itu akan menjadi parodi jika jawaban C ++ menang
sumber
X wins
atauO wins
. Sangat sah untuk menghasilkan1
atau2
(atau variasi lainnya) selama Anda menjelaskan dalam jawaban Anda apa yang mereka perjuangkan. Seperti yang saya katakan (penekanan ditambahkan): " menunjukkan siapa yang menang".