C'est la fin d'un autre jeu d'échecs bien joué. Vous êtes le joueur blanc et vous avez toujours une tour et votre roi. Votre adversaire n'a plus que son roi.
Puisque tu es blanc, c'est ton tour. Créez un programme pour jouer ce match d'échecs. Sa sortie peut être une séquence de mouvements, une animation gif, de l'art ASCII ou tout ce que vous voulez.
Cela semble assez évident, mais je vais le dire explicitement: vous devez gagner le jeu (en un nombre fini de coups). Il est toujours possible de gagner de cette position. NE PERDEZ PAS CE ROOK. NE PAS STALEMATE.
Votre programme peut accepter ou non une entrée humaine pour la position de départ et pour chaque mouvement noir (vous pouvez supposer en toute sécurité qu'il s'agit d'une position légale, c'est-à-dire que les rois ne se touchent pas). Si ce n'est pas le cas, une position de départ aléatoire et des mouvements aléatoires pour le roi noir suffiront.
But
Votre score sera la longueur en octet de votre code + bonus. N'importe quelle langue est autorisée, le score le plus bas l'emporte.
Prime
-50 si votre programme permet à la fois une position de départ définie par l'homme et une position aléatoire. Les humains peuvent y accéder via stdin, fichier, GUI ...
-100 si votre programme permet à un humain et à un joueur aléatoire de déplacer le roi noir
+12345 si vous comptez sur un solveur d'échecs externe ou une bibliothèque d'échecs intégrée
Bonne chance!
Mise à jour!
Règle supplémentaire: le match doit être joué jusqu'à l'échec et mat. Les noirs ne démissionnent pas, ne sautent pas hors de l'échiquier et ne sont pas kidnappés par des extraterrestres.
Allusion
Vous pouvez probablement obtenir de l'aide sur cette question sur chess.se .
Réponses:
Haskell 1463-100 = 1363
Je reçois juste une réponse. Cela trouve la solution de manière rétrograde, en remontant du mat à la position dans laquelle nous nous trouvons. Elle diffère de la description de l'analyse rétrograde sur la programmation d' échecs - au lieu de commencer avec un ensemble initial et de l'étendre avec des mouvements vers l'arrière jusqu'à ce qu'aucun carré déplacé ne soit visible, il commence par tous les carrés inutilisés et réduit cet ensemble en essayant les mouvements en avant. Cela va être moins efficace en temps que la méthode traditionnelle, mais l'utilisation de la mémoire a explosé pour moi lorsque je l'ai essayée.
Compiler avec
ghc -O2
pour des performances acceptables pour le calcul de la table de fin de partie; le jeu est instantané après le premier coup. Fournissez des carrés de roi blanc, de tour, de roi noir comme arguments. Pour un coup, il veut juste un carré, et en choisira un pour vous si vous appuyez sur Entrée. Exemple de session:Code:
Modifié: code fixe pour se souvenir de la table de fin de partie et utiliser des arguments, donc beaucoup moins pénible à tester à plusieurs reprises.
la source
y
). C'est vraiment évident dans la mesure où le deuxième mouvement n'est pas rapide alors que nous avons déjà considéré l'ensemble de la phase finale. Je pars au pub ce soir mais si j'en ai l'occasion demain je vais rendre ça moins terrible.C, actuellement 2552 caractères non blancs non commentés
Le décompte m'indique que je pourrais jouer au golf en dessous de 2552 caractères totaux, mais étant donné qu'il y a déjà une réponse plus petite (qui sera difficile à battre), j'y réfléchirai attentivement avant de prendre la peine de le faire. Il est vrai qu'il y a environ 200 caractères pour afficher la carte et 200 autres pour vérifier l'entrée utilisateur de la position de départ et du mouvement (dont j'ai besoin pour les tests, mais qui pourrait être éliminé.)
Pas d'arbre de jeu ici, juste un algorithme codé en dur, il se déplace donc instantanément.
Les positions de départ sont entrées dans la colonne (1-8) de la ligne (1-8) numérotée en haut à droite et le programme fonctionne sur le même schéma. Donc, si vous tourniez votre écran de 90 degrés dans le sens inverse des aiguilles d'une montre, il suivrait la notation carrée numérique standard des échecs par correspondance. Les positions où le roi noir est déjà en échec sont rejetées comme illégales.
Les mouvements noirs sont entrés sous la forme d'un nombre de 0 à 7, 0 étant un déplacement vers le nord, 1 vers le nord-est et ainsi de suite dans le sens des aiguilles d'une montre.
Il ne suit pas l'algorithme communément utilisé qui utilise exclusivement la tour sous la protection du roi blanc pour restreindre le roi noir. La tour restreint seulement le roi noir dans un sens vertical (et s'enfuira horizontalement si elle est poursuivie.) Le roi blanc restreint le roi noir en mouvement horizontal. Cela signifie que les deux pièces blanches ne se gênent pas mutuellement.
Il semble que j'ai résolu la plupart des bugs et des boucles infinies possibles, cela fonctionne plutôt bien maintenant. Je jouerai à nouveau avec lui demain et je verrai s'il y a autre chose à réparer.
Voici une finition typique (l'accouplement peut parfois se produire n'importe où sur le bord droit ou gauche de la planche.)
la source
Bash, 18 (ou -32?)
D'accord, c'est une réponse de plaisanterie. Puisque Black est un bon joueur d'échecs et que Black sait que White est aussi un bon joueur d'échecs, il décide que la seule chose sensée à faire est:
Il en résulte un gain blanc, qui répond aux spécifications.
Techniquement, vous pouvez également saisir les positions actuelles en tant qu'arguments, le programme les ignore simplement, donc cela peut sans doute bénéficier du bonus de -50.
la source
1-0
un résultat un peu plus court.