Coverage for src/ensae_teaching_cs/special/hermionne.py: 92%

49 statements  

« prev     ^ index     » next       coverage.py v7.1.0, created at 2023-01-27 05:44 +0100

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""" 

6 

7 

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 """ 

19 

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 

32 

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 

37 

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 

45 

46 # règle 4 

47 if sol[2] == 0: 

48 return False 

49 if sol[5] == 0: 

50 return False 

51 

52 # règle 5 

53 if sol[1] != sol[5]: 

54 return False 

55 

56 # si on arrive ici, c'est que toutes les règles sont vérifiées 

57 return True 

58 

59 

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 += f"{a[s]}, " 

68 return res 

69 

70 

71def solution(): 

72 """ 

73 Parcourt toutes les configurations possibles 

74 et s'arrête à la première qui satsifait toutes les règles. 

75 

76 :: 

77 

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 

87 

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 

94 

95 

96if __name__ == "__main__": 

97 ressol = solution() 

98 print(affiche_solution(ressol))