• Aucun résultat trouvé

Casse-tête de décembre 2016 Ce mois-ci

N/A
N/A
Protected

Academic year: 2022

Partager "Casse-tête de décembre 2016 Ce mois-ci"

Copied!
5
0
0

Texte intégral

(1)

Casse-tête de décembre 2016

Ce mois-ci, vous êtes invité à aider Puce dans deux parties de billes qu’il joue contre Zig.

1ère partie

Douze billes sont réparties sur une même rangée avec une seule bille dans la première case, une case vide et les onze autres billes qui sont accolées les unes aux autres dans les cases restantes.

A tour de rôle, Zig et Puce enlèvent une seule bille ou deux billes adjacentes (c’est à dire sans case qui les sépare). Le gagnant est celui qui enlève la dernière bille ou les deux dernières billes adjacentes.

Zig commence la partie. Qui est gagnant?

2ème partie

Même casse-tête avec la configuration de départ qui est la suivante: dix billes sont réparties sur une même rangée de treize cases en quatre lots de 1,2,3 et 4 billes accolées les unes aux autres.

Puce commence la partie. Qui est gagnant?

Pour les plus courageux:

Variante dite "Misère": le perdant est celui qui enlève la dernière bille. Puce commence la partie. Qui est gagnant?

Solution proposée par Pellicer Simon 1ère partie

Si Zig commence alors Zig gagne.

Ce jeu revient à considérer un jeu de Nim dans lequel on peut prendre au maxi- mum 2 anneaux. Chaque fois qu’il y a un espace vide dans le plateau de jeu on peut considérer que c’est la fin d’un pilier. Par exemple dans la 1ère partie il y a deux piliers. Le premier contient 1 anneau et le deuxième en a 11. On peut penser que cela change la stratégie du jeu de Nim puisque l’on peut prendre des anneaux au milieu d’un pilier et ainsi rajouter des piliers. Par exemple si dans la 1ère partie on prend les billes 4 et 5 alors on se retrouve avec 3 piliers chacun ayant respectivement 1,1,9 anneaux.

Même si l’on peut rajouter des piliers, cela ne change rien. Effectivement sup- posons que l’on enlèvex anneaux au milieu d’un pilier contenant un total de y anneaux. On se retrouve alors avec deux piliers chacun ayant un nombre d’anneaux< y. Donc il semble évident que si l’on a une position perdante il est impossible de jouer pour donner une position perdante à son adversaire. Car si c’était le cas cela voudrait dire que l’écriture en binaire dey serait la même pour un nombre<y ce qui est impossible.

Ainsi les propriétés du jeu de Nim sont les mêmes que pour ce jeu.

Dans la position ci contre on a : 1 = 1 en base 2

11 = 1011 en base 2

Donc la position gagnante puisqu’il y deux colonnes dans lesquel il y a un nom- bre impair de chiffres 1.

(2)

2ème partie

Si Puce commence alors Puce gagne. On sépare comme précedemment la partie en piliers d’anneaux. On a :

1 = 1 en base 2 2 = 10 en base 2 3 = 11 en base 2 4 = 100 en base 2

Donc la position est gagnante puisqu’il y a une colonne dans laquelle il y a un nombre impair de chiffres 1.

Misère 1ère partie

Si Zig commence alors Zig gagne.

Cette variante en faite est presque similaire à la précedente. La seule différence est la condition de la stratégie gagnante qui change. C’est tout simplement le contraire de la stratégie gagante précédente. On cherche donc à savoir si il existe au moins une colonne contenant un nombre pair de chiffres 1.

1 = 1 en base 2 11 = 1011 en base 2

Donc la position est gagnante puisqu’il y a deux colonnes dans lesquelles il y a un nombre pair de chiffres 1.

2ème partie

Si Puce commence alors Puce gagne.

1 = 1 en base 2 2 = 10 en base 2 3 = 11 en base 2 4 = 100 en base 2

Donc la position est gagnante puisqu’il y a deux colonnes dans lesquelles il y a un nombre pair de chiffres 1.

Voici d’ailleurs une proposition d’une IA pour ce jeu (pour la variante "Nor- male"). On peut rentrer n’importe quelle position initiale. Par exemple pour rentrer la position initiale de la première partie je dois entrer : O OOOOOOOOOOO, donc les O (o majuscule) correspondent aux billes et les " "(sans les guillemets) à des espaces vides. Si je veux jouer mon coup je dois entrer la nouvelle position après que mon coup ait été jouer. Par exemple dans la position suivante : O O O

si je veux enlever la dernière bille alors j’entre : O O

L’IA est disponible à l’adresse suivante : https://goo.gl/T pd0IM Cliquez sur compile puis sur execute.

Voici le code :

1 #include<iostream>

2 #include<vector>

(3)

3

4 using namespace std;

5 vector<int> bina(int n)

