Brainfuck 派生言語 generator の Orenono gem で Brainfuck を構成する文字を基本命令とする Brainfuck 派生 Brainfuck 言語を作成し、 Brainfuck 派生 Brainfuck 言語 の Ascii Art のプログラムから Brainfuck で Brainfuck という文字列を出力するためのソースコードを標準出力する #ゲシュタルト崩壊

## :scream: 概要
Brainfuck 派生言語 generator の Orenono gem で
Brainfuck を構成する文字を基本命令とする Brainfuck 派生 Brainfuck 言語を作成し、
Brainfuck 派生 Brainfuck 言語 の Ascii Art のプログラムから
Brainfuck で Brainfuck という文字列を出力するための
ソースコードを標準出力します

## :hand: 前提
orenono gem をインストール済み( orenono は Ruby の gem です )

~~~bash
% gem install orenono
~~~

## :rage1: Brainfuck 派生 Brainfuck 言語 で作成するプログラムの出力対象となる `Brainfuck` という文字列を出力する Brainfuck のコードを生成する

~~~bash
% orenono generate 'Brainfuck'
++++++++++[>++++++<-]>++++++.++++++++++++++++++++++++++++++++++++++++++++++++.-----------------.++++++++.+++++.--------.+++++++++++++++.------------------.++++++++.
~~~

## :pencil2::triangular_ruler: Brainfuck 派生 Brainfuck 言語 の 文法定義
`orenono init` で Orenonofile を生成し、中身を編集して文法を定義します。

## :triumph::baby_chick: Orenonofile を生成する

~~~bash
$ orenono i
$ ls Orenonofile
Orenonofile
~~~

## :triumph::pencil: Orenonofile を編集する

~~~ruby:Orenonofile
# encoding: utf-8

increment 'B'
decrement 'r'
start_loop 'i'
end_loop 'n'
next_cursol 'f'
previous_cursol 'u'
display 'c'
read 'k'
~~~

## <i class="fa fa-file-code-o" style="font-size:1em;"></i>:baby_chick: Brainfuck 派生 Brainfuck 言語 のプログラムを生成する
先ほど `orenono generate 'Brainfuck'` で生成した文字列をもとにプログラムを生成する

~~~bash
% orenono generate '++++++++++[>++++++<-]>++++++.++++++++++++++++++++++++++++++++++++++++++++++++.-----------------.++++++++.+++++.--------.+++++++++++++++.------------------.++++++++.' > brainfuck_brainfuck.bf
% cat brainfuck_brainfuck.bf
BBBBBBBBBBifBBBBurnfBBBccccccccccBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBcrrrrrrrrrrrrrrrrrrrrrrrrrrrrrcrrrrrrrrrrrrrrrrrrrccccccBBBBBBBBBBBBBBBBBcrrrrrrrrrrrrrrrcBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBcrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrcrrrrrrrrrrrrrrrrrrrccccccBBBcrrrccccccccccccccccccccccccccccccccccccccccccccccccBBBcrcccccccccccccccccBcrrrccccccccBBBcrrrcccccBBBcrccccccccBcrrrcccccccccccccccBBBcrccccccccccccccccccBcrrrccccccccBBBc
~~~

## <i class="fa fa-code" style="font-size:1em;"></i> プログラムを AA にするためのひな形を作成するため banner コマンドを実行する

~~~bash
% banner Brainfuck

 XXXXXX                     X               XX                   XX
  X    X                                   X                      X
  X    X                                   X                      X
  X    X XXX XX   XXXX    XXX    XX XX    XXXX   XX  XX   XXXXX   X  XX
  XXXXX    XX  X      X     X     XX  X    X      X   X  X     X  X  X
  X    X   X      XXXXX     X     X   X    X      X   X  X        X X
  X    X   X     X    X     X     X   X    X      X   X  X        XXX
  X    X   X     X    X     X     X   X    X      X  XX  X     X  X  X
 XXXXXX  XXXXX    XXXX X  XXXXX  XXX XXX  XXXX     XX XX  XXXXX  XX   XX
