From 5bf73d5948213f39c2f456ecb5abf5d8712cc750 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 19 May 2025 22:31:02 +0100 Subject: [PATCH] 2016: d18: ex1: add solution --- 2016/d18/ex1/ex1.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100755 2016/d18/ex1/ex1.py diff --git a/2016/d18/ex1/ex1.py b/2016/d18/ex1/ex1.py new file mode 100755 index 0000000..b02801b --- /dev/null +++ b/2016/d18/ex1/ex1.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: str) -> int: + def parse(input: str) -> set[int]: + return {i for i, c in enumerate(input.strip()) if c == "^"} + + def is_trap(tile: int, traps: set[int]) -> bool: + match ((tile - 1) in traps, tile in traps, (tile + 1) in traps): + case (True, True, False): + return True + case (False, True, True): + return True + case (True, False, False): + return True + case (False, False, True): + return True + case _: + return False + + def step_row(traps: set[int], row_length: int) -> set[int]: + return {i for i in range(row_length) if is_trap(i, traps)} + + traps = parse(input) + row_length = len(input.strip()) + safe_tiles = row_length - len(traps) + for _ in range(40 - 1): + traps = step_row(traps, row_length) + safe_tiles += row_length - len(traps) + return safe_tiles + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main()