Bonjour à tous et toutes, Je suis bloquer à un exercice France IOI.
L'objectif est de construire une tour à l'aide de petits cubes en bois, sachant que la forme de cette tour consiste en un ensemble de grands cubes placés les uns au-dessus des autres. La base de la tour est un cube de taille 17×17×17, c'est-à-dire composé de 17×17×17 = 4 913 petits cubes. Sur ce cube est posé un autre cube de taille 15×15×15. Au-dessus de ce dernier se trouve un cube de 13×13×13. La tour continue ainsi jusqu'à atteindre le sommet, qui consiste en un cube de taille 1×1×1.
Pour moi le code devrait faire ça :
cube = 1
for loop in range(8):
resultat = cube ** 3
cube = cube + 2
print (resultat)
Oui, mais quel est le but de l'énoncé?? Faut-il calculer la somme de tous les carrés qui vont constituer la pyramide? Faut-il faire une représentation simplifiée de cette pyramide dans la console?
Oui, mais quel est le but de l'énoncé?? Faut-il calculer la somme de tous les carrés qui vont constituer la pyramide? Faut-il faire une représentation simplifiée de cette pyramide dans la console?
- Edité par Olygrim il y a une minute
Le but est de trouver combien de cube il faut pour faire la pyramide
Ok. Donc il faut changer quelques petites choses dans ton code.
La première chose à savoir, c'est que la boucle for permet d'itérer directement sur l'objet associé (ici ton range(8)). Ensuite, la fonction range() peut recevoir 3 arguments: la valeur de début, la valeur de fin (non incluse) et le pas entre 2 valeurs: range(debut, fin, pas). Donc puisqu'on peut itérer sur les valeurs avec for, autant les construire directement avec le range .
In fine, il faut ajouter à chaque itération la valeur des cubes (dans ton code tu ne fais pas de somme, tu ne fais qu'assigner la valeur (ligne 5)).
Les indications en pratique (n'hésite pas à tester ):
for i in range(10):
print(i)
for i in range(2, 8):
print(i)
for i in range(4, 16, 2):
print(i)
somme = 0
for i in range(10):
somme += i
print(somme)
Essaie de refaire ton code avec ses indications et poste-le. Et n'hésite pas à demander si tu ne comprends pas quelque chose où si tu rencontres un problème
Si je te demande de calculer le nombre de cubes non plus pour une base de 17 mais pour une base de 9999. Vas-tu écrire à la main la somme de toutes les puissances?
Pour progresser en programmation il faut pratiquer, pratiquer et encore pratiquer . Python est livré avec un interpréteur donc amuse-toi à faire des tests pour voir comment ça fonctionne.
Par exemple, dans mon message précédent j'ai mis plusieurs petits codes. Les as-tu testés un par un? Si ce n'est pas le cas, je t'invites à le faire et de modifier les valeurs pour voir ce qui se passe (regarder si les bornes sont incluses, mettre deux valeurs identiques, mettre des valeurs négatives, mettre la valeur à 0, ...). Prend le temps d'analyser les résultats et tu verras que ce n'est pas si sorcier que ça
Au départ, tu as tout en haut un cube. Tu définis donc :
nbCube = 1
coté = 1
total = 1
Ensuite, tu dois aller jusqu'à un grand cube composé de 17 petits cubes de côté, et les tailles des grands cubes sont composés de toujours +2 petits cubes. Donc on a 9 grands cubes en tout (de 1, 3, 5, 7, 9, 11, 13, 15, 17 cubes de côté). On ne compte pas le premier cube car on a déjà défini la variable total sur 1. On donne donc :
for loop in range (8):
coté = coté + 2
nbCube = coté*coté*coté
total = total + nbCube
l'algorithmique ne consiste pas uniquement à trouver un algorithme puis à le manipuler pour le rendre meilleur (ou plus performant ou plus rapide ou moins gourmand en ressources ou …). Cela consiste aussi à trouver de meilleurs algorithmes différents dans leurs approches. Là on fait un détour plus mathématique, mais on a aussi simplement la relation \(\sum_{i=0}^{n-1} 2i+1 = n^2(2n^2-1)\) ce qui se traduit très simplement en algo puis en code.
def pyramide(n):
return n**2*(2*n**2-1)
Toutes les approches sont utiles.
First solve the problem. Then, write the code. ~ John Johnson
Bonjours moi aussi je sèche complet la dessus en plus le langage python c'est pas du tout la spécialité qui m'intéresse alors du coup j'ai du mal a me mettre a fond dedans.
Ok. Donc il faut changer quelques petites choses dans ton code.
La première chose à savoir, c'est que la boucle for permet d'itérer directement sur l'objet associé (ici ton range(8)). Ensuite, la fonction range() peut recevoir 3 arguments: la valeur de début, la valeur de fin (non incluse) et le pas entre 2 valeurs: range(debut, fin, pas). Donc puisqu'on peut itérer sur les valeurs avec for, autant les construire directement avec le range .
In fine, il faut ajouter à chaque itération la valeur des cubes (dans ton code tu ne fais pas de somme, tu ne fais qu'assigner la valeur (ligne 5)).
Les indications en pratique (n'hésite pas à tester ):
for i in range(10):
print(i)
for i in range(2, 8):
print(i)
for i in range(4, 16, 2):
print(i)
somme = 0
for i in range(10):
somme += i
print(somme)
Essaie de refaire ton code avec ses indications et poste-le. Et n'hésite pas à demander si tu ne comprends pas quelque chose où si tu rencontres un problème
- Edité par Olygrim 14 décembre 2015 à 15:07:28
Pour répondre a @olygrim
J'ai moi même une question, dans ton message suivant (et le screen qui va avec) tu nous dit ceci :
"La première chose à savoir, c'est que la boucleforpermet d'itérer directement sur l'objet associé (ici tonrange(8)). Ensuite, la fonctionrange()peut recevoir 3 arguments: la valeur de début, la valeur de fin (non incluse) et le pas entre 2 valeurs:range(debut, fin, pas). Donc puisqu'on peut itérer sur les valeurs avecfor, autant les construire directement avec lerange.
In fine, il faut ajouter à chaque itération la valeur des cubes (dans ton code tu ne fais pas de somme, tu ne fais qu'assigner la valeur (ligne 5))."
Ce que tu dit, que la boucle for peut recevoir 3 arguments, et le reste, bah ce n'est pas dit dans les cours directement sur le site, a aucun moment on nous parle d’itérer (d'ailleurs, ça veut dire quoi ce mot? x) ) ou même de mettre plusieurs valeurs, nous on nous apprendre juste la commande de base "for loop in range(x):"
Aurai-tu donc une explication / aide à fournir qui reste dans le cours s'il te plaît ? car la ton explication m'a encore plus perdu que je ne l'était déjà :c et si jamais je me ramène avec plusieurs valeur pour être honnête mon prof va se poser des questions xD
Ce que je vais dire est à prendre avec des pincettes. Ce n'est que le fruit de mon interprétation et mes définitions / explications souffrent sûrement d'approximations.
L'itération est un concept assez fort en python. On peut distinguer deux choses:
L'itération à proprement parler, qui est le fait d'exécuter un ensemble d'instructions un certain nombre de fois
L'itérable, un objet qui à la possibilité de fournir un par un ses éléments.
Une liste, une chaîne de caractères, un tuple, un objet range, un dictionnaire, .... tous ces objets sont des itérables. Comme dit précédemment, ça signifie qu'ils peuvent fournir les éléments qui les compose au fur et à mesure. C'est ce que permet la boucle for:
ma_liste = ["Mais", "où", "et", "donc", "or", "ni", "car"]
for item in ma_liste:
print(item)
Dans cet exemple, item va prendre successivement chacune des valeurs de la liste. Et j'ai exécuté la même opération pour chacun des éléments (l'affichage de l'élément). J'ai donc itéré sur ma liste.
JullOx a écrit:
Ce que tu dit, que la boucle for peut recevoir 3 arguments
Non, je n'ai pas dis ça. Il faut découpler la boucle for (for ... in ...) de l'objet range. ce sont deux choses différentes. L'objet range peut très bien exister en dehors de celle-ci (même si effectivement il est souvent présenté en utilisation avec cette boucle).
Et donc c'est cet objet (le range) qui peut prendre 3 arguments (la valeur de début, la valeur de fin et le pas entre deux valeurs):
r = range(10, 100, 5)
print(r)
range est un itérateur (encore un autre mot , cf doc) c'est-à-dire un objet qui non seulement fournit ses éléments au fur et à mesure (donc c'est un itérable) mais en plus qui a une évaluation paresseuse (donc qui ne garde en mémoire qu'un seul de ses élément à la fois). Mais il me semble que range est un cas particulier d'itérateur (à confirmer).
Bref, c'est pour ça que si tu print le range (comme dans mon code précédent) et bah tu vas pas voir ce qu'il contient. Pour voir ce qu'il contient, il faut soit itérer dessus (donc avec la boucle for qui est LA boucle de l'itération), soit le transformer dans un autre type (== caster). Dans les deux cas, on le force à générer ses éléments:
for i in range(10, 100, 5):
print(i) #'i' va prendre successivement chaque valeur du 'range'
r = list(range(10, 100, 5)) #on force l'évaluation des valeurs
print(r)
Comme je l'ai dit au début, mes définitions sont sûrement approximatives. Donc peut-être qu'un gradé viendra nuancer ou corriger les choses en donner une définition beaucoup plus précise
Olygrim a écrit:
> range est un itérateur (encore un autre mot , cf doc) c'est-à-dire un objet qui non seulement fournit ses éléments au fur et à mesure (donc c'est un itérable) mais en plus qui a une évaluation paresseuse (donc qui ne garde en mémoire qu'un seul de ses élément à la fois). Mais il me semble que range est un cas particulier d'itérateur (à confirmer).
Alors en fait range n'est pas un itérateur mais un itérable (un autre terme présent dans le glossaire).
C'est à dire qu'un nouvel itérateur sera créé à chaque boucle for (ou autre mécanisme d'itération), ce qui permet de la parcourir plusieurs fois, là où un itérateur aurait été entièrement consommé au premier parcours.
Pour illustrer un peu :
>>> numbers = range(10) # numbers est un objet de type range, un itérable
>>> list(numbers) # je peux le convertir en liste, ce qui aura pour effet de le parcourir entièrement
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(numbers) # je peux recommencer l'opération et obtenir le même résultat
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> numbers = iter(range(10)) # numbers est un itérateur sur un range
>>> list(numbers) # je le convertis une fois
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(numbers) # et une deuxième, mais l'itérateur a déjà été consommé
[]
Olygrim a écrit:
> soit le transformer dans un autre type (== caster)
On parle alors plutôt de conversion de type. Le terme de cast n'a généralement pas de sens en Python.
Le cast, c'est quand on change les informations de type d'une valeur sans en changer les données, comme cela peut se faire en C.
En Python on crée un nouvel objet à partir du précédent, les données sont transformées.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Anais Touchard
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique