question du jour 2 - le retour
|
30-05-2014, 16h24
Message : #1
|
|
gruik
![]() gouteur de savon ![]() Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
question du jour 2 - le retour
une réédition d'un problème classique, juste histoire de...
j'ai un fichier qui contient plusieurs paragraphes, chaque paragraphe étant composé de plusieurs lignes avec sur chacune un nombre Code : 456 le but est de trier numériquement les lignes de chaque paragraphe indépendamment des autres : Code : 2 c'est vite torché, à vos éditeurs !
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
30-05-2014, 16h42
(Modification du message : 30-05-2014, 17h16 par notfound.)
Message : #2
|
|
notfound
![]() #!/usr/bin/env bash ![]() Messages : 687 Sujets : 47 Points: 272 Inscription : Sep 2012 |
RE: question du jour 2 - le retour
Voici ma solution :
Code AWK :
Voilou |
|
30-05-2014, 16h47
Message : #3
|
|
eax64
![]() Newbie ![]() Messages : 8 Sujets : 0 Points: 13 Inscription : Nov 2012 |
RE: question du jour 2 - le retour
Salut,
Code : python -c 'print((lambda f:"\n\n".join((["\n".join(sorted(d.split("\n"), key=int)) for d in open(f).read().split("\n\n")])))("file_data"))' bonne journée ! |
|
30-05-2014, 16h55
Message : #4
|
|
fr0g
![]() NTEuNDI2MzcsLTEuNzc4NDg4 ![]() ![]() ![]() ![]() Messages : 348 Sujets : 22 Points: 56 Inscription : Aug 2011 |
RE: question du jour 2 - le retour
Je ne la joue pas optim :p
Code PYTHON :
|
|
30-05-2014, 17h09
(Modification du message : 30-05-2014, 17h09 par Dobry.)
Message : #5
|
|
Dobry
![]() Tueur de lamouz ![]() Messages : 206 Sujets : 25 Points: 73 Inscription : Aug 2011 |
RE: question du jour 2 - le retour
Bon pour changer un peu (je doute que ce soit optimisé)
Code RUBY :
Aestuārium Erudītiōnis
There are only two hard things in Computer Science: cache invalidation, naming things, and off-by-one errors.
|
|
30-05-2014, 17h13
(Modification du message : 30-05-2014, 19h11 par gruik.)
Message : #6
|
|
gruik
![]() gouteur de savon ![]() Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: question du jour 2 - le retour
(30-05-2014, 16h47)eax64 a écrit : yep, j'avais quasiment la même : Code PYTHON :
print '\n\n'.join(['\n'.join(sorted(i.split('\n'), key=int)) for i in open('fichier').read().split('\n\n') if i != '']) sinon en awk, un peu plus tricky : Code AWK :
awk '/^$/ {close("sort -n"); print; next} {print | "sort -n"}' fichier Edit: Code PERL :
perl -lne 'if (/^$/) {print join("\n", sort { $a <=> $b } @tab); print} else {push(@tab, $_)}' fichier
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
30-05-2014, 18h17
Message : #7
|
|
b0fh
![]() Membre actif ![]() Messages : 210 Sujets : 17 Points: 309 Inscription : Jul 2012 |
RE: question du jour 2 - le retour |
|
30-05-2014, 18h56
(Modification du message : 30-05-2014, 20h08 par octarin.)
Message : #8
|
|
octarin
![]() Apprenti sorcier ![]() Messages : 68 Sujets : 11 Points: 47 Inscription : May 2013 |
RE: question du jour 2 - le retour
Je propose deux solutions:
Voici la solution en python: Code PYTHON :
Et celle en bash: Code BASH :
Faire des mathématiques c’est donner le même nom à des choses différentes. -- Henri Poincaré
|
|
30-05-2014, 21h16
Message : #9
|
|
skii
![]() Newbie ![]() Messages : 19 Sujets : 4 Points: 3 Inscription : Sep 2012 |
RE: question du jour 2 - le retour
Code : croissant = [] Python pour ma pars, merci gruik et aryas pour l'aide ! |
|
30-05-2014, 22h31
(Modification du message : 30-05-2014, 22h32 par Atlas.)
Message : #10
|
|
Atlas
![]() Membre actif ![]() Messages : 69 Sujets : 7 Points: 3 Inscription : Aug 2012 |
RE: question du jour 2 - le retour
Ma version en java :
Code JAVA :
|
|
31-05-2014, 12h23
(Modification du message : 31-05-2014, 12h34 par notfound.)
Message : #11
|
|
notfound
![]() #!/usr/bin/env bash ![]() Messages : 687 Sujets : 47 Points: 272 Inscription : Sep 2012 |
RE: question du jour 2 - le retour
Bon comme persone s'est décidé à le faire, je le fais.
Et on va jouer un peu avec la mise en cache du fichier pour voir comment chaque programme se démerde. (Désolé b0fh mais j'ai pas ghc et l'install des 388 Mo me donne pas envie :p, et atlas mais ma version de java n'aime pas [javac 1.6.0_26] ) Code BASH :
Bon c'est parti : Code BASH :
Code BASH :
Code BASH :
Code BASH :
Code BASH :
Code BASH :
J'ai eu quelques soucis avec les codes py, je mettrais à jour. De plus, tous les programmes testés mettent en cache tout le fichier. A voir avec haskell qui visiblement ne le fait pas. |
|
31-05-2014, 16h50
Message : #12
|
|
gruik
![]() gouteur de savon ![]() Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: question du jour 2 - le retour
(31-05-2014, 12h23)notfound a écrit : Bon comme persone s'est décidé à le faire, je le fais. je l'ai fait dans la nuit, pas totalement fini donc j'ai pas posté les résultats :p mais merci à toi du coup j'apporte juste quelques précisions : - le code d'atlas, ben oui à chaque fois il fait le même coup en fait il livre un code java pas directement compilable, je sais pas pourquoi... je rajoute son code pour ceux que ça intéressera : Code JAVA :
import java.io.*; - mon oneliner Perl n'est pas valide, il ne fait pas ce qu'il est censé faire, mais ça n'influe pas des masses sur le temps de traitement au final, le code valide est le suivant : Code PERL :
perl -ne 'if (/^\d+$/) {push(@tab, $_)} else {print join("", sort { $a <=> $b } @tab); print; undef @tab}' fichier - les oneliners Python (le miens et celui de eax64) vautrent lamentablement : Code : Traceback (most recent call last): - le code de Dobry (Ruby) m'a défoncé la RAM (4G) en moins de 3s, dommage - je me suis amusé à faire une implé en C, évidement spécifique et très adaptée au fichier d'entrée pour le coup, mais bon... Code C :
#include <stdio.h> j'ai effectué les mesures sur un fichier de 57M contenant un très grand nombre de paragraphes chaque paragraphe contenant un petit nombre de lignes, donc en clair ce n'est pas tant la qualité de l'algorithme de tri qui est mesuré ici (même si ça contribuera forcément) c'est la qualité de l'algorithme de parcours du fichier, la mesure est réalisée avec une ligne du genre : Code : $ for i in 1 2 3; do /usr/bin/time -f "%es, %MKo, %C" -- <code ici> >/dev/null; done Code : 2.38s, 2352Ko, ./code_c_gruik fichier on remaque que Perl et Python sont dans un mouchoir de poche finalement ici, légèrement devancés par le awk de Notfound et suivis de près par l'implémentation en Java le code C quant à lui bat évidement tous les records puisqu'il est tourné spécifiquement pour cette problématique et ce fichier de tests précis (notez néanmoins qu'on pourrait le rendre plus générique à moindre cout en jouant du realloc plutot que d'avoir un tableau d'entiers fixe, ou même quitte à allouer 8K pour le tableau c'est pas un souci) en fait la grande surprise vient du code Haskell, y'a eu une méprise quelque part, son code aurait été échangé par mégarde dans la soute, je vois que ça...
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
31-05-2014, 17h16
(Modification du message : 31-05-2014, 20h04 par Booster2ooo.)
Message : #13
|
|
Booster2ooo
![]() Contributeur ![]() ![]() ![]() ![]() Messages : 165 Sujets : 14 Points: 63 Inscription : Aug 2011 |
RE: question du jour 2 - le retour
Aller, pour le fun,
C# Code CSHARP :
|
|
31-05-2014, 17h58
Message : #14
|
|
eax64
![]() Newbie ![]() Messages : 8 Sujets : 0 Points: 13 Inscription : Nov 2012 |
RE: question du jour 2 - le retour
(31-05-2014, 16h50)gruik a écrit : - les oneliners Python (le miens et celui de eax64) vautrent lamentablement : Ha ouais mais faut pas mettre de \n la fin du fichier de data, sinon ça casse tout. ![]() Suffit de rajouter un filter(None, ..) Pour le miens: Code PYTHON :
print((lambda f:"\n\n".join((["\n".join(sorted(filter(None, d.split("\n")), key=int)) for d in open(f).read().split("\n\n")])))("data")) Qui avait un lambda inutile d'ailleur: Code PYTHON :
print("\n\n".join((["\n".join(sorted(filter(None, d.split("\n")), key=int)) for d in open("data").read().split("\n\n")]))) Et pour celui de gruik: Code PYTHON :
print '\n\n'.join(['\n'.join(sorted(filter(None, i.split('\n')), key=int)) for i in open('data').read().split('\n\n') if i != '']) Quelques ressemblances entres les deux codes. ![]() |
|
31-05-2014, 18h14
(Modification du message : 31-05-2014, 18h44 par gruik.)
Message : #15
|
|
gruik
![]() gouteur de savon ![]() Messages : 757 Sujets : 44 Points: 482 Inscription : Oct 2012 |
RE: question du jour 2 - le retour
ah ben voilà, bien vu le filter(None, ...), du coup au résultat on est mieux :
Code : 5.40s, 886368Ko, python -c print("\n\n".join((["\n".join(sorted(filter(None, d.split("\n")), key=int)) for d in open("fichier").read().split("\n\n")]))) mais celui qui remporte la palme, pour peu qu'on commente le Console.ReadLine(); à la fin, c'est le code C# de Booster2000 : Code : 1.16s, 1077472Ko, mono booster2000.exe même meilleur que le code C, ça prend aussi plus de mémoire Edit: c'est un tri alphabétique en fait, ça ne fait pas le job comme attendu :> re-Edit: après modif les résultats pour le code C# sont ceux là : Code : 10.75s, 3987872Ko, mono booster2000.exe
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure. Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau, L'Art poétique) |
|
« Sujet précédent | Sujet suivant »
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
question du jour | gruik | 9 | 3,280 |
12-11-2013, 16h10 Dernier message: gruik |
|
Question pour la création de mon site... | Wabouz | 10 | 3,773 |
05-03-2013, 21h14 Dernier message: Wabouz |
Utilisateur(s) parcourant ce sujet : 1 visiteur(s)