Initiation à Python : Activités et Exemples
Initiation à Python : Activités et Exemples
1. Premiers pas
Activité 1
Activité 1 premiers_pas_1.py
##############################
# Premiers pas
##############################
##############################
# Activité 1 - Nombres
##############################
##############################
# Cours
print("--- Cours ---")
# Afficher une phrase
print("Bonjour le monde !")
# Addition
5+7
print(5+7)
# Multiplication
print(6*7)
print(3*(12+5))
print(3*1.5)
# Puissance
print(3**2)
print(10**-3)
# Division réelle
print(14/4)
print(1/3)
# Division entière et modulo
print(14//4)
print(14%4)
##############################
# Questions
# Q1
# Nombre de secondes dans un siècle
print("--- Question 1 ---")
print(100 * 365 * 24 * 60 * 60)
# Q2
# A partir dans quand plus grand qu'un milliard
print("--- Question 2 ---")
print((1+2)*(3+4)*(5+6)*(7+8)*(9+10)*(11+12)*(13+14)*(15+16))
# Q3
# Trois derniers chiffres de 123456789 * 123456789 * ...
2
# Q4
# Premier 1/n avec période 7
print("--- Question 4 ---")
print(1/7) # Période 6
print(1/239) # Période 7
# Q5
# Trouver un nb connaissant deux divisions et un reste
print("--- Question 5 ---")
# for n in range(1175,1190):
# print(n,n//11,n//13,n%7)
print(1182//11)
print(1182//13)
print(1182%7)
Activité 2
Activité 2 premiers_pas_2.py
##############################
# Premiers pas
##############################
##############################
# Activité 2 - Variables
##############################
##############################
# Cours
# C1 - variables
a = 3 # Une variable
b = 5 # Une autre variable
print("La somme vaut",a+b) # Affiche la somme
print("Le produit vaut",a*b) # Affiche le produit
c = b**a # Nouvelle variable...
print(c) # ... qui s'affiche
# C3 - ajout
S = 1000
S = S + 100
S = S + 200
S = S - 50
3
print(S)
##############################
# Questions
# Q1
# Aires - Volumes
# Trapèze : bien nommé les choses
B, b, h = 7, 4, 3
aire = (B + b) * h / 2
print("L'aire vaut",aire)
# Boîtes
L, l, h = 10,8,3
volume = L * l * h
print(volume)
# Boules
PI = 3.14
R = 10
aire = PI * R**2
print(aire)
# Q2
# Remettre dans l'ordre de sorte qu'à la fin x = 46
x = 7
y = 2*x
y = y - 1
x = x + 3*y
print(x)
# Q3
# Intérêts de 10%
S = 1000
S = S * 1.1
S = S * 1.1
S = S * 1.1
# Q4
# Bon choix afin d'échanger a et b
# Mauvais
a = 11
b = 9
a = b
b = a
print(a,b)
# Mauvais
a = 11
b = 9
c = b
a = b
b = c
print(a,b)
# Mauvais
a = 11
b = 9
c = a
4
a = c
c = b
b = c
print(a,b)
# Bon
a = 11
b = 9
c = a
a = b
b = c
print(a,b)
Activité 3
Activité 3 premiers_pas_3.py
##############################
# Premiers pas
##############################
##############################
# Activité 3 - Utiliser des fonctions
##############################
##############################
# Cours
# C1 - fonctions
print("Coucou")
x = float("+1.234567")
print(x)
# C2 - module math
from math import *
x = sqrt(2)
print(x)
print(x**2)
# C3 - fonction trigo
angle = pi/2
print(angle)
print(sin(angle))
##############################
# Questions
# Q1
5
# pgcd
print(gcd(13*121,13*122))
a = 101*103
b = 102*103
print(a,b)
ppcm = a * b // gcd(a,b)
print(ppcm)
# Q2
# Valeur absolue
x = 3.85
print(abs(x**2-15))
print(round(2*x))
print(floor(3*x))
print(ceil(4*x))
# Q3
# Angle
angle = pi/7
x = cos(angle)**2 + sin(angle)**2
print(x)
Activité 4
Activité 4 premiers_pas_4.py
##############################
# Premiers pas
##############################
##############################
# Activité 4 - Boucle "pour"
##############################
##############################
# Cours
# C1 - Boucle "for"
for i in range(10):
print(i*i)
# C2 - Boucle "for"
somme = 0
for i in range(20):
somme = somme + i
print(somme)
# C3
print(list(range(10)))
print(list(range(10,20)))
print(list(range(10,20,2)))
6
# C4 - Imbrication de boucles
for x in [10,20,30,40,50]:
for y in [3,7]:
print(x+y)
##############################
# Questions
# Q1
# Cubes
for i in range(101):
print(i**3)
for i in range(10,21):
print(i**4)
for i in range(0,101,5):
print(sqrt(i))
# Q2
# Puissances de 2
for k in range(1,11):
print(2**k)
# Q3
# Minimum d'une fonction par balayage
for i in range(101):
x = i/100
y = x**3 - x**2 - 1/4*x + 1
print("x =",x,"y =",y)
# Q4
# Volume d'une boule qui vaut 100
for i in range(50):
R = i/10
V = 4/3 * 3.14 * R**3
print("R =",R,"V =",V)
Activité 1
Activité 1 tortue_1.py
##############################
# Tortue
##############################
##############################
# Activité 1 - Bouge ta tortue !
##############################
# Début du code
from turtle import *
width(5) # Epaisseur du trait
# Lettre "P"
7
color('red')
left(90) # 90 degrés à gauche
forward(200) # On avance
right(90)
forward(100)
right(90)
forward(100)
right(90)
forward(100)
up()
# Fin du code
# Lettre "Y"
color('blue')
goto(200,0)
down()
setheading(90)
forward(120)
left(30)
forward(75)
backward(75)
right(60)
forward(75)
exitonclick()
Activité 2
Activité 2 tortue_2.py
##############################
# Tortue
##############################
##############################
# Activité 2 - Boucle "pour"
##############################
##############################
# Question 1
from turtle import *
# Un pentagone
width(5)
color('blue')
for i in range(5):
forward(100)
left(72)
##############################
# Question 2
8
# Un autre pentagone
color('red')
longueur = 200
angle = 72
for i in range(5):
forward(longueur)
left(angle)
##############################
# Question 3
# Un dodecagone (12 côtés quoi)
color("purple")
n = 12
angle = 360/n
for i in range(n):
forward(100)
left(angle)
##############################
# Question 4
# Une spirale
color("green")
longueur = 10
for i in range(25):
forward(longueur)
left(40)
longueur = longueur + 10
exitonclick()
Activité 3
Activité 3 tortue_3.py
##############################
# Tortue
##############################
##############################
# Activité 3 - Graphe d'une fonction
##############################
goto(x,y)
exitonclick()
Activité 4
Activité 4 tortue_4.py
##############################
# Tortue
##############################
##############################
# Activité 4 - Boucle pour itérée - Triangle de Sierpinski
##############################
from turtle import *
width(5)
up()
goto(-100,-100)
down()
for i in range(3):
color("blue")
forward(256)
left(120)
for i in range(3):
color("red")
forward(128)
left(120)
for i in range(3):
color("green")
forward(64)
left(120)
# for i in range(3):
# color("orange")
# forward(32)
# left(120)
exitonclick()
Activité 5
Activité 5 tortue_5.py
##############################
# Tortue
##############################
##############################
# Activité 5 - Table de multiplications
##############################
10
Activité 6
Activité 6 tortue_6.py
##############################
# Tortue
##############################
##############################
# Activité 4 - Plusieurs tortues - Courbe de poursuite
##############################
# Préparation
from turtle import *
tortue1 = Turtle()
tortue2 = Turtle()
tortue3 = Turtle()
tortue4 = Turtle()
[Link]("fastest")
[Link]("fastest")
[Link]("fastest")
[Link]("fastest")
[Link]('red')
[Link]('blue')
[Link]('orange')
[Link]('green')
# [Link](5)
# [Link](5)
# [Link](5)
# [Link](5)
[Link]()
[Link](-200,-200)
[Link]()
[Link]()
[Link](200,-200)
[Link]()
11
[Link]()
[Link](200,200)
[Link]()
[Link]()
[Link](-200,200)
[Link]()
print([Link]())
print([Link](0,0))
# Boucle principale
for i in range(40):
position1 = [Link]()
position2 = [Link]()
position3 = [Link]()
position4 = [Link]()
[Link](position2) # Va à la tortue suivante
[Link](position1) # Revient à sa place
[Link](position3)
[Link](position2)
[Link](position4)
[Link](position3)
[Link](position1)
[Link](position4)
angle1 = [Link](position2) # Récupèrer l'angle
[Link](angle1) # S'oriente selon cet angle
angle2 = [Link](position3)
[Link](angle2)
angle3 = [Link](position4)
[Link](angle3)
angle4 = [Link](position1)
[Link](angle4)
[Link](10) # Avance
[Link](10)
[Link](10)
[Link](10)
exitonclick()
Activité 1
Activité 1 sialors_1.py
##############################
# Si ... alors ...
##############################
12
##############################
# Activité 1 - Quiz multiplications
##############################
from random import *
a = randint(1,10)
b = randint(1,10)
print("Combien font",a,"fois",b,"?")
reponse_str = input("Réponse : ")
reponse_int = int(reponse_str)
if reponse_int == a*b:
print("Bravo !")
else:
print("Non, la réponse était",a*b)
Activité 2
Activité 2 sialors_2.py
##############################
# Si ... alors ...
##############################
##############################
# Activité 2 - Tortue
##############################
from turtle import *
width(5)
color('blue')
mot = "AagAgAdAgAAgaAA"
for c in mot:
if c == "A":
forward(100)
if c == "a":
up()
forward(100)
down()
if c == "g":
left(90)
if c == "d":
right(90)
exitonclick()
13
Activité 3
Activité 3 sialors_3.py
##############################
# Si ... alors ...
##############################
##############################
# Activité 3 - Chiffres d'un nombre
##############################
##############################
## Question 1 ##
for d in range(10):
for u in range(10):
n = 10*d + u
print(n)
##############################
## Question 2 ##
for c in range(10):
for d in range(10):
for u in range(10):
n = 100*c + 10*d + u
if u == 3 and (c+d+u >= 15) and (d == 0 or d == 2 or d == 4 or d == 6 or d== 8):
print(n)
##############################
## Question 3 ##
compteur = 0
for c in range(10):
for d in range(10):
for u in range(10):
n = 100*c + 10*d + u
if u == 3 and (c+d+u >= 15) and (d == 0 or d == 2 or d == 4 or d == 6 or d== 8):
compteur = compteur + 1
print("Nombre de solutions :",compteur)
Activité 4
Activité 4 sialors_4.py
##############################
# Si ... alors ...
##############################
##############################
# Activité 4 - Triangles
##############################
# a,b,c = 3,4,5
14
##############################
## Question 1 ##
a = 4
b = 5
c = 8
print("Triangle",a,b,c)
# A-t-on a <= b <= c ?
if a <= b and b <= c:
print("Longueurs dans le bon ordre.")
else:
print("Longueurs dans le mauvais ordre.")
##############################
## Question 2 ##
# Un triangle peut-il être construit à partir de ces longueurs ?
if a+b >= c:
print("Un tel triangle existe.")
else:
print("Un tel triangle n'existe pas.")
##############################
## Question 3 ##
# Le triangle est-il rectangle ?
if a**2 + b**2 == c**2:
print("Le triangle est rectangle.")
else:
print("Le triangle n'est pas rectangle.")
##############################
## Question 3 ##
# Le triangle est-il equilatéral ?
if (a == b) and (b == c) and (a == c):
print("Le triangle est équilatéral.")
else:
print("Le triangle n'est pas équilatéral.")
##############################
## Question 4 ##
# Le triangle est-il isocèle ?
if (a == b) or (b == c) or (a == c):
print("Le triangle est isocèle.")
else:
print("Le triangle n'est pas isocèle.")
##############################
## Question 5 ##
# Tous les angles sont-ils aigus ?
cosalpha = (-a**2 + b**2 + c**2)/(2*b*c)
cosbeta = (a**2 - b**2 + c**2)/(2*a*c)
cosgamma = (a**2 + b**2 - c**2)/(2*a*b)
if (cosalpha >= 0) and (cosbeta >= 0) and (cosgamma >= 0):
15
Activité 5
Activité 5 sialors_5.py
##############################
# Si ... alors ...
##############################
##############################
# Activité 4 - Le jeu de la devinette
##############################
##############################
## Question 1 ##
from random import *
# Jeu classique de la devinette
nb_mystere = randint(0,99)
for essai in range(7):
print("Quel est le nombre mystère ?")
reponse_str = input("Ta proposition : ")
reponse_int = int(reponse_str)
if nb_mystere == reponse_int:
print("Bravo !")
break # Arrête la boucle
if nb_mystere < reponse_int:
print("Non, le nombre à trouver est plus petit !")
if nb_mystere > reponse_int:
print("Non, le nombre à trouver est plus grand !")
# Lorsque c'est fini :
if nb_mystere != reponse_int:
print("Perdu ! Le nombre mystère était",nb_mystere)
##############################
## Question 2 ##
# Variante : l'ordinateur ment (1 fois sur 4)
# nb_mystere = randint(0,99)
# for essai in range(7):
# print("Quel est le nombre mystère ?")
# reponse_str = input("Ta proposition : ")
# reponse_int = int(reponse_str)
# # 1 fois sur 4 (environ) l'ordinateur ment
# verite = True
# hasard = randint(1,4)
# if hasard == 4:
# verite = False
# if nb_mystere == reponse_int:
16
# print("Bravo !")
# break # Arrête la boucle
#
# if nb_mystere < reponse_int:
# if verite == True:
# print("Non, le nombre à trouver est plus petit !")
# else:
# print("Non, le nombre à trouver est plus grand !")
#
# if nb_mystere > reponse_int:
# if verite == True:
# print("Non, le nombre à trouver est plus grand !")
# else:
# print("Non, le nombre à trouver est plus petit !")
# # Lorsque c'est fini :
# if nb_mystere != reponse_int:
# print("Perdu ! Le nombre mystère était",nb_mystere)
##############################
## Question 3 ##
# Variante : le nombre mystère change un peu
# nb_mystere = randint(0,99)
# for essai in range(7):
# print("Quel est le nombre mystère ?")
# reponse_str = input("Ta proposition : ")
# reponse_int = int(reponse_str)
# # Modification du nb mystère
# hasard = randint(-3,3)
# nb_mystere = nb_mystere + hasard
# if nb_mystere < 1:
# nb_mystere = 1
# if nb_mystere > 99:
# nb_mystere = 99
# if nb_mystere == reponse_int:
# print("Bravo !")
# break # Arrête la boucle
# if nb_mystere < reponse_int:
# print("Non, le nombre à trouver est plus petit !")
# if nb_mystere > reponse_int:
# print("Non, le nombre à trouver est plus grand !")
# # Lorsque c'est fini :
# if nb_mystere != reponse_int:
# print("Perdu ! Le nombre mystère était",nb_mystere)
17
4. Fonctions
Activité 1
Activité 1 fonctions_1.py
##############################
# Fonctions - Idées
##############################
##############################
# Activité 1 - Introduction aux fonctions
##############################
##################################################
## Question 1 ##
# Test
affiche_table_de_7()
##################################################
def affiche_bonjour():
""" Dit bonjour """
prenom = input("Comment t'appelles-tu ? ")
print("Bonjour",prenom)
return
# Test
affiche_bonjour()
##################################################
## Question 2 ##
# Test
affiche_une_table(5)
18
##################################################
def affiche_salutation(formule):
""" Dit bonjour, bonsoir, au revoir... """
prenom = input("Comment t'appelles-tu ? ")
print(formule,prenom)
return
# Test
affiche_salutation("Coucou")
##################################################
## Question 3 ##
# Test
identite = demande_prenom_nom()
print("Identité :",identite)
Activité 2
Activité 2 fonctions_2.py
##############################
# Fonctions
##############################
##############################
# Activité 2 - Fonctions
##############################
##################################################
## Question 1 ##
# Test
print("--- Trinôme ---")
for i in range(10):
19
##################################################
def trinome_2(a,b,c,x):
""" Calcule ax^2+bx+c """
resultat = a*x**2 + b*x + c
return resultat
# Test
a = 2 ; b = -1 ; c = 0
print("Trinôme pour a,b,c =",a,b,c)
for i in range(10):
print("La valeur en x =",i,"est",trinome_2(a,b,c,i))
##################################################
## Question 2 ##
# Test
print("--- Devises ---")
x = 20
print(x,"euros valent", conversion_euros_vers_dollars(x),"dollars")
##################################################
def conversion_euros(montant,devise):
""" Calcule la valeur dans une monnaie d'un montant donné en euros """
if devise == "dollar":
taux = 1.15
if devise == "livre":
taux = 0.81
if devise == "yen":
taux = 130
montant_devise = montant * taux
return montant_devise
# Test
x = 100
for madevise in ["yen","dollar","livre"]:
print(x,"euros valent", conversion_euros(x,madevise),madevise)
##################################################
## Question 3 ##
from math import *
# Calculs de différents volumes
def volume_cube(a):
20
return a**3
def volume_boule(r):
return 4/3 * pi * r**3
def volume_cylindre(r,h):
return pi * r**2 * h
def volume_boite(a,b,c):
return a * b * c
# Test
print("--- Volumes ---")
print(volume_cube(3))
print(volume_boule(3))
print(volume_cylindre(2,5))
print(volume_boite(3,4,5))
##################################################
## Question 4 ##
def perimetre_aire_rectangle(a,b):
""" Calcule le périmètre et l'aire
d'un rectangle de côtés a et b """
p = 2*a+2*b
A = a * b
return p, A
def perimetre_aire_disque(r):
""" Calcule le périmètre et l'aire
d'un disque de rayon r """
p = 2 * pi * r
A = pi * r**2
return p, A
print("--- Périmètres et aires ---")
print(perimetre_aire_rectangle(4,5))
print(perimetre_aire_disque(3))
Activité 3
Activité 3 fonctions_3.py
##############################
# Fonctions
##############################
21
##############################
# Activité 3 - Tortue
##############################
from turtle import *
width(5) # Epaisseur du trait
##############################
## Question 1 ##
def triangle():
color('red')
forward(200)
left(120)
forward(200)
left(120)
forward(200)
return
# Test
# triangle()
# exitonclick()
##############################
## Question 2 ##
def carre():
color('green')
for i in range(4):
forward(200)
left(90)
return
# Test
# carre()
# exitonclick()
##############################
## Question 3 ##
def hexagone(longueur):
color('blue')
for i in range(6):
forward(longueur)
left(60)
return
# Test
# hexagone(100)
# exitonclick()
##############################
## Question 4 ##
def polygone(n,longueur):
color('purple')
angle = 360/n
for i in range(n):
forward(longueur)
left(angle)
return
22
# Test
# polygone(10,70)
# exitonclick()
# Test tout
up()
goto(-450,0)
down()
triangle()
up()
goto(-200,0)
setheading(0)
down()
carre()
up()
goto(100,0)
setheading(0)
down()
hexagone(100)
up()
goto(320,0)
setheading(0)
down()
polygone(8,70)
up()
exitonclick()
Activité 4
Activité 4 fonctions_4.py
##############################
# Fonctions
##############################
##############################
# Activité 4 - Fonctions
##############################
##################################################
## Question 1 ##
def reduction(age):
""" Renvoie le pourcentage de réduction en fonction de l'âge """
if age < 10:
reduc = 50
elif age <= 18:
reduc = 30
elif age >= 60:
reduc = 20
else:
reduc = 0
return reduc
# Test
print("--- Réduction ---")
23
mon_age = 16
print("J'ai",mon_age,"ans et ma réduction est de",reduction(mon_age),"%.")
##################################################
def montant(tarif_normal,age):
""" Calcule le montant dû, en fonction du tarif normal et de l'âge """
reduc = reduction(age)
tarif = tarif_normal * (100-reduc)/100
return tarif
# Test
print("--- Coût total des billets ---")
montant_famille = montant(30,9) + 2*montant(20,16) + 2*montant(35,40)
print(montant_famille)
##################################################
## Question 2 ##
def calcul_est_exact(a,b,reponse):
""" Teste si le résultat de a*b est correct """
if reponse == a * b:
return True
else:
return False
# Test
print("--- Test résultat multiplication ---")
print(calcul_est_exact(6,7,42))
def test_multiplication(a,b,lang):
""" Pose une multiplication en français ou en anglais
et affiche si la réponse est correcte ou pas """
# Phrases en français et en anglais
if lang == "francais":
question = "Combien vaut le produit a x b ? "
reponse_juste = "Bravo !"
reponse_fausse = "Eh non !"
if lang == "anglais":
question = "How much is the product a x b? "
reponse_juste = "Well done!"
reponse_fausse = "It's wrong!"
# Interrogation
print("--- Question ---")
print("a =",a)
print("b =",b)
reponse = int(input(question))
if calcul_est_exact(a,b,reponse):
print(reponse_juste)
else:
print(reponse_fausse)
return
# Test
print("--- Quiz multiplication français/anglais ---")
test_multiplication(6,7,"anglais")
24
Activité 5
Activité 5 fonctions_5.py
##############################
# Fonctions
##############################
##############################
# Activité 5 - Egalité expérimentale
##############################
from math import *
##################################################
## Question 1 ##
def valeur_absolue(x):
if x >= 0:
return x
else:
return -x
##################################################
# def valeur_absolue_moins(x):
# return valeur_absolue(-x)
##################################################
def racine_du_carre(x):
return sqrt(x**2)
##################################################
def egalite_experimentale_1(f,g):
""" Teste si deux fonctions sont expérimentalement égales """
for i in range(-100,101):
if f(i) != g(i):
return False
return True
# Test
print("--- Egalité experimentale, une variable ---")
# print(egalite_experimentale_1(valeur_absolue,valeur_absolue_moins)) # Vrai
print(egalite_experimentale_1(valeur_absolue,racine_du_carre)) # Vrai
##################################################
## Question 2 ##
def F1(a,b):
return (a+b)**2
##################################################
def F2(a,b):
return a**2 + 2*a*b + b**2
##################################################
def F3(a,b):
return (a-b)**3
##################################################
def F4(a,b):
25
##################################################
def F5(a,b):
return a**3 - 3*a**2*b + 3*a * b**2 - b**3
################################################
def egalite_experimentale_2(F,G):
""" Teste si deux fonctions de deux variables sont expérimentalement égales """
for i in range(-100,101):
for j in range(-100,101):
if F(i,j) != G(i,j):
# print(i,j,F(i,j),G(i,j))
return False
return True
# Test
print("--- Egalité experimentale, deux variables ---")
print(egalite_experimentale_2(F1,F2)) # Vrai
print(egalite_experimentale_2(F3,F4)) # Faux
print(egalite_experimentale_2(F3,F5)) # Vrai
################################################
## Question 3 ##
def sincos(x):
return sin(x)**2 + cos(x)**2
################################################
def un(x):
return 1
##################################################
precision = 0.00001 # = 10**-5
def egalite_experimentale_3(f,g):
""" Teste si deux fonctions sont expérimentalement égales
en autorisant une marge d'erreur """
for i in range(-100,101):
if abs(f(i) - g(i))> precision :
return False
return True
# Test
print("--- Egalité experimentale approchée ---")
print(egalite_experimentale_1(sincos,un)) # Faux !! Mais pourtant devrait être vrai !
print(sin(3)**2+cos(3)**2) # Explication : Python ne renvoie par exactement 1
print(egalite_experimentale_3(sincos,un)) # Vrai !
################################################
# Une égalité fausse mais experimentalement vraie
def g1(x):
return sin(pi*x)
26
################################################
def g2(x):
return 0
print("--- Une égalité fausse mais experimentalement vraie ---")
print(egalite_experimentale_3(g1,g2)) # Vrai (on a toujours égalité pour i entier)
print(g1(1/2)) # et pourtant g1(0.5) n'est pas nul, donc l'égalité n'est pas vrai en
,→ général
Activité 1
Activité 1 tantque_1.py
##############################
# Tant que - Booléen - Arithmétiques
##############################
##############################
# Activité 1 - Divisibilité, quotient, reste
##############################
##############################
## Question 1 ##
def quotient_reste(a,b):
""" Affiche le quotient et le reste et vérifie
la validité de la division euclidienne """
q = a // b
r = a % b
print("Division de a =",a,"par b =",b)
print("Le quotient vaut q =",q)
print("Le reste vaut r =",r)
if (r >=0) and (r < b):
verif_reste = True
else:
verif_reste = False
print("Vérification reste 0 <= r < b ?",verif_reste)
if a == b*q +r:
verif_egal = True
else:
verif_egal = False
print("Vérification égalité a = bq + r ?",verif_egal)
return q,r
# Test
print("--- Quotient et reste ---")
quotient_reste(100,7)
##############################
## Question 2 ##
27
def est_pair(n):
""" Teste si l'entier n est pair ou pas (renvoie vrai ou faux) """
reste = n % 2
if reste == 0:
return True
else:
return False
def est_pair_bis(n):
""" Teste si l'entier n est pair ou pas (renvoie vrai ou faux) """
chiffre = n % 10
if (chiffre==0) or (chiffre==2) or (chiffre==4) or (chiffre==6) or (chiffre==8):
return True
else:
return False
# En deux lignes !
def est_pair_ter(n):
return (n % 2) == 0
# Test
print("--- Parité ---")
print(est_pair(1023))
##############################
## Question 3 ##
def est_divisible(a,b):
""" Teste si a est divisible par b """
if a % b == 0:
return True
else:
return False
# Test
print("--- Divisibilité ---")
print(est_divisible(125,5))
Activité 2
Activité 2 tantque_2.py
##############################
# Tant que - Booléen - Arithmétiques
##############################
##############################
# Activité 2 - Diviseur, nombres premiers - Boucle while
##############################
##############################
## Question 1 ##
def plus_petit_diviseur(n):
""" Cherche le plus petit diviseur de n """
d = 2
28
while n % d != 0:
d = d + 1
return d
# Test
print("--- Plus petit diviseur ---")
print(plus_petit_diviseur(7*13))
##############################
## Question 2 ##
def est_premier_1(n):
""" Teste si n est un nombre premier """
d = 2
while n % d != 0:
d = d + 1
if d == n:
return True
else:
return False
# Test
print("--- Est premier (1) ---")
print(est_premier_1(97))
##############################
## Question 3 ##
# Nombre de Fermat
def contre_exemple_fermat():
for n in range(6):
fermat = 2**(2**n)+1
print(n,fermat,est_premier_1(fermat))
return
# Test
print("--- Test conjecture nombres de Fermat ---")
contre_exemple_fermat()
##############################
## Question 4 ##
def est_premier_2(n):
""" Teste si n est un nombre premier """
if n < 2:
return False
d = 2
while (n % d != 0) and (d**2 <= n):
d = d + 1
if d** 2 > n:
return True
else:
return False
# Test
print("--- Est premier (2) ---")
print(est_premier_2(97))
29
##############################
## Question 4 ##
def est_premier_3(n):
""" Teste si n est un nombre premier """
if n < 2: return False
if n == 2: return True
if n % 2 == 0: return False
d = 3
while (n % d != 0) and (d**2 <= n):
d = d + 2
if d ** 2 > n:
return True
else:
return False
# Test
print("--- Est premier (3) ---")
print(est_premier_3(97))
##############################
## Question 5 ##
# Calcul les temps d'éxécution des différentes fonctions est_premier()
import timeit
print([Link]("est_premier_1(97)", setup="from __main__ import est_premier_1", number
,→ =10000))
print([Link]("est_premier_2(97)", setup="from __main__ import est_premier_2", number
,→ =10000))
print([Link]("est_premier_3(97)", setup="from __main__ import est_premier_3", number
,→ =10000))
##############################
# On garde la plus efficace !
def est_premier(n):
return est_premier_3(n)
Activité 3
Activité 3 tantque_3.py
##############################
# Tant que - Booléen - Arithmétiques
##############################
##############################
# Activité 3 - Diviseur, nombres premiers - Boucle while (suite)
##############################
##############################
# Rappel : activité 2
30
def est_premier(n):
if n < 2: return False
if n == 2: return True
if n % 2 == 0: return False
d = 3
while (n % d != 0) and (d**2 <= n):
d = d + 2
if d ** 2 > n:
return True
else:
return False
##############################
##############################
##############################
## Question 1 ##
def nombre_premier_apres(n):
""" Cherche le prochain nombre premier après n """
p = n
while not est_premier(p):
p = p + 1
return p
# Test
print("--- Premier nombre premier après un entier ---")
print(nombre_premier_apres(60))
print(nombre_premier_apres(100000))
##############################
## Question 2 ##
def nombres_jumeaux_apres(n):
""" Trouve deux nombre premiers jumeaux après n """
p = n
q = p + 2
while (not est_premier(p)) or (not est_premier(q)):
p = p + 1
q = p + 2
return p,q
# Test
print("--- Premiers nombres jumeaux après un entier ---")
print(nombres_jumeaux_apres(60))
print(nombres_jumeaux_apres(100000))
##############################
## Question 3 ##
def nombre_germain_apres(n):
""" Trouve deux nombre premiers de Germain après n """
p = n
q = 2*p + 1
while (not est_premier(p)) or (not est_premier(q)):
p = p + 1
q = 2*p + 1
return p,q
# Test
31
Activité 1
Activité 1 chaines_1.py
##############################
# Chaînes de caractères - Analyse statistique d'un texte
##############################
##############################
# Activité 1 - Pluriels
##############################
## Question 1 ##
mot = "chat"
pluriel = mot + "s"
print("Mon mot : ",mot)
print("Au pluriel : ",pluriel)
## Question 2 ##
# mot = "chat"
mot = "souris"
derniere_lettre = mot[len(mot)-1]
if derniere_lettre == "s":
pluriel = mot
else:
pluriel = mot + "s"
print("Mon mot : ",mot)
print("Au pluriel : ",pluriel)
## Question 3 ##
# mot = "chat"
# mot = "souris"
mot = "journal"
derniere_lettre = mot[len(mot)-1]
avant_derniere_lettre = mot[len(mot)-2]
if derniere_lettre == "s":
pluriel = mot
elif avant_derniere_lettre == "a" and derniere_lettre == "l":
debut_mot = mot[0:len(mot)-2]
pluriel = debut_mot + "aux"
else:
pluriel = mot + 's'
print("Mon mot : ",mot)
print("Au pluriel : ",pluriel)
32
## Question 4 ##
# Test
#mot = input("Dis moi un mot : ")
#pluriel = met_au_pluriel(mot)
#print("Son pluriel est :",pluriel)
## Question 5 ##
def affiche_conjugaison(verbe):
""" Conjugue au présent.
Entrée : un verbe du premier groupe
Sortie : affiche la conjugaison au présent"""
debut_verbe = verbe[0:len(verbe)-2]
fin_verbe = verbe[len(verbe)-2:len(verbe)]
if fin_verbe == "er":
print("Je " + debut_verbe + "e\n")
print("Tu " + debut_verbe + "es\n")
print("Il/elle " + debut_verbe + "e\n")
print("Nous " + debut_verbe + "ons\n")
print("Vous " + debut_verbe + "ez\n")
print("Ils/elles " + debut_verbe + "ent\n")
else:
print("Ce n'est pas un verbe du premier groupe !")
return
# Test
verbe = input("Donne-moi un verbe du premier groupe : ")
affiche_conjugaison(verbe)
33
Activité 2
Activité 2 chaines_2.py
##############################
# Chaînes de caractères - Analyse statistique d'un texte
##############################
##############################
# Activité 2 - Jeux de mots
##############################
## Question 1 ##
def distance_hamming(mot1,mot2):
""" Calcule la distance de Hamming
Entrée : deux mots de même longueur
Sortie : la distance entre ces mots """
distance = 0
for i in range(len(mot1)):
if mot1[i] != mot2[i]:
distance = distance + 1
return distance
# Test
premier_mot = "JAPON"
second_mot = "SAVON"
dist = distance_hamming(premier_mot,second_mot)
print("La distance entre",premier_mot,"et",second_mot, "est",dist)
## Question 2 ##
def transforme_en_latin_cochon(mot):
""" Transforme un mot en latin-cochon
Entrée : un mot (une chaîne de caractères)
Sortie : le mot transformé en latin cochon s'il commence par une consonne. """
premiere_lettre = mot[0]
reste_mot = mot[1:len(mot)]
if premiere_lettre not in ["A", "E", "I", "O", "U", "Y"]:
latin_cochon = reste_mot + premiere_lettre + "UM"
else:
latin_cochon = mot
return latin_cochon
# Test
mot = "SALOPETTE"
latin = transforme_en_latin_cochon(mot)
print("Le mot",mot,"devient",latin,"!")
## Question 3 ##
def transforme_en_verlan(mot):
""" Transforme un mot en verlan
Entrée : un mot (une chaîne de caractères)
Sortie : le mot transformé verlan """
verlan = ""
34
# Test
mot = "BONJOUR"
verlan = transforme_en_verlan(mot)
print("Le mot",mot,"devient",verlan,"!")
## Question 4 ##
def est_un_palindrome(mot):
""" Détermine si un mot est un palindrome
Entrée : un mot (une chaîne de caractères)
Sortie : vrai si le mot est un palindrome, faux sinon """
verlan = transforme_en_verlan(mot)
if mot == verlan:
return True
else:
return False
# Test
mot = "KAYAK"
print("Le mot",mot,"est-il un palindrome ? : ",est_un_palindrome(mot))
Activité 3
Activité 3 chaines_3.py
##############################
# Chaînes de caractères - Analyse statistique d'un texte
##############################
##############################
# Activité 3 - Séquences d'ADN
##############################
## Question 1 ##
def presence_de_A(sequence):
""" Détermine la présence du nucléotides A
Entrée : une séquence de A,C,T,G (chaîne de caractères)
Sortie : vrai ou faux """
for nucleotide in sequence:
if nucleotide == 'A':
return True
return False
# Test
sequence = "AGACAGCGAGCATATGCAGGAAG"
reponse = presence_de_A(sequence)
print("Est-ce qu'il y a A dans la séquence",sequence," : ",reponse)
## Question 2 ##
35
def position_de_AT(sequence):
""" Détermine la position de la première séquence AT
Entrée : une séquence de A,C,T,G (chaîne de caractères)
Sortie : la position dans cette séquence (commence à 0) """
for i in range(len(sequence)-1):
if sequence[i] == 'A' and sequence[i+1] == 'T':
return i # Si trouvé
return None # Si pas du tout trouvé
# Test
sequence = "GTGGTTTGACCTCCCATGGCCAT"
position = position_de_AT(sequence)
print("Dans la séquence",sequence,"le code AT apparaît en position",position)
## Question 3 ##
def position(code,sequence):
""" Détermine la position du code dans la séquence
Entrée : une séquence de A,C,T,G (chaîne de caractères)
Sortie : la position dans cette séquence (commence à 0) """
for i in range(len(sequence)-len(code)):
if code == sequence[i:i+len(code)]:
return i # Si trouvé, c'est fini
return None # Si pas du tout trouvé
# Test
sequence = "GAAGACCTTCTCCTCCTGC"
code = "CCTC"
pos = position(code,sequence)
print("Dans la séquence",sequence,"le code",code,"apparaît en position",pos)
## Question 4 ##
def enquete():
moutarde = "CCTGGAGGGTGGCCCCACCGGCCGAGACAGCGAGCATATGCAGGAAGCGGCAGGAATAAGGAAAAGCAGC"
rose = "CTCCTGATGCTCCTCGCTTGGTGGTTTGAGTGGACCTCCCAGGCCAGTGCCGGGCCCCTCATAGGAGAGG"
pervenche = "AAGCTCGGGAGGTGGCCAGGCGGCAGGAAGGCGCACCCCCCCAGTACTCCGCGCGCCGGGACAGAATGCC"
leblanc = "CTGCAGGAACTTCTTCTGGAAGTACTTCTCCTCCTGCAAATAAAACCTCACCCATGAATGCTCACGCAAG"
code1 = "CATA"
code2 = "ATGC"
for suspect in [moutarde,rose,pervenche,leblanc]:
print(position(code1,suspect))
print(position(code2,suspect))
return
# Execution de l'enquête
enquete()
36
Activité 4
Activité 4 chaines_4.py
##############################
# Chaînes de caractères - Analyse statistique d'un texte
##############################
##############################
# Activité 4 - Majuscules/minuscules
##############################
## Question 1 ##
# A la machine
code = [80,121,116,104,111,110,32,101,115,116,32,115,121,109,112,64]
phrase = ""
for c in code:
phrase = phrase + chr(c)
print(phrase)
## Question 2 ##
for i in range(33,128):
print(i," : ",chr(i))
## Question 3 ##
exp1 = 'chr(ord("a")-32)'
exp2 = 'chr(ord("B")+32)'
print(exp1," donne ",eval(exp1))
print(exp2," donne ",eval(exp2))
## Question 4 ##
def lettre_majuscule(car):
""" Transforme une lettre minuscule en majuscule
Entrée : un caractère minuscule parmi "a",...,"z"
Sortie : le même caractère en majuscule """
ordre = ord(car)
nouv_ordre = ordre - 32
nouv_car = chr(nouv_ordre)
return nouv_car
# Test
print("La majuscule de a est",lettre_majuscule("a"))
## Question 5 ##
def majuscules(phrase):
""" Transforme une phrase en majuscules
Entrée : une phrase (une chaîne de caractères)
Sortie : la même phrase avec les lettres en majuscules """
nouv_phrase = ""
for car in phrase:
ordre = ord(car)
if ordre >= 97 and ordre <= 122:
# transformation en majuscule
37
# Test
phrase = "Bonjour le monde !"
print("La phrase",phrase,"devient",majuscules(phrase))
## Question 6 ##
def formate_prenom_nom(personne):
""" Transforme le nom d'une personne au format "Prenom NOM"
Entrée : le prénom et le nom d'une personne (sans accent, séparé par une espace)
Sortie : le nom complet au format "Prenom NOM" """
# On sépare le prénom du nom
prenom = ""
nom = ""
dans_le_prenom = True # On est dans le prénom
for car in personne:
if dans_le_prenom:
prenom = prenom + car
else:
nom = nom + car
if car == " ":
dans_le_prenom = False # Le prénom est fini
# On formate le prénom
nouv_prenom = majuscules(prenom[0])+minuscules(prenom[1:len(prenom)])
# On formate le nom
nouv_nom = majuscules(nom)
return nouv_prenom+nouv_nom
# Test
personne = "harry POTTER"
print(personne,"devient",formate_prenom_nom(personne))
personne = "LORD Voldemort"
print(personne,"devient",formate_prenom_nom(personne))
38
Activité 5
Activité 5 chaines_5.py
##############################
# Chaînes de caractères - Analyse statistique d'un texte
##############################
def nombre_E(phrase):
""" Compte le nombre de "E"
Entrée : une phrase en majuscule
Sortie : le nombre de "E" """
nb = 0
for car in phrase:
if car == "E":
nb = nb + 1
return nb
# Test
phrase = "ESPRIT ES TU LA"
print("La phrase",phrase,"contient",nombre_E(phrase),"fois la lettre E")
## Question 1 ##
def occurrences_lettre(lettre,phrase):
""" Compte le nombre d'occurrences d'une lettre donnée dans phrase
Entrée : une lettre et une phrase en majuscule
Sortie : le nombre de lettres """
nb = 0
for car in phrase:
if car == lettre:
nb = nb + 1
return nb
# Test
phrase = "ESPRIT ES TU LA"
print("La phrase",phrase,"contient",occurrences_lettre("S",phrase),"fois la lettre S")
## Question 2 ##
def nombre_lettres(phrase):
""" Compte le nombre total de lettres
Entrée : une phrase en majuscule
Sortie : le nombre total de lettres de "A" à "Z" """
alphabet = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
nb = 0
for car in phrase:
39
if car in alphabet:
nb = nb + 1
return nb
# Test
phrase = "ESPRIT ES TU LA"
print("La phrase",phrase,"contient",nombre_lettres(phrase),"lettres")
## Question 3 ##
def pourcentage_lettre(lettre,phrase):
""" Calcule le ratio d'une lettre donnée dans phrase
Entrée : une lettre et une phrase en majuscule
Sortie : le pourcentage d'apparition de la lettre """
nb_lettres = occurrences_lettre(lettre,phrase)
nb_total = nombre_lettres(phrase)
pourcentage = nb_lettres/nb_total*100
return pourcentage
# Test
phrase = "ESPRIT ES TU LA"
pourcentage = pourcentage_lettre("S",phrase)
print("La phrase",phrase,"contient",pourcentage,"% de lettre S")
print("Pourcentage arrondi :","{0:.2f}".format(pourcentage))
## Question 4 ##
def affiche_frequences(phrase):
""" Calcule le ratio de toutes les lettres dans une phrase
Entrée : uune phrase en majuscule
Sortie : l'affichage des pourcentage d'apparition des lettres """
alphabet = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
for lettre in alphabet:
pourcentage = pourcentage_lettre(lettre,phrase)
print(lettre," : ","{0:.2f}".format(pourcentage))
return
# SECRET ------------------
# Création de l'énigme
def myshuffle(x):
x = list(x)
[Link](x)
return x
#for mot in [Link]():
# print(list(mot))
# print(myshuffle(list(mot)))
# Le corbeau et le renard - Jean de la Fontaine
phrase1 = "MAITRE CORBEAU SUR UN ARBRE PERCHE TENAIT EN SON BEC UN FROMAGE MAITRE RENARD PAR
,→ L ODEUR ALLECHE LUI TINT A PEU PRES CE LANGAGE ET BONJOUR MONSIEUR DU CORBEAU QUE
,→ VOUS ETES JOLI QUE VOUS ME SEMBLEZ BEAU SANS MENTIR SI VOTRE RAMAGE SE RAPPORTE A
,→ VOTRE PLUMAGE VOUS ETES LE PHENIX DES HOTES DE CES BOIS A CES MOTS LE CORBEAU NE SE
,→ SENT PAS DE JOIE ET POUR MONTRER SA BELLE VOIX IL OUVRE UN LARGE BEC LAISSE TOMBER SA
,→ PROIE LE RENARD S EN SAISIT ET DIT MON BON MONSIEUR APPRENEZ QUE TOUT FLATTEUR VIT
,→ AUX DEPENS DE CELUI QUI L ECOUTE CETTE LECON VAUT BIEN UN FROMAGE SANS DOUTE LE
,→ CORBEAU HONTEUX ET CONFUS JURA MAIS UN PEU TARD QU ON NE L Y PRENDRAIT PLUS"
40
print(phrase_mystere1)
affiche_frequences(phrase_mystere1)
phrase_mystere2 = "WRE TREITE SO TSPA CUDHR AHNCT UND WIND SE STI RED AEVRT MTI ESEIMN IDNK
,→ RE ATH END NEABNK WLOH IN EMD AMR ER AFTSS HIN IHSERC RE AHTL HIN MRWA EINM SHNO SAW
,→ SRTIBG UD SO NGBA DNEI EIHSGTC ESISTH RAETV UD DEN LERNIOKG NITHC NDE LOENINKGRE TIM
,→ OKRN UDN CHWFSEI NEIM NSOH ES STI IEN BIFTRLSEEEN DU BILESE IKDN OMKM EHG MIT MIR RAG
,→ ECHNOS EPELSI EIPSL IHC ITM RDI HNCMA BEUTN MBLUNE DINS NA DEM TNDRAS NMIEE UTETMR
,→ AHT CAMHN UDNGEL GDAWEN MIEN EATRV MENI VEART DUN OSTHER DU CINTH SAW KNNOEIREGL RIM
,→ ILEES PRSTVRCIEH ISE IHGRU BEEILB RIGUH MNEI KNDI NI RDNEUR NATBRLET STAESUL EDR WNID
,→ "
print(phrase_mystere2)
affiche_frequences(phrase_mystere2)
phrase_mystere3 = "DSNOACAIF ORP ANU DAEDALRI DNAAEIMTI EQU NNCOSETE EL RSTEOUL SMA
,→ AACTFAITNS UQE EL TSVAO OINSRVUE DE US ANIGIICANOM EIORDP TOOD RTEIENS RPO LE
41
print(phrase_mystere3)
affiche_frequences(phrase_mystere3)
phrase_mystere4 = "IMTRUESMME DNA TEH LNGIIV SI EYAS SIFH REA GJPNUIM DNA HET TTNOCO IS GHIH
,→ OH OUYR DDADY SI IRHC DAN ROUY MA SI DOGO GKOILON OS USHH LTLIET BBYA NDOT OUY CYR
,→ NEO OF HESET GNSRONIM YUO RE NANGO SIER PU SNIGING NAD OULLY EPADRS YUOR GINSW DAN
,→ LYOLU KATE OT HET KSY TUB ITLL TATH MGNIRNO EREHT NATI INTGOHN ACN AHMR OYU TWIH
,→ DADYD NDA MYMMA NSTIDGAN YB"
print(phrase_mystere4)
affiche_frequences(phrase_mystere4)
7. Listes I
Activité 1
Activité 1 listes_I_1.py
##############################
# Listes I
##############################
##############################
# Cours 1
maliste = [11,13,17,19]
[Link](23)
[Link](29)
print(maliste[5])
len(maliste)
##############################
# Activité 1 - Intérêts
##############################
## Question 1 ##
##############################
def interets_simples(S0,p,n):
liste = [S0]
interets = S0 * p/100
S = S0
for i in range(n):
S = S + interets
[Link](S)
return liste
# Test
print("--- Intérêts simples ---")
liste_interets_simples = interets_simples(1000,10,12)
print(liste_interets_simples)
42
print(liste_interets_simples[11])
## Question 2 ##
##############################
def interets_composes(S0,p,n):
liste = [S0]
S = S0
for i in range(n):
interets = S * p/100
S = S + interets
[Link](S)
return liste
# Test
print("--- Intérêts composés ---")
liste_interets_composes = interets_composes(1000,7,12)
print(liste_interets_composes)
print(liste_interets_composes[11])
Activité 2
Activité 2 listes_I_2.py
##############################
# Listes I
##############################
##############################
##############################
# Cours 2
maliste = []
maliste = maliste + ["Un"]
maliste = ["Deux"] + maliste
maliste[1:5]
##############################
# Activité 2 - Manipulation de listes
##############################
## Question 1 ##
##############################
def rotation(liste):
n = len(liste)
new_liste = [liste[n-1]] + liste[0:n-1]
return new_liste
# Test
print("--- Rotation ---")
print(rotation([1,2,3,4]))
## Question 2 ##
##############################
def inverser(liste):
new_liste = []
43
## Question 3 ##
##############################
def supprimer_rang(liste,rang):
n = len(liste)
new_liste = liste[0:rang]+liste[rang+1:n]
return new_liste
# Test
print("--- Supprimer rang ---")
print(supprimer_rang([8,7,6,5,4],2))
## Question 4 ##
##############################
def supprimer_element(liste,element):
new_liste = []
for x in liste:
if x != element:
new_liste = new_liste + [x]
return new_liste
# Test
print("--- Supprimer élément ---")
print(supprimer_element([8,7,4,6,5,4],4))
##############################
##############################
# Cours 3 - Manipulation : conclusion
# reverse, reversed, [::-1]
print("--- Cours ---")
liste = [1,2,3,4]
print(liste[::-1])
[Link]()
print(liste)
print(list(reversed(liste)))
Activité 3
Activité 3 listes_I_3.py
##############################
# Listes I
##############################
##############################
# Activité 3 - Tri à bulle
##############################
def trier(liste):
newliste = list(liste)
n = len(newliste)
for i in range(n-1,-1,-1):
for j in range(i):
if newliste[j+1] < newliste[j]:
el = newliste[j]
newliste[j] = newliste[j+1]
newliste[j+1] = el
return newliste
# Test
print("--- Tri à bulles ---")
print(trier([13,11,7,4,6,8,12,6]))
liste = [13,11,7,4,6,8,12,6]
newliste = trier(liste)
print(liste)
print(newliste)
print(sorted([13,11,7,4,6,8,12,6]))
liste = [13,11,7,4,6,8,12,6]
[Link]()
print(liste)
Activité 4
Activité 4 listes_I_4.py
##############################
# Listes I
##############################
##############################
# Activité 4 - Arithmétique
##############################
## Question 1 ##
##############################
def facteurs_premiers(n):
45
liste = []
d = 2
while d <= n:
if n%d == 0:
liste = liste + [d]
n = n // d
else:
d = d + 1
# if len(liste)==0: # Cas d'un nb premier
# liste = [n]
return liste
# Test
print("--- Facteurs premiers ---")
n = 2*2*2*3*7*7*11
print(n)
print(facteurs_premiers(2*2*2*3*7*7*11))
## Question 2 ##
##############################
def liste_premiers(n):
liste = list(range(2,n))
for d in range(2,n):
for k in liste:
if k%d == 0 and k != d:
[Link](k)
return liste
print("--- Liste des nombres premiers ---")
print(liste_premiers(100))
Activité 1
Activité 1 statistique_1.py
##############################
# Statistique - Visualisation de données - tkinter
##############################
##############################
# Activité 1 - Calculs statistiques
##############################
from math import *
##################################################
## Question 1 ##
def somme(liste):
""" Calcule la somme des éléments
Entrée : une liste de nombres
Sortie : leur somme """
som = 0
46
for x in liste:
som = som + x
return som
# Test
print("--- Somme ---")
liste = [5,18,6,3]
print(liste)
print(somme(liste))
print(sum(liste))
##################################################
## Question 2 ##
def moyenne(liste):
""" Calcule la moyenne des éléments
Entrée : une liste de nombres
Sortie : leur moyenne """
nbliste = len(liste)
if nbliste == 0:
moy = 0
else:
moy = somme(liste) / nbliste
return moy
# Test
print("--- Moyenne ---")
liste = [5,18,6,3]
print(liste)
print(moyenne(liste))
##################################################
## Question 3 ##
def minimum(liste):
""" Calcule le minimum des éléments
Entrée : une liste de nombres
Sortie : leur minimum """
if len(liste) == 0:
return None
mini = liste[0]
for i in range(1,len(liste)):
if liste[i] < mini:
mini = liste[i]
return mini
# Test
print("--- Minimum ---")
liste = [6,8,2,10]
print(liste)
print(minimum(liste))
print(min(liste))
##################################################
def maximum(liste):
""" Calcule le maximum des éléments
47
# Test
print("--- Maximum ---")
liste = [6,8,2,10]
print(liste)
print(maximum(liste))
print(max(liste))
##################################################
## Question 4 ##
def variance(liste):
""" Calcule la variance des éléments
Entrée : une liste de nombres
Sortie : leur variance """
if len(liste) == 0:
return 0
moy = moyenne(liste)
somme_carres = 0
for x in liste:
somme_carres = somme_carres + (x-moy)**2
var = somme_carres / len(liste)
return var
# Test
print("--- Variance ---")
liste = [6,8,2,10]
print(liste)
print(variance(liste))
##################################################
## Question 5 ##
def ecart_type(liste):
""" Calcule l'écart-type des éléments
Entrée : une liste de nombres
Sortie : leur écart-type """
eca = sqrt(variance(liste))
return eca
# Test
print("--- Ecart-type ---")
liste = [6,8,2,10]
print(liste)
print(ecart_type(liste))
48
##################################################
## Question 6 ##
temp_brest = [6.4,6.5,8.5,9.7,11.9,14.6,15.9,16.3,15.1,12.2,9.2,7.1]
temp_strasbourg = [0.9,2.4,6.1,9.7,13.8,17.2,19.2,18.6,15.7,10.7,5.3,2.1]
print(moyenne(temp_brest))
print(moyenne(temp_strasbourg))
print(ecart_type(temp_brest))
print(ecart_type(temp_strasbourg))
Activité 2
Activité 2 statistique_2.py
##############################
# Statistique - Visualisation de données - tkinter
##############################
##############################
# Activité 2 - Visualisation des données
##############################
##############################
## Question 0 ##
from math import *
from random import *
from tkinter import *
# Fenêtre tkinter
root = Tk()
canvas = Canvas(root, width=800, height=600, background="white")
[Link](side=LEFT, padx=5, pady=5)
def une_couleur():
""" Renvoie une couleur au hasard
Entrée : rien
Sortie : une couleur """
# Méthode 1 - Choix limité
# couleurs = ["red","orange","yellow","green","cyan","blue","violet","purple"]
# coul = [Link](couleurs)
# Méthode 2 - Choix "infini"
R = randint(0,255)
V = randint(0,255)
B = randint(0,255)
coul = '#%02x%02x%02x' % (R, V, B)
return coul
##################################################
## Question 1 ##
def graphique_barres(liste):
"""Graphique avec une barre par élément de la liste"""
49
posx = 100
for x in liste:
hauteur = x * echelle
canvas.create_rectangle(posx,400,posx+10,400-hauteur,fill="red")
posx = posx + 30
# Bonus : Coordonnées verticales à gauche
max_liste = max(liste)
canvas.create_line(90,400,90,400-echelle*max_liste)
for j in range(max_liste+1):
canvas.create_line(85,400-echelle*j,90,400-echelle*j)
canvas.create_text(80,400-echelle*j,text=str(j))
return
# Test
# echelle = 20
# liste = [5,8,6,3,7,10,4]
# graphique_barres(liste)
# [Link]()
##################################################
## Question 2 ##
def graphique_cumulatif(liste):
"""Graphique avec rectangles superposés"""
bas = 500
for x in liste:
hauteur = x * echelle
canvas.create_rectangle(100,bas,200,bas-hauteur,fill=une_couleur())
bas = bas - hauteur
# Bonus : Coordonnées verticales à gauche
max_liste = sum(liste)
canvas.create_line(90,500,90,500-echelle*max_liste)
for j in range(0,max_liste+1,5):
canvas.create_line(85,500-echelle*j,90,500-echelle*j)
canvas.create_text(80,500-echelle*j,text=str(j))
return
# Test
# echelle = 5
# liste = [5,8,6,3,7,10,4,12]
# graphique_cumulatif(liste)
# [Link]()
##################################################
## Question 3 ##
def graphique_pourcentage(liste):
"""Graphique rectangulaire divisé en sous-rectangles"""
somme = sum(liste)
posx = 100
for x in liste:
largeur = x/somme*100 * 5
canvas.create_rectangle(posx,300,posx+largeur,200,fill=une_couleur())
posx = posx + largeur
# Bonus : Coordonnées horizontales en dessous
canvas.create_line(100,325,600,325)
for i in range(0,11):
canvas.create_line(100+i*50,325,100+i*50,330)
50
canvas.create_text(100+i*50,340,text=str(i*10)+"%")
return
# Test
# echelle = 5
# liste = [5,8,6,3,7,10,4,12]
# graphique_pourcentage(liste)
# [Link]()
##################################################
## Question 4 ##
def graphique_secteurs(liste):
"""Graphique en camenbert"""
somme = sum(liste)
debut_angle = 0
for x in liste:
angle = x/somme*360
canvas.create_arc(200,100,550,450,start=debut_angle,extent=angle,style=PIESLICE,fill
,→ =une_couleur())
debut_angle = debut_angle + angle
return
# Test
# echelle = 5
# liste = [5,8,6,3,7,10,4,12]
# graphique_secteurs(liste)
# [Link]()
##################################################
## Question 5 ##
longueurs = [randint(5,15) for i in range(103)]
liste = [15,8,6,13,17,10,14,12]
def action_bouton1():
global echelle
echelle = 15
[Link]("all")
graphique_barres(liste)
return
def action_bouton2():
global echelle
echelle = 4
[Link]("all")
graphique_cumulatif(liste)
return
def action_bouton3():
[Link]("all")
graphique_pourcentage(liste)
return
def action_bouton4():
[Link]("all")
graphique_secteurs(liste)
return
def nouvelle_liste():
"""Génère une nouvelle liste aléatoire"""
global liste
n = randint(3,10)
51
Activité 3
Activité 3 statistique_3.py
##############################
# Statistique - Visualisation de données - tkinter
##############################
##############################
# Activité 3 - Calculs statistiques (bis)
##############################
##################################################
## Question 1 ##
from math import *
from random import *
def mediane(liste):
""" Calcule la médiane des éléments
Entrée : une liste de nombre
Sortie : leur médiane """
liste_triee = sorted(liste)
n = len(liste_triee)
if n%2 == 0: # n est pair
indice_milieu = n//2
med = (liste_triee[indice_milieu-1]+liste_triee[indice_milieu]) / 2
else:
indice_milieu = (n-1)//2
med = liste_triee[indice_milieu]
return med
52
# Test
print("--- Médiane ---")
liste = [5,18,6,3]
print(liste)
print(mediane(liste))
##################################################
## Question 2 ##
def notes_vers_liste(effectif_notes):
""" Convertit un effectif de notes en une liste de notes
Entrée : une liste d'effectif de notes
Sortie : la liste des notes """
liste = []
for i in range(len(effectif_notes)):
nb = effectif_notes[i]
liste = liste + [i]*nb
return liste
# Test
print("--- Liste à partir d'un effectif ---")
effectif_notes = [0,0,0,0,0,1,0,2,0,1,5,1,2,3,2,4,1,2,0,1,0]
# effectif_notes = [randint(1,5) for i in range(21)]
print(effectif_notes)
print(notes_vers_liste(effectif_notes))
def mediane_notes(effectif_notes):
""" Calcule la médiane des notes
Entrée : une liste d'effectif de notes
Sortie : la médiane """
liste = notes_vers_liste(effectif_notes)
med = mediane(liste)
return med
# Test
print("--- Médiane des notes ---")
effectif_notes = [0,0,0,0,0,1,0,2,0,1,5,1,2,3,2,4,1,2,0,1,0]
print(effectif_notes)
print(mediane_notes(effectif_notes))
##################################################
## Question 3 ##
def calcule_quartiles(liste):
""" Calcule les quartiles de la liste
Entrée : une liste de nombre
Sortie : leur quartile Q1, Q2=med, Q3 """
med = mediane(liste)
liste_triee = sorted(liste)
n = len(liste_triee)
indice_milieu = n//2
if n%2 == 0: # si n pair
liste_inf = liste[:indice_milieu]
liste_sup = liste[indice_milieu:]
else: # n impair
liste_inf = liste[:indice_milieu+1]
liste_sup = liste[indice_milieu:]
53
Q1 = mediane(liste_inf)
Q3 = mediane(liste_sup)
return Q1, med, Q3
# Test
print("--- Quartiles ---")
liste = [3,4,5,7,12,50,100]
print(liste)
print(calcule_quartiles(liste))
##################################################
def quartiles_notes(effectif_notes):
""" Calcule les quartiles des notes
Entrée : une liste d'effectif de notes
Sortie : les quartiles """
liste = notes_vers_liste(effectif_notes)
Q1,Q2,Q3 = calcule_quartiles(liste)
return Q1, Q2, Q3
# Test
print("--- Quartiles des notes ---")
effectif_notes = [0,0,0,0,0,1,0,2,0,1,5,1,2,3,2,4,1,2,0,1,0]
print(effectif_notes)
print(quartiles_notes(effectif_notes))
Activité 4
Activité 4 statistique_4.py
##############################
# Statistique - Visualisation de données - tkinter
##############################
##############################
# Activité 4 - Visualisation des données (bis)
##############################
from math import *
from tkinter import *
from random import *
from statistique_3 import *
# Test
effectif_notes = [0,0,0,0,0,1,0,2,0,1,5,1,2,3,2,4,1,2,0,1,0]
diagramme_boite(effectif_notes)
[Link]()
Activité 5
Activité 5 statistique_5.py
##############################
# Statistique - Visualisation de données - tkinter
##############################
##############################
# Activité 5 - Visualisation des données (bis)
##############################
##################################################
## Question 1 ##
from random import *
def cours_bourse(n):
""" Simulation de n jours de bourse """
val = 1000
liste_val = [val]
for i in range(n-1):
val = val + randint(-10,12)/3
liste_val = liste_val + [val]
return liste_val
# Test
55
print(cours_bourse(100))
##################################################
## Question 2 ##
def graphique_point(liste):
""" Affiche la courbe des cours """
# Base 1000 en y = 300
canvas.create_line(100,300,100+365,300,width=3)
# Coordonnées verticale à gauche
canvas.create_line(95,420,95,80)
for j in range(-1,3):
canvas.create_line(90,300-100*j,95,300-100*j)
canvas.create_text(72,300-100*j,text=str(1000+j*100))
# Un point par jour
for i in range(len(liste)):
canvas.create_rectangle(100+i,300+1000-liste[i],100+i+1,300+1000-liste[i],outline="
,→ red")
return
# Fenêtre tkinter
from tkinter import *
root = Tk()
canvas = Canvas(root, width=800, height=600, background="white")
[Link](side=LEFT, padx=5, pady=5)
# Test
liste = cours_bourse(365)
# graphique_point(liste)
# [Link]()
##################################################
## Question 3 ##
def moyenne_mobile(liste,duree):
""" Calcule la moyenne mobile """
moy_mob = []
for i in range(len(liste)-duree+1):
moy = sum(liste[i:i+duree])/duree
moy_mob = moy_mob + [moy]
return moy_mob
# Test
liste = [1,2,3,4,5,6]
print(liste)
print(moyenne_mobile(liste,2))
####################################################
## Question 4 ##
def graphique_moyenne_mobile(liste):
""" Affiche les moyennes mobiles à 7 et 30 jours """
# moyenne 7 derniers jours
moyenne_7 = moyenne_mobile(liste,7)
for i in range(len(moyenne_7)):
canvas.create_rectangle(100+i+6,300+1000-moyenne_7[i],100+i+6+1,300+1000-moyenne_7[i
,→ ],outline="blue")
moyenne_30 = moyenne_mobile(liste,30)
for i in range(len(moyenne_30)):
canvas.create_rectangle(100+i+29,300+1000-moyenne_30[i],100+i+29+1,300+1000-
,→ moyenne_30[i],outline="sienna")
return
# Test
liste = cours_bourse(365)
graphique_point(liste) # Le cours au jour le jour
graphique_moyenne_mobile(liste) # La moyenne à 7 et 30 jours
[Link]()
9. Fichiers
Activité 1
Activité 1 fichiers_1.py
##############################
# Fichier
##############################
from random import *
##############################
# Activité 1 - Ecrire un fichier
##############################
## Question 1 ##
def ecrire_fichier_notes():
# Création d'un fichier en écriture
nom_fichier = "[Link]"
fic = open(nom_fichier,"w")
# Listes nom
liste_prenoms = ["Gargamel","Robin","Hermione","Arsène","Alice","James","Tintin"]
liste_noms = ["Skywalker","Lupin","Voldemort","Tchoupi","Bond","Tartuffe","Dubois"]
for i in range(7):
prenom = choice(liste_prenoms)
nom = choice(liste_noms)
notes = str(randint(10,40)/2) + " " + str(randint(10,40)/2) + " " + str(randint
,→ (10,40)/2)
ligne = prenom + " " + nom + " " + notes + "\n"
# Ecriture dans le fichier
[Link](ligne)
# Fermeture du fichier
[Link]()
return
# Test
print("--- Fichier '[Link]' ---")
ecrire_fichier_notes()
57
## Question 2 ##
def ecrire_fichier_moyennes():
# Fichier à lire
fichier_notes = "[Link]"
fic_in = open(fichier_notes,"r")
# Fichier à écrire
fichier_moyennes = "[Link]"
fic_out = open(fichier_moyennes,"w")
for ligne in fic_in:
liste = [Link]()
moyenne = (float(liste[2])+float(liste[3])+float(liste[4]))/3
#moyenne_str = str(moyenne)
moyenne_str = '{0:.2f}'.format(moyenne)
nouv_ligne = liste[0] + " " + liste[1] + " " + moyenne_str + "\n"
fic_out.write(nouv_ligne)
# Fermeture des fichiers
fic_in.close()
fic_out.close()
return
print("--- Fichier '[Link]' ---")
ecrire_fichier_moyennes()
Activité 2
Activité 2 fichiers_2.py
##############################
# Fichier
##############################
from random import *
import [Link] as plt
##############################
# Activité 2 -
##############################
## Question 1 ##
def fichier_ventes():
# Création d'un fichier en écriture
nom_fichiers = "[Link]"
fic = open(nom_fichiers,"w")
# Listes nom
liste_produits = ["Vélo VTT","Planche de surf","Chaussures de courses","Raquette de
,→ badminton","Ballon de volley"]
# Lignes du haut
[Link]("Meilleures ventes de la société 'Pentathlon'\n\n")
[Link](",2013,2014,2015,2016,2017,2018\n\n")
for produit in liste_produits:
# Génération des chiffres de vente au hasard
58
ventes = ""
for i in range(6):
ventes = ventes + "," + str(randint(50,100)*10)
ligne = produit + ventes + "\n"
# Ecriture dans le fichier
[Link](ligne)
# Fermeture du fichier
[Link]()
return
print("--- Fichier '[Link]' ---")
fichier_ventes()
## Question 2 ##
def afficher_ventes():
# Fichier à lire
fichier_ventes = "[Link]"
fic_in = open(fichier_ventes,"r")
num_ligne = 0
for ligne in fic_in:
if num_ligne > 3: # on oublie les lignes de titres
liste = [Link](",")
donnees = [float(x) for x in liste[1:]]
[Link](donnees)
num_ligne += 1
# Fermeture des fichiers
fic_in.close()
# Affichage
[Link]()
[Link]()
return
print("--- Affichages graphique de '[Link]' ---")
afficher_ventes()
Activité 3
Activité 3 fichiers_3.py
##############################
# Fichier
##############################
import os
##############################
# Activité 3 - Images
##############################
## Question 1 ##
def ecrire_fichier_image_nb():
59
for i in range(nb_lig):
ligne = ""
for j in range(nb_col):
coul = (i+j)//10 % 2
ligne = ligne + str(coul) + " "
ligne = ligne + "\n"
# Ecriture dans le fichier
[Link](ligne)
# Fermeture du fichier
[Link]()
return
# Test
print("--- Fichier '[Link]' ---")
ecrire_fichier_image_nb()
## Question 2 ##
def ecrire_fichier_image_gris():
# Création d'un fichier en écriture
nom_fichier = "image_gris.pgm"
fic = open(nom_fichier,"w")
# Entete
[Link]("P2\n") # Image en niveaux de gris
nb_col = 200
nb_lig = 200
[Link](str(nb_col) + " " + str(nb_lig) + "\n")
niveaux = 255
[Link](str(niveaux) + "\n")
for i in range(nb_lig):
ligne = ""
for j in range(nb_col):
coul = (i**2 + j**2) % 256 # un niveau de gris en fonction de i et j
ligne = ligne + str(coul) + " "
ligne = ligne + "\n"
# Ecriture dans le fichier
[Link](ligne)
# Fermeture du fichier
[Link]()
return
# Test
print("--- Fichier '[Link]' ---")
ecrire_fichier_image_gris()
## Question 3 ##
60
def ecrire_fichier_image_coul():
# Création d'un fichier en écriture
nom_fichier = "image_coul.ppm"
fic = open(nom_fichier,"w")
# Entete
[Link]("P3\n") # Image en couleurs
nb_col = 200
nb_lig = 200
[Link](str(nb_col) + " " + str(nb_lig) + "\n")
niveaux = 255
[Link](str(niveaux) + "\n")
for i in range(nb_lig):
ligne = ""
for j in range(nb_col):
R = (i*j) % 256 # niveau de rouge
V = i % 256 # niveau de vert
B = (i+j)//3 % 256 # niveau de bleu
ligne = ligne + str(R) + " " + str(V) + " " + str(B) + " "
ligne = ligne + "\n"
# Ecriture dans le fichier
[Link](ligne)
# Fermeture du fichier
[Link]()
return
# Test
print("--- Fichier '[Link]' ---")
ecrire_fichier_image_coul()
## Question 4 ##
def inverser_couleurs_nb(fichier):
# Fichier à lire
fic_in = open(fichier,"r")
# Fichier à écrire
nom, extension = [Link](fichier)
nouv_nom = nom + "_inverse"+extension
fic_out = open(nouv_nom,"w")
i = 0 # Numéro de ligne
for ligne in fic_in:
if i<2: # Garder les 2 premières lignes
fic_out.write(ligne)
else:
liste = [Link]()
nouv_ligne = ""
for l in liste:
if l == "1":
nouv_ligne = nouv_ligne + "0 "
else:
nouv_ligne = nouv_ligne + "1 "
nouv_ligne = nouv_ligne + "\n"
fic_out.write(nouv_ligne)
61
i = i + 1
# Fermeture des fichiers
fic_in.close()
fic_out.close()
return
print("--- Inversion des noirs et blancs ---")
inverser_couleurs_nb("simple_nb.pbm")
## Question 4 ##
def formule_couleur_vers_gris(R,V,B):
gris = round(0.21*R + 0.72*V + 0.07*R)
return gris
def couleurs_vers_gris(fichier):
# Fichier à lire
fic_in = open(fichier,"r")
# Fichier à écrire
nom, extension = [Link](fichier)
nouv_nom = nom + "_gris"+".pgm"
fic_out = open(nouv_nom,"w")
i = 0 # Numéro de ligne
for ligne in fic_in:
if i == 0:
fic_out.write("P2\n") # Image en niveaux de gris
elif i == 1 or i == 2: # Garder les lignes 2 et 3
fic_out.write(ligne)
else:
liste = [Link]()
nouv_ligne = ""
j = 0 # Numéro de colonne
while j < len(liste):
R = int(liste[j])
V = int(liste[j+1])
B = int(liste[j+2])
gris = formule_couleur_vers_gris(R,V,B)
nouv_ligne = nouv_ligne + str(gris) + " "
j = j + 3
nouv_ligne = nouv_ligne + "\n"
fic_out.write(nouv_ligne)
i = i + 1
# Fermeture des fichiers
fic_in.close()
fic_out.close()
return
print("--- Couleurs vers niveaux de gris ---")
couleurs_vers_gris("image_coul.ppm")
62
Activité 4
Activité 4 fichiers_4.py
##############################
# Fichier
##############################
from math import *
import os
##############################
# Activité 4 - Distances entre les villes
##############################
from math import *
## Question 1 ##
def distance_xy(x1,y1,x2,y2):
return sqrt( (x2-x1)**2 + (y2-y1)**2 )
## Question 2 ##
def fichier_distances_xy(fichier):
# Fichier à lire
fic_in = open(fichier,"r")
liste_villes = []
for ligne in fic_in:
liste_villes = liste_villes + [[Link]()]
# Fermeture du fichier
fic_in.close()
# Fichier à écrire
nom, extension = [Link](fichier)
nouv_nom = nom + "_distances"+".txt"
fic_out = open(nouv_nom,"w")
ligne = '{:>10s}'.format("")
for v in liste_villes:
nom = v[0]
ligne = ligne + '{:>10s}'.format(nom) +" "
fic_out.write(ligne + "\n")
for v1 in liste_villes:
nom1 = v1[0]
x1 = float(v1[1])
y1 = float(v1[2])
ligne = '{:10s}'.format(nom1)
for v2 in liste_villes:
nom2 = v2[0]
x2 = float(v2[1])
y2 = float(v2[2])
d = distance_xy(x1,y1,x2,y2)
ligne = ligne + '{:10d}'.format(round(d)) + " "
fic_out.write(ligne + "\n")
return
63
## Question 3 ##
def degres_vers_radians(a):
return 2*pi*a/360
def distance_approx_lat_long(lat1,long1,lat2,long2):
R = 6371 # rayon (moyen) de la Terre
x = (long2-long1)*cos( (lat1+lat2)/2 )
y = lat2-lat1
d = R * sqrt( x**2 + y**2 )
return d
# Test
Paris = (48.853,2.350)
Paris_radians = (degres_vers_radians(Paris[0]),degres_vers_radians(Paris[1]))
New_York = (40.713,-74.006)
New_York_radians = (degres_vers_radians(New_York[0]),degres_vers_radians(New_York[1]))
print("--- Distances approchées Terre ---")
d = distance_approx_lat_long(*Paris_radians,*New_York_radians)
print(d)
def distance_lat_long(lat1,long1,lat2,long2):
R = 6371 # rayon (moyen) de la Terre
a = (sin((lat2-lat1)/2))**2 + cos(lat1)*cos(lat2)*(sin((long2-long1)/2))**2
d = 2 * R * atan2(sqrt(a),sqrt(1-a))
return d
# Test
print("--- Distances exactes Terre ---")
d = distance_lat_long(*Paris_radians,*New_York_radians)
print(d)
## Question 3 ##
def fichier_distances_lat_long(fichier):
# Fichier à lire
fic_in = open(fichier,"r")
liste_villes = []
for ligne in fic_in:
liste_villes = liste_villes + [[Link]()]
# Fermeture du fichier
fic_in.close()
# Fichier à écrire
nom, extension = [Link](fichier)
nouv_nom = nom + "_distances"+".txt"
fic_out = open(nouv_nom,"w")
ligne = '{:>12s}'.format("")
for v in liste_villes:
nom = v[0]
ligne = ligne + '{:>12s}'.format(nom) +" "
fic_out.write(ligne + "\n")
for v1 in liste_villes:
nom1 = v1[0]
lat1 = degres_vers_radians(float(v1[1]))
64
long1 = degres_vers_radians(float(v1[2]))
ligne = '{:12s}'.format(nom1)
for v2 in liste_villes:
nom2 = v2[0]
lat2 = degres_vers_radians(float(v2[1]))
long2 = degres_vers_radians(float(v2[2]))
d = distance_lat_long(lat1,long1,lat2,long2)
ligne = ligne + '{:12d}'.format(round(d)) + " "
fic_out.write(ligne + "\n")
return
print("--- Villes lat_long ---")
fichier_distances_lat_long("villes_lat_long.txt")
Activité 1
Activité 1 tantque_4.py
##############################
# Tant que - Booléen - Arithmétiques
##############################
##############################
# Activité 4 - Conjecture(s) de Goldbach
##############################
from math import *
##############################
# Rappel : activité 2
def est_premier(n):
if n < 2: return False
if n == 2: return True
if n % 2 == 0: return False
d = 3
while (n % d != 0) and (d**2 <= n):
d = d + 2
if d ** 2 > n:
return True
else:
return False
##############################
##############################
##############################
## Question 1 ##
# La (vraie) conjecture de Goldbach (1742) :
# tout entier pair plus grand que 3 est la somme de deux nombres premiers
65
def nombre_solutions_goldbach(n):
""" Calcule le nb de décompositions n = p + q avec
n pair ; p, q premiers et q >= p """
# Si entier pas pair, c'est terminé
if n % 2 == 1:
print("Attention ! Entier non pair.")
return None
nb_sol = 0
for p in range(2,n//2+1):
q = n - p
if (q>=p) and (est_premier(p)) and (est_premier(q)):
print("n =",n,"somme de p =",p,", q = ",q)
nb_sol = nb_sol + 1
return nb_sol
# Test
print("--- Conjecture de Goldbach ---")
print(nombre_solutions_goldbach(100))
def test_conjecture_goldbach(nmax):
""" Vérifie la validité de la conjecture de Goldbach
pour les entiers pairs de 4 jusqu'à nmax """
print("Début du test")
for n in range(4,nmax,2):
if nombre_solutions_goldbach(n) == 0:
print("Problème avec n = ",n)
print("Fin du test")
return
# Test
print("--- Conjecture de Goldbach ---")
test_conjecture_goldbach(10000)
##############################
## Question 2 ##
# Goldbach 1752 :
# tout entier impair n peut s'écrire sous la forme
# n = p + 2k^2
# avec p premier et k entier (éventuellement nul)
def existe_decomposition_goldbach(n):
""" Teste si n impair peut se décomposer n = p + 2k^2
avec p premier et k entier """
maxk = ceil(sqrt(n/2))+1
for k in range(maxk):
p = n - 2 * k**2
if est_premier(p):
# print(n,p,k,n-p-2*k**2)
return True
return False
def contre_exemple_goldbach(nmax):
""" Cherche un contre-exemple à la seconde conjecture de Goldbach """
print("--- Début de la recherche ---")
for m in range(1,nmax):
n = 2 * m + 1
66
if existe_decomposition_goldbach(n) == False:
print("Contre-exemple :",n)
print("--- Fin de la recherche ---")
return
# Test
print("--- Test conjecture fausse de Goldbach ---")
print("Avec 5777 : ",existe_decomposition_goldbach(5777))
contre_exemple_goldbach(10000)
Activité 2
Activité 2 tantque_5.py
##############################
# Tant que - Booléen - Arithmétiques
##############################
##############################
# Activité 5 - Nombres ayant 4 ou 8 diviseurs
##############################
def nombre_de_diviseurs_2(n):
""" Nombre de diviseurs de n (y compris 1 et n) """
nb = 2 # on compte déjà 1 et n
for d in range(2,n//2+1):
if n % d == 0:
nb = nb + 1
return nb
# Test
print("--- Nombre de diviseurs ---")
print(nombre_de_diviseurs(100))
##############################
## Question 2 ##
def quatre_et_huit_diviseurs(Nmin,Nmax):
67
nb_quatre = 0
nb_huit = 0
for n in range(Nmin,Nmax):
nb = nombre_de_diviseurs(n)
if nb == 4:
nb_quatre = nb_quatre + 1
if nb == 8:
nb_huit = nb_huit + 1
return nb_quatre, nb_huit
# Test
print("--- Nombre ayant 4 puis 8 diviseurs ---")
print(quatre_et_huit_diviseurs(1,100))
##############################
## Question 3 ##
# Recherche de contre-exemple à la conjecture
# Il faut prendre N assez grand par exempel
# entre 1 et N = 250000 il y a plus d'entiers
# ayant 8 diviseurs que 4 diviseurs
Activité 3
Activité 3 tantque_6.py
##############################
# Tant que - Booléen - Arithmétiques
##############################
##############################
# Activité 6 - Conjecture fausse : 1211111... n'est jamais premier
##############################
##############################
# Rappel : activité 2
def est_premier(n):
if n < 2: return False
if n == 2: return True
if n % 2 == 0: return False
68
d = 3
while (n % d != 0) and (d**2 <= n):
d = d + 2
if d ** 2 > n:
return True
else:
return False
##############################
## Question 1 ##
def un_deux_un(k):
""" Calcule un entier 121111... """
u = 12
for i in range(k):
u = 10*u + 1
return u
# Test
print("--- 121111.... ---")
u = un_deux_un(10)
print(u)
##############################
## Question 2 ##
# Conjecture 1211111... n'est jamais premier
def test_premier_un_deux_un(kmax):
""" Teste si 121111... est premier ou pas """
for k in range(kmax):
uk = un_deux_un(k)
print(uk,est_premier(uk))
return
# Test
print("--- Test conj 121111.... jamais premier ---")
test_premier_un_deux_un(21)
# N'aboutira pas au contre-exemple
# Les calculs sont trop longs
##############################
## Question 3 ##
def est_presque_premier(n,r):
""" Teste si n n'a pas de diviseurs <= r """
if n < 2: return False
if n == 2: return True
if n % 2 == 0: return False
d = 3
while (n % d != 0) and (d ** 2 <= n) and (d <= r):
d = d + 2
if (d ** 2 > n) or (d > r):
return True
else:
return False
69
# Test
print("--- Test presque premier ---")
print(est_presque_premier(101,13))
##############################
## Question 4 ##
def test_presque_un_deux_un(kmax):
""" Teste si 121111... est presque premier """
n = 12
for k in range(kmax):
if est_presque_premier(n,1000000):
print(k,'Presque premier',n)
n = 10*n + 1
return
# Test
print("--- Test conj 121111.... jamais presque premier ---")
test_presque_un_deux_un(151)
11. Binaire I
Activités binaire_I.py
##############################
# Binaire - partie I
##############################
##############################
# Activité 1 - Decimale vers entier
##############################
## Question 1 ##
def decimale_vers_entier_1(liste_decimale):
nombre = 0
p = len(liste_decimale)
for i in range(p):
d = liste_decimale[p-1-i]
nombre = nombre + d*10**i
return nombre
## Question 1bis ##
def decimale_vers_entier_2(liste_decimale):
nombre = 0
i = 0
for d in reversed(liste_decimale):
nombre = nombre + d*10**i
i = i + 1
return nombre
# Test
print("--- Ecriture décimale vers entier ---")
liste = [1,2,3,4]
print(decimale_vers_entier_1(liste))
70
print(decimale_vers_entier_2(liste))
##############################
# Activité 2 - Binaire vers entier
##############################
## Question 1 ##
def binaire_vers_entier_1(liste_binaire):
nombre = 0
p = len(liste_binaire)
for i in range(p):
if liste_binaire[p-1-i] == 1:
nombre = nombre + 2**i
return nombre
## Question 1bis ##
def binaire_vers_entier_2(liste_binaire):
nombre = 0
i = 0
for b in reversed(liste_binaire):
if b == 1:
nombre = nombre + 2**i
i = i + 1
return nombre
## Question 2 ##
def binaire_vers_entier_bis(liste_binaire):
nombre = 0
for b in liste_binaire:
if b == 0:
nombre = nombre*2
else:
nombre = nombre*2 + 1
return nombre
# Test
print("--- Ecriture binaire vers entier ---")
liste = [1,1,0,1,1,0,0,1]
print(binaire_vers_entier_1(liste))
print(binaire_vers_entier_2(liste))
print(binaire_vers_entier_bis(liste))
## Question 3 (à virer) ##
# Utilise bin() [pas très fantastique]
def liste_vers_chaine(liste_binaire):
liste_chaine = [str(b) for b in liste_binaire]
chaine = "".join(liste_chaine)
chaine = "0b" + chaine
return chaine
def binaire_vers_entier_4(liste_binaire):
chaine = liste_vers_chaine(liste_binaire)
nombre = int(chaine,2)
71
return nombre
# print("--- Ecriture binaire vers entier avec bin() ---")
# liste = [1,1,0,1,1,0,0,1]
# print(liste_vers_chaine(liste))
# print(binaire_vers_entier_4(liste))
##############################
# Activité 3 - Ecriture décimale
##############################
def entier_vers_decimale(n):
if n==0: return [0]
liste_decimale = []
while n != 0:
liste_decimale = [n%10] + liste_decimale
n = n//10
return liste_decimale
# Test
print("--- Entier vers écriture décimale ---")
n = 1234
liste = entier_vers_decimale(n)
entier = decimale_vers_entier_1(liste)
print(n)
print(liste)
print(entier)
##############################
# Activité 4 - Ecriture binaire
##############################
def entier_vers_binaire(n):
if n==0: return [0]
liste_binaire = []
while n != 0:
liste_binaire = [n%2] + liste_binaire
n = n//2
return liste_binaire
# Test
print("--- Entier vers écriture binaire ---")
n = 1234
liste = entier_vers_binaire(n)
entier = binaire_vers_entier_1(liste)
print(n)
print(liste)
print(entier)
72
12. Listes II
Activité 1
Activité 1 listes_II_1.py
##############################
# Listes II
##############################
##############################
# Activité 1 - Manipulation de listes
##############################
## Question 1 ##
##############################
def multiplier(liste,k):
return [k*x for x in liste]
## Question 2 ##
##############################
def puissance(liste,k):
return [x**k for x in liste]
## Question 3 ##
##############################
def addition(liste1,liste2):
liste_add = []
for i in range(len(liste1)):
liste_add.append(liste1[i]+liste2[i])
return liste_add
## Question 4 ##
##############################
def non_zero(liste):
return [x for x in liste if x != 0]
## Question 5 ##
##############################
def pairs(liste):
return [x for x in liste if x % 2 == 0]
# Test
print("--- Multiplier ---")
print(multiplier([1,2,3,4,5],2))
print("--- Puissance ---")
print(puissance([1,2,3,4,5],3))
print("--- Addition ---")
print(addition([1,2,3],[4,5,6]))
print("--- Sans zéro ---")
print(non_zero([1,0,2,3,0,4,5,0]))
print("--- Pairs ---")
print(pairs([1,0,2,3,0,4,5,0]))
73
Activité 2
Activité 2 listes_II_2.py
##############################
# Listes II
##############################
from random import *
##############################
# Activité 2 - Somme fixée
##############################
##############################
## Question 2 ##
##############################
# Trouver deux élément différents dont la somme vaut 100
def somme_deux_100(liste):
n = len(liste)
for i in range(n-1):
for j in range(i+1,n):
if liste[i]+liste[j] == 100:
# print(i,j,liste[i],liste[j])
return True
return False
## Question 3 ##
##############################
# Suite de termes consécutifs qui font 100
def somme_suite_100(liste):
n = len(liste)
for i in range(n):
somme = 0
j = i
while somme < 100 and j < n:
somme = somme + liste[j]
74
j = j + 1
if somme == 100:
# print(i,j-1,liste[i:j])
return True
return False
##############################
print("--- Somme deux consécutifs ---")
print(somme_deux_consecutifs_100(liste_20))
print(somme_deux_consecutifs_100(liste_200))
print("--- Somme deux qcq ---")
print(somme_deux_100(liste_20))
print(somme_deux_100(liste_200))
print("--- Somme suites ---")
print(somme_suite_100(liste_20))
print(somme_suite_100(liste_200))
## Question 3 ##
##############################
# Idées proba : Quelle long donne prob > 1/2
##############################
def proba_1(n,N):
nb = 0
for k in range(N):
liste_n = liste_n = [randint(1,99) for i in range(n)]
trouve = somme_deux_consecutifs_100(liste_n)
if trouve:
nb += 1
return nb/N
##############################
def proba_2(n,N):
nb = 0
for k in range(N):
liste_n = liste_n = [randint(1,99) for i in range(n)]
trouve = somme_deux_100(liste_n)
if trouve:
nb += 1
return nb/N
##############################
def proba_3(n,N):
nb = 0
for k in range(N):
liste_n = liste_n = [randint(1,99) for i in range(n)]
trouve = somme_suite_100(liste_n)
if trouve:
nb += 1
return nb/N
Activité 3
Activité 3 listes_II_3.py
##############################
# Listes II
##############################
##############################
# Activité 3 - Tableau à deux dimensions
##############################
## Question 1 ##
##############################
def somme_diagonale(tableau):
n = len(tableau)
somme = 0
for i in range(n):
somme = somme + tableau[i][i]
return somme
## Question 2 ##
##############################
def somme_anti_diagonale(tableau):
n = len(tableau)
somme = 0
for i in range(n):
somme = somme + tableau[n-1-i][i]
return somme
## Question 3 ##
##############################
def somme_tout(tableau):
n = len(tableau)
somme = 0
for i in range(n):
for j in range(n):
somme = somme + tableau[i][i]
return somme
## Question 4 ##
##############################
def affiche_tableau(tableau):
"""
Affiche un tableau carré à l'écran
Entrée : un tableau de taille n x n
Sortie : rien (affichage à l'écran)
"""
n = len(tableau)
76
for i in range(n):
for j in range(n):
print('{:>3d}'.format(tableau[i][j]),end="")
print()
return
##############################
tableau = [ [1,2,3], [4,5,6], [7,8,9] ]
print("--- Somme diagonale ---")
print(somme_diagonale(tableau))
print("--- Somme anti-diagonale ---")
print(somme_anti_diagonale(tableau))
print("--- Somme tout ---")
print(somme_tout(tableau))
print("--- Affichage ---")
affiche_tableau(tableau)
Activité 4
Activité 4 listes_II_4.py
##############################
# Listes II - Idées
##############################
from random import *
##############################
# Activité 3 - Rappels
##############################
##################################################
def affiche_tableau(tableau):
"""
Affiche un carré à l'écran
Entrée : un tableau de taille n x n
Sortie : rien (affichage à l'écran)
"""
n = len(tableau)
for i in range(n):
for j in range(n):
print('{:>3d}'.format(tableau[i][j])," ", end="")
print()
return
##############################
def somme_diagonale(tableau):
n = len(tableau)
somme = 0
for i in range(n):
somme = somme + tableau[i][i]
return somme
77
##############################
def somme_anti_diagonale(tableau):
n = len(tableau)
somme = 0
for i in range(n):
somme = somme + tableau[n-1-i][i]
return somme
##############################
# Activité 4 - Carrés magiques
##############################
## Question 1 ##
##############################
print("--- Carré magique ---")
# carre = [ [1,2,3], [4,5,6], [7,8,9] ]
carre_3x3 = [ [4,9,2], [3,5,7], [8,1,6] ]
carre_4x4 = [ [1,14,15,4], [7,9,6,12], [10,8,11,5], [16,3,2,13] ]
print("--- Carré 3x3 ---")
affiche_tableau(carre_3x3)
print("--- Carré 4x4 ---")
affiche_tableau(carre_4x4)
## Question 2 ##
##############################
def est_carre_magique(carre):
n = len(carre)
total = n * (n**2 + 1) // 2
if somme_diagonale(carre) != total:
return False
if somme_anti_diagonale(carre) != total:
return False
for ligne in carre:
if sum(ligne) != total:
return False
for j in range(n):
somme = 0
for i in range(n):
somme = somme + carre[i][j]
if somme != total:
return False
return True
print("--- Vérification carré magique ---")
print(est_carre_magique(carre_3x3))
print(est_carre_magique(carre_4x4))
## Question 3 ##
##############################
def carre_aleatoire(n):
entiers = list(range(1,n**2+1))
shuffle(entiers)
carre = [ entiers[i*n:(i+1)*n] for i in range(n) ]
return carre
78
## Question 4 ##
##############################
def addition_carre(carre,k):
n = len(carre)
nouv_carre = [[0 for j in range(n)] for i in range(n)]
for i in range(n):
for j in range(n):
nouv_carre[i][j] = carre[i][j] + k
return nouv_carre
## Question 4 ##
##############################
def multiplication_carre(carre,k):
n = len(carre)
nouv_carre = [[0 for j in range(n)] for i in range(n)]
for i in range(n):
for j in range(n):
nouv_carre[i][j] = carre[i][j] * k
return nouv_carre
# Test
print("--- Addition, multiplication de carrés magiques ---")
# carre = [ [1,2,3], [4,5,6], [7,8,9] ]
carre = [ [4,9,2], [3,5,7], [8,1,6] ]
somme_carre = addition_carre(carre,-1)
produit_carre = multiplication_carre(carre,9)
affiche_tableau(carre)
affiche_tableau(somme_carre)
affiche_tableau(produit_carre)
## Question 5 ##
##############################
def homothetie_carre(carre,k):
n = len(carre)
nouv_carre = [[0 for j in range(k*n)] for i in range(k*n)]
for i in range(k*n):
for j in range(k*n):
nouv_carre[i][j] = carre[i//k][j//k]
return nouv_carre
# Test
print("--- Homothétie carré magique ---")
# carre = [ [1,2,3], [4,5,6], [7,8,9] ]
# carre = [ [4,9,2], [3,5,7], [8,1,6] ]
# grand_carre = homothetie_carre(carre,3)
# affiche_tableau(grand_carre)
grand_carre = homothetie_carre(carre_3x3,3)
79
affiche_tableau(grand_carre)
grand_carre = homothetie_carre(carre_4x4,2)
affiche_tableau(grand_carre)
## Question 6 ##
##############################
def addition_bloc_carre(grand_carre,petit_carre):
N = len(grand_carre)
n = len(petit_carre)
# k = N//n
nouv_carre = [[0 for j in range(N)] for i in range(N)]
for i in range(N):
for j in range(N):
nouv_carre[i][j] = grand_carre[i][j] + petit_carre[i%n][j%n]
return nouv_carre
# Test
print("--- Addition de blocs - Carré magique ---")
petit_carre = [ [1,2], [3,4] ]
carre = [ [1,2,3], [4,5,6], [7,8,9] ]
grand_carre = homothetie_carre(carre,2)
nouv_grand_carre = addition_bloc_carre(grand_carre,petit_carre)
affiche_tableau(petit_carre)
print("---")
affiche_tableau(grand_carre)
print("---")
affiche_tableau(nouv_grand_carre)
## Question 7 ##
##############################
def produit_carres(carre1,carre2):
n = len(carre1)
# m = len(carre2)
carre3a = addition_carre(carre2,-1)
# print("---")
# affiche_tableau(carre3a)
carre3b = homothetie_carre(carre3a,n)
# print("---")
# affiche_tableau(carre3b)
carre3c = multiplication_carre(carre3b,n**2)
# print("---")
# affiche_tableau(carre3c)
carre3d = addition_bloc_carre(carre3c,carre1)
# print("---")
# affiche_tableau(carre3d)
return carre3d
print("---")
affiche_tableau(carre3)
print(est_carre_magique(carre3))
13. Binaire II
Activités binaire_II.py
##############################
# Binaire - partie II
##############################
from binaire_I import *
##############################
# Activité 1 - Palindrome en binaire
##############################
## Question 1 ##
def est_palindrome_1(liste):
p = len(liste)
drapeau = True
for i in range(p):
if liste[i] != liste[p-1-i]:
drapeau = False
return drapeau
# Version optimisée :
def est_palindrome_1_bis(liste):
p = len(liste)
for i in range(p//2):
if liste[i] != liste[p-1-i]:
return False
return True
def est_palindrome_2(liste):
liste_inverse = list(reversed(liste))
return liste == liste_inverse
# Test
81
## Question 2 ##
def cherche_palindrome_binaire(N):
num = 0
for n in range(N):
liste_binaire = entier_vers_binaire(n)
if est_palindrome_1(liste_binaire) == True:
num = num + 1
print(num,":",n,"=",entier_vers_binaire(n))
return
# Test
print("--- Palindromes binaires ---")
cherche_palindrome_binaire(1000)
# Le 1000ème palindrome en binaire est :
#249903 = [1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1]
## Question 3 ##
def cherche_palindrome_decimale(N):
num = 0
for n in range(N):
liste_decimale = entier_vers_decimale(n)
if est_palindrome_1(liste_decimale) == True:
num = num + 1
print(num,":",n)
return
# Test
print("--- Palindromes avec décimales ---")
cherche_palindrome_decimale(1000)
# Le 1000ème palindrome en décimales est :
# 90009
## Question 4 ##
def cherche_bi_palindrome(N):
num = 0
for n in range(N):
liste_binaire = entier_vers_binaire(n)
liste_decimale = entier_vers_decimale(n)
if est_palindrome_1(liste_binaire) == True and est_palindrome_1(liste_decimale):
num = num + 1
print(num,":",n,"=",entier_vers_binaire(n))
return
# Test
print("--- Bi-palindromes ---")
cherche_bi_palindrome(1000)
# Le 20ème bi-palindrome est
# 585585 = [1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1]
##############################
82
def ETeg(l1,l2):
n = len(l1)
l = []
for i in range(n):
if l1[i]==1 and l2[i]==1:
l = l + [1]
else:
l = l + [0]
return l
def NON(l1):
l = []
for b in l1:
if b==1:
l = l + [0]
else:
l = l + [1]
return l
# Test
print("--- Opérations logiques (même longueur) ---")
l1 = [1,0,1,0,1,0,1]
l2 = [1,0,0,1,0,0,1]
print(l1)
print(l2)
print(OUeg(l1,l2))
print(ETeg(l1,l2))
print(NON(l1))
## Question 2 ##
## Question 3 ##
# Opérations logiques avec des listes de tailles différentes
83
def OU(l1,l2):
p = len(l1)
q = len(l2)
if p>q:
ll2 = ajouter_zeros(l2,p)
return OUeg(l1,ll2)
else:
ll1 = ajouter_zeros(l1,q)
return OUeg(ll1,l2)
def ET(l1,l2):
p = len(l1)
q = len(l2)
if p>q:
ll2 = ajouter_zeros(l2,p)
return ETeg(l1,ll2)
else:
ll1 = ajouter_zeros(l1,q)
return ETeg(ll1,l2)
# Test
print("--- Opérations logiques (cas général) ---")
l1 = [1,0,1,0,1,0,1]
l2 = [1,0,0,1,0,]
print(l1)
print(l2)
print(OU(l1,l2))
print(ET(l1,l2))
##############################
# Activité 3 - Loi de Morgan
##############################
## Question 1 ##
def tous_les_binaires(p):
liste_p = []
for n in range(2**p):
liste_p = liste_p + [entier_vers_binaire(n)]
return liste_p
# Test
print("--- Tous les binaires ---")
print(tous_les_binaires(3))
## Question 2 ##
def toutes_les_listes(p):
if p == 0:
return []
if p == 1:
return [[0],[1]]
liste_p_1 = toutes_les_listes(p-1)
liste_p = [ [0] + l for l in liste_p_1] + [ [1] + l for l in liste_p_1]
return liste_p
# Test
print("--- Toutes les listes ---")
print(toutes_les_listes(3))
84
## Question 3 ##
# Lois de Morgan
def test_loi_de_morgan(p):
liste_tous = [ajouter_zeros(l,p) for l in tous_les_binaires(p)]
#liste_tous = toutes_les_listes(p)
for l1 in liste_tous:
for l2 in liste_tous:
non_l1_ou_l2 = NON(OU(l1,l2))
non_l1_et_non_l2 = ET(NON(l1),NON(l2))
if non_l1_ou_l2 == non_l1_et_non_l2:
print("Vrai")
# pass
else:
print("Faux",l1,l2)
return
# Test
print("--- Test loi de Morgan ---")
test_loi_de_morgan(2)
Activités [Link]
##############################
# Probablité - Paradoxe de Parrondo
##############################
# Référence : "Paradoxe de Parrondo", La gazette des mathématiciens, juillet 2017
from random import *
##############################
# Activité 1 - Jeu A : premier jeu perdant
##############################
## Question 1 ##
def tirage_jeu_A():
x = random()
if x <= 0.49:
return +1
else:
return -1
## Question 2 ##
def gain_jeu_A(N):
gain = 0
for i in range(N):
gain = gain + tirage_jeu_A()
return gain
85
## Question 3 ##
def esperance_jeu_A(N):
esperance = gain_jeu_A(N)/N
return esperance
# Test
print("--- Jeu A ---")
N = 1000000
print(esperance_jeu_A(N))
##############################
# Activité 2 - Jeu B : premier jeu perdant
##############################
## Question 1 ##
def tirage_jeu_B(g):
if g%3 == 0:
x = random()
if x <= 0.09:
return +1
else:
return -1
else:
x = random()
if x <= 0.74:
return +1
else:
return -1
## Question 2 ##
def gain_jeu_B(N):
gain = 0
for i in range(N):
gain = gain + tirage_jeu_B(gain)
return gain
## Question 3 ##
def esperance_jeu_B(N):
esperance = gain_jeu_B(N)/N
return esperance
# Test
print("--- Jeu B ---")
N = 1000000
print(esperance_jeu_B(N))
##############################
# Activité 3 - Paradoxe de Parrondo
##############################
## Question 1 ##
def tirage_jeu_AB(g):
x = random()
if x < 0.5:
return tirage_jeu_A()
else:
return tirage_jeu_B(g)
86
## Question 2 ##
def gain_jeu_AB(N):
gain = 0
for i in range(N):
gain = gain + tirage_jeu_AB(gain)
return gain
## Question 3 ##
def esperance_jeu_AB(N):
esperance = gain_jeu_AB(N)/N
return esperance
# Test
print("--- Jeu AB ---")
N = 1000000
print(esperance_jeu_AB(N))
Activité 1
Activité 1 chercher_1.py
##############################
# Chercher et remplacer
##############################
##############################
# Activité 1 - Chercher
##############################
## Question 1 ##
def chercher_in(chaine,sous_chaine):
return sous_chaine in chaine
# Test
print("--- Avec 'in' ---")
chaine = "ETRE OU NE PAS ETRE"
sous_chaine = "PAS"
print(chercher_in(chaine,sous_chaine))
## Question 2 ##
def chercher_find(chaine,sous_chaine):
position = [Link](sous_chaine)
return position
# Test
print("--- Avec find() ---")
position = chercher_find(chaine,sous_chaine)
print(position)
position = chercher_find(chaine,"XYZ")
print(position)
## Question 3 ##
87
def chercher_index(chaine,sous_chaine):
position = [Link](sous_chaine)
return position
# Test
print("--- Avec index() ---")
position = chercher_index(chaine,sous_chaine)
print(position)
# position = chercher_index(chaine,"XYZ")
# print(position)
## Question 4 ##
def chercher(chaine,sous_chaine):
long_chaine = len(chaine)
long_sous_chaine = len(sous_chaine)
for i in range(long_chaine-long_sous_chaine+1):
trouve = True
for j in range(long_sous_chaine):
if chaine[i+j] != sous_chaine[j]:
trouve = False
break
if trouve == True:
return i
return None
# Test
print("--- A la main ---")
position = chercher(chaine,sous_chaine)
print(position)
position = chercher(chaine,"XYZ")
print(position)
Activité 2
Activité 2 chercher_2.py
##############################
# Chercher et remplacer
##############################
##############################
##############################
# Rappel de l'activité 1
def chercher(chaine,sous_chaine):
long_chaine = len(chaine)
long_sous_chaine = len(sous_chaine)
for i in range(long_chaine-long_sous_chaine+1):
trouve = True
for j in range(long_sous_chaine):
if chaine[i+j] != sous_chaine[j]:
trouve = False
break
if trouve == True:
88
return i
return None
##############################
# Activité 2 - Remplacer
##############################
## Question 1 ##
print("--- Avec replace() ---")
nouv_chaine = [Link](sous_chaine,nouv_sous_chaine)
print(nouv_chaine)
## Question 2 ##
#
# remplacer_une_fois() A la main en utilisant chercher()
def remplacer(chaine,sous_chaine,nouv_sous_chaine):
pos = chercher(chaine,sous_chaine)
if pos is not None: # Si trouvé
finpos = pos+len(sous_chaine)
chaine = chaine[:pos]+nouv_sous_chaine+chaine[finpos:]
return chaine
print("--- Remplacer : à la main ---")
nouv_chaine = remplacer(chaine,sous_chaine,nouv_sous_chaine)
print(nouv_chaine)
## Question 3 ##
#
# remplacer() remplace toutes les occurences
def remplacer_tout(chaine,sous_chaine,nouv_sous_chaine):
pos = chercher(chaine,sous_chaine)
while pos is not None: # Tant que trouvé
finpos = pos+len(sous_chaine)
chaine = chaine[:pos]+nouv_sous_chaine+chaine[finpos:]
pos = chercher(chaine,sous_chaine)
return chaine
# Attention fonction un peu trop basique car A -> AB devrait boucler indféiniment.
print("--- Remplacer tout : à la main ---")
chaine = "ETRE OU NE PAS ETRE"
sous_chaine = "ETRE"
nouv_sous_chaine = "AVOIR"
nouv_chaine = remplacer_tout(chaine,sous_chaine,nouv_sous_chaine)
print(nouv_chaine)
89
Activité 3
Activité 3 chercher_3.py
##############################
# Chercher et remplacer
##############################
##############################
# Activité 3 - Regex - Expressions rationnelles
##############################
## Question 1 ##
from re import *
def python_regex_chercher(chaine,exp):
trouve = search(exp,chaine)
if trouve:
return [Link](), [Link](), [Link]()
else:
return None
# Test
print("--- Avec regex search() ---")
chaine = "ETRE OU NE PAS ETRE"
exp = "P.S"
print(python_regex_chercher(chaine,exp))
exp = "E..E"
print(python_regex_chercher(chaine,exp))
exp = "[OT]U"
print(python_regex_chercher(chaine,exp))
exp = "[MN]..P[AI]S"
print(python_regex_chercher(chaine,exp))
## Question 2 ##
# Le joker "."
def regex_chercher_joker(chaine,exp):
long_chaine = len(chaine)
long_exp = len(exp)
for i in range(long_chaine-long_exp+1):
trouve = True
for j in range(long_exp):
if exp[j] != "." and chaine[i+j] != exp[j]:
trouve = False
break
if trouve == True:
return chaine[i:i+long_exp],i,i+long_exp
return None
# Test
print("--- regex joker ---")
chaine = "ETRE OU NE PAS ETRE"
exp = "T.E"
print(regex_chercher_joker(chaine,exp))
90
## Question 3 ##
# Le choix "[AB]", voir [ABC]
def genere_choix(exp):
liste_exp = [""]
mode_choix = False
for c in exp:
if c == "[":
mode_choix = True
old_liste_exp = list(liste_exp)
nouv_list_exp = []
elif c == "]":
mode_choix = False
liste_exp = nouv_list_exp
else:
if mode_choix == False: # Mode normal
liste_exp = [ l + c for l in liste_exp]
else: # Mode choix
nouv_list_exp = nouv_list_exp + [ l + c for l in old_liste_exp]
return liste_exp
# Test
print("--- regex choix ---")
exp = "ET[XYZ]RE[UVW]"
print(genere_choix(exp))
def regex_chercher_choix(chaine,exp):
liste_exp = genere_choix(exp)
for mon_exp in liste_exp:
resultat = python_regex_chercher(chaine,mon_exp)
if resultat is not None:
return resultat
return None
# Test
print("--- regex choix ---")
chaine = "ETRE OU NE PAS ETRE"
exp = "P[ABC]S"
print(regex_chercher_choix(chaine,exp))
## Question 4 ##
# La négation [^A] voir [^AB]
Activité 4
Activité 4 chercher_4.py
##############################
# Chercher et remplacer
##############################
##############################
# Rappel de l'activité 1 - Chercher
##############################
91
def chercher(chaine,sous_chaine):
long_chaine = len(chaine)
long_sous_chaine = len(sous_chaine)
for i in range(long_chaine-long_sous_chaine+1):
trouve = True
for j in range(long_sous_chaine):
if chaine[i+j] != sous_chaine[j]:
trouve = False
break
if trouve == True:
return i
return None
##############################
# Rappel de l'activité 2 - Remplacer
##############################
def remplacer(chaine,sous_chaine,nouv_sous_chaine):
pos = chercher(chaine,sous_chaine)
if pos is not None: # Si trouvé
finpos = pos+len(sous_chaine)
chaine = chaine[:pos]+nouv_sous_chaine+chaine[finpos:]
return chaine
##############################
# Activité 4 - Itérations
##############################
## Question 1 ##
# Test
print("--- Une itération ---")
print("-- Ex 1 --")
phrase = "01001110"
motif = "01"
nouv_motif = "10"
nouv_phrase = remplacer(phrase,motif,nouv_motif)
print(phrase)
print(nouv_phrase)
print("-- Ex 2 --")
phrase = "01001110"
motif = "0011"
nouv_motif = "1100"
nouv_phrase = remplacer(phrase,motif,nouv_motif)
print(phrase)
print(nouv_phrase)
print("-- Ex 3 --")
phrase = "01001110"
motif = "0011"
nouv_motif = "111000"
nouv_phrase = remplacer(phrase,motif,nouv_motif)
print(phrase)
print(nouv_phrase)
print("-- Ex 4 --")
phrase = "0001"
motif = "01"
nouv_motif = "1100"
92
print(phrase)
phrase = remplacer(phrase,motif,nouv_motif)
print(phrase)
phrase = remplacer(phrase,motif,nouv_motif)
print(phrase)
phrase = remplacer(phrase,motif,nouv_motif)
print(phrase)
## Question 2 ##
# Constante globale du maximum d'itérations considérées
MAX_ITER = 1000
def iterations(phrase,motif,nouv_motif):
i = 0
while i <= MAX_ITER:
nouv_phrase = remplacer(phrase,motif,nouv_motif)
if phrase == nouv_phrase:
return i, phrase
else:
phrase = nouv_phrase
i = i+1
return None
def decimal_vers_binaire(n,p):
chaine_b = bin(n) # Conversion en une chaîne écriture binaire
chaine_b = chaine_b[2:] # On enlève le préfixe
93
## Question 4 ##
# Linéaire
motif = "0011"
nouv_motif = "110"
print("- Linéaire -")
print(iteration_maximale(10,motif,nouv_motif))
# Quadratique
motif = "01"
nouv_motif = "10"
print("- Quadratique -")
print(iteration_maximale(10,motif,nouv_motif))
# Exponentiel
motif = "01"
nouv_motif = "110"
print("- Exponentiel -")
print(iteration_maximale(10,motif,nouv_motif))
# Ne termine pas
motif = "01"
nouv_motif = "1100"
print("- Ne se termine pas -")
print(iteration_maximale(4,motif,nouv_motif))
94
Activité 1
Activité 1 piles_1.py
##############################
# Piles - Calculatrice polonaise
##############################
##############################
# Activité 1 - Opération sur la pile
##############################
# Test
print("--- Empiler ---")
pile = [4,5,6]
print('Pile avant :',pile)
empile(7)
print('Pile après :',pile)
## Question 2 ##
def depile():
""" Lit l'élément au sommet de la pile et l'enlève
Entrée : rien
Sortie : l'élément du sommet
Action : la pile contient un élément de moins """
global pile
sommet = pile[len(pile)-1]
pile = pile[0:len(pile)-1]
return sommet
# Test
print("--- Dépiler ---")
pile = [4,5,6]
print('Pile avant :',pile)
val = depile()
print('Valeur dépilée :',val,'\nPile après :',pile)
## Question 3 ##
def pile_est_vide():
95
# Tests
print("--- Tester si pile vide ---")
# Test 1
pile = [4,5,6]
vide = pile_est_vide()
print(pile,'pile vide ?',vide)
# Test 2
pile = []
vide = pile_est_vide()
print(pile,'pile vide ?',vide)
Activité 2
Activité 2 piles_2.py
##############################
# Piles - Calculatrice polonaise
##############################
##############################
# Rappels - Activité 1
##############################
def empile(element):
global pile
pile = pile + [element]
return None
def depile():
global pile
sommet = pile[len(pile)-1]
pile = pile[0:len(pile)-1]
return sommet
def pile_est_vide():
if len(pile) == 0:
return True
else:
return False
##############################
# Activité 2 - Manipulation de la pile
##############################
## Question 1 ##
print("--- Manipulation ---")
pile = []
96
empile(5)
empile(7)
empile(2)
empile(4)
print(pile)
depile()
empile(8)
empile(1)
empile(3)
print(pile)
val = depile()
print('Valeur :',val)
## Question 2 ##
def pile_contient(element):
""" Détermine si la pile contient l'élément
Entrée : rien
Sortie : vrai/faux
Action : modifie la pile """
while not pile_est_vide():
el = depile()
if el == element:
return True # Si on trouve l'élément c'est bon
return False # On arrive au bas sans trouver l'élément
# Tests
print("--- Test si pile contient 7 ---")
# Test 1
pile = [4,5,6]
print(pile,'pile contient 7 ?',pile_contient(7))
# Test 2
pile = [4,7,12,99]
print(pile,'pile contient 7 ? ',pile_contient(7))
## Question 3 ##
def somme_pile():
""" Calcule la somme de la pile
Entrée : rien
Sortie : la somme
Action : vide la pile """
somme = 0
while not pile_est_vide():
element = depile()
somme = somme + element
return somme
# Test
print("--- Somme des valeurs de la pile ---")
pile = [4,5,6]
print('La somme de',pile,'est ',somme_pile())
## Question 4 ##
def avant_dernier():
""" Renvoie l'avant-dernier élément en bas de la pile
Entrée : rien
97
# Tests
pile = [4,5,6,13]
print('L\'avant-dernier élément de',pile,'est',avant_dernier())
pile = [4,6]
print('L\'avant-dernier élément de',pile,'est',avant_dernier())
pile = [6]
print('L\'avant-dernier élément de',pile,'est',avant_dernier())
pile = []
print('L\'avant-dernier élément de',pile,'est',avant_dernier())
Activité 3
Activité 3 piles_3.py
##############################
# Piles - Calculatrice polonaise
##############################
##############################
# Rappels - Activité 1
##############################
def empile(element):
global pile
pile = pile + [element]
return None
def depile():
global pile
sommet = pile[len(pile)-1]
pile = pile[0:len(pile)-1]
return sommet
def pile_est_vide():
if len(pile) == 0:
return True
else:
return False
##############################
# Activité 3 - La gare de triage
##############################
def tri_wagons(train):
""" Trie les wagons rouges/bleus d'un train
98
# Tests
print("--- Tri rouge/bleu ---")
train = "A 4 C 12"
train_trie = tri_wagons(train)
print(train,' -> ',train_trie)
train = "9 K 8 P 17 L B R 3 10 2 N"
train_trie = tri_wagons(train)
print(train,' -> ',train_trie)
Activité 4
Activité 4 piles_4.py
##############################
# Piles - Calculatrice polonaise
##############################
##############################
# Rappels - Activité 1
##############################
def empile(element):
global pile
pile = pile + [element]
return None
def depile():
global pile
sommet = pile[len(pile)-1]
pile = pile[0:len(pile)-1]
return sommet
def pile_est_vide():
if len(pile) == 0:
return True
else:
99
return False
##############################
# Activité 4 - Calculatrice polonaise
##############################
## Question 1 ##
def operation(a,b,op):
""" Calcule l'opération 'a + b 'ou 'a * b'...
Entrée : a,b (nombres) et 'op' un ccaractère '+'' ou '*'
Sortie : le résultat du calcul """
if op == '+':
return a + b
if op == '*':
return a * b
# Tests
print("--- Opérations ---")
a=5 ; b=7
print("La somme de",a,"et",b,"vaut",operation(a,b,'+'))
print("Le produit de",a,"et",b,"vaut",operation(a,b,'*'))
## Question 2 ##
def calculatrice_polonaise(expression):
""" Calcule l'expression codée en notation polonaise
Entrée : une expression en notation polonaise
Sortie : le résultat du calcul
Action : utilise la pile """
global pile
pile = []
liste_expression = [Link]()
for car in liste_expression:
if (car == '+') or (car == '*'):
b = depile()
a = depile()
calcul_partiel = operation(a,b,car)
empile(calcul_partiel)
else:
val = int(car)
empile(val)
return depile()
# Tests
print("--- Calculatrice polonaise ---")
exp = "2 3 +"
print("L'expression",exp,"vaut",calculatrice_polonaise(exp))
exp = "2 3 + 5 *"
print("L'expression",exp,"vaut",calculatrice_polonaise(exp))
exp = "8 7 3 + *"
print("L'expression",exp,"vaut",calculatrice_polonaise(exp))
exp = "8 7 3 * +"
print("L'expression",exp,"vaut",calculatrice_polonaise(exp))
100
Activité 5
Activité 5 piles_5.py
##############################
# Piles - Calculatrice polonaise
##############################
##############################
# Rappels - Activité 1
##############################
def empile(element):
global pile
pile = pile + [element]
return None
def depile():
global pile
sommet = pile[len(pile)-1]
pile = pile[0:len(pile)-1]
return sommet
def pile_est_vide():
if len(pile) == 0:
return True
else:
return False
##############################
# Activité 5 - Expression bien parenthésée
##############################
## Question 1 ##
def parentheses_correctes(expression):
""" Teste si une expression est bien parenthésée
Entrée : un expression (chaîne de caractère)
Sortie : vrai/faux
Action : utilise une pile """
global pile
pile = [] # On part d'une pile vide
for car in expression:
if car == "(":
empile(car)
if car == ")":
if pile_est_vide():
return False # Problème : il manque une "("
else:
depile()
# A la fin :
if pile_est_vide():
return True
else:
return False
# Test
print("--- Expression correctemment parenthésée ---")
101
## Question 2 ##
def crochets_parentheses_correctes(expression):
""" Teste si une expression a des crochets et des parenthèses bien placées
Entrée : un expression (chaîne de caractère)
Sortie : vrai/faux
Action : utilise une pile """
global pile
pile = [] # On part d'une pile vide
for car in expression:
if car == "(" or car == "[":
empile(car)
if car == ")" or car == "]":
if pile_est_vide():
return False # Problème : il manque "(" ou "["
else:
element = depile()
if element == "[" and car == ")":
return False # Problème du type [)
if element == "(" and car == "]":
return False # Problème du type (]
# A la fin
return pile_est_vide()
# Test
print("--- Expression avec crochets et parenthèses corrects ---")
expression = "(a+b)^2 = (a^2 + [b^2+[2(ab)]])"
print("L'expression",expression,"est bien parenthésées et crochetées ?",
,→ crochets_parentheses_correctes(expression))
Activité 6
Activité 6 piles_6.py
##############################
# Piles - Calculatrice polonaise
##############################
global pile
102
##############################
# Rappels - Activité 1
##############################
def empile(element):
global pile
pile = pile + [element]
return None
def depile():
global pile
sommet = pile[len(pile)-1]
pile = pile[0:len(pile)-1]
return sommet
def pile_est_vide():
if len(pile) == 0:
return True
else:
return False
##############################
# Rappels - Activité 4
##############################
def operation(a,b,op):
if op == '+':
return a + b
if op == '*':
return a * b
def calculatrice_polonaise(expression):
global pile
pile = []
liste_expression = [Link]()
for car in liste_expression:
if (car == '+') or (car == '*'):
b = depile()
a = depile()
calcul_partiel = operation(a,b,car)
empile(calcul_partiel)
else:
val = int(car)
empile(val)
return depile()
##############################
# Activité 6 - Conversion vers l'écriture polonaise
##############################
def ecriture_polonaise(expression):
""" Convertit une expression classique en notation polonaise
Entrée : une expression classique
Sortie : l'expression en notation polonaise
Action : utilise une pile """
global pile
pile = []
liste_expression = [Link]()
103
##
# Automatisation des tests et des vérifications
def test_polonaise(expression):
classique = eval(expression)
print("---\n",classique)
conversion = ecriture_polonaise(expression)
104
print(conversion)
polonaise = calculatrice_polonaise(conversion)
print(polonaise)
return classique == polonaise
Activité 1
Activité 1 markdown_1.py
##############################
# Visualiseur de texte - Markdown
##############################
##############################
# Activité 1 - Afficher du texte
##############################
##################################################
## Question 1 ##
from tkinter import *
from [Link] import Font
# Fenêtre tkinter
root = Tk()
canvas = Canvas(root, width=800, height=600, background="white")
[Link](fill="both", expand=True)
# Format de la page de texte
largeur = 700
hauteur = 500
# Couleurs
couleur_fond = "lightgray"
couleur_texte = "black"
# Cadre
canvas.create_rectangle(10,10,largeur,hauteur,width=2,fill=couleur_fond)
# Fontes
fonte_texte = Font(family="Times", size=12)
fonte_italique = Font(family="Times", slant="italic", size=12)
105
##################################################
## Question 2 ##
def encadre_mot(mot,fonte):
""" Encadre un mot
Entrée : une chaîne et sa fonte
Sortie : affichage du mot et d'un cadre (bounding box) """
# Affiche un texte
mot_canvas = canvas.create_text(100,100, text=mot,anchor=NW,font=fonte,fill=
,→ couleur_texte)
##################################################
## Question 3 ##
def longueur_mot(mot,fonte):
""" Longueur d'un mot
Entrée : une chaîne et sa fonte
Sortie : la longuer de ce mot """
# Affiche un texte invisible juste pour récupérer sa longueur
mot_canvas = canvas.create_text(100,100, text=mot,anchor=NW,font=fonte,fill=couleur_fond
,→ )
# Test
# print("Longueur du mot 'Coucou' :",longueur_mot("Coucou",fonte_titre),"pixels")
# encadre_mot("Coucou",fonte_titre)
# [Link]()
##################################################
## Question 4 ##
def choix_fonte(mode,en_gras,en_italique):
""" Renvoie une fonte selon les paramètres
106
Entrée : un mode (texte ou liste, titre, sous-titre), gras ou pas, italique ou pas
Sortie : la fonte """
if mode == "titre":
fonte = fonte_titre
elif mode == "sous_titre":
fonte = fonte_sous_titre
else: # Mode texte ou liste
if en_gras:
fonte = fonte_gras
elif en_italique:
fonte = fonte_italique
else:
fonte = fonte_texte
return fonte
# Test
fonte = choix_fonte("texte",False,True)
canvas.create_text(100,100, text="Ceci est en italique",anchor=NW,font=fonte,fill=
,→ couleur_texte)
[Link]()
##################################################
Activité 2
Activité 2 markdown_2.py
##############################
# Visualiseur de texte - Markdown
##############################
##############################
# Activité 2 - Afficher du markdown
##############################
##############################
# A garder de l'activité 1
##############################
# Fenêtre tkinter
root = Tk()
canvas = Canvas(root, width=800, height=600, background="white")
[Link](fill="both", expand=True)
# Format de la page de texte
largeur = 700
hauteur = 500
# Couleurs
couleur_fond = "lightgray"
couleur_texte = "black"
# Cadre
107
canvas.create_rectangle(10,10,largeur,hauteur,width=2,fill=couleur_fond)
# Fontes
fonte_texte = Font(family="Times", size=12)
fonte_italique = Font(family="Times", slant="italic", size=12)
fonte_gras = Font(family="Times", weight="bold", size=12)
fonte_titre = Font(family="Times", weight="bold", size=20)
fonte_sous_titre = Font(family="Times", weight="bold", size=16)
##################################################
def choix_fonte(mode,en_gras,en_italique):
"""
Renvoie une fonte selon les paramètres
Entrée : un mode (texte ou liste,titre,sous-titre), gras ou pas, italique ou pas
Sortie : la fonte
"""
if mode == "titre":
fonte = fonte_titre
elif mode == "sous_titre":
fonte = fonte_sous_titre
else: # Mode texte ou liste
if en_gras:
fonte = fonte_gras
elif en_italique:
fonte = fonte_italique
else:
fonte = fonte_texte
return fonte
##################################################
## Question 1 ##
def afficher_ligne_v1(par,posy):
""" Affiche le texte sur une seul ligne sans mise en forme
Entrée : un paragraphe (c-à-d une longue ligne), la position verticale
Sortie : affichage """
posx = 20 # Début de la ligne tout à gauche
liste_mots = [Link]()
for mot in liste_mots:
mot = mot + " " # Rajoute espace qui sépare les mots
mot_canvas = canvas.create_text(posx,posy, text=mot,anchor=NW,font=fonte_titre,fill=
,→ couleur_texte)
canvas.create_rectangle([Link](mot_canvas),width=2)
# On place le nouveau mot après le précédent
posx = [Link](mot_canvas)[2]
return
# Tests
# afficher_ligne_v1("Bonjour, voici mon premier texte !",100)
# [Link]()
##################################################
## Question 2 ##
def afficher_ligne_v2(par,posy):
""" Affiche le texte selon le mode titre, sous-titre, texte, liste
108
# Tests
# afficher_ligne_v2("# Voici un titre",80)
# afficher_ligne_v2("## Et ici un sous titre",115)
# afficher_ligne_v2("Du texte normal, et une liste ci-dessous :",150)
# afficher_ligne_v2("+ Pomme",175)
# afficher_ligne_v2("+ Poire",200)
# afficher_ligne_v2("+ Scoubidou",225)
# [Link]()
##################################################
## Question 3 ##
def afficher_ligne_v3(par,posy):
""" Affiche le texte selon gras et italique et selon le mode
Entrée : un paragraphe (c-à-d une longue ligne), la position verticale
Sortie : affichage """
# Par défaut : texte, sans indentation
mode = "texte"
indentation = 20
if par[0:2] == "##": # Sous_titre
mode = "sous_titre"
par = par[2:] # Supprime les ##
elif par[0] == "#": # Titre
mode = "titre"
par = par[1:] # Supprime le #
elif par[0] == "+": # liste
mode = "liste"
par = u'\u2022' + par[1:] # Remplace le "+" par un rond
109
indentation = 40
# Gras / pas gras (par défaut ni gras, ni italique)
en_gras = False
en_italique = False
# Début de la ligne (décalé si liste)
posx = indentation
liste_mots = [Link]()
for mot in liste_mots:
if mot == "**": # Bascule gras / pas gras
en_gras = not(en_gras)
mot = ""
if en_gras:
fonte = fonte_gras
if mot == "*": # Bascule italique / pas italique
en_italique = not(en_italique)
mot = ""
fonte = choix_fonte(mode,en_gras,en_italique)
if mot != "":
mot = mot + " " # Rajoute espace qui sépare les mots
mot_canvas = canvas.create_text(posx,posy, text=mot,anchor=NW,font=fonte,fill=
,→ couleur_texte)
posx = [Link](mot_canvas)[2]
return
# Tests
# afficher_ligne_v3("Mot ** en gras ** et lui en * italique *",100)
# afficher_ligne_v3("+ Pommes et surtout ** poires ** et * ananas *",125)
# [Link]()
##################################################
## Question 4 ##
# Interligne
espace_entre_lignes = 18
def afficher_paragraphe(par,posy):
""" Affiche le texte selon gras et italique et selon le mode
Entrée : un paragraphe (c-à-d une longue ligne), la position verticale
Sortie : affichage """
# Par défaut : texte, sans indentation
mode = "texte"
indentation = 20
if par[0:2] == "##": # Sous_titre
mode = "sous_titre"
par = par[2:] # Supprime les ##
elif par[0] == "#": # Titre
mode = "titre"
par = par[1:] # Supprime le #
elif par[0] == "+": # liste
mode = "liste"
par = u'\u2022' + par[1:] # Remplace le "+" par un rond
indentation = 40
110
##################################################
## Question 5 ##
def afficher_fichier(nom):
""" Affiche les paragraphes d'un fichier
Entrée : un nom de fichier au format markdown
Sortie : affichage des paragraphes """
# Ouvrir le fichier
fichier = open(nom,"r")
liste_paragraphes = [Link]()
[Link]()
posy = 50
# Traiter chaque paragraphe
for par in liste_paragraphes:
newposy = afficher_paragraphe(par,posy)
111
# Tests
# afficher_fichier("[Link]")
# afficher_fichier("[Link]")
Activité 3
Activité 3 markdown_3.py
##############################
# Visualiseur de texte - Markdown
##############################
##############################
# Activité 3 - Justification
##############################
################################################
## Question 1 ##
from random import randint
# longueurs = [randint(5,15) for i in range(103)]
# longueurs = [14, 3, 16, 9, 2, 11, 13, 5, 4, 19, 16, 6, 17, 16, 15, 5, 14, 12, 17, 7]
longueurs = [8, 11, 9, 14, 8, 8, 15, 10, 14, 11, 15, 15, 5, 12, 9, 9, 15, 10, 14, 5, 12, 8,
,→ 8, 13, 10, 11, 8, 13, 7, 5, 6, 11, 7, 7, 13, 6, 6, 9, 8, 12, 5, 8, 7, 6, 6, 15, 13,
,→ 11, 7, 12]
longueur_ligne = 100
longueur_espace = 1
def coupures_simples(long):
""" Calcule les coupures des mots pour un alignement à gauche (sans espaces)
Entrée : une suite de longueurs (une liste d'entiers)
Sortie : la liste des indices où effectuer la coupure """
coupures = [0]
i = 1
while i < len(long):
somme = long[i-1]
while (i < len(long)) and (somme <= longueur_ligne):
somme += long[i]
i += 1
if somme > longueur_ligne:
coupures += [i-1]
coupures += [len(long)]
return coupures
################################################
def afficher_coupures_simples():
112
return
# Test
afficher_coupures_simples()
################################################
## Question 2 ##
def coupures_espaces(long):
""" Calcule les coupures des mots pour un alignement à gauche (avec espaces)
Entrée : une suite de longueurs (une liste d'entiers)
Sortie : la liste des indices où effectuer la coupure """
coupures = [0]
i = 1
while i < len(long):
somme = long[i-1]
while (i < len(long)) and (somme <= longueur_ligne):
somme += longueur_espace + long[i]
i += 1
if somme > longueur_ligne:
coupures += [i-1]
coupures += [len(long)]
return coupures
################################################
def afficher_coupures_espaces():
""" Test : affiche les coupures avec espaces """
print("\n--- Coupures avec espaces ---")
print("Longueurs des mots :",longueurs)
coupures = coupures_espaces(longueurs)
print("Coupures :",coupures)
for i in range(len(coupures)-1):
ligne = longueurs[coupures[i]:coupures[i+1]]
nb_espaces = len(ligne)-1
somme = sum(ligne) + nb_espaces*longueur_espace
print("\nLigne",i,":",ligne,"\nIndices",coupures[i],"à",coupures[i+1]-1,"= longueur[
,→ ",coupures[i],":",coupures[i+1],"]","\nSomme avec espaces =",somme,"Reste =",
,→ longueur_ligne-somme,)
return
# Test
113
afficher_coupures_espaces()
################################################
## Question 3 ##
def calcul_longueur_espaces(long,coupures):
""" Calcule les longueurs des espaces pour justification
Entrée : une suite de longueurs avec les coupures
Sortie : la longueurs des espaces pour chaque ligne """
longueur_espaces_ligne = []
for i in range(len(coupures)-2):
ligne = long[coupures[i]:coupures[i+1] ]
nb_espaces = len(ligne)-1
somme = sum(ligne) + nb_espaces*longueur_espace
restant = longueur_ligne - somme
if nb_espaces > 0:
nouvel_espace = longueur_espace + restant / nb_espaces
else:
nouvel_espace = longueur_espace
longueur_espaces_ligne += [nouvel_espace]
# Dernière ligne du paragraphe pas justifiée
longueur_espaces_ligne += [longueur_espace]
return longueur_espaces_ligne
################################################
def afficher_calcul_longueur_espaces():
""" Test : affiche les longueurs des espaces """
print("\n--- Coupures avec espaces et justification ---")
print("Longueurs des mots :",longueurs)
coupures = coupures_espaces(longueurs)
print("Coupures :",coupures)
longueur_espaces_ligne = calcul_longueur_espaces(longueurs,coupures)
print("Longueur des espaces de chaque ligne :",[float("{0:0.2f}".format(l)) for l in
,→ longueur_espaces_ligne])
for i in range(len(coupures)-1):
ligne = longueurs[coupures[i]:coupures[i+1]]
nb_espaces = len(ligne) - 1
somme = sum(ligne) + nb_espaces*longueur_espaces_ligne[i]
print("\nLigne",i,":",ligne,"\nIndices",coupures[i],"à",coupures[i+1]-1,"= longueur[
,→ ",coupures[i],":",coupures[i+1],"]","\nSomme avec espaces =",somme,"Reste =",
,→ longueur_ligne-somme,)
print("Longueur espace de cette ligne",longueur_espaces_ligne[i])
return
# Test
afficher_calcul_longueur_espaces()
114
18. L-système
Activités [Link]
##############################
# L-système
##############################
from turtle import *
##############################
# Activité 1 - Tracer un L-système
##############################
def trace_lsysteme(mot,angle=90,echelle=1):
speed("fastest")
width(2)
color('blue')
up()
goto(-150,-150)
down()
for c in mot:
if c == "A" or c == "B":
forward(100*echelle)
if c == "g":
left(angle)
if c == "d":
right(angle)
exitonclick()
return
## Test ##
# trace_lsysteme("AgAdAAdAdA")
##############################
# Activité 2 - Une seule règle : le flocon de Koch
##############################
# Un L-système
# un mot de départ
# des règles de remplacement
##################################################
## Question 1 ##
def remplacer_1(mot,lettre,motif):
nouv_mot = ""
for l in mot:
if l == lettre:
nouv_mot = nouv_mot + motif
else:
nouv_mot = nouv_mot + l
return nouv_mot
## Test ##
print("--- Remplacer une lettre ---")
mot = "AdAAg"
115
nouv_mot = remplacer_1(mot,"A","Ag")
print(mot)
print(nouv_mot)
##################################################
## Question 2 ##
def iterer_lsysteme_1(depart,regle,k):
mot = depart
lettre = regle[0]
motif = regle[1]
for i in range(k):
mot = remplacer_1(mot,lettre,motif)
return mot
##################################################
## Question 3 ##
## Flocon de Koch
depart_Koch = "A"
regle_Koch = ("A","AgAdAdAgA")
## Test
for k in range(4):
print(k,iterer_lsysteme_1(depart_Koch,regle_Koch,k))
print()
k = 3
mot = iterer_lsysteme_1(depart_Koch,regle_Koch,k)
# trace_lsysteme(mot,echelle=5/3**k)
##################################################
## Question 4 ##
#####################
## Autres exemples ##
#####################
depart = "AdAdAdA"
regle = ("A"," AdAgAgAAdAdAgA")
k = 3
mot = iterer_lsysteme_1(depart,regle,k)
#trace_lsysteme(mot,echelle=0.05)
#####################
depart = "AdAdAdA"
regle = ("A","AgAAdAAdAdAgAgAAdAdAgAgAAgAAdA")
k = 2
mot = iterer_lsysteme_1(depart,regle,k)
#trace_lsysteme(mot,echelle=0.07)
#####################
depart = "AdAdAdA"
regle = ("A","AAdAdAdAdAA")
k = 3
mot = iterer_lsysteme_1(depart,regle,k)
# trace_lsysteme(mot,echelle=0.1)
#####################
depart = "AdAdAdA"
regle = ("A","AAdAddAdA")
k = 3
mot = iterer_lsysteme_1(depart,regle,k)
116
# trace_lsysteme(mot,echelle=0.1)
#####################
depart = "AdAdAdA"
regle = ("A","AAdAdAdAdAdAgA")
k = 3
mot = iterer_lsysteme_1(depart,regle,k)
# trace_lsysteme(mot,echelle=0.1)
#####################
depart = "AdAdAdA"
regle = ("A","AAdAgAdAdAA")
k = 3
mot = iterer_lsysteme_1(depart,regle,k)
# trace_lsysteme(mot,echelle=0.15)
#####################
depart = "AdAdAdA"
regle = ("A","AdAAddAdA")
k = 3
mot = iterer_lsysteme_1(depart,regle,k)
# trace_lsysteme(mot,echelle=0.15)
#####################
depart = "AdAdAdA"
regle = ("A","AdAgAdAdA")
k = 4
mot = iterer_lsysteme_1(depart,regle,k)
# trace_lsysteme(mot,echelle=0.15)
##############################
# Activité 3 - Deux règles : Triangle de Sierpinski
##############################
##################################################
## Question 1 ##
def remplacer_2(mot,lettre1,motif1,lettre2,motif2):
nouv_mot = ""
for l in mot:
if l == lettre1:
nouv_mot = nouv_mot + motif1
elif l == lettre2:
nouv_mot = nouv_mot + motif2
else:
nouv_mot = nouv_mot + l
return nouv_mot
## Test ##
print("--- Remplacer deux lettres ---")
mot = "AdBgA"
nouv_mot = remplacer_2(mot,"A","ABg","B","Bd")
print(mot)
print(nouv_mot)
# mot1 = remplacer_1(mot,"A","ABg")
# mot2 = remplacer_1(mot1,"B","Bd")
# print(mot2)
##################################################
## Question 2 ##
def iterer_lsysteme_2(depart,regle1,regle2,k):
117
mot = depart
lettre1 = regle1[0]
motif1 = regle1[1]
lettre2 = regle2[0]
motif2 = regle2[1]
for i in range(k):
mot = remplacer_2(mot,lettre1,motif1,lettre2,motif2)
return mot
##################################################
## Question 3 ##
## Triangle de Sierpinski
depart_Sierp = "AdBdB"
regle_Sierp_1 = ("A","AdBgAgBdA")
regle_Sierp_2 = ("B","BB")
## Test
print("--- Sierpinski ---")
for k in range(3):
print(iterer_lsysteme_2(depart_Sierp,regle_Sierp_1,regle_Sierp_2,k))
print()
k = 4
mot = iterer_lsysteme_2(depart_Sierp,regle_Sierp_1,regle_Sierp_2,k)
# trace_lsysteme(mot,angle=-120,echelle=5/2**k)
##################################################
## Question 4 ##
#####################
## Autres exemples ##
#####################
## Courbe du dragon
depart_dragon = "AX"
regle_dragon_1 = ("X","XgYAg")
regle_dragon_2 = ("Y","dAXdY")
k = 9
mot = iterer_lsysteme_2(depart_dragon,regle_dragon_1,regle_dragon_2,k)
# trace_lsysteme(mot,echelle=2/k)
#####################
## Variante Sierpinski (angle = 60)
depart = "A"
regle1 = ("A","BdAdB")
regle2 = ("B","AgBgA")
# angle = 60
k = 3
mot = iterer_lsysteme_2(depart,regle1,regle2,k)
# trace_lsysteme(mot,angle=60,echelle=2/k**2)
#####################
## Courbe de Gosper
depart = "A"
regle1 = ("A","AgBggBdAddAAdBg")
regle2 = ("B","dAgBBggBgAddAdB")
k = 3
mot = iterer_lsysteme_2(depart,regle1,regle2,k)
# trace_lsysteme(mot,angle=60,echelle=2/k**2)
118
##############################
# Activité 4 - Tracer un L-système avec pile
##############################
##################################################
## Question 1 ##
def trace_lsysteme_pile(mot,angle=90,echelle=1):
speed("fastest")
width(3)
color('blue')
up()
goto(0,-300)
down()
pile = []
for c in mot:
if c == "A" or c == "B":
forward(100*echelle)
if c == "a":
up()
forward(100*echelle)
down()
if c == "g":
left(angle)
if c == "d":
right(angle)
if c == "[":
pile = pile + [(position(),heading())]
if c == "]":
up()
pos,direc = [Link]()
goto(pos)
setheading(direc)
down()
exitonclick()
return
## Test
# trace_lsysteme_pile("AaAgAA[gAAA][dAA]A",angle=90,echelle=1)
# trace_lsysteme_pile("AgA[gAAA]A[dAA]A",angle=90,echelle=1)
##################################################
## Question 2 ##
# Plante
depart_plante = "gggX"
regle_plante_1 = ("X","A[gX][X]A[gX]dAX")
regle_plante_2 = ("A","AA")
k = 5
mot = iterer_lsysteme_2(depart_plante,regle_plante_1,regle_plante_2,k)
# trace_lsysteme_pile(mot,angle=30,echelle=1/k**(3/2))
#####################
## Exemples avec up-down ##
depart = "AdAdAdA"
regle1 = ("A","AgadAAgAgAAgAagAAdagAAdAdAAdAadAAA")
119
regle2 = ("a","aaaaaa")
k = 2
mot = iterer_lsysteme_2(depart,regle1,regle2,k)
# trace_lsysteme_pile(mot,echelle=0.1)
#####################
## Autres exemples de plantes ##
# #####################
# angle = 22.5
# F
depart = "gggA"
regle = ("A","A[gA]A[dA][A]")
k = 4
mot = iterer_lsysteme_1(depart,regle,k)
# trace_lsysteme_pile(mot,angle=30,echelle=0.2)
# #####################
# angle = 20
depart = "A"
regle = ("A","A[gA]A[dA]A")
k = 4
mot = iterer_lsysteme_1(depart,regle,k)
# trace_lsysteme_pile(mot,angle=30,echelle=0.075)
# ####################
# angle = 22.5
depart = "A"
regle = ("A","AAd[dAgAgA]g[gAdAdA]")
k = 3
mot = iterer_lsysteme_1(depart,regle,k)
# trace_lsysteme_pile(mot,angle=30,echelle=0.2)
# #####################
# angle = 25.7
depart = "X"
regle1 = ("X","A[gX]A[dX]AX")
regle2 = ("A","AA")
k = 5
mot = iterer_lsysteme_2(depart,regle1,regle2,k)
# trace_lsysteme_pile(mot,angle=30,echelle=0.07)
# #####################
# angle = 30
depart = "A"
regle1 = ("A","A[dB][gB]")
regle2 = ("B","A[dB]A[gAdB]")
k = 5
mot = iterer_lsysteme_2(depart,regle1,regle2,k)
# trace_lsysteme_pile(mot,angle=30,echelle=0.25)
#####################
# angle = 30
depart = "X"
regle1 = ("X","Ad[[X]gX]gA[gAX]dX")
regle2 = ("A","AA")
k = 4
mot = iterer_lsysteme_2(depart,regle1,regle2,k)
# trace_lsysteme_pile(mot,angle=30,echelle=0.15)
120
#####################
#####################
# Courbe de Hilbert
# Pour les illustrations de livre
# \rule{L -> +RF-LFL-FR+}
# \rule{R -> -LF+RFR+FL-}}
# angle = 30
depart = "X"
regle1 = ("X","gYAdXAXdAYg")
regle2 = ("Y","dXAgYAYgAXd")
k = 4
mot = iterer_lsysteme_2(depart,regle1,regle2,k)
trace_lsysteme_pile(mot,angle=90,echelle=0.15)
Activités [Link]
##############################
# Images dynamiques
##############################
import os # pour les fichiers images
##############################
# Activité 1 - Photomaton
##############################
##############################
## Depuis autres fiches ##
def afficher_tableau(tableau):
n = len(tableau)
m = len(tableau[0])
for i in range(n):
for j in range(m):
print('{:>3d}'.format(tableau[i][j])," ", end="")
print()
return
##############################
## Question 1 ##
def transformation(i,j,n):
if i%2 == 0 and j%2 == 0:
ii = i//2
jj = j//2
if i%2 == 0 and j%2 == 1:
ii = i//2
jj = (n+j)//2
if i%2 == 1 and j%2 == 0:
ii = (n+i)//2
121
jj = j//2
if i%2 == 1 and j%2 == 1:
ii = (n+i)//2
jj = (n+j)//2
return ii,jj
## Test ##
print("--- Transformation du photomaton ---")
print(transformation(1,1,6))
##############################
## Question 2 ##
def photomaton(tableau):
n = len(tableau)
nouv_tableau = [[0 for j in range(n)] for i in range(n)]
for i in range(n):
for j in range(n):
ii, jj = transformation(i,j,n)
nouv_tableau[ii][jj] = tableau[i][j]
return nouv_tableau
## Test ##
print("--- Transformation du photomaton ---")
tableau = [ [1,2,3,4], [5,6,7,8],[9,10,11,12], [13,14,15,16] ]
tableau_transforme = photomaton(tableau)
afficher_tableau(tableau)
print("---")
afficher_tableau(tableau_transforme)
##############################
## Question 3 ##
def photomaton_iterer(tableau,k):
n = len(tableau)
tab = [[tableau[i][j] for j in range(n)] for i in range(n)]
for i in range(k):
tab = photomaton(tab)
return tab
## Test ##
print("--- Itération de la transformation du photomaton ---")
tableau = [ [1,2,3,4], [5,6,7,8],[9,10,11,12], [13,14,15,16] ]
afficher_tableau(tableau)
for k in range(1,10):
tableau_itere = photomaton_iterer(tableau,k)
# Pas très malin, car repart du début à chaque fois
print("--- k =",k,"---")
afficher_tableau(tableau_itere)
##############################
# Activité 2 - Conversion tableau/image
##############################
##############################
## Question 1 ##
def tableau_vers_image(tableau,nom_image):
# Création d'un fichier en écriture
122
## Test ##
print("--- Tableau vers image ---")
tableau = [[128, 192, 128, 192, 128], [224, 0, 228, 0, 224], [228, 228, 228, 228, 228],
,→ [224, 64, 64, 64, 224], [192, 192, 192, 192, 192]]
tableau_vers_image(tableau,"test")
##############################
## Question 2 ##
def image_vers_tableau(nom_image):
# Création d'un fichier en écriture
nom_fichier = "input/" + nom_image + ".pgm"
fic = open(nom_fichier,"r")
i = 0 # Numéro de ligne
for ligne in fic:
if i == 1: # Garder les 2 premières lignes
liste_ligne = [Link]()
nb_col = int(liste_ligne[0])
nb_lig = int(liste_ligne[1])
tableau = [[ 0 for j in range(nb_col)] for i in range(nb_lig)]
elif i > 2:
liste = [Link]()
for j in range(nb_col):
tableau[i-3][j] = int(liste[j])
i = i + 1
# Fermeture du fichier
[Link]()
return tableau
print("--- Image vers tableau ---")
test_tableau = image_vers_tableau("test")
print(test_tableau)
123
afficher_tableau(test_tableau)
##############################
## Depuis la fiche "Fichiers" ##
## Permet d'avoir un exemple de fichier
def ecrire_fichier_image_gris():
# Création d'un fichier en écriture
nom_fichier = "input/image_gris.pgm"
fic = open(nom_fichier,"w")
# Entete
[Link]("P2\n") # Image en niveaux de gris
nb_col = 256
nb_lig = 256
[Link](str(nb_col) + " " + str(nb_lig) + "\n")
niveaux = 255
[Link](str(niveaux) + "\n")
for i in range(nb_lig):
ligne = ""
for j in range(nb_col):
coul = (i**2 + j**2) % 256 # un niveau de gris en fonction de i et j
ligne = ligne + str(coul) + " "
ligne = ligne + "\n"
# Ecriture dans le fichier
[Link](ligne)
# Fermeture du fichier
[Link]()
return
# Test
print("--- Fichier '[Link]' ---")
# ecrire_fichier_image_gris()
##############################
# Activité 1bis - Photomaton
##############################
##############################
## Question 4 ##
def photomaton_images(nom_image,kmax):
tableau = image_vers_tableau(nom_image)
tableau_vers_image(tableau,nom_image+"_photo_"+str(0)) # image initiale
n = len(tableau)
tab = [[tableau[i][j] for j in range(n)] for i in range(n)]
for k in range(1,kmax+1):
tab = photomaton(tab)
tableau_vers_image(tab,nom_image+"_photo_"+str(k))
return
## Test ##
# photomaton_images("image_gris",8)
# photomaton_images("pi_gimp_new",8)
# photomaton_images("chat_gimp_new",8)
##############################
124
##############################
## Question 2 ##
def boulanger_replier(tableau):
n = 2*len(tableau)
nouv_tableau = [[0 for j in range(n)] for i in range(n)]
# partie haute
for i in range(n//2):
for j in range(n):
nouv_tableau[i][j] = tableau[i][j]
# partie basse
for i in range(n//2,n):
for j in range(n):
nouv_tableau[i][j] = tableau[n//2 - i - 1][2*n-1-j]
# for i in range(n//2):
# for j in range(n):
# nouv_tableau[n-i-1][j] = tableau[i][2*n-1-j]
return nouv_tableau
print("--- Boulanger : replier tableau ---")
tableau_replie = boulanger_replier(tableau_etire)
afficher_tableau(tableau_etire)
print("---")
afficher_tableau(tableau_replie)
##############################
## Question 3 ##
def boulanger_iterer(tableau,k):
n = len(tableau)
tab = [[tableau[i][j] for j in range(n)] for i in range(n)]
for i in range(k):
tabb = boulanger_etirer(tab)
125
tab = boulanger_replier(tabb)
return tab
##############################
## Question 4 ##
def boulanger_images(nom_image,kmax):
tableau = image_vers_tableau(nom_image)
tableau_vers_image(tableau,nom_image+"_boul_"+str(0)) # image initiale
n = len(tableau)
tab = [[tableau[i][j] for j in range(n)] for i in range(n)]
for k in range(1,kmax+1):
tabb = boulanger_etirer(tab)
tab = boulanger_replier(tabb)
tableau_vers_image(tab,nom_image+"_boul_"+str(k))
return
## Test ##
# boulanger_images("image_gris",17)
# boulanger_images("pi_gimp_new",17)
# boulanger_images("chat_gimp_new",17)
# boulanger_images("reveil_gimp_new",17)
# boulanger_images("surf_gimp_new",15)
Activité 1
Activité 1 vie_1.py
##############################
# Jeu de la vie
##############################
##############################
# Activité 1 - Tableau
##############################
##################################################
## Question 1 ##
n, p = 5, 8;
tableau = [[0 for j in range(p)] for i in range(n)]
# Clignotant
tableau[2][2] = 1
126
tableau[2][3] = 1
tableau[2][4] = 1
##################################################
## Question 2 ##
def voir_tableau(tab):
""" Affiche un tableau à l'écran
Entrée : un tableau à deux dimension
Sortie : rien (affichage à l'écran) """
for i in range(n):
for j in range(p):
print(tab[i][j], end="")
print()
return
# Test
voir_tableau(tableau)
Activité 2
Activité 2 vie_2.py
##############################
# Jeu de la vie
##############################
##############################
# Rappels - Activité 1
##############################
n, p = 5, 8;
tableau = [[0 for j in range(p)] for i in range(n)]
# Clignotant
tableau[2][2] = 1
tableau[2][3] = 1
tableau[2][4] = 1
##############################
# Activité 2 - Affichage graphique
##############################
##################################################
## Question 1 ##
from tkinter import *
# Fenêtre tkinter
root = Tk()
canvas = Canvas(root, width=800, height=600, background="white")
[Link](side=LEFT, padx=5, pady=5)
# Echelle
echelle = 100
def afficher_lignes():
127
##################################################
## Question 2 ##
def afficher_tableau(tab):
""" Affiche un tableau à l'écran
Entrée : un tableau à deux dimension
Sortie : rien (affichage à l'écran) """
for i in range(n):
for j in range(p):
if tab[i][j] != 0:
canvas.create_rectangle(j*echelle,i*echelle,(j+1)*echelle,(i+1)*echelle,fill
,→ ="red")
return
# Boutons
def action_bouton_afficher():
[Link]("all")
afficher_lignes()
afficher_tableau(tableau)
return
Activité 3
Activité 3 vie_3.py
##############################
# Jeu de la vie
##############################
##############################
# Rappels - Activité 1
128
##############################
from vie_1 import *
n, p = 5, 8;
tableau = [[0 for j in range(p)] for i in range(n)]
# Clignotant
tableau[2][2] = 1
tableau[2][3] = 1
tableau[2][4] = 1
##############################
# Activité 3 - Evolution
##############################
##################################################
## Question 1 ##
def nombre_voisins(i,j,tab):
""" Calcule le nb de voisins de la cellule(i,j)
Entrée : une cellule dans un tableau à deux dimension
Sortie : le nb de cellules voisines """
nb = 0
# Voisin en haut à gauche
if (i>0) and (j>0) and (tab[i-1][j-1] != 0):
nb += 1
# Voisin juste au-dessus
if (i>0) and (tab[i-1][j] != 0):
nb += 1
# Voisin en haut à droite
if (i>0) and (j<p-1) and (tab[i-1][j+1] != 0):
nb += 1
# Voisin juste à gauche
if (j>0) and (tab[i][j-1] != 0):
nb += 1
# Voisin juste à droite
if (j<p-1) and (tab[i][j+1] != 0):
nb += 1
# Voisin en bas à gauche
if (i<n-1) and (j>0) and (tab[i+1][j-1] != 0):
nb += 1
# Voisin juste en-dessous
if (i<n-1) and (tab[i+1][j] != 0):
nb += 1
# Voisin en bas à droite
if (i<n-1) and (j<p-1) and (tab[i+1][j+1] != 0):
nb += 1
return nb
# Test
print("--- Nombre de voisins ---")
print(nombre_voisins(1,1,tableau))
print(nombre_voisins(2,1,tableau))
print(nombre_voisins(3,1,tableau))
print(nombre_voisins(2,0,tableau))
print(nombre_voisins(2,2,tableau))
print(nombre_voisins(3,3,tableau))
##################################################
129
def voir_voisins(tab):
""" Affiche le nb de voisins à l'écran
Entrée : un tableau à deux dimension
Sortie : rien (affichage à l'écran) """
for i in range(n):
for j in range(p):
print(nombre_voisins(i,j,tab), end='')
print()
return
# Test
print("--- Position de départ ---")
voir_tableau(tableau)
print("--- Nombre de voisins (tableau) ---")
voir_voisins(tableau)
##################################################
## Question 2 ##
def evolution(tab):
""" Calcule l'évolution en un jour
Entrée : un tableau à deux dimension
Sortie : un tableau à deux dimension """
nouv_tab = [[0 for j in range(p)] for i in range(n)]
for j in range(p):
for i in range(n):
# Cellule vivante ou pas ?
if tab[i][j] != 0:
cellule_vivante = True
else:
cellule_vivante = False
# Nombres de voisins
nb_voisins = nombre_voisins(i,j,tab)
# Règle du jeu de la vie
if cellule_vivante == True and (nb_voisins == 2 or nb_voisins == 3):
nouv_tab[i][j] = 1
if cellule_vivante == False and nb_voisins == 3:
nouv_tab[i][j] = 1
return nouv_tab
# Test
print("--- Position de départ ---")
voir_tableau(tableau)
print("--- Nombre de voisins ---")
voir_voisins(tableau)
print("--- Après évolution ---")
tableau = evolution(tableau)
voir_tableau(tableau)
130
Activité 4
Activité 4 vie_4.py
##############################
# Jeu de la vie
##############################
##############################
# Rappels - Activité précédentes
##############################
##################################################
def nombre_voisins(i,j,tab):
""" Calcule le nb de voisins de la cellule(i,j)
Entrée : une cellule dans un tableau à deux dimension
Sortie : le nb de cellules voisines """
nb = 0
# Voisin en haut à gauche
if (i>0) and (j>0) and (tab[i-1][j-1] != 0):
nb += 1
# Voisin juste au-dessus
if (i>0) and (tab[i-1][j] != 0):
nb += 1
# Voisin en haut à droite
if (i>0) and (j<p-1) and (tab[i-1][j+1] != 0):
nb += 1
# Voisin juste à gauche
if (j>0) and (tab[i][j-1] != 0):
nb += 1
# Voisin juste à droite
if (j<p-1) and (tab[i][j+1] != 0):
nb += 1
# Voisin en bas à gauche
if (i<n-1) and (j>0) and (tab[i+1][j-1] != 0):
nb += 1
# Voisin juste en-dessous
if (i<n-1) and (tab[i+1][j] != 0):
nb += 1
# Voisin en bas à droite
if (i<n-1) and (j<p-1) and (tab[i+1][j+1] != 0):
nb += 1
return nb
131
def evolution(tab):
""" Calcule l'évolution en un jour
Entrée : un tableau à deux dimension
Sortie : un tableau à deux dimension """
nouv_tab = [[0 for j in range(p)] for i in range(n)]
for j in range(p):
for i in range(n):
# Cellule vivante ou pas ?
if tab[i][j] != 0:
cellule_vivante = True
else:
cellule_vivante = False
# Nombres de voisins
nb_voisins = nombre_voisins(i,j,tab)
# Règle du jeu de la vie
if cellule_vivante == True and (nb_voisins == 2 or nb_voisins == 3):
nouv_tab[i][j] = 1
if cellule_vivante == False and nb_voisins == 3:
nouv_tab[i][j] = 1
return nouv_tab
def afficher_lignes():
""" Affiche la grille à l'écran """
for i in range(n+1):
canvas.create_line(0,i*echelle,p*echelle,i*echelle)
for j in range(p+1):
canvas.create_line(j*echelle,0,j*echelle,n*echelle)
for i in range(n):
canvas.create_text(echelle//3,i*echelle+echelle//2,text=str(i))
for j in range(p):
canvas.create_text(j*echelle+echelle//2,echelle//3,text=str(j))
return
def afficher_tableau(tab):
""" Affiche un tableau à l'écran
Entrée : un tableau à deux dimension
Sortie : rien (affichage à l'écran) """
for i in range(n):
for j in range(p):
if tab[i][j] != 0:
canvas.create_rectangle(j*echelle,i*echelle,(j+1)*echelle,(i+1)*echelle,fill
,→ ="red")
return
##############################
# Activité 4 - Jeu de la vie en entier
##############################
##################################################
## Question 0 ##
# Clignotant
def clignotant():
132
# Vaisseau
def vaisseau():
""" Définition du vasseau spatial """
global tableau
tableau = [[0 for j in range(p)] for i in range(n)]
tableau[3][4] = 1
tableau[3][5] = 1
tableau[3][6] = 1
tableau[2][6] = 1
tableau[1][5] = 1
[Link]("all")
afficher_lignes()
afficher_tableau(tableau)
return
# Pentadecathlon
def pentadecathlon():
""" Définition du pentadecathlon """
global tableau
tableau = [[0 for j in range(p)] for i in range(n)]
tableau[6][4] = 1
tableau[6][5] = 1
tableau[6][7] = 1
tableau[6][8] = 1
tableau[6][9] = 1
tableau[6][10] = 1
tableau[6][12] = 1
tableau[6][13] = 1
tableau[5][6] = 1
tableau[7][6] = 1
tableau[5][11] = 1
tableau[7][11] = 1
[Link]("all")
afficher_lignes()
afficher_tableau(tableau)
return
##################################################
## Question 1 ##
# Boutons
def action_bouton_evolution():
global tableau
tableau = evolution(tableau)
[Link]("all")
afficher_lignes()
afficher_tableau(tableau)
return
133
# [Link]()
##################################################
## Question 2 ##
def allumer_eteindre(i,j):
""" Commute une cellule """
global tableau
if tableau[i][j] == 0:
tableau[i][j] = 1
else:
tableau[i][j] = 0
return
def xy_vers_ij(x,y):
""" Coordonnées (x,y) vers coordonnées (i,j) """
i = y // echelle
j = x // echelle
return i, j
def action_clic_souris(event):
canvas.focus_set()
# print("Clic à", event.x, event.y)
x = event.x
y = event.y
allumer_eteindre(*xy_vers_ij(x,y))
[Link]("all")
afficher_lignes()
afficher_tableau(tableau)
return
# Liaison clic de souris/action
[Link]("<Button-1>",action_clic_souris)
afficher_lignes()
afficher_tableau(tableau)
[Link]()
134
Activité 1
Activité 1 ramsey_1.py
##############################
# Graphes et combinatoire de Ramsey
##############################
##############################
# Activité 1 - Définition et amis/étrangers
##############################
## Question 1 ##
##################################################
# Exemple 1
n = 3
exemple_graphe_1 = [[0 for j in range(n)] for i in range(n)]
exemple_graphe_1[0][1] = 1; exemple_graphe_1[1][0] = 1
exemple_graphe_1[0][2] = 1; exemple_graphe_1[2][0] = 1
# Exemple 2
n = 4
exemple_graphe_2 = [[0 for j in range(n)] for i in range(n)]
exemple_graphe_2[0][2] = 1; exemple_graphe_2[2][0] = 1
exemple_graphe_2[0][3] = 1; exemple_graphe_2[3][0] = 1
exemple_graphe_2[1][2] = 1; exemple_graphe_2[2][1] = 1
# Exemple 3
n = 5
exemple_graphe_3 = [[0 for j in range(n)] for i in range(n)]
exemple_graphe_3[0][2] = 1; exemple_graphe_3[2][0] = 1
exemple_graphe_3[0][3] = 1; exemple_graphe_3[3][0] = 1
exemple_graphe_3[1][2] = 1; exemple_graphe_3[2][1] = 1
exemple_graphe_3[1][4] = 1; exemple_graphe_3[4][1] = 1
exemple_graphe_3[3][4] = 1; exemple_graphe_3[4][3] = 1
# Exemple 4
n = 6
exemple_graphe_4 = [[0 for j in range(n)] for i in range(n)]
exemple_graphe_4[3][2] = 1; exemple_graphe_4[2][3] = 1;
exemple_graphe_4[1][2] = 1; exemple_graphe_4[2][1] = 1
exemple_graphe_4[3][4] = 1; exemple_graphe_4[4][3] = 1
exemple_graphe_4[4][1] = 1; exemple_graphe_4[1][4] = 1
exemple_graphe_4[0][2] = 1; exemple_graphe_4[2][0] = 1
exemple_graphe_4[5][0] = 1; exemple_graphe_4[0][5] = 1
exemple_graphe_4[5][1] = 1; exemple_graphe_4[1][5] = 1
exemple_graphe_4[0][3] = 1; exemple_graphe_4[3][0] = 1
# Exemple cours
n = 4
exemple_graphe_cours_1 = [[0 for j in range(n)] for i in range(n)]
135
exemple_graphe_cours_1[0][2] = 1; exemple_graphe_cours_1[2][0] = 1
exemple_graphe_cours_1[1][3] = 1; exemple_graphe_cours_1[3][1] = 1
## Question 2 ##
##################################################
def voir_graphe(graphe):
"""
Affiche un graphe à l'écran
Entrée : un graphe comme tableau à deux dimension
Sortie : rien (affichage à l'écran)
"""
n = len(graphe)
for j in range(n):
for i in range(n):
print(graphe[i][j], end="")
print()
return
# Test
if __name__ == '__main__':
print("--- Matrice du graphe ---")
print("--- Exemple 1 ---")
voir_graphe(exemple_graphe_1)
print("--- Exemple 2 ---")
voir_graphe(exemple_graphe_2)
print("--- Exemple 3 ---")
voir_graphe(exemple_graphe_3)
print("--- Exemple 4 ---")
voir_graphe(exemple_graphe_4)
print("--- Cours 1 ---")
voir_graphe(exemple_graphe_cours_1)
##################################################
##################################################
# Test si un graphe est contient
# 3 amis/étranger dont les positions sont données
##################################################
def contient_3_amis_fixes(graphe,i,j,k):
"""Cherche si sommets i, j, k sont tous reliés entre eux comme amis"""
if graphe[i][j] == 1 and graphe[i][k] == 1 and graphe[j][k] == 1:
return True
else:
return False
##################################################
def contient_3_etrangers_fixes(graphe,i,j,k):
"""Cherche si sommets i, j, k sont tous reliés entre eux comme étrangers"""
if graphe[i][j] == 0 and graphe[i][k] == 0 and graphe[j][k] == 0:
return True
else:
return False
# Test
if __name__ == '__main__':
print("--- Sous-graphe fixé de 0 et de 1 ---")
print(contient_3_amis_fixes(exemple_graphe_4,1,3,4))
print(contient_3_etrangers_fixes(exemple_graphe_4,1,3,4))
136
Activité 2
Activité 2 ramsey_2.py
##############################
# Graphes et combinatoire de Ramsey
##############################
##############################
# Activité 2 - Affichage graphique
##############################
# Echelle
echelle = 200
##################################################
# Un graphe
## Question 1 ##
# Version basique (recalcule plein de fois la même chose)
##################################################
def afficher_graphe_basic(graphe):
"""
Affiche un graphe à l'écran
Entrée : un graphe
Sortie : rien (affichage à l'écran)
"""
n = len(graphe)
# Arêtes
for j in range(n):
for i in range(n):
xi = 2*echelle + cos(2*i*pi/n)*echelle
yi = 1.5*echelle + sin(2*i*pi/n)*echelle
xj = 2*echelle + cos(2*j*pi/n)*echelle
yj = 1.5*echelle + sin(2*j*pi/n)*echelle
if graphe[i][j] == 0:
canvas.create_line(xi,yi,xj,yj,width=4,fill="red")
if graphe[i][j] == 1:
canvas.create_line(xi,yi,xj,yj,width=4,fill="green")
# Sommets
for i in range(n):
x = 2*echelle + cos(2*i*pi/n)*echelle
y = echelle + sin(2*i*pi/n)*echelle
canvas.create_oval(x-5,y-5,x+5,y+5,fill="black")
return
137
# Version optimale
##################################################
def afficher_graphe(graphe):
"""
Affiche un graphe à l'écran
Entrée : un graphe
Sortie : rien (affichage à l'écran)
"""
n = len(graphe) # Nombre de sommets
# Liste des coordonnées (x,y) des sommets
coord = [(2*echelle + cos(2*i*pi/n)*echelle,1.2*echelle + sin(2*i*pi/n)*echelle) for i
,→ in range(n)]
# Arêtes
for j in range(n):
for i in range(j+1,n): # i>j
if graphe[i][j] == 0:
canvas.create_line(coord[i],coord[j],width=4,fill="red",dash=(6, 2))
if graphe[i][j] == 1:
canvas.create_line(coord[i],coord[j],width=4,fill="green")
mafonte = Font(family="Courier", weight="bold",size=18)
# Sommets
for i in range(n):
x,y = coord[i]
canvas.create_oval(x-15,y-15,x+15,y+15,fill="black")
canvas.create_text(x,y,text=str(i),font=mafonte,fill="white")
# Numéro
return
# Lancement de la fenêtre
if __name__ == '__main__':
bouton_quitter = Button(root,text="Quitter", width=8, command=[Link])
bouton_quitter.pack(side=BOTTOM, padx=5, pady=20)
# Test d'un exemple
afficher_graphe(exemple_graphe_2)
[Link]()
Activité 3
Activité 3 ramsey_3.py
##############################
# Graphes et combinatoire de Ramsey
##############################
##############################
# Activité 3 - Binaire
##############################
## Echanger n <-> p pour être cohérent avec fiche binaire
def decimal_vers_binaire(p,n):
chaine_b = bin(p) # Conversion en une chaîne écriture binaire
138
# Test
if __name__ == '__main__':
n = 8
p = 37
print(decimal_vers_binaire(p,n))
print(decimal_vers_binaire_bis(p,n))
Activité 4
Activité 4 ramsey_4.py
##############################
# Graphes et combinatoire de Ramsey
##############################
##############################
# Activité 4 - Sous-ensembles
##############################
from ramsey_3 import decimal_vers_binaire
##############################
##############################
## Question 1 ##
#print(liste_binaire)
sous_ens = []
for j in range(n):
# if liste_binaire[n-j-1] == 1:
if liste_binaire[j] == 1:
sous_ens = sous_ens + [j]
tous_sous_ens = tous_sous_ens + [sous_ens]
return tous_sous_ens
# Test
if __name__ == '__main__':
print("--- Sous-ensembles ---")
n = 3
SS_ENS = sous_ensembles(n)
print("Pour n = ",n)
print("Nombre de sous-ensembles = ",len(SS_ENS))
print(SS_ENS)
## Question 2 ##
##################################################
def sous_ensembles_fixe(n,k):
tous_sous_ens_fixe = []
for sous_ens in sous_ensembles(n):
if len(sous_ens) == k:
tous_sous_ens_fixe = tous_sous_ens_fixe + [sous_ens]
return tous_sous_ens_fixe
# Test (suite)
if __name__ == '__main__':
print("--- Sous-ensembles à 3 éléments ---")
n = 6
k = 3
SS_ENS_3 = sous_ensembles_fixe(n,k)
print("Pour n = ",n," k = ",k)
print("Nombre de sous-ensembles à 3 éléments = ",len(SS_ENS_3))
print(SS_ENS_3)
Activité 5
Activité 5 ramsey_5.py
##############################
# Graphes et combinatoire de Ramsey
##############################
##############################
# Activité 5 - Preuve n=6
##############################
if __name__ == '__main__':
print("--- Test conjecture un seul graphe ---")
print("--- Exemple 1 ---")
print(graphe_contient_3(exemple_graphe_1))
print("--- Exemple 2 ---")
print(graphe_contient_3(exemple_graphe_2))
print("--- Exemple 3 ---")
print(graphe_contient_3(exemple_graphe_3))
print("--- Exemple 4 ---")
print(graphe_contient_3(exemple_graphe_4))
## Question 2 ##
##################################################
##################################################
# Calcul de tous les graphes possible à n sommets
# Il y a 2^( (n-1)*n/2 )
def voir_tous_graphes(n):
N = ((n-1) * n)//2
print("Nombre total de graphes :",2**N)
for p in range(2**N):
# Conversion binaire
141
liste_binaire = decimal_vers_binaire(p,N)
print("p =",p,liste_binaire)
graphe = [[0 for j in range(n)] for i in range(n)]
for j in range(0,n):
for i in range(j+1,n):
b = liste_binaire.pop()
graphe[i][j] = b
graphe[j][i] = b
voir_graphe(graphe)
return
# Test
# n = 4
# print("--- Affiche tous les graphes possibles ---")
# print("n = ",n)
# voir_tous_graphes(n)
## Question 3 ##
##################################################
##################################################
# Test de tous les graphes possible à n sommets
# Il y a 2^( (n-1)*n/2 )
def test_tous_graphes(n):
N = ((n-1) * n)//2
print("Nombre total de graphes :",2**N)
for p in range(2**N):
# Conversion binaire
liste_binaire = decimal_vers_binaire(p,N)
# print("p =",p,liste_binaire)
graphe = [[0 for j in range(n)] for i in range(n)]
for j in range(0,n):
for i in range(j+1,n):
b = liste_binaire.pop()
graphe[i][j] = b
graphe[j][i] = b
# voir_graphe(graphe)
test = graphe_contient_3(graphe)
if test == False:
print("Problème avec",p)
return
# Test
n = 6
print("\n\n--- Preuve du théorème de Ramsey, n = 6 ---")
print("n = ",n)
print("--- Recherche de graphe ne vérifiant pas l'énonce...")
test_tous_graphes(n)
print("fin des calculs ---")
print("Si rien ne s'est affiché, c'est que c'est bon !")
142
Activité 6
Activité 6 ramsey_6.py
##############################
# Graphes et combinatoire de Ramsey
##############################
##############################
# Activité 6 - Pour aller plus loin
##############################
## Question 1 ##
# Sous-ensembles
n = 6
k = 3
SS_ENS_3 = sous_ensembles_fixe(n,k)
##################################################
def graphe_contient_3(graphe):
"""Cherche si un graphe possède 3 amis ou 3 étrangers."""
n = len(graphe)
for sous_ens in SS_ENS_3:
contient_3_amis = contient_3_amis_fixes(graphe,*sous_ens)
contient_3_etrangers = contient_3_etrangers_fixes(graphe,*sous_ens)
contient = contient_3_amis or contient_3_etrangers
if contient == True:
break
# Affichage
# if contient == True:
# print("Validé par l'exemple:",sous_ens)
# else:
# print("Problème")
# if contient == False:
# print("Problème")
# voir_graphe(graphe)
return contient
# n = 6 : 0.5 secondes
# n = 7 : 20 secondes
# n = 8 : 2500 secondes = 40 min (extrapolation sur échantillon de 10^-2)
# n = 9 : 800 000 secondes = 9 jours (extrapolation sur échantillon de 10^-4)
## Question 2 ##
##################################################
##################################################
# Sous-ensembles
n = 9
SS_ENS_3 = sous_ensembles_fixe(n,3)
SS_ENS_4 = sous_ensembles_fixe(n,4)
##################################################
def contient_4_amis_fixes(graphe,i,j,k,l):
"""Cherche si sommets i, j, k sont tous reliés entre eux comme amis"""
if graphe[i][j] == 1 and graphe[i][k] == 1 and graphe[i][l] == 1 and graphe[j][k] == 1
,→ and graphe[j][l] == 1 and graphe[k][l] == 1:
return True
else:
return False
# Test de tous les graphes possible à n sommets
# pour savoir s'il existe 4 amis ou 3 étrangers
def graphe_contient_3_4(graphe):
"""Cherche si trois ou quatre sommets sont tous reliés entre eux"""
n = len(graphe)
# Cherche 3 étrangers
for sous_ens in SS_ENS_3:
contient_3_etrangers = contient_3_etrangers_fixes(graphe,*sous_ens)
if contient_3_etrangers == True:
144
break
# Si pas 3 étrangers, cherche 4 amis
if contient_3_etrangers == False:
for sous_ens in SS_ENS_4:
contient_4_amis = contient_4_amis_fixes(graphe,*sous_ens)
if contient_4_amis == True:
break
else:
contient_4_amis = True # Peu importe vu que déjà 3 étrangers
contient = contient_3_etrangers or contient_4_amis
return contient
def ramsey_4_3(n):
N = ((n-1) * n)//2
print("Nombre total de graphes :",2**N)
# for p in range( ((2**N)) // 100000 ):
for p in range( 1000000 ):
# Conversion binaire
liste_binaire = decimal_vers_binaire(p,N)
# print("p =",p,liste_binaire)
graphe = [[0 for j in range(n)] for i in range(n)]
for j in range(0,n):
for i in range(j+1,n):
b = liste_binaire.pop()
graphe[i][j] = b
graphe[j][i] = b
test = graphe_contient_3_4(graphe)
if test == False:
print("Problème avec graphe p =",p)
return
# Test
print("\n\n--- Preuve du théorème de Ramsey avec 4 amis ou 3 étrangers, n =",n,"---")
print("n = ",n)
print("--- Recherche de graphe ne vérifiant pas l'énonce...")
ramsey_4_3(n)
print("fin des calculs ---")
print("Si rien ne s'est affiché, c'est que c'est bon !")
# n = 7, contre-exemples facile
# n = 8 contre-exemple par exemple p=111121101
# n = 9 est vrai ! Mais doit prendre 18 jours de calculs
145
22. Bitcoin
Activités [Link]
##############################
# Bitcoin
##############################
##############################
# Activité 2 - Outils pour les listes
##############################
# Constante globale de longueur des blocs
N = 6
# Constante pour preuve de travail
Max = [0,0,25]
##############################
## Question 1 ##
# Addition des termes de deux listes de même longueur
def addition(liste1,liste2):
liste_somme = []
for i in range(len(liste1)):
liste_somme = liste_somme + [ (liste1[i]+liste2[i]) % 100 ]
return liste_somme
# Test
print("--- Test somme liste ---")
print(addition([1,2,3,4,5,6],[1,1,1,1,1,1]))
##############################
## Question 2 ##
# Test si une liste est plus petite que liste_max
def est_plus_petit(liste,liste_max):
i = 0
n = len(liste_max)
while (i < n) and (liste[i] <= liste_max[i]):
i = i + 1
if i == n:
return True
else:
return False
# Test
print("--- Test plus petit liste ---")
print(est_plus_petit([0,0,24,4,5,6],[0,0,50]))
##############################
## Question 3 ##
def phrase_vers_liste(phrase):
146
##############################
# Activité 3 - Fonction de hachage
##############################
##############################
## Question 3 ##
p = [7,11,13,17,19,23] # nb premiers
def un_tour(bloc):
# Addition
bloc[1] = (bloc[1]+bloc[0]) % 100
bloc[3] = (bloc[3]+bloc[2]) % 100
bloc[5] = (bloc[5]+bloc[4]) % 100
# m = p*m + 1 (modulo 100)
for i in range(N):
bloc[i] = (p[i]*bloc[i]+1) % 100
# permutation
bloc = [bloc[N-1]] + bloc[:N-1]
return bloc
# Test
print("--- Test un tour ---")
bloc = [0,1,2,3,4,5]
print(bloc)
print(un_tour(bloc))
bloc = [1,1,2,3,4,5]
print(bloc)
print(un_tour(bloc))
##############################
## Question 3 ##
def dix_tours(bloc):
for i in range(10):
bloc = un_tour(bloc)
return bloc
# Test
print("--- Test dix tours ---")
bloc = [0,1,2,3,4,5]
print(bloc)
print(dix_tours(bloc))
bloc = [1,1,2,3,4,5]
print(bloc)
147
print(dix_tours(bloc))
bloc = [99,96,87,56,67,76]
print(bloc)
print(dix_tours(bloc))
bloc = [70,92,22,4,16,90]
print(bloc)
print(dix_tours(bloc))
##############################
## Question 3 ##
def hachage(liste):
while len(liste)>N:
bloc1 = liste[0:N] # Premier bloc
bloc2 = liste[N:2*N] # Second bloc
fin_liste = liste[2*N:] # Le reste
# print(bloc1)
# print(bloc2)
# print(fin_liste)
#bloc1 = un_tour(bloc1) # Un tour
bloc1 = dix_tours(bloc1) # Dix tours
#print(bloc1)
nouv_bloc_deb = addition(bloc1,bloc2)
liste = nouv_bloc_deb + fin_liste
# Tours de fin pour la liste (qui ne contient plus que N nb)
# liste = un_tour(liste) # Un tour
liste = dix_tours(liste) # Un tour
return liste
# Test
print("--- Hachage d'une liste ---")
liste = [1,2,3,4,5,6,1,2,3,4,5,6]
hach = hachage(liste)
print(liste)
print(hach)
liste = [1,1,3,4,5,6,1,2,3,4,5,6]
hach = hachage(liste)
print(liste)
print(hach)
liste = [0,1,2,3,4,5,1,1,1,1,1,1,10,10,10,10,10,10]
hach = hachage(liste)
print(liste)
print(hach)
##############################
##############################
# Activité 4 - Preuve de travail - Minage
##############################
##############################
## Question 3 ##
148
def verification_preuve_de_travail(liste,preuve):
liste_test = liste + preuve
hach = hachage(liste_test)
# print(preuve,hach)
if est_plus_petit(hach,Max):
return True
else:
return False
# Test
print("--- Verif Preuve de travail ---")
liste = [0,1,2,3,4,5]
preuve = [12, 3, 24, 72, 47, 77]
# Max = [0,0,7]
start_time = time()
print(verification_preuve_de_travail(liste,preuve))
end_time = time()
duree = end_time-start_time
print("Temps de calcul :",duree)
##############################
## Question 2 ##
def preuve_de_travail(liste):
hach = [1,1,1,1,1,1]
while not(est_plus_petit(hach,Max)):
preuve = [randint(0,99) for i in range(N)]
liste_test = liste + preuve
hach = hachage(liste_test)
print(preuve,hach)
return preuve
##############################
## Question 2 bis ##
from itertools import product
def preuve_de_travail_bis(liste):
for preuve in product(range(100),range(100),range(100),range(100),range(100),range(100))
,→ :
preuve = list(preuve)
liste_test = liste + preuve
hach = hachage(liste_test)
if est_plus_petit(hach,Max):
break
print(preuve,hach)
return preuve
##############################
## Question 3 ##
# Test
print("--- Preuve de travail ---")
start_time = time()
liste = [0,1,2,3,4,5]
# preuve = preuve_de_travail(liste)
# preuve = preuve_de_travail_bis(liste)
149
end_time = time()
duree = end_time-start_time
print("Temps de calcul :",duree)
##############################
# Activité 5 - Tes bitcoins
##############################
##############################
## Question 1 ##
preuve_init = [0,0,0,0,0,0] # valeur au pif
Livre = [preuve_init]
def ajout_transaction(transaction):
global Livre
Livre = Livre + [transaction]
return Livre
# Test
print("--- Création du livre et ajout d'une transaction ---")
print(Livre)
ajout_transaction("Bob +135")
print(Livre)
##############################
## Question 2 ##
def minage():
global Livre
transaction = Livre[-1]
prec_preuve = Livre[-2]
# print(transaction)
# print(prec_hach)
# print(phrase_vers_liste(transaction))
liste = prec_preuve + phrase_vers_liste(transaction)
preuve = preuve_de_travail(liste)
Livre = Livre + [preuve]
return Livre
# Test
print("--- Minage ---")
print(Livre)
minage()
print(Livre)
# Exemple pour fiche
print("--- Exemple pour fiche ---")
Max = [0,0,7]
hach_init = [3,1,4,1,5,9] # valeur au pif
Livre = [hach_init]
ajout_transaction("Abel +35")
print(Livre)
minage()
print(Livre)
##############################
## Question 3 ##
def verification_livre():
150
prec_preuve = Livre[-3]
transaction = Livre[-2]
preuve = Livre[-1]
hach = hachage(prec_preuve+phrase_vers_liste(transaction)+preuve)
if est_plus_petit(hach,Max):
return True
else:
return False
# Test
print("--- Vérification du livre ---")
print(Livre)
print(verification_livre())
##############################
## Question 4 ##
# Exemple complet
# Constante pour preuve de travail
Max = [0,0,7]
Activités 1 et 2
Activités 1 et 2 aleatoire_vertical.py
##############################
# Aléatoire
##############################
from random import *
from tkinter import *
import time
##############################
# Activité 1 - Faire tomber des blocs
##############################
n = 4 # nb de lignes
p = 6 # nb de colonnes
tableau = [[0 for j in range(p)] for i in range(n)]
tableau[3][3] = 1
tableau[3][2] = 1
tableau[2][2] = 1
tableau[1][2] = 1
tableau[0][4] = 1
##################################################
def voir_tableau():
for i in range(n):
for j in range(p):
print(tableau[i][j], end="")
print()
return
voir_tableau()
##################################################
def peut_tomber(i,j):
if i == n-1: # tout en bas
return False
if tableau[i+1][j]: # case juste en-dessous
return False
if j>0 and tableau[i][j-1]: # à gauche
return False
if j<p-1 and tableau[i][j+1]: # à droite
return False
return True
##################################################
def faire_tomber_un_bloc(j):
# j = nouveau_bloc()
i = 0
while peut_tomber(i,j):
i = i + 1
152
tableau[i][j] = 1
return i,j
##################################################
def faire_tomber_des_blocs(k):
# voir_tableau()
# print()
for __ in range(k):
j = randint(0,p-1)
faire_tomber_un_bloc(j)
# voir_tableau()
# print()
return
# faire_tomber_des_blocs(7)
# print()
# voir_tableau()
# exit()
##############################
# Activité 2 - Affichage tkinter statique
##############################
n = 125 # nb de lignes
p = 250 # nb de colonnes
tableau = [[0 for j in range(p)] for i in range(n)]
echelle = 5 # échelle
nb_blocs = 500
root = Tk()
canvas = Canvas(root, width=p*echelle, height=n*echelle, background="white")
[Link](fill="both", expand=True)
def afficher_tableau():
[Link]("all") # Efface tout
for i in range(n):
for j in range(p):
if tableau[i][j]:
canvas.create_rectangle(j*echelle,i*echelle,j*echelle+echelle-1,i*echelle+
,→ echelle-1,width=1,fill='green')
return
# Test
# afficher_tableau()
def action_bloc():
faire_tomber_des_blocs(nb_blocs)
afficher_tableau()
return
bouton_bloc = Button(root,text="Afficher blocs", width=20, command=action_bloc)
bouton_bloc.pack(pady=10)
bouton_quitter = Button(root,text="Quitter", width=20, command=[Link])
bouton_quitter.pack(side=BOTTOM, pady=10)
[Link]()
153
Activité 3
Activité 3 aleatoire_circulaire.py
##############################
# Aléatoire - Idées
##############################
from random import *
from tkinter import *
import time
##############################
# Activité 1 - Faire tourner des blocs
##############################
n = 10 # nb de lignes
p = 10 # nb de colonnes
bord = min(n,p)//5 # distance au bord
tableau = [[0 for j in range(p)] for i in range(n)]
tableau[(n-1)//2][(p-1)//2] = 1 # Centre
##################################################
def voir_tableau():
for i in range(n):
for j in range(p):
print(tableau[i][j], end="")
print()
return
# voir_tableau()
##################################################
def est_libre(i,j):
# if tableau[i][j]: # sur un bloc existant
# return False
if i>0 and tableau[i-1][j]: # au dessus
return False
if i<n-1 and tableau[i+1][j]: # en-dessous
return False
if j>0 and tableau[i][j-1]: # à gauche
return False
if j<p-1 and tableau[i][j+1]: # à droite
return False
return True
##################################################
def est_dedans(i,j):
if (0 <= i < n) and (0 <= j < p):
return True
else:
return False
##################################################
def lancer_un_bloc():
i = randint(0+bord,n-1-bord)
154
j = randint(0+bord,p-1-bord)
while est_dedans(i,j) and est_libre(i,j):
dx = randint(-1,1)
dy = randint(-1,1)
i = i + dx
j = j + dy
if est_dedans(i,j):
tableau[i][j] = 1
return i,j
##################################################
def lancer_des_blocs(k):
# voir_tableau()
# print()
for __ in range(k):
lancer_un_bloc()
# voir_tableau()
# print()
return
lancer_des_blocs(5)
##############################
# Activité 2 - Affichage tkinter statique
##############################
n = 170 # nb de lignes
p = 200 # nb de colonnes
bord = min(n,p)//10 # distance au bord pour lancement
echelle = 5
tableau = [[0 for j in range(p)] for i in range(n)]
tableau[(n-1)//2][(p-1)//2] = 1 # Centre
nb_blocs = 500
root = Tk()
canvas = Canvas(root, width=p*echelle, height=n*echelle, background="white")
[Link](fill="both", expand=True)
def afficher_tableau():
[Link]("all") # Efface tout
for i in range(n):
for j in range(p):
if tableau[i][j]:
canvas.create_rectangle(j*echelle,i*echelle,j*echelle+echelle-1,i*echelle+
,→ echelle-1,width=1,fill='green')
return
def action_bloc():
lancer_des_blocs(nb_blocs)
afficher_tableau()
return
bouton_bloc = Button(root,text="Lancer des blocs", width=20, command=action_bloc)
bouton_bloc.pack(pady=10)
155