6 {

7 int r(0);

8 vector<int>b;

9 do{

10 r = n%2;

11 b.push_back(r);

12 n = (n-r)/2;

13 }while(n!=0);

14

15 return b;

16 }

17 bool sepe(string pos)

18 {

19 vector<vector<int> >binary;

20 vector<int>number;

21 int si(0);

22 for(int i=0;i<pos.size();++i)

23 {

24 if(pos[i] == ’O’){

25 si++;

26 }

27 else{

28 if(si!=0){number.push_back(si);}

29 si = 0;}

30 }

31 if(si!=0){number.push_back(si);}

32 for(int j = 0;j<number.size();++j)

33 {

34 binary.push_back(bina(number[j]));

35 }

36 size_t biggest(0);

37 for(int k = 0;k<binary.size();++k)

38 {

39 if(binary[k].size() > biggest)

40 {

41 biggest = binary[k].size();

42 }

43 }

44 for(int l = 0;l<binary.size();++l)

45 {

46 if(binary[l].size()!=biggest)

47 {

48 for(int m = 0;m<biggest-binary[l].size();++m)

49 {

50 binary[l].push_back(0);

51 }

52 }

(4)

53 }

54 int countt(0);

55 for(int t = 0;t<biggest;++t)

56 {

57 countt = 0;

58 for(int f = 0;f<binary.size();++f)

59 {

60 if(binary[f][t] == 1)

61 {

62 countt++;

63 }

64 }

65 if(countt%2 != 0 && countt != 0){return true;}

66 }

67 return false;

68 }

69 string allPossible(string pos)

70 {

71 string answer("");

72 string all;

73 vector<string>possible;

74 for(int i = 0;i<pos.size()-1;++i)

75 {

76 all = pos;

77 if(pos[i] == ’O’)

78 {

79 all[i] = ’ ’;

80 possible.push_back(all);

81 all = pos;

82 }

83 if(pos[i] == ’O’ && pos[i+1] == ’O’)

84 {

85 all[i] = ’ ’;

86 all[i+1] = ’ ’;

87 possible.push_back(all);

88 }

89 }

90 all = pos;

91 if(pos[pos.size()-1] == ’O’)

92 {

93 all[pos.size()-1] = ’ ’;

94 possible.push_back(all);

95 }

96 for(int i = 0;i<possible.size();++i)

97 {

98 answer = possible[i];

99 if(sepe(answer) == false)

100 {

101 return answer;

102 }

(5)

103 }

104 return answer;

105 }

106 bool win(string pos)

107 {

108 for(int i = 0;i<pos.size();++i)

109 {

110 if(pos[i] != ’ ’)

111 {

112 return false;

113 }

114 }

115 return true;

116 }

117 int main()

118 {

119 string pos("");

120 string finall("");

121 cout<<"Bienvenue dans le jeu de billes !"<<endl;

122 cout<<"Entrez la position intiale : "<<endl;

123 getline(cin, pos);

124 for(int i = 0;i<pos.size();++i)

125 {

126 finall+=’ ’;

127 }

128 cout<<"Merci !"<<endl;

129 bool winn(false);

130 while(winn == false){

131 cout<<"L\’ordinateur joue : "<<endl;

132 pos = allPossible(pos);

133 cout<<pos<<endl;

134 if(win(pos) == true)

135 {

136 cout<<"L\’ordinateur a gagne !"<<endl;

137 winn = true;

138 }

139 cout<<"Entrez votre coup : "<<endl;

140 getline(cin, pos);

141 if(win(pos) == true)

142 {

143 cout<<"Bravo vous avez gagne !"<<endl;

144 winn = true;

145 }

146 }

147 return 0;

148 }

Références

Documents relatifs

Celle-ci n’est pas locale, car certaines propriétés sont extrinsèques : Sam peut perdre la propriété d’être la plus grande personne dans la salle sans devoir changer sa taille

Q2 Cent enfants ont chacun cent billes dans leur cartable et s'adonnent au jeu suivant : à chaque tour, un enfant choisit un groupe d'enfants (dans lequel il y a au moins un enfant)

Ce mois-ci, il suffit de bien observer cette étoile à treize branches dans laquelle trois droites ou plus ne sont jamais concourantes afin de déterminer la somme des angles (marqués

[r]

La projection du cube sur la sphère partage sa surface en 6 régions « carrés » de surface d’où la mouche ne peut apercevoir qu’une seule face du cube, 12 régions « rectangles

Dans chaque groupe, le professeur demande à un des élèves de placer cinq billes (noires et blanches) dans un gant. L’autre élève qui ne connaît pas la répartition «

Dans chaque groupe, le professeur demande à un des élèves de placer cinq billes (noires et blanches) dans un gant. L’autre élève qui ne connaît pas la répartition «

Les nombres qui seryent â compter par exemple le nombre d'élèves, le nombre de billes sont les nombres entiers nafurels.. Donner deux exemples où on utilise les