IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Exercice : afficher tous les nombres entre 0 et 1000 dont la somme des chiffres est égale à 15


Sujet :

Python

  1. #21
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Ce qui me surprend c'est que toutes vos solutions testent tous les nombres de 0 à 1000.
    Je crois qu'on est tous partis dans l'idée plus ou moins consciente que le bouzin devait pouvoir chercher n'importe quelle correspondance et pas seulement le "15" de l'énoncé

    Citation Envoyé par VinsS Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i in range(69, 961):
        if not i % 3:
    Ce qui me surprend c'est que tu génères des nombres que tu ne traites pas
    for i in range(69, 961, 3)

    Accessoirement, s'il faut tester une égalité avec 0, alors je conseillerais d'écrire le test intégral et non pas passer par "not" qui est plus associé à la notion de booléen. Déjà parce que cela est plus universel (aujourd'hui c'est 0, demain ça pourrait être 57) et correspond aux préconisations regroupées dans la pep 203 dont l'une d'elles dit précisément qu'explicite vaut mieux qu'implicite
    if (i % 3) == 0 (et ça ne coûte pas vraiment plus cher )

    Citation Envoyé par Hominidé Voir le message
    Sinon inutile de construire une liste -->:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(int(n) for n in str(i))
    Ah, il y en a au-moins un qui a lu ce que j'ai écrit sur le souci lié aux listes créées inutilement. Dommage qu'il n'ait pas lu jusqu'à la fin...=> sum(map(int, str(i)))
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #22
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Sve@r
    Ah, il y en a au-moins un qui a lu ce que j'ai écrit sur le souci lié aux listes créées inutilement. Dommage qu'il n'ait pas lu jusqu'à la fin...=> sum(map(int, str(i)))
    Je t'ai lu jusqu'au bout... À vrai dire, je ne pensais pas à ton intervention, mais juste qu'utiliser une expression génératrice est plus efficace que de construire une liste.
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

  3. #23
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Basé sur des observations empiriques, pour aller directement au nombre suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    jump = 63 # saut d'une centaine à l'autre
    jumpstep = -9 # variation de jump
    item = 4  # nombre d'items par centaine
    itemstep = 1  # variation d'item
     
    x = 69
     
    while x < 960:
        for i in range(item):
            print(x)
            x += 9
     
        if item == 10:
            itemstep = -itemstep
            jumpstep = -jumpstep
        else:
            jump += jumpstep
     
        item += itemstep
        x += jump
    Dans une même centaine tous les résultats sont distants de 9.
    Pour chaque nouvelle centaine, le nombre de résultats par centaine augmente de 1 et le saut d'une centaine à l'autre diminue de 9.
    Si le nombre de résultats par centaine atteind 10, alors le nombre de résultats par centaine pour les centaines suivantes diminue de 1, et, le saut d'une centaine à l'autre augmentera de 9.

    Malheureusement, comme je ne connais pas la "rêgle" précise qui sous-tend ces observations, difficile d'étendre l'algorithme au delà de 1000, (pour le passage d'un millier à l'autre le saut est augmenté de 36).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #24
    Invité
    Invité(e)
    Par défaut
    Slt !

    Mouai l'optimisation est un peu futile non ?
    En énumérant tous les nombres de 0 à 1000 mon PC met entre 0 et 1 msec pour sortir la liste des nombres concernés.

  5. #25
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Basé sur des observations empiriques, pour aller directement au nombre suivant
    Citation Envoyé par LeNarvalo Voir le message
    Mouai l'optimisation est un peu futile non ?
    Et aussi ça limite le programme à se cantonner au seul total 15 (tout à refaire si on veut le résultat 18).
    Mais si tu t'es fait plaisir en écrivant ce code, c'est tout ce qui compte
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #26
    Invité
    Invité(e)
    Par défaut
    Oki !

    Sinon je ne sais pas si ça a été proposé mais pourquoi ne pas simplement écumer toutes les additions de 3 chiffres ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> def toto(somme):
    	liste = []
    	for c in range(0,10):
    		for d in range(0,10):
    			u = somme-d-c
    			if 0<= u <= 9:
    				liste.append(int(str(c)+str(d)+str(u)))
    	return liste
    On peut probablement gratter quelques pouièmes de microsecondes ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def TOTO(somme):
    	liste = []
    	nb = 0
    	for c in range(0,10):
    		for d in range(min(9, max(0, somme-c-9)),10):
    			nb+=1
    			u = somme-d-c
    			if 0<= u <= 9:
    				liste.append(int(str(c)+str(d)+str(u)))
    	return nb, len(liste), liste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> TOTO(15)
    (79, 73, [69, 78, 87, 96, 159, 168, 177, 186, 195, 249, 258, 267, 276, 285, 294, 339, 348, 357, 366, 375, 384, 393, 429, 438, 447, 456, 465, 474, 483, 492, 519, 528, 537, 546, 555, 564, 573, 582, 591, 609, 618, 627, 636, 645, 654, 663, 672, 681, 690, 708, 717, 726, 735, 744, 753, 762, 771, 780, 807, 816, 825, 834, 843, 852, 861, 870, 906, 915, 924, 933, 942, 951, 960])
    6 calculs en trop avec 15 au lieu de 26 calculs en trop sans cette petite optimisation... Niveau timing en réalité je pense qu'on ne gagne rien voire on perd ! ^^

  7. #27
    Membre expérimenté
    Avatar de MPython Alaplancha
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    Juin 2018
    Messages
    870
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2018
    Messages : 870
    Points : 1 522
    Points
    1 522
    Billets dans le blog
    4
    Par défaut
    Bonjour,
    Citation Envoyé par LeNarvalo Voir le message
    Oki !

    Sinon je ne sais pas si ça a été proposé mais pourquoi ne pas simplement écumer toutes les additions de 3 chiffres ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> def toto(somme):
    	liste = []
    	for c in range(0,10):
    		for d in range(0,10):
    			u = somme-d-c
    			if 0<= u <= 9:
    				liste.append(int(str(c)+str(d)+str(u)))
    	return liste
    On peut probablement gratter quelques pouièmes de microsecondes ainsi :
    Ceci semble plus rapide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def toto(somme):
    	return [int(f"{c}{d}{somme-d-c}") for c, d in itertools.product(
                range(10), range(10)) if 0<= somme-d-c <= 9]
    #Rien de nouveau sous le soleil, tout est vanité comme courir après le vent!
    Developpement pour Android avec Python3/Kivy/Buildozer

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. afficher tous les dates entre deux périodes
    Par maximath dans le forum Access
    Réponses: 5
    Dernier message: 05/11/2020, 18h51
  2. Xcas : tous les nombres entre 1 et 100
    Par jfk10 dans le forum Général Python
    Réponses: 9
    Dernier message: 10/08/2019, 16h09
  3. [TPW] Afficher tous les nombres parfaits dans l'intervalle 1..99999
    Par fatma2013 dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 30/10/2013, 18h45
  4. [Exercice] Afficher tous les nombres
    Par zlatino dans le forum Pascal
    Réponses: 7
    Dernier message: 05/03/2009, 19h42
  5. Réponses: 14
    Dernier message: 25/11/2007, 18h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo