Exercice python lycée

Bonjour,

Voici mon exercice que je dois rendre en 1ère spécialité sur du Python, j'ai fais un code que je trouve valide mais il ne marche pas, pourriez vous m'indiquer vos conseils ?

def manhathanMaboul(N,M):
    amismax=0
    amis=0
    for i in range (len(M)):
        for k in range (len(M)):
            if M[i]<=M[k]<=(M[i]+N):
                amis=amis+1
            if amis>amismax:
                amismax=amis
    return amismax


Les indentations ne se marquent pas mais je les ai faites !

modération : Pour la mise en forme des sources, au dessus de la zone d'édition de tes messages, il y a des icones pour les enrichissements du texte. Celle qui a cet aspect
<> ▼
permet d'appliquer aux codes, suivant une liste de valeurs, le format correspondant à sa nature.
Un petit tuto là : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

3 réponses

Résumé de la discussion

L'exercice Python vise à déterminer, pour chaque élément d'une liste N et avec une durée M, combien d'éléments tombent dans l'intervalle [N[i], N[i] + M - 1], puis à renvoyer le maximum de ces comptes. Des erreurs fréquentes concernent l'inversion des rôles de N et M et les bornes; la correction consiste à tester N[i] <= N[k] <= N[i] + M - 1. Des tests types montrent que le maximum de comptes correspond à 3 pour [3,11,1,7,6,12] avec M = 5 et 1 pour [5,6] ou 0 pour [1,2,3,4,4], selon les cas. D'autres ajustements incluent le calcul de l'intervalle avec M - 1 et l'impression finale qui affiche le résultat sans modifier le flux général.

Bobot (l’IA à votre service)
  1. Bonsoir

    CCM, comme tous les sites de code qui se respectent disposent d'un outils pour mettre en forme le code (et donc conserver l'indentation), voir le texte et le lien (à lire attentivement) que jee pee a ajouté à la fin de ton message en le corrigeant.

    Pour ton problème, selon ton énoncé M est un entier, tu ne peux donc ni récupérer sa longueur, ni l'indicer.

    1. Modérateur
      Bonjour,

      On dirait que la réalisation ne respecte déjà pas l'énoncé, intervertissant M et N.

      Franchement j'ai peu d'idée sur la solution ;-)

      Après Yamine, pour que tout le monde soit d'accord sur l'énoncé, et sa solution, quelles réponses apporterais-tu à ces paramètres passés :

      manhathanMaboul(7,[1,2,3,4,4,5,7,9,10,22,23,24])
      manhathanMaboul(1,[1,2,3,4,4,5,7,9,10,22,23,4,24])
      manhathanMaboul(0,[1,2,3,4,4,5,7,9,10,22,23,24,38])
      manhathanMaboul(8,[22,25,26,1,4,7,8,10,141,2,3,4,4,5,7,9,10,22,23,24,67,27])
    2. Bonjour, merci beaucoup j'avais juste inversé N et M, mais il ne marche toujours pas malheureusement...
    3. @jee peeBonjour, je n'ai pas bien compris ce que tu me demandes de faire ^^'
    4. Modérateur
      @Yamine_1411Donner les réponses que doit restituer le programme. Pour programmer il faut être capable de faire tourner "à la main", dans sa tête, l’algorithme que l'on veut coder.
  2. j'avais juste inversé N et M


    Oui c'était le premier point et comme jee pee, je ne suis pas sûr de comprendre l'énoncé.
    Sa question est pertinente, pour voir si nous comprenons comme toi.

    Si ton prof t'as donné des précisions ou un jeu de données de correction (valeurs d'entrées et résultat associé) se serait bien de nous les communiquer.
    1. par exemple, avec le premier jeu de données que propose jee pee
      manhathanMaboul(7,[1,2,3,4,4,5,7,9,10,22,23,24])


      La façon dont je comprends l'énoncé donne 26 amis maximum, et ton code 49.
    2. Modérateur
      @Utilisateur anonymeHeureusement que je n'ai pas encore cherché à écrire le programme, moi je donnerais comme réponse 7.
  3. J'ai eu un exemple, il vous aidera surement à mieux comprendre :
    1. Modérateur
      Dans le fond je vais pouvoir l'écrire mon code ;-)

      Yamine un indice : j'avais bien senti qu'il fallait trier la liste en entrée.
    2. @jee peeTrier en ordre croissant ? (j'y ai pensé mais je me suis dis que ça ne servais à rien)
      Mon raisonnement : Je veux tester pour chaque valeur de N combien d'amis sont compris dans son temps de séjour M et trouver quelle est le nombre maximum d'amis qu'elle peut voir
    3. Modérateur
      @Yamine_1411oui aussi, en triant je voulais faire une boucle moins longue en sortant sans explorer toute la liste.

      en fait c'est l'initialisation de ton compteur amis qui est mal positionnée, il cumule toutes les boucles
    4. @jee peeOk, j'avais essayé de rajouter une variable amismax qui stockerai du coup la valeur amis du tour de la boucle où il serait le plus haut , ce n'est pas la bonne solution ?

      Je t'avoue que je suis un peu confus (je n'ai pas beaucoup d'experience en python je debute),la solution est à ma portée tu penses ?
      Ou plutôt est-ce que je suis loin du bon résultat ?
    5. Modérateur
      @Yamine_1411Tu es à une marche du bon résultat.

      L’écriture d'un programme c'est une idée d'un processus (la tienne tient la route). Après cela ne fonctionne pas du premier coup, on attend une étincelle d'intelligence, ou le lendemain, ou on s'attelle à un travail de fond, le debug. Je suis toujours surpris dans les codes que l'on nous donne sur le forum de ne pas voir de print() pour comprendre ce qui se passe. On doit parfois en mettre après chaque ligne, pour voir où le programme passe et ce que contient chaque variable touchée.

      Voilà ton code, qui pour l'exemple donné retourne 15. En une seule modification, mineure sur la forme, majeure sur la logique, il donne le 3 attendu. J'ai rajouté un print pour que tu t'interroges sur l'évolution des compteurs.
      def manhathanMaboul(M,N):
          amismax=0
          amis=0
          for i in range (len(N)):
              for k in range (len(N)):
                  if N[i]<=N[k]<=(N[i]+M):
                      amis=amis+1
                      print(i,k,N[i],N[k],N[i]+M,"compteurs", amis, amismax)
                  if amis>amismax:
                      amismax=amis
          print("Résultat",M,N," = ",amismax)
          return amismax
      
      manhathanMaboul(5, [3,11,1,7,6,12])