Talk:Execute Brain****: Difference between revisions

From Rosetta Code
Content added Content deleted
(There's a place for that.)
(do while not repeat until)
 
(One intermediate revision by one other user not shown)
Line 2: Line 2:
:You're welcome to bring examples in from there as long as you check for license compatibility and probably give credit. --[[User:Mwn3d|Mwn3d]] 13:21, 1 March 2011 (UTC)
:You're welcome to bring examples in from there as long as you check for license compatibility and probably give credit. --[[User:Mwn3d|Mwn3d]] 13:21, 1 March 2011 (UTC)
:: The place for something like that would be [[Execute Brain****/Brain****]]. I favor reimplementation over wholesale copying, and the copy case needs appropriate citation and license from the copyright holder. --[[User:Short Circuit|Michael Mol]] 13:47, 1 March 2011 (UTC)
:: The place for something like that would be [[Execute Brain****/Brain****]]. I favor reimplementation over wholesale copying, and the copy case needs appropriate citation and license from the copyright holder. --[[User:Short Circuit|Michael Mol]] 13:47, 1 March 2011 (UTC)
Hey, the author of the Potion example here. Sorry that my example was erroneous -- I had only tested it on a basic hello-world program (!). Anyways, Potion might have some bugs that affects the solution, but clearly a part of the error lies in the logic, as a Python translation also doesn't seem to work as desired. Here is the Python translation:

<lang python>import sys # for exception raising

def bf(code):
tape = [0]
tape_pos = 0
brackets = []
i = 0
while i < len(code):
if code[i] == ">":
tape_pos += 1
if tape_pos == len(tape):
tape.append(0)
elif code[i] == "<":
tape_pos -= 1
if tape_pos < 0:
raise IndexError("""
Out of bounds.
Can't go to negative indexes of tape.
Tape indexes are defined as [0, inf) and not as (-inf, inf).
""")
elif code[i] == "+":
tape[tape_pos] += 1
elif code[i] == "-":
tape[tape_pos] -= 1
elif code[i] == ".":
print(chr(tape[tape_pos]), end="")
elif code[i] == ",":
tape[tape_pos] = ord(sys.stdin.read(1))
elif code[i] == "[":
brackets.append(i)
elif code[i] == "]":
if tape[tape_pos] == 0:
brackets.pop()
else:
i = brackets[-1]
i += 1</lang>

And with debugging/interpreter-portability in mind:
<lang python>import sys # for exception raising

MIN = 0
MAX = 255
WRAP = True
TWOWAY = False

def bf(code):
tape = [0]
tape_pos = 0
brackets = []
i = 0
while i < len(code):
if code[i] == ">":
tape_pos += 1
if tape_pos == len(tape):
tape.append(0)
elif code[i] == "<":
tape_pos -= 1
if tape_pos < 0:
if TWOWAY:
tape.insert(0, 0) # Kinda ugly hack.
tape_pos = 0 # Kinda ugly hack.
else:
raise IndexError("""
Out of bounds.
Can't go to negative indexes of tape.
Tape indexes are defined as [0, inf) and not as (-inf, inf).
""")
elif code[i] == "+":
tape[tape_pos] += 1
if tape[tape_pos] > MAX:
if WRAP:
tape[tape_pos] = MIN
else:
raise OverflowError("""
Overflow -- cell value exceeded `MAX`.
tape[tape_pos] > MAX;
tape[tape_pos]=={0};
tape_pos=={1};
code_pos=={2}
""".format(tape[tape_pos], tape_pos, i))
elif code[i] == "-":
tape[tape_pos] -= 1
if tape[tape_pos] < MIN:
if WRAP:
tape[tape_pos] = MAX
else:
raise OverflowError("""
Underflow -- cell value below `MIN`.
tape[tape_pos] < MIN;
tape[tape_pos]=={0};
tape_pos=={1};
code_pos=={2}""".format(tape[tape_pos], tape_pos, i))
elif code[i] == ".":
print(chr(tape[tape_pos]), end="")
elif code[i] == ",":
tape[tape_pos] = ord(sys.stdin.read(1))
elif code[i] == "[":
brackets.append(i)
elif code[i] == "]":
if tape[tape_pos] == 0:

brackets.pop()
else:
i = brackets[-1]
i += 1</lang>
Can someone point out the error? :P [[User:Raigenbauf|Raigenbauf]] ([[User talk:Raigenbauf|talk]]) 01:00, 26 May 2016 (UTC)
: To quote the main page "<code>[</code> Jump past the matching ] if the cell under the pointer is 0".
: The brackets <code>[ ]</code> provide a <code>while not zero do ...</code> loop not a <code>repeat ... until zero</code>
: [[User:Rdebath|Rdebath]] ([[User talk:Rdebath|talk]]) 03:52, 22 July 2016 (UTC)

Latest revision as of 03:52, 22 July 2016

How about imterpreters of Brainfuck on Brainfuck ?

You're welcome to bring examples in from there as long as you check for license compatibility and probably give credit. --Mwn3d 13:21, 1 March 2011 (UTC)
The place for something like that would be Execute Brain****/Brain****. I favor reimplementation over wholesale copying, and the copy case needs appropriate citation and license from the copyright holder. --Michael Mol 13:47, 1 March 2011 (UTC)

Hey, the author of the Potion example here. Sorry that my example was erroneous -- I had only tested it on a basic hello-world program (!). Anyways, Potion might have some bugs that affects the solution, but clearly a part of the error lies in the logic, as a Python translation also doesn't seem to work as desired. Here is the Python translation:

<lang python>import sys # for exception raising

def bf(code):

  tape = [0]
  tape_pos = 0
  brackets = []
  i = 0
  while i < len(code):
     if code[i] == ">":
        tape_pos += 1
        if tape_pos == len(tape):
           tape.append(0)
     elif code[i] == "<":
        tape_pos -= 1
        if tape_pos < 0:
           raise IndexError("""
              Out of bounds.
              Can't go to negative indexes of tape.
              Tape indexes are defined as [0, inf) and not as (-inf, inf).
              """)
     elif code[i] == "+":
        tape[tape_pos] += 1
     elif code[i] == "-":
        tape[tape_pos] -= 1
     elif code[i] == ".":
        print(chr(tape[tape_pos]), end="")
     elif code[i] == ",":
        tape[tape_pos] = ord(sys.stdin.read(1))
     elif code[i] == "[":
        brackets.append(i)
     elif code[i] == "]":
        if tape[tape_pos] == 0:
           brackets.pop()
        else:
           i = brackets[-1]
     i += 1</lang>

And with debugging/interpreter-portability in mind: <lang python>import sys # for exception raising

MIN = 0 MAX = 255 WRAP = True TWOWAY = False

def bf(code):

  tape = [0]
  tape_pos = 0
  brackets = []
  i = 0
  while i < len(code):
     if code[i] == ">":
        tape_pos += 1
        if tape_pos == len(tape):
           tape.append(0)
     elif code[i] == "<":
        tape_pos -= 1
        if tape_pos < 0:
           if TWOWAY:
              tape.insert(0, 0)  # Kinda ugly hack.
              tape_pos = 0  # Kinda ugly hack.
           else:
              raise IndexError("""
                 Out of bounds.
                 Can't go to negative indexes of tape.
                 Tape indexes are defined as [0, inf) and not as (-inf, inf).
                 """)
     elif code[i] == "+":
        tape[tape_pos] += 1
        if tape[tape_pos] > MAX:
           if WRAP:
              tape[tape_pos] = MIN
           else:
              raise OverflowError("""
                 Overflow -- cell value exceeded `MAX`.
                 tape[tape_pos] > MAX;
                 tape[tape_pos]=={0};
                 tape_pos=={1};
                 code_pos=={2}
                 """.format(tape[tape_pos], tape_pos, i))
     elif code[i] == "-":
        tape[tape_pos] -= 1
        if tape[tape_pos] < MIN:
           if WRAP:
              tape[tape_pos] = MAX
           else:
              raise OverflowError("""
                 Underflow -- cell value below `MIN`.
                 tape[tape_pos] < MIN;
                 tape[tape_pos]=={0};
                 tape_pos=={1};
                 code_pos=={2}""".format(tape[tape_pos], tape_pos, i))
     elif code[i] == ".":
        print(chr(tape[tape_pos]), end="")
     elif code[i] == ",":
        tape[tape_pos] = ord(sys.stdin.read(1))
     elif code[i] == "[":
        brackets.append(i)
     elif code[i] == "]":
        if tape[tape_pos] == 0:
           brackets.pop()
        else:
           i = brackets[-1]
     i += 1</lang>

Can someone point out the error? :P Raigenbauf (talk) 01:00, 26 May 2016 (UTC)

To quote the main page "[ Jump past the matching ] if the cell under the pointer is 0".
The brackets [ ] provide a while not zero do ... loop not a repeat ... until zero
Rdebath (talk) 03:52, 22 July 2016 (UTC)