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





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 ]