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)