Labyrinthe d'échiquier

14

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:

  1. 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).
  2. 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/RNBQKBNest 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 waprè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 vide
  • 1p1Q4/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 , h8
  • 8/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 diagonale
  • N1q1K1P1/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

pions de la même couleur pions de couleurs opposées tours de couleurs opposées

Diagonales infranchissables

une tour et un pion de la même couleur tourelles de la même couleur

msh210
la source
Je suis désolé, je ne suis pas sûr des règles du golf standard: que se passe-t-il si vous insérez une chaîne illégale? Un comportement peut-il se produire?
alex berne
@alexberne Je crois que cela le couvre: "votre code doit fonctionner pour toutes les entrées valides ".
Rainbolt
@alexberne, j'ai édité. Est-ce clair maintenant?
msh210
Oui merci. Je suis nouveau ici, donc ce pourrait être des trucs habituels pour les golfeurs, mais pour moi, ce n'était pas clair :)
alex berne
Je voulais juste dire merci pour un grand puzzle @ msh210. Je ne comprends pas pourquoi il n'y a plus de réponses.
Joffan

Réponses:

6

VBA 668 666 633 622 548 510 489 435 331 322 319 315 octets

Function Z(F):Dim X(7,7):While Q<64:R=R+1:V=Asc(Mid(F,R))-48:If V>9 Then X(Q\8,Q Mod 8)=(3+(V\8=V/8))*Sgn(48-V):V=1
Q=Q-V*(V>0):Wend:X(7,0)=1:For W=0 To 2E3:Q=W Mod 8:P=W\8 Mod 8:For T=Q+(Q>0) To Q-(Q<7):For S=P+(P>0) To P-(P<7):If X(S,T)=0 Then X(S,T)=(1=X(P,Q))*(6>X(P,T)*X(S,Q))
Next S,T,W:Z=X(0,7):End Function

La 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")

entrez la description de l'image ici

Je me suis peut-être laissé emporter par la lecture du code ci-dessus, alors voici une version commentée semi-non-golfée:

Function MazeAssess(F)  'input string F (FEN)
Dim X(7, 7)             'size/clear the board; also, implicitly, Q = 0: R = 0
'Interpret string for 8 rows of chessboard
While Q < 64
    R = R + 1           ' next char
    V = Asc(Mid(F, R)) - 48  ' adjust so numerals are correct
    If V > 9 Then X(Q \ 8, Q Mod 8) = (3 + (V \ 8 = V / 8)) * Sgn(48 - V): V = 1 ' get piece type (2/3) and colour (+/-); set for single column step
    Q = Q - V * (V > 0) ' increment column (unless slash)
Wend
'Evaluate maze
X(7, 0) = 1             ' a1 is accessible
For W = 0 To 2000       ' 1920 = 30 passes x 8 rows x 8 columns, golfed to 2E3
    Q = W Mod 8         ' extracting column
    P = W \ 8 Mod 8     ' extracting row
    For T = Q + (Q > 0) To Q - (Q < 7)     ' loop on nearby columns Q-1 to Q+1 with edge awareness
        For S = P + (P > 0) To P - (P < 7) ' loop on nearby rows (as above)
            If X(S, T) = 0 Then X(S, T) = (1 = X(P, Q)) * (6 > X(P, T) * X(S, Q)) ' approve nearby empty squares if current square approved and access is possible
        Next 'S
    Next 'T
Next 'W
MazeAssess = X(0, 7)    ' report result for h8
End Function

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 Calloctets 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' Nextinstruction Compund perd quelques octets


Par 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.

3 planches réussies 3 planches bloquées

Quelques tableaux de défis: h8 est accessible dans les deux:

  • P1Pq2p1 / 1P1R1R1p / 1K2R1R1 / 1p1p1p2 / p1b1b1np / 1B1B1N1k / Q1P1P1N1 / 1r1r1n2 - 10 passes à résoudre
  • P1P3r1 / 1P1R2r1 / 1N1R1N2 / 1P1P1P2 / 1n1p1ppp / 1B1B4 / 1b1pppp1 / 1P6 - un chemin sinueux
