Correction du sujet CCINP 2024, jeu de l'awalé
Q1
Alice ne peut pas jouer les cases 0, 1 et 3 qui sont vides
Alice peut jouer la case 2, 4 et 5. Nous analyserons les possibles récoltes dans les questions suivantes.
Q2
- Si Alice joue la case 2, il n’y a pas de récolte car on n’atteint pas les cases de Bob.
Gain : O.

- Si Alice joue la case 4, elle sème jusqu'a la case 9 après un tour complet, les cases 9,8 et 7 qui contiennent 2 ou 3 graines sont récoltées.
Gain : 8

- Si Alice joue la case 5, elle sème jusqu'à la case 10 qui ne contient qu'une graine et il n'y a donc pas de récolte.
Gain : 0

Q3
Premier cas :
- Si Alice joue la case 5, elle sème jusqu'a la case 10. Cela entrainerait une récolte de toutes les cases de 6 à 10, ce qui affamerait Bob.
La récolte est donc complètement annulée.

Deuxième cas :
- Si Alice joue la case 5, elle sème jusqu'a la case 10. Cela permet la récolte des cases de 6 à 10, car il reste ue graine dans la case 11.
Gain : 10

Q4
La parité jeu['n'] permet de savoir quel joueur doit jouer. Au début de la partie jeu['n'] vaut 0 et c'est au joueur 1 de jouer. Ainsi le joueur 1 joue quand jeu['n'] est pair.
L'opérateur % (modulo) donne le reste de la division euclidienne, ce qui indique la parité avec 2.
Q5
Pour pour permuter les valeurs dans un tableau nous pouvons utiliser la syntaxe Python a, b = b , a qui permet d'échanger les valeurs de deux variables.
| Python | |
|---|---|
Il est aussi possible de permuter plateau[:6], plateau[6:] = plateau[6:], plateau[:6] sans utiliser de boucle.
Q6
Une case ne peut contenir plus que toutes les graines du jeu : 48.
Est-ce un majorant ou un maximum ?
Nous remarquons que \( 2^5 = 32 < 48 < 2^6 = 64\).
Les nombres de 0 Ă 47 se codent donc sur 6 bits.
Q7
Pour chaque valeur du dictionnaire jeu nous utilisons la fonction copy().
| Python | |
|---|---|
Q8
Nous utilisons une quantité graines qui est décrémentée de un à chaque fois que l'on distribue une graine dans une csae qui n'est pas celle jouée.
Q9
La question de la famine est ici éludée, donc la vérification porte sur le coté de la case et son nombres de graines qui doit être 2 ou 3 pour pouvoir être ramassée.
| Python | |
|---|---|
Q10
Il est important de répondre à la question qui demande d'écrire une fonction récursive.
Il faut donc une condition d'arrêt, ici le fait que la case ne soit pas ramassable, ce qui arrête la récolte.
Attention une erreur était présente dans mon corrigé, j'avais oublié de mettre la case ramassée à 0. C'est corrigé.
Q11
Nous voulons tester la famine sans modifier le plateau nous devons simuler la distribution et la récolte et vérifier qu'il reste des graines à l'adversaire.
Pour cela, nous pouvons utiliser une copie du plateau.
Q12
Nous regroupons les tests des questions 9 et 11, ainsi que la case n'est pas vide.
| Python | |
|---|---|
Q13
Après avoir une copie du plateau, pour ne pas modifier le dictionnaire jeu.
Pour toutes les cases de 0 à 5 inclus, nous vérifions les 3 conditions avec la fonction test_case.
Si le test renvoie True l'indice de la case est ajoutée à la liste des cases possibles.
Il est possible de créer cette liste avec une boucle for, ou une liste par compréhension.
| Python | |
|---|---|
Q14
Il faut implémenter la vérification des conditions écrites dans l'énnoncé.
Q15
- Instruction 1:
case_fin = deplacer_graines(plateau, case)
- Instruction 2:
la variable case_fin de l'instruction 1 est nécessaire ppur ramasser à partir de cette case.
graines_gagnees sera utilisé dans les lignes suivantes.
graines_gagnees = ramasser_graines(plateau, case_fin)
- Condition 1:
tour_joueur1(jeu)
- Instruction 3:
jeu['n'] += 1
Q16
Il faut penser Ă ramasser les graines du plateau avant de compter les points.
Ce ramassage se fera en fonction du tour.
En effet les graines du coté du plateau de 0 à 5 seront affectées au score du joueur à qui c'est le tour de jouer.
Q17
Q18

Q19
- La condition 1 vérifie si le jeu peut continuer
condition 1: not tour_suivant(jeu)
- La condition 2 sert Ă limiter la profondeur de recherche:
condition 2: profondeur == profondeur_max
- L'instruction 1 utlise la fonction
gainqui renvoie un couple que sera dépaquetée dans l'instruction 1.
Nous remarquons que le gain est appelé g dans les lignes qui suivent
instruction 1: g, copie_jeu = gain(jeu,case)
- L'instruction 2 sert Ă calculer
p, valeur estimée de VJ parNegaAwale.
instruction 2: p = NegaAwale(copie_jeu, profondeur_max, profondeur + 1)
remqrque le return de la fin de fonction est mal indenté, en effet pour être dans le dernier else il doit être identé au même niveau que le for.
Q20
Nous remarquons d'après le code de la fonction précédente que les les éléments de max_vals sont au format [case, p] cela nous permet de différencier la valeur à retourner.
Q21
La ligne où le numéro de case à jouer est demandée avec ìnput sera remplacée par un le choix de la fonction NegaAwale
| Python | |
|---|---|
SQL⚓︎
Q22
| SQL | |
|---|---|
Q23
| SQL | |
|---|---|
Q24
| SQL | |
|---|---|
Q25