2016-11-07 2 views
0

Итак, я пытаюсь сделать интерпретатор Brainfuck, однако в цикле while, который я использую для выполнения цикла Brainfuck, он вырывается, хотя только одно условие правда.Петля останавливается, хотя истинно только одна из двух переменных

Пример:

+++[>+<-] 

должно привести к:

[0, 3] 

Однако, когда цикл начинается в [, она будет создавать новую ячейку, так что структура идет от [3] к [3, 0]. Таким образом, текущая рабочая ячейка составляет 0, и цикл выходит из строя. Тем не менее, у меня есть только разрыв, если он равен 0, а текущий символ - ].

cells = [0] # Array of data cells in use 
brainfuck = str(input("Input Brainfuck Code: ")) # Brainfuck code 
workingCell = 0 # Data pointer position 
count = 0 # Current position in code 
def commands(command): 
    global cells 
    global workingCell 
    if command == ">": 
     workingCell += 1 
     if workingCell > len(cells) - 1: 
      cells.append(0) 
    elif command == "<": 
     workingCell -= 1 
    elif command == "+": 
     cells[workingCell] += 1 
    elif command == "-": 
     cells[workingCell] -= 1 
    elif command == ".": 
     print(chr(cells[workingCell])) 
    elif command == ",": 
     cells[workingCell] = int(input("Input: ")) 
def looper(count): 
    global cells 
    global workingCell 
    print("START LOOP", count) 
    count += 1 
    looper = loopStart = count 
    while brainfuck[looper] != "]" and cells[workingCell] != 0: # This line is causing trouble 
     if brainfuck[looper] == "]": 
      looper = loopStart 
     commands(brainfuck[looper]) 
     count += 1 
     looper += 1 
    return count 
while count < len(brainfuck): 
    if brainfuck[count] == "[": 
     count = looper(count) 
     print("END LOOP", count) 
    else: 
     commands(brainfuck[count]) 
    count += 1 

Заранее спасибо.

+0

Какова логика '+++ [> + <-]' ->' [0, 3] '? –

+5

* «Извините за все утверждения печати» * - нет, это часть вашей работы, чтобы уменьшить код до [mcve], а не просто сбрасывать его на нас как есть. – jonrsharpe

+2

Вы используете одно и то же имя для функции и переменной?!? –

ответ

1

Я его разорвать, только если это 0 и текущий характер ]

Если это то, что вы хотите, у вас есть логика в вашей while неправильно. Оно должно быть:

while not (brainfuck[looper] == "]" and cells[workingCell] == 0): 

И согласно deMorgan's Laws, когда вы распространяете not через and, вы меняете каждого из условий и изменения and в or, поэтому она должна быть:

while brainfuck[looper] != "]" or cells[workingCell] != 0: 

Если это что вы можете просто написать:

while True: 
    if brainfuck[looper] == "]" and cells[workingCell] == 0: 
     break 

Это отражает то, что вы сказали в описании в точности.

Смежные вопросы