Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • master
1 result

Target

Select target project
No results found
Select Git revision
  • master
1 result
Show changes
94 files
+ 344646
601
Compare changes
  • Side-by-side
  • Inline

Files

+27 −0
Original line number Diff line number Diff line
# INF-TC1

## Installation

* La distribution Anaconda offre cet avantage en étant multi-plateformes (Windows, Mac, Linux) et disposant de tous les outils dont vous aurez besoin en Informatique au cours du semestre (interpréteur Python, éditeur Spyder, divers modules). Vous obtiendrez la dernière version sur ce site : https://www.anaconda.com/download/

* Nous vous demandons donc de l’installer sur vos ordinateurs et de vérifier son fonctionnement (l’exécution d’un code simple devrait suffire) avant votre première séance de TD.

* Concerant l'éditeur de code Python, vous pouvez utiliser Spyder inclu dans Anaconda, mais vous pouvez aussi télécharger et installer Microsoft Code qui est une excellente alternative : https://code.visualstudio.com/download


## Aides en informatique

* Des [transparents d'aide](aide-informatique.pdf)
* Une vidéo de présentation de ces transparents https://replay.ec-lyon.fr/video/0920-aides-en-informatique/ 

## Livres

Les livres suivants sont disponibles sous forme de pdf et couvrent les points abordés en cours et en TD :

- [Think Python](books/thinkpython2.pdf), 2nd edition, par Allen B. Downey
- [Python for Everybody](books/pythonlearn.pdf), par Charles Severance
- [Problem Solving with Algorithms and Data Structures using Python](books/problemsolving.pdf), par Brad Miller et David Ranum
- [ODS Pyhon](books/ods-python.pdf), par Pat Morin ([url](https://opendatastructures.org/ods-python/))

Autres ressources :

- https://en.wikibooks.org/wiki/Algorithms/
- [computer science books](https://freecomputerbooks.com/compscAlgorithmBooks.html)
 No newline at end of file

TD01/code/01-git.py

deleted100644 → 0
+0 −13
Original line number Diff line number Diff line
#####################################
## GitLab de l'Ecole Centrale de Lyon
#
# https://gitlab.ec-lyon.fr/
#
#####################################

## Comment vous connecter ?
# Avec vos identifiants ECL.

## A quoi ça sert ?
# Nous utiliserons GitLab pendant les cours d'informatique afin de vous 
# distribuer le code et vous permettre de le sauvegarder. GitLab est très utilisé en entreprise, il vous est donc important de l'utiliser très rapidement car cela vous sera utile pour vos stages, projects, etc.
 No newline at end of file

TD01/code/01-git_exercices.py

deleted100644 → 0
+0 −8
Original line number Diff line number Diff line
# Faire un premier commit avec une fonction déjà existante

def addition(a, b):
    return a + b

# Tester que cela fonctionne

# Afficher le résultat sur le site gitlab

TD01/code/02-python.py

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
# Faire un premier test d'une fonction Python

## Vérifiez votre numéro de version
# Afficher le numéro de version avec la commande suivante 
# dans un terminal

# python ––version

# > La version doit être égale ou supérieure à 3.7
 No newline at end of file

TD01/code/02-python_exercices.py

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
# Vous devez valider ce code qui affiche le numéro de version
# Rien d'autre à faire !
import sys

if not sys.version_info.major == 3 and sys.version_info.minor >= 7:
    print("Python 3.7 ou supérieur est nécessaire !")
else:
    print("Vous utilisez {}.{}.".format(sys.version_info.major, sys.version_info.minor))
    sys.exit(1)
 No newline at end of file

TD01/code/03-commentaires.py

deleted100644 → 0
+0 −15
Original line number Diff line number Diff line
# Un commentaire court commence par un # et se limite à la fin de la ligne

"""
On peut aussi créer un commentaire long = une zone de 
commentaires  sur plusieurs lignes placées
entre une paire de triple-guillements dont le second suit :
"""

# Remarques : 
# Un ';' à la fin d'une ligne rend la ligne muette (pas d'affichage des résultats). 
# Il permet également de placer plusieurs expressions sur la même ligne.

# Si vous placez un commentaire immédiatement après la signature d'une fonction} 
# (ou une méthode, une classe, etc.) entre un couple de  """, 
# votre commentaire (appelé docstring) devient accessible avec help
 No newline at end of file

TD01/code/04-bases.py

deleted100644 → 0
+0 −38
Original line number Diff line number Diff line
# Exemple 1 : moyenne
# Calcul de la moyenne de deux entiers  

a=input('Donner la valeur de a : ')
b=input('Donner la valeur de b : ')
print('la moyenne = ', (int(a) + int(b))/2)  # int(a) : conversion de 'a' en entier

# Une seconde méthode : on convertit en lisant les valeurs en int
a=int(input('Donner la valeur de a : '))
b=int(input('Donner la valeur de b : '))
print('la moyenne = ', (a+b)/2) 

# Exemple 2 : racines carrées
import math;

a=int(input('Donner le coefficient a : '))
b=int(input('Donner le coefficient b : '))
c=int(input('Donner le coefficient c : ')) 

if (a == 0):
  if ( b != 0) :
    print("Pas quadratique : racine simple x = ",-c/b)
  else:
    print("une blague ! ")
else :
  delta=b*b-4*a*c   #ou b**2
  if(delta < 0) :
    print("pas de racines reelles")
  else :
    assert(a != 0)     # Déjà vérifié mais pour  montrer  l'intérêt de "assert".
    if(delta>0) :
      x1 = (-b+math.sqrt(delta))/(2*a)
      x2 = (-b-math.sqrt(delta))/(2*a)
      print("x1 = ",x1)
      print("x2 = ",x2)
    else :
        x1 = x2 = -b/(2*a)
        print("racine double x1 = x2 = ",x1) 
 No newline at end of file

TD01/code/04-bases_exercices.py

deleted100644 → 0
+0 −7
Original line number Diff line number Diff line
# Exercice  : pair/impair
# Lire un entier au clavier et décider (et afficher) s'il est pair ou impair.
a=int(input('Donner un entier  positif : '))
if (a%2 ==1):
    print(a, " est impair")
else :
    print(a, " est pair")

TD01/code/05-fonctions.py

deleted100644 → 0
+0 −11
Original line number Diff line number Diff line
# 5 Introduction aux fonctions

## Exemple : moyenne de deux entiers
# Calcul de la moyenne de deux entiers par une fonction (de signature entier x entier -> reel)
def moyenne(a,b):
  return (a+b)/2             

# --- Partie Principale ----
a=input('Donner la valeur de a : ')
b=input('Donner la valeur de b : ')
print('la moyenne = ', moyenne(int(a),int(b))) 
 No newline at end of file
+0 −68
Original line number Diff line number Diff line
## 5.2 Exercice : Racines d'une quadratique avec une fonction
# Reprendre l'exemple du calcul des racines d'une équation de seconde degré
# et placer les calculs dans la fonction {\tt quadratique(a, b, c)} qui
# reçoit en paramètre les coefficients  {\it a,b} et {\it c} et renvoie les
# racines de cette équation.

from math import sqrt

def quadratique(a, b, c):
  if (a == 0):
    if ( b != 0) :
      return ("Pas quadratique : racine simple x "+str(-c/b))
    else:
      return ("une blague ! ")
  else :
    delta=b*b-4*a*c     #b*b OU b**2
    if(delta < 0) :
      return ("pas de racines réelles")
    else :
      if(delta>0) :             # Le test initial sur la valeur de "a"  montre son intérêt  ici.  
          assert(a != 0)     # Pas utile mais on montre aux élèves l'intérêt de "assert".
          x1=(-b+math.sqrt(delta))/(2*a)
          x2=(-b-math.sqrt(delta))/(2*a)
          return ("x1 = "+str(x1)+ " x2 = "+ str(x2))
      else :   
          x1 = x2 = -b/(2*a)
          return ("racine double x1 = x2 = "+str(x1))  

# La partie principale
a=int(input('Donner le coefficient a : '))
b=int(input('Donner le coefficient b : '))
c=int(input('Donner le coefficient c : ')) 
print(quadratique(a,b,c))      

## 5.3 Exercice : Moyenne et écart type
# Créer une liste de 100 nombres de la distribution N(16,2). 
import random
echantillon=[random.gauss(16,2) for n in range(100)]

def moyenne_liste(liste):
    return sum(liste)/len(liste)

def variance(liste):
    moy=moyenne_liste(liste)
    return moyenne_liste([(x-moy)**2 for x in liste])

# ---------- Partie Principale ----------
# Pour tester nos calculs sans lire des entiers, on fait un tirage Normale
echantillon=[random.gauss(16,2) for n in range(100)]
 
print("Moyenne = " , moyenne_liste(echantillon))
print("Ecart type = " , variance(echantillon)**0.5)           # %*  {\color{magenta} $\sqrt{Var}$}  *)


""" TRACE : 
Moyenne =  15.92301989946788
Ecart type =  1.9934234202474366
"""

# 5.4 Variante : Exercice (suite écart type)

echantillon=[random.gauss(16,2) for n in range(100)]
varia = moyenne([x**2 for x in echantillon])-moyenne(echantillon)**2
print("De la seconde façon : ", varia**0.5)

""" Trace :
De la seconde façon :  1.8839867058987951 
"""

TD01/code/06-script.py

deleted100644 → 0
+0 −16
Original line number Diff line number Diff line
# 6 Créer un script Python indépendant

from racines import trinome;
print(trinome(2.0, -4.0, 2.0))


# --- Partie Principale ---------
print(trinome(1.0, -3.0, 2.0))
print(trinome(1.0, -2.0, 1.0))
print(trinome(1.0, 1.0, 1.0)) 

""" On obtient 
(2, 1.0, 2.0)
(1, 1.0)
(0,)   """

TD01/code/07-types.py

deleted100644 → 0
+0 −39
Original line number Diff line number Diff line
# 7 Types principaux en Python

if type(1) is not int : print('oups')

if type('1') is not int : print(1)

type(3.14)
# float

type(None)
# NoneType

f = lambda c : c if type(c) is str and  c.isalpha() else '?'
type(f)
# function

# Utilisation de f (voir plus loin les "lambda expressions") :
f('a')  # donne 'a' car 'a' est alphabétique
f('1')  # donne '?' car '1' n'est  pas alphabétique
f(1)    # donne '?'  car  1 n'est  pas une chaine

import sys;

print(sys.int_info)
# sys.int_info(bits_per_digit=30, sizeof_digit=4)

print(sys.float_info)
# sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308,
# min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15,
# mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)

print(sys.getsizeof(float))     # La taille de  la classe float
# 400
print(sys.getsizeof(float()))   # La taille d'un  float
# 24                            # Ce que coute en octes un réel 
                                # (valeur  + infos supplémentaires)


TD01/code/08-conversion.py

deleted100644 → 0
+0 −141
Original line number Diff line number Diff line
# 8 Conversion de types

list1 = ['1', '2', '3']
str1 = ''.join(list1)

str1
# '123'

list1 = [1, 2, 3]
str1 = ''.join(str(e) for e in list1)   # ou avec "" à la place de ''

str1
# '123'


a = "545.2222"
float(a)
# 545.2222      suivant le système, on peut avoir des '0' après les '2'

int(float(a))
# 545

def is_float(value):
  try:
    float(value)
    return True
  except:
    return False

# On peut aussi utiliser la prédéfinie eval() qui évalue du code Python
eval("1.5") 
# 1.5

# Une alternative plus sûre à eval()
import ast
ast.literal_eval("545.2222")
545.2222

ast.literal_eval("31")
31

# Des cas d'erreur 
eval(toto)          # toto non défini ou n'est pas un str/octes/code
ast.literal_eval(toto)
# Erreur dans les 2 cas


# Converstion en binaire
st = "hello Debase"
' '.join(format(ord(x), 'b') for x in st)
# '1101000 1100101 1101100 1101100 1101111 100000 1000100 1100101 1100010 1100001 1110011 1100101'

# Conversion de string en hexadécimal
s='Hello Debase of Ecl'
' '.join(format(ord(x), 'x') for x in s)
# '48 65 6c 6c 6f 20 44 65 62 61 73 65 20 6f 66 20 45 63 6c'

# Conversion entier en Unicode
chr(16)     # Quelle est la forme hexa de 16 ?
#'\x10'

# Conversions décimal <==> base xx

int('12',8) # Quelle est la valeur décimale du nombre octal '12' (octal car base = 8)
# 10    

int('12',16) # Quelle est la valeur décimale du nombre hexa '12' (hexa car base = 16)
# 18

int('12')   # Quelle est la valeur décimale du nombre décimale '12' (décimal car base par défaut = 10)
# 12

int('1000',2)   # Que donne le nombre binaire '1000' en décimal (binaire car base = 2)
# 8   

# Pour convertir un entier en octal

oct(12)
# '0o14'        #un 'O' au début (pour Octal)

oct(8)
# '0o10'

# Autres conversions

# octal
eval('0o010') == 10     # La valeur décimale de '0o010' est-elle 10
# False

eval('0o010')
# 8

oct(42)               # La valeur octale de l'entier 42
# '0o52'

int('0o52', 0)      # La valeur décimale de l'octale  '0o52' (si base=0 alors base est dans le string)
# 42

int('1101', 2)      # La valeur décimale du binaire '1101'  (base explicite = 2)
#13

int('0b1101', 2)    # Idem, base explicitée = 2, peut importe '0b'
#13

int('0b1101', 0)    # La valeur décimale du binaire '0b1101' (base = 0 --> la base '0b' est dans le string)
#13

from struct import *

pack('hhl', 1, 2, 3)
# b'\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
# b veut dire byte (2 octes). \x veut dire hexa

pack('b', 1)
# b'\x01'

pack('b', 16) # signed char de taille 1. On convertie 16 en signed char
# b'\x10' 

In [39]: pack('B', 16)  # unsigned char de taille 1
# b'\x10'

pack('h', 1)
# b'\x01\x00'

calcsize('h')
# 2

calcsize('b')
# 1

unpack('b', b'\x10')
# (16,)

type(unpack('b', b'\x10'))
# tuple

unpack('b', b'\x10')[0]    # Première élé. Il y a virgule car taille tuple >= 2  
# 16

pack('B',65) # donne b'A'   = i.e. le caractère dont le code = 65
 No newline at end of file
+0 −74
Original line number Diff line number Diff line
# 8 Conversion de types

# Exercice

# Écrire la fonction convertir(S) qui convertit son paramètre (un string) 
# en un entier. Pour que la conversion soit possible, le paramètre S doit 
# être être composé de chiffres éventuellement précédé d'un signe.

def convertir(S) : # S est une liste de caractères

    # Il y a un signe au début ou pas ?
    signe= +1                                         # Initialisation du signe
    if S[0:1] in '+-':
        if S[0:1]=='-' : signe=-1
        S = S[1:]                                        # On enlève le signe

    if S.isdigit(): return int(S) * signe             # On peut aussi écrire : str.isdigit(xs) !
    else: return (S + " n'est pas un nombre")

S=input('Donner  une chaine de chiffres: ')
print(convertir(S))

# Donner  une chaine de chiffres: -124
# -124
# Donner  une chaine de chiffres: 12a

#  Une version qui n'utilise ni int() ni isdigit()
def convertir02(S1) :       # S est une liste de caractères
    assert(S1 != '' and S1 != None)
    signe= +1                                       # Initialisation du signe
    val = 0; S=S1
    if S[0] in '+-':
        if S[0:1]=='-' : signe=-1
        S = S[1:]
    for car in S :
        if car in "0123456789": val = 10*val+ord(car)-ord('0')
        else : return (S1 + " n'est pas un nombre")
    return val * signe             # On peut aussi écrire : str.isdigit(xs) !

S=input('Donner  une chaine de chiffres : ')
print(convertir02(S))

# Exercice
# Écrire la fonction {\tt convertir2r(S)} qui convertit son paramètre (un 
# string) en un réel (loat). Pour que la conversion soit possible, le
# paramètre {\it S} doit être être éventuellement précédé d'un signe, puis 
# composé de chiffres suivis d'un '.' puis une série de chiffres. La
# présence d'un '.' est obligatoire, et qui est forcément suivi d'au moins
# un chiffre.

def convertir2r(S) :                       # S est une liste de caractères
    assert('.' in S)                        # '.' obligatoire
    lst_2_parties=S.split('.')              # une liste des 2 parties
    val_int=0
    if lst_2_parties[0] != '' : val_int=convertir02(lst_2_parties[0])
        
    # vérifier que la partie décimale ne comporte  pas un second signe !
    assert(lst_2_parties[1][0] not in '+-')

    val_reel=0
    if lst_2_parties[1] != '' : val_reel=convertir02(lst_2_parties[1])

    # La partie décimale s'ajoute ou se retrache suivant le signe de val_int'
    if val_int >= 0 :
        return val_int + val_reel/(10**len(lst_2_parties[1]))
    else : return val_int - val_reel/(10**len(lst_2_parties[1]))


S=input('Donner  une chaine de chiffres (un réel) : ')
print(convertir2r(S))
convertir2r('12.34')
convertir2r('0.12')
convertir2r('13.0')
convertir2r('-3.001')
 No newline at end of file

TD01/code/09-modules.py

deleted100644 → 0
+0 −22
Original line number Diff line number Diff line
# Modules Python

# import tel_module as mod1
# import un_module as mod2
# mod1.fonc(..)     #appel de la fonction fonc du tel_module
# mod2.fonc(..)     #appel de la fonction homonyme du un_module

# import tel_module
# 
# def ma_fonction():
#       localname = tel_module.fonc
#       foo = localname(bar)

import scipy.stats as st
st.nanmean()

# Si vous obtenez le message
# ModuleNotFoundError: No module named 'scipy'
# ..vous devez installer le module avec la commande
#
# pip3 install scipy
#
 No newline at end of file

TD01/code/10-range.py

deleted100644 → 0
+0 −22
Original line number Diff line number Diff line
# Modules Python

# import tel_module as mod1
# import un_module as mod2
# mod1.fonc(..)     #appel de la fonction fonc du tel_module
# mod2.fonc(..)     #appel de la fonction homonyme du un_module

# import tel_module
# 
# def ma_fonction():
#       localname = tel_module.fonc
#       foo = localname(bar)

import scipy.stats as st
st.nanmean()

# Si vous obtenez le message
# ModuleNotFoundError: No module named 'scipy'
# ..vous devez installer le module avec la commande
#
# pip3 install scipy
#
 No newline at end of file

TD01/code/racines.py

deleted100644 → 0
+0 −17
Original line number Diff line number Diff line
from math import sqrt;
# résolution équation quadratique 
def trinome(a, b, c):
    delta = b**2 - 4*a*c
    if delta > 0.0:
        assert(a != 0)      
        racine_delta = sqrt(delta)
        return (2, (-b-racine_delta)/(2*a), (-b+racine_delta)/(2*a))
    elif delta < 0.0: return (0,)
    else: 
        assert(a != 0)     
        return (1, (-b/(2*a)))
    
if __name__ == "__main__":
    print(trinome(1.0, -3.0, 2.0))
    print(trinome(1.0, -2.0, 1.0))
    print(trinome(1.0, 1.0, 1.0))  
 No newline at end of file
+1362 −0

File added.

Preview size limit exceeded, changes collapsed.

TD02/code/load.py

deleted100644 → 0
+0 −12
Original line number Diff line number Diff line
data = []

with open("etudiants.txt") as f:
    keys = None
    for line in f:
        l = [w.strip() for w in line.split(';')]
        if keys is None:
            keys = l
        else:
            data.append(l)

print(data)
 No newline at end of file

TD02/code/test_analyse.py

deleted100644 → 0
+0 −28
Original line number Diff line number Diff line
#%%
import time
import random
import matplotlib.pyplot as plt
import numpy as np
#%matplotlib inline

nvalues = [100, 500, 1000, 1500, 2000, 2500, 3000]
timesEtudiants1 = []

for i in nvalues:

    random.seed()
    p = 12**2 # Ordre de grandeur des valeurs
    liste = []
    
    for x in range(i): liste.append(random.randint(0, p))

    a=time.perf_counter()
    e1 = []
    for n in liste:
        e1.append(n)
    b=time.perf_counter()
    timesEtudiants1.append(b-a)

plt.plot(nvalues,timesEtudiants1, "r-", label="Etudiants 1")
plt.title("Comparaison des performances")
# %%

TD02/code/test_heap.py

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
import heapq
tas = []

for i in range(5): heapq.heappush(tas, i)

while not len(tas) == 0: 
  print(heapq.heappop(tas), end=" ")

# 0 1 2 3 4
 No newline at end of file

TD02/code/test_lifoqueue.py

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
import queue
pile = queue.LifoQueue()

for i in range(5): pile.put(i)

while not pile.empty(): 
  print(pile.get(), end=" ")

# 4 3 2 1 0
 No newline at end of file
+101 −0
Original line number Diff line number Diff line
nom;prenom;filiere;moyenne;absences
Dickerson;Chaney;PSI;6;4
King;Shay;PSI;2;2
Chan;Aileen;MP;8;3
Schwartz;Destiny;PSI;16;5
Parrish;Prescott;MP;1;4
Calhoun;Brenda;PSI;10;4
Watts;Shellie;PSI;6;4
Baird;Octavius;PC;4;2
Graves;Vanna;MP;10;0
Decker;Nerea;PSI;9;4
Townsend;Naomi;PC;13;3
Decker;Nichole;PSI;10;3
Mcgee;Blythe;PSI;7;0
Franco;Cyrus;PSI;12;1
Mcdowell;Zelda;MP;6;1
Cherry;Stone;PSI;10;5
Mendoza;Kirsten;PC;18;0
Mathis;Xaviera;MP;12;1
Booker;Gretchen;MP;2;1
Hansen;Slade;PSI;1;1
Mason;Forrest;MP;13;3
Wolfe;Fatima;PC;15;5
Richards;Justine;MP;20;0
Kelley;Abra;PC;2;4
Lang;Ulysses;PSI;2;5
Barker;Austin;MP;15;5
Cannon;Kalia;MP;3;4
Higgins;Charity;PSI;18;5
Parker;Fritz;PC;14;2
Chambers;Yvette;PSI;7;1
Vinson;Denise;PSI;3;5
Mcmillan;Chava;PSI;7;3
Gallegos;Lee;PC;16;0
Ferguson;Solomon;PSI;11;4
Camacho;Zena;MP;4;4
Sexton;Fallon;PSI;16;2
Campbell;Preston;PC;0;0
Greer;Lance;PC;15;5
Oliver;Aileen;PC;10;2
Nielsen;Timon;PC;1;2
Perkins;Roth;PSI;1;2
Beard;Blair;PSI;13;1
Burgess;Keely;PSI;4;4
Wells;Honorato;PSI;17;0
Richardson;Cherokee;PC;20;1
Burgess;Blair;PC;16;4
Rice;Florence;PC;7;4
Villarreal;Delilah;MP;9;5
Cherry;Maite;MP;0;2
Berry;Jermaine;MP;17;4
Shepherd;Alfreda;PSI;20;5
Workman;April;PC;3;1
Carter;Herman;PC;11;1
Carpenter;Teagan;MP;0;1
Fowler;Leo;PSI;19;4
Mcgee;Kristen;PSI;9;4
Mcpherson;Channing;PC;0;0
Diaz;Nathaniel;PC;4;5
Klein;Maisie;PSI;16;3
Graham;Gary;MP;12;4
Jensen;Raja;PC;18;1
Wilkinson;Sawyer;PSI;10;0
Wagner;Lamar;MP;16;2
Abbott;Sybil;MP;17;1
Glenn;Arsenio;PSI;4;3
Moreno;Axel;PSI;7;4
Barrett;Dylan;PC;14;4
Keith;Rae;PC;9;1
Shepard;Rebecca;PC;8;5
Meyers;Illiana;MP;3;3
Bruce;Tatyana;MP;2;0
Mcguire;Olivia;PC;17;4
Merritt;Tatiana;PSI;19;3
Berg;Dale;MP;12;1
Matthews;Tallulah;MP;5;3
Steele;Cain;MP;8;2
Ellison;Britanni;PC;4;1
Richards;Audra;MP;15;0
Hood;Rylee;PSI;1;4
Townsend;Paul;PC;14;4
Cervantes;Thaddeus;MP;10;5
Dudley;Amela;PC;2;0
Lucas;Matthew;MP;4;1
Parrish;Nell;PC;13;3
Patterson;Bertha;PSI;18;0
Knapp;Lawrence;MP;3;5
Stanton;Keith;MP;5;2
Hayes;Mannix;PSI;3;2
Pearson;Ross;PC;10;4
Kaufman;Uta;MP;10;4
Bauer;Naida;PC;20;5
Carrillo;Quamar;PC;15;3
Orr;Lisandra;PSI;6;2
Randolph;Darryl;PSI;16;4
Boyer;Prescott;PC;20;2
Serrano;Ashely;PSI;10;2
Carney;Oren;PC;7;4
Riley;Arden;PC;1;5
Phillips;Joshua;PSI;20;3
Soto;Colt;PC;16;3
 No newline at end of file
Original line number Diff line number Diff line
nom;prenom;filiere;moyenne;absences
Dupond;Pierre;MP;19;0
nom;prenom;filiere;note;absences
Dupond;Pierre;MP;19;7
Dupont;Jeanne;MP;19;5
Clavier;Christian;PSI;14;1
Gilles;Eric;PC;16;3
Arthaud;Nathalie;MP;15;0
 No newline at end of file
+896 −0

File added.

Preview size limit exceeded, changes collapsed.

TD03/code/viz.py

deleted100644 → 0
+0 −11
Original line number Diff line number Diff line
from graphviz import Digraph

g = Digraph('G', filename='graph.gv')

g.edge('a', 'b')
g.edge('a', 'c')

print(g.source)

g.render(filename='img')
g.view()
 No newline at end of file
+1025 −0

File added.

Preview size limit exceeded, changes collapsed.

TD04/code/load.py

deleted100644 → 0
+0 −14
Original line number Diff line number Diff line
labyrinthe = [[0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 1, 0, 0, 0, 0, 0],
              [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

def affiche_labyrinthe(l):
    print('\n'.join([''.join(['{:4}'.format(item) for item in row]) 
        for row in l]))
 No newline at end of file

TD04/code/priorite.py

deleted100644 → 0
+0 −9
Original line number Diff line number Diff line
from queue import PriorityQueue

file_prio = PriorityQueue()
file_prio.put((2, "Bob"))
file_prio.put((1, "Alice"))
file_prio.put((6, "Nat"))

while not file_prio.empty():
     print(file_prio.get()[1])
 No newline at end of file
+160 −0
Original line number Diff line number Diff line
%% Cell type:markdown id:751c51f9 tags:

NAME:

%% Cell type:markdown id:b97bad7e-82ff-44a7-9779-13c139085623 tags:

# INF TC1 - TD5 (2h + 2h AUTONOMIE) - Devoir à rendre #1

%% Cell type:markdown id:1bb26026-8560-4a3c-90e6-2cfd7a49320a tags:

---

%% Cell type:markdown id:dd8d4905-55f9-4957-8008-a963cc6de061 tags:

Vous serez évalué sur le rendu de ce TD qui sera à déposer sur Moodle **deux (2) semaines** après la séance d'autonomie #1. Le rendu sera à réaliser sous forme de **notebook** qui contient votre code et images.

%% Cell type:markdown id:99ee8fad-7f32-4fe2-85d3-3b8da49f317f tags:

<details style="border: 1px">
<summary> MODALITES DE RENDU</summary>

### Comment rendre son devoir ?

Vous serez évalué sur le rendu de ce TD qui sera à déposer sur Moodle **deux (2) semaines** après les séances d'autonomie et de TD. Vous devrez créer une archive (zip, rar, etc.) nomée `nom1-nom2-inf-tc1-td5.zip` qui contiendra tous les éléments de votre rendu (rapport en notebook, code, images de test). Vous pouvez rendre ce rapport seul ou en binôme. Le rendu du TD doit contenir a minima :

1. Toutes les étapes jusqu'à la 6ème doivent avoir été abordées
2. Justifications, illustrations et tests sur plusieurs images

**A garder en tête :**

- Un code fonctionnel et les tests appropriés devront être fournis dans l'archive qui doit être autonome (le correcteur ne doit pas avoir à rajouter d'image ou de fichier supplémentaire)

- Vous fournirez les images de test et leurs résultats; évitez cependant de prendre des tailles d'images trop importantes.

- Le rapport **devra être au format Notebook Jupyter** et comprendre :

  - Le détail des étapes que vous avez suivies

  - La description de parties de code difficiles

  - Tout souci ou point bloquant dans votre code

  - Les graphiques et diagrammes nécessaires

  - Des analyses et discussions en lien avec votre approche

  - Des exemples simples mais aussi difficiles

**Tout travail supplémentaire (méthode originale, optimisation poussée) fera l'objet de points en bonus.**



*Voici une suggestion afin de se faire un ordre d'idée*


Un groupe avec une note entre 10 et 12 :

- Les étapes suivies
- Un code fonctionnel et les méthodes basiques
- Un rapport succint
- Un code certes fonctionnel mais peu commenté
- Les exemples d'images fournies

Un groupe entre 12 et 14 a en plus proposé :

- Des structures de données avancées (Ensembles, Files, etc)
- Une justification de chaque étape
- Une méthode un petit peu plus poussée

Un groupe entre 14 et 16 a en plus proposé :

- Une méthode originale (K-Means, etc)
- Une démarche expérimentale très détaillée sur les optimisations
- Des tests plutôt originaux

Un groupe au-dessus de 16 comporte une ou plusieurs parties exceptionnelles :

- Rapport très détaillé et exemplaire sur le fond comme sur la forme
- Une démarche expérimentale très détaillée sur les optimisations
- Code et tests



</details>

%% Cell type:markdown id:d48155b2-8db8-4557-a66b-363351712560 tags:

## Objectif du devoir

Le but de ce devoir est de **déterminer automatiquement une palette de couleurs optimale** pour une image donnée. Cette palette devra valider les contraintes suivantes :

1. utiliser moins de couleurs que le nombre disponible dans l'image donnée;
2. être la plus représentative possible des couleurs de l'image donnée.

Comme nous l'avons vu dans le TD 4, les couleurs peuvent être encodée par composantes rouge, verte et bleue (soit 256 valeurs possibles par composante, autrement dit sur 8 bits) ainsi potentiellement utiliser $256 \times 256 \times 256 = 16 777 216$ couleurs. En réalité, beaucoup moins sont nécessaires et surtout perceptibles par l'humain. Réduire le nombre de couleurs ou réaliser une "_quantification de couleurs_" est une tâche fréquente et c'est une fonctionnalité classique des outils éditeurs d'images (Photoshop, Gimp, etc.) implémentée aussi dans le module Pillow de Python. A noter que cette réduction s'effectue avec perte de couleurs et doit être réalisée avec les bons paramètres (nombre et choix des couleurs) ce qui est votre objectif.

La figure ci-dessous illustre le problème à résoudre : étant donnée une image en entrée, proposer une liste de couleurs (que l'on appellera la palette), afin de re-colorier une image en sortie.

<div style="text-align:center;">
<table>
  <tr>
    <td>
      <img src="figures/color-rainbow.png" alt="Image originale" style="height:5cm;">
      <p>Image donnée</p>
    </td>
    <td>
      <img src="figures/rainbow-palette-8.png" alt="Palette de 8 couleurs représentatives" style="height:5cm;">
      <p>Palette de 8 couleurs représentatives</p>
    </td>
    <td>
      <img src="figures/rainbow-recoloriee.png" alt="Image originale recoloriée avec la palette" style="height:5cm;">
      <p>Image donnée recoloriée avec la palette</p>
    </td>
  </tr>
</table>
</div>

%% Cell type:markdown id:fd464e65-adfe-4e11-bf87-f12c513fbaea tags:

## Étapes de travail

Voici des étapes de travail suggérées :

1. Prenez une image de votre choix (pas trop grande) en la chargeant avec PIL. Lister les couleurs présentes, identifier celles qui sont uniques et leur fréquence.

2. Proposez une méthode (naïve pour commencer) de choix d'une palette de $k$ couleurs. Affichez là sous forme d'image (exemple de d'image au milieu de la figure du dessus) avec une nouvelle image PIL. Utilisez également des images simples où le résultat attendu est connu comme pour les images ci-dessous :

  <div style="text-align:center;">
    <table>
      <tr>
        <td>
          <img src="figures/1-color-back.png" alt="1 couleur noir" style="width:3cm;">
          <p>1 couleur noir</p>
        </td>
        <td>
          <img src="figures/4-color.png" alt="4 couleurs" style="width:3cm;">
          <p>4 couleurs</p>
        </td>
      </tr>
    </table>
  </div>

3. Re-coloriez une image avec une palette de $k$ couleurs, et affichez le résultat sous forme d'image PIL. Pour re-colorier chaque pixel, prendre la couleur la plus proche dans la palette en utilisant une fonction de distance (Euclidienne par exemple..).

4. Proposez une méthode de validation de votre approche. Par exemple affichez la différence entre l'image originale et celle re-coloriée. Calculez un score global d'erreur.

5. Améliorez le choix des $k$ couleurs afin de minimiser l'erreur entre l'image originale et re-coloriée. Une piste possible est de trier les couleurs dans une liste, diviser cette liste en $k$ intervals de couleurs et prendre la couleur du milieu de chaque interval. D'autres méthodes plus avancées peuvent être explorées !

6. Testez votre palette sur plusieurs images de votre choix ou générées automatiquement avec un nombre et une distribution connue de couleurs. Comparer les performances de vos techniques avec d'autres méthodes (cette fois vous pouvez utiliser un éditeur de texte ou la fonction _quantize_ de PIL [(doc)](https://pillow.readthedocs.io/en/stable/reference/Image.html).

7. Utilisez un pré-traitement des images (flou gaussien, etc) afin de lisser les couleurs. Cela est une piste afin de choisir de meilleurs couleurs représentatives. Proposez une comparaison de cette amélioration (ou de déterioration éventuelle) avec les autres méthodes.

8. Proposez une méthode d'amélioration de calcul de la distance entre deux couleurs, vous pouvez vous baser sur d'autres espaces de couleur [(doc)](https://fr.wikipedia.org/wiki/Espace_de_couleur). Cette partie est difficile, les espaces de couleurs possibles sont complexes à comprendre.

9. Optimisez les étapes précédentes (complexité, espace nécessaire, structures de données, etc.) et justifiez vos choix.


### Bonus

10. Créez une palette représentative à partir de plusieurs images.
+780 −0

File added.

Preview size limit exceeded, changes collapsed.

TD06/mots-10.txt

0 → 100755
+10 −0
Original line number Diff line number Diff line
a
à
abaissa
abaissable
abaissables
abaissai
abaissaient
abaissais
abaissait
abaissâmes
 No newline at end of file