import matplotlib.pyplot as plt
import random
import math

# =============================================
# TRI RAPIDE (Quicksort)
# =============================================

def Separation(L, k):
    """Renvoie trois listes : < k | == k | > k"""
    L1 = []   # plus petits
    L2 = []   # égaux
    L3 = []   # plus grands
    
    for x in L:
        if x < k:
            L1.append(x)
        elif x == k:
            L2.append(x)
        else:
            L3.append(x)
    return L1, L2, L3


def quicksort(L):
    """Tri rapide récursif"""
    if len(L) <= 1:
        return L
    
    # Choix du pivot (ici le premier élément - simple)
    pivot = L[0]
    
    L1, L2, L3 = Separation(L, pivot)
    
    # Appel récursif + concaténation
    return quicksort(L1) + L2 + quicksort(L3)


# Test sur l'exemple donné
L_exemple = [8, 3, 9, 6, 5]
print("Liste initiale :", L_exemple)
print("Liste triée    :", quicksort(L_exemple))


# =============================================
# Variables aléatoires - Pile ou Face
# =============================================

def partie(g, p, n):
    """Renvoie la liste des gains cumulés après n parties"""
    gains = [0]          # gain initial = 0
    gain_actuel = 0
    
    for i in range(n):
        if random.randint(0, 1) == 1:   # gagne
            gain_actuel += g
        else:                           # perd
            gain_actuel -= p
        gains.append(gain_actuel)
    
    return gains


# Tracé de plusieurs parties
plt.figure(figsize=(10, 6))

for i in range(5):
    evolution = partie(g=10, p=5, n=200)
    plt.plot(evolution, label=f"Partie {i+1}")

plt.grid()
plt.xlabel("Nombre de parties")
plt.ylabel("Gain cumulé (€)")
plt.title("Évolution des gains au pile ou face")
plt.legend()
plt.show()


# =============================================
# Nombres complexes - Jeu du Chaos
# =============================================

def chaos(S, n):
    """Jeu du chaos sur un polygone (triangle ou pentagone)"""
    points = []
    
    # Point de départ aléatoire à l'intérieur
    A, B, C = S[0], S[1], S[2]
    p = random.random()
    q = random.random()
    r = random.random()
    M = (p*A + q*B + r*C) / (p + q + r)
    points.append(M)
    
    # Construction de la suite
    for _ in range(n):
        sommet = random.choice(S)           # choix aléatoire d'un sommet
        M = (M + sommet) / 2
        points.append(M)
    
    return points


# Triangle équilatéral
triangle = [0, 2, 1 + math.sqrt(3)*1j]

resultat = chaos(triangle, 15000)

X = [z.real for z in resultat]
Y = [z.imag for z in resultat]

plt.figure(figsize=(8,8))
plt.scatter(X, Y, s=0.3, color='blue', alpha=0.7)   # scatter recommandé
plt.axis("equal")
plt.axis("off")
plt.title("Jeu du Chaos - Triangle (15000 points)")
plt.show()


# Pentagone régulier
def creer_pentagone():
    P = []
    for k in range(5):
        theta = k * 2 * math.pi / 5 - math.pi/2   # orientation agréable
        P.append(complex(math.cos(theta), math.sin(theta)))
    return P


resultat5 = chaos(creer_pentagone(), 20000)

X5 = [z.real for z in resultat5]
Y5 = [z.imag for z in resultat5]

plt.figure(figsize=(8,8))
plt.scatter(X5, Y5, s=0.3, color='darkred', alpha=0.7)
plt.axis("equal")
plt.axis("off")
plt.title("Jeu du Chaos - Pentagone régulier")
plt.show()

