Initiation à Python : que font ces programmes ?

Le but de ces exercices est de trouver le résultat final sans taper le programme, donc en effectuant les étapes à la main sur papier comme si vous étiez l’ordinateur.
Dans un second temps, des applications concrètes sont données, à vous de déterminer laquelle des fonctions mystère sera utile.

Exercice 1

def mystere(arr):
  s = 0
  m = arr[0]
  for v in arr:
    if v > m:
      m = v
      s += 1
  return s

>> mystere([2,3,7,0,6,3])
??

>> mystere([2])
??

Exercice 2

def mystere(arr, n):
  s = 0
  for v in arr:
    if v > n:
        s += 1
  return s

>> mystere([2,3,7,0,6,3], 3)
??

>> mystere([2,3,7,0,6,3], 10)
??

Exercice 3

def mystere(arr, n):
  s = None
  for v in arr:
    if v > n:
      if s is None or s > v:
        s = v
  return s

>> mystere([2,3,7,0,6,3], 3)
??

>> mystere([2,3,7,0,6,3], 10)
??

Exercice 4

def mystere(arr):
  s = 0
  for i, v in enumerate(arr):
    s += v * (-1) ** i 
  return s

>> mystere([2,3,7,0,6,3])
??

>> mystere(range(5))
??

Exercice 5

def mystere(arr):
  s = 0
  for i, v in enumerate(arr):
    if v == i:
     s += 1 
  return s

>> mystere([2,1,0,3,5,4])
??

>> mystere(range(5))
??

exercice 6

def mystere(arr):
  s = sorted(list(arr))
  for i, v in enumerate(arr):
    s[i] = arr.index(s[i])
  return s

>> mystere([2,5,3,1])
??

>> mystere([2])
??

exercice 7

def mystere(arr):
  for i, v in enumerate(arr):
    if i > 0 and v == arr[i - 1]: return True
  return False

>> mystere([2,5,3,1])
??

>> mystere([2,5,5,3])
??

>> mystere(range(10))
??

Exercice 8

def mystere(arr1, arr2):
  s = []
  for v in arr1:
    if v in arr2 and v not in s:
        s.append(v)
  return s
  
>> mystere([2,5,5,3], [4,4,2,5,7])
??

>> mystere([2],[4])
??

Exercice 9

def mystere(arr1, arr2):
  s = []
  for v in arr1 + arr2:
    if v not in s:
        s.append(v)
  return s

>> mystere([2,2,2,7],[4,4,5])
??

Pour aller plus loin : Ecrire une fonction analogue (l’ordre des éléments pouvant être différent), en utilisant set, union et list.

exercice 10

def mystere(arr):
  s = []
  for u in arr:
    n = 0
    for v in arr:
      if v > u:
        n += 1
    s.append(n)
  return s

>> mystere([8,2,5,1,7])
??

>> mystere([1])
??

>> mystere(range(5))
??

Applications concrètes

Pour chacun des exemples concrets ci-dessous, retrouvez quelle fonction mystère serait adaptée pour répondre à la question.

Société de transport « Okilo »

La société OKILO a plusieurs camions, chacun étant spécialisé dans le transport de colis de plus de X kilos. Par exemple le camion ci-dessous ne transporte que des colis de plus de 10 kilos, il va donc refuser 3 colis sur les 5 et ne garder que les 2 de 15 et 13 kg.

Ce camion n’accepte que les colis de plus de 10 kilos

Quelle fonction mystere permet, à partir d’une liste de poids et de la valeur minimale acceptée par le camion, d’obtenir le nombre de colis qui seront transportés ?

Mélange

Vous mettez 6 billes numérotées de 0 à 5 dans un sac. Au hasard vous les sortez une à une et les placez dans des boites numérotées également de 0 à 5. On se demande combien de billes ont un numéro correspondant à celui de leur boite ?

Seules les billes n°2 et 5 sont bien rangées, c’est-à-dire dans des boites correspondant à leurs numéros

Quelle fonction mystere permet, à partir d’une liste de numéros ([1, 0, 2, 4, 3, 5] pour l’exemple) de connaitre le nombre de billes qui sont bien rangées (2 pour l’exemple) ?

Nombre de personnes dans le bus

