LoginSignup
3
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-02-25

:scream: 概要

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

:raised_hand: 前提

orenono gem をインストール済み( orenono は Ruby の gem です )

% gem install orenono

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

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

:pencil2::triangular_ruler: Brainfuck 派生 Brainfuck 言語 の 文法定義

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

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

$ orenono i
$ ls Orenonofile
Orenonofile

:triumph::pencil: 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'

:baby_chick: 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

:gem::recycle: Ascii Art への変換プログラムを Ruby で作成します

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

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

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::runner: 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=====  =====    ==== =  =====  === ===  ====     == ==  =====  ==   ==

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

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

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

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

ideone 実行結果

Complete

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

:older_man: ちょっとだけ宣伝じゃぞ

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

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

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

CodeIQ Question Creator Accounts

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

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

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

:books: 外部資料

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2