Brainfuck Interpreter

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

@BlackJack: Ich steh' grad auf dem Schlauch. Das("sys.stdin.read(1)") verhält sich doch wie raw_input unter Windows, Abschluss der Eingabe mit einem Enter. Und gerade das war nicht gewollt?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Nein, so verhält sich das ``sys.stdin.read(1)`` nicht. Das liest genau ein Byte von der Standardeingabe des Prozesses. Das was Du beobachtest ist wahrscheinlich das Verhalten des Terminals was die Eingabe erst an den Prozess weiterleitet, wenn Du entweder das Zeichen für eine neue Zeile durch die Eingabetaste erzeugst oder den Datenstrom mit der entsprechenden Tastenkombination beendest. Unter Unix ist das Ctrl+D und unter Windows Ctrl+Z. Auf jeden Fall ist das das Verhalten was alle anderen (mit bekannten) BF-Interpreter an den Tag legen und was auch Sinn macht. Denn man möchte Ein- und Ausgabe in der Regel umleiten können.
fail
User
Beiträge: 122
Registriert: Freitag 11. Januar 2013, 09:47

Ich habe versucht es mit einem Dictionary umzusetzen aber nach eine Schleife beendet es mein Programm.

Code: Alles auswählen

import sys

def bf(code):
    def Klammernpaare(code):
        listeoffen=[]
        zuposition={}
        for s in code:
            if s=="[":
                listeoffen.append(code.index(s))
            elif s=="]":
                zuposition[listeoffen.pop()]=code.index(s)

        offenposition=dict((zuposition[i],i) for i in zuposition)    
	
        return offenposition, zuposition
		
    def ink():
        cells[cellindex] +=1
    def dek():
        cells[cellindex] -=1
    def vorne():
        cellindex +=1
    def hinten():
        cellindex -=1
    def ausgabe():
        print(chr(cells[cellindex]), end="")
    def eingabe():
        cells[cellindex] = ord(sys.stdin.read(1))  #ord(input())
    def schleifenanfang():
        if cells[cellindex]== 0:
                codeindex=zuposition[codeindex]
    def schleifenende():
        codeindex=offenposition[codeindex]
        codeindex -=1
    befehle={"+":ink,"-":dek,">":vorne,"<":hinten,".":ausgabe,",":eingabe,"[":schleifenanfang,"]":schleifenende}
    #Kommentare entfernen
    code=[s for s in code if s in ("<",">","+","-",".",",","[","]")]
    #aktuelle Zelle
    cellindex=0
    #Zellen
    cells=[0]*30000
    #Position im Code
    codeindex=0
    #Klammernpaare finden für Schleifen
    offenposition, zuposition= Klammernpaare(code)

    while codeindex < len(code):
        index=code[codeindex]
        befehle[code[codeindex]]()
        codeindex +=1


bf(input("Geben sie hier ihren Code ein: "))
input()
        
                
                
Antworten