69 lines
1.5 KiB
Python
69 lines
1.5 KiB
Python
from tools.aoc import AOCDay
|
|
from typing import Any
|
|
|
|
|
|
def react(polymer: str) -> str:
|
|
reacted = True
|
|
while reacted:
|
|
reacted = False
|
|
new_poly = ""
|
|
i = 0
|
|
while i < len(polymer) - 1:
|
|
if abs(ord(polymer[i]) - ord(polymer[i + 1])) != 32:
|
|
new_poly += polymer[i]
|
|
else:
|
|
i += 1
|
|
reacted = True
|
|
|
|
i += 1
|
|
if i < len(polymer):
|
|
new_poly += polymer[-1]
|
|
|
|
polymer = new_poly
|
|
|
|
return polymer
|
|
|
|
|
|
class Day(AOCDay):
|
|
inputs = [
|
|
[
|
|
(10, "test_input5_1"),
|
|
(9348, "input5")
|
|
],
|
|
[
|
|
(4, "test_input5_1"),
|
|
(4996, "input5")
|
|
]
|
|
]
|
|
|
|
def part1(self) -> Any:
|
|
polymer = self.getInput()
|
|
return len(react(polymer))
|
|
|
|
def part2(self) -> Any:
|
|
polymer = self.getInput()
|
|
tested = set()
|
|
min_length = len(polymer)
|
|
for c in polymer:
|
|
if c in tested:
|
|
continue
|
|
|
|
tested.add(c.upper())
|
|
tested.add(c.lower())
|
|
|
|
test_polymer = ""
|
|
for x in polymer:
|
|
if x != c.upper() and x != c.lower():
|
|
test_polymer += x
|
|
|
|
this_length = len(react(test_polymer))
|
|
if this_length < min_length:
|
|
min_length = this_length
|
|
|
|
return min_length
|
|
|
|
|
|
if __name__ == '__main__':
|
|
day = Day(2018, 5)
|
|
day.run(verbose=True)
|