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 - C#

いろいろ試したところ

  • 圧倒的にスペースが多い
  • アルファベットの頻度分布に割と近いが、その中でも'i' 'n' 't'がやや多いようだ
  • 記号は'.' ';' '=' '(' ')'が多いが、10位以内にはめったに入らない

という感じでした。

 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
using System;
using System.Collections.Generic;
using System.Text;

class Program
{
  static void Main(string[] args)
  {
    args = new string[] { "-utf-8" };
    if (args.Length > 0 && args[0][0] == '-')
    {
      Console.InputEncoding
        = Encoding.GetEncoding(args[0].Substring(1));
    }
    Dictionary<char, int> table = new Dictionary<char, int>();
    string line = null;
    while ((line = Console.ReadLine()) != null)
    {
      foreach (char c in line)
      {
        table[c] = table.ContainsKey(c) ? table[c] + 1 : 1;
      }
    }
    foreach (char c in table.Keys)
    {
      Console.WriteLine("\"{0}\",{1}", c, table[c]);
    }
  }
}

Index

Feed

Other

Link

Pathtraq

loading...