Partage
  • Partager sur Facebook
  • Partager sur Twitter

[ERREUR] France IoI - Département d'architecture

Construction d'une pyramide

Sujet résolu
18 octobre 2019 à 15:47:51

Bonjour,

Je bloque depuis 1h30 sur un exercice sur France IoI, où je me forme à Java depuis une semaine. J'ai abordé ce matin même la notion de boucle avec while, et ce n'est pas une mince affaire.

Voici l'intitulé de l'exercice :

Les habitants adorent les constructions en forme de pyramide ; de nombreux bâtiments officiels ont d'ailleurs cette forme. Pour fêter les 150 ans de la construction de la ville, le gouverneur a demandé la construction d'une grande et majestueuse pyramide à l'entrée de la ville. Malheureusement, en ces périodes de rigueur budgétaire, il y a peu d'argent pour ce projet. Les architectes souhaitent cependant construire la plus grande pyramide possible étant donné le budget prévu.

Trois exemples de pyramides, de hauteur 1, 2 et 3

Ce que doit faire votre programme :

Votre programme doit d'abord lire un entier : le nombre maximum de pierres dont pourra être composée la pyramide. Il devra ensuite calculer et afficher un entier : la hauteur de la plus grande pyramide qui pourra être construite, ainsi que le nombre de pierres qui sera nécessaire.

Exemples

Exemple 1

entrée :

20

sortie :

3
14

Exemple 2

entrée :

26042

sortie :

42
25585

 Au niveau de la compréhension, ça va. Je dois calculer la hauteur maximale et le nombre de pierres à utiliser par rapport à un nombre de pierres données. Si mon nombre de pierres dépasse, le niveau n'est pas entier et ne compte pas. Le nombre de pierres à utiliser ne peut donc être que inférieur ou égal au nombre de pierres maximal. Je sais qu'à chaque niveau, la largeur du niveau prend +1

J'ai donc réussi à coder ceci :

import algorea.Scanner;

class Main {

   static Scanner input = new Scanner(System.in);
   
   public static void main (String[] args) {
   
      int maxPierres = input.nextInt();
      int nbPierres = 0;
      int hauteur = 0;
      
      while ((nbPierres + (hauteur+1*hauteur+1)) <= maxPierres) {

         hauteur += 1;

         nbPierres += (hauteur * hauteur);
      }
      
      System.out.println(hauteur);
      System.out.println(nbPierres);
   
   }

}

 Cependant, les résultats aux différentes séries de tests ne passent, dans le meilleur des cas j'ai 36% de tests réussis, et je ne comprends pas où j'ai faux. Je ne comprends même pas pourquoi certains tests sont OK et d'autres pas :/

Si vous aviez une piste à me donner, je serais preneuse, j'aimerai finir ma semaine sur un exercice validé :D

Cordialement,

-
Edité par HappyBadger 18 octobre 2019 à 15:48:15

  • Partager sur Facebook
  • Partager sur Twitter

"Ce sont nos choix qui montrent qui nous sommes, bien plus que nos aptitudes"

Albus Dumbledore

Potterhead forever, proud Hufflepuff

21 octobre 2019 à 8:28:29

Vraiment personne pour me renseigner, me guider, me donner une piste ? :(

EDIT :

Bonjour,

A force de tourner en rond et de tester, j'ai fini par trouver la ligne qui me manquait !!!

Sans donner la solution complète, voici comment se déroule le code :

On part d'une valeur de pierres max que l'on va nous donner.

Par défaut, on initie notre notre de pierre de départ et notre niveau de départ à 1

Afin d'éviter les erreurs dans les tests, on met une première condition : si le nombre de pierres proposé est 0, on repasse nos variables pierres et hauteur à 0, évidemment :)

Ensuite, c'est comme aux échecs, il faut toujours prévoir un coup d'avance !

Donc si le niveau suivant est inférieur ou égal au nombre de pierre max et tant que le niveau suivant est inférieur ou égal au nombre de pierres max, on incrémente nos niveaux et on recalcule notre nombre de pierre :)

J'ai donc mis 3 jours et 64 soumissions à tourner autour de la solution xD

Bon courage à vous !

-
Edité par HappyBadger 21 octobre 2019 à 9:29:41

  • Partager sur Facebook
  • Partager sur Twitter

