Étant donné une grille de lettres 8x8 représentant l'état actuel d'une partie d'échecs, la tâche de votre programme est de trouver un prochain coup pour les blancs qui se traduit par échec et mat (la réponse sera toujours mate en un coup).
Contribution
L'entrée se fera sur STDIN - 8 lignes de 8 caractères chacune. Les significations de chaque caractère sont les suivantes:
K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square
Les lettres majuscules représentent des morceaux blancs et les minuscules représentent le noir. Le plateau sera orienté de façon à ce que le blanc joue vers le haut et le noir vers le bas.
Production
Un coup pour le blanc qui se traduit par échec et mat, en notation algébrique . Vous n'avez pas besoin de noter quand une pièce a été prise, ni de vous soucier de lever l'ambiguïté entre deux pièces identiques qui peuvent faire le même mouvement.
Exemple d'entrée
Exemple 1
Contribution:
------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------
Production:
c6
Exemple 2
Contribution:
--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-
Production:
Nf5
Exemple 3
Contribution:
---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-
Production:
Rh5
Vous pouvez supposer que la solution n'impliquera pas de roque ou en passant.
C'est le code-golf - la solution la plus courte l'emporte.
(Exemples tirés de mateinone.com - puzzles 81, 82 et 83)
Réponses:
Ruby,
589512510499493 caractèresL'entrée est donnée via stdin, par exemple:
La sortie n'est pas seulement un coup qui force un compagnon en un, mais chaque coup qui le fait.
Edit 1: La fonction
e
n'a été utilisée qu'une seule fois, je l'ai donc insérée. Deuxièmement, l'encodage est maintenant basé sur le numéro 5 au lieu de 10. Et la refactorisation du clonage de la carte a sauvé pas mal de caractères.Edit 2: Toujours pas autant d'améliorations que je voulais. Changer le hachage de
{a=>b,c=>d}
àHash[a,b,c,d]
. Cela coûte 4 caractères mais enregistre un par paire clé-valeur.Edit 3: Seulement des réductions mineures: inline M (4 caractères),
t==?-
->t<?.
(2), suppression du pion en notation algébrique à la fin (2), remplacements put (3). Le programme compte désormais moins de 500 caractères.Edit 4: Il est intéressant de voir combien on peut encore trouver dans un tel programme. Déplacé un invariant hors de la boucle et trouvé un autre calcul en double.
la source
[*$<]
place de$<.map{|l|l}
.