~~~

## :gem::recycle: Ascii Art への変換プログラムを Ruby で作成します
banner コマンドの結果と、 Brainfuck 派生 Brainfuck 言語 のプログラムから
Ascii Art のプログラムを生成する処理を作成します。
処理内容の解説はしないので、気になる方はソースを読んでください。

`__END__` 以下は先ほど banner コマンドで作成した Ascii Art を貼り付けます

~~~ruby:ascii_art_converter.rb
template = DATA.read.gsub("\n", '')
bit_template = template.chars.map { |e|e == 'X' ? 1 : 0 }

answer_bf = File.read('brainfuck_brainfuck.bf').chomp
answer_bf_bytes = answer_bf.chars

dummy = '='
results = []
last = false
loop {
  bit_template.each do |char|
    c = (char == 0) ? ' ' : last ? dummy : answer_bf_bytes.shift
    results << c
    last = true if answer_bf_bytes.size == 0
  end
  break if last
}

print results.each_slice(80).map { |e|e.join + "\n" }.join

__END__
                                                                                
 XXXXXX                     X               XX                   XX             
  X    X                                   X                      X             
  X    X                                   X                      X             
  X    X XXX XX   XXXX    XXX    XX XX    XXXX   XX  XX   XXXXX   X  XX         
  XXXXX    XX  X      X     X     XX  X    X      X   X  X     X  X  X          
  X    X   X      XXXXX     X     X   X    X      X   X  X        X X           
  X    X   X     X    X     X     X   X    X      X   X  X        XXX           
  X    X   X     X    X     X     X   X    X      X  XX  X     X  X  X          
 XXXXXX  XXXXX    XXXX X  XXXXX  XXX XXX  XXXX     XX XX  XXXXX  XX   XX        
~~~

## :gem::running: Ascii Art への変換プログラムを実行します

~~~bash
% ruby ascii_art_converter.rb > brainfuck_brainfuck_ascii.bfbf
% cat brainfuck_brainfuck_ascii.bfbf

 BBBBBB                     B               BB                   Bi
  f    B                                   B                      B
  B    u                                   r                      n
  f    B BBc cc   cccc    ccc    BB BB    BBBB   BB  BB   BBBBB   B  BB
  BBBBB    BB  B      B     B     BB  B    B      B   B  B     B  B  B
  B    B   B      BBBBB     c     r   r    r      r   r  r        r r
  r    r   r     r    r     r     r   r    r      r   r  r        rrr
  r    r   r     r    r     r     c   r    r      r  rr  r     r  r  r
 rrrrrr  rrrrc    cccc c  BBBBB  BBB BBB  BBBB     BB cr  rrrrr  rr   rr

 rrrrrc                     B               BB                   BB
  B    B                                   B                      B
  B    B                                   B                      B
  B    B BBB BB   BBBB    BBB    BB BB    BBBB   BB  BB   BBBBB   B  BB
  Bcrrr    rr  r      r     r     rr  r    r      r   r  r     r  r  r
  r    r   r      rrrrr     r     r   r    r      r   c  r        r r
  r    r   r     r    r     r     r   r    r      r   r  r        rrr
  r    c   c     c    c     c     c   B    B      B  cr  r     r  c  c
 cccccc  ccccc    cccc c  ccccc  ccc ccc  cccc     cc cc  ccccc  cc   cc

 ccBBBc                     r               cc                   cc
  c    c                                   c                      c
  c    c                                   c                      c
  c    c ccc Bc   rrrc    ccc    cc cc    BBBc   rr  rc   ccccB   B  Bc
  rcccc    cc  c      c     B     cr  r    r      c   c  c     c  c  c
  c    c   c      ccccc     c     B   B    B      c   r  c        c c
  c    c   c     c    c     c     c   c    c      c   c  c        ccc
  B    c   r     r    r     c     c   c    c      c  cc  c     B  B  B
 c=====  =====    ==== =  =====  === ===  ====     == ==  =====  ==   ==
~~~

## :triumph::running: Orenono gem で Brainfuck 派生 Brainfuck 言語 のプログラム( Ascii Art Format ) を実行します

