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

 scalaパッケージ直下のソースファイルを対象に処理した結果の上位10件は以下の様になりました。

SPACE 127418 28.10
e 27909 6.15
t 21232 4.68
a 15490 3.42
n 14061 3.10
r 13917 3.07
o 13648 3.01
CR 12956 2.86
i 12905 2.85
s 11936 2.63
 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import    java.io.File
import    java.io.FileNotFoundException
import    scala.collection.mutable.HashMap
import    scala.io.Source

class FrequencyAnalyzer(ps:List[String]) {
    var    l:Int = 0
    var    a:HashMap[Char,Int] = null
    
    def getTotal:Int = l
    def getResult:HashMap[Char,Int] = a
    
    private def analyzeFile(s:Source):Unit = {
        s.hasNext match {
            case true => {
                val    c:Char = s.next
                a.get(c) match {
                    case Some(i) => a.update(c,i + 1)
                    case _ => a.update(c, 1)
                }
                l = l + 1
                analyzeFile(s)
            }
            case _ => ()
        }
    }
    
    def analyze:FrequencyAnalyzer = {
        a = new HashMap[Char,Int]
        l = 0
        ps.foreach { f =>
            try {
                analyzeFile(Source.fromFile(new File(f)))
            } catch {
                case ex:FileNotFoundException => printf("%s not found.\n",f)
                case ex:Exception => {
                    ex.printStackTrace
                    System.exit(1)
                }
            }
        }
        this
    }
    
    def print:Unit = {
        getResult.elements.toList.sort { (a,b) => a._2 > b._2 }.foreach { e =>
            val    d:String = e._1 match {
                case ' ' => "SPACE"
                case '\t' => "TAB"
                case 0x0a => "CR"
                case 0x0d => "LF"
                case c => c.toString
            }
            printf("%s\t%d\t%2.2f\n",d,e._2,e._2.asInstanceOf[Float] * 100 / getTotal)
        }
    }
}

object FrequencyAnalyzerMain {
    def main(args:Array[String]):Unit = {
        args.size match {
            case 0 => println("usage: scala FrequencyAnalyzerMain source")
            case _ => (new FrequencyAnalyzer(args.toList)).analyze.print
        }
    }
}

Index

Feed

Other

Link

Pathtraq

loading...