Défi d'algorithmie : Je ne trouves pas mon erreur

Résolu/Fermé
Captainbleu Messages postés 6 Date d'inscription dimanche 12 juin 2022 Statut Membre Dernière intervention 15 juin 2022 - Modifié le 12 juin 2022 à 13:45
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 - 12 juin 2022 à 17:56
Bonjour,
J'apprends python grâce à la pratique et je suis tombé sur ce défi :



Une B2-suite est une suite d'entiers strictement croissante telle qu'il n'existe pas deux couples de termes (un couple peut être formé du même terme utilisé deux fois) qui donnent la même somme.

Dans la suite, nous nous intéressons à des B2-Suites particulières construites de manière incrémentale à partir de 4 premiers termes arbitraires. Pour construire ces suites, on choisira systématiquement d'ajouter le terme le plus petit possible qui satisfait les propriétés des B2-Suites.

Par exemple, si le début de la suite est 1,3,6,7, le terme suivant sera nécessairement 14. En effet :

ça ne peut pas être 8 (car 8+1=9 et 6+3 vaut déjà 9)
ça ne peut pas être 9 (car 9+1=10 et 3+7 vaut déjà 10)
ça ne peut pas être 10 (car 10+3=13 et 7+6 vaut déjà 13)
ça ne peut pas être 11 (car 11+1=12 et 6+6 vaut déjà 12)
ça ne peut pas être 12 (car 12+1=13 et 7+6 vaut déjà 13)
ça ne peut pas être 13 (car 13+1=14 et 7+7 vaut déjà 14)
ça peut être 14
On choisira donc U(4)=14

En procédant de même pour calculer U(5), on trouve : U(5)=23 puis U(6)=33.

Pour ce défi n=18 et les quatre premiers termes sont 1, 17, 31, 41. Vous devez répondre en donnant d'une part la valeur du terme U(n) et d'autre part la somme de tous les termes de U(0) à U(n) inclus.




Le programme que j'ai réalisé pour trouver la réponse :

tab = [1, 17, 31, 41]
somme = [18, 32, 42, 48, 58, 72]
for k in range (15):
  x=tab[-1]+1
  n=0
  while n<len(tab) and len(tab)==k+4:
    if not x+tab[n] in somme and n==(len(tab)-1):
      tab.append(x)
      for i in range (k+4):
        somme.append(x+tab[i])
    elif not x+tab[n] in somme:
      n=n+1
    else:
      n=0
      x=x+1


Grâce à ce code, je trouve U(18)=371 et que la somme de tous les termes, elle fait 2366. Mais le site me dit que ce n'est pas la bonne réponse, pouvez-vous m'aider s'il vous plaît.
Cordialement.


PS : Si vous voulez tester votre réponse avant de répondre, c'est possible ici : https://pydefis.callicode.fr/defis/B2Suites/txt

2 réponses

Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
12 juin 2022 à 13:53
Bonjour

je n'ai pas encore cherché à comprendre ton code, mais ce qui m'interpelle de suite c'est que tu figes les choses.

A ta place j'aurais fait un code qui demande la suite de départ, afin de vérifier qu'avec la suite exemple de l'énoncé il donne le bon résultat.
0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
12 juin 2022 à 13:57
Dans le même esprit tu figes la liste somme de départ, or dans l'énoncé il est écrit
un couple peut être formé du même terme utilisé deux fois
dans ta liste de départs il manque toutes les sommes formées par le même terme utilisé 2 fois.

A ta place, je commencerai par écrire une fonction qui calcule toutes les sommes d'une suite donnée.
0
Captainbleu Messages postés 6 Date d'inscription dimanche 12 juin 2022 Statut Membre Dernière intervention 15 juin 2022 > Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024
12 juin 2022 à 17:06
Merci, j'avais effectivement mal lu l'énoncé au niveau des sommes, qui marchait aussi en *2, j'ai changé le programme et j'ai tout de suite eu bon.
0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931 > Captainbleu Messages postés 6 Date d'inscription dimanche 12 juin 2022 Statut Membre Dernière intervention 15 juin 2022
12 juin 2022 à 17:56
de rien
0
jee pee Messages postés 39657 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 28 avril 2024 9 238
12 juin 2022 à 15:08
Bonjour,

Comme Whismeril, il te faut en entrée les 2 données n : 18 tab : [1, 17, 31, 41]. Le n va être l'indice de boucle. Puis le programme doit calculer les sommes, pas les mettre en dur.

Et avant de t'attaquer au défi, tu as un exemple résolu, tu devrais déjà essayer de le reproduire :
n = 6 tab = (1,3,6,7) et attendu 1, 3, 6, 7, 14, 23, 33 ===> 33,87

0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
12 juin 2022 à 15:18
Hello, moi j'ai 47, pas 87
0
jee pee Messages postés 39657 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 28 avril 2024 9 238 > Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024
12 juin 2022 à 15:30
Ton programme n'est pas bon ;-)

print(sum((1, 3, 6, 7, 14, 23, 33)))
87
0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931 > jee pee Messages postés 39657 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 28 avril 2024
12 juin 2022 à 15:39
Haaa, 87, c'était la somme des termes, j'ai cru que c'était le terme suivant ;) !
0