2017-01-13 15 views
5

Ben python için nispeten yeni başlayan biriyim ve becerilerimi güçlendirmek için, Brainfu** dili için bir derleyici yazmayı deniyorum. Tüm [] köşeli ayraçlar hariç, iyidir.Python Brainf *** - Bugs açıkken hatalar

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] 

(çizgiler yineleme biçimlendirilir, daha sonra listesi: Benim kod sınamak için kullanıyorum programı bu çalıştırdığınızda yapar, ancak, 5'e hücreyi 2 hazırlayacak olan >++[>++<-]>+ olduğunu bu noktada, daha sonra değeri odaklanmış ve daha sonra karakter üzerinde çalışmakta olan.)

Benim şu anki kod çalışıyor

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 sonraki ayraç nerede olduğunu bulmak için çalışıyor ve posOfBegin olduğunu nerede olduğunu öğren akilli ayraç. for döngüler kendi C/C++ muadilleri farklıdır

i += posOfEnd+1 

ve

i = posOfBegin 

Ancak piton:

+2

Python yineleyicileri, aradığınız gibi aralığından (0, len (karakter)) fazla gibi görünüyor. Döngüde 'i' değiştirmenin bir etkisi yoktur. – melpomene

cevap

5

Ben sorun döngü sırasında değiştirmek için döngü değişkeni i olduğunu varsayalım. Python'da i değişkeni, sağladığınız yinelenebilir her bir öğeye, bu durumda range'a ayarlanacaktır. range(n), 0'dan n-1'a kadar tüm sayıları içeren bir listeyi değerlendirir. Döngü değişkeninizi bir yineleme sırasında değiştirirseniz, bu değişiklik yalnızca yineleme için kalır, ancak bir sonraki yineleme için döngü değişkenine yinelenebilir olanın bir sonraki öğesi atanır (değişikliklerinizi korumaz).

Bunun yerine while döngüsünü kullanmak isteyebilirsiniz.

İlgili konular