day 7, make some

This commit is contained in:
setop 2024-12-11 12:38:29 +01:00
parent 788c45edb7
commit 071ed13c4f
3 changed files with 49 additions and 9 deletions

6
d07/perfs.txt Normal file
View File

@ -0,0 +1,6 @@
awk '{print 3^(NF-2)}' input | sum0
15'721'434 operations total
13'090'754 thanks to "any"
7'805'608 thanks to "target"

View File

@ -1,30 +1,29 @@
import sys
from math import *
from typing import Generator as Gen
PART2 = len(sys.argv)>1 and sys.argv[1] == "2"
I = sys.stdin.read().strip().split("\n")
def conccat(a, b):
def conccat(a, b) -> int:
# 12 345 become 12345
# return a * pow(10, ceil(log10(b))) + b <= breaksfor 1000
# but int <-> str convertions are slow (x4)
return int(str(a)+str(b))
def gen_nb(L:list[int]):
def gen_nb(L:list[int]) -> Gen[int, None, None]:
if len(L) == 1:
yield L[0]
else:
for x in gen_nb(L[:-1]):
yield L[-1] * x
yield L[-1] + x
yield x * L[-1]
yield x + L[-1]
if PART2:
yield conccat(x, L[-1])
S = 0
for l in I:
r, nb = l.split(":")
x = int(r)
x, nb = l.split(":")
x = int(x)
nb = list(map(int,nb.strip().split(" ")))
S += x * any(x == a for a in gen_nb(nb))
S += x * (1 if any(x == a for a in gen_nb(nb)) else 0)
print(S)

35
d07/run_r.py Normal file
View File

@ -0,0 +1,35 @@
import sys
from typing import Generator as Gen
PART2 = len(sys.argv)>1 and sys.argv[1] == "2"
I = sys.stdin.read().strip().split("\n")
def conccat(a, b) -> int:
# 12 345 become 12345
# return a * pow(10, ceil(log10(b))) + b <= breaksfor 1000
# but int <-> str convertions are slow (x4)
return int(str(a)+str(b))
def gen_nb(L:list[int], target) -> Gen[int, None, None]:
if len(L) == 1:
yield L[0]
else:
for x in gen_nb(L[:-1], target):
z = x + L[-1]
if z <= target:
yield z
z = x * L[-1]
if z <= target:
yield z
if PART2: # concat is always bigger than mul, so it can be nested
z = conccat(x, L[-1])
if z <= target:
yield z
S = 0
for l in I:
x, nb = l.split(":")
x = int(x)
nb = list(map(int,nb.strip().split(" ")))
S += x * (1 if any(x == a for a in gen_nb(nb, x)) else 0)
print(S)