#!/usr/local/bin/perl

# %langfreq = &readfreq('/usr/local/util/lib/words.french');
%langfreq = &freq_francais;
@langorder = &order(%langfreq);
unshift @ARGV, '-' unless (@ARGV);
%textfreq = &readfreq(shift);
@textorder = &order(%textfreq);

# Affichage de la substitution de chiffrement
# par ordre alphabétique
print ('A'..'Z'); print "\n";
foreach ('A'..'Z') { print $textorder[1][$langorder[0]{$_}]; } print "\n";
# par fréquence décroissante
print "\n";
foreach (@{$langorder[1]}) { print; } print "\n";
foreach (@{$textorder[1]}) { print; } print "\n";

###########################

sub readfreq {
  my $total = 0; my %count = ();
  foreach my $c ('A'..'Z') { $count{$c} = 0; }
  open IN, shift;
  while (<IN>) {
    chop; tr/a-z/A-Z/; s/[^A-Z]//g;
    foreach my $c (split '') { $count{$c}++; $total++; }
  }
  foreach my $c (sort keys %count) { $count{$c} = 100*$count{$c}/$total; }
  %count;
}

sub printfreq {
  my %freq = @_;
  foreach my $c (sort keys %freq) { printf "%1s   %6.3f%%\n", $c, $freq{$c}; }
}

sub order {
  my %freq = @_;
  my %order = (); my @order = (); my $pos = 0;
  foreach my $c (sort {$freq{$b}<=>$freq{$a}} keys %freq) {
    push @order, $c; $order{$c} = $pos++;
  }
  ( \%order, \@order );
}

sub freq_francais { (
'A' =>  8.498,
'B' =>  1.247,
'C' =>  3.553,
'D' =>  2.324,
'E' => 15.774,
'F' =>  1.362,
'G' =>  1.574,
'H' =>  0.976,
'I' =>  9.800,
'J' =>  0.184,
'K' =>  0.035,
'L' =>  3.684,
'M' =>  2.432,
'N' =>  7.843,
'O' =>  5.901,
'P' =>  2.530,
'Q' =>  0.467,
'R' =>  9.995,
'S' =>  8.267,
'T' =>  7.169,
'U' =>  3.671,
'V' =>  1.143,
'W' =>  0.008,
'X' =>  0.313,
'Y' =>  0.278,
'Z' =>  0.971,
); }
