#!/usr/bin/env python3


################
##            ##
## Exercice 3 ##
##            ##
################
print("\nExercice 3\n")


def ératosthène(n):
    # On initialise L à [0..n]
    L=[True] * (n+1)

    # Par définition 0 et 1 ne sont pas premiers
    L[0] = False
    L[1] = False
    # On parcours les entiers de i à racine de n.
    i=2
    while i*i <= n:
        # Si i est premier
        # On barre tous les multiples de i : 2*i, 3*i, etc.
        if L[i] != False:
            for k in range(2*i, n+1, i): # ou range(i*i, n+1, i) car les m*i avec m<i
                L[k] = False             # on déjà été barrés dans les tours précédents
        i = i+1
    # Pour chaque indice i :
    # si L[k] = True -> k est premier
    # Si L[k] = False -> k n'est pas premier
    return [ k for k in range(len(L)) if L[k] == True]






################
##            ##
## Exercice 4 ##
##            ##
################
print("\nExercice 4\n")



def unique(x,L):
    déjà_trouvé = False
    for e in L:
        if e==x and déjà_trouvé:
            return False
        elif e==x:
            déjà_trouvé = True
    return déjà_trouvé

def est_permutation(L):
    n=len(L)
    for e in L:
        if not( 0<=e and e<n and unique(e,L)):
            return False
    return True


def est_permutation(L):
    for i in range(len(L)):
        if i not in L: # if not(i in L):
            return False
    return True



def est_permutation(L):
    n = len(L)
    # Pour l'instant on en a trouvé aucun
    trouvés = [False]*n
    for e in L:
        if not(0<=e and e<n):
            return False
        elif trouvés[e]: # si on l'a déjà rencontré
            return False
        else:
            trouvés[e]=True
    return True







################
##            ##
## Exercice 5 ##
##            ##
################
print("\nExercice 5\n")


## Question 5.1

from random import shuffle

def liste_vers_chaîne(L):
    s=""
    for e in L:
        s = s+e
    return s

def mélange(mot):
    n=len(mot)
    if  n<=2: # si le mot est très court, rien à faire !
        return mot
    else:
        centre=list(mot[1:n-1]) # On aurait pu créer la liste avec une boucle
        shuffle(centre) # on mélange
        return  mot[0] + liste_vers_chaîne(centre) + mot[n-1]


## Question 5.2

def liste_des_mots(m):
    ponctuation= " :,.;!?'"
    liste_mots = []
    mot_en_cours = ''
    for c in m:
        if c in ponctuation:
            # Si deux ponctuations se suivent on n'ajoute pas de mot vide.
            if mot_en_cours != '':
                liste_mots.append(mot_en_cours)
            # Dans tous les cas
            liste_mots.append(c)
            mot_en_cours = ''
        else:
            mot_en_cours = mot_en_cours + c
    # On est arrivé à la fin.
    # On ajoute le dernier mot à la liste
    if mot_en_cours != '':
        liste_mots.append(mot_en_cours)
    return liste_mots


## Question 5.3

def mélange_mots(m):
    mots_normaux = liste_des_mots(m)
    mots_mélangés = []
    for mot in mots_normaux:
        mots_mélangés.append(mélange(mot))
    return liste_vers_chaîne(mots_mélangés)

## Question 5.4

texte =  'Tous les êtres humains naissent libres et égaux en dignité et en droits. Ils sont doués de raison et de conscience et doivent agir les uns envers les autres dans un esprit de fraternité.'
print(mélange_mots(texte))
# Et voici l'article deux si vous voulez voir sur un texte un peu plus long.

texte1 = '1. Chacun peut se prévaloir de tous les droits et de toutes les libertés proclamés dans la présente Déclaration, sans distinction aucune, notamment de race, de couleur, de sexe, de langue, de religion, d\'opinion politique ou de toute autre opinion, d\'origine nationale ou sociale, de fortune, de naissance ou de toute autre situation.'
texte2 = '2. De plus, il ne sera fait aucune distinction fondée sur le statut politique, juridique ou international du pays ou du territoire dont une personne est ressortissante, que ce pays ou territoire soit indépendant, sous tutelle, non autonome ou soumis à une limitation quelconque de souveraineté.'
print(mélange_mots(texte1 + '\n' + texte2))





################
##            ##
## Exercice 6 ##
##            ##
################
print("\nExercice 6\n")

## Question 6.1

def effectifs(L):
    Xmin=min(L)
    Xmax=max(L)
    E = [ (i,0) for i in range(Xmin,Xmax+1) ]
    for e in L:
        (ee,xx) = E[e-Xmin] # ee=e
        E[e-Xmin] = (ee,xx+1)
    return E


L = [10,5,5,10,7,10,10,5]

## Question 6.3


# À mettre au début du fichier
from random import randint

def hasard(n):
    i=0
    for j in range(n):
        i = i + randint(0,1)
    return i

## Question 6.4

L = [ hasard(1000) for i in range(10000) ]

import tkinter as tk
from math import *



## Question 6.2

Titre = "Afficheur statistique"
Hauteur = 500
Largeur = Hauteur
marge=Hauteur/10
root = tk.Tk()
root.title(Titre)
Dessin = tk.Canvas(root,height=Hauteur,width=Largeur,bg="white")
Dessin.pack()
# Quelques variables globales
eff=effectifs(L)
Xmin=eff[0][0]
Xmax=eff[-1][0]
Ymax=max([y for (x,y) in eff])
Δx = (Largeur-2*marge)/(Xmax-Xmin+1)
Δy = (Hauteur-2*marge)/Ymax

def convertir_coordonnée(x,y):
    X = marge+x*Δx
    Y = Hauteur  - (marge+y*Δy)
    return (X,Y)

def afficher_rectangle(i,j):
    p=convertir_coordonnée(i,0)
    q=convertir_coordonnée(i+1,j)
    Dessin.create_rectangle(p,q,fill="#9999FF")

for x in range(Xmin,Xmax+1):
    (i,j)=eff[x-Xmin]
    afficher_rectangle(i-Xmin,j)

root.mainloop()
