You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.3 KiB
53 lines
1.3 KiB
import numpy as np
|
|
from collections import deque
|
|
|
|
file = "inputs/day10.input"
|
|
lines = [x.decode().replace("\n", "") for x in open(file, "rb").readlines()]
|
|
|
|
match = {"<": ">", "(": ")", "[": "]", "{": "}"}
|
|
opening = ["<", "(", "[", "{"]
|
|
points = {">": 4, ")": 1, "]": 2, "}": 3}
|
|
|
|
|
|
def check_corruption(line):
|
|
stack = deque("")
|
|
for letter in line:
|
|
if letter in opening:
|
|
stack.append(letter)
|
|
else:
|
|
last_opening = stack.pop()
|
|
if letter != match[last_opening]:
|
|
return letter
|
|
return "0"
|
|
|
|
|
|
def check_incomplete(line):
|
|
stack = deque("")
|
|
sequence = []
|
|
for letter in line:
|
|
if letter in opening:
|
|
stack.append(letter)
|
|
else:
|
|
last_opening = stack.pop()
|
|
while len(stack) != 0:
|
|
current_opening = stack.pop()
|
|
sequence.append(match[current_opening])
|
|
return sequence
|
|
|
|
|
|
scores = []
|
|
for line in lines:
|
|
score = 0
|
|
corruption_check = check_corruption(line)
|
|
if corruption_check != "0":
|
|
score += points[corruption_check]
|
|
else:
|
|
closing_seq = check_incomplete(line)
|
|
for letter in closing_seq:
|
|
score *= 5
|
|
score += points[letter]
|
|
scores.append(score)
|
|
|
|
scores = sorted(scores)
|
|
print(scores[len(scores) // 2])
|