Advertisement
Guest User

2019 day 7 part 1

a guest
Dec 7th, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.30 KB | None | 0 0
  1. def read_list():
  2.     f = open("test.txt", "r")
  3.     num = ""
  4.     cont = 0
  5.     toReturn = []
  6.     for char in f.read():
  7.         if char == ',':
  8.             toReturn.append(int(num))
  9.             num = ""
  10.             cont = 0
  11.         else:
  12.             num += char
  13.             cont += 1
  14.     if cont != 0:
  15.         toReturn.append(int(num))
  16.     return toReturn
  17.  
  18.  
  19. def read_list_2():
  20.     f = open("test.txt", "r")
  21.     toReturn = []
  22.     for num in f.read().split(","):
  23.         toReturn.append(int(num))
  24.     return toReturn
  25.  
  26.  
  27. def do_operation(inp, i, opcode_full):
  28.     opcode = opcode_full % 100
  29.     if opcode == 1:
  30.         first_par_mode = (opcode_full % 1000) // 100
  31.         second_par_mode = (opcode_full % 10000) // 1000
  32.         if first_par_mode == 0:
  33.             first_par = inp[inp[i + 1]]
  34.         else:
  35.             first_par = inp[i + 1]
  36.         if second_par_mode == 0:
  37.             second_par = inp[inp[i + 2]]
  38.         else:
  39.             second_par = inp[i + 2]
  40.         inp[inp[i + 3]] = first_par + second_par
  41.         return i + 4
  42.     elif opcode == 2:
  43.         first_par_mode = (opcode_full % 1000) // 100
  44.         second_par_mode = (opcode_full % 10000) // 1000
  45.         if first_par_mode == 0:
  46.             first_par = inp[inp[i + 1]]
  47.         else:
  48.             first_par = inp[i + 1]
  49.         if second_par_mode == 0:
  50.             second_par = inp[inp[i + 2]]
  51.         else:
  52.             second_par = inp[i + 2]
  53.         inp[inp[i + 3]] = first_par * second_par
  54.         return i + 4
  55.     elif opcode == 3:
  56.         inp[inp[i + 1]] = int(input("Write an integer: "))
  57.         return 2
  58.     elif opcode == 4:
  59.         first_par_mode = (opcode_full % 1000) // 100
  60.         if first_par_mode == 0:
  61.             print(inp[inp[i + 1]])
  62.         else:
  63.             print(inp[i + 1])
  64.         return i + 2
  65.     elif opcode == 5:
  66.         first_par_mode = (opcode_full % 1000) // 100
  67.         second_par_mode = (opcode_full % 10000) // 1000
  68.         if first_par_mode == 0:
  69.             if inp[inp[i + 1]] != 0:
  70.                 return -(second_par_mode - 1) * inp[inp[i + 2]] + second_par_mode * inp[i + 2]
  71.             else:
  72.                 return i + 3
  73.         else:
  74.             if inp[i + 1] != 0:
  75.                 return -(second_par_mode - 1) * inp[inp[i + 2]] + second_par_mode * inp[i + 2]
  76.             else:
  77.                 return i + 3
  78.     elif opcode == 6:
  79.         first_par_mode = (opcode_full % 1000) // 100
  80.         second_par_mode = (opcode_full % 10000) // 1000
  81.         if first_par_mode == 0:
  82.             if inp[inp[i + 1]] == 0:
  83.                 return -(second_par_mode - 1) * inp[inp[i + 2]] + second_par_mode * inp[i + 2]
  84.             else:
  85.                 return i + 3
  86.         else:
  87.             if inp[i + 1] == 0:
  88.                 return -(second_par_mode - 1) * inp[inp[i + 2]] + second_par_mode * inp[i + 2]
  89.             else:
  90.                 return i + 3
  91.     elif opcode == 7:
  92.         first_par_mode = (opcode_full % 1000) // 100
  93.         second_par_mode = (opcode_full % 10000) // 1000
  94.         if first_par_mode == 0:
  95.             if second_par_mode == 0:
  96.                 if inp[inp[i + 1]] < inp[inp[i + 2]]:
  97.                     inp[inp[i + 3]] = 1
  98.                 else:
  99.                     inp[inp[i + 3]] = 0
  100.             else:
  101.                 if inp[inp[i + 1]] < inp[i + 2]:
  102.                     inp[inp[i + 3]] = 1
  103.                 else:
  104.                     inp[inp[i + 3]] = 0
  105.         else:
  106.             if second_par_mode == 0:
  107.                 if inp[i + 1] < inp[inp[i + 2]]:
  108.                     inp[inp[i + 3]] = 1
  109.                 else:
  110.                     inp[inp[i + 3]] = 0
  111.             else:
  112.                 if inp[i + 1] < inp[i + 2]:
  113.                     inp[inp[i + 3]] = 1
  114.                 else:
  115.                     inp[inp[i + 3]] = 0
  116.         return i + 4
  117.     elif opcode == 8:
  118.         first_par_mode = (opcode_full % 1000) // 100
  119.         second_par_mode = (opcode_full % 10000) // 1000
  120.         if first_par_mode == 0:
  121.             if second_par_mode == 0:
  122.                 if inp[inp[i + 1]] == inp[inp[i + 2]]:
  123.                     inp[inp[i + 3]] = 1
  124.                 else:
  125.                     inp[inp[i + 3]] = 0
  126.             else:
  127.                 if inp[inp[i + 1]] == inp[i + 2]:
  128.                     inp[inp[i + 3]] = 1
  129.                 else:
  130.                     inp[inp[i + 3]] = 0
  131.         else:
  132.             if second_par_mode == 0:
  133.                 if inp[i + 1] == inp[inp[i + 2]]:
  134.                     inp[inp[i + 3]] = 1
  135.                 else:
  136.                     inp[inp[i + 3]] = 0
  137.             else:
  138.                 if inp[i + 1] == inp[i + 2]:
  139.                     inp[inp[i + 3]] = 1
  140.                 else:
  141.                     inp[inp[i + 3]] = 0
  142.         return i + 4
  143.     elif opcode == 99:
  144.         return -1
  145.     else:
  146.         return 0
  147.  
  148.  
  149. def part_one(inp, i):
  150.     opcode_full = inp[i]
  151.     length = do_operation(inp, i, opcode_full)
  152.     if length != -1:
  153.         part_one(inp, length)
  154.  
  155.  
  156. def part_two():
  157.     for noun in range(0, 100):
  158.         for verb in range(0, 100):
  159.             inp = read_list()
  160.             inp[1] = noun
  161.             inp[2] = verb
  162.             print(part_one(inp))
  163.             if part_one(inp) == 19690720:
  164.                 return 100 * noun + verb
  165.     raise Exception('Desired output can not be achieved')
  166.  
  167.  
  168. inp = read_list_2()
  169. part_one(inp, 0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement