Index de l'article

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
  • 1 est affecté à la variable valeur
  • liste=[] déclare une liste de nom liste ne contenant aucune valeur
  • le print qui suit affiche cette liste vide donc je ne vois rien entre les [ ]
  • la ligne suivante affecte 3 valeurs à la liste vide
  • la méthode .append appliquée à la variable liste ajoute une 4ème puis une 5ème valeur à cette liste
  • la boucle bornée for c in range (3) affecte dans la variable c  les entiers allant de 0 à 3-1 ;)

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
  • le print(liste) affiche entre [ ] tous les termes de liste
  • les print(liste[?]) affiche les valeurs individuelles de la liste. La première des valeurs de la liste est liste[0] le dernier est bien liste[63]
  • vous noterez la capacité qu'à python de gérer les entiers
  • vous noterez aussi les premières valeurs: 8, 16, 32, 64... comme sur vos clefs usb ;) - Voir la loi de Moore.

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é? 

  • remarquez le total=total+liste[i]
    une petite astuce pour prendre la valeur de total, de lui ajouter une valeur (ici liste[i]) et de mettre le résultat de cette somme dans la variable total. Donc à la boucle suivante, total s'incrémente de liste[i+1]...

 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