Le défi
Écrivez un programme ou une fonction qui prend une entrée de chaîne en tant que paramètre de fonction ou de stdin et détermine s'il s'agit d'une chaîne FEN valide .
Contribution
Vous pouvez supposer que l'entrée ne comprendra que les caractères suivants (sensible à la casse)
pkqrbnPKQRBN12345678/
La longueur de l'entrée sera toujours au minimum 1 caractère et au maximum 100 caractères
Production
La sortie doit être une valeur true / falsey. Il peut s'agir de toutes les valeurs souhaitées tant qu'elles sont cohérentes (tous les résultats véridiques ont la même sortie, tous les résultats falsey ont la même sortie). Vous devriez avoir exactement deux sorties distinctes possibles.
Ce qui compte comme valide
Les lettres minuscules représentent les pièces noires, les lettres majuscules représentent les pièces blanches.
Vous devez vous assurer qu'il est possible dans un jeu d'échecs que les pièces dans la position actuelle existent.
Chaque joueur aura toujours exactement 1 roi (k / K)
Chaque joueur ne peut pas avoir plus de 8 pions (p / P)
Chaque joueur n'aura généralement pas plus de 1 * reine (q / Q)
Chaque joueur n'en aura généralement pas plus de 2 * tours (r / R)
Chaque joueur n'aura généralement pas plus de 2 * chevaliers (n / N)
Chaque joueur n'aura généralement pas plus de 2 * évêques (b / B)
* Il est légal pour un joueur de ' promouvoir un pion à l'une de ces quatre pièces.
Le total des pions, reines, tours, chevaliers et évêques pour chaque joueur ne dépassera jamais 15
Le nombre total de pièces plus les cases vides (désignées par des nombres) doit toujours totaliser exactement 8 pour chaque rang. Et il devrait toujours y avoir exactement 8 rangs, séparés par une barre oblique.
Choses que vous pouvez ignorer
Vous n'avez pas à vous soucier de savoir s'il est possible ou non de jouer dans la position indiquée, ou si la position est légale, seulement que les pièces peuvent exister dans les quantités données.
Vous pouvez ignorer d'autres complexités des chaînes FEN telles que le tour du joueur, les droits de roque et en passant.
C'est le golf de code. Le programme le plus court en octets gagne. Les failles et les règles habituelles s'appliquent.
Cas de test
Entrée rnbqkbnr / pppppppp / 8/8/8/8 / PPPPPPPP / RNBQKBNR
Sortie True
Entrée 2br2k1 / 1p2n1q1 / p2p2p1 / P1bP1pNp / 1BP2PnP / 1Q1B2P1 / 8 / 3NR2K
Sortie True
Entrée r2r2k1 / p3q2p / ppR3pr / rP4bp / 3p4 / 5B1P / P4PP1 / 3Q1RK1
Sortie Faux
(le noir a 7 pions et 4 tours - impossible)
Entrée 6k1 / pp3ppp / 4p3 / 2P3b1 / bPP3P1 / 3K4 / P3Q1q1
Sortie Faux (seulement 7 rangs)
Entrée 3r1rk1 / 1pp1bpp1 / 6p1 / pP1npqPn / 8 / 4N2P / P2PP3 / 1B2BP2 / R2QK2R
Sortie Faux (9 rangées)
Entrée 5n1k / 1p3r1qp / p3p3 / 2p1N2Q / 2P1R3 / 2P5 / P2r1PP1 / 4R1K1
Sortie Faux (le 2e rang a 9 carrés / pièces)
Entrée rnbqkbnr / pppppppp / 8/35/8/8 / PPPPPPPP / RNBQKBNR
Sortie True
Merci à Feersum et Arnauld pour avoir clarifié ce cas (3 + 5 = 8)
Qu'est-ce que le FEN?
FEN est une notation standard pour enregistrer la position des pièces sur un échiquier.
Crédit d'image http://www.chessgames.com
la source
* It is legal for a player to 'promote' a pawn to any of these four pieces.
Le joueur peut avoir jusqu'à 9 reines tant que le nombre de pions est réduit pour compenser. Vous n'avez pas à vous soucier que la position des pièces soit légale ou illégale, seulement le nombre de pièces.35
est juste une façon inhabituelle de décrire 8 cases vides.Réponses:
Rétine , 105 octets
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Développez les chiffres en carrés vides, ce que nous désignons par
1
s.Supprimez l'entrée si elle ne correspond pas à 8 ensembles de 8 carrés valides joints à l'
/
art. (Un extra/
est préfixé pour simplifier la vérification.)Supprimez l'entrée si elle n'a pas de roi blanc ou noir, ou si elle en a deux.
Supprimez les pièces de départ des blancs, s'ils sont toujours là.
Rétrogradez les morceaux blancs restants en pions.
Supprimez les pions blancs valides.
Supprimez l'entrée s'il reste des pions blancs.
Vérifiez encore mais avec les pièces noires.
Sortez une valeur véridique sauf si la ligne a été supprimée.
la source
JavaScript (ES6),
168174... 155Cette réponse a été modifiée un nombre embarrassant de fois. Espérons que la version actuelle soit à la fois fiable et décente.
Renvoie un booléen.
Formaté et commenté
Cas de test
Afficher l'extrait de code
la source
Python 3,
284 259 236 225 247234 octetsEssayez-le en ligne!
Essayez-le en ligne avec tous les cas de test!
-11 octets grâce à M. Xcoder
-13 octets grâce à Jonathan Allen
+22 J'ai oublié que les rois existaient.
Semi-non golfé avec quelques explications:
la source
,p,P=9,9
par;P=p=9
.for-loop
: /p>0<P
au lieu dep>0and P>0
pour enregistrer 5 octets. Alternativement, vous auriez pu utiliserp and P
(pour -3 octets), vous n'avez pas besoin de>0
, car les valeurs non nulles sont véridiques en Pythono=0
avant la boucle et en incrémentant aveco+=o<2
à la fin du corps de la boucle.PHP , 269 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
181172174 octetsNon golfé:
Afficher l'extrait de code
la source
Python 3 , 263 octets
Essayez-le en ligne!
Pas la plus petite soumission Python, mais je pense qu'elle a encore des promesses.
la source