-
Notifications
You must be signed in to change notification settings - Fork 0
/
day_05.py
35 lines (24 loc) · 823 Bytes
/
day_05.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from string import ascii_lowercase
from typing import List, Dict
def reacts_with(x: str, y: str) -> bool:
return x and y and ord(x) ^ ord(y) == 0b00100000
def last(xs):
return xs[-1] if xs else None
def part_one(chars: str) -> str:
reduced: List[str] = []
for c in chars:
if reacts_with(last(reduced), c):
reduced.pop()
else:
reduced.append(c)
return ''.join(reduced)
def length_of_reduced(chars: str) -> int:
return len(part_one(chars))
def everything_but(char: str, word: str) -> str:
excluded = (char.lower(), char.upper())
return ''.join(c for c in word if c not in excluded)
def part_two(chars: str) -> Dict[str, str]:
return {
char: length_of_reduced(everything_but(char, chars))
for char in ascii_lowercase
}