Nama alternatif: ChessMoveQ
Diberikan daftar hingga 32 elemen, masing-masing terdiri dari 4 elemen, dan daftar kedua dengan 4 elemen, menentukan apakah langkah yang terperinci dalam input kedua adalah langkah catur yang valid.
Daftar pertama menunjukkan posisi semua 32 buah di papan tulis. Setiap elemen akan mengikuti struktur <colour>, <piece-name>, <x-coord>, <y-coord>
, seperti ["W", "K", 5, 1]
, yang menunjukkan bahwa raja putih aktif 5, 1
( e1
di papan catur normal). Semua elemen input pertama akan unik. <x-coord>
dan <y-coord>
akan selalu antara 1 dan 8. Salah satu contohnya adalah:
[["B", "K", 3, 8], ["B", "Q", 1, 5], ["B", "N", 4, 7], ["B", "N", 7, 8],
["B", "B", 2, 4], ["B", "R", 4, 8], ["B", "R", 8, 8], ["B", "P", 1, 7],
["B", "P", 2, 7], ["B", "P", 3, 6], ["B", "P", 5, 6], ["B", "P", 6, 7],
["B", "P", 7, 7], ["B", "P", 8, 7], ["W", "K", 5, 1], ["W", "Q", 6, 3],
["W", "N", 3, 3], ["W", "B", 5, 2], ["W", "B", 6, 4], ["W", "R", 1, 1],
["W", "R", 8, 1], ["W", "P", 1, 3], ["W", "P", 2, 2], ["W", "P", 3, 2],
["W", "P", 4, 4], ["W", "P", 6, 2], ["W", "P", 7, 2], ["W", "P", 8, 3]]
yang akan mewakili dewan:
Input kedua akan terdiri dari struktur yang sama dengan sublists dari yang pertama, tetapi alih-alih koordinat x dan y yang menunjukkan di mana potongan itu, mereka menunjukkan di mana ia mencoba untuk pindah.
Untuk contoh di atas, langkah yang valid bisa saja ["W", "B", 4, 3]
(uskup bergerak satu kotak ke depan dan ke kiri), dan langkah yang tidak valid bisa jadi ["B", "R", 4, 1]
karena benteng harus bergerak melalui ksatria, dan pion untuk sampai ke alun-alun. Karena gerakan dapat merujuk ke beberapa bagian sekaligus, Anda harus menguji apakah setiap bagian yang ditentukan dapat bergerak, bukan hanya salah satunya. Misalnya, contoh pertama hanya berlaku untuk satu uskup, tetapi itu masih merupakan langkah yang sah. Namun, tidak ada benteng hitam yang dapat melakukan langkah kedua, sehingga tidak valid.
Tugas Anda adalah menentukan apakah langkah yang diperinci dalam input kedua adalah langkah catur yang valid. Validitas aturan bervariasi, tergantung pada bagian yang mencoba untuk dipindahkan (klik pada nama bagian untuk diagram dari langkah yang valid):
- Potongan apa pun : Tidak ada potongan yang dapat bergerak ke kotak yang sudah ditempati, atau dari papan, kecuali kotak itu ditempati oleh sepotong dari warna lain. Sebagai contoh, sepotong putih dapat pindah ke kotak yang ditempati oleh sepotong hitam, tetapi bukan sepotong putih. Selain itu, tidak ada bagian, kecuali untuk Ksatria, dapat pindah ke kotak yang langsung terhalang oleh bagian lain.
- Sebuah langkah demi sepotong B ke titik C adalah "langsung terhalang" oleh sepotong A jika A secara langsung, dalam lurus (orthogonal atau diagonal) line, antara B dan C .
- Potongan apa pun : Posisi raja juga dapat memengaruhi validitas gerakan sepotong itu. Jika salah satu dari kedua kondisi ini terpenuhi, langkah tersebut tidak valid:
- Mengekspos raja untuk memeriksa, dengan memindahkan sepotong di sisi yang sama dengan raja yang terancam punah. Ini hanya berlaku jika bagian yang tidak menentang membuat langkah, bukannya bagian yang berlawanan bergerak untuk menempatkan raja.
- Meninggalkan raja di cek, dalam hal ini ia harus keluar dari cek. Oleh karena itu, jika raja berada dalam kendali dan langkah tersebut menentukan bahwa bagian lain bergerak, itu adalah langkah yang tidak sah, kecuali bagian lainnya mencegah pemeriksaan. Sepotong dapat mencegah cek dalam salah satu dari dua cara: baik mengambil potongan melakukan pemeriksaan, atau menghalangi jalan antara potongan yang melakukan pemeriksaan dan raja.
- "Cek" adalah situasi di mana lawan raja bisa (jika giliran mereka bergerak) secara legal memindahkan sepotong ke raja itu. Aturan ini tidak berlaku secara rekursif, yaitu seorang raja di cek bahkan jika gerakan oleh lawan ke raja itu akan meninggalkan raja mereka sendiri di cek.
- Bidak : Gadai dapat bergerak maju (yaitu ke atas jika putih, ke bawah jika hitam) satu kotak ke kotak kosong. Ada juga tiga situasi khusus:
- Jika pion belum bergerak (Anda dapat menentukan ini menggunakan koordinat Y; pion putih belum bergerak jika koordinat Y-nya 2, pion hitam belum bergerak jika koordinat Y-nya adalah 7), pion diizinkan untuk memindahkan dua kotak ke depan ke kotak kosong.
- Jika ada bagian lawan secara diagonal di depan bidak (yaitu di alun-alun di barat laut atau timur laut bidak jika putih, atau ke barat daya atau tenggara jika hitam), gadai diizinkan untuk pindah ke alun-alun yang diduduki tersebut.
- Jika pion bergerak ke koordinat Y akhir (8 untuk putih, atau 1 untuk hitam) dalam aturan catur normal, ia harus dipromosikan menjadi ratu, benteng, ksatria, atau uskup dengan warna yang sama. Untuk keperluan pertanyaan ini, pilihan promosi tidak relevan dengan apakah langkah tersebut valid atau tidak (dan tidak dapat dinyatakan dalam format input), tetapi langkah gadai yang akan menghasilkan promosi harus diizinkan.
- Uskup : Uskup dapat bergerak antara 1 dan 8 kotak di sepanjang jalur interardinal (yaitu diagonal) yang tidak terhalang.
- Ksatria : Ksatria dapat bergerak dalam suatu
L
bentuk, yang terdiri dari salah satu dari langkah-langkah (setara) berikut ini:- Satu kotak di setiap arah mata angin, diikuti dengan putaran 90/270 °, diikuti oleh gerakan terakhir 2 kotak ke depan.
- 2 kotak di setiap arah mata angin, diikuti oleh putaran 90/270 °, diikuti oleh langkah terakhir dari satu kotak ke depan.
- Benteng : Benteng dapat bergerak antara 1 dan 8 kotak di sepanjang jalur kardinal yang tidak terhalang terus menerus.
- Queens : Queens dapat bergerak antara 1 dan 8 kotak sepanjang jalur kardinal atau interardinal (yaitu diagonal) yang tidak terhalang.
- Raja : Raja bergerak seperti ratu, kecuali bahwa mereka terbatas pada hanya memindahkan satu kotak per gerakan (yaitu seorang raja hanya dapat pindah ke kotak yang berdekatan secara kardinal atau diagonal). Sebagai pengingat, Anda tidak bisa bergerak yang membuat raja Anda terkendali; dengan demikian Anda juga tidak bisa memindahkan raja Anda.
Aturan catur juga mengandung gerakan khusus yang disebut "castling" dan "en passant". Namun, karena legalitas gerakan ini bergantung pada sejarah permainan, bukan hanya posisi saat ini (dan karena castling membutuhkan dua potong gerakan sekaligus, yang tidak sesuai dengan format input), Anda harus mempertimbangkan kedua gerakan ini untuk ada (yaitu suatu langkah yang akan dilakukan castling atau en passant harus dianggap ilegal).
Anda dapat menampilkan dua hasil berbeda untuk menunjukkan validitas suatu langkah, dan Anda dapat mengambil input dalam metode yang Anda inginkan. Anda juga dapat memilih pengindeksan 0 daripada pengindeksan 1 untuk posisi jika Anda inginkan. Ini adalah kode-golf , sehingga kode terpendek menang!
Uji kasus
Board
Move => Output (Reason)
[["B", "K", 3, 8], ["B", "Q", 1, 5], ["B", "N", 4, 7], ["B", "N", 7, 8], ["B", "B", 2, 4], ["B", "R", 4, 8], ["B", "R", 8, 8], ["B", "P", 1, 7], ["B", "P", 2, 7], ["B", "P", 3, 6], ["B", "P", 5, 6], ["B", "P", 6, 7], ["B", "P", 7, 7], ["B", "P", 8, 7], ["W", "K", 5, 1], ["W", "Q", 6, 3], ["W", "N", 3, 3], ["W", "B", 5, 2], ["W", "B", 6, 4], ["W", "R", 1, 1], ["W", "R", 8, 1], ["W", "P", 1, 3], ["W", "P", 2, 2], ["W", "P", 3, 2], ["W", "P", 4, 4], ["W", "P", 6, 2], ["W", "P", 7, 2], ["W", "P", 8, 3]]
["W", "R", 8, 2] => True (The rook on h1 can move forward one)
[['B', 'K', 6, 8], ['B', 'Q', 1, 7], ['B', 'N', 1, 3], ['B', 'N', 7, 1], ['B', 'B', 8, 8], ['B', 'B', 2, 5], ['B', 'R', 4, 3], ['B', 'R', 1, 5], ['B', 'P', 5, 5], ['B', 'P', 7, 2], ['B', 'P', 5, 7], ['B', 'P', 5, 6], ['B', 'P', 4, 4], ['W', 'K', 7, 3], ['W', 'Q', 3, 2], ['W', 'N', 4, 8], ['W', 'N', 7, 5], ['W', 'B', 1, 1], ['W', 'B', 8, 1], ['W', 'R', 1, 8], ['W', 'R', 3, 7], ['W', 'P', 8, 2], ['W', 'P', 6, 3], ['W', 'P', 4, 2], ['W', 'P', 1, 4], ['W', 'P', 8, 7]]
['W', 'N', 1, 5] => False (Neither knight to move to a5 from where they are)
[['B', 'K', 7, 3], ['B', 'Q', 2, 4], ['B', 'N', 5, 2], ['B', 'N', 1, 6], ['B', 'B', 7, 7], ['B', 'B', 1, 8], ['W', 'K', 7, 1], ['W', 'Q', 6, 1], ['W', 'N', 5, 6], ['W', 'N', 3, 3], ['W', 'B', 2, 2], ['W', 'B', 6, 5]]
['B', 'K', 8, 3] => False (The white bishop would put the king in check)
[['B', 'K', 7, 6], ['B', 'Q', 8, 3], ['B', 'N', 7, 7], ['B', 'N', 8, 7], ['B', 'B', 2, 2], ['B', 'B', 3, 8], ['B', 'R', 1, 1], ['B', 'R', 1, 6], ['B', 'P', 8, 5], ['B', 'P', 4, 3], ['B', 'P', 8, 6], ['W', 'K', 7, 8], ['W', 'Q', 7, 2], ['W', 'N', 5, 1], ['W', 'N', 4, 6], ['W', 'B', 1, 2], ['W', 'B', 2, 6], ['W', 'R', 4, 4], ['W', 'R', 3, 6], ['W', 'P', 5, 2], ['W', 'P', 6, 2]]
['B', 'N', 5, 8] => False (The white queen currently has the king in check, and this move doesn't prevent that)
[['B', 'K', 7, 6], ['B', 'Q', 8, 3], ['B', 'N', 7, 7], ['B', 'N', 8, 7], ['B', 'B', 2, 2], ['B', 'B', 3, 8], ['B', 'R', 1, 1], ['B', 'R', 1, 6], ['B', 'P', 8, 5], ['B', 'P', 4, 3], ['B', 'P', 8, 6], ['W', 'K', 7, 8], ['W', 'Q', 7, 2], ['W', 'N', 5, 1], ['W', 'N', 4, 6], ['W', 'B', 1, 2], ['W', 'B', 2, 6], ['W', 'R', 4, 4], ['W', 'R', 3, 6], ['W', 'P', 5, 2], ['W', 'P', 6, 2]]
['B', 'N', 7, 5] => True (The king is in check, and the knight blocks that)
[['B', 'K', 8, 3], ['B', 'Q', 6, 5], ['B', 'N', 7, 8], ['B', 'N', 3, 7], ['B', 'B', 4, 1], ['B', 'B', 1, 1], ['W', 'K', 7, 7], ['W', 'Q', 7, 1], ['W', 'N', 2, 2], ['W', 'N', 1, 3], ['W', 'B', 3, 5]]
['B', 'B', 2, 2] => True (takes the white knight)
[['B', 'K', 6, 1], ['B', 'Q', 6, 2], ['W', 'K', 8, 1]]
['B', 'Q', 7, 1] => True (Smallest checkmate possible, in terms of bounding box)
Tantangan ini dikosongkan . Itu menerima downvotes, tanpa penjelasan apa pun, jadi saya memutuskan untuk tetap mempostingnya
sumber
Jawaban:
Python 2 (dengan python-catur ),
141 138 134 133132 byteTanpa melakukan salah satu kode yang benar-benar menarik - tapi mungkin ini bisa bersaing dengan bahasa golf atau (berani saya sebutkan itu) Mathematica?
Catatan: python-catur adalah PyPI paket menginstalnya pada Python 2.7.9+ dengan:
python -m pip install python-chess
)Input tiga program yang menerima input penuh:
PRNBQK
)a1
adalah0
,b1
adalah1
, ...a2
adalah8
...,h8
adalah63
,Program mengeluarkan melalui kode keluarnya yang diberikan input yang valid:
1
jika langkah itu valid (program menimbulkan kesalahan - karena pembagian dengan nol);0
bukan (program keluar secara normal)(Jangan) Coba online! (karena paket python-catur tidak diinstal di sana dan TIO tidak mengizinkan konektivitas internet sehingga kode pip-instal di header tidak akan berfungsi).
Perhatikan bahwa operator listrik di Python membuat
1**1 == 1**0 == 0**0 == 1
tapi0**1 == 0
... maka
1/0**1
menimbulkan pembagian dengan nol kesalahan saat1/1**1
,1/1**0
dan1/0**0
semuanya sukses(... dan bahwa dalam Python
False
danTrue
menyamakan ke0
dan1
masing-masing).sumber
str(S.piece_at(m.from_square))==p for
untukp==str(S.piece_at(m.from_square))for
, yang harus menyimpan satu byte.repr
backticks yang digunakan untuk menggantikanstr
untuk menyelamatkan ...Regex (PCRE2),
931925837 byteSolusi ini berangkat dari pernyataan masalah di mana dua negara bagian diteruskan ke regex, alih-alih satu negara bagian dan satu langkah. Langkah ini disimpulkan dari perbedaan antara dua negara bagian. Jadi saya membuatnya menjadi tugas dari program TIO untuk mengambil kasus uji dalam format yang disediakan oleh pertanyaan ini, menemukan semua contoh potongan yang dijelaskan di papan tulis, dan dengan masing-masing, cobalah memindahkannya ke posisi tujuan dan mengevaluasi regex dengan kemungkinan itu, mencari apakah ada yang dilaporkan oleh regex sebagai valid. Jika ini tidak baik, beri tahu saya; itu mungkin untuk menerapkan regex sebagai posisi + langkah, tetapi akan jauh lebih elegan dan memerlukan refactoring yang serius.
Dewan direpresentasikan dalam 8 × 8 ASCII mana potongan putih huruf besar dan huruf kecil hitam: P awn, k N ight, B Ishop, R ook, Q ueen, K ing. Sisi hitam (peringkat 8) ada di atas dan sisi putih (peringkat 1) ada di bawah. Setiap peringkat dipisahkan oleh baris baru, dan kotak kosong ditandai sebagai
-
. Dua posisi papan dipisahkan oleh baris baru ekstra.Tujuan sebenarnya dari proyek ini adalah untuk memvalidasi seluruh game, bukan hanya gerakan tunggal. Lihat di bawah untuk kondisi perkembangan saat ini.
Cobalah online!
Dicetak cantik, dan sebagian tidak disunat (backref absolut berubah menjadi relatif, dan grup penangkap berubah menjadi non-penangkapan, atau dalam beberapa kasus atom untuk kecepatan):
-88 byte dengan menggunakan panggilan subrutin non-atom, sehingga penargetan ulang dari PCRE1 ke PCRE2
Versi di atas telah dimodifikasi untuk tidak mengizinkan en passant atau castling, tetapi proyek penuh saat ini dalam keadaan di mana ia memvalidasi setiap jenis gerakan, mulai dari keadaan papan awal (yang harus menjadi posisi awal catur standar - Chess960 tidak didukung, namun setidaknya). Aturan penuh en passant dan castling diberlakukan.
Ini adalah contoh game yang divalidasi oleh regex lengkap (PCRE1 - belum ditargetkan ulang) [regex101.com] .
Langkah yang tidak valid akan menghasilkan setiap posisi dewan berikutnya tidak dicocokkan / disorot. Deteksi skakmat / jalan buntu, dan dengan demikian deteksi siapa pemenangnya (atau jika itu seri), belum dilaksanakan; itu sebabnya status dewan final dalam contoh ini tidak disorot.
Berikut ini adalah program C / C ++ yang mengubah notasi aljabar menjadi format yang dikenali oleh regex ini.Notasi aljabar saat ini harus diletakkan dalam bentuk array inline dalam kode sumber, dengan string terpisah untuk setiap gerakan, tetapi membacanya sebagai string tunggal dari stdin atau argumen baris perintah, dengan seluruh urutan gerakan dipisahkan oleh spasi dan nomor langkah dot-dihentikan, direncanakan.
Saya juga mulai dengan regex yang memvalidasi permainan penuh murni dalam notasi catur aljabar, dengan posisi awal standar yang tersirat. Yang dibutuhkan hanyalah "papan gores" kosong yang ditambahkan di akhir input (setelah daftar gerakan). Saya cukup yakin dimungkinkan untuk mengimplementasikan ini secara penuh, dan berencana menyelesaikannya kapan-kapan.
sumber