Co-authored-by: Mikael CAPELLE <mikael.capelle@thalesaleniaspace.com> Co-authored-by: Mikaël Capelle <capelle.mikael@gmail.com> Reviewed-on: #3
50 lines
1.2 KiB
Python
50 lines
1.2 KiB
Python
from typing import Any, Iterator
|
|
|
|
from ..base import BaseSolver
|
|
|
|
|
|
def find_values(lines: list[str], lookups: dict[str, int]) -> list[int]:
|
|
values: list[int] = []
|
|
|
|
for line in filter(bool, lines):
|
|
first_digit = min(
|
|
lookups,
|
|
key=lambda lookup: index
|
|
if (index := line.find(lookup)) >= 0
|
|
else len(line),
|
|
)
|
|
last_digit = max(
|
|
lookups,
|
|
key=lambda lookup: index if (index := line.rfind(lookup)) >= 0 else -1,
|
|
)
|
|
|
|
values.append(10 * lookups[first_digit] + lookups[last_digit])
|
|
|
|
return values
|
|
|
|
|
|
class Solver(BaseSolver):
|
|
def solve(self, input: str) -> Iterator[Any]:
|
|
lookups_1 = {str(d): d for d in range(1, 10)}
|
|
lookups_2 = lookups_1 | {
|
|
d: i + 1
|
|
for i, d in enumerate(
|
|
(
|
|
"one",
|
|
"two",
|
|
"three",
|
|
"four",
|
|
"five",
|
|
"six",
|
|
"seven",
|
|
"eight",
|
|
"nine",
|
|
)
|
|
)
|
|
}
|
|
|
|
lines = input.splitlines()
|
|
|
|
yield sum(find_values(lines, lookups_1))
|
|
yield sum(find_values(lines, lookups_2))
|