Chomp adalah gim dua pemain dengan pengaturan empat persegi panjang. Setiap pemain secara bergiliran mengeluarkan bagian apa pun, beserta semua bagian di atasnya dan ke kanan. Siapa pun yang mengambil bagian kiri bawah akan kalah. Dapat dibuktikan dengan cukup mudah bahwa pemain pertama selalu memiliki langkah kemenangan (kecuali dengan persegi panjang 1-oleh-1); Temukan.
- Input adalah dimensi persegi panjang (dua angka)
- Output adalah lokasi gerakan pemenang (dua angka)
- Jika ada lebih dari satu gerakan yang menang, maka Anda dapat menampilkannya.
Ini adalah kode golf; kode terpendek (bahasa apa saja) menang.
Contohnya
Catatan: Outputnya hanya dua angka; seni ASCII di bawah ini hanya untuk menunjukkan apa arti angka-angka itu.
Input: 5 3 (indeks berbasis 1 dimulai dari sudut kiri bawah)
Output: 4 3
XXX--
XXXXX
XXXXX
Input: 4 4
Output: 2 2
X---
X---
X---
XXXX
Bonus
Kurangi 15 karakter dari skor Anda jika Anda menghasilkan semua gerakan yang menang. Setiap pasangan angka harus dipisahkan oleh baris baru.
Jawaban:
GolfScript, 82 (
10897 karakter - 15 bonus)Karena saya tidak tahu heuristik apa pun, solusi ini melakukan pencarian lengkap untuk ruang solusi. Anda dapat mencoba kode online . Meskipun implementasinya sangat efisien, ruang pencarian tumbuh sangat cepat dengan input yang meningkat.
Contoh:
Seperti disebutkan di atas, implementasi tidak bergantung pada rekursi tetapi mengunjungi setiap node ruang pencarian hanya sekali. Di bawah ini Anda dapat menemukan versi kode beranotasi yang menjelaskan blok bangunan secara lebih rinci.
Representasi satu papan ukuran w * h diberikan oleh daftar nomor w dalam kisaran 0 hingga h . Setiap angka memberikan jumlah potongan di kolom yang sesuai. Dengan demikian, konfigurasi yang valid adalah daftar di mana angkanya tidak meningkat dari awal hingga akhir (dengan gerakan apa pun Anda memastikan bahwa semua kolom di sebelah kanan paling tinggi setinggi yang dipilih).
sumber
Python
23, 141-15 = 126Pencarian minimax dengan paksa. Untuk setiap gerakan yang mungkin, kami secara rekursif melihat apakah lawan bisa menang setelah kami melakukan gerakan itu. Golfnya cukup lemah; orang lain harus bisa berbuat lebih baik. Ini terasa seperti pekerjaan untuk APL.
win
adalah antarmuka publik. Dibutuhkan dimensi papan, mengubahnya menjadi representasi papan, dan meneruskannya kew
.w
adalah algoritma minimax. Dibutuhkan status papan, mencoba semua gerakan, membuat daftar yang unsur-unsurnya terkait dengan gerakan menang, dan mengembalikan True jika daftar kosong. Dengan defaultf=print
, membangun daftar memiliki efek samping untuk mencetak gerakan yang menang. Nama fungsi yang digunakan lebih masuk akal ketika mengembalikan daftar langkah yang menang, tapi kemudian saya memindahkannot
di depan daftar untuk menghemat tempat.for r,p in enumerate(b)for c in xrange(p) if(r+c)
: Ulangi semua kemungkinan gerakan.1 1
diperlakukan sebagai bukan langkah hukum, menyederhanakan kasus dasar sedikit.b[:r]+[min(i,c)for i in b[r:]]
: Bangun status dewan setelah langkah diwakili oleh koordinatr
danc
.w(b[:r]+[min(i,c)for i in b[r:]],max)
: Kambuh untuk melihat apakah negara baru adalah negara yang kalah.max
adalah fungsi terpendek yang bisa saya temukan yang akan mengambil dua argumen integer dan tidak mengeluh.f(r+1,c+1)
: Jikaf
dicetak, cetak langkahnya. Apa punf
itu, ia menghasilkan nilai untuk mengisi daftar panjang.not [...]
:not
pengembalianTrue
untuk daftar kosong danFalse
untuk kosong.Kode Python 2 asli, sepenuhnya ungolfed, termasuk memoisasi untuk menangani input yang jauh lebih besar:
Demo:
sumber
13x13
mengambil2x2
dan Anda akan menang.Perl 6:
113108 karakter - 15 = 93 poinYang ini tangguh! Inilah versi yang tidak di-cache, yang secara teknis benar tetapi akan memakan waktu yang sangat lama untuk input yang tidak sepele.
Ini berfungsi seperti implementasi Python @ user2357112 (upvote dia, saya tidak bisa menemukan ini tanpa / karyanya!) Kecuali bahwa win () mengambil papan Chomp (array) bukannya lebar dan panjang. Dapat digunakan seperti:
Versi dengan memoisasi, yang sebenarnya dapat menangani input yang layak (meskipun tidak dioptimalkan untuk dibaca):
sumber