024: 「Jump 0で眠る機械」の解答¶
難易度: ☆☆
方針¶
make_machine で状態を作り、停止するまで step() を呼びます。
停止しないプログラムもあり得るので、実行命令数が max_steps に達したら例外を送出します。
実装¶
def run(program, inputs=None, max_steps=1000):
machine = make_machine(program, inputs)
steps = 0
while not machine["halted"]:
if steps >= max_steps:
raise RuntimeError("program did not halt")
step(machine)
steps += 1
return machine["outputs"]
確認¶
program = [
assemble_line("Read 10"),
assemble_line("Write 10"),
assemble_line("Stop"),
]
assert run(program, [42]) == [42]
assert run([assemble_line("Stop")]) == []
発展¶
エミュレータをデバッグするときは、停止時の出力だけでは足りません。
run_machine() のような別関数を作り、停止時の machine を返すと、メモリやAccumulatorを確認できます。