42 lines
946 B
Python
42 lines
946 B
Python
|
#!/usr/bin/env python3
|
||
|
from copy import copy
|
||
|
|
||
|
puzzle = []
|
||
|
with open("day07") as f:
|
||
|
for l in f:
|
||
|
(res, n) = l.split(':')
|
||
|
ns = list(map(int, n.strip().split(' ')))
|
||
|
puzzle.append((int(res), ns))
|
||
|
|
||
|
# 1
|
||
|
def calc(res, ns, cur):
|
||
|
if cur == res: return True
|
||
|
if cur > res: return False
|
||
|
if len(ns) == 0: return False
|
||
|
|
||
|
n = ns.pop(0)
|
||
|
return calc(res, copy(ns), cur+n) or calc(res, copy(ns), cur*n)
|
||
|
|
||
|
res = 0
|
||
|
for p in puzzle:
|
||
|
if calc(p[0], copy(p[1][1:]), p[1][0]):
|
||
|
res += p[0]
|
||
|
print(res)
|
||
|
|
||
|
# 2
|
||
|
def calc2(res, ns, cur):
|
||
|
if len(ns) == 0 and res == cur: return True
|
||
|
if cur > res: return False
|
||
|
if len(ns) == 0: return False
|
||
|
|
||
|
n = ns[0]
|
||
|
return (calc2(res, copy(ns[1:]), cur+n)
|
||
|
or calc2(res, copy(ns[1:]), cur*n)
|
||
|
or calc2(res, copy(ns[1:]), int(str(cur)+str(n))))
|
||
|
|
||
|
res = 0
|
||
|
for p in puzzle:
|
||
|
if calc2(p[0], copy(p[1][1:]), p[1][0]):
|
||
|
res += p[0]
|
||
|
print(res)
|