Aller au contenu

Sujet n°35

Sujet original

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

Exercice n°1

L'opérateur « ou exclusif » entre deux bits renvoie 0 si les deux bits sont égaux et 1 s'ils sont différents. Il est symbolisé par le caractère ⊕.
Ainsi :

  • 0 ⊕ 0 = 0
  • 0 ⊕ 1 = 1
  • 1 ⊕ 0 = 1
  • 1 ⊕ 1 = 0

On représente ici une suite de bits par un tableau contenant des 0 et des 1.

Exemples

a = [1, 0, 1, 0, 1, 1, 0, 1]
b = [0, 1, 1, 1, 0, 1, 0, 0]
c = [1, 1, 0, 1]
d = [0, 0, 1, 1]

Écrire la fonction ou_exclusif qui prend en paramètres deux tableaux de même longueur et qui renvoie un tableau où l’élément situé à position i est le résultat, par l’opérateur « ou exclusif », des éléments à la position i des tableaux passés en paramètres.

En considérant les quatre exemples ci-dessus, cette fonction doit passer les tests suivants :

Exemples

>>> ou_exclusif(a, b)
[1, 1, 0, 1, 1, 0, 0, 1]

>>> ou_exclusif(c, d)
[1, 1, 1, 0]
Commentaires

La table de vérité aurait pu être présentée dans un tableau pour plus de lisibilité

Une solution

Dans cette solution, on ajoute une assertion pour vérifier que les deux tableaux ont la même longueur.

 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
def ou_exclusif(bits_a, bits_b):
    """
    bits_a, bits_b - list, tableaux de bits de même longueur
    Sortie: list - tableau de bits construit bit à bit en appliquant
            l'opérateur xor entre les bits correspondants de bits_a et bits_b
    """
    assert len(bits_a) == len(bits_b), "Les tableaux n'ont pas le même nombre de bits"
    result = []
    for i in range(len(bits_a)):
        if bits_a[i] == bits_b[i]:
            result.append(0)
        else:
            result.append(1)
    return result



if __name__ == '__main__':
    # Exemples de l'énoncé
    a = [1, 0, 1, 0, 1, 1, 0, 1]
    b = [0, 1, 1, 1, 0, 1, 0, 0]
    c = [1, 1, 0, 1]
    d = [0, 0, 1, 1]
    print(ou_exclusif(a, b) == [1, 1, 0, 1, 1, 0, 0, 1])
    print(ou_exclusif(c, d) == [1, 1, 1, 0])

    # Exemples supplémentaires
    print(ou_exclusif([0], [0]) == [0])
    print(ou_exclusif([0], [1]) == [1])
    print(ou_exclusif([1], [0]) == [1])
    print(ou_exclusif([1], [1]) == [0])

Exercice n°2

Dans cet exercice, on appelle carré d’ordre n un tableau de n lignes et n colonnes dont chaque case contient un entier naturel.

Exemples

carrés

Un carré est dit semimagique lorsque les sommes des éléments situés sur chaque ligne et chaque colonne sont égales.

  • Ainsi c2 et c3 sont semimagiques car la somme de chaque ligne et chaque colonne est égale à 8 pour c2 et 12 pour c3.
  • Le carré c3bis n’est pas semimagique car la somme de la première ligne est égale à 15 alors que celle de la deuxième ligne est égale à 10.

La classe Carre ci-après contient des méthodes qui permettent de manipuler des carrés :

  • La méthode constructeur crée un carré sous forme d’un tableau à deux dimensions à partir d’une liste d’entiers, et d’un ordre.
  • La méthode affiche permet d’afficher le carré créé.

Exemples

>>> liste = (3, 4, 5, 4, 4, 4, 5, 4, 3)
>>> c3 = Carre(liste, 3)    
>>> c3.affiche()
[3, 4, 5] 
[4, 4, 4] 
[5, 4, 3]

Compléter la méthode est_semimagique qui renvoie True si le carré est semimagique, False sinon. Puis tester la fonction est_semimagique sur les carrés c2, c3 et c3bis.

 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
36
37
38
39
class Carre: 
    def __init__(self, liste, n): 
        self.ordre = n 
        self.tableau = [[liste[i + j * n] for i in range(n)] for 
j in range(n)] 

    def affiche(self): 
        '''Affiche un carré''' 
        for i in range(self.ordre): 
            print(self.tableau[i]) 

    def somme_ligne(self, i): 
        '''Calcule la somme des valeurs de la ligne i''' 
        somme = 0 
        for j in range(self.ordre): 
            somme = somme + self.tableau[i][j] 
        return somme 

    def somme_col(self, j): 
        '''Calcule la somme des valeurs de la colonne j''' 
        somme = 0 
        for i in range(self.ordre): 
            somme = somme + self.tableau[i][j] 
        return somme 

    def est_semimagique(self): 
        s = self.somme_ligne(0) 

        #test de la somme de chaque ligne 
        for i in range(...): 
            if ... != s: 
                return ... 

        #test de la somme de chaque colonne 
        for j in range(...): 
            if ... != s: 
                return ... 

        return ...

Tester la fonction est_magique sur les carrés c2, c3 et c4.

Commentaires sur le code original

Pour télécharger l'original du fichier à compléter, cliquer ici.

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Carre:
    def __init__(self, liste, n):
        self.ordre = n
        self.tableau = [[liste[i + j * n] for i in range(n)] for
j in range(n)]

    def affiche(self):
        '''Affiche un carré'''
        for i in range(self.ordre):
            print(self.tableau[i])

    def somme_ligne(self, i):
        '''Calcule la somme des valeurs de la ligne i'''
        somme = 0
        for j in range(self.ordre):
            somme = somme + self.tableau[i][j]
        return somme

    def somme_col(self, j):
        '''Calcule la somme des valeurs de la colonne j'''
        somme = 0
        for i in range(self.ordre):
            somme = somme + self.tableau[i][j]
        return somme

    def est_semimagique(self):
        s = self.somme_ligne(0)

        #test de la somme de chaque ligne
        for i in range(1, self.ordre):
            if self.somme_ligne(i) != s:
                return False

        #test de la somme de chaque colonne
        for j in range(self.ordre):
            if self.somme_col(j) != s:
                return False

        return True


if __name__ == '__main__':
    # Exemple de l'énoncé
    liste = (3, 4, 5, 4, 4, 4, 5, 4, 3)
    c3 = Carre(liste, 3)
    print(c3.est_semimagique() == True)

    # Exemples supplémentaires
    liste = (1, 7, 7, 1)
    c2 = Carre(liste, 2)
    print(c2.est_semimagique() == True)

    liste = (2, 9, 4, 7, 0, 3, 6, 1, 8)
    c3bis = Carre(liste, 3)
    print(c3bis.est_semimagique() == False)

    liste = (4, 5, 16, 9, 14, 7, 2, 11, 3, 10, 15, 6, 13, 12, 8, 1)
    c4 = Carre(liste, 4)
    print(c4.est_semimagique() == False)