24-NSIJ2ME3-2

  1. def produire_jeu(n):
        resultat = Pile()
        for i in range(n):
            resultat.empile(n - i)
        return resultat
    
  2. def scinder_jeu(p, n):
        m1 = Pile()
        m2 = Pile()
        for i in range(n // 2):
            m1.empile(p.depile())
        for i in range(n // 2):
            m2.empile(p.depile())
        return m1, m2
    
  3. def recombiner(m1, m2):
        jeu = Pile()
        while not m1.est_vide():
            jeu.empile(m1.depile())
            jeu.empile(m2.depile())
        return jeu
    
  4. def faro(jeu, n):
        m1, m2 = scinder_jeu(jeu, n)
        return recombiner(m1, m2)
    
  5. # piles différentes, mais de même taille
    p1 = Pile()
    p2 = Pile()
    p1.empiler(1)
    p2.empiler(2)
    assert not identiques(p1, p2)
    
    # piles identiques
    p1 = Pile()
    p2 = Pile()
    p1.empiler(1)
    p2.empiler(1)
    assert identiques(p1, p2)
    
  6. def ordre_faro(n: int) -> int:
        jeu_initial = produire_jeu(n)
        jeu_courant = faro(produire_jeu(n), n)
        nb_melanges = 1
        while not identiques(jeu_courant, jeu_initial):
            jeu_courant = faro(jeu_courant, n)
            nb_melanges += 1
        return nb_melanges