Tout à fait surpris que cela n'ait pas déjà été publié, compte tenu du grand nombre de puzzles d'échecs sur le site. Pendant que j'y pensais moi-même, merci à Anush de l'avoir posté dans le bac à sable en mars . Mais je me suis dit que ça faisait assez longtemps que je pouvais aller de l'avant et le faire moi-même.
Un échec et mat dans les échecs est une position dans laquelle le roi est attaqué et aucun mouvement ne peut le défendre. Si vous n'êtes pas familier avec le mouvement des pièces d'échecs, vous pouvez vous familiariser avec Wikipedia .
Le défi
Pour ce défi, votre entrée sera la position d'un échiquier dans la notation que vous souhaitez. Pour clarifier, votre entrée décrira les pièces sur un échiquier, avec leurs couleurs et positions, ainsi que le carré de capture en passant éventuel , le cas échéant. (La capacité à roquer n'est pas pertinente car vous ne pouvez pas roquer hors de contrôle.) Vous pouvez trouver la notation FEN utile , mais tout format pratique convient. Pour simplifier, vous pouvez supposer que c'est du noir à jouer - cela signifie que le noir sera toujours le joueur mat. Une position où Blanc est en échec, échec ou échec sera considérée comme invalide pour ce défi.
Vous devez sortir une valeur véridique si la position est échec et mat et une valeur falsey si ce n'est pas le cas. Notez que l' impasse n'est pas échec et mat et - le roi doit être attaqué!
Cas de test authentiques
1k5R / 6R1 / 8/8/8/8/8 / 6K1 b - -
rn2r1k1 / pp1p1pQp / 3p4 / 1b1n4 / 1P2P3 / 2B5 / P5PP / R3K2R b - -
kr5R / rB6 / 8/8/8 / 5Q2 / 6K1 / R7 b - -
2K5 / 1B6 / 8/8/8 / 7N / R7 / R3r2k b - - 0 1
Cas de test Falsey
rnbqkbnr / pppppppp / 8/8 / 4P3 / 8 / PPPP1PPP / RNBQKBNR b KQkq -
8/8/8/8/8 / 1KQ5 / 4N3 / 1k6 b - -
2K5 / 1B6 / 8/8/8 / 7N / R7 / 4r2k b - -
8/8 / 2Q5 / 3k4 / 3Q5 / 8/8 / 7K b - -
8 / 4Q1R1 / R7 / 5k2 / 3pP3 / 5K2 / 8/8 b - e3 (Regardez ça en passant!)
Golf de code - le code le plus court en octets gagne. Bonne chance!
la source
Réponses:
JavaScript (Node.js) ,
499 ... 374370 octets(b)(X)
Voici les valeurs attendues pour chaque carré:
Essayez-le en ligne!
Comment?
Représentation au conseil
Nous utilisons la représentation classique de la carte 0x88 , afin que les carrés cibles hors limites puissent être facilement détectés.
Déplacer l'encodage
Chaque ensemble de mouvements est codé avec 5 paramètres:
Tous ces paramètres sont regroupés dans une seule chaîne. Par exemple, les mouvements de chevalier sont codés comme suit:
qui donne:
Tous les ensembles de mouvements sont résumés dans le tableau suivant, à l'exception des captures en passant qui sont traitées séparément.
Commenté
la source
8/1ppp4/1pkp4/8/2Q5/8/8/7K b - -
Haskell ,
116510651053 octetsOctets économisés grâce à Leo Tenenbaum
Essayez-le en ligne!
Ce n'est pas vraiment bien joué pour l'instant, mais c'est un début.Avec un peu d'aide en cours de route, j'ai maintenant résolu ce problème de manière assez agressive (et corrigé une erreur en cours de route).La seule chose peut-être discutable, c'est que cela suppose que, sauf par un roi ou un pion en passant, vous ne pouvez jamais vous soustraire en capturant l'une de vos propres pièces. Aux échecs, vous n'êtes pas autorisé à effectuer ce mouvement, mais mon programme considère ces mouvements pour économiser des octets en supposant que si vous êtes en contrôle, cela ne peut jamais vous en sortir.
Cette hypothèse est valable car de tels mouvements
Impossible de capturer la pièce qui attaque le roi, car la pièce capturée est noire.
Impossible de bloquer le chemin de la pièce qui attaque le roi, car la pièce noire capturée aurait déjà fait cela.
Nous ajoutons également la stipulation supplémentaire que si vous n'avez pas de roi, vous êtes en échec.
Ce programme fait également l'hypothèse que s'il y a un pion qui peut être capturé en passant, alors le pion était la dernière pièce à se déplacer et ce mouvement était légal. C'est parce que le programme ne vérifie pas si le carré vers lequel se déplace le pion noir est vide, donc s'il y a un morceau, les choses peuvent devenir un peu vissées. Cependant, cela ne peut pas être obtenu si le dernier coup était légal et ne peut pas non plus être représenté dans la FEN . Cette hypothèse semble donc assez solide.
Voici ma version "non golfée" pour référence:
Essayez-le en ligne!
la source
guard x = [0|x]
et vous pouvez également utiliserx?y=Just(x,y)
pour enregistrer quelques octets supplémentaires: 1129 octetsPython 3 (PyPy) , 729 octets
Essayez-le en ligne!
la source
8/2p5/Q7/Q2k4/Q7/8/8/7K b - -
(pas échec et mat).