phoenixuprising

AoC 2020 D8 s2

Dec 8th, 2020 (edited)
367
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.74 KB | None | 0 0
  1. import re
  2. import math
  3.  
  4. class operation():
  5.     def __init__(self, op, val):
  6.         self.op = op
  7.         self.val = val
  8.         self.fixed = False
  9.  
  10.     def __str__(self):
  11.         return '[{}, {}]'.format(self.op, self.val)
  12.  
  13.     def fix(self):
  14.         print('fixing {}'.format(self.op))
  15.         if self.op == 'jmp':
  16.             self.op = 'nop'
  17.         else:
  18.             self.op = 'jmp'
  19.         self.fixed = True
  20.  
  21.     def restore(self):
  22.         print('restoring {}'.format(self.op))
  23.         if self.op == 'jmp':
  24.             self.op = 'nop'
  25.         else:
  26.             self.op = 'jmp'
  27.         self.fixed = False
  28.  
  29.  
  30. data = []
  31. with open('input', 'r') as input_file:
  32.     for line in input_file:
  33.         line = line.strip()
  34.         op = line[0:3]
  35.         val = int(line[4:])
  36.         d = operation(op, val)
  37.         print(d)
  38.         data.append(d)
  39.  
  40. nodes_visited = []
  41. accumulator = 0
  42. next_node = 0
  43.  
  44. stack = []
  45. fixed = False
  46.  
  47. while next_node < len(data):
  48.     if next_node in nodes_visited:
  49.         next_node = nodes_visited.pop()
  50.         while data[next_node].op == 'acc' or fixed:
  51.             if data[next_node].fixed:
  52.                 data[next_node].restore()
  53.                 fixed = False
  54.             next_node = nodes_visited.pop()
  55.         data[next_node].fix()
  56.         fixed = True
  57.     nodes_visited.append(next_node)
  58.     d = data[next_node]
  59.     print(d.fixed)
  60.     print('{}: {} {}'.format(next_node, d.op, d.val))
  61.     if d.op == 'nop':
  62.         next_node += 1
  63.     elif d.op == 'acc':
  64.         next_node += 1
  65.     elif d.op == 'jmp':
  66.         next_node += d.val
  67.  
  68. for n in nodes_visited:
  69.     d = data[n]
  70.     if d.op == 'acc':
  71.         # print(d.val)
  72.         accumulator += d.val
  73.  
  74.  
  75. print('accumulator: {}'.format(accumulator))
  76.  
Advertisement
Add Comment
Please, Sign In to add comment