diff --git a/challenges/2024/03-mullItOver/README.md b/challenges/2024/03-mullItOver/README.md new file mode 100644 index 0000000..95586d4 --- /dev/null +++ b/challenges/2024/03-mullItOver/README.md @@ -0,0 +1 @@ +# [Day 3: Mull It Over](https://adventofcode.com/2024/day/3) diff --git a/challenges/2024/03-mullItOver/main.py b/challenges/2024/03-mullItOver/main.py new file mode 100644 index 0000000..2406f44 --- /dev/null +++ b/challenges/2024/03-mullItOver/main.py @@ -0,0 +1,61 @@ +import sys +import re + + +Instruction = tuple[str, int, int] + + +def parse(instr: str) -> list[Instruction]: + r = re.compile(r"(mul)\((\d{1,3}),(\d{1,3})\)|(do)\(\)|(don't)\(\)") + res = [] + for m in r.findall(instr): + if m[0]: + res.append(("mul", int(m[1]), int(m[2]))) + elif m[3]: + res.append(("do", 0, 0)) + elif m[4]: + res.append(("don't", 0, 0)) + return res + + +def one(instr: str): + instructions = parse(instr) + + acc = 0 + for (op, a, b) in instructions: + if op == "mul": + acc += a * b + + return acc + + +def two(instr: str): + instructions = parse(instr) + + acc = 0 + on = True + for (op, a, b) in instructions: + if op == "mul" and on: + acc += a * b + elif op == "do": + on = True + elif op == "don't": + on = False + + return acc + + +def _debug(*args, **kwargs): + kwargs["file"] = sys.stderr + print(*args, **kwargs) + + +if __name__ == "__main__": + if len(sys.argv) < 2 or sys.argv[1] not in ["1", "2"]: + print("Missing day argument", file=sys.stderr) + sys.exit(1) + inp = sys.stdin.read().strip() + if sys.argv[1] == "1": + print(one(inp)) + else: + print(two(inp)) diff --git a/challenges/2024/03-mullItOver/tests.json b/challenges/2024/03-mullItOver/tests.json new file mode 100644 index 0000000..582693e --- /dev/null +++ b/challenges/2024/03-mullItOver/tests.json @@ -0,0 +1,14 @@ +{ + "1": [ + { + "is": "161", + "input": "xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))\n" + } + ], + "2": [ + { + "is": "48", + "input": "xmul(2,4)&mul[3,7]rundon't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))\n" + } + ] +} \ No newline at end of file diff --git a/challenges/2024/benchmark-graph.png b/challenges/2024/benchmark-graph.png index b7d39c4..9b0aa14 100644 Binary files a/challenges/2024/benchmark-graph.png and b/challenges/2024/benchmark-graph.png differ diff --git a/challenges/2024/benchmarks.jsonl b/challenges/2024/benchmarks.jsonl index 9a3f7af..66053fb 100644 --- a/challenges/2024/benchmarks.jsonl +++ b/challenges/2024/benchmarks.jsonl @@ -2,3 +2,5 @@ {"day": 1, "part": 2, "runner": "py", "min": 0.0161440372467041, "max": 0.019031047821044922, "avg": 0.016828114986419677, "n": 100} {"day": 2, "part": 1, "runner": "py", "min": 0.021907567977905273, "max": 0.02720332145690918, "avg": 0.023289167881011964, "n": 100} {"day": 2, "part": 2, "runner": "py", "min": 0.02489948272705078, "max": 0.0319674015045166, "avg": 0.026371052265167238, "n": 100} +{"day": 3, "part": 1, "runner": "py", "min": 0.02116227149963379, "max": 0.03153491020202637, "avg": 0.022634525299072266, "n": 100} +{"day": 3, "part": 2, "runner": "py", "min": 0.02115607261657715, "max": 0.03121805191040039, "avg": 0.022722084522247315, "n": 100}