l1 = [n for nin range(2, 1001)]
l2 = [(n, [d for din range(1, n+1) if n % d == 0]) for nin l1]
l3 = [c[0] for cin l2 if len(c[1]) == 2]
Exercice 6. Amnistie à la prison de Sikinia
On choisit de représenter les cellules par une liste de booléens traduisant l’ouverture ou non de la porte. Au début de
l’histoire toutes les portes sont fermées dont on définit :
cellules = [False for kin range(100)]
On suit les directives du président (on fera attention au fait que les éléments d’une liste Python sont indexées de 0 à 99
alors que dans l’énoncé les cellules sont indexées entre 1 et 100) :
for iin range(100):
for jin range(i, 100, i+1):
cellules[j] = not cellules[j]
Une fois le processus achevé, il reste à passer en revue les différentes cellules en notant celles qui sont ouvertes :
ouvertes = []
for iin range(100):
if cellules[i]:
ouvertes.append(i+1)
print(ouvertes)
On obtient la liste :
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
qui laisse présager que dans le cas général ce sont les
cellules dont le numéro est un carré parfait qui sont ouvertes.
Exercice 7. Permutations de Josephus
Une solution possible ; la méthode
pop(k)
retourne et supprime dans le même temps un élément décrit par son indice
dans une liste.
def josephus(n, m):
lst = list(range(1, n+1))
sol = []
k=0
for iin range(n):
k = (k −1+m)%len(lst)
sol.append(lst.pop(k))
return sol
Exercice 8. Génération de permutations
Le calcul repose sur l’observation suivante : les 9! premières permutations débutent par le chiffre 0, les 9! suivantes par 1,
etc. Autrement dit, la nepermutation commence par le chiffre k=jn
9!k.
On procède ensuite récursivement en déterminant la permutation de rang (n−k·9!) de l’ensemble {0,1,...,9}\{k}.
def fact(n):
s=1
for kin range(1, n+1):
s*= k
return s
def permutation(n):
sol = []
lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for iin range(9, 0, −1):
k = n // fact(i)
n−= k *fact(i)
sol.append(lst.pop(k))
return sol
>>> permutation(999999)
[2, 7, 8, 3, 9, 1, 5, 4, 6, 0]
page 4