#!/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 () { 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, ); }