Commit 516544a7 authored by Thibaut.Lunet's avatar Thibaut.Lunet

TL: added two basis exercices

parent 5fa9db6b
Les listes magiques :
Les puissances des premiers nombres entiers consécutifs, lorsqu'on les observe en groupe, ont des propriétés parfois troublantes, grâce à la magie de l'arithmétique. En voici une première illustration ...
1) Écrire une fonction liste_puissances(p,n), qui retourne la liste des n premiers nombres entiers en partant de 0,
chacun élevés à la puissance p
ex : liste_puissances(1,5) devra retourner [0, 1, 2, 3, 4], liste_puissance(2,10) devra retourner [0, 1, 4, 9, 16, 25, 36, 49, 64, 81], etc ...
2) Écrire une fonction dernier_chiffre qui prend pour argument un nombre, et renvois son dernier chiffre (sous format d'entier)
ex : - dernier_chiffre(50) = 0
- dernier_chiffre(123) = 3
- dernier_chiffre(12) + dernier_chiffre(53) = 5
Indication : on pourra utiliser la fonction str(..) qui transforme son argument en chaîne de caractère, et la fonction int(...) qui transforme son argument en entier.
3) En utilisant les fonctions précédentes, écrire une fonction liste_magique(p,n) qui retourne la liste des derniers chiffres
des n premiers nombres entiers en partant de 0, chacun élevés à la puissance p
ex : liste_magique(1,5) devra retourner [0, 1, 2, 3, 4], liste_magique(2,10) devra retourner [0, 1, 4, 9, 6, 5, 6, 9, 4, 1], etc ...
4) On fixe n=10, et on considère le résultat de liste_magique pour toutes les puissances p paires (p=2,4,6,8,10,12, ...).
Que peut-on observer ?
Que peut-on observer si l'on somme termes-à-termes les listes obtenues pour des puissances paires consécutives (p=2 et 4, ou p = 6 et 8, ...) ?
5) Toujours avec n=10, on considère maintenant le résultat de liste_magique pour les puissances p impaires (p=1,3,5,7,9,11,...).
Que peut-on observer ?
\ No newline at end of file
Cryptographie, ou l'art des messages codés ...
Coder ou décoder un message est un art connu déjà depuis l'empire romain, avec le fameux code César, attribué à l'empereur romain du même nom. Son principe repose sur le changement des lettres du message par une lettre décalée de p lettre(s) dans l'alphabet. Par exemple, pour p = 1, a devient b, b devient c, ... Pour p=2, a deviens c, b deviens d, ... Il est aussi possible de considérer des valeurs négatives pour p : pour p=-1, a devient z, b deviens a, ...
L'idée de l'exercice est d'implémenter une fonction capable de coder et décoder des messages selon ce principe. Objectif : décoder le message donné dans la dernière question !
1) On considère une chaîne de caractère, comprenant l'ensemble des caractères pouvant être contenu dans les mots d'un message (ex : abc = 'abcdefghijklmnopqrstuvwxyz'). Écrire la fonction rotation(abc, p) qui prend comme argument ce type de chaîne de caractère, et retourne une nouvelle chaîne de caractère avec un décalage p allant de gauche à droite si p est positif, ou de droite à gauche si p est négatif.
ex : rotation('abcde',1) => 'bcdea' ; rotation('abcde',2) => 'cdeab' ; rotation('abcde',-1) => 'eabcd'
indication : si liste=[1,2,3,4,5], alors liste[0:3] = liste[:3] = [1,2,3] et liste[3:5] = liste[3:] = [4,5]. De plus, liste[0:-2] = liste[:-2] = [1,2,3] et liste[-2:5] = liste[-2:] = [4,5].
2) On veux générer un dictionnaire de codage dont les clefs seraient les lettres du message non codé, et les valeurs seraient les lettres correspondante pour le message codé. Écrire la fonction generer_dico(abc,p) qui retourne le dictionnaire de codage correspondant au codage César des caractères présents dans la chaîne de caractères abc, avec le décalage p.
ex : generer_dico("abcde",2) => {'a': 'c', 'b': 'd', 'c': 'e', 'd': 'a', 'e': 'b'}
indication : utiliser la fonction de la question précédente pour construire la chaîne de caractère après le décalage César, puis construire le dictionnaire en utilisant les deux chaînes de caractères.
3) Écrire la fonction coder_message(msg,p) qui renvoit le message contenu dans la chaîne de caractère msg, codé en utilisant un code César avec décalage p. On utilisera "abcdefghijklmnopqrstuvwxyz" comme ensemble de caractères du message (sans majuscule).
ex : coder_message("c'bon le fromage suisse", 2) => "e'dqp ng htqocig uwkuug"
indication : générer le dictionnaire de codage, puis initialiser une chaîne de caractère vide msg_code = "", à laquelle on ajouterai chaque caractère du message, codé s'il est dans le dictionnaire de codage, ou non codé s'il n'y est pas (comme le caractère espace " ", ..).
4) En utilisant la fonction coder_message avec un p bien choisi, décoder le message suivant, codé avec un décalage César p=13 : "gh nf yr qebvg q'nyyre qbezve znvagranag"
\ No newline at end of file
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 26 21:55:23 2019
@author: telu
"""
# %% 1)
def liste_puissance(p, n):
return [i**p for i in range(n)]
print('Question 1)')
print(liste_puissance(1, 5), liste_puissance(2, 10))
# %% 2)
def dernier_chiffre(i):
i_str = str(i) # Transformation de i en string
c_str = i_str[-1] # Dernier chiffre, sous format string
c = int(c_str) # Conversion du dernier chiffre en entier
return c
print('Question 2)')
print(dernier_chiffre(50), dernier_chiffre(123),
dernier_chiffre(12)+dernier_chiffre(53))
# %% 3)
def liste_magique(p, n):
return [dernier_chiffre(i) for i in liste_puissance(p, n)]
print('Question 3)')
print(liste_magique(1, 5), liste_magique(2, 10))
# %% 4)
print('Question 4)')
print('- Affichage des listes magiques pour les premiers nombres pairs')
n = 10
for p in range(2, 13, 2):
print(liste_magique(p, n))
print('=> une fois sur deux, les chiffres sont les memes')
print('- Affichage de la somme des listes magiques pour deux nombres pairs consecutifs')
for p in [2, 6]:
liste1 = liste_magique(p, n)
liste2 = liste_magique(p+2, n)
liste = []
for i in range(n):
liste.append(liste1[i] + liste2[i])
print(liste)
print('=> les sommes sont toujours les mêmes')
# %% 5)
print('Question 5)')
print('- Affichage des listes magiques pour les premiers nombres pairs')
n = 10
for p in range(1, 12, 2):
print(liste_magique(p, n))
print('=> pour 1, 5, 9, ..., les chiffres sont les memes et vont de 1 a 9, dans le bon ordre')
print('=> pour 3, 7, 11, ..., les chiffres sont les memes et vont de 1 a 9, mais pas dans le bon ordre')
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Mar 26 23:48:03 2019
@author: telu
"""
# %% 1)
def rotation(abc, p):
n = len(abc)
return abc[p:n]+abc[0:p]
print('Question 1)')
abc = 'abcde'
print(rotation(abc, 1), rotation(abc, 2), rotation(abc, -1))
# %% 2)
def generer_dico(abc, p):
abc_code = rotation(abc, p)
dico = {}
for i in range(len(abc)):
dico[abc[i]] = abc_code[i]
return dico
print('Question 2)')
abc = 'abcde'
print(generer_dico(abc, 2))
# %% 3)
def coder_message(msg, p):
dico = generer_dico('abcdefghijklmnopqrstuvwxyz', p)
msg_code = ''
for c in msg:
if c in dico:
msg_code += dico[c]
else:
msg_code += c
return msg_code
print('Question 3)')
print(coder_message("c'bon le fromage suisse", 2))
# %% 4)
print('Question 4)')
print(coder_message("gh nf yr qebvg q'nyyre qbezve znvagranag", -13))
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment