Skip to content

Instantly share code, notes, and snippets.

@dmontagu
Last active December 18, 2020 05:55
Show Gist options
  • Save dmontagu/1d92ca1248b4cda945687fd9e67ab438 to your computer and use it in GitHub Desktop.
Save dmontagu/1d92ca1248b4cda945687fd9e67ab438 to your computer and use it in GitHub Desktop.
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