IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Enigme (niveau avancé)


Sujet :

Langage Perl

  1. #21
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Avec l'autorisation de disedorgue, Mystery2.pm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    END { print "$D[$_] $C[$_]" for (1 .. $#D) }
    1
    Et puis, tant qu'à golfer, autant y aller franchement, avec une version qui ne perd pas de place dans @C et @D et économise (nombre_de_lignes_en_entrée - nombre_de_groupes) affectations à @D
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Taisha:~/perl/forum $ perl -0pe's/1/0/' Mystery2.pm > Mystery3.pm
    Taisha:~/perl/forum $ perl -mMystery3 -nlae '$C[($F[0]ne$D[-1]and$D[@D]=$F[0]),$#D]+=$F[1]'  input.dat
    a 9
    b 7
    c 9
    a 7
    x 7
    b 4
    Taisha:~/perl/forum $
    OK, je sors
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  2. #22
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Golf sans -mMystere?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Taisha:~/perl/forum $ perl -0pe'()while s/^(\S+) (\d+)\s+\g1 (\d+)/"$1 ".($2+$3)/msge' input.dat
    a 9
    b 7
    c 9
    a 7
    x 7
    b 4
    Taisha:~/perl/forum $
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  3. #23
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    S'il faut golfer, on peut remplacer ()while par 0while

    J'aime beaucoup cette solution.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  4. #24
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    S'il faut golfer, on peut remplacer ()while par 0while

    pour la peine, deux autres propositions spéciales Philou67430:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Taisha:~/perl/forum $ perl -nlae'END{$i=@g;$g[$i-1][0]eq$g[$i][0]and$g[$i-1][1]+=(delete$g[$i])->[1]while--$i;$_&&print"@$_"for@g}$g[@g]=[@F]' input.dat
    a 9
    b 7
    c 9
    a 7
    x 7
    b 4
    Taisha:~/perl/forum $ perl -nlae'END{$i=@g;$g[$i-1][0]eq$g[$i][0]and$g[$i-1][1]+=(splice@g,$i,1)->[1]while--$i;print"@$_"for@g}$g[@g]=[@F]' input.dat
    a 9
    b 7
    c 9
    a 7
    x 7
    b 4
    Taisha:~/perl/forum $
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  5. #25
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    S'il faut golfer, on peut remplacer ()while par 0while
    J'ajouterais qu'avec le while, il me semble que le /g n'est pas utile et peut être supprimé.

    On peut encore réduire ainsi à l'aide de l'assertion \K :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -0pe'0while s/^(\S+) \K(\d+)\s+\1 (\d+)/$2+$3/mse' input.dat
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  6. #26
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    J'ajouterais qu'avec le while, il me semble que le /g n'est pas utile et peut être supprimé.
    au prix d'une augmentation du nombre de passes, mais ce n'est pas relevant au golf
    On peut encore réduire ainsi à l'aide de l'assertion \K :
    Je n'arrivais pas à la retrouver... Merci! On devrait golfer plus souvent

    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  7. #27
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par cmcmc Voir le message
    au prix d'une augmentation du nombre de passes, mais ce n'est pas relevant au golf
    OK, on gagnerait peut-être le parsing de la regexp, mais je n'en suis même pas sûr

    Autre point : le ^ en début de regexp est également inutile (la discrimination "clé" / "valeur" se fait par le (\d+) ) ... mais c'est du pinaillage.

    Oui, on devrait golfer plus souvent...

    J'ai essayé de supprimer le while (avec \G), mais il semble qu'on le moteur de regexp n'accepte pas de matcher pour modification une partie de texte déjà substituée (voir doc perl_re sur \G).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  8. #28
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Autre point : le ^ en début de regexp est également inutile (la discrimination "clé" / "valeur" se fait par le (\d+) ) ... mais c'est du pinaillage.
    sauf qu'on n'a jamais interdit les étiquettes numériques (ni incidemment promis que les valeurs seraient entières, donc le (\d+) est en fait douteux )

    J'ai essayé de supprimer le while (avec \G)...
    pareil, sans succès pour les mêmes raisons, mais c'est ce qui m'a inspiré la version delete puis splice.
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  9. #29
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par cmcmc Voir le message
    sauf qu'on n'a jamais interdit les étiquettes numériques (ni incidemment promis que les valeurs seraient entières, donc le (\d+) est en fait douteux )
    Cela dit, on s'est fait plein d'autres promesses qui permettent de golfer ainsi, et notamment que les groupes contiennent des ids triés...

    La version splice ressemble à celle que j'avais proposée ? (je n'ai pas bien regardé dans le détail)
    Reste que la regexp me semble être im-par-able au golf.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  10. #30
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 276
    Points : 12 717
    Points
    12 717
    Par défaut
    Pour répondre aux différents MP que j'ai pu recevoir, j'ai juste posé le END{....} dans un Mystery2.pm juste par jeu (pour rester dans le contexte de la discussion), il est évident qu'un uniligne est amplement suffisant.
    Au départ, j'allais justement le poster comme un simple uniligne pour en montrer un sans le défaut du saut de ligne et le cas du fichier vide puis emporté par mon coté joueur...

    Sinon, cet uniligne n'est juste qu'une transposition d'une ligne awk que j'aurai faite si j'avais eu à résoudre ce genre de problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'END{for (i in C) print D[i],C[i]}$1 != D[A] {A++};{C[A]+=$2;D[A]=$1}' input.dat
    Cordialement.

  11. #31
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Cela dit, on s'est fait plein d'autres promesses qui permettent de golfer ainsi, et notamment que les groupes contiennent des ids triés...
    Ah non non non ! Ils ne sont pas triés. On groupe les items sur le fait qu'ils sont consécutifs avec la même étiquette. On émet les groupes dans l'ordre où on les rencontre dans la séquence d'entrée. On peut avoir plusieurs groupes avec la même étiquette.

    Incidemment je ne parviens pas à utiliser l'opérateur .. scalaire (ou ...) pour ce problème ou en tous cas pas de manière idiomatique. Si tu as une démo je suis preneur.

    La version splice ressemble à celle que j'avais proposée ? (je n'ai pas bien regardé dans le détail)
    Non

    Reste que la regexp me semble être im-par-able au golf.
    Oui c'est spectaculaire (mais c'aurait été considérablement plus lourd avec une regexp de valeur numérique générale...)

    update: ahhh, je savais bien qu'il y avait une autre bonne raison d'utiliser ^. Non seulement on n'impose pas de contrainte sur les étiquettes, mais en plus on peut traiter des valeurs numériques générales en remplaçant les \d+ par \S+
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  12. #32
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Citation Envoyé par cmcmc Voir le message
    Ah non non non ! Ils ne sont pas triés. On groupe les items sur le fait qu'ils sont consécutifs avec la même étiquette. On émet les groupes dans l'ordre où on les rencontre dans la séquence d'entrée. On peut avoir plusieurs groupes avec la même étiquette.
    Oui, je me suis mal exprimé, on s'est fait la promesse que les ids étaient regroupés
    Incidemment je ne parviens pas à utiliser l'opérateur .. scalaire (ou ...) pour ce problème ou en tous cas pas de manière idiomatique. Si tu as une démo je suis preneur.
    Je n'en ai pas (encore).
    update: ahhh, je savais bien qu'il y avait une autre bonne raison d'utiliser ^. Non seulement on n'impose pas de contrainte sur les étiquettes, mais en plus on peut traiter des valeurs numériques générales en remplaçant les \d+ par \S+
    En fait, je l'ai utilisé sur l'exemple en supprimant le ^, et à ma grande surprise, il fonctionnait parfaitement (et je ne suis pas allé plus loin).
    Mais c'est vrai, je n'ai pas essayé d'autres cas de tests.
    Cependant, il me semble que la seule "promesse" que les ids ne soient pas purement numérique suffit à satisfaire la suppression du ^ (d'ailleurs je ne comprends pas ta remarque : tu as utilisé \S+ pour les ids, par pour les valeurs numériques).
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  13. #33
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    d'ailleurs je ne comprends pas ta remarque : tu as utilisé \S+ pour les ids, par pour les valeurs numériques.
    Oui et c'était bête. Ce que je veux dire c'est que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -0pe'0while s/^(\S+) \K(\S+)\s+\1 (\S+)/$2+$3/mse' input.dat
    fonctionnera pour toute valeur capturée dans $2 et $3 et susceptible d'être interprétée comme une valeur numérique dans l'évaluation de $2+$3
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/05/2013, 11h52
  2. Réponses: 3
    Dernier message: 01/09/2009, 09h05
  3. Requête de niveau un peu avancé
    Par L'aigle de Carthage dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/05/2008, 09h18
  4. Réponses: 5
    Dernier message: 10/12/2007, 19h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo