Разбор проблем Brainfuck в Python

Silquetoast спросил: 31 июля 2018 в 09:56 в: python

Я делаю компилятор для Brainfuck на Python в качестве практики с языком. Большинство символов не было слишком сложной задачей, но я абсолютно зациклен на [ и ].

Вот что я до сих пор

global cells
global pointer
cells = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
pointer = 0#bfcode = list(input())
bfcode = list("+x+++,[>++++<-]>.")
for i in range(len(bfcode)):
    if(bfcode[i] == "."):
        print(cells[pointer])
    elif(bfcode[i] == ","):
        charin = list(input("Write one character: "))[0]
        cells[pointer] = ord(charin)
    elif(bfcode[i] == "+"):
        cells[pointer] += 1
    elif(bfcode[i] == "-"):
        cells[pointer] -= 1
    elif(bfcode[i] == ">"):
        pointer += 1
    elif(bfcode[i] == "<"):
        pointer -= 1
    elif(bfcode[i] == "["):
        print("PLACEHOLDER")
    elif(bfcode[i] == "]"):
        print("PLACEHOLDER")
    else:
        print("Non-brainfuck character detected")
    print(cells)

Итак, как новичок в Python, мой первый инстинкт заключается в том, чтобы как-то вернуться в цикл for, но из того, что я могу сказать, это невозможно в Python. У меня есть googled решения, чтобы идти назад в цикле, но все они далеко за пределами моего понимания на данный момент ...

Есть ли простой способ вернуться назад в цикл for, который я как-то пропустил ? Или, может быть, есть более простой способ сделать это все вместе?

Другие советы и предложения для моего кода тоже ценятся, так как я все еще участвую:)

1 ответ

mono ответил: 31 июля 2018 в 10:05

Вот что я сделал:

elif ins == '[':
                # only does stuff if memory isnt zero
                if mem[ptr] == 0:
                    # initialistation
                    count = 0
                    ic += 1
                    # keeps going until the end of the program
                    while ic <= len(self.prg):
                        # sets instruction
                        ins = self.prg[ic]
                        # if has found the matching bracket, it ends
                        if ins == ']' and count == 0:
                            break
                        # deals with nested loops
                        elif ins == '[':
                            count += 1
                        elif ins == ']':
                            count -= 1
                        # moves forward one place in the program
                        ic += 1
            # its an algorithim, dont ask
            elif ins == ']':
                # only does stuff if memory is zero
                if mem[ptr] != 0:
                    # initialistation
                    count = 0
                    ic -= 1
                    # keeps going until the end of the program
                    while ic >= 0:
                        # sets instruction
                        ins = self.prg[ic]
                        # if has found the matching bracket, it ends
                        if ins == '[' and count == 0:
                            break
                        # deals with nested loops
                        elif ins == ']':
                            count += 1
                        elif ins == '[':
                            count -= 1
                        # moves backward one place in the program
                        ic -= 1

Он может не использовать ту же структуру, что и вы, но должен дать вам несколько идей.

Короче говоря, Вы перебираете код, добавляя один при нахождении открытой скобки и вычитая один при нахождении закрывающей скобки, чтобы найти соответствующую закрывающую скобку.

mono ответил: 31 июля 2018 в 10:05
ins = bfcode [i]