2017-01-13 15 views
5

Jestem względnym początkującym w stosunku do Pythona, a aby wzmocnić swoje umiejętności, próbuję (pisząc) napisać kompilator dla języka Brainfu**. Wszystko jest dobrze, z wyjątkiem pętli wspornika []. Program używam do testowania mojego kodu jest >++[>++<-]>+, która powinna określać komórkę od 2 do 5. Gdy uruchomię to jednak robi to:Python Brainf *** - Błędy w pętlach while

0 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0 > 
1 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1 + 
2 [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2 + 
3 [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2 [ 
4 [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 0 > 
5 [0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1 + 
6 [0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2 + 
7 [0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2 < 
8 [0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1 - 
3 [0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 1 [ 
10 [0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 2 > 
11 [0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 3 + 
[0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

(Linie są sformatowane w iteracji, lista w tym momencie, to wartość to koncentruje się na czym postać jest uruchomiony.)

Mój obecny kod jest

def generateArray(code): 
    array = [] 
    for i in range(0,20): 
     array.append(0); 
    return array 

def run(code): 
    print code 
    data = generateArray(code) 
    chars = list(code) 
    pointer = 0 

    for i in range(0, len(chars)): 
     current = chars[i] 
     if(current == "+"): 
      data[pointer] += 1 

     if(current == ">"): 
      pointer += 1 

     if(current == "-"): 
      data[pointer] -= 1 

     if(current == "<"): 
      pointer -= 1 

     if(current == "."): 
      print str(chr(data[pointer])) 

     if(current == ","): 
      given = raw_input() 
      data[pointer] = ord(given) 

     if(current == "["): 
      posOfEnd = chars[i:len(chars)].index("]") 
      if(data[pointer] == 0): 
       i += posOfEnd+1 

     if(current == "]"): 
      posOfBegin = len(chars) - 1 - chars[::-1].index('[') 
      i = posOfBegin 



     print i, data, data[pointer], chars[i] 

    return data 

print run(">++[>++<-]>+") 

posOfEnd próbuje dowiedzieć się, gdzie obok wspornik jest i posOfBegin próbuje dowiedzieć się, gdzie pre vious bracket jest.

+2

Wygląda na to, że python przechodzi przez 'zakres (0, len (znaki)) zgodnie z poleceniem. Modyfikowanie 'i' w pętli nie ma żadnego efektu. – melpomene

Odpowiedz

5

Przypuszczam, że problem jest zmienna pętla i które można modyfikować podczas pętli:

i += posOfEnd+1 

i

i = posOfBegin 

Jednak pyton for pętle różnią się od ich C/C++ odpowiedników. W pythonie zmienna i zostanie ustawiona na każdy element iteracji, który podasz, w tym przypadku range. range(n) oblicza listę zawierającą wszystkie numery od 0 do n-1. Jeśli zmodyfikujesz zmienną pętli podczas iteracji, ta modyfikacja pozostanie tylko dla tej iteracji, ale dla następnej iteracji zmienna pętli zostanie przypisana do następnego elementu iteracji (nie zachowując twoich modyfikacji).

Zamiast tego możesz użyć pętli while.