Jack et Jane ont décidé de jouer aux échecs pour s'absenter. Malheureusement, Jack est plutôt mauvais à visualiser. Il trouve difficile de comprendre les mouvements possibles pour une pièce donnée autre qu'un pion, bien sûr!
Votre défi consiste à aider Jack à trouver les options possibles pour une pièce donnée (autre qu'un pion).
En cas d'oubli, les différentes pièces sont désignées par:
- K: King
- Q: Reine
- N: Knight
- B: évêque
- R: Tour
À titre d'exemple, dans l'image du chevalier est situé à d4
et peut se déplacer à c2
, b3
, b5
, c6
, e6
, f5
, f3
, e2
. Pour une entrée donnée:
Nd4
vous produiriez:
Nc2 Nb3 Nb5 Nc6 Ne6 Nf5 Nf3 Ne2
Règles:
- L'ordre de sortie n'a pas d'importance tant que tous les mouvements possibles sont répertoriés
- Les déplacements possibles peuvent être séparés par des espaces, des sauts de ligne ou tout autre délimiteur
- L'entrée peut être transmise au programme en tant que paramètre ou via
STDIN
- Les espaces dans le programme doivent être comptés, alors utilisez-les de manière optimale
C'est le golf de code. (Veuillez éviter d'utiliser des outils / utilitaires spécialement conçus à cet effet.) La réponse la plus courte l'emporte!
f(x)... case "Q": {f("B");f("R")}
si la fonction nécessite un #includes, ceux-ci devraient faire partie du nombre d'octets.Réponses:
GolfScript,
9493 caractèresMon tout premier programme GolfScript! Cela m'a pris plusieurs heures à tâtonner sans vraiment savoir ce que je faisais, mais j'ai persisté et je pense que j'ai réussi à apprendre les bases de la langue et à le jouer assez bien.
Entièrement golfé :
Source commentée et plus agréable :
Cela peut ressembler à la réponse de Claudiu, parce que j'ai référencé sa réponse, ainsi que ma solution C (non soumise), tout en faisant la mienne. Il a fourni un bon exemple d'un programme GolfScript (relativement) complexe et fonctionnel, et cela m'a aidé à en apprendre beaucoup sur le langage. Alors merci, Claudiu!
Étant encore nouveau sur GolfScript, si vous avez des commentaires, j'apprécierais de l'entendre!
la source
Python,
217212220217213 caractèresLié la solution Mathematica à 213 octets
J'ai commencé par générer tous les mouvements valides mais qui sont devenus trop importants, donc l'approche est assez similaire à celle de Mathematica.
la source
Mathematica,
278272264260215213 caractèresVersion non golfée:
Exemple d'utilisation:
La version non golfée crée une carte complète, puis sélectionne les positions correctes avec
Cases
, tandis que la version golfée supprime immédiatement les mouvements invalides dans laTable
commande en émettant##&[]
, ce qui disparaît simplement.la source
N4d
? Ne devrait-il pas en être ainsiNd4
?Nd4
.ChessboardDistance
Abs
dans Mathematica, car elles dénotent des alternatives dans un motif.Haskell
225 220 208 205 200182Ça va être difficile de toucher à Mathematica quand cela aura des mouvements d'échecs intégrés: rollseyes: (bien joué m.buettner)Je reprends tout. Battre Mathematica par 31!Dernière modification: cas remplacé par une fonction, filtre intégré à la compréhension, pour battre l'entrée dans R;)
usage:
Non golfé (correspond à la version 208 caractères avant que le «u» ne soit inséré):
la source
piece
à la liste[piece,newfile, newrank]
si vous ne l'utilisez pas dans la correspondance de motifs, pouvez-vous enregistrer certains caractères?Bash, 238
Comment ça marche
L'idée est de représenter chaque champ du tableau par une valeur numérique, en prenant ses coordonnées comme un nombre en base 20 et en soustrayant 200. De cette façon,
a1
devient20 * 10 + 1 - 200 = 1
,h8
devient20 * 17 + 8 - 200 = 148
, etc.Maintenant, les mouvements possibles de l'évêque peuvent être représentés par des multiples (positifs ou négatifs) de 19 - même quantité de pas vers le haut (+20) et vers la gauche (-1) - ou 21 - même quantité de pas vers le haut (+20 ) et à droite (+1).
Le placement de la figure après le mouvement est simplement la somme de sa position d'origine et du mouvement. Après avoir ajouté ces chiffres, nous devons vérifier si leur somme correspond à un champ valide sur le tableau.
Étant donné que la base (20) est plus de deux fois plus grande que le nombre le plus élevé possible (8), la somme ne peut pas enrouler autour de la planche, par exemple, déplacer Bh1 de sept pas vers la droite et vers le haut entraînera une position de planche invalide.
La ligne
énumère tous les mouvements possibles des pièces qui sont représentées par des nombres positifs.
Les commandes
stocke l'identifiant de la pièce dans la variable a , la représentation numérique de la position d'origine dans b et les lettres a à h dans le tableau d .
Après l'expansion de l'accolade,
eval{,} echo '$'$a
devienteval eval echo '$'$a
(doublement mauvais), qui évalue à, par exempleeval echo $K
, qui évalue àecho 1 19 20 21
.for i in $c -${c// / -};do …; done
boucle sur tous les mouvements possibles et leurs homologues négatifs.echo $a${d[$[(i+=b)/20]]}$[i%20]
donne la position finale après le mouvement.grep '[a-h][1-8]$'
s'assure que nous avons un poste de conseil valide.la source
Golfscript,
144135 caractèresAu lieu de continuer à essayer de jouer au golf avec ma solution Python , je l'ai traduite en Golfscript:
Traduction simple sans beaucoup de golf, il peut donc être encore plus réduit. Prend l'entrée de stdin sans nouvelle ligne, essayez-le ici (les deux premières lignes sont pour imiter stdin).
la source
C
634632629625600 caractèresDes suggestions sur la façon d'améliorer cela? C'est la première fois que je soumets une réponse.
la source
C
peut être grandement simplifié en utilisant l'opérateur ternaire?:
et en utilisant la valeur de retour deprintf
. (printf
renvoie le nombre de caractères écrits, dans ce cas, il est toujours différent de zéro.)C(P,c,r){return(0<=c)&(c<8)&(0<r)&(r<9)?printf("%c%c%d ",P,c+'a',r):0;}
. Une modification mineure: il y a un espace supplémentaireM
après celuiif
que vous pouvez supprimer.Haskell,
300269 caractèresMerci à bazzargh pour son aide à perdre 31 personnages ...
Même algorithme que la version Mathematica. Exemple de sortie de ghci:
(Vous n'avez pas demandé de vérification d'esprit!)
la source
Haskell, 446 caractères
Appelé à l'aide de la
j
fonctionJe n'ai pas travaillé avec Haskell depuis quelques mois, donc cela n'a pas été aussi court que la plupart des autres solutions, mais je suis sûr qu'il y a des optimisations à faire, principalement avec
h
. Je pourrais le raccourcir un peu.la source
q & k [
311262 caractères]Il y a un potentiel de réduction de quelques caractères supplémentaires. Je vais le réduire à la prochaine itération.
Usage
Tour
Roi
Chevalier
Évêque
Reine
la source
R, 203 caractères
Version non golfée:
Usage:
La solution est même bien lisible. Cependant, j'ai ajouté des parenthèses et des commentaires pour les lecteurs peu familiers avec le code R (sur la version non golfée).
la source
Haskell (hypothétique), 248 caractères
Malheureusement, chaque compilateur Haskell sur lequel je peux mettre la main en ce moment a des problèmes avec les littéraux de chaîne Unicode. Voici la version (plus longue) qui fonctionne réellement:
La définition
h x y=...
est une fonction de hachage; les mouvements valides hachent les numéros de caractères qui sont dans la chaîne de 41 caractères. Cela supprime la nécessité d'une déclaration "case" ou équivalent.Je ne prévois pas de continuer à travailler là-dessus pour le moment. Ce serait amusant de voir si quelqu'un peut utiliser une fonction de hachage dans un langage plus concis pour faire une solution plus courte.
la source