2023-01-15 22:12:43 +10:30
|
|
|
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]
|
|
|
|
while stack:
|
|
|
|
if len(stack)>1000:
|
|
|
|
print(f'Stack size is {len(stack)}')
|
|
|
|
group_1 = stack.pop()
|
|
|
|
|
|
|
|
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
|
2023-01-15 22:21:04 +10:30
|
|
|
min_package = min(group_1)
|
2023-01-15 22:12:43 +10:30
|
|
|
for x in sorted(diff):
|
2023-01-15 22:21:04 +10:30
|
|
|
if x > min_package:
|
|
|
|
break
|
2023-01-15 22:12:43 +10:30
|
|
|
stack.append(group_1 | {x})
|
|
|
|
return best
|
|
|
|
|
|
|
|
|
|
|
|
print(f'Part 1: {dfs(input_nums)[1]}')
|
|
|
|
print(f'Part 2: {dfs(input_nums, 4)[1]}')
|