Bringing some days up to speed after a short break

This commit is contained in:
shockrah 2024-12-09 11:27:22 -08:00
parent 9fac5539f0
commit c63736752b
4 changed files with 115 additions and 1 deletions

2
1/2.py
View File

@ -18,7 +18,7 @@ if __name__ == '__main__':
right.append(r) right.append(r)
# how many times does each number apear in each list # how many times does each number apear in each list
right = counts(right) right = counts(right)
score = 0 score = sum([0 if n in right else n * right[n] for n in left])
for n in left: for n in left:
if n not in right: continue if n not in right: continue
score += n * right[n] score += n * right[n]

57
6/1.py Normal file
View File

@ -0,0 +1,57 @@
def get_start(grid: list[str]) -> [int, int]:
x, y = 0, 0
for row, line in enumerate(grid):
if '^' in line:
y = row
break
x = grid[y].find('^')
return [x, y]
def peek(grid: list[str], x: int, y: int) -> str:
try:
if y < 0 or x < 0:
return ''
return grid[y][x]
except IndexError:
return ''
def rotate(vel: [int, int]) -> [int, int]:
# going up? -> go right
if vel == [0,-1]:
return [1,0]
# going right? -> go down
elif vel == [1,0]:
return [0,1]
# going down? -> go left
elif vel == [0,1]:
return [-1,0]
# goign left? -> go up
elif vel == [-1,0]:
return [0,-1]
else:
raise ValueError('brother wtf')
def crawl(grid: list[str], x: int, y: int) -> set[(int, int)]:
# non -unique set that we'll have to clean up
visited = set()
visited.add((x,y))
vel = [0,-1]
while val := peek(grid, x+vel[0], y+vel[1]):
# Record where we go
print((x,y), 'vel ->', vel)
if val == '.' or val == '^':
x += vel[0]
y += vel[1]
visited.add((x,y))
# Don't record the walls
if val == '#':
vel = rotate(vel)
return visited
if __name__ == '__main__':
with open('input.data') as raw:
grid = [ line.strip() for line in raw ]
start_x, start_y = get_start(grid)
print(len(grid), len(grid[0]))
places = crawl(grid, start_x, start_y)
print(len(places))

48
7/1.py Normal file
View File

@ -0,0 +1,48 @@
import random
def test(expression: list[str|int]) -> int:
while len(expression) >= 3:
left, op, right = expression[0], expression[1], expression[2]
if len(expression) > 3:
expression = expression[3:]
else:
expression = []
if op == '*':
expression.insert(0, left * right)
else:
expression.insert(0, left + right)
return expression[0]
def genrate_expression(vals: list[int]) -> list[str|int]:
ops = [random.choice('*+') for _ in range(len(vals) - 1)]
expr = []
for item in zip(vals, ops):
expr.extend(item)
expr.append(vals[-1])
return expr
with open('input.data') as file:
inputs = []
for line in file:
vals = [int(val) for val in line.replace(':', '').split()]
inputs.append([vals[0], vals[1:]])
s = 0
for case in inputs:
answer, vals = case[0], case[1]
expr = genrate_expression(vals)
for i in range(20000):
expr = genrate_expression(vals)
result = test(expr)
if result == answer:
#print(expr)
s += answer
break
print(s)

9
7/sample.data Normal file
View File

@ -0,0 +1,9 @@
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