2023-01 (clean)
This commit is contained in:
parent
557f84561f
commit
e22ba920ff
1 changed files with 26 additions and 36 deletions
|
@ -1,5 +1,5 @@
|
|||
import sys
|
||||
from typing import Callable
|
||||
from typing import Optional
|
||||
|
||||
|
||||
def _debug(*args, **kwargs):
|
||||
|
@ -35,48 +35,38 @@ TRANSFORMATIONS = {
|
|||
}
|
||||
|
||||
|
||||
def collect_all_digits(line: str) -> list[str]:
|
||||
res = []
|
||||
for i, char in enumerate(line):
|
||||
if char.isdigit():
|
||||
res.append(char)
|
||||
break
|
||||
outer_break = False
|
||||
for src in TRANSFORMATIONS:
|
||||
if line[i : min(len(line), i + len(src))] == src:
|
||||
res.append(TRANSFORMATIONS[src])
|
||||
outer_break = True
|
||||
break
|
||||
if outer_break:
|
||||
break
|
||||
|
||||
rev_line = "".join(reversed(line))
|
||||
|
||||
for i, char in enumerate(rev_line):
|
||||
if char.isdigit():
|
||||
res.append(char)
|
||||
break
|
||||
outer_break = False
|
||||
for src in TRANSFORMATIONS:
|
||||
if rev_line[i : min(len(line), i + len(src))] == "".join(reversed(src)):
|
||||
res.append(TRANSFORMATIONS[src])
|
||||
outer_break = True
|
||||
break
|
||||
if outer_break:
|
||||
break
|
||||
|
||||
return res
|
||||
def find_first(inp: str, opts: list[str]) -> Optional[str]:
|
||||
candidates = []
|
||||
for opt in opts:
|
||||
if (p := inp.find(opt)) != -1:
|
||||
candidates.append((p, opt))
|
||||
li = sorted(candidates, key=lambda x: x[0])
|
||||
if len(li) == 0:
|
||||
return None
|
||||
return li[0][1]
|
||||
|
||||
|
||||
def two(inp: str):
|
||||
parsed = parse(inp)
|
||||
acc = 0
|
||||
|
||||
search_values = list(map(str, range(0, 10))) + list(TRANSFORMATIONS.keys())
|
||||
reversed_search_values = ["".join(reversed(x)) for x in search_values]
|
||||
|
||||
for line in parsed:
|
||||
digits = collect_all_digits(line)
|
||||
print(digits)
|
||||
assert len(digits) != 0, f"must have at least one digit per line: {line}"
|
||||
val = digits[0] + digits[-1]
|
||||
first_digit = find_first(line, search_values)
|
||||
second_digit = find_first("".join(reversed(line)), reversed_search_values)
|
||||
assert first_digit is not None and second_digit is not None, f"must have at least one digit per line: {line}"
|
||||
|
||||
# second digit will be the reversed form
|
||||
second_digit = "".join(reversed(second_digit))
|
||||
|
||||
first_digit = TRANSFORMATIONS.get(first_digit, first_digit)
|
||||
second_digit = TRANSFORMATIONS.get(second_digit, second_digit)
|
||||
|
||||
val = first_digit + second_digit
|
||||
acc += int(val)
|
||||
|
||||
return acc
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue