Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# -*- coding: utf-8 -*-
2"""
3@file
4@brief Implémentation de la résolution de l'énigme d'Hermionne (Harry Potter tome 1)
5"""
8def solution_correcte(sol):
9 """
10 Cette fonction reçoit un tableau de 7 cases,
11 chaque case contient un entier compris entre 0 et 3 inclus :
12 0 : poison, 1 : vin, 2 : reculer, 3 : avancer
13 la fonction détermine si l'agencement proposé dans *sol*
14 vérifie les cinq règles de l'énoncé,
15 retourne *True* si toutes les règles sont vérifiées
16 ou *False* si l'une des règles n'est pas vérifiée.
17 Rappel : les indices vont de 0 a 6 inclus car il y a 7 cases.
18 """
20 # règle 1
21 nb = [0, 0, 0, 0]
22 for s in sol:
23 nb[s] += 1
24 if nb[0] != 3:
25 return False # 3 poison
26 if nb[1] != 2:
27 return False # 2 vin
28 if nb[2] != 1:
29 return False # 1 reculer
30 if nb[3] != 1:
31 return False # 1 avancer
33 # règle 2
34 for i in range(1, len(sol)):
35 if sol[i] == 1 and sol[i - 1] != 0:
36 return False
38 # règle 3
39 if sol[0] == sol[6]:
40 return False
41 if sol[0] == 3:
42 return False
43 if sol[6] == 3:
44 return False
46 # règle 4
47 if sol[2] == 0:
48 return False
49 if sol[5] == 0:
50 return False
52 # règle 5
53 if sol[1] != sol[5]:
54 return False
56 # si on arrive ici, c'est que toutes les règles sont vérifiées
57 return True
60def affiche_solution(sol):
61 """
62 Retourne une chaîne de caractères qui représente la solution.
63 """
64 a = ["poison", "vin", "reculer", "avancer"]
65 res = ""
66 for s in sol:
67 res += "{0}, ".format(a[s])
68 return res
71def solution():
72 """
73 Parcourt toutes les configurations possibles
74 et s'arrête à la première qui satsifait toutes les règles.
76 ::
78 from ensae_teaching_cs.special.hermionne import solution, affiche_solution
79 res = solution()
80 print(affiche_solution(res))
81 """
82 sol = [0, 0, 0, 0, 0, 0, 0]
83 while sol[0] < 4:
84 r = solution_correcte(sol)
85 if r:
86 return sol
88 sol[6] += 1
89 # on parcourt les indices en, allant de 6 à 1 inclus
90 for i in range(len(sol) - 1, 0, -1):
91 if sol[i] >= 4:
92 sol[i] = 0
93 sol[i - 1] += 1
96if __name__ == "__main__":
97 ressol = solution()
98 print(affiche_solution(ressol))