概要
Brainfuck 派生言語 generator の Orenono gem で
Brainfuck を構成する文字を基本命令とする Brainfuck 派生 Brainfuck 言語を作成し、
Brainfuck 派生 Brainfuck 言語 の Ascii Art のプログラムから
Brainfuck で Brainfuck という文字列を出力するための
ソースコードを標準出力します
前提
orenono gem をインストール済み( orenono は Ruby の gem です )
% gem install orenono
Brainfuck 派生 Brainfuck 言語 で作成するプログラムの出力対象となる Brainfuck
という文字列を出力する Brainfuck のコードを生成する
% orenono generate 'Brainfuck'
++++++++++[>++++++<-]>++++++.++++++++++++++++++++++++++++++++++++++++++++++++.-----------------.++++++++.+++++.--------.+++++++++++++++.------------------.++++++++.

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

Orenonofile を生成する
$ orenono i
$ ls Orenonofile
Orenonofile

Orenonofile を編集する
# encoding: utf-8
increment 'B'
decrement 'r'
start_loop 'i'
end_loop 'n'
next_cursol 'f'
previous_cursol 'u'
display 'c'
read 'k'
Brainfuck 派生 Brainfuck 言語 のプログラムを生成する
先ほど orenono generate 'Brainfuck'
で生成した文字列をもとにプログラムを生成する
% orenono generate '++++++++++[>++++++<-]>++++++.++++++++++++++++++++++++++++++++++++++++++++++++.-----------------.++++++++.+++++.--------.+++++++++++++++.------------------.++++++++.' > brainfuck_brainfuck.bf
% cat brainfuck_brainfuck.bf
BBBBBBBBBBifBBBBurnfBBBccccccccccBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBcrrrrrrrrrrrrrrrrrrrrrrrrrrrrrcrrrrrrrrrrrrrrrrrrrccccccBBBBBBBBBBBBBBBBBcrrrrrrrrrrrrrrrcBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBcrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrcrrrrrrrrrrrrrrrrrrrccccccBBBcrrrccccccccccccccccccccccccccccccccccccccccccccccccBBBcrcccccccccccccccccBcrrrccccccccBBBcrrrcccccBBBcrccccccccBcrrrcccccccccccccccBBBcrccccccccccccccccccBcrrrccccccccBBBc
プログラムを AA にするためのひな形を作成するため banner コマンドを実行する
% 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

Ascii Art への変換プログラムを Ruby で作成します
banner コマンドの結果と、 Brainfuck 派生 Brainfuck 言語 のプログラムから
Ascii Art のプログラムを生成する処理を作成します。
処理内容の解説はしないので、気になる方はソースを読んでください。
__END__
以下は先ほど banner コマンドで作成した Ascii Art を貼り付けます
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

Ascii Art への変換プログラムを実行します
% 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===== ===== ==== = ===== === === ==== == == ===== == ==

Orenono gem で Brainfuck 派生 Brainfuck 言語 のプログラム( Ascii Art Format ) を実行します
% orenono execute brainfuck_brainfuck_ascii.bfbf
++++++++++[>++++++<-]>++++++.++++++++++++++++++++++++++++++++++++++++++++++++.-----------------.++++++++.+++++.--------.+++++++++++++++.------------------.++++++++.%

出力された Brainfuck のコードを ideone で実行します
++++++++++[>++++++<-]>++++++.++++++++++++++++++++++++++++++++++++++++++++++++.-----------------.++++++++.+++++.--------.+++++++++++++++.------------------.++++++++.
# => Brainfuck
Complete
無事、
Brainfuck 派生言語 generator の Orenono gem で
Brainfuck を構成する文字を基本命令とする Brainfuck 派生 Brainfuck 言語を作成し、
Brainfuck 派生 Brainfuck 言語 の Ascii Art のプログラムから
Brainfuck で Brainfuck という文字列を出力するための
ソースコードを標準出力することができました。
ちょっとだけ宣伝じゃぞ
こんな感じのネタコードをアピールしたり、コードゴルフをする問題を CodeIQ で定期的に出題してます。
基本的には 週に 1 問ペースで金曜日に出題し、3 週間挑戦を受付けています。
気が向いたらお越しください。
同じお題で、他の人と競いつつ 凄技(変態) コードを公開してドヤリング したい!
凄技(変態) コード仲間 を増やしたい!
という方にうってつけです。
※採用とは関係無い問題なので、私の問題だけをやっている方にはスカウトなどは一切ありません。
転職の意思がなくても気兼ねなく挑戦できます。
CodeIQ Question Creator Accounts
-
デスマコロシアム問題 Account
- デスマコロシアムという、多言語でコードゴルフをする問題です
- コードの文字数が短く、挑戦者の少ない言語を選ぶと有利になるトーナメントです
- 詳しくはこちら デスマコロシアム スライドショー
- 上記のスライドショーは esa.io のスライド機能で作っています
-
バッジ付与問題 Account
- その時々でいろいろな問題を出しています
-
Rubictionary 問題 Account
- Ruby の基本文法を選択式で解答し、最後に該当文法を解説するサンプルコードを作成し、サンプルコード力をアピールする問題
- サンプルコードの話はこちら Code as Communication
- Ruby の基本文法を選択式で解答し、最後に該当文法を解説するサンプルコードを作成し、サンプルコード力をアピールする問題
一部の問題は、締め切り後に優秀解答を CodeIQ MAGAZINE という Web MAGAZINE で公開しています。
例えば、下記は私が出題し、執筆・公開した結果記事です。
こんな感じで、変態コード・おもしろコード・まっとうな凄いコード をアピールできます。
私はこんな感じの自由度の高い奇人変人チックな問題ばかり出していますが、
他の出題者様は、 アルゴリズム・数学などを基本とした問題を出題される方が多いです。