Auf dem Bauernschachbrett festhalten

17

Sie sollten ein Programm oder eine Funktion schreiben, die eine Zeichenfolge empfängt, die ein Schachbrett mit nur Bauern als Eingabe und Ausgabe darstellt, oder zurückgibt, ob eine Erfassung auf dem Brett möglich ist.

Die Eingabe erfolgt in einer FEN- ähnlichen Notation, in der Positionen von weißen und schwarzen Bauern ohne andere Teile beschrieben werden. Sie sollten entscheiden, ob es einen Bauern gibt, der einen Feind erobern kann.

Jeder Rang wird beschrieben, beginnend mit Rang 8 und endend mit Rang 1; Innerhalb jedes Ranges wird der Inhalt jedes Quadrats von Datei "a" bis Datei "h" beschrieben. Jeder Bauer wird durch einen einzelnen Buchstaben identifiziert (weißer Bauer = "P", schwarzer Bauer = "p",). Leere Quadrate werden mit den Ziffern 1 bis 8 (der Anzahl der leeren Quadrate) angegeben und durch "/" voneinander getrennt. (teilweise aus Wikipedia entnommen)

Beispielsweise

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

beschreibt die Tafel

--------

pppppppp


    P   

PPPP PPP

--------

Ein weißer Bauer kann einen schwarzen Bauern fangen, wenn der schwarze diagonal darüber liegt (schwarz ist oben links oder oben rechts), und ein schwarzer Bauer kann einen weißen Bauern fangen, wenn der weiße diagonal darunter liegt (weiß ist) unten links oder unten rechts). Kein anderer Einnahme-Zug ( en passant ) sollte in Betracht gezogen werden.

Eingang

  • Eine FEN- ähnliche Zeichenfolge, die aus den Zeichen besteht 12345678pP/.
  • Die Eingabe beschreibt die Bauern einer gültigen Schachspielposition. Dies bedeutet (unter anderen komplexeren Einschränkungen), dass es höchstens 8 Bauern für jede Seite gibt und keine Bauern auf den Rängen 1 und 8.

Ausgabe

Beispiele

Eingänge mit wahrheitsgemäßer Ausgabe (einer pro Zeile)

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

Eingänge mit falschem Ausgang (einer pro Zeile)

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

Dies ist Code Golf, also gewinnt der kürzeste Einstieg.

randomra
quelle
Sollte die Beispieltafel nicht von beschrieben werden 8/pppppppp/8/8/8/7P/PPPP1PPP/8?
TheNumberOne
@TheNumberOne Nein, 7Pder Bauer befindet sich in der letzten, achten Datei. (Das Diagramm war zwar falsch, ich habe das korrigiert.)
Randomra
1
Ich fühle mich en passant entfernen macht dies ein weniger interessantes Rätsel.
corsiKa

Antworten:

6

Pyth, 25 Bytes

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

Testsuite

Schritte:

Transformieren Sie die Eingabe, indem Sie die Ziffern durch die entsprechende Anzahl von Anführungszeichen ( N) ersetzen . Dies ist gespeichert in J. Wir schneiden dann die ersten 8 oder 10 Zeichen ab und zippen das Ergebnis mit dem Original. Jedes Erfassungspaar wird in umgewandelt "Pp", sodass wir die Anzahl dieser Zeichenfolge in der resultierenden Liste finden. Dies ist die Ausgabe.

Als Bonus zählt dies tatsächlich die Anzahl der in der Eingabe möglichen Erfassungen.

isaacg
quelle
Weitere 25 Lösung: :sXz`M9*LN9"p.{7}(..)?P"1Leider ist der letzte Parameter von :nicht optional (ich denke, es sollte sein).
Jakube
3
@ Jakube Will tun.
Isaacg
12

Retina , 33 29 Bytes

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

p.{7}(..)?P

Verwenden Sie das -sFlag, um den Code aus einer einzelnen Datei auszuführen .

Sollte von etwas wie Perl leicht zu schlagen sein, wo die Erweiterung von Ziffern in Zeichenfolgen von Leerzeichen (oder anderen Zeichen) nicht 17 Bytes in Anspruch nimmt.

Die Ausgabe ist positiv (wahr), wenn es eine mögliche Erfassung gibt, und null (falsch), wenn es keine gibt.

Erläuterung

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

Dies ist eine Schleife von zwei Stufen. Die erste ist eine Transliterationsstufe, die jede Ziffer dekrementiert und Nullen in Unterstriche umwandelt. Warum? Weil dund werweitern Sie auf die folgenden zwei Zeilen:

0123456789
_0123456789AB...YZab...yz

Wenn die Zielmenge einer Transliterationsstufe länger als die Quellmenge ist, werden die überflüssigen Zeichen ignoriert, daher das dekrementierende Verhalten (ehrlich gesagt war es nur ein Glück, dass ich mich entschied, den Unterstrich vor die Ziffern zu setzen, wenn ich die wZeichenklasse erweitere). .

Dann ist die zweite Stufe eine Ersetzung, bei der .jeder Ziffer ein angehängt wird . Das bedeutet , dass für jede Ziffer n, nPerioden hinzugefügt werden , bevor diese Ziffer in einem Unter gedreht wird.

_
<empty>

Dadurch werden nur die Unterstriche entfernt.

p.{7}(..)?P

Schließlich finden wir die Streichhölzer. Da wir en passant ignorieren, sind Captures nur möglich, wenn ein pund dann ein Pdiagonal darunter liegt. In der linearen Zeichenfolge bedeutet dies einfach, dass zwischen den beiden Bauern 7 oder 9 Zeichen stehen müssen. Dies stimmte mit überein .{7}(..)?(dh stimmen mit 7 Zeichen überein und stimmen optional mit zwei weiteren überein).

Eine solche Übereinstimmungsstufe gibt die Anzahl der gefundenen Übereinstimmungen zurück.

Martin Ender
quelle
Zu "Sollte von etwas wie Perl leicht zu schlagen sein, wo die Erweiterung von Ziffern in Zeichenfolgen (oder anderen Zeichen) nicht 17 Byte beansprucht." . ( Meine Perl-Antwort. ) Aber vielleicht kann jemand anderes ...
msh210
3

Javascript, 272 Zeichen

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

Es gibt wahrscheinlich viel Raum für Verbesserungen.

Najkin
quelle
3

Ruby, 145 123 46 Bytes

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

Ich weiß nicht, warum ich überhaupt nicht darüber nachgedacht habe. Es ist viel kürzer und auch ziemlich lesbar.

Hier ist der Test: http://ideone.com/Gzav8N


Der alte Ansatz:

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

Online-Test: http://ideone.com/9L01lf , Version vor dem Golfen: http://ideone.com/CSmqlW

Eine Änderungshistorie finden Sie hier .

Cristian Lupascu
quelle
2

ES6, 64 Bytes

Eine angemessene Anzahl von Bytes, wenn es dauert!

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

Ich habe tatsächlich an diese Lösung gedacht, ohne vorher die anderen Antworten gelesen zu haben, aber es macht mir nichts aus, wenn Sie mir nicht glauben.

Neil
quelle
0

Perl 5, 30 Bytes

29, plus 1 für -pestatt-e

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

Eine Perl-Kopie von w0lfs Ruby-Antwort .

msh210
quelle
0

PHP, 94 87 80 Bytes

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

Diese Schleife + strtrist viel kürzer als preg_replace_callbackmit str_pad.

Titus
quelle
0

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

Auf jeden Fall Raum für Verbesserungen. Nicht konkurrierend, weil Jelly vor der Frage erstellt wurde. Vielen Dank an @lirtosiast, der mir das erzählt hat!

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