• STATISTIQUES
  • Il y a eu un total de 2 membres et 14119 visiteurs sur le site dans les dernières 24h pour un total de 14 121 personnes!


    Membres: 2 433
    Discussions: 3 585
    Messages: 32 832
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [EN] This is legal
    Basic: 10, Realistic: 5, Programming: 1, Bonus: 11, SQL: 2, Encryption: 6, Application: 4, User Contributed: 3
    Challenges
    [FR] Zmaster
    Articles sur l'informatique, le hacking, le P2P, les divx, les astuces windows XP, les GSM, Emule, la cryptograph...
    Hacking
    [EN] xda-developers
    Très bon site pour les gros bidouilleurs de smartphone de windows à androïd et de Apple jusqu'...
    Phreaking
    [FR] Root-me
    Script: 5, Système: 20, Cracking: 16, Cryptanalyse: 17, Programmation: 8, Réaliste: 11, Réseau: 10, Stéganog...
    Challenges
    [FR] Microcontest
    Cryptographie: 7, Mathématiques: 8, Image Son Vidéo: 5, Intelligence artificielle: 3, Réseau: 2, Divers: 7, Phy...
    Challenges
    [FR] InfoMirmo
    Apprentissage de l'informatique par l'intermédiaire de challenges de sécurité. Venez app...
    Hacking
    [EN] Packet Storm
    Packet Storm est un site qui combine nouvelles de la sécurité informatique, téléchargemen...
    Vulnérabilités

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
question du jour 2 - le retour
30-05-2014, 16h24
Message : #1
gruik Hors ligne
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
2
78

483
7

438
73
94
7837
34

387
43874
387
3738738
3738

le but est de trier numériquement les lignes de chaque paragraphe indépendamment des autres :

Code :
2
78
456

7
483

34
73
94
438
7837

387
387
3738
43874
3738738

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)
+1 (1) -1 (1) Répondre
30-05-2014, 16h42 (Modification du message : 30-05-2014, 17h16 par notfound.)
Message : #2
notfound Hors ligne
#!/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 :

>>> awk 'BEGIN{RS=""}{number=split($0,TAB," ");print " ";asort(TAB);for (i=1; i <= number; i++) print TAB[i];}' /tmp/gruik
 
2
78
456
 
7
483
 
34
73
94
438
7837
 
387
387
3738
43874
3738738

 


Voilou
+1 (1) -1 (0) Répondre
30-05-2014, 16h47
Message : #3
eax64 Hors ligne
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 !
+1 (1) -1 (0) Répondre
30-05-2014, 16h55
Message : #4
fr0g Hors ligne
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 :

import sys
try:
    with open(sys.argv[1], "r") as f:
        for elem in f.read().split("\n\n"):
            elem = elem.split("\n")
            res = [int(x) for x in elem]
            res.sort()
            for item in res : print item
            print ""
except:
    print "error "
 
+1 (1) -1 (0) Répondre
30-05-2014, 17h09 (Modification du message : 30-05-2014, 17h09 par Dobry.)
Message : #5
Dobry Hors ligne
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 :

require 'set'
file = IO.readlines(ARGV[0])
arr = SortedSet.new
file.each_with_index do |line, i|
        arr << line.to_i if line.length != 1
        if line.length == 1 || i == file.length-1
                if arr.length != 0
                        arr.each do |e| puts e end
                        puts
                end
                arr = SortedSet.new
        end

end
 
Aestuārium Erudītiōnis

There are only two hard things in Computer Science: cache invalidation, naming things, and off-by-one errors.
+1 (1) -1 (0) Répondre
30-05-2014, 17h13 (Modification du message : 30-05-2014, 19h11 par gruik.)
Message : #6
gruik Hors ligne
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 :
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"))'

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)
+1 (2) -1 (1) Répondre
30-05-2014, 18h17
Message : #7
b0fh Hors ligne
Membre actif
*



Messages : 210
Sujets : 17
Points: 309
Inscription : Jul 2012
RE: question du jour 2 - le retour
Code HASKELL :

import Data.List
import Data.List.Split
import Data.Ord

main = interact $ unlines . concat . intersperse [""] . (map . sortBy . comparing) (read :: String -> Int) . splitWhen null . lines
 
+1 (1) -1 (0) Répondre
30-05-2014, 18h56 (Modification du message : 30-05-2014, 20h08 par octarin.)
Message : #8
octarin Hors ligne
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 :

#remplacer ici fichier par le nom du fichier qui contient le texte
print('\n\n'.join(['\n'.join(sorted(i.split('\n'), key=lambda x: int(x))) for i in open(fichier).read().split('\n\n')]))
 


Et celle en bash:
Code BASH :

while read i; do
    BUF="$BUF $i"
    if [[ $i = '' ]]; then
        echo $BUF \
        | tr ' ' '\n' \
        | sort -n
        echo
        BUF=""
    fi
done < fichier
 
Faire des mathématiques c’est donner le même nom à des choses différentes. -- Henri Poincaré
+1 (1) -1 (0) Répondre
30-05-2014, 21h16
Message : #9
skii Hors ligne
Newbie
*



Messages : 19
Sujets : 4
Points: 3
Inscription : Sep 2012
RE: question du jour 2 - le retour
Code :
croissant = []

fichier = open('toto.txt', 'r')

lire = fichier.readlines()
for line in lire:
    if line == "\n":
        croissant.sort()
        print  '\n'.join(['%s' % i for i in croissant]) + '\n'
        croissant = []
    else:
        croissant.append(int(line))
