hiraganafuckの概要的ななにか

ひらがな、brainf*ckの状態遷移図(表)を元に”ひらがな”でbrainfuckのプログラムを書けるようなコンバータを作ってみた。
http://github.com/enukane/hiraganafuck/tree/master


基本的なアイディアは@go_vmの、”ひらがな”の各行をbrainfuckのそれぞれの記号に対応づけると”日本語っぽく”かけるのでは?いうモノ。ただしこの方法だと、たとえば"あ行"="+"のとき、"++++++++"というソースを書く場合には"あいあうえいあお"というようにかなり不自然なソースになってしまう。この行単位での割り当ての問題点は、同じ記号の連続に弱いこと、つまり同じ行のひらがなが数個以上続くのは珍しいという日本語の特性を考慮していないから、といえる。
日本語の特性とbrainfuckの特性はそれぞれ異なっており、それはこれまで作ってきたそれぞれの状態遷移図(表)に沿ったモノになる。このそれぞれの特性の違いを吸収する方法として、hiraganafuckでは["ひらがな":"機能"]の組を動的に変えていきます。いまあるひらがなAがある機能Fとバインドされている場合、次に現れるひらがなBが何であるかによってBにバインドされる機能が何になるかが変わります。このときバインドされる機能はA->Bの遷移確率の「ランク」によって決定されます。

「ランク」はA->Bの遷移確率の大きさを表す0〜7の数字で表されます。A->Bへと遷移する場合,Bとして"あ"〜"ん"までのすべての平仮名が考えられそれぞれに対して遷移確率が求められます。このBを遷移確率の大きさで降順ソートし、上から10個ずつ区切り、それぞれ0〜7の値で示されるグループに分けたモノです。

以上のものはある平仮名Aのランクですが、これと同じようなことがbrainfuckの各記号についても適用できます。brainfuckの記号は8つなのでまさに0〜7のランク付けが可能です。ひらがなと機能の動的なバインドはこのランクを用います。もしA->Bという遷移においてAから見たBのランクがNなら、Bの機能F'をAに対応する機能Fから見たランクNの機能F(N)とします。

[A:F] -> [B:F(N)]  ∵Bはrank(A->B)=Nとなるひらがな

このようなバインディング方法をとると、「ひらがな+現在の機能」によって次の文字/機能が変わるので、ある機能を次に持ってきたいときに利用できるひらがなの選択肢が増えるといった利点があります。また、次に来やすい機能には次に来やすいひらがなが対応する、次に来やすいひらがなには次に来やすい機能をバインドするといったことを行っているため日本語っぽくかけるんではないかな!

例としてhiraganafuckではhelloworldが以下のように書けます。

+あるところにおいて,さめよりはしんとして,そそうのないますがいまし,
つちのなかにだけいろといっきだしで,どにちをかいたきをければ,
めがてをぶつので,ありのかしたかにひをさしたが,いのいたみわたのしいので,
すでできのめろんともちをえほんにしました.とめがすむ.

漢字も交えて読みやすくすると

「ある所において、鮫よりはしんとして、粗相のない鱒が居まし、
土の中にだけ居ろと一気だしで、土日を書いた木を蹴れば、
目が手をぶつので、蟻の貸した蚊に火をさしたが、胃の痛みわ楽しいので、
素手で木のメロンと餅を絵本にしました。トメがすむ.」

なお、これはhelloworldの一例で、結局brainfuckで以下のように出力するようなひらがな列であればどんな文章でもhelloworldになります。

+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
------------.<++++++++.--------.+++.------.--------.>+.

なので、今回のhiraganafuckの文章はいまいち意味をなしていませんが、がんばれば文字列的には脅迫状であるにもかかわらずhiraganafuckを通すとラブレターとなるようなソースコードが書けるかもしれません。