Votre but est d'écrire un joueur parfait pour le jeu de Wythoff's Nim .
Les règles du Nim de Wythoff
Le Nim de Wythoff est un jeu déterministe à deux joueurs joué avec deux piles de jetons identiques. Les joueurs alternent les tours, au cours desquels ils effectuent l'une de ces actions:
- Retirez un ou plusieurs jetons de la première pile
- Retirez un ou plusieurs jetons de la deuxième pile
- Retirez un nombre égal de jetons (un ou plusieurs), à la fois de la première pile et de la deuxième pile.
Bien sûr, les piles ne peuvent pas devenir négatives, mais elles peuvent atteindre 0. Quel que soit le joueur qui enlève le dernier compteur, il gagne la partie.
Pour les plus géométriques, voici une formulation équivalente du jeu que vous pouvez jouer sur cette applet . Une seule reine commence sur un carré d'un échiquier quart infini dont le coin est en bas à gauche. Les joueurs alternent en déplaçant la reine, qui se déplace comme une reine d'échecs mais limitée à trois directions:
- Vers le bas
- La gauche
- En diagonale vers le bas et à gauche
Celui qui déplace la reine dans le coin gagne.
Associer les coordonnées de la reine (avec coin (0,0)
) aux tailles des piles respectives, il est facile de voir que les deux jeux sont identiques.
Jeu parfait
(Vous pouvez ignorer cela si vous êtes familier avec les notions de jeu parfait et de coups gagnants.)
Puisque le Nim de Wythoff est un jeu fini et déterministe, il a une notion de jeu parfait . Un joueur parfait est une stratégie qui gagnera toujours d'une position théoriquement gagnée, c'est-à-dire une position dans laquelle il existe une stratégie qui garantit une victoire.
Pour être une stratégie gagnante, il suffit de se déplacer pour toujours passer à une position gagnante théorique pour le joueur qui vient de bouger, et donc le joueur qui ne passe pas ensuite. Les premières de ces positions gagnantes (également appelées positions froides ) sont (0,0), (1,2), (2,1), (3,5), (5,3)
. Voir l'article Wikipedia pour une explication d'un algorithme pour trouver une stratégie gagnante pour le Nim de Wythoff, ainsi qu'une formule pour générer des positions gagnantes.
Exigences du programme
Écrire un programme ou une fonction prend une position en entrée et sort un coup gagnant sous la forme de la position après ce coup. Le moins d'octets gagne.
S'il n'y a pas de coup gagnant, c'est-à-dire que la position est une perte théorique, votre programme devrait l'indiquer et être annulé.
Votre programme doit s'exécuter dans un délai raisonnable. Ainsi, une recherche exponentielle récursive d'arbre de jeu ne suffira pas. Si vous souhaitez précalculer et coder en dur une stratégie, c'est très bien.
Contribution
Une paire (i,j)
de nombres non négatifs représentant au maximum la taille des tas 99
. Cela peut être deux nombres, un tuple, une liste ou tout autre conteneur que vous préférez.
Production
Imprimez ou affichez la position après votre déménagement, à nouveau sous la forme de deux chiffres ou d'un conteneur de celle-ci. Cela doit être un mouvement légal vers une position gagnante. S'il y a plusieurs de ces mouvements, tout le monde va bien, mais un seul.
S'il n'y a pas de coup gagnant, vous devez l'indiquer dans la sortie. Toute sortie comme False
, None
, 0, ou (-1,-1)
fera, aussi longtemps que ce n'est pas une situation juridique, et est la même pour chaque entrée perdante.
Exemple d'exécutions
f(5,0) = (0,0)
f(2,2) = (1,2) # Or (2,1) or (0,0)
f(1,2) = False
f(13,9) = (13,8) # Or (10,6)
f(10,6) = False
f(5,10) = (5,3)
f(25,30) = (8,13)