Skip to content

Instantly share code, notes, and snippets.

@ferrous26
Last active December 11, 2015 07:38
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ferrous26/4567751 to your computer and use it in GitHub Desktop.
Save ferrous26/4567751 to your computer and use it in GitHub Desktop.
Brainfuck interpreter in Ruby
#!/usr/bin/env ruby
mem = Array.new(30_000)
iptr = dptr = 0
prog = File.read ARGV.first
jmp = lambda { |op, a, b|
(iptr = iptr.send(op, 1); jmp.call(op, a, b) if prog[iptr] == a) until prog[iptr] == b
}
nop = lambda {}
cmds = {
'>' => lambda { dptr += 1 },
'<' => lambda { dptr -= 1 },
'+' => lambda { mem[dptr] = mem[dptr].to_i + 1 },
'-' => lambda { mem[dptr] = mem[dptr].to_i - 1 },
'.' => lambda { $stdout.printf mem[dptr].chr },
',' => lambda { mem[dptr] = $stdin.readbyte },
'[' => lambda { jmp.call(:+, '[', ']') if mem[dptr].to_i.zero? },
']' => lambda { jmp.call(:-, ']', '[') unless mem[dptr].to_i.zero? }
}
(cmds.fetch(prog[iptr], nop).call; iptr += 1) while prog[iptr]
+++++ +++++ initialize counter (cell #0) to 10
[ use loop to set the next four cells to 70/100/30/10
> +++++ ++ add 7 to cell #1
> +++++ +++++ add 10 to cell #2
> +++ add 3 to cell #3
> + add 1 to cell #4
<<<< - decrement counter (cell #0)
]
> ++ . print 'H'
> + . print 'e'
+++++ ++ . print 'l'
. print 'l'
+++ . print 'o'
> ++ . print ' '
<< +++++ +++++ +++++ . print 'W'
> . print 'o'
+++ . print 'r'
----- - . print 'l'
----- --- . print 'd'
> + . print '!'
> . print '\n'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment