5 "execution_count": 111,
9 "def new_machine():\n",
10 " return {'pc': 0, \n",
14 " 'instructions': []}"
19 "execution_count": 193,
25 "def show_machine(machine):\n",
26 " return ', '.join('{}: {}'.format(sk, machine[int(sk) if sk.isnumeric() else sk]) \n",
27 " for sk in sorted(str(k) for k in machine)\n",
28 " if sk != 'instructions')"
33 "execution_count": 112,
39 "def inc(reg, machine):\n",
40 " machine[reg] += 1\n",
46 "execution_count": 113,
52 "def dec(reg, machine):\n",
53 " machine[reg] -= 1\n",
59 "execution_count": 114,
65 "def jmp(addr, machine):\n",
66 " machine['pc'] += addr"
71 "execution_count": 115,
77 "def jpz(reg, addr, machine):\n",
78 " if machine[reg] == 0:\n",
79 " machine['pc'] += addr\n",
86 "execution_count": 116,
92 "def set_literal(reg, literal, machine):\n",
93 " machine[reg] = literal\n",
99 "execution_count": 117,
105 "def cpy(from_reg, to_reg, machine):\n",
106 " machine[to_reg] = machine[from_reg]\n",
107 " machine['pc'] += 1"
112 "execution_count": 129,
118 "def sto(reg, addr, machine):\n",
119 " machine[addr] = machine[reg]\n",
120 " machine['pc'] += 1"
125 "execution_count": 130,
131 "def ld(reg, addr, machine):\n",
132 " if addr in machine:\n",
133 " machine[reg] = machine[addr]\n",
135 " machine[reg] = 0\n",
136 " machine['pc'] += 1"
141 "execution_count": 131,
145 "instruction_table = {'inc': inc, 'dec': dec, 'jmp': jmp,\n",
146 " 'jpz': jpz, 'set': set_literal, 'cpy': cpy,\n",
147 " 'sto': sto, 'ld': ld}\n",
148 "numeric_args_table = {'jmp': [0], 'jpz': [1], 'set': [1], 'sto': [1], 'ld': [1]}"
153 "execution_count": 121,
159 "def parse(instruction):\n",
160 " words = instruction.split()\n",
161 " instr = words[0]\n",
162 " args = words[1:]\n",
163 " if instr in numeric_args_table:\n",
164 " for p in numeric_args_table[instr]:\n",
165 " args[p] = int(args[p])\n",
166 " return instruction_table[instr], args"
171 "execution_count": 122,
177 "{'a': 2, 'b': 1, 'c': 0, 'instructions': [], 'pc': 3}"
180 "execution_count": 122,
182 "output_type": "execute_result"
186 "m = new_machine()\n",
188 "cargs = ['a', 'b']\n",
196 "execution_count": 123,
202 "def program_from_instructions(prog, machine):\n",
203 " machine['instructions'] = [parse(instr) for instr in prog]"
208 "execution_count": 124,
214 "def program_from_listing(listing, machine):\n",
215 " program_from_instructions([i for i in listing.split('\\n') if i], machine)"
220 "execution_count": 156,
226 "def run(machine, initial_state=None, trace=False):\n",
227 " if initial_state:\n",
228 " machine.update(initial_state)\n",
229 " while machine['pc'] < len(machine['instructions']):\n",
231 " print(show_machine(machine))\n",
232 " cmd, args = machine['instructions'][machine['pc']]\n",
233 " cmd(*args, machine)"
238 "execution_count": 146,
244 "def execute(listing, initial_state=None, trace=False):\n",
245 " m = new_machine()\n",
246 " program_from_listing(listing, m)\n",
247 " run(m, initial_state=initial_state, trace=trace)\n",
253 "execution_count": 127,
262 " 'instructions': [(<function __main__.inc>, ['a']),\n",
263 " (<function __main__.inc>, ['a']),\n",
264 " (<function __main__.cpy>, ['a', 'b']),\n",
265 " (<function __main__.inc>, ['a'])],\n",
269 "execution_count": 127,
271 "output_type": "execute_result"
275 "program = \"\"\"\n",
286 "execution_count": 143,
293 " 'instructions': [(<function __main__.set_literal>, ['a', 10]),\n",
294 " (<function __main__.dec>, ['a']),\n",
295 " (<function __main__.inc>, ['b']),\n",
296 " (<function __main__.sto>, ['b', 1]),\n",
297 " (<function __main__.jpz>, ['a', 2]),\n",
298 " (<function __main__.jmp>, [-4])],\n",
305 "execution_count": 143,
307 "output_type": "execute_result"
311 "program = \"\"\"\n",
319 "# m = new_machine()\n",
320 "# program_from_listing(program, m)\n",
322 "execute(program, initial_state={'c': 20})"
327 "execution_count": 159,
336 " 'instructions': [(<function __main__.cpy>, ['c', 'a']),\n",
337 " (<function __main__.set_literal>, ['b', 0]),\n",
338 " (<function __main__.dec>, ['a']),\n",
339 " (<function __main__.jpz>, ['b', 3]),\n",
340 " (<function __main__.dec>, ['b']),\n",
341 " (<function __main__.jmp>, [2]),\n",
342 " (<function __main__.inc>, ['b']),\n",
343 " (<function __main__.jpz>, ['a', 3]),\n",
344 " (<function __main__.jmp>, [-6])],\n",
348 "execution_count": 159,
350 "output_type": "execute_result"
354 "program = \"\"\"\n",
365 "# m = new_machine()\n",
366 "# program_from_listing(program, m)\n",
368 "execute(program, initial_state={'c': 5})"
373 "execution_count": 196,
379 "'10: 10, a: 0, b: 0, c: 5, pc: 11'"
382 "execution_count": 196,
384 "output_type": "execute_result"
388 "program = \"\"\"\n",
401 "# m = new_machine()\n",
402 "# program_from_listing(program, m)\n",
404 "show_machine(execute(program, initial_state={'a': 10}))"
409 "execution_count": null,
419 "display_name": "Python 3",
420 "language": "python",
428 "file_extension": ".py",
429 "mimetype": "text/x-python",
431 "nbconvert_exporter": "python",
432 "pygments_lexer": "ipython3",