3

このドキュメントに従って、私はBrainfuckのインタープリターを作成しています。これは、私の実装では次のような文字列を変換する必要があります。

',>,<[>[->+>+<<]>>[-<<+>>]<<<-]>>.'

次のような命令のリストに:

[',', '>', ',', '<', [ '>', [ '-', '>', '+', '>', '+', '<', '<', ], '>', '>', [ '-', '<', '<', '+', '>', '>', ] '<', '<', '<', '-' ], '>', '>', '.']

または、記号を除いて:

[ ... [...] ... [...] ... ]

現在、deque と popleft() を使用してこれを再帰的に解決し、一度に 1 つのシンボルの文字列を反復処理していますが、一度にサブ配列に分割する必要があるように感じます。

この問題をPythonicの方法でどのように解決しますか?

(速度の理由から正規表現を除外)

4

3 に答える 3

1

好奇心旺盛な方のために、再帰を使用した私の実用的なソリューションを次に示します。

def tokenize(code):
  instructions = deque()

  if len(code) > 0:
    while len(code) > 0:
      if code[0] is "[":
        code.popleft()

        group = deque()
        r = 0

        while r > -1 and len(code) > 0:
          if code[0] is '[':
            group.append(code.popleft())
            r += 1

          elif code[0] is ']':
            if r is 0: 
              code.popleft()

            else:
              group.append(code.popleft())

            r -= 1

          else:
            group.append(code.popleft())

        instructions.append(tokenize(group))

      else:
        instructions.append(code.popleft())

    return instructions

else:
  return instructions
于 2015-05-10T03:08:09.270 に答える
0

私はほとんどそこにいます:

s=',>,<[>[->+>+<<]>>[-<<+>>]<<<-]>>.'

x = eval('["' + s.replace('[','",["').replace(']','"],"') + '"]')

これにより、次が生成されます。

[',>,<', ['>', ['->+>+<<'], '>>', ['-<<+>>'], '<<<-'], '>>.']

これはまさにあなたが望んでいたものではありませんが、文字列を反復処理することもできます。

ast.literal_evaleval のセキュリティが心配な場合に使用します。

更新:正規表現を使用して、私はそれをずっと作りました:

import re
s=',>,<[>[->+>+<<]>>[-<<+>>]<<<-]>>.'
everything = re.compile("([^\]\[])")
y = eval('[' + everything.sub(r'"\1",',s).replace(",]","]").replace(']"','],"') + ']')

これは次のようになります。

[',', '>', ',', '<', ['>', ['-', '>', '+', '>', '+', '<', '<'], '>', '>', ['-', '<', '<', '+', '>', '>'], '<', '<', '<', '-'], '>', '>', '.']
于 2015-05-10T00:58:31.967 に答える