Day 10 part 2
This commit is contained in:
parent
5e9b5d3b22
commit
5757904b0f
1 changed files with 62 additions and 0 deletions
62
10/10_2.py
Executable file
62
10/10_2.py
Executable file
|
@ -0,0 +1,62 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# 2021 - Advent Of Code - 10 part 2
|
||||||
|
|
||||||
|
def parse_file(file):
|
||||||
|
non_corrupted = []
|
||||||
|
with open(file) as f:
|
||||||
|
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}')
|
Loading…
Reference in a new issue