Execute Brain****/Ruby: Difference between revisions
Content added Content deleted
m (needs attention: nested loops) |
(handle nested loops) |
||
Line 1: | Line 1: | ||
{{implementation|Brainf***}}{{collection|RCBF}}[[Category:Ruby]] |
{{implementation|Brainf***}}{{collection|RCBF}}[[Category:Ruby]] |
||
{{needs-review|Ruby|'''Does not handle nested loops.'''}} |
|||
More effort could be made to read a program from a file or from stdin. |
More effort could be made to read a program from a file or from stdin. |
||
Line 7: | Line 6: | ||
@d = [0] * 30_000 |
@d = [0] * 30_000 |
||
@program = program |
@program = program |
||
@jumpback_table = read_program |
|||
end |
|||
def read_program |
|||
jumpback_table = {} |
|||
nest_level = 0 |
|||
start_idx = [] |
|||
@program.each_char.each_with_index do |char, idx| |
|||
case char |
|||
when "[" |
|||
start_idx[nest_level] = idx |
|||
nest_level += 1 |
|||
when "]" |
|||
nest_level -= 1 |
|||
jumpback_table[idx] = start_idx[nest_level] |
|||
end |
|||
end |
|||
jumpback_table |
|||
end |
end |
||
Line 36: | Line 53: | ||
when ?[ then |
when ?[ then |
||
if @d[dc] == 0 |
if @d[dc] == 0 |
||
pc |
pc = @jumpback_table.invert[pc] |
||
p " #{[pc,@program[pc].chr].inspect}" if $DEBUG |
p " #{[pc,@program[pc].chr].inspect}" if $DEBUG |
||
end |
end |
||
when ?] then |
when ?] then |
||
if @d[dc] != 0 |
if @d[dc] != 0 |
||
pc |
pc = @jumpback_table[pc] |
||
p " #{[pc,@program[pc].chr].inspect}" if $DEBUG |
p " #{[pc,@program[pc].chr].inspect}" if $DEBUG |
||
end |
end |
||
Line 49: | Line 66: | ||
end |
end |
||
end |
end |
||
end |
end |
||
Test: |
|||
⚫ | |||
⚫ | |||
helloworld = <<PROGRAM |
|||
=> "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>." |
|||
++++++++++[>+++++++>++++++++++>+++>+<<<<-] |
|||
⚫ | |||
⚫ | |||
=> #<RCBF:0x7ff537d0 @d=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
|||
PROGRAM |
|||
... |
|||
⚫ | |||
irb(main):050:0> bf.run |
|||
bf.run |
|||
⚫ | |||
⚫ | |||
# use nested loop to increment count to 64 and print (should be '@')" |
|||
# 64 = 4*4*4 |
|||
nestedloop = '>>++++[<++++[<++++>-]>-]<<.[-]++++++++++.' |
|||
bf = RCBF.new(nestedloop) |
|||
bf.run</lang> |
|||
Output: |
|||
<pre>Hello World! |
|||
⚫ |