Piyon Satranç Tahtasında Yakalama


17

Bir satranç tahtasını temsil eden ve sadece piyonları giriş ve çıkış olarak gösteren bir dize alan veya tahtada herhangi bir yakalamanın mümkün olup olmadığını döndüren bir program veya işlev yazmalısınız.

Giriş, başka hiçbir parçası olmayan beyaz ve siyah piyonların konumlarını tanımlayan FEN benzeri bir gösterimdedir. Düşmanı yakalayabilecek bir piyon olup olmadığına karar vermelisiniz.

Her bir kademe, kademe 8 ile başlayıp kademe 1 ile biten tarif edilir; her bir sıralamada, her karenin içeriği "a" dosyasından "h" dosyasında açıklanır. Her piyon tek bir harfle tanımlanır (beyaz piyon = "P", siyah piyon = "p",). Boş kareler 1'den 8'e kadar basamaklar (boş karelerin sayısı) kullanılarak not edilir ve "/" sıraları ayırır. (kısmen Wikipedia'dan alınmıştır)

Örneğin

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

tahtayı tanımlar

--------

pppppppp


    P   

PPPP PPP

--------

Beyaz bir piyon, siyah olanı çapraz olarak yukarı konumlandırılmışsa (siyah yukarı sol veya yukarı sağsa) siyah olanı yakalayabilir ve beyaz piyon, beyaz olan ondan çapraz olarak aşağıdaysa beyaz olanı yakalayabilir (beyaz aşağı-sol veya aşağı-sağ). Başka hiçbir yakalama hareketi ( en yolcu ) dikkate alınmamalıdır.

Giriş

  • Bir Fen karakterden oluşan benzeri dize 12345678pP/.
  • Giriş, geçerli bir satranç oyunu pozisyonunun piyonlarını açıklar. Bu, (daha karmaşık kısıtlamaların yanı sıra), her bir taraf için en fazla 8 piyon olacağı ve 1. ve 8. sırada piyon olmayacağı anlamına gelir.

Çıktı

Örnekler

Doğru çıktıya sahip girişler (her satıra bir tane)

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

Falsy çıkışlı girişler (her satıra bir tane)

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

Bu kod golf yani en kısa giriş kazanır.


Örnek kurul tarafından tarif edilmemeli 8/pppppppp/8/8/8/7P/PPPP1PPP/8mi?
TheNumberOne

@TheNumberOne Hayır, 7P piyonun son 8. dosyada olduğu anlamına gelir. (Diyagram yanlış olsa da, bunu düzelttim.)
randomra

1
Kaldırıldığını hissediyorum En passant'ı bunu daha az ilginç bir bulmaca haline getiriyor.
corsiKa

Yanıtlar:


6

Pyth, 25 bayt

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

Test odası

Adımlar:

Basamakları, eşit sayıda tırnak işareti ( N) ile değiştirerek girişi dönüştürün . Bu içine kaydedilir J. Daha sonra ilk 8 veya 10 karakteri dilimleyip sonucu orijinal ile sıkıştırıyoruz. Herhangi bir yakalama çifti dönüştürülecektir "Pp", bu nedenle sonuç listesinde bu dizenin sayısını buluruz. Bu çıktı.

Bir bonus olarak, bu aslında girdideki olası yakalama sayısını sayar.


Başka bir 25 çözüm: :sXz`M9*LN9"p.{7}(..)?P"1Ne yazık ki son parametresi :isteğe bağlı değildir (bence olması gerekir).
Jakube

3
@ Jakube yapacak.
isaacg

12

Retina , 33 29 bayt

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

p.{7}(..)?P

Kodu tek bir dosyadan çalıştırmak için, -s bayrağı .

Rakamların boşluk dizelerine (veya diğer karakterlere) genişlemesinin 17 bayt sürmediği Perl gibi bir şey tarafından kolayca yenilebilir olmalıdır.

Olası bir yakalama varsa çıktı pozitif (doğrudur) ve yoksa yakalama (sıfır).

açıklama

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

Bu iki aşamalı bir döngüdür. Birincisi, her bir basamağı azaltan ve sıfırları alt çizgilere çeviren bir harf çevirisi aşamasıdır. Neden? Çünkü dve waşağıdaki iki satıra genişletin:

0123456789
_0123456789AB...YZab...yz

Harf çevirisi aşamasının hedef kümesi kaynak kümesinden daha uzunsa, yabancı karakterler yok sayılır, bu nedenle azalan davranış (dürüst olmak gerekirse, wkarakter sınıfını genişletirken alt çizgiyi basamakların önüne koymaya karar vermem sadece şanstı ) .

Daha sonra ikinci aşama, .her basamağa a ekleyen bir değiştirmedir. Bu, her bir basamak için n, nbu basamak bir alt çizgiye dönüştürülmeden önce noktaların eklendiği anlamına gelir .

_
<empty>

Bu sadece alt çizgilerden kurtulur.

p.{7}(..)?P

Sonunda maçları buluyoruz. Geçtiğimiz günleri görmezden geldiğimizden, yakalamalar ancak altında bir pve sonra Pçapraz olarak varsa mümkündür . Doğrusal dizede bu, iki piyon arasında 7 veya 9 karakter olması gerektiği anlamına gelir. Bu ile eşleşir .{7}(..)?(yani 7 karakterle eşleşir ve ardından isteğe bağlı olarak başka bir ikiyle eşleşir).

Böyle bir maç aşaması, bulduğu maç sayısını döndürür.


Re "Rakamların boşluk dizelerine (veya diğer karakterlere) genişlemesinin 17 bayt sürmediği Perl gibi bir şey tarafından kolayca yenilebilir olmalı.": Perl'in skorunuzu bile bağlamasını sağlayamıyorum. . ( Benim Perl cevabım. ) Ama belki başka biri yapabilir ....
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;}

Muhtemelen iyileştirilecek çok yer var.


3

Yakut, 145123 46 bayt

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

İlk etapta neden böyle düşünmediğimi bilmiyorum. Çok daha kısa ve oldukça okunabilir.

İşte test: http://ideone.com/Gzav8N


Eski yaklaşım:

->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}

Çevrimiçi test: http://ideone.com/9L01lf , golf öncesi versiyon: http://ideone.com/CSmqlW

Değişiklik geçmişi burada bulunabilir .


2

ES6, 64 bayt

Sürerse uygun bir bayt sayısı!

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

Aslında bu çözümü önce diğer cevapları okumadan düşündüm, ama bana inanmazsan sakıncası olmaz.



0

PHP, 94 87 80 bayt

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

Bu döngü + strtrçok daha kısadır preg_replace_callbackile str_pad.


0

Jöle, 88 84 79 72 69 65 64 63 60 bayt

Kesinlikle iyileştirilmesi için yer. Rekabetçi değil çünkü Jelly sorudan önce yaratıldı. @ Lirtosiast'a bunu söylediğin için teşekkürler!

ØDṖḊ
”_x
e1£¬
1£iЀ2Ŀ€
x"3Ŀ€;"ÇFṣ”/
w€⁾pPn0
5ĿUŒDÇ
5ĿŒD6ĿoÇS
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.