Présentation du solitaire
L’article qui suit est très inspiré de l’article A Solitaire Game and its Relation to a Finite Field de N. G. de Bruijn. J’ai choisi de remplacer l’utilisation du corps
Le jeu du solitaire est un jeu sur plateau bien connu. Des pions sont disposés dans des trous disposés sur un plateau. L’objectif est de déplacer les pions (cf. ci-dessous) de manière à ce qu’il ne reste plus qu’un pion à la fin.
Il existe plusieurs variantes de ce jeu tenant à la disposition des trous sur le plateau et aux positions initiales des jetons dans ces trous. On distinguera dans cet article les deux variantes suivantes. Vous pouvez même y jouer (cliquer ou appuyer sur les pions)! 1
Solitaire anglais
Solitaire français
Repérage
Pour ce qui suit, on va repérer les emplacements des trous à l’aide de coordonnées. On utilise des axes centrés sur le trou central mais ceci importe peu en fait. Voici par exemple le repérage des trous pour la version française du solitaire.
Mouvements
On peut déplacer un pion vers un trou pour supprimer un autre pion en utilisant un des 4 déplacements suivants (vers la droite, la gauche, le bas ou le haut).
L’anneau
On introduit maintenant quelques objets mathématiques. On rappelle que
On considère alors l’ensemble suivant.
On prouve aisément que
- si
, ; - si
, ; - si
, .
On peut notamment définir une fonction Python calculant les coordonnées de
def coord(n):
if n % 3 == 0:
return (1, 0)
if n % 3 == 1:
return (0, 1)
if n % 3 == 2:
return (-1, -1)
On dira que
Deux invariants
On s’intéresse maintenant à deux quantités qui possèdent des propriétés de conservation au cours du jeu. On note
Ce qui précède montre que, quelque soit
def A(S):
c = [coord(k + l) for k, l in S]
return sum(a for a, b in c), sum(b for a, b in c)
def B(S):
c = [coord(k - l) for k, l in S]
return sum(a for a, b in c), sum(b for a, b in c)
Nous allons d’abord regarder l’effet sur
- un pion a disparu en
; - un pion a disparu en
; - un pion est apparu en
.
Finalement,
On laisse le lecteur vérifier qu’il en est de même lors du mouvement d’un pion vers la gauche, le haut ou le bas. Finalement, la classe de congruence modulo 2 de
Positions finales gagnantes possibles
Notons
A l’aide de Python
On peut tout d’abord employer Python pour tester tous les emplacements des trous.
def possible(S, P):
def mod(t): return t[0] % 2, t[1] % 2
A0 = mod(A(S))
B0 = mod(B(S))
return [(k, l) for k, l in P
if mod(A([(k, l)])) == A0 and mod(B([(k, l)])) == B0]
Solitaire anglais
S = [(k, l) for k in range(-3, 4) for l in range(-3, 4)
if (abs(k) <= 1 or abs(l) <= 1) and (k, l) != (0, 0)]
P = S + [(0, 0)]
print(possible(S, P))
Les positions gagnantes finales possibles sont
Solitaire français
S = [(k, l) for k in range(-3, 4) for l in range(-3, 4)
if (abs(k) + abs(l) <= 4) and (k, l) != (0, 1)]
P = S + [(0, 1)]
print(possible(S, P))
Les positions gagnantes finales possibles sont
A la main
On peut également déterminer les positions gagnantes finales possibles “à la main”.
Pour calculer les valeurs de
Solitaire anglais
En utilisant cette dernière remarque, on calcule aisément
Une éventuelle position finale gagnante
- si
, ; - si
, ; - si
, .
On en déduit que
Solitaire français
Comme précédemment, on calcule facilement
- si
, ; - si
, ; - si
, .
Une éventuelle position finale gagnante
On peut également remarquer que si la position laissée libre initialement, n’est pas la position
-
Pour ceux que ça intéresse, il s’agit d’une application écrite dans le langage fonctionnel Elm et disponible sur le dépôt https://github.com/lgarcin/SolitaireElm. ↩