コード中の文字の頻度分析
出題者です。 こちらで用意していた回答は 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;
|



crane
#6382()
Rating0/0=0.00
プログラムコード中の文字の頻度は言語によって相当にばらつきがあると思います。ある言語はピリオドが頻出するとか、別の言語はカッコの頻出頻度が高い、とか。そこで、
(その言語で書かれた「典型的な」プログラムコード、といえるようなものがあると良いのですが・・)
簡単すぎるという方は、複数文字にしてみたり単語の頻度にしてみてください。
参考;Wikipedia 頻度分析
http://ja.wikipedia.org/wiki/%E9%A0%BB%E5%BA%A6%E5%88%86%E6%9E%90
1 reply [ reply ]