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
- Wenn es für beide Seiten eine mögliche Erfassung gibt, sollten Sie andernfalls einen Wahrheitswert und einen falschen Wert ausgeben .
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.
8/pppppppp/8/8/8/7P/PPPP1PPP/8
?7P
der Bauer befindet sich in der letzten, achten Datei. (Das Diagramm war zwar falsch, ich habe das korrigiert.)Antworten:
Pyth, 25 Bytes
Testsuite
Schritte:
Transformieren Sie die Eingabe, indem Sie die Ziffern durch die entsprechende Anzahl von Anführungszeichen (
N
) ersetzen . Dies ist gespeichert inJ
. 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.
quelle
:sXz`M9*LN9"p.{7}(..)?P"1
Leider ist der letzte Parameter von:
nicht optional (ich denke, es sollte sein).Retina ,
3329 BytesVerwenden Sie das
-s
Flag, 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
Dies ist eine Schleife von zwei Stufen. Die erste ist eine Transliterationsstufe, die jede Ziffer dekrementiert und Nullen in Unterstriche umwandelt. Warum? Weil
d
undw
erweitern Sie auf die folgenden zwei Zeilen: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
w
Zeichenklasse erweitere). .Dann ist die zweite Stufe eine Ersetzung, bei der
.
jeder Ziffer ein angehängt wird . Das bedeutet , dass für jede Ziffern
,n
Perioden hinzugefügt werden , bevor diese Ziffer in einem Unter gedreht wird.Dadurch werden nur die Unterstriche entfernt.
Schließlich finden wir die Streichhölzer. Da wir en passant ignorieren, sind Captures nur möglich, wenn ein
p
und dann einP
diagonal 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.
quelle
Javascript, 272 Zeichen
Es gibt wahrscheinlich viel Raum für Verbesserungen.
quelle
Ruby,
145 12346 BytesIch 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:
Online-Test: http://ideone.com/9L01lf , Version vor dem Golfen: http://ideone.com/CSmqlW
Eine Änderungshistorie finden Sie hier .
quelle
ES6, 64 Bytes
Eine angemessene Anzahl von Bytes, wenn es dauert!
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.
quelle
Perl 5, 30 Bytes
29, plus 1 für
-pe
statt-e
Eine Perl-Kopie von w0lfs Ruby-Antwort .
quelle
PHP,
948780 BytesDiese Schleife +
strtr
ist viel kürzer alspreg_replace_callback
mitstr_pad
.quelle
Jelly,
888479726965646360 BytesAuf 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!
quelle