day 7, make some
This commit is contained in:
		
							
								
								
									
										6
									
								
								d07/perfs.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								d07/perfs.txt
									
									
									
									
									
										Normal 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"
 | 
			
		||||
							
								
								
									
										17
									
								
								d07/run.py
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								d07/run.py
									
									
									
									
									
								
							@@ -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
									
								
							
							
						
						
									
										35
									
								
								d07/run_r.py
									
									
									
									
									
										Normal 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)
 | 
			
		||||
		Reference in New Issue
	
	Block a user