明けましておめでとうございます

http://nengajyozu.net/nengaillust/dragon/dragon_f02.png

明けましておめでとうございます。




asciifi all the iamges
このAAコンバーターを使うとこんなAscii Artになる。

                                           
          00 00                            
           0000000                         
      1000   0000000                       
      10000   000000                       
     1 0000  00000000                      
    010000    0000000                      
    00000    01100000                      
   00001    111110000                      
  0001 100 0111110000                     
 0011   0    1111000  0000                 
      000    11100000000000                
     001     111000 0000000                
    00       1100000000 0000               
 1000 1      11000 0000  000  00           
             10000 000   0000000           
            11000  0000  0000010           
            1000   0000 00000100           
            100    0000000001100           
           100000000000000111100           
           11110000000001111 100           
            111111111111111  100 000       
                111111111    100000000     
                             100111000     
                             111111100     
                             111 01100     
                                  1100     
                                  110      
                                  100      
                                 110       
                                 10     01 
                                10001111   
                                1111       
                                          

さらにこれをBrainfuckにすると以下になる。
Brainfuckとは
Brainfuck -Wikipedia-
Brainf*ck -Kazuhiro Inaba-

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

実装

Groovy版の実装がもうあったので、ありがたく使わせもらう。
普通はBrainfuckの実装を楽しむものなんだけどね。(^_^;)

[twitter:@fumokmm]版:GroovyでBrainf*ckインタープリタを実装してみた
[twitter:@uehaj]版:どう書く.org課題「BFコンパイラー」


複数行でもOKな@fumokmm版を使用した。

class BrainFuck {
  String source
  def tape
  int pointer
  def parenMap

  BrainFuck(source) {
    this.source = source
    this.tape = [0]
    this.pointer = 0
    this.parenMap = makeParenMap()
  }

  def makeParenMap() {
    def list = []
    source.eachWithIndex{ s, idx -> list << [idx, s] }
    list = list.findAll{ it[1] =~ /[\[\]]/ }
    assert list*.get(1).with{ it.count('[') == it.count(']') }
    def stack = []
    def map = [:]
    list.each {
      def idx = it[0]
      def c = it[1]
      if(c == '[') stack << idx
      else {
        def from = stack.pop()
        def to = idx
        map[from] = to
        map[to] = from
      }
    }
    map
  }

  /** main process */
  def run() {
    int cursor = 0
    while(cursor < source.size()) {
      switch(source[cursor]) {
        case '>':
          pointer++;
          if(!tape[pointer]) tape[pointer] = 0;
          break
        case '<': pointer--; break
        case '+': tape[pointer]++; break
        case '-': tape[pointer]--; break
        case '.': print tape[pointer] as char; break
        case ',': getChar(); break
        case '[': if (tape[pointer] == 0) cursor = parenMap[cursor]; break
        case ']': if (tape[pointer] != 0) cursor = parenMap[cursor]; break
      }
      cursor++
    }
  }

  /** read from STDIN */
  String getChar() {
    // TODO
  }
}

new BrainFuck(new File(args[0]).text).run()

実行結果

groovy BrainF_ck.groovy 2012.txt
HAPPY NEW YEAR!!


本年もG*でいろいろ遊ばせてもらますので、よろしくお願いします。