Joffan
la source
1
Très bien, et +1, mais: (1) Êtes-vous sûr que 960 étapes suffisent? (2) Pouvez-vous économiser quelques octets en regardant le tableau à l'envers? If V>9 Then X(7-P,C)=devrais-je penser (pas que je connaisse VBA) devenir If V>9 Then X(P,C)=.
msh210
En fait, cette technique permet d'économiser l'initialisation de P, alors merci d'avoir demandé :-). Et oui, je suis sûr que 15 passes du tableau suffisent; J'ai fait pas mal de vérifications. En fait, je n'ai pas pu pousser au-delà de 10 passes, mais 640 et 960 ont le même nombre de caractères, donc je vais jouer prudemment. MAIS si je bult la planche à l'envers, cela POURRAIT prendre plus de 10 passes, et peut-être plus de 15 - à moins que je ne traverse également la planche à l'envers, ce qui aurait des frais généraux.
Joffan
@ 1 msh210 observation supplémentaire - 15 boucles est juste assez pour analyser l'ensemble du conseil, le pire des cas, mais 10 boucles est suffisant pour obtenir le statut de H8, j'ai donc une grande marge vraiment. La raison en est que la recherche de chemins fonctionne beaucoup plus rapidement dans le sens de l'évaluation, augmentant le nombre de lignes et de colonnes - tant que le chemin va vers le haut ou vers la droite, il sera terminé en un seul passage. Aller à gauche ou en bas ne fait qu'un pas de plus par passage.
Joffan
@ msh210 Dans le cadre d'une refonte du processus de lecture - qui a gardé étroitement la possibilité de laisser un commentaire sur la fin de la chaîne FEN - j'ai ajouté l'inversion de la carte que vous avez suggérée - certaines cartes prennent maintenant plus de 15 passes (jusqu'à 17), donc la fonction est passée à 30 passes de la planche.
Joffan
@Joffan vous pouvez déposer 3 octets en condensant toutes les instances de [some non-letter character] Toà[some non-letter character]To
Taylor Scott
3

Matlab, 636 887 octets 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.

function[n] = h(x)
o=[];
for i=x
 b={blanks(str2num(i)),'K','k',i};o=[o b{~cellfun(@isempty,regexp(i,{'\d','[NBRQK]','[nbrqk]','p|P'}))}];
end
o=fliplr(reshape(o,8,8))
for i=1:64
 b=i-[-8,8,7,-1,-9,1,9,-7];
 if mod(i,8)==1
  b=b(1:5);
 elseif mod(i,8)==0
  b=b([1,2,6:8]);
 end
 b=b(b<65&b>0);c=o(b);dn=b(isspace(c)&ismember(b,i-[9,7,-9,-7]));
 for j=dn
  g=o(b(ismember(b,j-[-8,8,7,-1,-9,1,9,-7])));
  if ~isempty(regexp(g,'pk|kp|PK|KP|kk|KK'));c(b==j)='X';end;
 end
 Bc{i}=b(c==32);
end
n=Bc{1};
on=[];
while length(n)>length(on)
 on=n;
 for i=1:length(n)
  n=unique([n Bc{n(i)}]);
 end
end
any(n==64)
end

Lit une chaîne de tableau xcomme spécifié ci-dessus et la transforme en la plus complètement représentée o, 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.

sintax
la source
1
Cool. L'avez-vous testé par rapport à mes exemples de FEN dans la question pour vous assurer qu'il renvoie le résultat correct pour chacun? De plus, comme c'est une question de code-golf , vous devriez vraiment jouer au golf. Si rien d'autre, pouvez-vous vous débarrasser de l'indentation (ou en faire un seul espace ou tabulation au lieu de quatre espaces)? et / ou laisser tomber les espaces autour du =s? (Je ne sais pas MATLAB: peut-être que ce sont impossibles.)
msh210
Ouais, et je pourrais faire une partie de ça pendant ma prochaine pause. Je l'ai testé contre tous vos exemples et puis certains. Dois-je l'indiquer d'une manière ou d'une autre?
sintax
Dunno; Je me demandais juste.
msh210