~~~bash
% orenono execute brainfuck_brainfuck_ascii.bfbf
++++++++++[>++++++<-]>++++++.++++++++++++++++++++++++++++++++++++++++++++++++.-----------------.++++++++.+++++.--------.+++++++++++++++.------------------.++++++++.%
~~~

## :rage1::running: 出力された Brainfuck のコードを ideone で実行します

~~~
++++++++++[>++++++<-]>++++++.++++++++++++++++++++++++++++++++++++++++++++++++.-----------------.++++++++.+++++.--------.+++++++++++++++.------------------.++++++++.
# => Brainfuck
~~~

[ideone 実行結果](http://ideone.com/WZjRAe)

## <i class="fa fa-flag-checkered" style="font-size:1em;"></i> Complete

無事、
Brainfuck 派生言語 generator の Orenono gem で
Brainfuck を構成する文字を基本命令とする Brainfuck 派生 Brainfuck 言語を作成し、
Brainfuck 派生 Brainfuck 言語 の Ascii Art のプログラムから
Brainfuck で Brainfuck という文字列を出力するための
ソースコードを標準出力することができました。

## :older_man: ちょっとだけ宣伝じゃぞ
こんな感じのネタコードをアピールしたり、コードゴルフをする問題を CodeIQ で定期的に出題してます。
基本的には 週に 1 問ペースで金曜日に出題し、3 週間挑戦を受付けています。
気が向いたらお越しください。

同じお題で、他の人と競いつつ **凄技（変態）** コードを公開してドヤリング :smirk: したい！
**凄技（変態）** コード仲間 :neckbeard::neckbeard::neckbeard: を増やしたい！
という方にうってつけです。

※採用とは関係無い問題なので、私の問題だけをやっている方にはスカウトなどは一切ありません。
転職の意思がなくても気兼ねなく挑戦できます。

### <i class="fa fa-users" style="font-size:1em;"></i> CodeIQ Question Creator Accounts
* [デスマコロシアム問題 Account](https://codeiq.jp/ace/tbpgr_colosseum_manager)
    * デスマコロシアムという、多言語でコードゴルフをする問題です
    * コードの文字数が短く、挑戦者の少ない言語を選ぶと有利になるトーナメントです
    * 詳しくはこちら <i class="fa fa-external-link" style="font-size:1em;"></i> [デスマコロシアム スライドショー](http://esa-pages.io/p/sharing/912/posts/14/187db727700ee5616a42-slides.html#/)
        * 上記のスライドショーは esa.io のスライド機能で作っています
* [バッジ付与問題 Account](https://codeiq.jp/ace/tbpgr_badge)
    * その時々でいろいろな問題を出しています
* [Rubictionary 問題 Account](https://codeiq.jp/ace/tbpgr_rubictionary/q1343)
    * Ruby の基本文法を選択式で解答し、最後に該当文法を解説するサンプルコードを作成し、サンプルコード力をアピールする問題
        * サンプルコードの話はこちら <i class="fa fa-external-link" style="font-size:1em;"></i> [Code as Communication](http://tbpgr.hatenablog.com/entry/2015/02/19/234543)

一部の問題は、締め切り後に優秀解答を CodeIQ MAGAZINE という Web MAGAZINE で公開しています。
例えば、下記は私が出題し、執筆・公開した結果記事です。

* <i class="fa fa-external-link" style="font-size:1em;"></i> [汚コードグランプリ！秀逸な汚コードにまみれた解答臭をご覧あれ](https://codeiq.jp/magazine/2015/02/21347/)

こんな感じで、**変態コード・おもしろコード・まっとうな凄いコード** をアピールできます。

私はこんな感じの自由度の高い奇人変人チックな問題ばかり出していますが、
他の出題者様は、 アルゴリズム・数学などを基本とした問題を出題される方が多いです。

## :books: 外部資料
* <i class="fa fa-slideshare" style="font-size:1em;"></i> [orenono gem Slide](http://tbpgr.github.io/orenono_slide/#/)