Problème:
Aux échecs, il existe une règle assez bien connue concernant le tirage par répétition. Si la même position est répétée 3 fois (ou plus) alors le joueur ayant l'intention de faire le coup qui provoquera cette répétition peut réclamer un match nul.
Parfois, c'est une tâche facile pour un arbitre de repérer, si les derniers mouvements ne sont que les joueurs se déplaçant en arrière et en avant. Parfois, c'est moins trivial, lorsque les pièces se sont déplacées de manière significative entre des positions répétées.
Le problème dans ce défi est de produire une valeur vraie si la position revendiquée est dessinée par répétition (a été vue 3 fois ou plus) et une valeur de falsey si la position revendiquée n'est pas dessinée par répétition, étant donné une liste de mouvements en notation coordonnée comme décrit ci-dessous, ou toute notation de votre choix (mais vous devrez convertir les cas de test).
Qu'est-ce qu'un poste?
Dans un scénario du monde réel, la position serait affectée par des choses telles que si un joueur peut roquer ou si le passage est possible; vous ne devez pas en tenir compte dans votre solution au problème. Dans ce problème, une position est définie simplement par la configuration des pièces sur la planche. Ainsi, pour les besoins de ce problème, deux positions sont considérées comme identiques si chaque carré des deux planches est occupé par le même type de pièce de la même couleur. Il n'est pas nécessaire que ce soit la pièce exacte, par exemple les chevaliers blancs pourraient échanger des carrés et si toutes les autres pièces remplissent les critères, ce serait toujours la même position.
À quoi ressemble une notation valide?
Bien que je vais continuer à expliquer la notation des coordonnées, vous êtes libre de saisir les informations par un système de notation que vous choisissez. À condition que:
- Chaque élément de la notation décrit tout ou partie: de la ou des pièces concernées; si le chèque, le mat, le double contrôle, le mat et le blocage ont été livrés; si une capture en passant s'est produite; la position initiale; la position finale.
- Vous ne pouvez pas avoir d'informations sur la répétition dans votre notation.
Donc, tant que ces critères sont remplis, je suis heureux d'accepter, tant que vous spécifiez dans votre réponse, votre système de notation. Cela peut être par exemple 0 ligne indexée, tuples de colonne ou tout ce qui a du sens pour votre programme.
Notation de coordonnées
La notation des coordonnées est une notation qui décrit purement les mouvements comme un système de coordonnées.
Un déplacement est décrit comme étant d'abord la coordonnée initiale de l'ensemble {A1-H8}
, puis à nouveau la coordonnée de destination du même ensemble. Ainsi, le King's Gambit ressemblerait (comme une collection de cordes)
{"E2-E4","E7-E5","F2-F4"}
Je crois que c'est la meilleure notation à utiliser pour ce problème car elle n'est pas jonchée d'informations étrangères comme si la vérification a eu lieu ou quel est le type de pièce en mouvement. Comme mentionné précédemment, la notation peut être de votre choix, vous pouvez donc utiliser une autre notation, par exemple la notation algébrique ou vous pouvez adapter cette notation (par exemple, supprimer les tirets ou prendre comme liste de tuples)
Règles:
- Vous ne devez pas considérer si une position ou un mouvement est valide, mais seulement s'il provoque la répétition
- Vous pouvez supposer que la promotion du roque et du pion n'aura pas lieu.
- Vous devez prendre une liste de chaînes en entrée et sortir une valeur true ou falsey correspondant à la troisième (ou plus) répétition qui s'est produite lors du dernier mouvement.
- Le jeu commence toujours à la position de départ standard pour les échecs. La position initiale peut compter pour la répétition.
- Le tirage par répétition n'a pas eu lieu si la position n'est pas répétée par le coup final
Règles générales:
- C'est le code-golf , donc la réponse la plus courte en octets l'emporte.
Ne laissez pas les langues de golf de code vous décourager de publier des réponses avec des langues non-golfeur de code. Essayez de trouver une réponse aussi courte que possible pour «n'importe quel» langage de programmation. - Des règles standard s'appliquent à votre réponse avec des règles d'E / S par défaut , vous êtes donc autorisé à utiliser STDIN / STDOUT, des fonctions / méthodes avec les paramètres appropriés et des programmes complets de type retour. Ton appel.
- Les failles par défaut sont interdites.
- Si possible, veuillez ajouter un lien avec un test pour votre code (par exemple TIO ).
- De plus, l'ajout d'une explication à votre réponse est fortement recommandé.
Cas de test
Vous devez renvoyer des valeurs véridiques pour:
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8"}
{"B1-C3","B8-C6","D2-D4","D7-D5","D1-D3","D8-D6","C3-B1","C6-B8","B1-C3","B8-C6","D3-D1","D6-D8","D1-D3","D8-D6"}
{"D2-D4","B8-C6","E2-E4","C6-D4","D1-E2","D4-E6","E2-F3","E6-D4","F3-D1","D4-C6","D1-E2","C6-D4","E1-D1","D4-C6","D1-E1","C6-D4"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3"}
Et les valeurs de falsey pour:
{}
{"E2-E4","E7-E5","F2-F4"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","F2-F4","F7-F5"}
{"E2-E4","E7-E5","G1-F3","B8-C6","F1-C4","G8-F6","F3-G5","D7-D5","E4-D5","F6-D5","G5-F7"}
{"D2-D4","B8-C6","E2-E4","C6-D4","D1-E2","D4-C6","E2-D1","C6-D4","D1-E2","D4-C6","E2-D1"}
{"B1-C3","B8-C6","C3-B5","C6-B4","B5-D4","B4-D5","D4-C6","D5-C3","C6-B8","C3-B1","B8-C6","B1-C3","C6-B8","C3-B1"}
{"E2-E4","E7-E5","D1-E2","E8-E7","E1-D1","D8-E8","E2-E1","E7-D8","E1-E2","E8-E7","E2-E1","E7-E8"}
C6-B8
la position initiale s'est produite trois fois.