challenge コード中の文字の頻度分析

プログラムコード中の文字の頻度は言語によって相当にばらつきがあると思います。ある言語はピリオドが頻出するとか、別の言語はカッコの頻出頻度が高い、とか。そこで、

  • 文字の頻度解析をするプログラムを作成し、
  • 適当なプログラムに対して実行し、結果を出力して、そのような頻度になっている理由を教えてください。

(その言語で書かれた「典型的な」プログラムコード、といえるようなものがあると良いのですが・・)

簡単すぎるという方は、複数文字にしてみたり単語の頻度にしてみてください。

参考;Wikipedia 頻度分析

http://ja.wikipedia.org/wiki/%E9%A0%BB%E5%BA%A6%E5%88%86%E6%9E%90

出題者です。 こちらで用意していた回答は awk を使ったものでした。一応解説すると、組み込み変数FSを空にし、1行単位の文字毎に連想配列に格納しています。

1
2
3
4
5
6
7
8
9
# 1文字版
BEGIN { FS="" }
{ for (i=1; i<=NF; i++) ht[$i]++}
END { for (c in ht) print ht[c],c }

# 3文字版
BEGIN { FS="" }
{ for (i=1; i<=NF-2; i++) { ht[$i$(i+1)$(i+2)]++}}
END { for (c in ht) print ht[c],c }

Posted feedbacks - Perl

Perlで。思っていたよりは記号が少ないです。

自身を入力にした結果:
Total: 681 character(s)
Character Count Frequency[%]
' '       111    16.30      
'!'         2     0.29      
'"'         8     1.17      
'#'         1     0.15      
'$'        29     4.26      
'%'         4     0.59      
'''         2     0.29      
'('         6     0.88      
')'         6     0.88      
'*'         2     0.29      
...
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/perl

use strict;
use warnings;
use utf8;

use Text::Table;

my $src_file;
if (@ARGV) { open $src_file, "<:utf8", shift or die $!; }
else { $src_file = \*STDIN; }

my $src = do { local $/ = undef; <$src_file> };
my $total_chars = 0;
my %chars;

for my $char ( split //, $src ) {
  $char =~ s/\n/\\n/;
  $char =~ s/\t/\\t/;
  if ( exists $chars{$char} ) { $chars{$char}++; }
  else { $chars{$char} = 1; }
  $total_chars++;
}

my $tbl = Text::Table->new(qw/Character Count Frequency[%]/);
$tbl->add( "'$_'",
           $chars{$_},
           sprintf "%6.2f", $chars{$_} * 100 / $total_chars ) for sort keys %chars;

print "Total: $total_chars character(s)\n";
print $tbl;

Index

Feed

Other

Link

Pathtraq

loading...