advent-of-code/2021-python/solutions/day_10.py

81 lines
2 KiB
Python
Raw Normal View History

from collections import deque
from solutions import BaseSolution
class Solution(BaseSolution):
input_file = "10.txt"
def __str__(self):
return "Day 10: Syntax Scoring"
def parse_input(self, data):
return data.split()
def solve(self, puzzle_input):
scores = {
")": 3,
"]": 57,
"}": 1197,
">": 25137,
}
co = {"]": "[", "}": "{", ">": "<", ")": "("}
openers = co.values()
closers = co.keys()
def corrupt(l):
o = deque()
for i, c in enumerate(l):
if c in openers:
o.append(c)
continue
if co[c] != o.pop():
return i, c
else:
return 0
lines = list(filter(corrupt, puzzle_input))
return sum(scores[c] for _, c in map(corrupt, lines))
def solve_again(self, puzzle_input):
scoremap = {
")": 1,
"]": 2,
"}": 3,
">": 4,
}
co = {"]": "[", "}": "{", ">": "<", ")": "("}
oc = dict([(o, c) for c, o in co.items()])
openers = co.values()
closers = co.keys()
def score(chars):
s = 0
for i, x in enumerate(chars):
s *= 5
s += scoremap[x]
return s
def incomplete(l):
o = deque()
for c in l:
if c in openers:
o.append(c)
continue
if co[c] != o.pop():
return 0
else:
return o
lines = list(filter(incomplete, puzzle_input))
med = len(lines) // 2
completes = [
score([oc[oo] for oo in reversed(o)]) for o in map(incomplete, lines)
]
return sorted(completes)[med]
return True
if __name__ == "__main__":
solution = Solution()
solution.show_results()