""" 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)}")