def setUp(self): def inc_func(arguments: List[str], registers: Dict[str, Any], pc: ProgramCounter) -> ProgramCounter: registers[arguments[0]] += 1 return pc + 1 inc = Operation('inc', inc_func, [Operand.REGISTER]) self.program = [ Instruction(inc, ['a']), Instruction(inc, ['a']), Instruction(inc, ['b']), Instruction(inc, ['a']), ] self.computer = Computer(registers={'a': 0, 'b': 0})
def attempt_execution(program: List[Instruction], swap_instruction: int = -1) -> Tuple[int, bool]: comp = Computer({'acc': 0}) executed_code = set() failed = False do_swap_instruction(program, swap_instruction) while 0 <= comp.pc < len(program): if comp.pc in executed_code: failed = True break else: executed_code.add(comp.pc) comp.execute_instruction(program[comp.pc]) do_swap_instruction(program, swap_instruction) return comp.regs['acc'], failed
class TestComputerMethods(unittest.TestCase): def setUp(self): def inc_func(arguments: List[str], registers: Dict[str, Any], pc: ProgramCounter) -> ProgramCounter: registers[arguments[0]] += 1 return pc + 1 inc = Operation('inc', inc_func, [Operand.REGISTER]) self.program = [ Instruction(inc, ['a']), Instruction(inc, ['a']), Instruction(inc, ['b']), Instruction(inc, ['a']), ] self.computer = Computer(registers={'a': 0, 'b': 0}) def test_execute_instruction(self): self.computer.execute_instruction(self.program[0]) self.assertEqual(self.computer.pc, 0) self.assertEqual(self.computer.regs['a'], 1) self.computer.execute_instruction(self.program[2]) self.assertEqual(self.computer.pc, 0) self.assertEqual(self.computer.regs['b'], 1) def test_execute(self): self.computer.execute(self.program) self.assertEqual(self.computer.pc, 4) self.assertEqual(self.computer.regs['a'], 3) self.assertEqual(self.computer.regs['b'], 1)
ops = { 'set': Operation('set', set_func, [Operand.REGISTER, Operand.REGISTER | Operand.CONSTANT]), 'sub': Operation('sub', sub_func, [Operand.REGISTER, Operand.REGISTER | Operand.CONSTANT]), 'mul': Operation('mul', mul_func, [Operand.REGISTER, Operand.REGISTER | Operand.CONSTANT]), 'jnz': Operation('jnz', jnz_func, [Operand.REGISTER, Operand.REGISTER | Operand.CONSTANT]) } program = [] with open('2017/23/input.txt') as in_file: for line in in_file: line = line.strip().split() if line[0] not in ops: continue op = ops[line[0]] args = line[1:] program.append(Instruction(op, args)) registers = {letter: 0 for letter in 'abcdefgh'} comp1 = Computer(registers=registers, initial_pc=0) comp1.execute_with_profiler(program)
Operation('inc', inc_func, [Operand.REGISTER]), 'dec': Operation('dec', dec_func, [Operand.REGISTER]), 'jnz': Operation('jnz', jnz_func, [ Operand.REGISTER | Operand.CONSTANT, Operand.REGISTER | Operand.CONSTANT ]), 'out': Operation('out', out_func, [Operand.REGISTER | Operand.CONSTANT]) } program = [] with open('2016/25/input.txt') as f: for line in f: cmd = line.strip().split() op = ops[cmd[0]] args = cmd[1:] program.append(Instruction(op, args)) for i in range(200): comp = Computer(registers={'a': i, 'b': 0, 'c': 0, 'd': 0}, initial_pc=0) comp.execute(program) if clock == [0, 1] * (MAX_CLOCK_LENGTH // 2): print('\nFinal answer:', i) break if i % 10 == 0: print('.', end='') sys.stdout.flush() clock = []
'jnz': Operation('jnz', jnz_func, [ Operand.REGISTER | Operand.CONSTANT, Operand.REGISTER | Operand.CONSTANT ]), 'tgl': Operation('tgl', tgl_func, [Operand.REGISTER | Operand.CONSTANT]) } program = [] with open('2016/23/input.txt') as f: for line in f: cmd = line.strip().split() op = ops[cmd[0]] args = cmd[1:] program.append(Instruction(op, args)) comp1 = Computer(registers={ 'a': puzzle_input_1, 'b': 0, 'c': 0, 'd': 0 }, initial_pc=0) comp1.execute(program) print('Value in register \'a\' after run 1:', comp1.regs['a']) # Program performs factorial on input, then adds 93*80=7440 print('Predicted value in register \'a\' after run 2:', factorial(puzzle_input_2) + (93 * 80))
if registers[arguments[0]] == 1: return pc + int(arguments[1]) else: return pc + 1 ops = { 'hlf': Operation('hlf', hlf_func, [Operand.REGISTER]), 'tpl': Operation('tpl', tpl_func, [Operand.REGISTER]), 'inc': Operation('inc', inc_func, [Operand.REGISTER]), 'jmp': Operation('jmp', jmp_func, [Operand.CONSTANT]), 'jie': Operation('jie', jie_func, [Operand.REGISTER, Operand.CONSTANT]), 'jio': Operation('jio', jio_func, [Operand.REGISTER, Operand.CONSTANT]) } program = [] with open('2015/23/input.txt') as f: for line in f: cmd = line.replace(',', '').strip().split() op = ops[cmd[0]] args = cmd[1:] program.append(Instruction(op, args)) comp1 = Computer(registers={'a': 0, 'b': 0}, initial_pc=0) comp2 = Computer(registers={'a': 1, 'b': 0}, initial_pc=0) comp1.execute(program) print('Value in register b after run 1:', comp1.regs['b']) comp2.execute(program) print('Value in register b after run 2:', comp2.regs['b'])
print(regs['_sound']) return -1 return pc+1 def jgz_func(args:ArgList,regs:RegisterDict,pc:ProgramCounter) -> ProgramCounter: if read_value(args[0]) > 0: return pc + read_value(args[1]) else: return pc + 1 ops = { 'snd': Operation('snd',snd_func,[Operand.REGISTER]), 'set': Operation('set',set_func,[Operand.REGISTER,Operand.REGISTER|Operand.CONSTANT]), 'add': Operation('add',add_func,[Operand.REGISTER,Operand.REGISTER|Operand.CONSTANT]), 'mul': Operation('mul',mul_func,[Operand.REGISTER,Operand.REGISTER|Operand.CONSTANT]), 'mod': Operation('mod',mod_func,[Operand.REGISTER,Operand.REGISTER|Operand.CONSTANT]), 'rcv': Operation('rcv',rcv_func,[Operand.REGISTER]), 'jgz': Operation('jgz',jgz_func,[Operand.REGISTER,Operand.REGISTER|Operand.CONSTANT]) } program = [] with open('2017/18/input.txt') as in_file: for line in in_file: line = line.strip().split() op = ops[line[0]] args = line[1:] program.append(Instruction(op,args)) comp1 = Computer(registers={'a':0,'b':0,'f':0,'i':0,'p':0},initial_pc=0) comp1.execute(program)