diff options
author | Thomas Voss <mail@thomasvoss.com> | 2024-12-20 07:32:59 +0100 |
---|---|---|
committer | Thomas Voss <mail@thomasvoss.com> | 2024-12-20 07:32:59 +0100 |
commit | ff03dafbae6f53027a1e79e1a60678afc31ebbdf (patch) | |
tree | a473afdc32ba12dcf411e38ec0075d2e135d6280 /2024/20/puzzles.py | |
parent | 1b1ee3db6b7cf6746782d9c2fb5f80bfa3f3afb5 (diff) |
Add 2024 day 20 solutions
Diffstat (limited to '2024/20/puzzles.py')
-rw-r--r-- | 2024/20/puzzles.py | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/2024/20/puzzles.py b/2024/20/puzzles.py new file mode 100644 index 0000000..8727f6e --- /dev/null +++ b/2024/20/puzzles.py @@ -0,0 +1,42 @@ +#!/usr/bin/python3 + +def main() -> None: + points: set[complex] = set() + + with open("input", "r") as f: + for i, line in enumerate(f.readlines()): + for j, char in enumerate(line): + if char in "#\n": + continue + points.add(pos := complex(j, i)) + if char == 'S': + start = pos + + print(solve(start, points, 100, 2 if PUZZLE_PART == 1 else 20)) + +def solve( + pos: complex, + points: set[complex], + minsave: int, + maxcheat: int, +) -> int: + path: list[complex] = [] + while points: + path.append(pos) + for v⃗ in [1, -1, 1j, -1j]: + if (p := pos + v⃗) in points: + break + points.remove(pos) + pos = p + + cnt = 0 + for i, p1 in enumerate(path): + off = i + minsave + for j, p2 in enumerate(path[off + 2:], off + 2): + d = p1 - p2 + if abs(d.real) + abs(d.imag) <= min(j - off, maxcheat): + cnt += 1 + return cnt + +if __name__ == "__main__": + main()
\ No newline at end of file |