Atomic catur adalah varian (sangat menyenangkan) dari catur di mana setiap tangkapan menyebabkan "ledakan," menghancurkan bagian yang ditangkap, bagian yang melakukan penangkapan, dan semua non-bidak dalam radius 1-persegi. Tujuan dari tantangan ini bukan untuk memainkan seluruh permainan catur atom, tetapi hanya untuk mensimulasikan apa yang terjadi ketika langkah tertentu dilakukan.
Penafian: Efek suara ledakan tidak termasuk.
Memasukkan
Posisi dewan akan diberikan dalam Forsyth-Edwards Notation (umumnya dikenal sebagai FEN), tetapi hanya dengan bidang pertama. Misalnya, input dari:
rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
mewakili posisi awal:
Ini harus diambil sebagai string atau padanan bahasa Anda. Dijamin valid; misalnya, Anda tidak perlu peduli jika ada sepuluh raja, atau jika tidak ada raja sama sekali.
Anda juga akan diberikan langkah yang akan disimulasikan, yang direpresentasikan sebagai dua nama kuadrat: kuadrat tempat keping yang akan dipindahkan, dan kuadrat tempat pijakan itu dipindahkan. Sebagai contoh, memindahkan pion raja dua spasi ke depan pada gambar di atas akan direpresentasikan sebagai:
e2e4
Ini juga harus diambil sebagai string. Langkah ini akan selalu valid, dan Anda tidak perlu mendukung castling . Anda perlu mendukung en passant , yang akan dijelaskan secara lebih rinci di bagian selanjutnya.
Keluaran
Output dari program Anda harus dalam notasi FEN parsial yang sama dengan input, dengan langkah yang ditentukan dibuat (dan setiap bagian meledak jika perlu).
Aturan pasti untuk ledakan adalah — saat sebuah karya diambil:
Hapus bagian yang sedang ditangkap (ini akan selalu menjadi bagian di kotak kedua yang disebutkan dalam input, kecuali ketika tangkapan adalah orang yang lewat ).
Hapus bagian yang melakukan penangkapan (ini akan selalu menjadi bagian pada kotak pertama yang disebutkan dalam input).
Hapus setiap bagian yang:
terletak di salah satu dari 8 kotak di sekitar kotak di mana penangkapan terjadi (bagi orang yang lewat , ini adalah kotak tempat bidak menangkap akan berada, jika tidak meledak).
bukan bidak.
Gambaran singkat dari en passant aturan, bagi mereka yang tidak terbiasa: jika pion bergerak dua ruang depan dari peringkat nya mulai, dan ada pion yang bisa ditangkap jika hanya bergerak satu persegi ke depan, mungkin menangkap hal itu, tapi hanya pada langkah selanjutnya. Penangkapan ini dikatakan dilakukan " secara sepintas " (atau dalam bahasa Prancis: " en passant ").
Uji kasus
Dalam gambar, panah hijau mewakili gerakan yang akan dibuat, dan lingkaran hijau mewakili potongan yang meledak.
Input: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR
, g1f3
Output:rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R
Input: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P1pP/2rP1P2/R1B3RK
, f2g3
Output: 3kBb1r/pp5p/3p4/4pn2/P7/1P2P2P/2rP4/R1B3RK
(dicuri dari http://en.lichess.org/ocoSfS5I/white#36 )
Input: rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R
, f3b7
Output: 3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R
(dicuri dari http://en.lichess.org/NCUnA6LV/white#14 )
Input: rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R
, e5d6
Output: rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R
(dicuri dari http://en.lichess.org/AvgU4Skq/white#16 , ini bukan yang sebenarnya bergerak, tapi aku tidak bisa diganggu untuk menemukan permainan atom yang benar-benar memiliki en passant: P)
Input: 5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q
, c6h1
Output: 5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2
(dicuri dari http://en.lichess.org/l77efXEb/white#58 )
Mencetak gol
Ini adalah kode-golf , jadi kode terpendek dalam byte menang.
Jawaban:
JavaScript ( ES6 ) 305
310 321Sebagai fungsi dengan 2 parameter nyata (dan lebih banyak lagi dengan nilai default, digunakan sebagai cara cepat dan kotor untuk mendefinisikan lokal)
Tes menjalankan cuplikan di bawah ini (menjadi EcmaScript 6, hanya Firefox)
Tidak disatukan
sumber
Java, (
946777776 karakter)1 char terima kasih ke @ edc65
Catatan: Chars dihitung tanpa test case dimasukkan.
Kode
Saya tidak yakin apakah solusi ini optimal, tetapi saya sedang berusaha bermain golf lebih banyak, ada saran yang diterima. Saya dapat mengomentari semua kode juga jika ada yang mau, tapi saya pikir sebagian besar cukup jelas, kecuali untuk enumerasi variabel yang membingungkan.
Penjelasan
Diperluas
Tua
sumber
String m,i="";m="";char[]n=m.toCharArray()
->String i=a[0];char[]n=a[1].toCharArray()
lebih pendek dan jadi Anda mendapatkan parameter dari luar (sebagaimana mestinya )