"Ce sont nos choix qui montrent qui nous sommes, bien plus que nos aptitudes"

Albus Dumbledore

Potterhead forever, proud Hufflepuff

8 novembre 2019 à 23:44:32

slt, je suis vraiment en galère il me reste plus qu'un teste à valider et je ne comprend pas ce qui ne va pas ds mon programme

pierremax=int(input())

nombrepierre=1

hauteur=1

if pierremax<=nombrepierre:

   nombrepierre=0

   hauteur=0

if nombrepierre<pierremax:

   while nombrepierre+(hauteur*hauteur)<pierremax:

      hauteur=hauteur+1

      nombrepierre=nombrepierre+(hauteur*hauteur)

print(hauteur)

print(nombrepierre)

peut-tu me dire ceux qu'il faut modifier stp

  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2019 à 1:05:09

nova-astra a écrit:

slt, je suis vraiment en galère il me reste plus qu'un teste à valider et je ne comprend pas ce qui ne va pas ds mon programme

Peut-être parce que c'est du très mauvais code Java ;p

Sinon, on m'a toujours dit de commencer avec un crayon et une feuille.

Fais tourner ton algo à la main déjà, avec pierreMax = 0, pierreMax = 1, pierreMax = 2. etc... ;)

  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2019 à 8:48:25

pas bon

nbPierres += (hauteur * hauteur);
  • Partager sur Facebook
  • Partager sur Twitter
17 novembre 2019 à 19:18:26

MilenAtanasov a écrit:

pas bon

nbPierres += (hauteur * hauteur)

Je n arrive pas à voir où est le problème est ce que c t’es pour cela que le programme marche pas ?
  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2019 à 5:00:14

Si ça peut t'aider, le nombre de pierres nécessaires pour une pyramide de taille n est Σ(0,n) n2.

n=0 --> 0

n=1 --> 1 (0+1)

n=2 --> 5 (0+1+4)

n=3 --> 14 (0+1+4+9)

n=4 --> 30 (0+1+4+9+16)

...etc...

Donc pour un nombre de pierres données, tu peux par exemple boucler sur cette formule tant que ça ne dépasse pas le nombre de pierres.

Si par exemple on te donne 28 pierres, tu peux faire le rang 1 (1), le rang 2 (4+1=5), le rang 3 (9+4+1=14), mais pas le rang 4 (30>28) qui génère donc la sortie de la boucle.

Bon courage

PS: +10.000 pour le combo papier/crayon

  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2019 à 7:31:25

ClaireAmarine a écrit:

MilenAtanasov a écrit:

pas bon

nbPierres += (hauteur * hauteur)


Je n arrive pas à voir où est le problème est ce que c t’es pour cela que le programme marche pas ?


Non, pour le programme (le premier posté) de l'auteur du sujet, l'algo est bon et fonctionne en fait. Il a fait une erreur dans la condition de sa boucle:

hauteur+1*hauteur+1

est faux. Il a oublié la priorité des calculs (multiplication avant addition) donc il calcul 2 hauteur + 1 au lieu du carré de la hauteur.

