Welcome to Coding : Sécurité Programmation Réseaux

Search   in  

 Create an Account Home | Submit News Your Account Content | Topics | Top 10  


Accueil
· Home
· Listing des Articles
· Top 10
· Repository des Exploits

Les sujets / parties
· C / C ++
· Visual Basic
· Asm
· Reseaux
· Java
· Securite
· Divers

Utile
· Listing des Articles

· Telecharger
· Le Forum
· Liens
· Proposer un article

Top20 des Downloads
· 1: Etude des reseaux generalites et protocoles
· 2: Cheval de troie en VB avec sources
· 3: Netcat 1.1
· 4: Keylogger
· 5: Etudes des reseaux hauts debits architectures et protocoles
· 6: Ecoute de port
· 7: Etude du Smart Spoofing
· 8: Win Packet Capture Utils
· 9: Tutorial on Traffic Interception on Switched Lan using ARP spoofing
· 10: Cours de C

User Info
Welcome, Anonymous
Nickname
Password
(Register)
Membership:
Latest: longjohn
New Today: 0
New Yesterday: 2
Overall: 2216

People Online:
Visitors: 25
Members: 0
Total: 25

  
Coding : Sécurité Programmation Réseaux: Forums

Coding :: View topic - Liste a re-ordonner !
 Forum FAQForum FAQ   SearchSearch   UsergroupsUsergroups   ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Liste a re-ordonner !
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Coding Forum Index -> Php
View previous topic :: View next topic  
Author Message
Thierry Loiseau
Guest





PostPosted: Fri Jul 04, 2008 11:10 pm    Post subject: Liste a re-ordonner ! Reply with quote

Bonjour, petit devoir de vacacances :)

Soit un fichier text contenant par exemple ceci :

=== txt ===
15: yep (2)
14: a b cdde (5)
13: dqgdqg ... (0)
12: dhhh h (12)
11: dd d (Cool
10: ---- dfgs ---- (0)
9: [qdfdd]hsfhfh (5)
8: ddfsqdfsdfs (2)
6: dfq d (1000)
5: M()\ (5)
4: dfqd'/p d'dfd (2)
3: pabcqd qdfqd (2)
2: Pddcé gvpt (7)
1: A l'abcd (2)
===/txt ===

Comment faire pour réordonner ceci, réenregistrer dans un autre fichier
texte de telle sorte que la première ligne représente le numéro le plus
grand qui se trouve entre parenthèses et en sous-ordre, le numéro se
trouvant en début de la ligne ?

Attention : ici il n'y a que 14 ligne (il manque le numéro 7)

Le programme doit être le plus court et le plus lisible possible Smile)

Merci et bon jeu !!

le résultat ici doit être ceci :