Des personnes montent et descendent d’un bus. Par exemple la liste [3,2,8,0,6,3] signifie qu’au premier arrêt 3 personnes sont montées et 2 sont descendues. A l’arrêt suivant 8 personnes montent et aucune ne descend et enfin au 3e arrêt, 6 montent et 3 descendent. Sachant qu’il y avait 10 personnes dans le bus avant d’arriver au 1er arrêt, combien restera-t-il de personnes dans le bus après le 3e arrêt ?

Combien y aura-t-il de personnes dans le bus après le 3e arrêt ?

Quelle fonction mystere vous aidera à trouver le nombre final de passagers ?

Combien sont plus grands que moi ?

5 personnes montrent aux autres leurs tailles respectives sur un petit panneau. Ainsi, tout le monde voit les tailles de tout le monde. Chacun se demande « Combien sont plus grands que moi ? »

Chacun se demande combien d’individus dans le groupe sont plus grands qu’eux

La plus grande personne pensera donc à zéro et la plus petite à 4.

Quelle fonction mystere permet, à partir de la liste des tailles [1.6, 1.95, 1.56, 1.61, 1.52] d’obtenir la liste des nombres auxquels chacun pense ?

Ecrivains célèbres

On se demande s’il existe des écrivains dont le nom et le prénom s’écrivent avec des lettres différentes. Par exemple pour VICTOR HUGO, on voit qu’il y a la lettre O en commun, cet auteur ne correspond pas à ce que l’on recherche.

Quelle fonction mystere permet, à partir de 2 chaines de caractères (une pour le prénom, l’autre pour le nom) de nous dire quelles lettres sont communes ?

Le ‘O’ est commun à ‘VICTOR’ et ‘HUGO’

Arriverez-vous à trouver un auteur vérifiant ce que l’on cherche ?

secret défense

Voici la technique de cryptographie que vous voulez employer :
– La phrase à transmettre est MESSAGEIMPORTANT
– Comme il y a 16 lettres dans ce message, vous prenez les 16 premières lettres de l’alphabet que vous mélangez au hasard. Par exemple en tapant :

>> from random import sample
>> sample("ABCDEFGHIJKLMNOP",16)
['H', 'C', 'G', 'B', 'N', 'I', 'A', 'M', 'L', 'F', 'O', 'D', 'J', 'E', 'K', 'P']

– Maintenant vous regardez les rangs des lettres en partant de ‘A’ jusqu’à ‘P’ dans cet alphabet mélangé. Le ‘A’ est à la 6e position, le ‘B’ la position 3, le ‘C’ à la position 1 etc.
– On obtient la liste : [6, 3, 1, 11, 13, 9, 2, 0, 5, 12, 14, 8, 7, 4, 10, 15]
– Finalement, pour crypter votre message, vous allez prendre sa lettre n°6 (le E) puis la n°3 (le S), puis la n°1 (le E) etc. jusqu’à la 16e position.
– Vous obtenez le mot codé : ESERAPSMGTNMIAOT

Quelle fonction mystere permettra de faire fonctionner le programme ci-dessous ?

def coder(txt,cle):
  ordre = mystere(cle)
  s = ""
  for i in range(len(txt)):
    s += txt[ordre[i]]
  return s 

>> coder("MESSAGEIMPORTANT", "HCGBNIAMLFODJEKP")
ESERAPSMGTNMIAOT

Gratte-ciels

Des immeubles de différentes hauteurs sont côte à côte. On se demande combien vont être touchés par des rayons de lumières parallèles au sol et provenant de la gauche. Sur le visuel ci-dessous les hauteurs sont [2, 2, 3, 2, 6, 3, 6, 2] et l’on voit que seuls 3 seront touchés par les rayons (les autres sont cachés par au moins un plus grand à leur gauche).

Seuls 3 immeubles seront touchés

Quelle fonction mystere va vous aider à compter le nombre d’immeubles touchés par les rayons ?

parterre de fleurs

Afin d’obtenir le label « Villes et villages fleuris », le maire décide de créer des parterres de fleurs en alternant fleurs et tulipes. Voici un exemple qui lui convient : 🌼🌷🌼🌷🌼🌷🌼🌷

Par contre celui-ci ne convient pas : 🌼🌷🌼🌷🌷🌼🌷🌼🌷 puisque 2 tulipes sont côte à côte.

Quelle fonction mystere va vous permettre de savoir si un parterre est correct ou non ?

>> correct("🌼🌷🌼🌷🌼🌷🌼🌷")
True

>> correct("🌼🌷🌼🌷🌷🌼🌷🌼🌷")
False