from random import randrange #Q1 def creerListeMorte(n) : return [0]*n #Q2 def remplir_liste(): n=int(input("saisir la taille de la liste entre 10 et 1000:")) while n<10 or n>1000: n=int(input("Attention la taille de la liste est entre 10 et 1000:")) L=creerListeMorte(n) m=int(input("saisir le nombre de cases vivantes entre 1 et "+str(n-1)+":")) while m<1 or m>n-1: m=int(input("Attention le nombre de cases vivantes est entre 1 et "+str(n-1)+":")) #On génère m cases vivantes for i in range(m): #générer un indice aléatoire j entre 0 et n-1 pour une seule case vivante j=randrange(n) #rendre la case vivante L[j]=1 return L #Q3 def afficherListe(L): for i in L: if i==0:print('# ',end='') else:print('* ',end='') print()#retour à la ligne #Q4 def nombreVivantes(L): # soltion 1 return sum(L) # soltion 2 s=0 for i in L: s+=i return s # soltion 3 s=0 for i in L: if i==1:s+=i return s #sa complexité en notation O #si n représente la taille de la liste alors la compléxité est : O(n) #car le parcours complet de la liste est fait une seule fois avec un nombre d'opérations constant à chaque itération #Q5 def voisinDroite(L, posCase): n=len(L) # soltion 1 return (posCase+1)%n # soltion 2 if posCase==n-1:return 0 else:return posCase+1 #Q6 def voisinGauche(L,posCase): n=len(L) # soltion 1 return (posCase-1)%n # soltion 2 if posCase==0:return n-1 else:return posCase-1 #Q7 def NobreVoisinVivants(L, posCase): #indice du voisin droite de la case numéro posCase voisin_droite=voisinDroite(L,posCase) #indice du voisin gauche de la case numéro posCase voisin_gauche=voisinGauche(L,posCase) #indice du voisin droite de la case numéro voisin_droite voisin_voisin_droite=voisinDroite(L,voisin_droite) #indice du voisin gauche de la case numéro voisin_gauche voisin_voisin_gauche=voisinGauche(L,voisin_gauche) #calculer la somme des cases vivantes dans ces indices return L[voisin_droite]+L[voisin_gauche]+L[voisin_voisin_droite]+L[voisin_voisin_gauche] #Q8 def Evolution(L0,n): m=len(L0)#O(1) for k in range(n): for i in range(m): #calculer le nombre de cases voisines vivantes de la case i à l'itération k nbr_voisines_vivantes=NobreVoisinVivants(L0, i)#O(1) #Si la case i possède exactement 2 voisines vivantes if nbr_voisines_vivantes==2: L0[i]=1#elle sera vivante #Sinon si la case i possède moins d’une ou plus de 2 voisines vivantes à l’itération k elif nbr_voisines_vivantes<1 or nbr_voisines_vivantes>2: L0[i]=0#elle sera morte #else:=>Si la case i possède exactement 1 voisine vivante à l’itération k #=>rien à faire car elle garde le même état #Q9 #Si la liste L0 est de taille m, donner la complexité en notation O #le bloc interne de la boucle for i est de compléxité O(1) #ce qui veut dire que la compléxité de cette boucle for i est : O(m) #=>finalement la boucle for k qui compte n itération sera de compléxité n*O(m)=O(n*m) #ainsi, la fonction Evolution(L0,n) est de complexité O(n*m)+O(1)=O(n*m) #Q9 def testPopulation(): L=remplir_liste() print("la liste initiale est:") afficherListe(L) Evolution(L,100000) print("Après Evolution,la liste est:") afficherListe(L) testPopulation()