jQuery
En savoir plus
Adobe Flex & Flash
En savoir plus
ASP.NET
En savoir plus

Inscris-toi au e-camp "Héberge ton jeu Facebook sur Azure" de Microsoft vendredi 25 mai à 13h30 !
| Page 1 2 3 Suivante | |||||||||||
| Auteur | Message | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 visiteur sur ce sujet (1 Anonyme) | |||||||||||
| Page 1 2 3 Suivante | |||||||||||
candide
|
# Posté le 14/07/2010 à 14:36:16 | ||||||||||
"In C ode we trust"![]()
|
Bonjour,
Il s'agit d'un exercice que j'ai déjà proposé ICI sur le forum C il y a bientôt un an, désolé pour ceux qui connaissent. Voici la fameuse suite de Conway : Code : Autre
Il s'agit d'une suite de nombres (ou encore de chaînes). Le premier nombre est 1, le second 11, le troisième 21, etc. Chaque nombre se déduit du précédent par une règle que je vais préciser maintenant. Un exemple suffira à comprendre : pour passer de la ligne 5 111221 à la ligne 6, on fait comme ceci : on regarde la ligne 5, on la lit en regroupant les chiffres identiques qui se suivent, ce qui donne : "3 fois le chiffre 1 puis 2 fois le chiffre 2 et enfin 1 fois le chiffre 1" ce qui donne "3 fois le chiffre 1 puis 2 fois le chiffre 2 et enfin 1 fois le chiffre 1" et enfin, en extrayant les nombres : 312211 d'où la ligne 6. Une liste des 25 premiers nombres de la suite est disponible ICI sur le site de Sloane. Vous devez écrire un programme Python qui génère la ligne n de la suite de conway. Le coeur du programme devrait être une fonction qui calcule la ligne suivante à partir d'une ligne donnée. Votre programme doit être capable de traiter en quelques secondes des valeurs comme n=50 mais attention, les nombres obtenus ont assez rapidement des millions de chiffres. Pour que votre console ne soit pas envahi par un affichage énorme, redirigez l'affichage vers un fichier (ça marche sous Windows comme sous Linux), genre si je veux placer l'affichage dans un fichier toto.txt : Code : Console
Le code Python ne contient aucune astuce, ça fait juste travailler les listes, les boucles, les conditions, les fonctions. EDIT La suite est répertoriée sur le site de Sloane.
Édité
le 07/08/2010 à 17:53:46
par candide
|
||||||||||
| Publicité | # Posté le 14/07/2010 à 14:36:16 | ||||||||||
|
|
|||||||||||
ordiclic
|
# Posté le 14/07/2010 à 15:27:55 | ||||||||||
Groupe : Aigris![]() Groupe : Bannis
Études : Université Paul Sabatier Toulouse |
Pour ça, un code très moche mais terriblement rapide, en python 3, que je mets en secret, parce que ce n'est surtout pas ce qui est demandé :
Secret (cliquez pour afficher) Code : Python
Édit : j'ai oublié 2-3 trucs, je le modifie(rai), à ce propos : Citation : candide Le coeur du programme devrait être une fonction qui calcule la ligne suivante à partir d'une ligne donnée.
Édité
le 14/07/2010 à 15:31:48
par ordiclic
L'orthographe, la recherche, l'aide : Site du Zéro, oui, Site d’Assistés, non. Corrigez-vous. Cherchez. Ne donnez pas les réponses à quelqu'un qui n'a pas cherché. « C'est fou le nombre de citations qui me sont attribuées sur Internet » - A. Einstein TMX - YD - /b/ - Et après avoir appris à programmer ? - Un joli bonbon, enrobé avec de l'aigreur. |
||||||||||
Zopieux
|
# Posté le 14/07/2010 à 15:39:35 | ||||||||||
|
Mhg n pryhv dhv zr yvg Groupe : Interdiction d'écriture
|
En effet, c'est osé, car c'est très moche
|
||||||||||
Maxibolt
|
# Posté le 14/07/2010 à 15:55:50 | ||||||||||
E Ultreïa![]() Groupe : Bannis
|
"Et pourtant, il est très rapide."
« J'entends par "valeur publique" ce qui fut le sens de l'honneur, puis le sens du sacré, puis la "bonne morale" de la IIIeme, et qui est actuellement "5 fruits et légumes par jour", et "penser à mettre une capote" » Statistiques de l'activité sur les forums du sdz. |
||||||||||
candide
|
# Posté le 14/07/2010 à 16:08:05 | ||||||||||
"In C ode we trust"![]()
|
Citation : ordiclic
Pour ça, un code très moche mais terriblement rapide, en python 3, que je mets en secret, parce que ce n'est surtout pas ce qui est demandé : Tu n'es pas obligé de suivre l'énoncé au pied de la lettre surtout si tu fais quelque chose d'équivalent ou supérieur ![]() Tes sorties semblent correctes et ton code est de l'ordre 3 fois plus rapide que le mien, bien ! À vrai dire je n'ai cherché absolument aucune optimisation.
|
||||||||||
Maxibolt
|
# Posté le 14/07/2010 à 16:13:09 | ||||||||||
E Ultreïa![]() Groupe : Bannis
|
Mon code est tout simple et correspond certainement à ce que tout le monde fera (peut-être modulo le passage par des listes) :
Code : Python
edit : une version qui utilise les générateurs takewhile et dropwhile, probablement plus performante (mais sans être sûr, si quelqu'un veut vérifier) : Code : Python
Édité
le 14/07/2010 à 16:20:52
par Maxibolt
« J'entends par "valeur publique" ce qui fut le sens de l'honneur, puis le sens du sacré, puis la "bonne morale" de la IIIeme, et qui est actuellement "5 fruits et légumes par jour", et "penser à mettre une capote" » Statistiques de l'activité sur les forums du sdz. |
||||||||||
candide
|
# Posté le 14/07/2010 à 16:54:51 | ||||||||||
"In C ode we trust"![]()
|
Merci de ta participation Maxibolt
![]() Citation : Maxibolt Mon code est tout simple et correspond certainement à ce que tout le monde fera Tu parles de l'algorithme ? parce qu'un débutant ne va pas écrire du code Python comme le tien vu que tu connais Python depuis pas mal de temps, non ?(*) Même pour l'algorithme, un débutant complet pourrait avoir du mal. (*) EDIT débutant il y a 4 ans disais-tu sur ce forum. Je pense que pour la compréhension du débutant, il serait bien d'accompagner tout code au moins d'une exécution. Je me rappelle qu'à une époque, je ne comprenais rien aux itérateurs et j'aurais été incapable d'utiliser ton code pour afficher la ligne n°x. Donc je complète ton code avec l'exemple que j'ai utilisé : Secret (cliquez pour afficher) Code : Python
Code : Console
Au passage, ton code ne passe pas en Python 3 : Code : Console
Alors effectivement mon code est assez proche du tien, aux listes près effectivement, et à l'itérateur aussi, que je considère comme trop compliqué pour le débutant lambda et d'une façon générale, assez artificiel, mais bon, c'est un avis personnel et susceptible d'évoluer. Les temps de nos codes sont très comparables. Mon code est ici : Code : Python
Code : Console
Citation : Maxibolt edit : une version qui utilise les générateurs takewhile et dropwhile, probablement plus performante (mais sans être sûr, si quelqu'un veut vérifier) : Ah non, c'est très lent chez moi.
Édité
le 14/07/2010 à 17:18:11
par candide
|
||||||||||
Maxibolt
|
# Posté le 14/07/2010 à 23:55:57 | ||||||||||
E Ultreïa![]() Groupe : Bannis
|
Oui, pour Python 3, il faut remplacer xrange par range (au passage, ça marcherait aussi sous 2.6, mais j'ai préféré utiliser xrange pour marquer que c'était le générateur qui m'intéressait).
Pour "tout le monde fera ça", je pensais surtout à la première fonction. Les débutants complets auront peut-être du mal, mais sinon l'algorithme est assez basique et le code n'utilise pas de fonctionnalités très avancées de Python (à part le passage à une liste que j'ai choisi de faire, qui n'est pas très compliqué mais pas forcément évident, et qu'on pourrait facilement retirer). « J'entends par "valeur publique" ce qui fut le sens de l'honneur, puis le sens du sacré, puis la "bonne morale" de la IIIeme, et qui est actuellement "5 fruits et légumes par jour", et "penser à mettre une capote" » Statistiques de l'activité sur les forums du sdz. |
||||||||||
candide
|
# Posté le 15/07/2010 à 01:18:23 | ||||||||||
"In C ode we trust"![]()
|
Par souci de complétude, voici deux codes Python trouvés sur le site de Sloane LÀ et résolvant le problème mais ayant des performances bien moins bonnes que tous les codes que nous avons donnés ici (traduction : on est des zéros mais pas absolus
) :Secret (cliquez pour afficher) Code : Python
Secret (cliquez pour afficher) Code : Python
|
||||||||||
GurneyH
|
# Posté le 15/07/2010 à 01:21:11 | ||||||||||
![]()
|
La première fonction de maxibolt est très claire je trouve.
Ca ressemble à du pseudo-code!(Si on oublie le générateur) J'ai déjà codé la suite de conway en C Et c'était un(gros)poil moins clair.Tout de même, en python(et avec des noms de variables explicites), c'est très lisible! J'en profite pour une question Je lis souvent qu'en python il n'y a qu'une seule manière de faire correctement. Bizarrement, on voit toujours plusieurs solutions. La manière considérée correcte, c'est le second code de maxibolt, ou son premier code? Citation : candide (traduction : on est des zéros mais pas absolus ) :J'ai déjà fait l'expérience!
Édité
le 15/07/2010 à 01:49:13
par GurneyH
|
||||||||||
iNaKoll
|
# Posté le 15/07/2010 à 16:26:36 | ||||||||||
Grosso merdo![]()
Ville : Paris |
Bonjour,
C'est toujours un plaisir ces petits exercices candide ![]() Voici ce à quoi j'arrive de façon terre à terre: Secret (cliquez pour afficher) Code : Python - 2.6
Code : Console
Edit: petite correction du code, maintenant l'algorithme ne manipule plus que des listes (et non des listes et des chaines comme c'était le cas). Ca fait gagner plus de 2 secondes chez moi.
Édité
le 15/07/2010 à 16:52:18
par iNaKoll
"La constante de couplage est fonction d'une certaine valeur constante que prend le champ scalaire des dilatations dans le vide quantique." ![]() |
||||||||||
candide
|
# Posté le 15/07/2010 à 17:16:16 | ||||||||||
"In C ode we trust"![]()
|
Citation : iNaKoll
C'est toujours un plaisir ces petits exercices candide ![]() Merci de ce commentaire qui me fait fait bien plaisir. Citation : iNaKoll Edit: petite correction du code, maintenant l'algorithme ne manipule plus que des listes (et non des listes et des chaines comme c'était le cas). Ca fait gagner plus de 2 secondes chez moi. C'est marrant parce que je venais de modifier ton code exactement dans ce sens et effectivement le temps s'améliore notablement. Petit détail supplémentaire : si je change ta partie de code : Code : Python
par celle-ci : Code : Python
je gagne 25% de temps d'exécution. Par ailleurs, *) je ne connaissais pas print >> *) j'ai trouvé ton code très lisible.
|
||||||||||
EPonix
|
# Posté le 15/07/2010 à 17:34:45 | ||||||||||
un zero, deux zero, zzzzzzzz![]()
Ville : Toul |
Bonjour
Voici ma version : Code : Python
Code : Console
En tout cas j'ai été intrigué par la version de ordiclic. Je n'avais jamais vu cette implémentation pour cet algo. |
||||||||||
ordiclic
|
# Posté le 15/07/2010 à 19:03:40 | ||||||||||
Groupe : Aigris![]() Groupe : Bannis
Études : Université Paul Sabatier Toulouse |
Les spécificités de cette implémentation, c'est plusieurs choses : la première, c'est l'enchainement des replace(), qui se font les uns après les autres, et c'est arrangeant
, la deuxième, c'est que ça ne fonctionne -que- avec 1 comme premier terme, car ça remplace des groupes au cas par cas ; la troisième chose à dire dessus, c'est comment ça fonctionne.En fait, ça prend d'abord tous les groupes de "111", "222" et "333", et ça réalise exactement ce qu'on veut : ça transforme le "111" en "31". Dans ce cas, pourquoi passer par des lettres, genre "111" en "ca" ? C'est parce qu'on est obligé de traiter d'abord les gros groupes. En effet, si on fait un replace("1","11"), ça prendra le "111" et le remplacera par un "111111"... Et ça pose un problème en plus ! car une fois que tous les gros groupes ont été transformés, il reste les petits groupes et les lettres isolées... Qui seront bien prises par les replace() suivants, mais ces replace prendront aussi ce qui vient d'être transformé depuis les gros groupes : ça ferait, "111" => "31" => "1311" à cause de l'ordre des replace. La solution est de transformer ces groupes de chiffres en lettres : ainsi "222" devient "cb", puis de mettre des chiffres à la place des lettres, ainsi "cb" devient "32" : problème résolu. ![]() D'ailleurs, j'ai un peu allégé mon code, j'avais mis 6 replace en trop, ça devrait être mieux maintenant : Code : Python
Édit : ça fait gagner entre 30% et 40% de rapidité, le fait d'enlever des replace inutiles ; désolé si les explications sont confuses, je n'ai jamais été bon pédagogue.
Édité
le 15/07/2010 à 19:05:29
par ordiclic
L'orthographe, la recherche, l'aide : Site du Zéro, oui, Site d’Assistés, non. Corrigez-vous. Cherchez. Ne donnez pas les réponses à quelqu'un qui n'a pas cherché. « C'est fou le nombre de citations qui me sont attribuées sur Internet » - A. Einstein TMX - YD - /b/ - Et après avoir appris à programmer ? - Un joli bonbon, enrobé avec de l'aigreur. |
||||||||||
Holt
|
# Posté le 15/07/2010 à 21:56:34 | ||||||||||
![]()
Ville : Monteils |
Bon une petite résolution avec un algorithme classique je pense (je n'ai pas redirigée vers un fichier, j'ai stockée dans une liste) :
Secret (cliquez pour afficher) Code : Python
Je trouve 4.5 secondes en temps pour trouver les 50 premiers termes mais bon, à tester sur une autre machine
|
||||||||||
ordiclic
|
# Posté le 15/07/2010 à 22:13:42 | ||||||||||
Groupe : Aigris![]() Groupe : Bannis
Études : Université Paul Sabatier Toulouse |
Ton programme prend 4"57 chez moi, c'est assez rapide. Mais ça ne bat pas encore les 0"78 de mon programme
L'orthographe, la recherche, l'aide : Site du Zéro, oui, Site d’Assistés, non. Corrigez-vous. Cherchez. Ne donnez pas les réponses à quelqu'un qui n'a pas cherché. « C'est fou le nombre de citations qui me sont attribuées sur Internet » - A. Einstein TMX - YD - /b/ - Et après avoir appris à programmer ? - Un joli bonbon, enrobé avec de l'aigreur. |
||||||||||
EMC1
|
# Posté le 15/07/2010 à 22:49:24 | ||||||||||
![]()
|
Un petit comparatif des solutions de Holt, ordiclic et de deux variantes de celle d'ordiclic.
Code : Python
Résultat chez moi: Code : Python Console
Edit : corrections J'ajoute que je ne cautionne pas spécialement ces courses à la vitesse d'exécution en Python.
Édité
le 15/07/2010 à 23:07:18
par EMC1
|
||||||||||
ordiclic
|
# Posté le 15/07/2010 à 23:20:55 | ||||||||||
Groupe : Aigris![]() Groupe : Bannis
Études : Université Paul Sabatier Toulouse |
Ouch, violent pour le conway3.
Faire 8 remplacements par boucle au lieu de 11 de cette manière, c'est bien pensé ! L'orthographe, la recherche, l'aide : Site du Zéro, oui, Site d’Assistés, non. Corrigez-vous. Cherchez. Ne donnez pas les réponses à quelqu'un qui n'a pas cherché. « C'est fou le nombre de citations qui me sont attribuées sur Internet » - A. Einstein TMX - YD - /b/ - Et après avoir appris à programmer ? - Un joli bonbon, enrobé avec de l'aigreur. |
||||||||||
candide
|
# Posté le 15/07/2010 à 23:35:09 | ||||||||||
"In C ode we trust"![]()
|
Citation : Holt
Bon une petite résolution avec un algorithme classique je pense Temps plus qu'honorable (mieux que le mien et code très lisible). Citation : ordiclic Mais ça ne bat pas encore les 0"78 de mon programme ![]() En effet, ton temps est remarquable grâce à ta jolie petite astuce, encore mieux avec la variante d'EMC1. J'en conclus en particulier qu'il faut laisser le plus possible aux fonctions de Python le soin de faire le travail plutôt que tout refaire nous-mêmes. Note quand même que ton algorithme utilise de façon essentielle que les chiffres seront toujours parmi 1, 2 ou 3 et donc qu'on n'a jamais une succession de plus de trois chiffres identiques (qui en a une preuve ?) et aussi que la suite 333 n'est jamais présente.
|
||||||||||
EMC1
|
# Posté le 15/07/2010 à 23:52:20 | ||||||||||
![]()
|
Effectivement :
Code : Python
Résultat : Code : Python Console
On en conclut que la méthode replace des strings est une bif extrêmement rapide. 333 est impossible car une telle succession implique qu'elle soit déjà présente avant (peut se lire X3-33 ou 33-3X, dans les deux cas on a le 33). Toute suite de plus de 3 chiffres identiques est impossible; X3333 <- 333333 ou [X*3]333YYY , ces deux configurations devraient normalement aboutir à 63 ou (43,53 ou 63) respectivement. Même chose avec 2 ou 1, on se rend compte que la configuration dont l'actuelle est sensée être issue aboutit normalement à une autre. Edit: Et c'est encore pire avec la version plus élégante qui m'aurait évité de de recoder la fonction d'ordiclic: Code : Python
Comme quoi...
Édité
le 16/07/2010 à 00:31:49
par EMC1
|
||||||||||
Maxibolt
|
# Posté le 15/07/2010 à 23:56:59 | ||||||||||
E Ultreïa![]() Groupe : Bannis
|
Moi j'en ai une preuve.
Citation J'en conclus en particulier qu'il faut laisser le plus possible aux fonctions de Python le soin de faire le travail plutôt que tout refaire nous-mêmes. Clairement : ces fonctions compilées iront bien plus vite qu'une boucle écrite en Python. C'est d'ailleurs pour ça que je pensais que mon second code irait plus vite. « J'entends par "valeur publique" ce qui fut le sens de l'honneur, puis le sens du sacré, puis la "bonne morale" de la IIIeme, et qui est actuellement "5 fruits et légumes par jour", et "penser à mettre une capote" » Statistiques de l'activité sur les forums du sdz. |
||||||||||
candide
|
# Posté le 16/07/2010 à 01:23:27 | ||||||||||
"In C ode we trust"![]()
|
Citation : EMC1
333 est impossible car une telle succession implique qu'elle soit déjà présente avant (peut se lire X3-33 ou 33-3X, dans les deux cas on a le 33). Je trouve pas cette explication très claire : j'ai envie de t'objecter que je pourrais imaginer qu'à l'étape précédente de 333, j'aie, (au hasard) 123332 un successifs (cad une suite 111111111...11111 contenant 123332 fois le chiffre 1 et encadrée par d'autre nombres que 1) et donc à l'étape qui nous intéresse, on aurait la séquence Pour écarter l'éventualité d'un 333, il faut déjà avoir montré qu'on n'a jamais 4 répétitions et à ce moment c'est immédiat à voir (un peu délicat à écrire pour qu'un interlocuteur comprenne bien). Citation : EMC1 Toute suite de plus de 3 chiffres identiques est impossible; X3333 <- 333333 ou [X*3]333YYY , ces deux configurations devraient normalement aboutir à 63 ou (43,53 ou 63) respectivement. Même chose avec 2 ou 1, on se rend compte que la configuration dont l'actuelle est sensée être issue aboutit normalement à une autre. Excuse-moi, mais je trouve vraiment pas ton raisonnement clair ni convaincant (oui pour les maths aussi je suis chiant )Citation : EMC1 Code : Python
Comme quoi... Abominablement lent (dès que n est un peu grand), et finalement assez instructif, ça donne pas envie de surcharger des méthodes builtin Citation : Maxibolt Moi j'en ai une preuve. Moi aussi je pense, c'est assez facile à voir mais chiant à expliquer : d'abord, par définition de la suite de Conway, toute ligne L est une succession de Citation : Maxibolt Clairement : ces fonctions compilées iront bien plus vite qu'une boucle écrite en Python. Et je me dis alors : C (ou C++) + Python, c'est l'arme fatale (efficacité + simplicité) !! EDIT néanmoins le C pur reste quand même beaucoup plus rapide que Python, par exemple ici l'équivalent de l'algo naïf en C tourne 5 à 8 fois plus vite.
Édité
le 16/07/2010 à 01:46:18
par candide
|
||||||||||
iNaKoll
|
# Posté le 16/07/2010 à 10:47:48 | ||||||||||
Grosso merdo![]()
Ville : Paris |
Citation : candide
Par ailleurs, je ne connaissais pas print >> Moi non plus je ne connaissais pas avant cet exercice. Il a fallu creuser un peu pour obtenir le comportement que je voulais. Sinon pour retenir une morale de tout cela : les performances de replace sont uniquement liées au fait que cette fonction soit compilée? L'algorithme utilisé par cette fonction n'est à priori et si on le mettait sur un pied d'égalité, pas plus rapide que ce que l'on a pu proposer d'autre ? "La constante de couplage est fonction d'une certaine valeur constante que prend le champ scalaire des dilatations dans le vide quantique." ![]() |
||||||||||
candide
|
# Posté le 16/07/2010 à 12:41:38 | ||||||||||
"In C ode we trust"![]()
|
Citation : iNaKoll
les performances de replace sont uniquement liées au fait que cette fonction soit compilée? C'est ce que je dirais. Citation : iNaKoll L'algorithme utilisé par cette fonction n'est à priori et si on le mettait sur un pied d'égalité, pas plus rapide que ce que l'on a pu proposer d'autre ? Je viens de regarder dans le code source de Cpython, le coeur de la méthode replace est implémenté par la fonction replace_substring qui bien que technique dans son code ne semble avoir rien de spécialement sophistiquée.
|
||||||||||
Lexileduval
|
# Posté le 16/07/2010 à 22:23:04 | ||||||||||
|
Ville : Villenoy |
Bon allez je me lance !
C'est sans doute loin d'être parfait mais ça a l'air de fonctionner pas mal (je n'ai pas testé les temps de calcul) Secret (cliquez pour afficher) Code : Python
Édité
le 16/07/2010 à 23:20:25
par Lexileduval
|
||||||||||
Yohan88
|
# Posté le 17/07/2010 à 12:23:22 | ||||||||||
There's no place like 127.0.01![]()
|
Voilà ce que j'ai trouvé sur Wikipédia
Code : Python
Édité
le 17/07/2010 à 12:23:52
par Yohan88
|
||||||||||
candide
|
# Posté le 17/07/2010 à 12:37:00 | ||||||||||
"In C ode we trust"![]()
|
Citation : Yohan88
Voilà ce que j'ai trouvé sur Wikipédia Plus précisément, le code est ICI. Merci, tout à fait intéressant car code très compact et bien lisible. Toutefois, les performances sont assez moyennes.
|
||||||||||
Yohan88
|
# Posté le 17/07/2010 à 12:41:31 | ||||||||||
There's no place like 127.0.01![]()
|
Rien ne vaut le Perl
![]() Code : Perl
(Source : Wikipédia, même article)
Édité
le 17/07/2010 à 12:42:08
par Yohan88
|
||||||||||
candide
|
# Posté le 17/07/2010 à 12:46:37 | ||||||||||
"In C ode we trust"![]()
|
Citation : Yohan88
Rien ne vaut le Perl ![]() Code : Perl
Citation : zen de Python Code : Console
|
||||||||||
Yohan88
|
# Posté le 17/07/2010 à 12:48:06 | ||||||||||
There's no place like 127.0.01![]()
|
Depuis le shell, selon Wikipédia toujours
Code : Perl
Édité
le 17/07/2010 à 12:48:53
par Yohan88
|
||||||||||
Retour au forum "Langage Python" ou à la liste des forums
