Satranç oyunu: Beyazdan Mate'ye Bir


19

Bir satranç oyununun mevcut durumunu temsil eden 8x8 harflik bir ızgara göz önüne alındığında, programınızın görevi beyaz için bir sonraki hamle ile sonuçlanan bir sonraki hamleyi bulmaktır (cevap her hamlede eş olacaktır).

Giriş

Giriş STDIN - her biri 8 karakterden oluşan 8 satırda olacaktır. Her karakterin anlamları aşağıdaki gibidir:

K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square

Büyük harfler beyaz parçaları, küçük harfler siyahı temsil eder. Tahta, beyaz alttan yukarıya ve siyah üstten aşağıya doğru olacak şekilde yönlendirilecektir.

Çıktı

Cebir gösteriminde şah matla sonuçlanan beyaz hareket . Bir parça alındığında not etmek zorunda değilsiniz veya aynı hareketi yapabilecek iki özdeş parça arasında ayrım yapmaktan endişelenmenize gerek yok.

Örnek giriş

örnek 1

Giriş:

------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------

Çıktı:

c6

ÖRNEK 2

Giriş:

--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-

Çıktı:

Nf5

ÖRNEK 3

Giriş:

---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-

Çıktı:

Rh5

Çözümün, döküm veya en-passant içermediğini varsayabilirsiniz.

Bu kod golf - en kısa çözüm kazanır.

(Örnekler mateinone.com'dan alınmıştır - bulmaca 81, 82 ve 83)


Hayır. Bence bu sorunun amaçları için cevabın kast ya da geçişli olmayacağını varsayabilirsiniz. Soruyu güncelleyeceğim.
Gareth

Birden fazla montaj ilişkisi içinde olan konumları nasıl ele almalıyız?
Rob

@Rob Yalnızca bir çözüm gereklidir, bu yüzden önce hangi çözümü bulursanız verin.
Gareth

Çözümün tanıtım içermediğini varsaymak da güvenli midir?
Peter Taylor

@Peter Evet, sorunu aşırı karmaşıklaştırmak istemiyorum.
Gareth

Yanıtlar:


7

Yakut, 589 512 510 499 493 karakter

R=0..7
a=->b{o=[];R.map{|r|R.map{|c|v=Hash[?K,[6,7,8,11,13,16,17,18],?R,s=[157,161,163,167],?B,t=[156,158,166,168],?Q,s+t,?N,[1,3,5,9,15,19,21,23],?P,[32,181,183]][z=b[r][c]];v&&v.map{|s|k=2!=l=s/25+1;u=r;v=c;l.times{u+=s/5%5-2;v+=s%5-2;R===u&&R===v||break;t=b[u][v];j=t<?.&&l<8;(j||t=~/[a-z]/&&k)&&o<<=(h=b.map &:swapcase;h[u][v]=h[r][c];h[r][c]=?-;[z+"%c%d"%[97+v,8-u],h.reverse]);j&&(k||r==6)||break}}}};o}
a[$<.map{|l|l}].map{|m,b|a[b].any?{|f,x|a[x].all?{|g,y|y*""=~/K/}}||$><<m[/[^P]+/]}

Giriş stdin yoluyla verilir, örneğin:

> ruby mateinone.rb
--------
--------
--------
-k------
b-------
-N-P----
--------
-----K-Q
^Z
Qb7

Çıktı, yalnızca bir montaj ilişkisini bir arkadaşı zorlayan bir hareket değil, bunu yapan her harekettir.

Düzenleme 1: İşlev eyalnızca bir kez kullanıldığından, satır içine aldım. İkincisi, kodlama şimdi 10 yerine 5 numaraya dayanmaktadır. Ve kartın klonlanmasını yeniden düzenlemek birkaç karakter kazandırdı.

Edit 2: Hala istediğim kadar gelişme değil. Karma {a=>b,c=>d}değerini olarak değiştirin Hash[a,b,c,d]. Bu 4 karaktere mal olur, ancak anahtar / değer çifti başına bir tane kaydeder.

Düzenleme 3: Sadece küçük indirimler: satır içi M (4 karakter), t==?--> t<?.(2), sonunda (2) cebirsel notasyondaki Piyonu kaldırır, yerine koyar (3). Program şimdi 500 karakterden az.

Edit 4: Böyle bir programda hala ne kadar bulabileceğiniz ilginç. Bir değişmezi döngü dışına taşıdı ve yinelenen başka bir hesaplama buldu.


"Bir değil, herhangi bir" demek zorundasınız "mutlaka bir değil, her" demek?
Matthew

@Matthew Haklısın. "Her" demek istedim.
Howard

Bunun [*$<]yerine kullanabilirsiniz $<.map{|l|l}.
Lowjacker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.