Partage
  • Partager sur Facebook
  • Partager sur Twitter

Simplifier un code

    15 août 2010 à 7:03:40

    Bonjour, je me suis donner un exercice, j'aimerais créer un fichier qui code un fichier texte avec un code unique pour chaque fichier.

    Or il faut que je fasse une fonction qui génère un code.

    Voici un début :
    #Fonction qui créer un code unique
    
    def créationcode(code)
    	
    	1 = random.randint(1, 100)
    	
    	while 2 == 1
    		2 = random.randint(1, 100)
    
    	while 3 == 1 || 3 == 2
    		3 = random.randint(1, 100)
    
    	while 4 == 1 || 4 == 2 || 4 == 3
    		4 = random.randint(1, 100)
    
    	while 5 == 1 || 5 == 2 || 5 == 3 || 5 == 4
    		5 = random.randint(1, 100)
    
    	while 6 == 1 || 6 == 2 || 6 == 3 || 6 == 4 || 6 == 5
    		6 = random.randint(1, 100)
    
    	while 7 == 1 || 7 == 2 || 7 == 3 || 7 == 4 || 7 == 5 || 7 == 6
    		7 = random.randint(1, 100)
    
    	while 8 == 1 || 8 == 2 || 8 == 3 || 8 == 4 || 8 == 5 || 8 == 6 || 8 == 7
    		8 = random.randint(1, 100)
    
    	while 9 == 1 || 9 == 2 || 9 == 3 || 9 == 4 || 9 == 5 || 9 == 6 || 9 == 7 || 9 == 8
    		9 = random.randint(1, 100)
    
    	while 0 == 1 || 0 == 2 || 0 == 3 || 0 == 4 || 0 == 5 || 0 == 6 || 0 == 7 || 0 == 8 || 0 == 9
    		0 = random.randint(1, 100)
    
    	code[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
    


    Comme vous pouvez le voir, il est compliquer.
    Est-ce-qu'il y a une manière de le simplifier ?

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      15 août 2010 à 7:12:34

      Déjà il marche pas ton code.
      • Partager sur Facebook
      • Partager sur Twitter

      Blond, bouclé, toujours le sourire aux lèvres...

        15 août 2010 à 7:21:03

        Je n'ai pas pu le tester, pourrais-tu me dire ce qui ne va pas ?
        • Partager sur Facebook
        • Partager sur Twitter
          15 août 2010 à 7:40:37

          Citation : LeZerodeblender

          Je n'ai pas pu le tester


          Ça saute aux yeux...

          Pour les erreurs il y en a au moins une chaque ligne de code :p

          Déjà il manque les deux points à chaque while et lors de la définition de la fonction, ensuite le "ou" en python s'écrit "or", pas ||. et on ne peut pas avoir des entiers comme noms de variables.
          La dernière ligne, je la comprend même pas.

          De toutes façons ta fonction n'est pas documentée, on ne sait pas ce que l'argument de la fonction doit être, ni le résultat qu'elle doit produire, du coup on est pas trop avancés...

          Je pense qu'au lieu de poster des codes non testés, tu aurais mieux fait de décrire ton algo en français.
          • Partager sur Facebook
          • Partager sur Twitter

          Blond, bouclé, toujours le sourire aux lèvres...

            15 août 2010 à 7:43:10

            Toutes les conditions de tes boucles ne peuvent pas marcher, elles sont toujours fausses.

            Je connais pas énormément de moyens pour créer un nombre réellement unique, soit tu génères un gros nombre au hasard et vérifie que tu ne l'as jamais utilisé avant, soit tu te passes sur le temps (millisecondes, voire plus petite précision encore).
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              15 août 2010 à 10:30:28

              Je plussois Loup Solitaire

              Il faudrait qu'on comprenne cette phrase

              Citation

              j'aimerais créer un fichier qui code un fichier texte avec un code unique pour chaque fichier



              De quel code parles-tu?


              Veux-tu obtenir l'empreinte numérique d'un fichier


              Si c'est le cas utilise le module hashlib

              Et si tu veux son algorithme va sur wikipedia

              Soit plus précis dans tes questions, testes tes codes avant, et utilise un tutoriel pour t'aider.

              • Partager sur Facebook
              • Partager sur Twitter
                15 août 2010 à 18:46:04

                Oups désolé j'ai mélangé quelque code. Voici donc le code corrigé :
                #Fonction qui créer un code unique
                
                import random #importation du module de génération de nombre aléatoire
                
                def creationcode(code) :
                	
                	un = random.randint(1, 100)
                	
                	while deux == un :
                		deux = random.randint(1, 100)
                
                	while trois == un or trois == deux :
                		trois = random.randint(1, 100)
                
                	while quatre == un or quatre == deux or quatre == trois :
                		quatre = random.randint(1, 100)
                
                	while cinq == un or cinq == deux or cinq == trois or cinq == quatre :
                		cinq = random.randint(1, 100)
                
                	while six == un or six == deux or six == trois or six == quatre or six == cinq :
                		six = random.randint(1, 100)
                
                	while sept == un or sept == deux or sept == trois or sept == quatre or sept == cinq or sept == six :
                		sept = random.randint(1, 100)
                
                	while huit == un or huit == deux or huit == trois or huit == quatre or huit == cinq or huit == six or huit == sept :
                		huit = random.randint(1, 100)
                
                	while neuf == un or neuf == deux or neuf == trois or neuf == quatre or neuf == 
                cinq or neuf == six or neuf == sept or neuf == huit :
                		neuf = random.randint(1, 100)
                
                	while zero == un or zero == deux or zero == trois or zero == quatre or zero == cinq or zero == six or zero == sept or zero == huit or zero == neuf :
                		zero = random.randint(1, 100)
                
                	code = [un, deux, trois, quatre, cinq, six, sept, huit, neuf, zero]
                


                Voici donc le résutat que je veux faire :
                Le fichier codage.py demande à l'utilisateur quel fichier il veut coder (uniquement des fichiers .txt)
                Il lit le fichier indiqué par l'utilisateur.
                Il utilise la fonction creationcode qui génére un code chiffré aléatoire.
                Il utilise le code généré par creationcode pour coder le fichier.

                Exemple :
                L'utilisateur indique le fichier bonjour.txt :

                Citation : bonjour.txt

                Bonjour !



                La fonction creation code génère ce code(je n'ai indiqué que les caractère qui sont dans bonjour.txt) :

                Citation : creationcode.py

                b = 123
                o = 234
                n = 345
                j = 456
                u = 567
                r = 678
                (espace) = 789
                ! = 890



                Codage.py change bonjour.txt par :

                Citation : bonjour.txt codé

                123234345456234567678789890



                @Fayden : Pourrais-tu dévlopper s'il te plait ?
                • Partager sur Facebook
                • Partager sur Twitter
                  15 août 2010 à 18:49:43

                  Mais en fait, pourquoi elle prend un argument ta fonction vu que tu fais rien avec ?
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Blond, bouclé, toujours le sourire aux lèvres...

                    16 août 2010 à 1:48:52

                    Pour qu'elle renvoit une variable il ne faut pas qu'elle prenne un argument ? Sinon je peux enlevé l'argument ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 août 2010 à 1:50:59

                      Non, c'est pas nécessaire, d'ailleurs ton code ne renvoie rien (faut utiliser return, dans ton cas tu modifie une variable locale qui sera détruite à la fin de la fonction).

                      Mais tu sais, tu peux tester ton code hein, l'interpréteur est fait pour ça...
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Blond, bouclé, toujours le sourire aux lèvres...

                        16 août 2010 à 2:00:21

                        Je ne peux pas, je suis sur l'ordinateur d'un ami et il me permet de créer des fichiers .txt mais pas de télécharger python.

                        Ma fonction renvoit la liste code, non ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 août 2010 à 2:09:54

                          Sans return, elle renvoie rien.


                          EDIT : Pour tester ton code sans rien installer :
                          http://ideone.com/

                          Et globalement si d'autres langages t'intéressent :
                          http://joel.franusic.com/Online-REPs-and-REPLs
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Blond, bouclé, toujours le sourire aux lèvres...

                            16 août 2010 à 4:22:23

                            Il faut que je mette :
                            returne code[un, ..., zero]
                            

                            ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              16 août 2010 à 10:01:41

                              LoupSolitaire, je ne connaissais pas ideone, merci, c'est dans le marques-pages.

                              :)

                              Edit :

                              ZerodeBlender, ton code est totalement inconcevable dans la façon dont tu l'écris et dont tu penses.

                              Il n'y a que des incohérences

                              while deux == un :
                              


                              Mais la variable deux n'a pas été déclarée.

                              D'ailleurs dans la suite de ton programme, la variable trois, quatre, cinq, etc... n'y sont pas non plus, elle le sont qu'après tes whiles .

                              def creationcode(code) :
                              


                              Ne sert à rien, car tu déclares ta variable en dernière ligne. Je ne comprend pas trop ce que tu veux faire ici ???

                              Citation

                              Il utilise le code généré par creationcode pour coder le fichier.



                              Je ne vois pas l'intérêt de faire ceci, car tes données ne seront plus décodable, tu auras perdu toutes tes données.

                              Un peu d'explication pourra nous éclaircir.

                              Pour coder (soit disant une lettre) il suffit de faire

                              import random
                               
                              def coding(ch):
                                  code=[]
                                  for i in ch:
                                      code.append(str(random.randint(1,999)))
                                  return "".join(code)
                              
                              print coding("""Python runs on Windows, Linux/Unix, Mac OS X, and has been ported to the Java and .NET virtual machines.
                              
                              Python is free to use, even for commercial products, because of its OSI-approved open source license.
                              
                              New to Python or choosing between Python 2 and Python 3? Read Python 2 or Python 3.
                              
                              The Python Software Foundation holds the intellectual property rights behind Python, underwrites the PyCon conference, and funds other projects in the Python community.""")
                              


                              Resultat :

                              928273251373896191446925343146449485299282168888027161873746124429828182184846852789447592766802395106659503623613607340229651405475562670874329603707314786579827958217588423665235496483960865490427151539582171915327082825658060682638656831414392734993992524467748920796654509796449713362748963745848465775932864141163486726710982844546654975817088764855699844056619568069072526250025180968748974795668356336399920659316446519905140740416240284482441640955379247275633722967691046473992166217213675623049677753950722858170352895735921170833263838678562810890495166353471186014973196663668826815176352537628442197258680274586519497559909851584505807789667331022022128582937535392315558969276771360213566058994440360897378769666322773129193331246757789607528011132299865293075699376078235939024967883484464364527885449369780420568613868279603256993994903125645913387876156335514236636206011889799155392091130790713028442030012518847844335470988627427858652551068115391568168979203334893506762836008722743207726479686568246132855748459160684764946350868245737736213156984275124704895101874963690851241388428326648225332164836548062896626985320424972634977193970731536270790186222835496580590363366995609702961660927896494696250952951924027298294028266204563259212484828548619391861494514994387968885643436354811541741495323881994561915369171
                              • Partager sur Facebook
                              • Partager sur Twitter
                                16 août 2010 à 19:30:37

                                Code corrigé :
                                #Fonction qui créer un code unique
                                
                                import random #importation du module de génération de nombre aléatoire
                                
                                def creationcode() :
                                
                                	un = 0
                                	deux = 0
                                	trois = 0
                                	quatre = 0
                                	cinq = 0
                                	six = 0
                                	sept = 0
                                	huit = 0
                                	neuf = 0
                                	
                                	un = random.randint(1, 100)
                                	
                                	while deux == un :
                                		deux = random.randint(1, 100)
                                
                                	while trois == un or trois == deux :
                                		trois = random.randint(1, 100)
                                
                                	while quatre == un or quatre == deux or quatre == trois :
                                		quatre = random.randint(1, 100)
                                
                                	while cinq == un or cinq == deux or cinq == trois or cinq == quatre :
                                		cinq = random.randint(1, 100)
                                
                                	while six == un or six == deux or six == trois or six == quatre or six == cinq :
                                		six = random.randint(1, 100)
                                
                                	while sept == un or sept == deux or sept == trois or sept == quatre or sept == cinq or 
                                
                                sept == six :
                                		sept = random.randint(1, 100)
                                
                                	while huit == un or huit == deux or huit == trois or huit == quatre or huit == cinq or 
                                
                                huit == six or huit == sept :
                                		huit = random.randint(1, 100)
                                
                                	while neuf == un or neuf == deux or neuf == trois or neuf == quatre or neuf == cinq or 
                                
                                neuf == six or neuf == sept or neuf == huit :
                                		neuf = random.randint(1, 100)
                                
                                	while zero == un or zero == deux or zero == trois or zero == quatre or zero == cinq or 
                                
                                zero == six or zero == sept or zero == huit or zero == neuf :
                                		zero = random.randint(1, 100)
                                
                                	return(code = [un, deux, trois, quatre, cinq, six, sept, huit, neuf, zero])
                                


                                @fred1599 : Je créerai un decodeur.py

                                Je ne peut pas utiliser ideone car il n'a pas le module random.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  16 août 2010 à 19:38:31

                                  Citation

                                  Je créerai un decodeur.py



                                  Je voudrais bien voir ça :)

                                  T'es-tu déjà demandé si c'était faisable?
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 août 2010 à 19:47:49

                                    Je pige toujours pas pourquoi tu persistes à écrire du code alors que tu peux pas le tester...

                                    Écris juste tes algos, ça suffira.

                                    EDIT : Et comme j'en ai marre de voir ton horreur, j'ai codé un truc plus simple en 2 minutes :

                                    def gencode(length):
                                        code = []
                                    
                                        while len(code) < length:
                                            x = random.randint(1, 100)
                                            if x not in code:
                                                code.append(x)
                                    
                                        return code
                                    

                                    J'ai ajouté un argument length à la fonction pour pouvoir générer des codes de longueurs différentes au besoin, donc pour avoir le résultat que tu veux il faut l'appeler de cette manière : gencode(10) .
                                    Appelle pas la fonction avec un argument supérieur à 98 sinon t'as une boucle infinie.
                                    EDIT : En fait on peut l'appeler avec 100 comme argument, je sais pas pourquoi mais randint(1, 100) renvoie parfois 0...
                                    EDIT (bis) : Ah non, c'est un bug dans le code de LeZerodeblender, le deuxième élément de la liste que sa fonction génère est toujours 0 !

                                    EDIT (ter) :
                                    Bon, j'ai trouvé encore plus court :
                                    random.sample(xrange(1, 101), 10)
                                    

                                    AMHA on aura du mal à faire mieux.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Blond, bouclé, toujours le sourire aux lèvres...

                                      16 août 2010 à 20:29:08

                                      Salut,

                                      Si tu souhaites simplifier ton script, tu peux également t'inspirer de ceci : La fonction te crée une liste de nombre aléatoire de telle manière que chaque élément de cette liste soit unique (ce que je crois avoir compris de ton script, peut-être pas ce que tu souhaite):
                                      #!/usr/bin/env python
                                      #-*-coding:utf8-*-
                                      
                                      import random
                                      
                                      def create_code():
                                          table = [random.randint(1,100)]
                                          
                                          while len(table)<9:
                                              element = random.randint(1,100)
                                              
                                              while element in table:
                                                  element = random.randint(1,100)
                                              
                                              table.append(element)
                                              
                                          return table
                                      
                                      
                                      if __name__ == "__main__":
                                          print create_code()
                                      

                                      Le souci, si tu souhaite avoir une grosse liste, il va falloir agrandir la fourchette des nombres.

                                      Si tu souhaite avoir un code unique, tu peux t'inspirer de ceci:
                                      import time
                                      time.time()
                                      

                                      Cette fonction renvoie le nombre de secondes depuis l'Epoch.
                                      Ensuite, est-il vraiment recommandé de recourir à ce genre de technique? Je l'ignore.
                                      Mais tant que tu ne transforme pas ce résultat en int, tout devrait aller.

                                      Bonne soirée, ne te décourage pas.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        16 août 2010 à 21:20:23

                                        Ton code est inutilement compliqué, le coup des deux while imbriqués, c'est vraiment pas utile.
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Blond, bouclé, toujours le sourire aux lèvres...

                                        Anonyme
                                          16 août 2010 à 21:26:52

                                          with open("C:\\Python31\\Lib\\this.py") as f:
                                              print(f.read())
                                          


                                          De toutes façons, j'ai rien compris à ce poste... :-°
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            16 août 2010 à 21:34:12

                                            Bien sur que c'est compliqué. Je partais du principe que dans son code initial, il ne veut pas générer 2 fois la même valeur.

                                            Pour moi, la manière la plus simple passe par une list-comprehension dans une expression lambda. Dans ce cas, on peut retrouver plusieur fois un nombre aléatoire, ce qui n'a pas grande importance.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Anonyme
                                              16 août 2010 à 22:26:22

                                              Citation

                                              Bien sur que c'est compliqué. Je partais du principe que dans son code initial, il ne veut pas générer 2 fois la même valeur.



                                              Ca ne prend qu'une ligne de plus cette difficulté ;)

                                              Citation

                                              Pour moi, la manière la plus simple passe par une list-comprehension dans une expression lambda. Dans ce cas, on peut retrouver plusieur fois un nombre aléatoire, ce qui n'a pas grande importance.



                                              Tu peux mettre une condition dans une list-comprehension. :)
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                16 août 2010 à 23:44:11

                                                Je n'ai pas mis le texte qu'il y a avant le texte codé mais je voila ce que ça fera :

                                                Citation : bonjour.txt

                                                123234345456...765098464435
                                                123234345456234567678789890


                                                decodeur.py lira les nombres de la première liste 3 par 3 et les assigneras a un caractère, les 3 premiers seront assigné au chiffre 1, les suivant au chiffre 2, ect...

                                                @LoupSolitaire, vapula et LeYan'tibus : Pouvez-vous expliquer votre code, s'il-vous-plait ?

                                                @LoupSolitaire : ça m'occupe quand je n'est rien a faire, je pourrai le tester dans une semaine lorsque j'aurai accès a mon ordinateur
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  17 août 2010 à 0:00:42

                                                  Citation : vapula

                                                  Bien sur que c'est compliqué. Je partais du principe que dans son code initial, il ne veut pas générer 2 fois la même valeur.


                                                  Dans la fonction que je propose plus haut, cette contrainte est prise en compte, et pourtant il n'y a qu'un seul while.

                                                  Citation : LeZerodeblender

                                                  @LoupSolitaire, vapula et LeYan'tibus : Pouvez-vous expliquer votre code, s'il-vous-plait ?


                                                  Les exemples proposés sont triviaux, tu dois pouvoir les comprendre, au pire regarde dans la doc ce que tu ne comprend pas, c'est un bon exercice de lire et comprendre le code des autres.

                                                  Citation : LeZerodeblender

                                                  @LoupSolitaire : ça m'occupe quand je n'est rien a faire, je pourrai le tester dans une semaine lorsque j'aurai accès a mon ordinateur


                                                  Tu peux écrire les algos en français, pas forcément en Python, je pense que ça t'occuperais autant, et tu ne perdrais pas de temps à essayer de te rappeler d'une syntaxe en particulier alors que tu ne peux pas exécuter le code.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  Blond, bouclé, toujours le sourire aux lèvres...

                                                    17 août 2010 à 1:38:47

                                                    Si tu t'embêtes et que tu veux essayer de crypter le contenu d'un fichier texte pourquoi ne pas plutôt essayer d'implémenter des méthodes de chiffrements connues comme le ROT13, le chiffre de Delastelle, le carré de Polybe, etc. ?
                                                    Parce que là, le code est affreusement alambiqué et incorrect pour pas grand chose, à savoir découper une chaîne en séquence d'un caractère et affilié à ce caractère un nombre aléatoire avant de reconvertir le tout en une seule chaîne de caractère.
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      17 août 2010 à 7:37:38

                                                      Étant donné que je voulais m'exercer dans le module random et dans la lecture et l'écriture de fichiers, je pensais à abandonner cette exercice pour faire un jeu de hasard car je ne connait pas méthode de chiffrement.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                      Anonyme
                                                        17 août 2010 à 14:27:57

                                                        Citation

                                                        je pensais à abandonner cette exercice pour faire un jeu de hasard



                                                        Bonne idée, avec le module random, je sais pas, créé toi un jeu du loto, où tu as 6 chiffres (5 + le numero chance) au hasard différents les uns des autres, et dont la taille doit rester 6.

                                                        Mais bon Loup Solitaire a déjà donner la soluce, donc plus trop d'intérêts.

                                                        Je pense qu'il n'est pas obligatoire de passer beaucoup de temps sur ce module.

                                                        J'ai fais en 5 minutes ce programme en Qt pour te montrer ce qu'on peut faire avec une GUI

                                                        Image utilisateur


                                                        Amuse toi bien! ;)
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          17 août 2010 à 15:13:34

                                                          Aux temps pour moi, LoupSolitaire, je n'avais pas bien vu.
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter

                                                          Simplifier un code

                                                          × 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.
                                                          • Editeur
                                                          • Markdown