Ini adalah akhir dari permainan catur yang dimainkan dengan baik. Anda adalah pemain kulit putih, dan Anda masih memiliki benteng dan rajamu. Lawanmu hanya memiliki rajanya.
Karena Anda berkulit putih, giliran Anda. Buat program untuk memainkan pertandingan catur ini. Outputnya dapat berupa urutan gerakan, animasi gif, seni ASCII atau apa pun yang Anda suka.
Tampaknya cukup jelas, tetapi saya akan menyatakannya secara eksplisit: Anda harus memenangkan permainan (dalam jumlah gerakan terbatas). Selalu mungkin untuk menang dari posisi ini. JANGAN KEHILANGAN BAHWA ROOK. JANGAN MENCERMATAKAN.
Program Anda mungkin atau mungkin tidak menerima input manusia untuk posisi awal dan untuk setiap gerakan hitam (Anda dapat dengan aman menganggap ini adalah posisi hukum, yaitu para raja tidak saling bersentuhan). Jika tidak, posisi awal acak dan gerakan acak untuk raja hitam akan cukup.
Skor
Skor Anda akan panjang dalam byte kode + bonus Anda. Bahasa apa pun diizinkan, skor terendah akan menang.
Bonus
-50 jika program Anda memungkinkan posisi awal yang ditentukan manusia dan yang acak. Manusia dapat memasukkannya melalui stdin, file, GUI ...
-100 jika program Anda memungkinkan manusia dan pemain acak untuk memindahkan raja hitam
+12345 jika Anda mengandalkan pemecah catur eksternal atau perpustakaan catur bawaan
Semoga berhasil!
Memperbarui!
Aturan tambahan: Pertandingan harus dimainkan sampai skakmat. Hitam tidak mengundurkan diri, tidak melompat keluar dari papan catur dan tidak diculik oleh alien.
Petunjuk
Anda mungkin bisa mendapatkan bantuan dari pertanyaan ini di chess.se .
Jawaban:
Haskell 1463-100 = 1363
Hanya mendapatkan jawaban. Ini menemukan solusi cara retrograde, bekerja kembali dari sekakmat ke posisi kita. Ini berbeda dari deskripsi analisis retrograde pada pemrograman catur - bukannya memulai dengan set awal dan memperluasnya dengan gerakan mundur sampai tidak ada kotak yang dipindahkan ke belum terlihat, itu dimulai dengan semua kotak yang tidak digunakan dan mengurangi set itu dengan mencoba bergerak maju. Ini akan menjadi kurang efisien waktu daripada cara tradisional, tetapi penggunaan memori meledak bagi saya ketika saya mencobanya.
Kompilasi dengan
ghc -O2
untuk kinerja yang dapat diterima untuk perhitungan tabel endgame; bermain instan setelah langkah pertama. Pasokan raja putih, benteng, kotak raja hitam sebagai argumen. Untuk suatu langkah, ia hanya ingin sebuah kotak, dan akan memilih satu untuk Anda jika Anda menekan kembali. Sesi contoh:Kode:
Diedit: Memperbaiki kode untuk mengingat tabel endgame dan menggunakan argumen, sehingga tidak terlalu menyakitkan untuk diuji berulang kali.
sumber
y
). Ini sangat jelas karena langkah kedua tidak cepat ketika kita sudah mempertimbangkan keseluruhan endgame. Saya pergi ke pub malam ini tetapi jika saya mendapat kesempatan besok saya akan membuat ini kurang mengerikan.C, Saat ini 2552 karakter non-spasi bukan komentar
Hitungan menunjukkan kepada saya bahwa saya bisa golf di bawah total 2552 karakter, tetapi mengingat sudah ada jawaban yang lebih kecil (yang akan sulit dikalahkan) Saya akan mempertimbangkan itu dengan hati-hati sebelum repot-repot melakukannya. Memang benar ada sekitar 200 karakter untuk menampilkan papan dan 200 lainnya masing-masing untuk memeriksa input pengguna dari posisi awal dan bergerak (yang saya butuhkan untuk pengujian, tetapi bisa menghilangkan.)
Tidak ada pohon permainan di sini, hanya algoritma hardcoded, sehingga bergerak secara instan.
Posisi awal dimasukkan sebagai baris (1-8) kolom (1-8) bernomor dari kanan atas dan program bekerja pada skema yang sama. Jadi, jika Anda memutar layar 90 derajat berlawanan arah jarum jam, itu akan mengikuti notasi numerik Catur Korespondensi standar. Posisi di mana raja hitam sudah di cek ditolak sebagai ilegal.
Bergerak hitam dimasukkan sebagai angka dari 0 hingga 7, dengan 0 sebagai pindah ke utara, 1 ke timur laut dan seterusnya dalam arti searah jarum jam.
Itu tidak mengikuti algoritma yang dikenal umum yang secara eksklusif menggunakan benteng di bawah perlindungan raja putih untuk membatasi raja hitam. Benteng hanya membatasi raja hitam dalam arti vertikal (dan akan lari secara horizontal jika dikejar.) Raja putih membatasi raja hitam dalam gerakan horizontal. Ini berarti dua keping putih tidak saling menghalangi.
Saya sepertinya telah mengatasi sebagian besar bug dan kemungkinan loop tak terbatas, sekarang berjalan cukup baik. Saya akan bermain dengannya lagi besok dan melihat apakah ada hal lain yang perlu diperbaiki.
Inilah hasil akhir yang khas (pasangan terkadang dapat terjadi di mana saja di tepi kanan atau kiri papan.)
sumber
Bash, 18 (atau -32?)
Oke, ini jawaban yang lucu. Karena Black adalah pemain catur yang baik, dan Black tahu bahwa White juga pemain catur yang baik, ia memutuskan bahwa satu-satunya hal yang masuk akal untuk dilakukan adalah:
Ini menghasilkan kemenangan putih, yang memenuhi spesifikasi.
Secara teknis Anda dapat memasukkan posisi saat ini sebagai argumen juga, program hanya mengabaikannya, jadi bisa dibilang ini dapat memenuhi syarat untuk bonus -50.
sumber
1-0
yang sedikit lebih pendek.