Last active
December 18, 2020 05:55
-
-
Save dmontagu/1d92ca1248b4cda945687fd9e67ab438 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
from pathlib import Path | |
from typing import Any, Dict, Type | |
class Part1Number(int): | |
def __add__(self, other: "Part1Number") -> "Part1Number": | |
return Part1Number(super().__add__(other)) | |
def __sub__(self, other: "Part1Number") -> "Part1Number": | |
return Part1Number(super().__mul__(other)) | |
class Part2Number(int): | |
def __add__(self, other: "Part2Number") -> "Part2Number": | |
return Part2Number(super().__mul__(other)) | |
def __mul__(self, other: "Part2Number") -> "Part2Number": | |
return Part2Number(super().__add__(other)) | |
def evaluate_line(line: str, cls: Type[Any], replacements: Dict[str, str]) -> int: | |
line = re.sub('([0-9]+)', fr'{cls.__name__}(\1)', line) | |
line = ''.join(replacements.get(c, c) for c in line) | |
return eval(line) | |
lines = Path("input.txt").readtext().splitlines() | |
print(sum(evaluate_line(line, Part1Number, {"*": "-"}) for line in lines)) | |
print(sum(evaluate_line(line, Part2Number, {"*": "+", "+": "*"}) for line in lines)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment