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 - Brainf*ck

Brainf*ckで。文字列を入力し、最後に「$」を入力するとヒストグラムを表示します。

コメントなし版を入力した結果
++++++++++++++++++++++++++++++++++++++
,
-------------------------
..
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

記号が多いですね(笑)
「>」69、「<」57、「+」38、角括弧30、「-」25。
入出力(.,)はごく少数。

ほとんどチューリングマシンなのでポインタの移動が多くなります。+はデータの作成に多用します。
 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
●コメント版
+[>                        # while ({0})  do
  +>,<                     #   {1} = 1 ; {2} = getchar()
  >                        # ** dollar check **
   >>++++++[-<++++++>]<<   #   {3} = 36 dollar
                           # ** compare {3} & {4} **
   [->>+>+<<<]             #   {@2:@3} = !{@0}
   >>>[-<<<+>>>]<<<        #   {@0} = !{@3}
   >[->->+<<]<             #   {@2} = {@2} minus {@1} ; {@3} = !{@1}
   >>>[-<<+>>]<<<          #   {@1} = !{@3}
   >>
   >+<[[-]>-<]>[-<+>]<     # ** invert result **
   [[-]<<[-]<[-]<[-]>>>>]  #   {2:1:0} = 0
   <[-]>                   #   {3} = 0
   <<
  <
  [>                       # ** count up if input char is not dollar **
   [->>>>>>+<<<<<<]        #   {8} = !{2}
   >>>>[-]>[-]>            #   {6:7} = 0 ; move to {8}
   [- [->>+<<]+>> ]        # ** extend arm to {8 plus (charcode times 2)} **
   >+<                     # ** count up **
   <<[[-]<<]               # ** reduce arm **
   <<<<
   [-]<[-]>                #   {2:1} = 0
  <]
<]                         # end   ** next char **
# show result
>>>>>>>> >>+
[
  >[[-<.>]++++++++++.[-]]<
  [->>+<<]>>+
]

●コメントなし版
+[>+>,<>>>++++++[-<++++++>]<<[->>+>+<<<]>>>[-<<<+>>>]<<<>[->->+<<]<>>>[-<<+>>]<<<>>>+<[[-]>-<]>[-<+>]<[[-]<<[-]<[-]<[-]>>>>]<[-]><<<[>[->>>>>>+<<<<<<]>>>>[-]>[-]>[-[->>+<<]+>>]>+<<<[[-]<<]<<<<[-]<[-]><]<]>>>>>>>>>>+[>[[-<.>]++++++++++.[-]]<[->>+<<]>>+]

Index

Feed

Other

Link

Pathtraq

loading...