2023-01 (clean)

This commit is contained in:
akp 2023-12-01 21:58:26 +00:00
parent 557f84561f
commit e22ba920ff
No known key found for this signature in database
GPG key ID: CF8D58F3DEB20755

View file

@ -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