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

表示が手抜きです

$ runhaskell 6382.hs < 6382.hs [('n',5),(' ',17),('&',3),('(',1),(')',1),('.',5),('=',3),('>',2),('A',1),('C',2),('D',1),('L',1),('a',5),('d',1),('e',6),('f',2),('g',3),('h',2),('i',5),('l',2),('m',4),('n',6),('o',8),('p',5),('q',2),('r',10),('s',3),('t',11),('u',1),('w',1)]

1
2
3
4
5
6
import Data.List
import Control.Arrow

main = getContents >>= print . freq

freq = map (head &&& length) . group . sort

Control.Arrowを使ってみました
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
module Main where                                                                                                            

import Control.Arrow
import Data.Function (on)
import Data.List (delete, sortBy)

foldA :: (ArrowChoice a, ArrowApply a) => (c -> (a b c)) -> c -> (a [b] c)
foldA f c = arr listcase >>> 
  arr (const c) ||| (first (f c) >>> first (arr (foldA f)) >>> app)
    where listcase [] = Left ()
          listcase (x:xs) = Right (x,xs)

main = getContents >>= print . sortBy ((flip compare) `on` snd) . foldA f []
    where f t k = case lookup k t of
                    Nothing -> (k,1):t
                    Just n  -> (k,succ n):delete (k,n) t

Index

Feed

Other

Link

Pathtraq

loading...