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