Program diputar putih.
Contoh stdin:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … … … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Contoh stdout:
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … ♙ … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ … ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h
Setiap langkah yang sah tidak masalah. "En passant" dan castling diabaikan. Tidak masalah untuk menampilkan pesan kesalahan atau mencetak apa pun jika tidak ada langkah yang valid.
Jawaban dengan suara terbanyak menang.
popularity-contest
chess
Hristo Hristov
sumber
sumber
Jawaban:
Saya tidak mengeluh tentang upvotes, tetapi untuk bersikap adil ... solusi saya di sini sebenarnya tidak terlalu bagus. Ugoren lebih baik, selain kekurangan dukungan unicode. Pastikan untuk melihat semua jawaban sebelum memberikan suara, jika Anda baru saja menemukan pertanyaan ini!
Bagaimanapun.
Haskell, 893
888904952(tanpa castling)862 (tanpa pion gerakan ganda)(Anda tidak menentukan apakah ini seharusnya kode golf, tetapi menurut saya memang seharusnya demikian)
Ketika Anda telah menginstal GHC (misalnya sebagai bagian dari platform Haskell ), Anda dapat melakukannya dengan adil
sumber
C,
734672640 karakterKarakter dihitung tanpa spasi kosong yang bisa dilepas.
Format file yang saya gunakan tidak seperti yang diminta, tetapi ASCII yang disederhanakan.
Saya perlu menambahkan dukungan karakter Unicode, akan dikenakan biaya beberapa karakter.
Format file input / output:
Harus persis 8 baris dengan tepat 8 karakter.
pnbrqk
digunakan untuk potongan putih,PNBRQK
untuk potongan hitam, ruang untuk ruang:Logikanya cukup sederhana:
Untuk setiap gerakan yang mungkin dari setiap bagian putih, coba setiap gerakan yang mungkin dari setiap bagian hitam.
Jika tidak ada gerakan hitam yang menangkap raja putih, gerakan putih itu valid.
Papan dipertahankan sebagai
char[256]
, diperlakukan sebagai matriks 16x16, di mana hanya 8x8 kiri atas yang digunakan. Posisi dan vektor pergerakan disimpan dalam bilangan bulat 8-bit (x:4,y:4
). Bit tambahan memungkinkan menggunakan aritmatika sederhana (new_pos = old_pos + steps*direction
), dengan deteksi mudah tepi papan (&0x88
melakukan keajaiban).r[]
mengkodekan tiga hal:'('+vector
.Fungsi:
main
membaca papan, mengonversi surat ke kode internal, panggilana
untuk menemukan gerakan putih, mencetak papan.a
loop rekursif atas 64 kotak. Untuk setiap bagian dari warna yang tepat (parameterc
), ia menemukan aturan gerakan untuk bagian dan panggiland
.d
berulang secara berulang atas aturan gerakan yang disandikan, yang merupakan daftar vektor, menyerukane
masing-masing. Ini memberikane
posisi asli, vektor dan batas jangkauan (7 untuk potongan di atas B, 2 untuk pion peringkat kedua, 1 jika tidak).e
menguji semua gerakan sepanjang vektor. Jika langkah dimungkinkan (mis. Pion bergerak maju, di dalam papan, tidak diblokir, menangkap pion secara diagonal), periksa salah satu dari dua hal. Untuk gerakan putih, jalankanv
untuk memvalidasi gerakan. Untuk gerakan hitam, periksa apakah raja putih ditangkap. Jika benar, gerakan dimainkan di papan tulis.v
memvalidasi langkah putih. Ini menyalin papan samping, mengeksekusi gerakan untuk menguji, dan memanggila
lagi, untuk mencari gerakan hitam.sumber
Python 2.6,
886- 1425 karakterVersi awal saya (dalam revisi) datang pada 886 karakter tetapi tidak memenuhi spesifikasi sepenuhnya (itu tidak memeriksa untuk menghindari skakmat; bahkan tidak mempertimbangkan kemungkinan gerakan potongan hitam).
Sekarang ya (dan saya sudah memperbaiki beberapa bug di aslinya). Sayangnya ini datang dengan biaya karakter: 1425 untuk saat ini, tetapi masih ada sedikit ruang untuk perbaikan. Versi ini harus lebih solid dalam menangani kasus tepi daripada yang sebelumnya.
Contoh input dan output:
sumber