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

Squeak Smalltalk で。

とりあえず、自身のソースコード文字列を得て解析結果を返すもの。

1
2
3
4
| sourceString |
sourceString := thisContext method decompileString.

^sourceString asBag sortedCounts

Squeak Smalltalk は、組み込みクラスのみならず処理系自体も Smalltalk 自身で記述されていて、その全ソースコードを処理系内からアクセスできるようになっています。そこで、これを解析してみました。

使用したコード(全クラスの全メソッドのソースを得てその文字列中の文字を bag に蓄積し、最後に頻度順にソート)と、全 13638278 文字中、1000 文字以上使われている文字の頻度を示します。

原則、Smalltalk は読み下したときに英文っぽくなるような命名をするので、結果、英単語における使用頻度(E、T、A、O、I、N…)に準ずる結果になりますが、記号については、キーワードメッセージで引数の前に使われるコロン、式の区切りのピリオドのほかにリテラルに使用する記号が比較的多くなるはずで、じっさいそのようになっています。

余談ですが、改行文字の数から、Squeak Smalltalk システムは約 30 万行の Smalltalk コードで記述されていることも分かります。これと同じことを一桁少ない行数で記述できる言語処理系を作るチャレンジが、今、アラン・ケイたちが取り組んでいるプロジェクトです。

http://vpri.org/html/work/ifnct.htm

1444427->Character space 1184081->$e 783875->$t 692975->$r 657882->$a 622461->$s 597060->$o 575035->$i 559122->$n 513017->Character tab 509706->$l 340916->Character cr 308729->$c 304427->$d 299400->$: 250870->$f 233671->$m 228063->$u 223102->$h 210051->$p 167306->$. 152494->$g 127057->$1 113908->$y 108249->$b 101596->$w 101168->$6 98043->$S 88101->$0 80005->$C 79576->$v 75559->$" 74041->$2 69815->$T 66799->$F 63860->$' 63131->$x 61565->$[ 61564->$] 59878->$A 57766->$3 57378->$) 57345->$( 55143->$4 52495->$7 51905->$k 49030->$5 48466->$P 48187->$N 46052->$B 45787->$= 44959->$M 40782->$8 40730->$I 38608->$^ 37685->$| 37462->$D 35494->$9 33225->$- 31526->$O 30804->$R 30157->$_ 29878->$E 25376->$z 24698->$L 23217->$# 20746->$, 19200->$W 18588->$V 14915->$j 13496->$U 12687->$; 11011->$H 10515->$/ 10070->$+ 9078->$q 7555->$> 7128->$G 6569->$K 6320->$@ 5752->$< 4510->$* 4043->$Y 3973->$X 3040->${ 3019->$} 2887->$$ 2624->Character lf 2586->$Q 2436->$J 2193->$Z 1361->$~ 1104->$ 1097->$? 1004->$!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
| bag |
bag := Bag new.
'Analyzing all source code...'
    displayProgressAt: Sensor cursorPoint
    from: 0 to: Smalltalk classNames size
    during: [:bar |
        | count |
        count := 0.
        SystemNavigation default allBehaviorsDo: [:class |
            bar value: (count := count + 1).
            class selectorsDo: [:sel | bag addAll: (class sourceCodeAt: sel)]]].
^bag sortedCounts

Index

Feed

Other

Link

Pathtraq

loading...