Tangkap di Papan Gadai

17

Anda harus menulis sebuah program atau fungsi yang menerima string yang mewakili papan catur dengan hanya pion sebagai input dan output atau mengembalikan apakah penangkapan mungkin dilakukan di papan tulis.

Input dalam notasi FEN- like menggambarkan posisi pion putih dan hitam tanpa ada potongan lainnya. Anda harus memutuskan apakah ada pion yang bisa menangkap musuh.

Setiap peringkat dijelaskan, dimulai dengan peringkat 8 dan berakhir dengan peringkat 1; dalam setiap peringkat, isi setiap kotak dijelaskan dari file "a" hingga file "h". Setiap pion diidentifikasi dengan satu huruf (pion putih = "P", pion hitam = "p",). Kotak kosong dicatat menggunakan angka 1 hingga 8 (jumlah kotak kosong), dan "/" memisahkan peringkat. (sebagian diambil dari Wikipedia)

Sebagai contoh

8/pppppppp/8/8/4P3/8/PPPP1PPP/8

menggambarkan papan

--------

pppppppp


    P   

PPPP PPP

--------

Sebuah pion putih dapat menangkap yang hitam jika yang hitam diposisikan secara diagonal di atasnya (hitam di atas-kiri atau kanan-atas) dan pion hitam dapat menangkap yang putih jika yang putih secara diagonal di bawahnya (putih adalah bawah-kiri atau bawah-kanan). Tidak ada langkah penangkapan lain ( en passant ) yang harus dipertimbangkan.

Memasukkan

  • Sebuah FEN tali -seperti yang terdiri dari karakter 12345678pP/.
  • Masukan tersebut menjelaskan pion dari posisi permainan catur yang valid. Ini berarti (di antara kendala yang lebih rumit lainnya) akan ada paling banyak 8 pion untuk setiap sisi dan tidak ada pion pada peringkat 1 dan 8.

Keluaran

  • Jika ada kemungkinan penangkapan untuk kedua sisi Anda harus menampilkan nilai kebenaran dan nilai palsu sebaliknya.

Contohnya

Input dengan truthy keluaran (satu per baris)

8/7p/6P1/8/8/8/8/8
8/8/p7/1P6/3P3p/8/8/8
8/2P5/8/4P1p1/2p2P2/3p4/3p1P2/8
8/P7/8/5P2/2pp4/3P2p1/3pP3/8
8/P7/p7/p1P1P3/1P3p2/8/1p6/8
8/4p1P1/2P2P1P/2p1pPpp/8/6P1/pP1p4/8

Input dengan output falsy (satu per baris)

8/8/8/8/8/8/8/8
8/7P/6p1/8/8/8/8/8
8/7p/7P/8/8/8/8/8
8/pppppppp/8/8/8/8/PPPPPPPP/8
8/p7/8/1p6/5P2/8/8/8
8/p7/P7/2P1p1p1/2p5/8/PP6/8

Ini kode golf sehingga entri terpendek menang.

randomra
sumber
Bukankah seharusnya papan contoh dijelaskan oleh 8/pppppppp/8/8/8/7P/PPPP1PPP/8?
TheNumberOne
@TheNumberOne Tidak, 7Pberarti pion ada di file terakhir, ke-8. (Diagram itu salah, saya memperbaikinya.)
randomra
1
Saya merasa melepas en passant membuat ini menjadi puzzle yang kurang menarik.
corsiKa

Jawaban:

6

Pyth, 25 byte

/smC,>JsXz`M9*LN9dJ,8T"Pp

Suite uji

Langkah:

Ubah input dengan mengganti digit dengan jumlah tanda kutip yang setara ( N). Ini disimpan dalam J. Kami kemudian memotong 8 atau 10 karakter pertama, dan menutup hasilnya dengan yang asli. Setiap pasangan yang menangkap akan diubah menjadi "Pp", jadi kami kemudian menemukan jumlah string itu dalam daftar yang dihasilkan. Ini adalah output.

Sebagai bonus, ini sebenarnya menghitung jumlah tangkapan yang mungkin dalam input.

isaacg
sumber
25 solusi lain: :sXz`M9*LN9"p.{7}(..)?P"1Sayangnya parameter terakhir :tidak opsional (saya pikir seharusnya).
Jakube
3
@ Yakub Akan lakukan.
isaacg
12

Retina , 33 29 byte

T`d`w
)`\d
$0.
_

p.{7}(..)?P

Untuk menjalankan kode dari satu file, gunakan -sbendera.

Seharusnya mudah dikalahkan oleh sesuatu seperti Perl di mana perluasan digit menjadi string spasi (atau karakter lain) tidak memakan waktu 17 byte.

Outputnya positif (benar) jika ada kemungkinan penangkapan dan nol (palsu) jika tidak ada.

Penjelasan

T`d`w
)`\d
$0.

