From 2f95e4b529a48c159630fbfb543213a44c58cdef Mon Sep 17 00:00:00 2001 From: Interitio Date: Sun, 8 Dec 2024 01:51:13 +1000 Subject: [PATCH] Add Day 7 solution. --- day7/solver.py | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 day7/solver.py diff --git a/day7/solver.py b/day7/solver.py new file mode 100644 index 0000000..abf5b05 --- /dev/null +++ b/day7/solver.py @@ -0,0 +1,69 @@ +""" +Bit tired and lazy today. + +Just going to go for minimal effort. +""" +import sys + +test_data = r""" +190: 10 19 +3267: 81 40 27 +83: 17 5 +156: 15 6 +7290: 6 8 6 15 +161011: 16 10 13 +192: 17 8 14 +21037: 9 7 18 13 +292: 11 6 16 20 +""" + +def load_data(data): + for line in data.splitlines(): + if line := line.strip(): + target, remaining = line.split(': ') + yield int(target), tuple(map(int, remaining.split())) + + +def validate(target, parts, current=None, ors=False): + if not parts: + return target == current + part, remaining = parts[0], parts[1:] + + if current is None: + valid = validate(target, remaining, part, ors=ors) + elif current > target: + valid = False + else: + # Try mul first + valid = validate(target, remaining, current * part, ors=ors) + valid = valid or validate(target, remaining, current + part, ors=ors) + if ors: + valid = valid or validate(target, remaining, int(str(current)+str(part)), ors=ors) + return valid + + +def valid_sums(data, **kwargs): + return sum(target for target, parts in load_data(data) if validate(target, parts, **kwargs)) + + +def test_a(): + print("Testing") + assert valid_sums(test_data) == 3749 + print("Tested") + +def test_b(): + print("Testing") + assert valid_sums(test_data, ors=True) == 11387 + print("Tested") + + + +if __name__ == '__main__': + test_a() + with open(sys.argv[1]) as f: + data = f.read() + print(f"Sum is {valid_sums(data)}") + test_b() + print(f"New Sum is {valid_sums(data, ors=True)}") + +