advent_of_code/10/10_2.py

63 lines
1.8 KiB
Python
Raw Normal View History

2021-12-10 14:45:14 +01:00
#!/usr/bin/env python
# 2021 - Advent Of Code - 10 part 2
def parse_file(file):
non_corrupted = []
2022-04-05 13:27:24 +02:00
with open(file, encoding="utf-8") as f:
2021-12-10 14:45:14 +01:00
i = 0
for line in f.readlines():
chunks = []
corrupted = False
for c in line.strip():
if c in close_sign.values(): # open signs
chunks.append(c)
elif c in close_sign:
last_open = chunks.pop()
if close_sign[c] != last_open:
# print(f'found corrupted chunk at line {i}: {line.strip()}')
count_score[c] += 1
corrupted = True
break
if not corrupted:
non_corrupted.append(line.strip())
i += 1
print(f'nb lines: {i}')
return non_corrupted
def complete_lines(lines):
completions = []
for line in lines:
chunks = []
for c in line:
if c in close_sign.values(): # open signs
chunks.append(c)
elif c in close_sign.keys():
chunks.pop()
completion = [open_sign[c] for c in reversed(chunks)]
completions.append(completion)
return completions
close_sign = {')': '(', ']': '[', '}': '{', '>': '<'}
open_sign = {'(': ')', '[': ']', '{': '}', '<': '>'}
count_score = {')': 0, ']': 0, '}': 0, '>': 0}
score_table = {')': 1, ']': 2, '}': 3, '>': 4}
# sequences = parse_file('input_example.txt')
sequences = parse_file('input.txt')
print(f'nb clean lines: {len(sequences)}')
autocompletions = complete_lines(sequences)
auto_score = []
for a in autocompletions:
score = 0
for sign in a:
score = score * 5 + score_table[sign]
auto_score.append(score)
score = sorted(auto_score)[int(len(auto_score)/2)]
print(f'middle score: {score}')