From b58397645edd600581fe8b2a6834fc9cdf8c84f2 Mon Sep 17 00:00:00 2001 From: earnest ma Date: Sun, 14 May 2023 12:53:56 -0400 Subject: [PATCH] 2015/day07: Complete! --- 2015/day07.py | 79 +++++++++++++++++++++++++++++++++++++++++++++ 2015/day07.txt | Bin 0 -> 5326 bytes 2015/day07_test.py | 13 ++++++++ 3 files changed, 92 insertions(+) create mode 100644 2015/day07.py create mode 100644 2015/day07.txt create mode 100644 2015/day07_test.py diff --git a/2015/day07.py b/2015/day07.py new file mode 100644 index 0000000..8f0130a --- /dev/null +++ b/2015/day07.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3 + +from typing import TextIO +import itertools + +circuit: dict[str, int] = {} + + +class Continue(Exception): + pass + + +def part1(instructions: TextIO) -> int: + ins: list[str] = [] + + # process all instructions into a list + for l in instructions: + ins.append(l.strip()) + + # repeat until the list is empty + while len(ins) != 0: + for connection in ins: + cpart = connection.split() + # print(cpart, sep="") + cpart.remove("->") + + # Exclude the destination + try: + # possibles = list(itertools.filterfalse(str.isupper, cpart))[:-1] + for p in range(len(cpart) - 1): + if not cpart[p].isnumeric() and not cpart[p].isupper(): + if cpart[p] in circuit: + # Get the value? + # This error can be ignored, lol + cpart[p] = circuit[cpart[p]] + else: + # We can't do anything for this + raise Continue + except Continue: + continue + + # assignment + if len(cpart) == 2: + circuit[cpart[1]] = int(cpart[0]) + elif "NOT" in cpart: + circuit[cpart[-1]] = ( + ~int(cpart[1]) & 0xFFFF + ) # see notes for why you can't just use ~ + elif "AND" in cpart: + circuit[cpart[-1]] = int(cpart[0]) & int(cpart[2]) + elif "OR" in cpart: + circuit[cpart[-1]] = int(cpart[0]) | int(cpart[2]) + elif "LSHIFT" in cpart: + circuit[cpart[-1]] = int(cpart[0]) << int(cpart[2]) + elif "RSHIFT" in cpart: + circuit[cpart[-1]] = int(cpart[0]) >> int(cpart[2]) + + ins.remove(connection) + + # print(circuit) + return circuit["a"] + + +def part2(f: TextIO): + circuit["b"] = circuit["a"] + + for k in list(circuit.keys()): + if k != "b": + del circuit[k] + + return part1(f) + + +if __name__ == "__main__": + with open("day07.txt", "r") as f: + print(part1(f)) + + with open("day07.txt", "r") as f: + print(part2(f)) diff --git a/2015/day07.txt b/2015/day07.txt new file mode 100644 index 0000000000000000000000000000000000000000..7cb31877e2d428f13dde70418159c3f78786cbc9 GIT binary patch literal 5326 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 literal 0 HcmV?d00001 diff --git a/2015/day07_test.py b/2015/day07_test.py new file mode 100644 index 0000000..b193175 --- /dev/null +++ b/2015/day07_test.py @@ -0,0 +1,13 @@ +#!/usr/bin/env python3 + +from day07 import * + + +def test_part1() -> None: + with open("day07.txt", "r") as f: + assert part1(f) == 956 + + +def test_part2() -> None: + with open("day07.txt", "r") as f: + assert part2(f) == 40149