=== txt ===
15: yep (2)
14: a b cdde (5)
13: dqgdqg ... (0)
12: dhhh h (12)
11: dd d (8)
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 :))
Merci et bon jeu !!
le résultat ici doit être ceci :
=== txt ===
6: dfq d (1000)
12: dhhh h (12)
11: dd d (8)
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 ===
function cmp($a, $b) { preg_match("/([0-9]+).[rn]*$/", $a, $ma); preg_match("/([0-9]+).[rn]*$/", $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]+))[rn]+$/", $a, $ma); preg_match("/^([0-9]+).*(([0-9]+))[rn]+$/", $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>
Le 04/07/2008 13:13, j'écrivais :
function cmp($a, $b)
{
preg_match("/([0-9]+).[rn]*$/", $a, $ma);
preg_match("/([0-9]+).[rn]*$/", $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]+))[rn]+$/", $a, $ma);
preg_match("/^([0-9]+).*(([0-9]+))[rn]+$/", $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>
function cmp($a, $b) { preg_match("/([0-9]+).[rn]*$/", $a, $ma); preg_match("/([0-9]+).[rn]*$/", $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]+))[rn]+$/", $a, $ma); preg_match("/^([0-9]+).*(([0-9]+))[rn]+$/", $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>
Pierre Maurette
Olivier Miakinen, le 06/07/2008 a écrit :
[...]
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.
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
Olivier Miakinen, le 06/07/2008 a écrit :
[...]
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.
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.
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é.
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.
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.
function cmp($a, $b) { preg_match("/^s*([0-9]+).*(([0-9]+))s*[rn]+$/", $a, $ma); preg_match("/^s*([0-9]+).*(([0-9]+))s*[rn]+$/", $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).
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.
Malheureusement(!): // ... return $mb[2] - $ma[2] or $mb[1] - $ma[1];; ne fonctionne pas (forçage des !=0 en 1)
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).
J'ai bricolé les regex pour se protéger d'espaces et tab, surtout en tête de ligne.
Oui, ça c'est bien.
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.>
Le 06/07/2008 09:28, Pierre Maurette a écrit :
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é.
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.
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.
function cmp($a, $b) {
preg_match("/^s*([0-9]+).*(([0-9]+))s*[rn]+$/", $a, $ma);
preg_match("/^s*([0-9]+).*(([0-9]+))s*[rn]+$/", $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).
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.
Malheureusement(!):
// ...
return $mb[2] - $ma[2] or $mb[1] - $ma[1];;
ne fonctionne pas (forçage des !=0 en 1)
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).
J'ai bricolé les regex pour se protéger d'espaces et tab, surtout en
tête de ligne.
Oui, ça c'est bien.
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.>
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é.
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.
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.
function cmp($a, $b) { preg_match("/^s*([0-9]+).*(([0-9]+))s*[rn]+$/", $a, $ma); preg_match("/^s*([0-9]+).*(([0-9]+))s*[rn]+$/", $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).
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.
Malheureusement(!): // ... return $mb[2] - $ma[2] or $mb[1] - $ma[1];; ne fonctionne pas (forçage des !=0 en 1)
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).
J'ai bricolé les regex pour se protéger d'espaces et tab, surtout en tête de ligne.
Oui, ça c'est bien.
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.>
loiseauthierry
Thierry Loiseau wrote:
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 !
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 !
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 !
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 !
Ok, mais ça ne change pas grand chose.
Merci et bonne continuation !
Continuer quoi ? La solution donnée ne te convient pas ?
Pour mémoire, en combinant les bonnes idées des uns et des autres, cela devrait donner au final :
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 !
Ok, mais ça ne change pas grand chose.
Merci et bonne continuation !
Continuer quoi ? La solution donnée ne te convient pas ?
Pour mémoire, en combinant les bonnes idées des uns et des autres, cela
devrait donner au final :
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 !
Ok, mais ça ne change pas grand chose.
Merci et bonne continuation !
Continuer quoi ? La solution donnée ne te convient pas ?
Pour mémoire, en combinant les bonnes idées des uns et des autres, cela devrait donner au final :