Aller au contenu

Sujet n°20

Sujet original

Pour télécharger l'énoncé original, cliquer ici.

Exercice n°1

Écrire une fonction ajoute_dictionnaires qui prend en paramètres deux dictionnaires d1 et d2 dont les clés sont des nombres et renvoie le dictionnaire d défini de la façon suivante :

  • Les clés de d sont celles de d1 et celles de d2 réunies.
  • Si une clé est présente dans les deux dictionnaires d1 et d2, sa valeur associée dans le dictionnaire d est la somme de ses valeurs dans les dictionnaires d1 et d2.
  • Si une clé n’est présente que dans un des deux dictionnaires, sa valeur associée dans le dictionnaire d est la même que sa valeur dans le dictionnaire où elle est présente.

Exemples

>>> ajoute_dictionnaires({1: 5, 2: 7}, {2: 9, 3: 11})
{1: 5, 2: 16, 3: 11}

>>> ajoute_dictionnaires({}, {2: 9, 3: 11})
{2: 9, 3: 11}

>>> ajoute_dictionnaires({1: 5, 2: 7}, {})
{1: 5, 2: 7}
Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
def ajoute_dictionnaires(d1, d2):
    """
    d1, d2 - dict, deux dictionnaires partageant ou pas les mêmes clefs numériques
    Sortie: dict, dictionnaire qui, à chaque clef de d1 ou d2 associe la valeur
            initiale correspondante. Si les clefs sont communes, alors c'est la
            somme des valeurs qui est associée dans le dictionnaire renvoyé.
    """
    d = {clef: d1[clef] for clef in d1.keys()}
    for clef in d2.keys():
        if clef in d.keys():
            d[clef] += d2[clef]
        else:
            d[clef] = d2[clef]
    return d


if __name__ == '__main__':
    # Exemples de l'énoncé
    d1 = {1: 5, 2: 7}
    d2 = {2: 9, 3: 11}
    print(ajoute_dictionnaires(d1, d2) == {1: 5, 2: 16, 3: 11})
    d1 = {}
    d2 = {2: 9, 3: 11}
    print(ajoute_dictionnaires(d1, d2) == {2: 9, 3: 11})
    d1 = {1: 5, 2: 7}
    d2 = {}
    print(ajoute_dictionnaires(d1, d2) == {1: 5, 2: 7})

    # Exemples supplémentaires
    d1 = {1: 2, 2: 3, 3: 4, 4: 1}
    d2 = {1: 4, 2: 3, 3: 2, 4: 1}
    print(ajoute_dictionnaires(d1, d2) == {1: 6, 2: 6, 3: 6, 4: 2})
    d1 = {1: 1}
    d2 = {2: 2}
    print(ajoute_dictionnaires(d1, d2) == {1: 1, 2: 2})

Exercice n°2

On considère une piste carrée qui contient 4 cases par côté. Les cases sont numérotées de 0 inclus à 12 exclu comme ci-dessous :

piste

L’objectif de l’exercice est d’implémenter le jeu suivant :

Au départ, le joueur place son pion sur la case 0. A chaque coup, il lance un dé équilibré à six faces et avance son pion d’autant de cases que le nombre indiqué par le dé (entre 1 et 6 inclus) dans le sens des aiguilles d’une montre.

Exemple

S’il obtient 2 au premier lancer, il pose son pion sur la case 2 puis s’il obtient 6 au deuxième lancer, il le pose sur la case 8, puis s’il obtient à nouveau 6, il pose le pion sur la case 2.

Le jeu se termine lorsque le joueur a posé son pion sur toutes les cases de la piste.

Compléter la fonction nbre_coups ci-dessous de sorte qu’elle renvoie le nombre de lancers aléatoires nécessaires pour terminer le jeu.

Proposer ensuite quelques tests pour en vérifier le fonctionnement.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from random import randint

def nbre_coups():
    n = ...
    cases_vues = [0]
    case_en_cours = 0
    nbre_cases = 12
    while ... < ...:
        x = randint(1, 6)
        case_en_cours = (case_en_cours + ...) % ...
        if ...:
            cases_vues.append(case_en_cours)
        n = ...
    return n
Commentaire sur le code original
  1. Pour télécharger l'original du fichier à compléter, cliquer ici.
  2. Difficile de tester quand on ne voit rien...
    Dans la solution proposée, des affichages en commentaire ont été insérés dans le code pour visualisé le comportement aléatoire en décommentant ces affichages.
Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
from random import randint

def nbre_coups():
    n = 0
    cases_vues = [0]
    case_en_cours = 0
    nbre_cases = 12
    while len(cases_vues) < 12:
        x = randint(1, 6)
        case_en_cours = (case_en_cours + x) % 12
        #print(f"x = {x}, case_en_cours = {case_en_cours}\ncases_vues = {cases_vues}")
        if case_en_cours not in cases_vues:
            cases_vues.append(case_en_cours)
        n = n+1
    return n


if __name__ == '__main__':
    # Exemples supplémentaires
    print(nbre_coups())