Imprimer
Catégorie : Programmation Python - 2nde SNT
Affichages : 13691

Objectif

Prendre en main python et comprendre les affectations, les boucles et les listes. Pour prendre connaissance du problème voir ici Wikipedia - Echiquier de Sissa

Présentation de l'histoire: 

En Inde, le roi, qui s'ennuie à la cour demande qu'on lui invente un jeu pour le distraire. Le sage Sissa invente alors un jeu d'échecs, ce qui ravit le roi. Pour remercier Sissa, le roi lui demande de choisir sa récompense. Il choisit de demander au roi de prendre le plateau du jeu et sur la première case poser 1 grain de riz ensuite 2 sur la deuxième puis 4 sur la troisième et ainsi de suite en doublant à chaque fois le nombre de grains de riz que l’on met.

L'IDE utilisé est Thonny


Scripts à tester

Etape 1 - Affectation des variables et boucle bornée

Saisir les quelques lignes du programme suivant puis lancez le!

Etape 1 - Script

valeur=1
print("Valeur =" ,valeur)

liste=[]
print("Ceci est une liste vide", liste)

liste=[1,2,"3emeterme"]
print("Voici les termes de la liste",liste)
liste.append("ajout dans liste")
liste.append(5)
print("Voici les termes de la liste",liste)

for c in range(3):
    print (c)

#commentaire: le print du dessus est dans la boucle for
# celui du dessous ne l'est pas !

print("Dernière valeur de c=",c)

Etape 1 - Exécution et analyse

>>> %Run test.py
Valeur = 1
Ceci est une liste vide []
Voici les termes de la liste [1, 2, '3emeterme']
Voici les termes de la liste [1, 2, '3emeterme', 'ajout dans liste', 5]
0
1
2
Dernière valeur de c= 2

Je pense avoir tout compris ;) donc je continue...

Etape 2 - Comptons le nombre de grains par case

Etape 2 - Script à copier puis exécuter.

Vous noterez que la première valeur de la liste est gérée avant la boucle. Donc le for boucle de 0 à 63-1 soit 63 valeurs de 0 à 62. Si on ajoute la valeur avant la boucle nous avons bien un jeu d'échec à 64 cases!

#nbre de grains par case
ngrain=1
liste=[ngrain]
for c in range(63):
    ngrain=ngrain*2
    liste.append(ngrain)
print(liste)
print(liste[0])
print(liste[1])
print("...")
print(liste[63])

 

Etape 2 - Exécution et analyse

>>> %Run test1.py
[1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, 1125899906842624, 2251799813685248, 4503599627370496, 9007199254740992, 18014398509481984, 36028797018963968, 72057594037927936, 144115188075855872, 288230376151711744, 576460752303423488, 1152921504606846976, 2305843009213693952, 4611686018427387904, 9223372036854775808]
1
2
...
9223372036854775808

Etape 3 - Améliorations pour le script définitif

J'aimerai visualiser un affichage du type
case n° 1 - 1 grains
case n° 2 - 2 grains
etc...

et aussi visualiser la somme de tous les grains
(Pour la somme, challenge : Ne pas utiliser la fonction sum(liste) - mais cela fonctionne très bien)


Script solution

Vous n'avez pas triché? 

 A copier / coller 

#creation d'une liste de 64 cases avec nbre de grains par case
ngrain=1
liste=[ngrain]
for c in range(63):
    ngrain=ngrain*2
    liste.append(ngrain)

#affichage des valeurs case par case donc avec une boucle
total=0
for i in range(64):
    total=total+liste[i]
    print("Case n° ",i+1," - Nbre de grains =",liste[i])

#affichage du toral
print("Au total cela représente ",total," grains de riz")

Exécution

>>> %Run test1.py
Case n°  1  - Nbre de grains = 1
Case n°  2  - Nbre de grains = 2
Case n°  3  - Nbre de grains = 4
Case n°  4  - Nbre de grains = 8
Case n°  5  - Nbre de grains = 16
Case n°  6  - Nbre de grains = 32
Case n°  7  - Nbre de grains = 64
Case n°  8  - Nbre de grains = 128
Case n°  9  - Nbre de grains = 256
Case n°  10  - Nbre de grains = 512
Case n°  11  - Nbre de grains = 1024
Case n°  12  - Nbre de grains = 2048
Case n°  13  - Nbre de grains = 4096
...
...
...
Case n°  58  - Nbre de grains = 144115188075855872
Case n°  59  - Nbre de grains = 288230376151711744
Case n°  60  - Nbre de grains = 576460752303423488
Case n°  61  - Nbre de grains = 1152921504606846976
Case n°  62  - Nbre de grains = 2305843009213693952
Case n°  63  - Nbre de grains = 4611686018427387904
Case n°  64  - Nbre de grains = 9223372036854775808
Au total cela représente  18446744073709551615  grains de riz