Ini adalah lingkaran dua tahap. Yang pertama adalah tahap transliterasi yang menurunkan setiap digit, dan mengubah nol menjadi garis bawah. Mengapa? Karena ddan wperluas dua baris berikut:

0123456789
_0123456789AB...YZab...yz

Jika set target tahap transliterasi lebih panjang dari set sumber, karakter asing diabaikan, maka perilaku menurun (jujur, itu hanya keberuntungan bahwa saya memutuskan untuk meletakkan garis bawah di depan digit ketika memperluas wkelas karakter) .

Kemudian tahap kedua adalah pengganti, yang menambahkan a .ke setiap digit. Itu berarti bahwa untuk setiap digit n, ntitik ditambahkan sebelum angka tersebut diubah menjadi garis bawah.

_
<empty>

Ini hanya menghilangkan garis bawah.

p.{7}(..)?P

Akhirnya, kami menemukan kecocokan. Karena kita mengabaikan en passant, menangkap hanya mungkin jika ada pdan kemudian secara Pdiagonal di bawahnya. Dalam string linier, ini berarti bahwa harus ada 7 atau 9 karakter antara dua pion. Ini cocok dengan .{7}(..)?(yaitu mencocokkan 7 karakter dan kemudian, secara opsional, cocok dengan dua lainnya).

Tahap pertandingan seperti itu mengembalikan jumlah pertandingan yang ditemukannya.

Martin Ender
sumber
Re "Seharusnya mudah dikalahkan oleh sesuatu seperti Perl di mana perluasan angka menjadi string spasi (atau karakter lain) tidak memakan 17 byte.": Saya tidak bisa membuat Perl bahkan mengikat skor Anda, apalagi mengalahkannya . ( Jawaban Perl saya. ) Tapi mungkin orang lain bisa ....
msh210
3

Javascript, 272 karakter

function h(t){b=[[]];for(i=-1;i++<7;){c=0;b.push(l=[]);for(j=-1;j++<7;){o=t.split('/')[i][j];switch(o){case'P':l[c++]=-1;break;case'p':l[c++]=1;break;default:c+=parseInt(o);}}}b.push([]);for(i=1;i<9;i++)for(j=0;j<8;j++)if((p=b[i][j])&&(b[i+p][j-1]||b[i+p][j+1]))return 1;}

Mungkin ada banyak ruang untuk perbaikan.

Najkin
sumber
3

Ruby, 145 123 46 byte

->b{b.gsub(/\d/){|x|?.*x.to_i}=~/p.{7}(..)?P/}

Saya tidak tahu mengapa saya tidak memikirkan hal ini sejak awal. Ini jauh lebih pendek dan juga sangat mudah dibaca.

Inilah tesnya: http://ideone.com/Gzav8N


Pendekatan lama:

->b{l={}
r=p
b.split(?/).map{|s|c={}
i=0
s.chars.map{|x|n=x.to_i;c[i]=x;i+=n<1?1:n;x==?P&&r||=l[i-2]==?p||l[i]==?p}
l=c}
r}

Tes online: http://ideone.com/9L01lf , versi sebelum bermain golf: http://ideone.com/CSmqlW

Riwayat modifikasi tersedia di sini .

Cristian Lupascu
sumber
2

ES6, 64 byte

Hitungan byte yang sesuai, jika bertahan!

f=s=>/p.{7}(..)?P/.test(s.replace(/\d/g,n=>"        ".slice(-n)))

Saya benar-benar memikirkan solusi ini tanpa membaca jawaban yang lain terlebih dahulu, tetapi saya tidak keberatan jika Anda tidak percaya kepada saya.

Neil
sumber
0

Perl 5, 30 byte

29, ditambah 1 sebagai -peganti-e

s/\d/1x$&/ge;$_=/p.{7}(..)?P/

Salinan Perl dari jawaban Ruby w0lf .

msh210
sumber
0

PHP, 94 87 80 byte

for(;$i++<8;)$t[$i]=$s.=" ";echo preg_match("#p.{7}(..)?P#",strtr($argv[1],$t));

Loop strtritu jauh lebih pendek daripada preg_replace_callbackdengan str_pad.

Titus
sumber
0

Jelly, 88 84 79 72 69 65 64 63 60 byte

Pasti ruang untuk perbaikan. Tidak bersaing karena Jelly dibuat sebelum pertanyaan. Terima kasih kepada @ lirtosiast karena mengatakannya kepada saya!

ØDṖḊ
”_x
e1£¬
1£iЀ2Ŀ€
x"3Ŀ€;"ÇFṣ”/
w€⁾pPn0
5ĿUŒDÇ
5ĿŒD6ĿoÇS
Zacharý
sumber