fichier.close()

Python pour ma pars, merci gruik et aryas pour l'aide !
+1 (1) -1 (0) Répondre
30-05-2014, 22h31 (Modification du message : 30-05-2014, 22h32 par Atlas.)
Message : #10
Atlas Hors ligne
Membre actif
*



Messages : 69
Sujets : 7
Points: 3
Inscription : Aug 2012
RE: question du jour 2 - le retour
+1 (1) -1 (0) Répondre
31-05-2014, 12h23 (Modification du message : 31-05-2014, 12h34 par notfound.)
Message : #11
notfound Hors ligne
#!/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 :

>>> wc -l fat_gruik
44977 fat_gruik
#A chaque fois, j'utiliserai la manipulation suivante : Vider le cache, executer le programme, regarde si le programme a tout mis en cache. Tout mettre en cache et relancer
>>> f="/tmp/fat_gruik"
>>> ./drop-from-pagecache $f #On demande au système de le drop
>>> ./is-in-pagecache $f #On vérifie et ok, le système l'a bien drop
Pagesize is: 4096 bytes.
'/tmp/fat_gruik': 0 pages out of 45 appear to be in pagecache
>>> cat fat_gruik > /dev/null
>>> ./is-in-pagecache $f  #Le fichier est mis en cache totalement
Pagesize is: 4096 bytes.
'/tmp/fat_gruik': 45 pages out of 45 appear to be in pagecache
 



Bon c'est parti :

Code BASH :

#Notfound
>>> time awk 'BEGIN{RS=""}{number=split($0,TAB," ");print " ";asort(TAB);for (i=1; i <= number; i++) print TAB[i];}' fat_gruik > /dev/null   #sans cache
real    0m0.106s

>>> time awk 'BEGIN{RS=""}{number=split($0,TAB," ");print " ";asort(TAB);for (i=1; i <= number; i++) print TAB[i];}' fat_gruik > /dev/null #avec cache
real    0m0.057s
 


Code BASH :

#fr0g
>>> time python frog.py fat_gruik > /dev/null #sans cache
real    0m0.180s

>>> time python frog.py fat_gruik > /dev/null #avec cache
real    0m0.116s
 


Code BASH :

#ex0ns
>>> time ruby1.9.1 exons.rb fat_gruik > /dev/null #sans cache
real    0m0.307s

>>> time ruby1.9.1 exons.rb fat_gruik > /dev/null #avec cache
real    0m0.264s
 


Code BASH :

#gruik
>>> time awk '/^$/ {close("sort -n"); print; next} {print | "sort -n"}' fat_gruik > /dev/null #sans cache
real    0m27.971s

>>> time awk '/^$/ {close("sort -n"); print; next} {print | "sort -n"}' fat_gruik > /dev/null #avec cache
real    0m28.460s

# PS : la solution en perl est fucked up, elle reprend a chaque fois la paragraphe du haut et l'ajoute au reste
 


Code BASH :

#octarin
>>> time bash octarin > /dev/null #sans cache
real    0m23.968s

>>> time bash octarin > /dev/null #avec cache
real    0m22.238s
 


Code BASH :

#skii
>>> time python ski.py >/dev/null #sans cache
real    0m0.199s

>>> time python ski.py >/dev/null #avec cache
real    0m0.118s
 


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.
+1 (3) -1 (0) Répondre
31-05-2014, 16h50
Message : #12
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: question du jour 2 - le retour
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)
+1 (2) -1 (1) Répondre
31-05-2014, 17h16 (Modification du message : 31-05-2014, 20h04 par Booster2ooo.)
Message : #13
Booster2ooo Hors ligne
Contributeur
*****



Messages : 165
Sujets : 14
Points: 63
Inscription : Aug 2011
RE: question du jour 2 - le retour
Aller, pour le fun,

C#

Code CSHARP :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace NPNQDJ
{
    class Program
    {
        static void Main()
        {
            string fileName = "inputFile.txt";
            string fullPath = AppDomain.CurrentDomain.BaseDirectory + fileName;
            if (File.Exists(fullPath))
            {
                var fileContent = File.ReadAllText(fullPath, Encoding.ASCII);
                List<String> result = new List<String>();
                fileContent.Split(new string[] { System.Environment.NewLine + System.Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).ToList().ForEach(
                    f => result.AddRange(
                            f.Split(new string[] { System.Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).OrderBy(o => int.Parse(o)).ToList().Concat(new string[] { "\r" })
                        )
                );
                result.ForEach(f => Console.WriteLine(f));
            }
            //Console.ReadLine();
        }
    }
}
 
+1 (1) -1 (0) Répondre
31-05-2014, 17h58
Message : #14
eax64 Hors ligne
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 :
Code :
Traceback (most recent call last):
  File "<string>", line 1, in <module>
ValueError: invalid literal for int() with base 10: ''


Ha ouais mais faut pas mettre de \n la fin du fichier de data, sinon ça casse tout. Smile

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. Smile
+1 (1) -1 (0) Répondre
31-05-2014, 18h14 (Modification du message : 31-05-2014, 18h44 par gruik.)
Message : #15
gruik Hors ligne
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)
+1 (0) -1 (1) Répondre


Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
  question du jour gruik 9 2,098 12-11-2013, 16h10
Dernier message: gruik
  Question pour la création de mon site... Wabouz 10 2,446 05-03-2013, 21h14
Dernier message: Wabouz

Atteindre :


Utilisateur(s) parcourant ce sujet : 6 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut