Я пытаюсь реализовать интерпретатор Smallf * ck.
Smallfuck - еще более лаконичный диалект Brainfuck c, который работает с битами вместо байтов, имеет ограниченный размер ленты памяти и не имеет команд ввода / вывода. Таким образом, осталось только 5 команд:
* : flip the current bit;
> : increment the data pointer (move it to the next cell to the right);
< : decrement the data pointer (move it to the next cell to the left);
[ : “begin loop”:
if the current bit is 1, increment the instruction pointer
(move it to the next command to the right), otherwise,
move it to the next command to the right of the matching ] command;
] : “end loop”:
if the current bit is 0, increment the instruction pointer,
otherwise move it to the next command to the right of the matching [ command.
Can also be interpreted as unconditional jump to the matching [ command,
since [ performs an extra check itself.
Пример ввода: "*>*>*>*>*>*>*>*", "00101100"
должен вернуть "11010011"
Моя реализация пока:
def interpreter(code, tape):
ptr, cmd_pos = 0, 0
tape = [int(num) for num in tape]
while ptr < len(tape) and cmd_pos < len(code):
if code[cmd_pos] == ">":
ptr += 1
elif code[cmd_pos] == "<":
ptr -= 1
elif code[cmd_pos] == "*":
tape[ptr] = 1 if tape[ptr] == 0 else 0
elif code[cmd_pos] == "[":
if tape[ptr] == 0:
found = False
while not found:
cmd_pos += 1
if code[cmd_pos] == "]":
found = True
elif code[cmd_pos] == "]":
found = False
while not found:
cmd_pos -= 1
if code[cmd_pos] == "[":
found = True
cmd_pos += 1
return ''.join([str(num) for num in tape])
Есть также вопрос codewars, поэтому я делаю это: https://www.codewars.com/kata/58678d29dbca9a68d80000d7/train/python
Я не знаю, что не так с моим кодом ... Основы c все работает, но петли нет. В некоторых тестовых случаях на codewars я создаю бесконечное l oop, и я не знаю почему.
Помощь будет очень полезна, может быть, кому-то даже очень весело реализовать это: