diff --git a/day5/run.py b/day5/run.py index a019f4e..07f6224 100644 --- a/day5/run.py +++ b/day5/run.py @@ -55,7 +55,7 @@ class CheckManual: @property def _part2(self) -> int: - return None + return sum([int(val[len(val) // 2]) for val in self.fix_page_order()]) def parse_rules( self, rules: List[str], sep: str = "|" @@ -71,16 +71,31 @@ class CheckManual: return check - return [make_rule(rule) for rule in rules] + return [(rule, make_rule(rule)) for rule in rules] def check_page_order(self) -> List[bool]: - return [all([check(line) for check in self.rules]) for line in self.pages] + return [all([rule[1](line) for rule in self.rules]) for line in self.pages] + + def fix_page_order(self) -> List[str]: + to_fix = [page for page, check in zip(self.pages, self.validity) if not check] + fixed = [] + for pages in to_fix: + while not all([rule[1](pages) for rule in self.rules]): + for rule in self.rules: + if not rule[1](pages): + break + r1, r2 = rule[0].split("|") + i1, i2 = pages.index(r1), pages.index(r2) + pages[i1], pages[i2] = pages[i2], pages[i1] + fixed.append(pages) + return fixed if __name__ == "__main__": example = CheckManual(EXAMPLE) print(example) assert example._part1 == 143 + assert example._part2 == 123 with open("input.txt", "r") as f: main = CheckManual(f.read()) print(main)