1
eachconfig = [['a', ['blank', ['p1', 'r', 'r'], ['b']]], ['b', ['blank', ['p0'], ['c']]], ['c', ['blank', ['r', 'r'], ['a']]]]
def turingmachine(data):
    a = 0
    tape = []
    finalmc = data[0][0]
    for z in range(1,40):
        tape.append(' ')
    mcName = []
    m = 0
    for emc in range(1,len(data)+1):
        goal = data[m][0]
        mcName.append(goal)
        m+=1
    mcNumber = [h-1 for h in range(1,len(mcName)+1)]
    mcNameNumber = dict(zip(mcName,mcNumber))

    d = 0
    tapeposition = d
    tapescan = tape[d]
    for process in range(1,len(tape)):
        b = 0
        c = 0

        cconfig = data[a][b]
        if cconfig == finalmc:
            b += 1
            scannedsymbol = data[a][b][c]
            if isinstance(scannedsymbol, str):
                if scannedsymbol.lower() in ('any', 'blank'):
                    c += 1
                    operations = data[a][b][c]
                    for cycle in operations:
                        if cycle[0] in ('p','P'):
                            tape[tapeposition] = cycle[1:]
                        elif cycle[0] in ('r', 'R'):
                            tapeposition += 1
                        elif cycle[0] in ('l', 'L'):
                            tapeposition -= 1
                        elif cycle[0] in ('e', 'E'):
                            tape[tapeposition] == ' '   
                    finalmc = data[a][b][-1][0]
                    a = mcNameNumber[finalmc]
        return tape



print turingmachine(eachconfig)

私の効率は、このコードでは驚くべきものではないかもしれませんし、完全でもないかもしれません。これは、現在の「eachconfig」リスト内の設定データのフレームワークにすぎません。ただし、そうは言っても、プログラムの出力はまだ[1, ' ', ' ', ' ', ...]、あるべき場所にあるだけです[1, ' ' , 0 , ' ' , 1 , ' ' , 0 , ...]

私はコードを何十回も読み返し、各行を印刷してバグチェックを行い、ループを 1 回しか反復しないという問題を発見しました (問題のループはfor process in range(1,len(data)+1):ループです)。その前のループは単に初期化のためのものです)が、その理由がわかりません。なぜこうなった?

4

2 に答える 2

2

簡単な答え: return ステートメントが for ループ内にあるためです。したがって、おそらく単なるインデント エラーです。

しかし、このコードはかなり非 Pythonic であると言わざるを得ません。範囲を何度も繰り返し処理していますが、これは常に危険信号です。Python では通常、特別に構築された範囲ではなく、実際のものを繰り返し処理したいと考えています。いずれにせよ、ループ変数 ( process) も使用していないため、for ループが正しい構造であるかどうかを検討する必要があります。

さらに、volcano がコメントで指摘しているように、セットアップ コードのほとんどを大幅に短縮できます。

于 2013-04-20T22:35:23.713 に答える
1

tapeの内側のサイクルに戻るprocess in range(...)ため、反復は 1 回だけ行われます。あなたtapeも十分な長さではありません.利用可能なスペースごとにいくつかの操作を行いtapeます.「終了」記号も見つかりませんでしたfor.

ここに「固定」コードがあります:

eachconfig = [['a', ['blank', ['p1', 'r', 'r'], ['b']]], ['b', ['blank', ['p0'], ['c']]], ['c', ['blank', ['r', 'r'], ['a']]]]
def turingmachine(data):
    a = 0
    tape = []
    finalmc = data[0][0]
    for z in range(1,40):
        tape.append(' ')
    mcName = []
    m = 0
    for emc in range(1,len(data)+1):
        goal = data[m][0]
        mcName.append(goal)
        m+=1
    mcNumber = [h-1 for h in range(1,len(mcName)+1)]
    mcNameNumber = dict(zip(mcName,mcNumber))

    d = 0
    tapeposition = d
    tapescan = tape[d]
    for process in range(1,len(tape) - 8):
        b = 0
        c = 0

        cconfig = data[a][b]
        if cconfig == finalmc:
            b += 1
            scannedsymbol = data[a][b][c]
            if isinstance(scannedsymbol, str):
                if scannedsymbol.lower() in ('any', 'blank'):
                    c += 1
                    operations = data[a][b][c]
                    for cycle in operations:
                        if cycle[0] in ('p','P'):
                            tape[tapeposition] = cycle[1:]
                        elif cycle[0] in ('r', 'R'):
                            tapeposition += 1
                        elif cycle[0] in ('l', 'L'):
                            tapeposition -= 1
                        elif cycle[0] in ('e', 'E'):
                            tape[tapeposition] == ' '
                    finalmc = data[a][b][-1][0]
                    a = mcNameNumber[finalmc]
    return tape

print turingmachine(eachconfig)
于 2013-04-20T22:35:36.993 に答える