=== txt ===
6: dfq d (1000)
12: dhhh h (12)
11: dd d (Cool
2: Pddcé gvpt (7)
14: a b cdde (5)
9: [qdfdd]hsfhfh (5)
5: M()\ (5)
15: yep (2)
8: ddfsqdfsdfs (2)
4: dfqd'/p d'dfd (2)
3: pabcqd qdfqd (2)
1: A l'abcd (2)
13: dqgdqg ... (0)
10: ---- dfgs ---- (0)
===/txt ===
Back to top
Olivier Miakinen
Guest





PostPosted: Fri Jul 04, 2008 11:10 pm    Post subject: Re: Liste a re-ordonner ! Reply with quote

Le 04/07/2008 11:31, Thierry Loiseau a écrit :
Quote:

[...]

Comment faire pour réordonner ceci, réenregistrer dans un autre fichier
texte de telle sorte que la première ligne représente le numéro le plus
grand qui se trouve entre parenthèses et en sous-ordre, le numéro se
trouvant en début de la ligne ?

J'y étais presque, avec un appel à la commande unix sort :
$ sort -t '(' -nr -k 2 -k 1 input.txt -o output.txt

La même chose en plus verbeux mais plus lisible :
$ sort --field-separator='(' --numeric-sort --reverse --key=2 --key=1 \
input.txt -o output.txt

Il aurait alors suffi de l'appeler par un system(), mais malheureusement
ça ne marche pas à cause des parenthèses de la ligne 5. Je vais donc le
faire directement en PHP.
Back to top
Olivier Miakinen
Guest





PostPosted: Fri Jul 04, 2008 11:10 pm    Post subject: Re: Liste a re-ordonner ! Reply with quote

Le 04/07/2008 11:31, Thierry Loiseau a écrit :
Quote:

Comment faire pour réordonner ceci, réenregistrer dans un autre fichier
texte de telle sorte que la première ligne représente le numéro le plus
grand qui se trouve entre parenthèses et en sous-ordre, le numéro se
trouvant en début de la ligne ?

function cmp($a, $b)
{
preg_match("/([0-9]+).[\r\n]*$/", $a, $ma);
preg_match("/([0-9]+).[\r\n]*$/", $b, $mb);
return $mb[1] - $ma[1]; // b - a car ordre inverse
}
$contenu = file($inputfile);
usort($contenu, 'cmp');
file_put_contents($outputfile, implode("\n", $contenu)."\n");


Note que tu pourrais utiliser l'option FILE_IGNORE_NEW_LINES pour la
fonction file() et du coup supprimer le [\r\n]* des regexp, mais il
paraît qu'il peut y avoir des problèmes si tu lis un fichier en format
DOS sur un Unix ou le contraire. Inversement, il faudra peut-être
adapter le "\n" au moment de la réécriture.
Back to top
Olivier Miakinen
Guest





PostPosted: Fri Jul 04, 2008 11:10 pm    Post subject: Re: Liste a re-ordonner ! Reply with quote

Le 04/07/2008 12:52, j'ai écrit n'importe quoi :
Quote:

function cmp($a, $b)
{
preg_match("/([0-9]+).[\r\n]*$/", $a, $ma);
preg_match("/([0-9]+).[\r\n]*$/", $b, $mb);
return $mb[1] - $ma[1]; // b - a car ordre inverse
}
$contenu = file($inputfile);
usort($contenu, 'cmp');
file_put_contents($outputfile, implode("\n", $contenu)."\n");

[...] Inversement, il faudra peut-être
adapter le "\n" au moment de la réécriture.

Mais non, justement ! Il vaut mieux garder les \r ou \n tels
qu'ils existent, et ne surtout pas en rajouter !


Donc :

function cmp($a, $b)
{
preg_match("/([0-9]+).[\r\n]*$/", $a, $ma);
preg_match("/([0-9]+).[\r\n]*$/", $b, $mb);
return $mb[1] - $ma[1]; // b - a car ordre inverse
}
$contenu = file($inputfile);
usort($contenu, 'cmp');
file_put_contents($outputfile, implode('', $contenu));


(Est-il besoin de préciser que je n'ai pas testé ?)
Back to top
Pierre Maurette
Guest





PostPosted: Sat Jul 05, 2008 4:10 am    Post subject: Re: Liste a re-ordonner ! Reply with quote

(supersedes <mn.231f7d8702db0a92.79899@wanadoo.fr>)

Olivier Miakinen, le 04/07/2008 a écrit :
Quote:
Le 04/07/2008 11:31, Thierry Loiseau a écrit :

Comment faire pour réordonner ceci, réenregistrer dans un autre fichier
texte de telle sorte que la première ligne représente le numéro le plus
grand qui se trouve entre parenthèses et en sous-ordre, le numéro se
trouvant en début de la ligne ?

function cmp($a, $b)
{
preg_match("/([0-9]+).[\r\n]*$/", $a, $ma);
preg_match("/([0-9]+).[\r\n]*$/", $b, $mb);
return $mb[1] - $ma[1]; // b - a car ordre inverse
}
$contenu = file($inputfile);
usort($contenu, 'cmp');
file_put_contents($outputfile, implode("\n", $contenu)."\n");


Note que tu pourrais utiliser l'option FILE_IGNORE_NEW_LINES pour la
fonction file() et du coup supprimer le [\r\n]* des regexp, mais il
paraît qu'il peut y avoir des problèmes si tu lis un fichier en format
DOS sur un Unix ou le contraire. Inversement, il faudra peut-être
adapter le "\n" au moment de la réécriture.

J'ai du mal à voir comment ça marche. Je vais faire tourner le truc,
puisque je me remets à faire un peu de PHP, donc que je traîne dans le
coin.

Puisque je corrige, j'ajoute:
J'ai quand même fait tourner le truc, et effectivement, il me semble
que ça ne trie pas sur le second niveau. A moins que je n'ai pas pigé
l'énoncé...

En python, pas particulièrement compact, on doit pouvoir faire proche
en PHP:

tri1 = lambda x, y: cmp(int(y.split('(')[-1].rstrip()[:-1]),
int(x.split('(')[-1].rstrip()[:-1]))
tri2 = lambda x, y: cmp(int(y.split(':')[0]), int(x.split(':')[0]))
tri = lambda x, y: tri1(x, y) or tri2(x, y)

s = open('in.txt', 'r').readlines().sort(cmp=tri)
open('out.txt', 'w').write(''.join(s))

Correction:

....

s = open('in.txt', 'r').readlines()
s.sort(cmp=tri)
open('out.txt', 'w').write(''.join(s))

--
Pierre Maurette
Back to top
Bruno Desthuilliers
Guest





PostPosted: Sat Jul 05, 2008 4:10 am    Post subject: Re: Liste a re-ordonner ! Reply with quote

Pierre Maurette a écrit :
(snip)
Quote:
En python, pas particulièrement compact, on doit pouvoir faire proche en
PHP:

(snip code Python)


Ah woua l'autre, hé, et moi que j'ai répondu en premier avec une
splendide solution Python mon post il est pas passé ???

<meta>
Allo les modérateurs ? Ma soluce s'est perdue dans l'ether(pas net), ou
bien c'est du favoritisme éhonté ?
</meta>

(non, pas taper...)
Back to top
Thierry Loiseau
Guest





PostPosted: Sat Jul 05, 2008 8:11 am    Post subject: Re: Liste a re-ordonner ! Reply with quote

Thierry Loiseau <loiseauthierry@free.fr> wrote:

Quote:
Bonjour, petit devoir de vacacances Smile

Merci à vous de vous prêter au jeu par vos cogitations !!!
(mais je ne connais pas de bonnes solutions)

:((

Thierry
Back to top
Thierry Loiseau
Guest





PostPosted: Sat Jul 05, 2008 11:10 pm    Post subject: Re: Liste a re-ordonner ! Reply with quote

Thierry Loiseau <loiseauthierry@free.fr> wrote:

Quote:
Merci à vous de vous prêter au jeu par vos cogitations !!!
(mais je ne connais pas de bonnes solutions)

.... bon je n'y arrive pas ! Pas facile, je n'ai pas PHP5 à la maison,
aussi...

Comment, plutôt que de créer un fichier de sortie, afficher le résultat
à l'écran !

Bonne fin de nuit :)

zzzzZZZzzz
--
* * __*__ *
* * * -----oOOo---°O°---oOOo------ * *
<http://astrophoto.free.fr> *
* * -------- oOOo oOOo -------- *
Back to top
SAM
Guest





PostPosted: Sun Jul 06, 2008 4:10 am    Post subject: Re: Liste a re-ordonner ! Reply with quote

Thierry Loiseau a écrit :
Quote:

Comment, plutôt que de créer un fichier de sortie, afficher le résultat
à l'écran !

Bonne fin de nuit Smile

Heu, après la sieste, j'imagine qu'on fait qque chose comme :

function cmp($a, $b)
{
preg_match("/([0-9]+).[\r\n]*$/", $a, $ma);
preg_match("/([0-9]+).[\r\n]*$/", $b, $mb);
return $mb[1] - $ma[1]; // b - a car ordre inverse
}
$contenu = file($inputfile);
usort($contenu, 'cmp');

$contenu = explode(/\n\r/, $contenu); // tableau (array) des lignes
foreach($contenu as $ligne) echo $ligne.'<br>';

<http://fr.php.net/foreach>
<http://fr.php.net/manual/fr/function.explode.php>

Comme Olivier je te laisse tester Wink
En particlier, peut-être faut-il : explode("\n\r", $contenu);


Peut-être aussi tout simplement :


<?php
$contenu = file($inputfile);
usort($contenu, 'cmp');
printf($contenu);
?>


<http://fr.php.net/manual/fr/function.printf.php>
avec ses 72351 fonctions, ce php nous offre trop de possibilités.

Autant, echo ou print feront le job ?

--
sm
Back to top
Jacques Haddi
Guest





PostPosted: Sun Jul 06, 2008 8:10 am    Post subject: Re: Liste a re-ordonner ! Reply with quote

Quote:
Comment faire pour réordonner ceci, réenregistrer dans un autre fichier
texte de telle sorte que la première ligne représente le numéro le plus
grand qui se trouve entre parenthèses et en sous-ordre, le numéro se
trouvant en début de la ligne ?

je propose :

<?
function compare($a, $b)
{
ereg("\([0-9]+\)","$a",$ta);
ereg("\([0-9]+\)","$b",$tb);
$a2=str_replace(")","",str_replace("(","",$ta[count($ta)-1]));
$b2=str_replace(")","",str_replace("(","",$tb[count($tb)-1]));
if ($a2==$b2)
{
$a1=intval($a);
$b1=intval($b);
if($a1==$b1)
{
return 0;
}
else
{
return ($a1 > $b1) ? -1 : 1;
}
}
else
{
return ($a2 > $b2) ? -1 : 1;
}
}
usort ($tab=file("fichier_texte.txt"), "compare");
fputs(fopen("fichier_texte_2.txt","w"), implode("", $tab));
?>

J.H.
Back to top
Olivier Miakinen
Guest





PostPosted: Sun Jul 06, 2008 1:10 pm    Post subject: Re: Liste a re-ordonner ! Reply with quote

Le 04/07/2008 13:13, j'écrivais :
Quote:

function cmp($a, $b)
{
preg_match("/([0-9]+).[\r\n]*$/", $a, $ma);
preg_match("/([0-9]+).[\r\n]*$/", $b, $mb);
return $mb[1] - $ma[1]; // b - a car ordre inverse
}
$contenu = file($inputfile);
usort($contenu, 'cmp');
file_put_contents($outputfile, implode('', $contenu));


(Est-il besoin de préciser que je n'ai pas testé ?)

Il est visible que je n'avais pas testé.

Je viens d'installer WAMPSERVER sur ma machine, et du coup j'ai pu
tester... eh bien ça ne marche pas. Plus exactement, je me suis aperçu
qu'une hypothèse que je faisais était fausse : celle selon laquelle
le tri ne changerait pas pour les lignes ayant le même numéro entre
parenthèses.

Par ailleurs, j'avais mal lu l'énoncé demandant explicitement que le
premier numéro de la ligne serve de sous-ordre. Toutes mes excuses en
particulier à Pierre Maurette qui, lui, l'avait bien compris.

Du coup, c'est très simple, il suffit de corriger la fonction cmp comme
ceci :
------------------------------------------------------------------------
function cmp($a, $b)
{
preg_match("/^([0-9]+).*\(([0-9]+)\)[\r\n]+$/", $a, $ma);
preg_match("/^([0-9]+).*\(([0-9]+)\)[\r\n]+$/", $b, $mb);
if ($mb[2] != $ma[2]) return $mb[2] - $ma[2];
return $mb[1] - $ma[1];
}
------------------------------------------------------------------------
Ici, je lis les deux nombres, puis je trie selon le deuxième s'il
diffère entre deux lignes, selon le premier sinon. Bon, d'accord,
c'est un peu moins lisible, mais un petit commentaire bien placé peut
aider celui qui aura à relire le code dans un an.


<meta pour Bruno Desthuilliers>
Moi j'ai envoyé un article en réponse à Pierre, article qui n'est jamais
arrivé dans la boîte des modérateurs. Mais en ce qui te concerne, si par
hasard le tien avait été refusé, tu n'aurais eu aucune chance d'avoir le
message de refus à cause de ton adresse antispam.
</meta>
Back to top
Pierre Maurette
Guest





PostPosted: Sun Jul 06, 2008 6:10 pm    Post subject: Re: Liste a re-ordonner ! Reply with quote

Olivier Miakinen, le 06/07/2008 a écrit :

[...]

Quote:
Je viens d'installer WAMPSERVER sur ma machine, et du coup j'ai pu
tester...

Pourquoi pas en CLI ? Pour reprendre le langage indépendamment du buzz
HTML, je me suis fait un petit environnement CLI Eclipse/PHPEclipse,
sous Linux et Windows, je n'ai pas encore fait tourner le debugger,
mais c'est bien pratique. Un peu lourd, mais Eclipse est pratiquement
toujours lancé sur mes machines.
Sinon, PSPad + console interne, ou PSPAd + console externe. Ou PHPEdit.


Quote:
------------------------------------------------------------------------
function cmp($a, $b)
{
preg_match("/^([0-9]+).*\(([0-9]+)\)[\r\n]+$/", $a, $ma);
preg_match("/^([0-9]+).*\(([0-9]+)\)[\r\n]+$/", $b, $mb);
if ($mb[2] != $ma[2]) return $mb[2] - $ma[2];
return $mb[1] - $ma[1];
}
------------------------------------------------------------------------

function cmp($a, $b) {
preg_match("/^\s*([0-9]+).*\(([0-9]+)\)\s*[\r\n]+$/", $a, $ma);
preg_match("/^\s*([0-9]+).*\(([0-9]+)\)\s*[\r\n]+$/", $b, $mb);
return $mb[2] != $ma[2] ? $mb[2] - $ma[2] : $mb[1] - $ma[1];
}

Malheureusement(!):
// ...
return $mb[2] - $ma[2] or $mb[1] - $ma[1];;
ne fonctionne pas (forçage des !=0 en 1)

Il resterait donc:

// ...
$r = $mb[2] - $ma[2] or $r = $mb[1] - $ma[1];
return $r;

J'ai bricolé les regex pour se protéger d'espaces et tab, surtout en
tête de ligne.

N'existe pas une fonction de pre-compilation des regex (puisqu'on a
deux fois le même) ?

--
Pierre Maurette
Back to top
Olivier Miakinen
Guest





PostPosted: Mon Jul 07, 2008 4:10 am    Post subject: Re: Liste a re-ordonner ! Reply with quote

Le 06/07/2008 09:28, Pierre Maurette a écrit :
Quote:

Je viens d'installer WAMPSERVER sur ma machine, et du coup j'ai pu
tester...

Pourquoi pas en CLI ?

Euh... ça veut dire en ligne de commande, c'est ça ? Il me semble avoir
déjà lu cette abréviation mais je n'en suis pas sûr.

Si c'était bien ça, il est possible que cela marche aussi, je n'ai pas
encore essayé.

Quote:
Pour reprendre le langage indépendamment du buzz
HTML, je me suis fait un petit environnement CLI Eclipse/PHPEclipse,
sous Linux et Windows, je n'ai pas encore fait tourner le debugger,
mais c'est bien pratique. Un peu lourd, mais Eclipse est pratiquement
toujours lancé sur mes machines.

J'ai déjà utilisé Eclipse une fois, en cours Java, mais je n'avais pas
beaucoup aimé. Il faut dire que je n'avais pas eu le choix de l'éditeur
et qu'il me manquait la puissance de vim.

Quote:
Sinon, PSPad + console interne, ou PSPAd + console externe. Ou PHPEdit.

Je ne connais pas tout ça. J'essaierai peut-être un jour, si j'en ai
l'occasion -- et l'envie.

Quote:
function cmp($a, $b) {
preg_match("/^\s*([0-9]+).*\(([0-9]+)\)\s*[\r\n]+$/", $a, $ma);
preg_match("/^\s*([0-9]+).*\(([0-9]+)\)\s*[\r\n]+$/", $b, $mb);

Quoique ce ne soit pas explicitement demandé, les \s* sont une bonne
idée (surtout en fin de ligne où on ne les voit pas forcément).

Quote:
return $mb[2] != $ma[2] ? $mb[2] - $ma[2] : $mb[1] - $ma[1];

Oui, si tu veux. Tu gagnes une ligne, mais certains trouveront peut-être
moins lisible la syntaxe avec l'opérateur ternaire. Pour moi les deux se
valent.

Quote:
Malheureusement(!):
// ...
return $mb[2] - $ma[2] or $mb[1] - $ma[1];;
ne fonctionne pas (forçage des !=0 en 1)

:-D

Quote:
Il resterait donc:

// ...
$r = $mb[2] - $ma[2] or $r = $mb[1] - $ma[1];
return $r;

Personnellement je n'aime pas. Aller définir et utiliser une variable
juste pour contourner le problème d'utilisation de « or », alors que
rien ne nous oblige à utiliser ce « or », ça me semble aller au devant
des ennuis pour rien : on perd en lisibilité, et si un jour quelqu'un
croit pouvoir améliorer ce code en virant la variable cela créera un
vrai bug (celui que tu as signalé juste au dessus).

Quote:
J'ai bricolé les regex pour se protéger d'espaces et tab, surtout en
tête de ligne.

Oui, ça c'est bien.

Quote:
N'existe pas une fonction de pre-compilation des regex (puisqu'on a
deux fois le même) ?

Même réponse que Mickaël :

<cit. http://fr2.php.net/manual/fr/intro.pcre.php>
Note: Cette extension maintient un cache global par thread des
expressions rationnelles compilées (jusqu'à 4096).
</cit.>
Back to top
Mickaël Wolff
Guest





PostPosted: Mon Jul 07, 2008 4:10 am    Post subject: Re: Liste a re-ordonner ! Reply with quote

Pierre Maurette a écrit :
Quote:
N'existe pas une fonction de pre-compilation des regex (puisqu'on a deux
fois le même) ?

PHP le fait. Lorsque tu utilises une regex, PHP la compile et stocke
la version compilée dans un tableau.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Back to top
Thierry Loiseau
Guest





PostPosted: Sat Jul 12, 2008 8:10 am    Post subject: Re: Liste a re-ordonner ! Reply with quote

Thierry Loiseau <loiseauthierry@free.fr> wrote:

Quote:
Comment faire pour réordonner ceci, réenregistrer dans un autre fichier
texte de telle sorte que la première ligne représente le numéro le plus
grand qui se trouve entre parenthèses et en sous-ordre, le numéro se
trouvant en début de la ligne ?

J'ai oublié de préciser : le sous-ordre est unique, il n'y aura pas de
"15" par exemple deux fois !

Merci et bonne continuation !

Thierry
--
* * __*__ *
* * * -----oOOo---°O°---oOOo------ * *
<http://astrophoto.free.fr> *
* * -------- oOOo oOOo -------- *
Back to top
Display posts from previous:   
Post new topic   Reply to topic    Coding Forum Index -> Php All times are GMT + 10 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

Powered by phpBB © 2001, 2005 phpBB Group
PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Page Generation: 0.45 Seconds