Calculs sur un TdT avec contraintes

Calculs sur un TdT avec contraintes - Perl - Programmation

Marsh Posté le 13-09-2012 à 15:53:36    

Bonjour,
 
voilà un problème qui pour moi est complexe, j'arrive à résoudre une partie mais le reste j'ai du mal.
 
Je m'explique:
 
J'ai un fichier "finlande1_oa_derniers_matchs.txt"(dans le spoiler) que j'ai "spliter" dans le tableau @TdT1. Ce que je voudrais faire c'est récupérer la somme des deuxièmes champs des n premiers matchs de chaque équipes. Par exemple pour n=5, je voudrais que mon script me construise automatiquement le tableau @goals_for_home =(12, 4, 8, 9, 10, 1, 3, 12, 8, 7, 19, 7), où 12 est la somme des 2ème champs pour les 5 premières lignes où apparait HJK, ensuite 4 est la somme des 2ème champs pour les 5 premières lignes où apparait Haka .... etc. J'aimerais également que @goals_for_home soit contruit si jamais le fichier "finlande1_oa_derniers_matchs.txt"est de la forme (en fait j'aimerais que au plus 5 matchs soient pris en compte) suivante:
 
HJK ;2;0;JJK Jyv‰skyl‰ ;2012-08-18
HJK ;3;3;VPS  ;2012-08-04
HJK ;1;0;Haka ;2012-07-21
Haka ;0;3;Lahti ;2012-08-25
Haka ;0;2;Inter Turku ;2012-08-05
Honka ;1;2;VPS  ;2012-08-27
Honka ;2;2;Haka ;2012-08-12
Honka ;1;0;HJK ;2012-07-28
Inter Turku ;2;0;Lahti ;2012-05-30
Inter Turku ;2;0;VPS  ;2012-09-03
JJK Jyv‰skyl‰ ;5;0;Haka ;2012-09-02
JJK Jyv‰skyl‰ ;0;3;MyPa ;2012-08-11
Jaro ;0;3;MyPa ;2012-09-02
Jaro ;0;1;TPS ;2012-08-19
Jaro ;0;3;JJK Jyv‰skyl‰ ;2012-08-05
KuPS ;2;3;JJK Jyv‰skyl‰ ;2012-08-26
KuPS ;1;0;Lahti ;2012-08-18
KuPS ;0;2;Honka ;2012-08-05
Lahti ;3;2;Honka ;2012-08-31
Lahti ;3;0;HJK ;2012-08-12
Mariehamn ;2;0;KuPS ;2012-09-02
Mariehamn ;2;0;Jaro ;2012-08-11
Mariehamn ;3;3;JJK Jyv‰skyl‰ ;2012-07-22
MyPa ;1;1;TPS ;2012-08-26
MyPa ;2;1;Mariehamn ;2012-08-20
TPS ;9;2;Haka ;2012-08-22
TPS ;1;2;HJK ;2012-09-02
VPS ;2;1;Haka ;2012-08-19
VPS ;0;1;KuPS ;2012-08-12
VPS ;2;0;MyPa ;2012-07-29
 
 
Fichier "finlande1_oa_derniers_matchs.txt"

Spoiler :

HJK ;5;1;Mariehamn ;2012-08-26
HJK ;2;0;JJK Jyv‰skyl‰ ;2012-08-18
HJK ;3;3;VPS  ;2012-08-04
HJK ;1;0;Haka ;2012-07-21
HJK ;1;1;MyPa ;2012-07-02
HJK ;0;0;TPS ;2012-06-25
HJK ;2;0;Lahti ;2012-05-27
HJK ;3;0;Honka ;2012-05-21
HJK ;2;0;KuPS ;2012-05-12
HJK ;2;1;Inter Turku ;2012-05-06
HJK ;4;1;Jaro ;2012-04-23
HJK ;3;1;Mariehamn ;2012-04-15
Haka ;0;3;Lahti ;2012-08-25
Haka ;0;2;Inter Turku ;2012-08-05
Haka ;0;2;KuPS ;2012-07-29
Haka ;3;1;MyPa ;2012-07-15
Haka ;1;0;TPS ;2012-07-02
Haka ;3;1;JJK Jyv‰skyl‰ ;2012-06-25
Haka ;0;1;VPS  ;2012-06-16
Haka ;2;1;Honka ;2012-05-27
Haka ;0;1;HJK ;2012-05-16
Haka ;4;1;Jaro ;2012-05-05
Haka ;0;2;Mariehamn ;2012-04-22
Honka ;1;2;VPS  ;2012-08-27
Honka ;2;2;Haka ;2012-08-12
Honka ;1;0;HJK ;2012-07-28
Honka ;2;0;Jaro ;2012-07-15
Honka ;2;2;Mariehamn ;2012-07-03
Honka ;3;2;Lahti ;2012-06-25
Honka ;2;1;Inter Turku ;2012-06-16
Honka ;1;0;KuPS ;2012-05-24
Honka ;2;1;MyPa ;2012-05-16
Honka ;0;2;TPS ;2012-05-05
Honka ;0;2;JJK Jyv‰skyl‰ ;2012-04-22
Honka ;1;1;VPS  ;2012-04-15
Inter Turku ;2;0;Lahti ;2012-05-30
Inter Turku ;2;0;VPS  ;2012-09-03
Inter Turku ;3;1;Jaro ;2012-08-26
Inter Turku ;2;1;Honka ;2012-08-18
Inter Turku ;0;3;Mariehamn ;2012-07-30
Inter Turku ;3;2;JJK Jyv‰skyl‰ ;2012-07-15
Inter Turku ;2;0;HJK ;2012-07-07
Inter Turku ;1;1;VPS  ;2012-06-25
Inter Turku ;1;1;Jaro ;2012-06-19
Inter Turku ;4;1;Haka ;2012-05-24
Inter Turku ;2;1;KuPS ;2012-05-16
Inter Turku ;2;1;JJK Jyv‰skyl‰ ;2012-05-12
Inter Turku ;2;0;MyPa ;2012-04-22
JJK Jyv‰skyl‰ ;5;0;Haka ;2012-09-02
JJK Jyv‰skyl‰ ;0;3;MyPa ;2012-08-11
JJK Jyv‰skyl‰ ;2;1;TPS ;2012-07-29
JJK Jyv‰skyl‰ ;3;1;Lahti ;2012-07-08
JJK Jyv‰skyl‰ ;0;1;Honka ;2012-06-28
JJK Jyv‰skyl‰ ;1;5;KuPS ;2012-06-11
JJK Jyv‰skyl‰ ;0;3;HJK ;2012-06-16
JJK Jyv‰skyl‰ ;1;1;Jaro ;2012-05-24
JJK Jyv‰skyl‰ ;5;2;Mariehamn ;2012-05-16
JJK Jyv‰skyl‰ ;2;1;Lahti ;2012-05-05
JJK Jyv‰skyl‰ ;0;2;VPS  ;2012-04-30
JJK Jyv‰skyl‰ ;1;4;Haka ;2012-04-19
Jaro ;0;3;MyPa ;2012-09-02
Jaro ;0;1;TPS ;2012-08-19
Jaro ;0;3;JJK Jyv‰skyl‰ ;2012-08-05
Jaro ;0;0;VPS  ;2012-07-21
Jaro ;1;0;Haka ;2012-07-07
Jaro ;2;2;HJK ;2012-06-28
Jaro ;1;0;MyPa ;2012-06-25
Jaro ;0;3;Mariehamn ;2012-05-27
Jaro ;0;2;Lahti ;2012-05-21
Jaro ;0;1;Honka ;2012-05-12
Jaro ;1;0;KuPS ;2012-04-29
Jaro ;0;1;Inter Turku ;2012-05-02
KuPS ;2;3;JJK Jyv‰skyl‰ ;2012-08-26
KuPS ;1;0;Lahti ;2012-08-18
KuPS ;0;2;Honka ;2012-08-05
KuPS ;0;6;Inter Turku ;2012-07-22
KuPS ;0;3;HJK ;2012-05-02
KuPS ;1;0;Jaro ;2012-07-02
KuPS ;2;0;Mariehamn ;2012-06-25
KuPS ;1;2;Lahti ;2012-06-17
KuPS ;0;3;VPS  ;2012-05-27
KuPS ;3;0;Haka ;2012-05-21
KuPS ;1;2;MyPa ;2012-05-05
KuPS ;1;1;TPS ;2012-04-22
KuPS ;2;2;JJK Jyv‰skyl‰ ;2012-04-15
Lahti ;3;2;Honka ;2012-08-31
Lahti ;3;0;HJK ;2012-08-12
Lahti ;0;2;Jaro ;2012-07-29
Lahti ;2;0;Mariehamn ;2012-07-16
Lahti ;4;3;Inter Turku ;2012-07-02
Lahti ;1;0;VPS  ;2012-06-28
Lahti ;0;1;Haka ;2012-06-20
Lahti ;0;0;MyPa ;2012-05-24
Lahti ;2;0;TPS ;2012-05-16
Lahti ;0;5;Inter Turku ;2012-04-29
Lahti ;2;1;Honka ;2012-04-18
Lahti ;1;0;Haka ;2012-04-15
Mariehamn ;2;0;KuPS ;2012-09-02
Mariehamn ;2;0;Jaro ;2012-08-11
Mariehamn ;3;3;JJK Jyv‰skyl‰ ;2012-07-22
Mariehamn ;0;0;VPS  ;2012-07-07
Mariehamn ;1;0;Haka ;2012-06-28
Mariehamn ;2;0;HJK ;2012-06-20
Mariehamn ;0;0;MyPa ;2012-06-17
Mariehamn ;2;1;TPS ;2012-05-24
Mariehamn ;2;1;Inter Turku ;2012-05-21
Mariehamn ;2;0;Lahti ;2012-05-13
Mariehamn ;0;0;Honka ;2012-04-29
Mariehamn ;1;1;KuPS ;2012-04-19
MyPa ;1;1;TPS ;2012-08-26
MyPa ;2;1;Mariehamn ;2012-08-20
MyPa ;3;1;Lahti ;2012-08-04
MyPa ;0;0;Honka ;2012-07-22
MyPa ;1;1;KuPS ;2012-07-08
MyPa ;4;0;Inter Turku ;2012-06-28
MyPa ;0;1;JJK Jyv‰skyl‰ ;2012-05-27
MyPa ;1;0;VPS  ;2012-05-21
MyPa ;3;1;Haka ;2012-05-12
MyPa ;1;0;HJK ;2012-04-29
MyPa ;2;0;Jaro ;2012-04-19
TPS ;9;2;Haka ;2012-08-22
TPS ;1;2;HJK ;2012-09-02
TPS ;4;1;Inter Turku ;2012-08-12
TPS ;1;1;Mariehamn ;2012-08-06
TPS ;4;0;Lahti ;2012-07-22
TPS ;2;1;Honka ;2012-07-09
TPS ;3;0;KuPS ;2012-06-28
TPS ;1;0;MyPa ;2012-06-20
TPS ;2;3;Jaro ;2012-06-16
TPS ;2;3;JJK Jyv‰skyl‰ ;2012-05-21
TPS ;1;0;VPS  ;2012-05-13
TPS ;2;0;Haka ;2012-04-29
TPS ;3;1;HJK ;2012-04-19
TPS ;0;1;MyPa ;2012-04-15
VPS ;2;1;Haka ;2012-08-19
VPS ;0;1;KuPS ;2012-08-12
VPS ;2;0;MyPa ;2012-07-29
VPS ;1;3;TPS ;2012-07-14
VPS ;2;0;JJK Jyv‰skyl‰ ;2012-07-02
VPS ;2;0;Honka ;2012-06-20
VPS ;1;0;HJK ;2012-05-24
VPS ;1;1;Jaro ;2012-05-16
VPS ;1;2;Mariehamn ;2012-05-05
VPS ;2;1;Lahti ;2012-04-22
VPS ;0;2;Inter Turku ;2012-04-19


 
Voilà la partie de mon script essai.pl dans lequel j'utilise le tableau des équipes dans l'ordre alphabétique @OA = (HJK, Haka, Honka, Inter Turku, JJK Jyv‰skyl‰, Jaro, Kups, Lathi, Mariehamn, MyPa, TPS, VPS) pour comparaison et surtout pour classer toujours les équipes dans l'ordre alphabétique. LA variable $nb_eq est calculée plus haut dans mon programme, elle est ici égale à 12, c'est le nombre d'équipes du championnat. Quand je fais tourner mon programme ça me donne bien la somme voulue dans @goals_for_home sauf pour le dernier calcul où j'ai le message "Use of uninitialized value in concatenation (.) or string at essai.pl line 106", j'ai beau cherché je ne vois absolument pas pourquoi il ne veut pas calculer $goals_for_home[11] !?  
Egalement pour le deuxième cas ou il y a moins de 5 matchs joués mon script ne fonctionne pas du tout et pareil en essayant de faire le chemin dans les boucles for je ne comprend pas qu'il me calcule rien, j'ai encore le message "Use of uninitialized value in concatenation (.) or string at essai.pl line 106".
Si un cerveau plus performant que le mien traine par là je veux bien qu'il m'aiguille.
Merci.
 
 

Code :
  1. # Je classe par ordre lexical(alphabetique) les valeurs du tableau @part dans le tableau @OA
  2. my @OA = sort @part;
  3. #Je crée un tableau multidimensionnel @TdT1 qui contient tous les champs du fichier Calcul_forces_forme/france1_oa_derniers_matchs.txt
  4. open(A, "finlande1_oa_derniers_matchs.txt" ) or die ("Erreur ouverture $nomfichier8\n" );
  5. my(@TdT1, @tmp1);
  6. while($ligne = <A> ) {
  7. @tmp1 = split(/;/, $ligne);
  8. push @TdT1, [ @tmp1];
  9. $nb_ligne++;
  10. }
  11. #Je crée le tableau @goals_for_home pour 5 matchs joués à domicile
  12. my @goals_for_home = ();
  13. my $l; my $stock;
  14. for($m=0; $m <= ($nb_eq-1); $m++) {
  15. my $goals_for_home = 0;
  16. my @stock = ();
  17.  for($l=0; $l<=$nb_ligne-1; $l++) {
  18.  if($TdT1[$l][0] eq $OA[$m]) {
  19.   $stock = $l;
  20.   push @stock, $stock;
  21.   $goals_for_home += $TdT1[$l][1];
  22.    if($l == $stock[0]+4) {
  23.     push @goals_for_home, $goals_for_home;
  24.     last;
  25.             }
  26.  else {
  27.   next;
  28.    }    
  29.           }
  30.           }
  31.          }
  32. for($m=0; $m<=$nb_eq-1; $m++) {
  33. print $OA[$m]."=".$goals_for_home[$m]."\n";
  34.         }


Message édité par thales69 le 13-09-2012 à 16:04:57
Reply

Marsh Posté le 13-09-2012 à 15:53:36   

Reply

Marsh Posté le 13-09-2012 à 16:52:46    

Plutôt que créer ton tableau @goals_for_home, je construis directement ce qu'il faut dans un hash à la lecture du fichier.
La clé du hash est le nom de la ville, et il a deux champs, un ou on accumule le nb de goals marqués, et l'autre ou on compte le nb de matches comptés jusque la.
Noter que ça marche parce que les champs numériques de ce type de hash sont initialisés à 0 par défaut (c'est fait exprès en Perl pour pouvoir faire ce genre de boucles)

Code :
  1. #!/usr/local/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. my %matches;
  6. use constant MAX_MATCHES => 5;
  7. open(my $IN, 'finlande1_oa_derniers_matchs.txt' ) or die ("Erreur ouverture fichier\n" );
  8. while (<$IN> ) {
  9.  chomp;
  10.  my @fields = split /;/;
  11.  map {s/^\s*|\s*$//g} @fields;
  12.  $matches{$fields[0]}{'goals_for_home'} += $fields[1] if ($matches{$fields[0]}{'counted'}++ < MAX_MATCHES);
  13. }
  14. close($IN);
  15.  
  16. foreach my $city (sort keys %matches) {
  17.     print "$city: $matches{$city}{'goals_for_home'}\n";
  18. }


C:\Perl>perl matches.pl
HJK: 12
Haka: 4
Honka: 8
Inter Turku: 9
JJK Jyv‰skyl‰: 10
Jaro: 1
KuPS: 3
Lahti: 12
Mariehamn: 8
MyPa: 7
TPS: 19
VPS: 7


A+,


Message édité par gilou le 13-09-2012 à 17:02:11

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-09-2012 à 17:57:38    

Et ben merci encore Gilou ! ça marche impeccablement !
Par contre il faut maintenant que je change ma façon de faire pour la suite de mon projet car les Hashs je connais pas trop.
 
Pour que je comprenne bien, en fait le Hash %matches construit ressemble à ça ?
 
%matches =('HJK'        => '12', 'Haka'     => '4', 'Honka'    => '8', 'Inter Turku'      => '9', 'JJK Jyv‰skyl‰' => '10', 'Jaro'        => '1', 'KuPS'     => '3', 'Lathi'    => '12', 'Mariehamn'      => '8', 'MyPa' => '7', 'TPS'      => '19', 'VPS' => '7');
 
 
dans la suite de mon script je vais avoir besoin des valeurs trouvées 12, 4, 8, ..... ,7 . J'ai essayé d'accéder à la valeur de la clef HJK avec $matches{HJK} mais sans succès, le terminal me retourne HASH(0x10081d108) alors que j'aurais voulu 12.
Comment accède-t-on à la valeur 12 ?
 
Merci pour tes lumières Gilou.
A+

Reply

Marsh Posté le 13-09-2012 à 18:09:16    

%matches a la structure suivante:  
{ 'Jaro'  => { 'goals_for_home' => '1',  
                   'counted' => '12' },
   'Inter Turku' => { 'goals_for_home' => '9',  
                            'counted' => '13' },
....
   'TPS' => { 'goals_for_home' => '19',  
                  'counted' => '14' },
}
 
Il fallait faire $matches{'HJK'}{'goals_for_home'} pour accéder a la valeur 12, c'était visible dans ma boucle d'impression finale d'ailleurs.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-09-2012 à 21:11:02    

Citation :

car les Hashs je connais pas trop

C'est vraiment un des trucs de base à connaitre en Perl, car c'est super-pratique, en particulier sous la forme que j'ai utilisé, le hash de hashes.
A+,


Message édité par gilou le 13-09-2012 à 21:12:25

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-09-2012 à 21:23:08    

Merci pour les explications Gilou, je comprend un peu mieux le code que tu as posté.
 
A+

Reply

Marsh Posté le 13-09-2012 à 21:30:48    

Oui j'étais tombé sur un chapitre sur les tableaux de Hachages(je crois que c'était sur PERLDSC la documentation de Perl), à la première lecture j'avais eu beaucoup de mal et hônnetement j'avais pas compris grand chose, peut-être que maintenant avec "un peu" plus d'expérience je comprendrais un peu plus, je pense que je vais relire ce chapitre. Il est vrai que pour l'instant dans mon projet je n'ai utilisé que les tableaux simples ou multidimensionnels mais je suis certain que j'aurais pu utilisé les tableaux de hachages pour simplifié et optimisé mon code. Merci pour le conseil je vais me pencher dessus car comme les expressions régulières ça à l'air également puissant et pratique.
 
A+


Message édité par thales69 le 13-09-2012 à 21:31:54
Reply

Marsh Posté le 14-09-2012 à 12:19:21    

Si tu lis l'anglais, tu peux lire le livre en pdf qui se trouve ici: http://onyxneon.com/books/modern_perl/  qui est très bien.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-09-2012 à 23:28:06    

OK, je vais regarder ça avec attention et ça me fera une bonne leçon technique d'Anglais ;)
Merci à toi.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed