Vous devez écrire un programme ou une fonction qui reçoit une chaîne représentant un échiquier avec uniquement des pions en entrée et en sortie ou renvoie si une capture est possible sur le tableau.
L'entrée est dans une notation de type FEN décrivant les positions des pions blancs et noirs sans autres pièces présentes. Vous devez décider s'il existe un pion qui peut capturer un ennemi.
Chaque rang est décrit, commençant par le rang 8 et se terminant par le rang 1; à l'intérieur de chaque rang, le contenu de chaque carré est décrit du fichier "a" au fichier "h". Chaque pion est identifié par une seule lettre (pion blanc = "P", pion noir = "p",). Les carrés vides sont notés en utilisant les chiffres 1 à 8 (le nombre de carrés vides), et "/" sépare les rangs. (partiellement extrait de Wikipedia)
Par exemple
8/pppppppp/8/8/4P3/8/PPPP1PPP/8
décrit le tableau
--------
pppppppp
P
PPPP PPP
--------
Un pion blanc peut capturer un noir si le noir est positionné en diagonale vers le haut (le noir est en haut à gauche ou en haut à droite) et un pion noir peut capturer un blanc si le blanc est en diagonale en dessous de lui (le blanc est en bas à gauche ou en bas à droite). Aucun autre mouvement de capture ( en passant ) ne doit être envisagé.
Contribution
- Une chaîne de type FEN composée des caractères
12345678pP/
. - L'entrée décrit les pions d'une position de jeu d'échecs valide. Cela signifie (entre autres contraintes plus complexes) qu'il y aura au plus 8 pions pour chaque côté et aucun pion aux rangs 1 et 8.
Production
- S'il y a une capture possible pour l'un ou l'autre côté, vous devez sortir une valeur véridique et une valeur fausse sinon.
Exemples
Entrées avec sortie véridique (une par ligne)
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
Entrées avec sortie falsifiée (une par ligne)
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
C'est le golf de code, donc l'entrée la plus courte gagne.
8/pppppppp/8/8/8/7P/PPPP1PPP/8
?7P
cela signifierait que le pion est sur le dernier, 8ème fichier. (Le diagramme était cependant incorrect, j'ai corrigé cela.)Réponses:
Pyth, 25 octets
Suite de tests
Pas:
Transformez l'entrée en remplaçant les chiffres par le nombre équivalent de guillemets (
N
). Ceci est enregistré dansJ
. Nous coupons ensuite les 8 ou 10 premiers caractères et compressons le résultat avec l'original. Toute paire de capture sera transformée en"Pp"
, donc nous trouvons ensuite le nombre de cette chaîne dans la liste résultante. Ceci est la sortie.En prime, cela compte en fait le nombre de captures possibles dans l'entrée.
la source
:sXz`M9*LN9"p.{7}(..)?P"1
malheureusement, le dernier paramètre de:
n'est pas facultatif (je pense qu'il devrait l'être).Rétine ,
3329 octetsPour exécuter le code à partir d'un seul fichier, utilisez l'
-s
indicateur.Devrait être facilement battable par quelque chose comme Perl où l'expansion des chiffres en chaînes d'espaces (ou d'autres caractères) ne prend pas 17 octets.
La sortie est positive (véridique) s'il y a une capture possible et nulle (fausse) s'il n'y en a pas.
Explication
Il s'agit d'une boucle de deux étapes. Le premier est une étape de translittération qui décrémente chaque chiffre et transforme les zéros en tirets bas. Pourquoi? Parce que
d
etw
développez les deux lignes suivantes:Si l'ensemble cible d'une étape de translittération est plus long que l'ensemble source, les caractères étrangers sont ignorés, d'où le comportement de décrémentation (honnêtement, c'est juste par chance que j'ai décidé de mettre le trait de soulignement devant les chiffres lors du développement de la
w
classe de caractères) .Ensuite, la deuxième étape est un remplacement, qui ajoute un
.
à chaque chiffre. Cela signifie que pour chaque chiffren
, desn
points sont ajoutés avant que ce chiffre ne soit transformé en trait de soulignement.Cela supprime simplement les traits de soulignement.
Enfin, nous trouvons les correspondances. Puisque nous ignorons en passant, les captures ne sont possibles que s'il y a un
p
puis unP
diagonalement en dessous. Dans la chaîne linéaire, cela signifie simplement qu'il doit y avoir 7 ou 9 caractères entre les deux pions. Cela correspond à.{7}(..)?
(c.-à-d. Faire correspondre 7 caractères puis, éventuellement, en faire correspondre deux autres).Une telle étape de correspondance renvoie le nombre de correspondances trouvées.
la source
Javascript, 272 caractères
Il y a probablement beaucoup de place pour l'amélioration.
la source
Rubis,
145 12346 octetsJe ne sais pas pourquoi je n'y ai pas pensé en premier lieu. C'est beaucoup plus court et aussi assez lisible.
Voici le test: http://ideone.com/Gzav8N
L'ancienne approche:
Test en ligne: http://ideone.com/9L01lf , version avant le golf: http://ideone.com/CSmqlW
Un historique des modifications est disponible ici .
la source
ES6, 64 octets
Un nombre d'octets approprié, s'il dure!
En fait, j'ai pensé à cette solution sans lire les autres réponses au préalable, mais cela ne me dérangera pas si vous ne me croyez pas.
la source
Perl 5, 30 octets
29, plus 1 pour
-pe
au lieu de-e
Une copie Perl de la réponse Ruby de w0lf .
la source
PHP,
948780 octetsCette boucle +
strtr
est beaucoup plus courtepreg_replace_callback
qu'avecstr_pad
.la source
Gelée,
888479726965646360 octetsCertainement matière à amélioration. Pas de compétition car Jelly a été créée avant la question. Merci à @lirtosiast de me l'avoir dit!
la source