Solve 2024:3 p1-2 "Mull It Over"

Felt paranoid on this one, was expecting something
much worse for pt2.

The code that solved the puzzle was _extremely_
naive:

- It asumes puzzle input only contains mul() with
1-3 chars. The versioned code have `{1,3}` as safe
guard.
- p2 asumed initial chunk does not begin with
"n't". Would have been easy to handle though.
- p2 asumed junk strings as "don", "do", "don()t"
would not exist.

In other words, I was really lucky since I did not
look that closely on puzzle input beforehand.

Might have cut 60-90 seconds further if I had just
ran pt2 immidately instead of staring dumbly on the
test data (that changed for pt2).

Also, I got reminded that \d in regular expressions
is equal to `0-9`: it does not include commas and
punctations. The code that solved the puzzle was
paranoid and instead used `0-9`.

Managed to score ~1500th somehow despite this.
This commit is contained in:
Anders Englöf Ytterström 2024-12-03 06:20:25 +01:00
parent 5deb351504
commit cb622409f9
3 changed files with 28 additions and 1 deletions

View file

@ -34,7 +34,7 @@ from collections import deque, Counter
from heapq import heappop, heappush from heapq import heappop, heappush
from itertools import compress, combinations, chain from itertools import compress, combinations, chain
from output import answer # , matrix, D, DD, ADJ, ints, mhd, mdbg, vdbg from output import matrix, D, DD, ADJ, ints, mhd, mdbg, vdbg
def solve(data): def solve(data):

View file

@ -127,6 +127,7 @@ def dijkstras(grid, start, target):
all nodes. all nodes.
""" """
import heapq import heapq
target = max(grid) target = max(grid)
seen = set() seen = set()
queue = [(start, 0)] queue = [(start, 0)]

View file

@ -0,0 +1,26 @@
import re
from math import prod
def solve(data):
needle = re.compile(r"mul\((\d{1,3}),(\d{1,3})\)")
p1 = sum(prod(map(int, factors)) for factors in re.findall(needle, data))
p2 = sum(
sum(prod(map(int, factors)) for factors in re.findall(needle, chunk))
for chunk in data.split("do")
if not chunk.startswith("n't")
)
return p1, p2
if __name__ == "__main__":
with open("./input/03.txt", "r") as f:
inp = f.read().strip()
p1, p2 = solve(inp)
print(p1)
print(p2)