Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions puzzles/solutions/2025/d06/p1.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import functools
import operator
import re
import sys
from collections.abc import Callable

input_example = """123 328 51 64
45 64 387 23
6 98 215 314
* + * + """

Problem = tuple[list[int], Callable[[int, int], int]]

OPERATIONS_MAP = {"+": operator.add, "*": operator.mul}


def get_problems(input_text: str) -> list[Problem]:
lines = input_text.splitlines()
number_lines = lines[:-1]
return [
(
[int(line[m.start() : m.end()]) for line in number_lines],
OPERATIONS_MAP[m.group().strip()],
)
for m in re.finditer(r"[+*]\s*", lines[-1])
]


def get_answer(input_text: str):
problems = get_problems(input_text)
return sum(
functools.reduce(operation, numbers) for (numbers, operation) in problems
)


if __name__ == "__main__":
puzzle_input = sys.argv[1] if len(sys.argv) > 1 else input_example
print(get_answer(puzzle_input))
36 changes: 36 additions & 0 deletions puzzles/solutions/2025/d06/p2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import functools
import sys

import p1


def transpose_numbers(number_lines: list[str]) -> list[list[int]]:
columns_count = len(number_lines[0])
number_lines = [
[line[column] for line in number_lines] for column in range(columns_count)
Comment thread
katzuv marked this conversation as resolved.
]
transposed_number_lines = [[]]
for line in number_lines:
Comment thread
katzuv marked this conversation as resolved.
Comment on lines +9 to +13
try:
transposed_number_lines[-1].append(int("".join(line)))
except ValueError:
# Whitespace column, create a new problem.
transposed_number_lines.append([])

Comment thread
katzuv marked this conversation as resolved.
Comment on lines +12 to +19
return transposed_number_lines


def get_answer(input_text: str):
lines = input_text.splitlines()
number_lines, operators_line = lines[:-1], lines[-1]
number_lines = transpose_numbers(number_lines)

return sum(
functools.reduce(p1.OPERATIONS_MAP[sign], numbers)
for (numbers, sign) in zip(number_lines, operators_line.split(), strict=True)
)
Comment thread
katzuv marked this conversation as resolved.


if __name__ == "__main__":
puzzle_input = sys.argv[1] if len(sys.argv) > 1 else p1.input_example
print(get_answer(puzzle_input))