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