From f7dd9437aafe2ec7363c8da9272e033aae8190e4 Mon Sep 17 00:00:00 2001 From: Luke Hubmayer-Werner Date: Sun, 15 Jan 2023 22:12:43 +1030 Subject: [PATCH] 2015 Day 24 Python --- 2015/day24.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 2015/day24.py diff --git a/2015/day24.py b/2015/day24.py new file mode 100644 index 0000000..927f4b3 --- /dev/null +++ b/2015/day24.py @@ -0,0 +1,63 @@ +from math import prod + +with open('day24-input', 'r') as file: + input_nums = [int(x) for x in file.read().strip().split('\n')] +if len(input_nums) == len(set(input_nums)): + print('All inputs are unique') +else: + print('Inputs are not unique, this solution will not work without slight changes') + + +def try_groups(diff, target: int, num_groups: int) -> bool: + return True # TODO - this is strictly incorrect but the inputs aren't mean enough for this to matter, lmao + + +def dfs(input_nums: list[int], num_groups: int = 3): + full_sum = sum(input_nums) + target = full_sum//num_groups + print(input_nums, full_sum, target) + input_set = set(input_nums) + + best = None + + def is_better(num_packages: int, quantum_entanglement: int) -> bool: + if best is None: + return True + if best[0] > num_packages: + return True + if best[0] == num_packages and best[1] > quantum_entanglement: + return True + return False + + stack = [{x} for x in input_nums] + evaluated = set() + while stack: + if len(stack)>1000: + print(f'Stack size is {len(stack)}') + group_1 = stack.pop() + g1 = tuple(sorted(group_1)) + if g1 in evaluated: + continue + evaluated.add(g1) + + num_packages = len(group_1) + if best and best[0] < num_packages: + continue + diff = input_set - group_1 + group_sum = sum(group_1) + delta = target - group_sum + if delta < 0: # overshoot + continue + elif delta == 0: + quantum_entanglement = prod(group_1) + if is_better(num_packages, quantum_entanglement) and try_groups(diff, target, num_groups): + best = (num_packages, quantum_entanglement, group_1) + print(best) + else: # delta > 0 + for x in sorted(diff): + stack.append(group_1 | {x}) + return best + + +print(f'Part 1: {dfs(input_nums)[1]}') +print(f'Part 2: {dfs(input_nums, 4)[1]}')