Day 8 2020
[advent-of-code-2020.git] / day08 / computer.py
diff --git a/day08/computer.py b/day08/computer.py
new file mode 100644 (file)
index 0000000..9243eea
--- /dev/null
@@ -0,0 +1,64 @@
+#!/usr/bin/python3
+
+class Computer:
+
+    def __init__(self, instructions=[], break_on_exec=0):
+        self.__acc__=0
+        self.__pos__=0
+        self.__instructions__=instructions
+        self.__executed_count__={}
+        self.__keep_running__=True
+        self.__break_on_exec_number__=break_on_exec
+        self.__exited_on_break__=False
+
+    def set_instructions(self, instructions):
+        self.__instructions__=instructions
+
+    def run(self):
+        while self.keep_running():
+            self.run_command()
+        # when we're done, return the accumulator
+        return self.__acc__
+
+    def keep_running(self):
+        if self.__pos__ >= len(self.__instructions__):
+            self.__keep_running__=False
+        return self.__keep_running__
+
+    def exited_on_break(self):
+        return self.__exited_on_break__
+
+    def run_command(self):
+        if self.__pos__ in self.__executed_count__:
+            self.__executed_count__[self.__pos__]+=1
+        else:
+            self.__executed_count__[self.__pos__]=1
+
+        if self.__break_on_exec_number__ > 0 and self.__executed_count__[self.__pos__] >= self.__break_on_exec_number__:
+            self.__keep_running__=False
+            self.__exited_on_break__=True
+            return
+        else:
+            (instruction,param) = self.__instructions__[self.__pos__]
+            if instruction == "nop":
+                # do nothing, except increment the program counter
+                self.__pos__+=1
+            elif instruction == "acc":
+                val=int(param)
+                self.__acc__+=val
+                self.__pos__+=1
+            elif instruction == "jmp":
+                val=int(param)
+                self.__pos__+=val
+            else:
+                raise Exception("WTAF - that's not a real instruction!")
+        return
+
+def main():
+    instructions = [line.rstrip().split(" ") for line in open("input.txt", "r")]
+    comp = Computer(instructions, break_on_exec=2)
+
+    print("Acc was {} when computer finished.".format(comp.run()))
+
+if __name__ == "__main__":
+    main()