C'est vraiment le genre de petite erreur qu'on peut facilement loupé (je ne l'avais pas vu la 1ère fois) parce qu'en lisant en diagonale, on pense tous au carré de la hauteur.

Pour celui en python, c'est bien l'algo qui est faux (ou mal implémenté) au niveau de la boucle.

  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2019 à 10:29:15

Pas lu le code en détails, mais en effet le 

(hauteur+1*hauteur+1)

ne peut pas fonctionner.

  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2019 à 10:53:02

"Le bloc d’instruction, placé entre accolades juste après le while, sera exécuté tant que la condition est vraie" (http://www.gecif.net/articles/linux/pdf/boucle_while.pdf)

La programme vais executer While 1 fois en plus. Pour cette raison :

La réponse donnée par votre programme est incorrecte. Il a affiché :

4
30

au lieu de :

3
14

Tu peux utiliser :

while (arreterLaBoucle == 0) {

   // ton code ici

   if (nbPierres > maxPierres) {

      arreterLaBoucle = 1;
      // rétraction ici

   };

};

Le resultat :

Test 1 Succès

Exécuté en 0 seconde.

100 %
Test 2 Succès

Exécuté en 0 seconde.

100 %
Test 3 Succès

Exécuté en 0 seconde.

100 %
Test 4 Succès

Exécuté en 0 seconde.

100 %
Test 5 Succès

Exécuté en 0 seconde.

100 %
Test 6 Succès

Exécuté en 0 seconde.

100 %
Test 7 Succès

Exécuté en 0 seconde.

100 %
Test 8 Succès

Exécuté en 0 seconde.

100 %
Test 9 Succès

Exécuté en 0 seconde.

100 %
Test 10 Succès

Exécuté en 0 seconde.

100 %
Test 11 Succès

Exécuté en 0 seconde.

100 %
Test 12 Succès

Exécuté en 0 seconde.

100 %
Test 13 Succès

Exécuté en 0 seconde.

100 %
Test 14 Succès

Exécuté en 0 seconde.

100 %
 
TOTAL Succès Félicitations, vous avez résolu ce problème ! 100 %

-
Edité par MilenAtanasov 18 novembre 2019 à 10:58:12

  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2019 à 20:25:23


KoaTao a écrit:

ClaireAmarine a écrit:

MilenAtanasov a écrit:

pas bon

nbPierres += (hauteur * hauteur)


Je n arrive pas à voir où est le problème est ce que c t’es pour cela que le programme marche pas ?


Non, pour le programme (le premier posté) de l'auteur du sujet, l'algo est bon et fonctionne en fait. Il a fait une erreur dans la condition de sa boucle:

hauteur+1*hauteur+1

est faux. Il a oublié la priorité des calculs (multiplication avant addition) donc il calcul 2 hauteur + 1 au lieu du carré de la hauteur.

C'est vraiment le genre de petite erreur qu'on peut facilement loupé (je ne l'avais pas vu la 1ère fois) parce qu'en lisant en diagonale, on pense tous au carré de la hauteur.

Pour celui en python, c'est bien l'algo qui est faux (ou mal implémenté) au niveau de la boucle.

Merci

Mais du coup pour le python j arrive pas à trouver la solution 🤨

j ai essayé plusieurs solutions mais rien ne change je n arrive passé voir où se trouve le problème 

déplus sur le site france ioi ils mettent 13 tests sur 14 sont validés





  • Partager sur Facebook
  • Partager sur Twitter
19 novembre 2019 à 15:55:11

Quel est ton pseudo sur France IOI ?
  • Partager sur Facebook
  • Partager sur Twitter

"Ce sont nos choix qui montrent qui nous sommes, bien plus que nos aptitudes"

Albus Dumbledore

Potterhead forever, proud Hufflepuff

20 novembre 2019 à 15:57:21 - Message modéré pour le motif suivant : Message complètement hors sujet


20 novembre 2019 à 17:26:53

Bonjour, par principe, est-ce possible d'arrêter de poser des questions dont le sujet est en résolu ? ca fait qu'en général les gents ne viennent plus dessus.

De plus, pour une question en python, il faudrait surtout aller sur le salon dédié à ce langage.

  • Partager sur Facebook
  • Partager sur Twitter
20 novembre 2019 à 17:34:58

Tiffado a écrit:

Bonjour, par principe, est-ce possible d'arrêter de poser des questions dont le sujet est en résolu ? ca fait qu'en général les gents ne viennent plus dessus.

De plus, pour une question en python, il faudrait surtout aller sur le salon dédié à ce langage


Je  l ai fait 

j ai créer un autre sujet 

  • Partager sur Facebook
  • Partager sur Twitter
21 novembre 2019 à 13:08:43

HappyBadger a écrit:

Quel est ton pseudo sur France IOI ?


Non, parce que tu vais voir les solutions et les copier-coller :)
  • Partager sur Facebook
  • Partager sur Twitter
26 novembre 2019 à 8:39:16

MilenAtanasov a écrit:

HappyBadger a écrit:

Quel est ton pseudo sur France IOI ?


Non, parce que tu vais voir les solutions et les copier-coller :)


Je fais quoi ?
  • Partager sur Facebook
  • Partager sur Twitter

"Ce sont nos choix qui montrent qui nous sommes, bien plus que nos aptitudes"

Albus Dumbledore

Potterhead forever, proud Hufflepuff