Advertisement
Guest User

AdventOfCode-2019-day5.py

a guest
Dec 5th, 2019
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.81 KB | None | 0 0
  1. #! /usr/bin/env python3
  2.  
  3. def op_add_memory(pos, prog):
  4.     prog[prog[pos+3]] = prog[prog[pos+1]] + prog[prog[pos+2]]
  5.     return pos+4
  6. def op_add_mixed1(pos, prog):
  7.     prog[prog[pos+3]] = prog[pos+1] + prog[prog[pos+2]]
  8.     return pos+4
  9. def op_add_mixed2(pos, prog):
  10.     prog[prog[pos+3]] = prog[prog[pos+1]] + prog[pos+2]
  11.     return pos+4
  12. def op_add_immediate(pos, prog):
  13.     prog[prog[pos+3]] = prog[pos+1] + prog[pos+2]
  14.     return pos+4
  15. def op_mul_memory(pos, prog):
  16.     prog[prog[pos+3]] = prog[prog[pos+1]] * prog[prog[pos+2]]
  17.     return pos+4
  18. def op_mul_mixed1(pos, prog):
  19.     prog[prog[pos+3]] = prog[pos+1] * prog[prog[pos+2]]
  20.     return pos+4
  21. def op_mul_mixed2(pos, prog):
  22.     prog[prog[pos+3]] = prog[prog[pos+1]] * prog[pos+2]
  23.     return pos+4
  24. def op_mul_immediate(pos, prog):
  25.     prog[prog[pos+3]] = prog[pos+1] * prog[pos+2]
  26.     return pos+4
  27. def op_input(pos, prog):
  28.     prog[prog[pos+1]] = get_input()
  29.     return pos+2
  30. def op_output_memory(pos, prog):
  31.     print(prog[prog[pos+1]])
  32.     return pos+2
  33. def op_output_immediate(pos, prog):
  34.     print(prog[pos+1])
  35.     return pos+2
  36. def op_jnz_memory(pos, prog):
  37.     if prog[prog[pos+1]] != 0:
  38.         return prog[prog[pos+2]]
  39.     return pos+3
  40. def op_jnz_mixed1(pos, prog):
  41.     if prog[pos+1] != 0:
  42.         return prog[prog[pos+2]]
  43.     return pos+3
  44. def op_jnz_mixed2(pos, prog):
  45.     if prog[prog[pos+1]] != 0:
  46.         return prog[pos+2]
  47.     return pos+3
  48. def op_jnz_immediate(pos, prog):
  49.     if prog[pos+1] != 0:
  50.         return prog[pos+2]
  51.     return pos+3
  52. def op_jz_memory(pos, prog):
  53.     if prog[prog[pos+1]] == 0:
  54.         return prog[prog[pos+2]]
  55.     return pos+3
  56. def op_jz_mixed1(pos, prog):
  57.     if prog[pos+1] == 0:
  58.         return prog[prog[pos+2]]
  59.     return pos+3
  60. def op_jz_mixed2(pos, prog):
  61.     if prog[prog[pos+1]] == 0:
  62.         return prog[pos+2]
  63.     return pos+3
  64. def op_jz_immediate(pos, prog):
  65.     if prog[pos+1] == 0:
  66.         return prog[pos+2]
  67.     return pos+3
  68. def op_less_than_memory(pos, prog):
  69.     if prog[prog[pos+1]] < prog[prog[pos+2]]:
  70.         prog[prog[pos+3]] = 1
  71.     else:
  72.         prog[prog[pos+3]] = 0
  73.     return pos+4
  74. def op_less_than_mixed1(pos, prog):
  75.     if prog[pos+1] < prog[prog[pos+2]]:
  76.         prog[prog[pos+3]] = 1
  77.     else:
  78.         prog[prog[pos+3]] = 0
  79.     return pos+4
  80. def op_less_than_mixed2(pos, prog):
  81.     if prog[prog[pos+1]] < prog[pos+2]:
  82.         prog[prog[pos+3]] = 1
  83.     else:
  84.         prog[prog[pos+3]] = 0
  85.     return pos+4
  86. def op_less_than_immediate(pos, prog):
  87.     if prog[pos+1] < prog[pos+2]:
  88.         prog[prog[pos+3]] = 1
  89.     else:
  90.         prog[prog[pos+3]] = 0
  91.     return pos+4
  92. def op_equals_memory(pos, prog):
  93.     if prog[prog[pos+1]] == prog[prog[pos+2]]:
  94.         prog[prog[pos+3]] = 1
  95.     else:
  96.         prog[prog[pos+3]] = 0
  97.     return pos+4
  98. def op_equals_mixed1(pos, prog):
  99.     if prog[pos+1] == prog[prog[pos+2]]:
  100.         prog[prog[pos+3]] = 1
  101.     else:
  102.         prog[prog[pos+3]] = 0
  103.     return pos+4
  104. def op_equals_mixed2(pos, prog):
  105.     if prog[prog[pos+1]] == prog[pos+2]:
  106.         prog[prog[pos+3]] = 1
  107.     else:
  108.         prog[prog[pos+3]] = 0
  109.     return pos+4
  110. def op_equals_immediate(pos, prog):
  111.     if prog[pos+1] == prog[pos+2]:
  112.         prog[prog[pos+3]] = 1
  113.     else:
  114.         prog[prog[pos+3]] = 0
  115.     return pos+4
  116. def get_input():
  117.     # change to actually get input, if needed
  118.     return 1 if prob == 1 else 5
  119.  
  120. instruction_set = {
  121.         1    : op_add_memory,
  122.         101  : op_add_mixed1,
  123.         1001 : op_add_mixed2,
  124.         1101 : op_add_immediate,
  125.         2    : op_mul_memory,
  126.         102  : op_mul_mixed1,
  127.         1002 : op_mul_mixed2,
  128.         1102 : op_mul_immediate,
  129.         3    : op_input,
  130.         4    : op_output_memory,
  131.         104  : op_output_immediate,
  132.         5    : op_jnz_memory,
  133.         105  : op_jnz_mixed1,
  134.         1005 : op_jnz_mixed2,
  135.         1105 : op_jnz_immediate,
  136.         6    : op_jz_memory,
  137.         106  : op_jz_mixed1,
  138.         1006 : op_jz_mixed2,
  139.         1106 : op_jz_immediate,
  140.         7    : op_less_than_memory,
  141.         107  : op_less_than_mixed1,
  142.         1007 : op_less_than_mixed2,
  143.         1107 : op_less_than_immediate,
  144.         8    : op_equals_memory,
  145.         108  : op_equals_mixed1,
  146.         1008 : op_equals_mixed2,
  147.         1108 : op_equals_immediate,
  148.         }
  149.  
  150. prob = 1
  151.  
  152. def run(program):
  153.     halt = False
  154.     pos = 0
  155.     while not halt:
  156.         opcode = program[pos]
  157.         if opcode == 99:
  158.             halt = True
  159.             continue
  160.         else:
  161.             oper = instruction_set[opcode]
  162.             pos = oper(pos, program)
  163.  
  164. if __name__ == "__main__":
  165.     with open('5.input', 'r') as f:
  166.         init_memory = list(map(int, f.read().strip().split(',')))
  167.     program = init_memory.copy()
  168.     run(program)
  169.     # prob-2
  170.     prob = 2
  171.     program = init_memory.copy()
  172.     run(program)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement