般若心経F*ck、コピペで徳を高める話

![singyo.png](https://qiita-image-store.s3.amazonaws.com/0/28174/54ac5734-7851-f1fc-09e7-8d9a0717aabc.png)
## はじめに

これは [ドリコムアドベントカレンダー](http://www.adventar.org/calendars/518) 7日目の記事です。

6日目は[ながい](http://twitter.com/shinya_131)さんの[Rubyの凄く面白い特徴をRailsのコードを例に解説](http://qiita.com/shinya_131/items/901b9c70642b1e1f9227)です。

### 自己紹介

[twitter@ohrdev](http://twitter.com/ohrdev)
ドリコム歴は3年半位になります。

### 仕事

広告システムの開発とかをしてます、ゲームとか詳しくないです。ごめんなさい。
自分が扱ってるサービスはレガシーコードが多く、近年カルマの深まりを感じています。

### 趣味

寺社巡り、巡礼、写経(仏教的な意味で)
最近、仏像彫りを始めました、楽しいです。

## ~~経~~今日の話

10年程写経をしてるんですが、最近もっと効率的にできないかと思う様になり、その過程で思いついた(効率的?に)写経を行い徳を高める方法について書きたいと思います。

こんなネタで大丈夫か？とも思ったんですが、Qiitaには [写経タグ](http://qiita.com/tags/%E5%86%99%E7%B5%8C)があるので大丈夫でしょう。

## 写経とは?

[wikipedia](http://ja.wikipedia.org/wiki/%E5%86%99%E7%B5%8C)曰く、

> 写経（しゃきょう）とは、仏教において経典を書写すること、またはその書写された経典のことを指す。

要するに写経とは「経典をコピーする事」、「コピーした経典」を指します。

> 一般的に、現代の日本で写経と言えば、『般若心経』の書写を指すことが多く、

また、上記の様に写経といえば般若心経が定番となります。

つまり、

```
写経 := 般若心経のコピペ
```

という事です。

## 般若心経とは?

正式名称「般若波羅蜜多心経」ですが、略して「般若心経」「心経」とか言われます。
西遊記に出てくる三蔵法師がインドから持ち帰ってきた「大般若波羅蜜多経」という経典があるんですがそのコア要素をまとめたのが「般若心経」です。

また、江戸時代、字の読めない庶民の為に、漢文を絵に置き換えた「絵新経」が考え出されました。

般若心経は実はわりとゆるいものです。

## バイナリ心経

絵心経みたいに時代が変われば般若心経の形やあり方も変わってくるのも当然です。

一度お寺のお坊さんに納経(写経したお経をお寺に収める事)の際の写経のフォーマットについて聞いたことがあるのですが、形式やしきたりにはそこまで拘らなくても良いと教えてもらった事があります。
実際、五線ノートにボールペンで書いたものを納経する人もいるそうです。
(ただし人によって意見が分かれる事があります)

江戸時代の絵心経の様に、紙媒体から電子媒体に変わりつつある現代なら、電子媒体の心経もありだと思いませんか？いわゆる「電子心経」「バイナリ心経」というやつです。
(ググっても出てこなかったんですが、こういうものってまだ無いんでしょうか？)

とりあえず、テキストファイルに般若心経を書いておきましょう。

```singyo.txt
仏説摩訶般若波羅蜜多心経観自在菩薩行深般若波羅蜜多時照見五蘊皆空度一切苦厄舎利子色不異空空不異色色即是空空即是色受想行識亦復如是舎利子是諸法空相不生不滅不垢不浄不増不減是故空中無色無受想行識無眼耳鼻舌身意無色声香味触法無眼界乃至無意識界無無明亦無無明尽乃至無老死亦無老死尽無苦集滅道無智亦無得以無所得故菩提薩埵依般若波羅蜜多故心無罣礙無罣礙故無有恐怖遠離一切顛倒夢想究竟涅槃三世諸仏依般若波羅蜜多故得阿耨多羅三藐三菩提故知般若波羅蜜多是大神呪是大明呪是無上呪是無等等呪能除一切苦真実虚故説般若波羅蜜多呪即説呪曰羯諦羯諦波羅羯諦波羅僧羯諦菩提薩婆訶般若心経
```
## バイナリ写経

上記の写経の定義から、

```
写経 := 般若心経のコピー
バイナリ写経 := バイナリ心経のコピー
```

という事です。(そういう事にしてください、そういう事にして進めます)
なので、やることは１つ、singyo.txtをコピーすれば良いのです。

## 写経は修行ですしおすし

ここまで書いておいてアレなんですが、

> 写経のもともとの目的は、「経典のコピー」でしたが現代では「心身を清める修行」としての意味合いを持っています。

と言われる様に所謂修行行為です。単純に

~~~
$ cp singyo.txt singyo2.txt
~~~

だけでは徳は高まらないです。
ならどうするか？それは、

> 写経は古くから「一字一佛」と言うように、一字書くことは一佛を造るのと同じという気持ちで、心を込めて書き写すことが大切です。

とある様に、一字一字、念を込めて経をコピーすれば良いわけです。

## 般若心経F*ck

般若心経クソッタレという意味ではありません。[BrainF*ck](http://ja.wikipedia.org/wiki/Brainfuck)の亜種として、バイナリ写経をする為の[言語](https://github.com/ohr486/singyo_fuck)を作りました。
(*に入る文字ですか？sとかじゃないですかね。ファイルシステムの検査・修復をするそんなコマンドありましたし。)

基本文法はBrainF*ckに則りますが、以下の119文字(心経に出てくる文字+空文字)を特別扱いしています。

~~~
　一三上不世中乃五亦仏以依倒僧切利即厄受呪味在垢埵増声多夢大如婆子実尽度得復心怖恐想意所提摩故明是時智曰有槃死法波浄涅深減滅無照生界異皆相真眼知礙神究空竟等経罣羅羯老耨耳能自至舌舎般色若苦菩薩藐蘊虚蜜行見観触訶説諦諸識身道遠阿除集離顛香鼻
~~~

BrainF*ckは８つの命令があります。他のBrainF*ck系派生言語同様に、この8つの命令を他のキーワード(上記118文字のどれか)で置き換えます。また上記の118文字を入出力が簡単にできるよう専用の入出力命令を追加しています。

#### 命令

+ 命令1(+) 現在のポインタの値を1増やす

+ 命令2(-) 現在のポインタの値を1減らす

+ 命令3(>) ポインタを1つ右に動かす

+ 命令4(<) ポインタを1つ左に動かす

+ 命令5(.) 現在のポインタの値を出力する

+ 命令6(,) 標準入力から1文字読み込み、現在のポインタに書き込む

+ 命令7([) ポインタの値が0なら、対応する 8. までジャンプ

+ 命令8(]) ポインタの値が0以外なら、対応する 7. までジャンプ

#### 追加した命令

+ 命令9(@) 現在のポインタの値をインデックスとする文字テーブル上の文字を出力する

+ 命令10(*) 標準入力から1文字読み込み、現在のポインタに文字テーブル上のインデックスを書き込む

#### 命令語の追加

さらに使用可能な118文字の中から、上記の10個の命令に対応させて[割り振ります](https://github.com/ohr486/singyo_fuck/blob/master/grammer.yml)。

これで理論上は般若心経そのもの(のN回の繰り返し)を入力として、般若心経を出力することができるようになります。(Nは1以上の整数)

## 般若心経F*ckで写経する

まずは般若心経を入力値として「菩薩」と書き出してみましょう(ここでは分かり易いようにBrainF*ckの命令語を使っています)。ひとまず使用するBrainF*ckのメモリ領域は1つだけにします。

```
input
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@+@

output
菩薩
```

ここで出てくる命令は「+」x95、「@」x2 の合計97個ですので、般若心経に出てくる文字の頻度と順番からがinputにマッチする命令と文字の組み合わせを考えれば、入力を般若心経、出力を「菩薩」とすることができます。

以下の組み合わせの場合は、般若心経を入力とした場合に「菩薩」と出力されます。

+:一、三、上、不、亦、以、僧、切、呪、多、故、是、無、空、色、虚、蜜
@:曰、婆

文法は[こんなかんじ](https://github.com/ohr486/singyo_fuck/blob/master/grammer2.yml)になります。

```
input
仏説摩訶般若波羅蜜多心経観自在菩薩行深般若波羅蜜多時照見五蘊皆空度一切苦厄舎利子色不異空空不異色色即是空空即是色受想行識亦復如是舎利子是諸法空相不生不滅不垢不浄不増不減是故空中無色無受想行識無眼耳鼻舌身意無色声香味触法無眼界乃至無意識界無無明亦無無明尽乃至無老死亦無老死尽無苦集滅道無智亦無得以無所得故菩提薩埵依般若波羅蜜多故心無罣礙無罣礙故無有恐怖遠離一切顛倒夢想究竟涅槃三世諸仏依般若波羅蜜多故得阿耨多羅三藐三菩提故知般若波羅蜜多是大神呪是大明呪是無上呪是無等等呪能除一切苦真実虚故説般若波羅蜜多呪即説呪曰羯諦羯諦波羅羯諦波羅僧羯諦菩提薩婆訶般若心経

output
菩薩
```

出力が般若心経となるBrainF*ckのコードは、メモリ領域を１つだけ使うのであれば[10574命令(+-@を使用)](https://github.com/ohr486/singyo_fuck/blob/master/bf_code1.txt)、１出力１メモリ領域を使うのであれば[16996命令(+>@を使用)](https://github.com/ohr486/singyo_fuck/blob/master/bf_code2.txt)で書けます。(ただしループ等を使っていない一番単純な構造のプログラム）

これらのプログラムが、般若心経のパターンにマッチするような命令の組み合わせと、BrainF*ckのプログラムを見つける事ができれば、入力(xN)と出力が般若心経のプログラムができます。

これくらいやれば、一文字一文字念を入れたコピー（つまり写経）になるんじゃないでしょうか。まだできていませんが。きっと徳も爆速で高まると思います。

## 最後に

般若心経の一番のサビである、「羯諦羯諦波羅羯諦波羅僧羯諦菩提薩婆訶」の部分だけは、なんとか般若心経F*ckで写経できました。(BrainF*ckのコードで800命令、般若心経F*ckの入力が、般若心経10回の繰り返しの文字列)

出力を般若心経全文にするには、どれくらいのコードになるのか見当がつきません。
般若心経全文(xN回)を入力して、般若心経全文を出力する、般若心経F*ckの文法とBrainF*ckの組み合わせは来年のアドベントカレンダーで発表できたらと思います。

8日目は [@sazae657](http://twitter.com/sazae657) さんが書きます。