Les pièces d'échecs (rois, reines, tours, évêques et chevaliers) et les pions sont sur une planche, mais pas sur la case a1 ou h8 . Votre tâche consiste à voyager des cases a1 vides aux cases h8 vides , en ne passant que par des cases vides. Les règles de circulation sont les suivantes:
- Vous pouvez passer de n'importe quel carré vide à n'importe quel carré vide à côté (même rang, fichier suivant ou précédent; ou même fichier, rang suivant ou précédent).
- Vous pouvez passer de n'importe quel carré vide à n'importe quel carré vide en diagonale à côté de lui (rang suivant ou précédent, fichier suivant ou précédent), à condition que les carrés de coin gras contiennent soit (a) deux pions ou (b) des pions / morceaux d'en face Couleur. (Deux pièces non pion, ou une pièce non pion et un pion, de la même couleur sont suffisamment solides pour empêcher votre progression dans le coin, mais deux pions ne le sont pas; et les pièces / pions de couleur opposée ne fonctionnent pas dans concert pour barrer votre chemin.) Par exemple, si vous êtes sur c4 et que d5 est vide, vous pouvez y procéder à condition que c5 et d4 contiennent des pions ou contiennent des pièces / pions de couleur opposée. Voir la section "Exemples de diagonales" ci-dessous pour les photos.
Contribution
Description de la carte FEN . C'est-à-dire que l'entrée sera une chaîne qui comprend une description du rang 8 , une barre oblique ( /
), une description du rang 7 , une barre oblique,… et une description du rang 1 . La description de chaque rang comprend des chiffres et des lettres allant du fichier a au fichier h , où les lettres indiquent les pièces et les pions (les noirs sont p
= pion, n
= chevalier, b
= évêque, r
= tour, q
= reine, k
= roi et le blanc ceux-ci sont des versions majuscules du même) et les nombres indiquent le nombre successif de carrés vides. Par exemple, rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBN
est le plateau après un mouvement de pli (pion du roi à e4) dans une partie d'échecs.
a1 et h8 seront vides dans l'entrée; c'est-à-dire que la première barre oblique a un chiffre avant, et la dernière barre oblique a un chiffre après.
Production
Truthy ou falsey, indiquant si un passage réussi à h8 est possible.
Si l'entrée n'est pas une description de carte FEN valide (c'est-à-dire celle qui correspond à mon explication ci-dessus), ou si a1 ou h8 est occupé, alors la sortie peut être n'importe quoi ou rien. (En d'autres termes: vous pouvez supposer que l'entrée répond aux exigences ci-dessus.)
Notation
C'est le golf de code: le moins d'octets gagne.
Exemple d'entrée et de sortie
Notez que votre code doit fonctionner pour toutes les entrées valides, pas seulement les exemples.
Ajoutez un espace et un w
après chaque FEN pour le visualiser http://www.dhtmlgoodies.com/scripts/chess-fen/chess-fen-3.html
. (Notez que certains autres visualiseurs FEN en ligne n'autoriseront pas un plateau illégal aux échecs, par exemple avec un pion de rang 1 ou 8 , donc ne peut pas être utilisé à nos fins.)
Exemples véridiques
8/8/8/8/8/8/8/8
- le plateau vide1p1Q4/2p1Q3/2p1Q3/2p1Q3/2p1Q3/2p1Q3/Q1p1Q3/1q3q2
- il y a un chemin a1 , b2 , b3 , b4 , b5 , b6 , b7 , c8 , d7 , ( pas e8 , qui est bloqué, mais) d6 , d5 , d4 , d3 , d2 , d1 , e1 , f2 , f3 , f4 , f5 , f6 , f7 , f8 , g8 , h88/8/KKKKK3/K3K3/K1K1p3/Kp1K4/K1KK4/2KK4
- un exemple où un carré qui est bloqué à un moment donné doit être traversé plus tard (pour vous assurer que vous ne définissez pas les carrés comme infranchissables)K1k1K1K1/1K1k1K1k/K1K1k1K1/1k1K1K1k/K1k1K1k1/1K1k1k1K/K1K1k1K1/1k1k1K1k
- il n'y a qu'un seul chemin à travers (suivez simplement votre nez: il n'y a qu'un seul carré à déplacer à chaque étape, à moins de faire un pas en arrière); c'est aussi un exemple où un carré est bloqué à un moment donné mais nécessaire plus tard
Exemples de Falsey
6Q1/5N2/4Q3/3N4/2Q5/1N6/2Q5/1N6
- toute tentative de chemin devra passer par deux pièces de même couleur situées en diagonaleN1q1K1P1/1R1b1p1n/r1B1B1Q1/1p1Q1p1b/B1P1R1N1/1B1P1Q1R/k1k1K1q1/1K1R1P1r
- le seul chemin à travers la diagonale a8-h1 est à f2-g3 , mais cela nécessiterait un passage par e1-d2 ou f2-e3 , qui sont tous les deux impossibles.4Q3/4q3/4Q3/5Q2/6Q1/3QqP2/2Q5/1Q6
4q3/4Q3/4q3/5q2/6q1/3qQp2/2q5/1q6
Exemples de diagonales
Dans le cas où la prose ci-dessus n'était pas claire, voici quelques photos.
Diagonales passables
Diagonales infranchissables
Réponses:
VBA
668666633622548510489435331322319315 octetsLa lecture de la chaîne d'entrée occupe jusqu'à «Wend». Bel effet secondaire - cela abandonne la chaîne d'entrée une fois que la carte [X] est entièrement codée, vous pouvez donc laisser une description à la fin.
Dans le codage de la carte, les pions sont 2, les autres pièces sont 3, le noir est négatif. Les pions sont reconnus par 'P' et 'p' ayant des codes de caractères divisibles par 8.
'X (7,0) = 1', définissant a1 accessible, est l'endroit où les vérifications de chemin commencent. Cela scanne le tableau à plusieurs reprises en essayant d'ajouter des carrés accessibles à partir des carrés marqués comme accessibles (1) jusqu'à présent. L'accès et l'occupation diagonale sont vérifiés dans un calcul IF + logic-calc qui vivait autrefois dans une fonction mais se trouve maintenant dans des boucles voisines imbriquées. Le contrôle d'accès en diagonale repose sur le produit des deux carrés de coin de chat, qui n'est qu'à 6 ou plus si les pièces sont de la même couleur et au moins une est une pièce et non un pion.
Appelez dans une feuille de calcul; renvoie la valeur dans X (0,7) - 1 si h8 accessible et 0 sinon - que Excel reconnaît comme véridique / falsifiée. = SI (Z (C2), "oui", "non")
Je me suis peut-être laissé emporter par la lecture du code ci-dessus, alors voici une version commentée semi-non-golfée:
Notes de progression
Edit 1: Le code n'est plus aussi diabolique que 666 :-D et a perdu ses fonctions; J'ai trouvé un moyen assez court de les écrire pour éviter les frais généraux.
Edit 2: Un autre grand bond en avant, finissant efficacement le travail de suppression des fonctions inc / dec, soupir et utilisation de quelques globaux. Je vais peut-être enfin comprendre cela ...
Le codage des pièces et des carrés a changé. Aucun effet sur la longueur du code.
Edit 3: Retour de (fausses) fonctions, supprimant tous ces
Call
octets gênants et quelques autres ajustements.Edit 4: Percer le grand 500, woohoo - a fait passer les boucles 3 For en 1.
Edit 5: Jiminy Cricket, une autre grosse baisse quand j'ai mis ensemble les deux fonctions - ma vérification d'accès diagonale passe toujours pour les carrés adjacents, alors ...
Edit 6: Holy niblicks, une autre goutte massive. Au revoir aux fonctions externes et donc aux globales ... Je suis allé à moins de la moitié de la longueur originale publiée ....
Edit 7: Ajouter une version non golfée
Edit 8: révision du processus de lecture pour quelques dollars de plus
Edit 9: pressé quelques expressions pour les dernières gouttes de sang
Edit 10: l'
Next
instruction Compund perd quelques octetsPar intérêt, les graphiques des tableaux après analyse de l'accessibilité (les numéros de code sont périmés mais ...) les carrés accessibles sont verts, les carrés inaccessibles blancs et les autres couleurs sont des pièces ou des pions.
Quelques tableaux de défis: h8 est accessible dans les deux:
la source
If V>9 Then X(7-P,C)=
devrais-je penser (pas que je connaisse VBA) devenirIf V>9 Then X(P,C)=
.[some non-letter character] To
à[some non-letter character]To
Matlab, 636
887octets enregistrés (y compris l'indentation)Cette solution n'est pas très golfée, mais je voulais aller de l'avant et la mettre en place.
Lit une chaîne de tableau
x
comme spécifié ci-dessus et la transforme en la plus complètement représentéeo
, puis trouve tous les mouvements (bords du graphique) entre les espaces, puis détermine quels mouvements sont possibles (pas dans les espaces remplis), puis détermine quels mouvements possibles ont " portes "de deux pièces pour passer entre les deux, puis détermine si la porte est ouverte (pions, couleurs opposées) ou fermée (même couleur et incluant un non-pion). Ensuite, il parcourt pour trouver des emplacements accessibles par des chemins à partir du carré inférieur gauche et si un chemin peut atteindre l'espace 64, c'est un panneau Oui.la source
=
s? (Je ne sais pas MATLAB: peut-être que ce sont impossibles.)