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 - R

$R_ROOT/library/base/R-ex/ 以下にあるサンプルコードを読ませてみました。

1.全文字
--------------------------------------------------
> l <- sort(table.files(list.files()), dec=TRUE)
> data.frame(num=l, percent=100*l/sum(l))
     num      percent
   24237 14.418975436
e  10816  6.434609824
a   8258  4.912815082
t   8005  4.762301372
#   7733  4.600484262
s   7641  4.545752003
i   7009  4.169765187
...

一番上の文字はスペースです。サンプルコードだけに、コメント文字(#)が多いようです。


2.アルファベット
--------------------------------------------------
> l2 <- sort(l[letters], dec=TRUE)
> data.frame(num=l2, percent=100*l2/sum(l2))
    num    percent
e 10816 11.3734109
a  8258  8.6835824
t  8005  8.4175438
s  7641  8.0347848
i  7009  7.3702142
n  6325  6.6509637
r  6214  6.5342433
o  5715  6.0095269
...

一般的な英語の文章におけるアルファベットの頻度と大体同じになるようです。
(おそらく多くの言語で同じ結果になると思いますが・・・)


3.その他
--------------------------------------------------
> l3 <- sort(l[c(">", "<", "+", "-", "*", "/")], dec=TRUE)
> data.frame(num=l3, percent=100*l3/sum(l3))
   num   percent
- 1479 39.886731
<  980 26.429342
*  787 21.224380
/  181  4.881338
+  171  4.611650
>  110  2.966559

"-" と "<" が群を抜いて多いのは、付値(assignment:"<-")演算子のせいでしょう。


1
2
3
4
5
6
7
8
9
# table for one file
table.file <- function(f){
    table(unlist(strsplit(readLines(f), "")))
}

# table for multiple files (one file can be also accepted)
table.files <- function(files){
    table(unlist(sapply(files, function(f)(strsplit(readLines(f), "")))))
}

Index

Feed

Other

Link

Pathtraq

loading...