From 14d00e16d51b89ce1b2e8f548a9624b18a3a40cc Mon Sep 17 00:00:00 2001 From: Niccolo Borgioli Date: Thu, 2 Nov 2023 01:05:56 +0100 Subject: [PATCH] day 2 --- 2019/2/README.md | 12 ++++++ 2019/2/python/main.py | 92 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 2019/2/README.md create mode 100644 2019/2/python/main.py diff --git a/2019/2/README.md b/2019/2/README.md new file mode 100644 index 0000000..dabab1d --- /dev/null +++ b/2019/2/README.md @@ -0,0 +1,12 @@ +# 2 + +- Learned about method overloading in python type system. +- These older ones def. are harder from the start + +
+ Solutions +
    +
  1. 10566835
  2. +
  3. 2347
  4. +
+
diff --git a/2019/2/python/main.py b/2019/2/python/main.py new file mode 100644 index 0000000..7aa1056 --- /dev/null +++ b/2019/2/python/main.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python + +from os.path import join, dirname +from typing import overload +from copy import deepcopy + +# Day 2 + +# Common + + +def read_input(filename): + data = join(dirname(__file__), '..', filename) + with open(data) as f: + return f.read().strip() + + +test = read_input('test.txt') +data = read_input('input.txt') + +# Running + + +class Interpreter: + def __init__(self, memory: list[int]) -> None: + self.initial = memory + self.reset() + + def reset(self): + self.counter = 0 + self.halt = False + self.memory = deepcopy(self.initial) + + @overload + def pointer(self, offset: int, value: int) -> None: ... + @overload + def pointer(self, offset: int, value: None = None) -> int: ... + + def pointer(self, offset: int, value: int | None = None) -> int | None: + p = self.memory[self.counter+offset] + if value: + self.memory[p] = value + return self.memory[p] + + def operation(self): + size = 0 + match self.memory[self.counter]: + case 1: + left = self.pointer(1) + right = self.pointer(2) + self.pointer(3, left + right) + size = 3 + case 2: + left = self.pointer(1) + right = self.pointer(2) + self.pointer(3, left * right) + size = 3 + case 99: + self.halt = True + self.counter += 1 + size + + def run(self): + while not self.halt: + self.operation() + + def restore(self): + self.memory[1] = 12 + self.memory[2] = 2 + + def __str__(self) -> str: + return ", ".join(map(str, self.memory)) + + +def find(i: Interpreter, target: int): + for noun in range(0, 100): + for verb in range(0, 100): + i.reset() + i.memory[1] = noun + i.memory[2] = verb + i.run() + if i.memory[0] == target: + return 100 * noun + verb + + +# Part 1 +i = Interpreter(list(map(int, data.split(',')))) +i.restore() +i.run() +print(i.memory[0]) + +# Part 2 +print(find(i, 19690720))