diff --git a/2021/d01/ex2/ex2.py b/2021/d01/ex2/ex2.py new file mode 100755 index 0000000..2ef9e60 --- /dev/null +++ b/2021/d01/ex2/ex2.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +import collections +import itertools +import sys +from typing import List + + +def sliding_window(iterable, n): + it = iter(iterable) + window = collections.deque(itertools.islice(it, n), maxlen=n) + if len(window) == n: + yield tuple(window) + for x in it: + window.append(x) + yield tuple(window) + + +def solve(input: List[int]) -> int: + windowed = [sum(window) for window in sliding_window(input, 3)] + return sum(prev < cur for (prev, cur) in itertools.pairwise(windowed)) + + +def main() -> None: + input = [int(line) for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d02/ex1/ex1.py b/2021/d02/ex1/ex1.py new file mode 100755 index 0000000..61c98d6 --- /dev/null +++ b/2021/d02/ex1/ex1.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List + + +def solve(input: List[str]) -> int: + x, y = 0, 0 + + for instruction in input: + dir, length = instruction.split(" ") + length = int(length) + if dir == "forward": + x += length + elif dir == "down": + y += length + elif dir == "up": + y -= length + else: + assert False + + return x * y + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d02/ex1/input b/2021/d02/ex1/input new file mode 100644 index 0000000..2652d35 --- /dev/null +++ b/2021/d02/ex1/input @@ -0,0 +1,1000 @@ +forward 9 +forward 7 +forward 4 +down 7 +forward 5 +down 4 +down 2 +forward 1 +down 6 +forward 5 +forward 5 +forward 8 +forward 3 +forward 6 +down 2 +up 3 +forward 1 +up 4 +forward 1 +forward 6 +up 2 +forward 7 +up 2 +up 3 +down 9 +up 5 +down 5 +up 7 +down 5 +forward 4 +forward 1 +forward 8 +forward 9 +forward 3 +forward 9 +down 1 +down 1 +down 1 +forward 6 +up 8 +down 2 +forward 3 +down 9 +forward 7 +down 5 +up 7 +down 3 +forward 5 +forward 9 +down 9 +up 3 +forward 4 +forward 8 +up 2 +forward 4 +forward 2 +forward 2 +forward 8 +up 7 +up 4 +down 3 +forward 2 +down 9 +up 1 +forward 2 +down 3 +forward 2 +down 2 +up 6 +forward 6 +forward 2 +down 9 +forward 3 +forward 2 +down 1 +up 1 +down 1 +forward 5 +forward 4 +up 6 +forward 6 +forward 2 +up 9 +forward 9 +forward 5 +down 8 +up 9 +forward 2 +up 3 +forward 8 +forward 2 +down 4 +down 1 +up 9 +up 8 +forward 3 +forward 9 +down 9 +down 6 +forward 1 +forward 5 +up 9 +down 7 +up 9 +down 8 +down 2 +down 2 +up 9 +forward 7 +down 4 +down 7 +down 8 +down 9 +down 9 +forward 9 +down 9 +forward 2 +down 6 +forward 8 +forward 1 +down 6 +down 8 +forward 5 +forward 3 +forward 5 +down 5 +forward 6 +forward 3 +forward 4 +forward 3 +down 2 +down 9 +down 8 +down 9 +up 7 +up 9 +up 1 +down 6 +down 4 +forward 8 +forward 5 +forward 8 +down 5 +forward 7 +down 9 +forward 9 +forward 1 +up 4 +down 4 +forward 7 +forward 4 +up 9 +forward 6 +down 8 +down 5 +forward 8 +down 6 +down 3 +down 7 +forward 4 +down 8 +down 1 +up 6 +down 4 +down 9 +down 6 +forward 7 +down 8 +forward 5 +forward 8 +down 7 +down 5 +forward 1 +up 1 +down 1 +down 6 +forward 5 +forward 6 +down 1 +up 6 +forward 4 +forward 6 +down 4 +forward 3 +up 6 +forward 2 +forward 9 +down 8 +forward 8 +up 9 +forward 3 +forward 4 +forward 1 +down 4 +down 5 +forward 4 +down 6 +forward 7 +down 7 +down 8 +up 8 +up 5 +down 8 +down 5 +forward 8 +forward 2 +forward 6 +up 5 +forward 4 +forward 2 +forward 1 +up 7 +forward 1 +forward 6 +down 8 +down 5 +down 4 +forward 2 +up 8 +forward 4 +up 8 +forward 7 +forward 5 +down 4 +up 7 +down 5 +down 3 +forward 2 +down 2 +down 2 +forward 5 +forward 2 +down 2 +forward 5 +down 8 +forward 7 +up 8 +down 6 +up 5 +forward 6 +up 9 +down 2 +down 3 +up 1 +up 8 +forward 9 +forward 7 +forward 9 +forward 3 +down 2 +up 2 +down 2 +down 8 +up 8 +up 6 +forward 6 +down 9 +down 9 +up 4 +down 3 +forward 6 +forward 9 +down 6 +forward 7 +forward 4 +forward 4 +down 9 +down 3 +forward 1 +down 7 +forward 2 +forward 3 +forward 9 +forward 5 +forward 2 +forward 4 +forward 8 +up 1 +forward 5 +down 4 +down 2 +down 7 +forward 1 +up 1 +up 8 +up 6 +down 1 +forward 1 +forward 9 +forward 8 +down 7 +forward 6 +forward 8 +down 7 +forward 5 +down 5 +down 8 +down 8 +forward 8 +up 1 +down 7 +down 4 +up 4 +forward 5 +up 7 +forward 3 +forward 2 +down 1 +forward 3 +down 5 +forward 4 +down 4 +forward 6 +up 9 +forward 3 +down 7 +forward 7 +forward 9 +forward 9 +forward 4 +up 9 +up 5 +down 6 +down 6 +forward 8 +up 6 +down 2 +up 5 +forward 7 +forward 4 +down 6 +down 4 +down 9 +down 4 +up 2 +down 3 +down 7 +forward 1 +forward 4 +down 6 +forward 3 +forward 2 +forward 4 +down 9 +forward 8 +down 3 +up 4 +down 5 +forward 2 +down 6 +forward 8 +down 8 +down 7 +down 4 +forward 1 +down 3 +forward 9 +down 2 +down 9 +down 2 +forward 1 +down 3 +down 2 +down 2 +up 4 +down 8 +forward 6 +forward 4 +forward 4 +up 9 +forward 3 +forward 1 +forward 1 +up 3 +forward 9 +down 2 +forward 5 +down 9 +down 2 +forward 1 +forward 9 +down 3 +forward 3 +up 3 +forward 7 +down 6 +up 8 +down 2 +down 5 +forward 7 +down 8 +up 5 +down 4 +up 5 +forward 6 +forward 3 +down 2 +forward 4 +forward 3 +down 8 +forward 5 +forward 5 +down 5 +forward 1 +forward 8 +up 1 +down 7 +forward 6 +forward 3 +forward 8 +down 9 +down 7 +forward 1 +down 2 +down 6 +down 3 +forward 8 +down 7 +forward 2 +forward 1 +forward 5 +down 9 +forward 2 +forward 2 +up 4 +down 9 +down 4 +forward 7 +down 7 +up 8 +forward 6 +down 9 +down 8 +up 5 +down 8 +down 6 +forward 9 +up 5 +up 7 +down 3 +up 2 +down 4 +up 8 +up 3 +down 7 +forward 9 +forward 7 +down 7 +forward 5 +up 8 +forward 1 +down 2 +forward 8 +down 3 +up 5 +down 9 +forward 8 +down 7 +down 3 +down 3 +down 2 +forward 6 +up 5 +forward 4 +down 4 +down 3 +down 5 +forward 8 +down 3 +forward 7 +forward 2 +down 8 +down 6 +down 9 +down 3 +down 6 +down 7 +down 8 +up 6 +down 7 +forward 8 +down 9 +forward 1 +down 6 +forward 8 +down 5 +forward 3 +up 8 +forward 1 +down 6 +forward 4 +forward 5 +forward 8 +up 5 +forward 4 +down 2 +down 9 +up 2 +forward 1 +up 8 +forward 6 +up 4 +up 6 +forward 4 +up 5 +forward 6 +forward 1 +down 3 +down 6 +up 2 +forward 4 +up 2 +forward 4 +forward 6 +down 2 +down 4 +up 5 +down 9 +up 2 +down 4 +up 6 +forward 3 +down 6 +down 2 +up 8 +down 3 +down 1 +forward 6 +forward 5 +forward 8 +down 4 +down 6 +down 2 +forward 3 +down 3 +up 8 +down 4 +forward 5 +down 6 +down 3 +up 2 +forward 5 +forward 2 +down 6 +down 8 +forward 1 +forward 5 +forward 7 +forward 3 +forward 6 +down 9 +forward 7 +forward 4 +down 6 +down 2 +up 8 +down 3 +down 7 +down 7 +down 9 +down 8 +down 6 +down 6 +up 1 +up 6 +forward 4 +down 8 +up 7 +down 8 +forward 9 +down 9 +up 9 +forward 4 +forward 1 +down 3 +down 8 +forward 9 +down 9 +forward 3 +down 2 +forward 9 +down 2 +forward 8 +down 7 +down 2 +forward 4 +forward 3 +forward 3 +down 8 +up 3 +forward 9 +down 1 +down 6 +up 3 +down 6 +up 7 +forward 9 +up 9 +down 5 +forward 6 +up 1 +up 6 +down 4 +forward 9 +forward 6 +forward 9 +down 4 +up 9 +up 4 +forward 2 +forward 2 +forward 4 +up 6 +down 1 +down 4 +forward 9 +down 9 +forward 3 +up 9 +down 4 +forward 4 +down 1 +forward 8 +forward 2 +down 1 +down 7 +down 8 +forward 1 +up 7 +up 7 +forward 1 +down 3 +up 5 +down 4 +forward 2 +down 5 +up 1 +down 4 +forward 7 +down 2 +down 5 +down 4 +forward 7 +forward 6 +up 9 +forward 6 +forward 1 +forward 7 +forward 5 +up 6 +down 8 +forward 8 +down 9 +down 8 +forward 8 +down 2 +down 5 +forward 8 +forward 9 +down 6 +down 3 +down 3 +up 9 +down 6 +forward 6 +up 2 +forward 9 +forward 7 +forward 6 +forward 4 +forward 1 +down 2 +forward 1 +forward 3 +forward 9 +down 9 +forward 7 +forward 3 +down 8 +up 7 +forward 1 +down 8 +up 5 +down 8 +up 3 +down 7 +forward 2 +down 7 +forward 2 +down 3 +forward 3 +forward 8 +down 4 +forward 6 +down 3 +up 9 +forward 9 +up 6 +up 4 +up 6 +down 1 +forward 3 +down 7 +down 9 +up 9 +down 2 +up 6 +forward 4 +down 4 +down 3 +down 2 +down 6 +forward 1 +forward 1 +up 3 +forward 5 +forward 8 +down 1 +up 4 +forward 3 +up 4 +down 5 +up 7 +down 5 +down 6 +forward 9 +forward 8 +forward 9 +down 6 +forward 5 +down 3 +up 5 +down 7 +down 5 +down 7 +up 9 +forward 3 +forward 4 +forward 1 +up 3 +forward 2 +down 4 +up 9 +down 7 +forward 6 +forward 5 +forward 3 +forward 3 +forward 9 +up 7 +down 9 +forward 4 +down 7 +forward 9 +forward 5 +down 8 +up 2 +forward 2 +down 4 +up 5 +up 4 +forward 5 +down 4 +down 9 +down 7 +down 2 +forward 1 +forward 1 +down 4 +down 8 +down 6 +forward 1 +up 6 +up 3 +up 5 +down 1 +down 5 +up 1 +up 5 +forward 2 +up 2 +down 3 +forward 7 +forward 2 +down 1 +down 9 +forward 1 +down 1 +forward 9 +up 9 +down 9 +forward 9 +down 4 +down 1 +up 5 +down 2 +forward 9 +down 2 +up 3 +up 6 +forward 1 +forward 8 +down 5 +down 8 +up 2 +down 2 +up 4 +down 2 +down 4 +forward 6 +up 4 +down 1 +forward 9 +forward 4 +down 9 +up 7 +forward 7 +down 3 +forward 2 +down 6 +up 6 +down 5 +down 7 +forward 4 +forward 1 +forward 7 +forward 4 +forward 4 +up 2 +down 2 +down 5 +forward 7 +down 6 +forward 8 +down 3 +down 9 +forward 7 +forward 1 +down 2 +up 7 +forward 4 +forward 2 +forward 6 +forward 5 +forward 9 +forward 9 +down 9 +down 9 +up 7 +forward 7 +forward 7 +forward 1 +forward 2 +down 1 +down 4 +forward 7 +forward 5 +down 1 +up 2 +forward 3 +forward 2 +forward 1 +forward 6 +down 4 +up 6 +forward 7 +down 1 +forward 4 +up 6 +down 7 +down 4 +forward 1 +down 8 +down 2 +down 1 +down 8 +forward 4 +up 8 +down 4 +up 9 +up 3 +forward 6 +up 9 +down 1 +forward 3 +up 3 +forward 5 +up 3 +down 6 +forward 9 +down 3 +down 3 +up 5 +forward 5 +forward 8 +forward 9 +down 6 +down 3 +forward 6 +up 4 +up 3 +forward 3 +forward 2 +down 2 +up 9 +forward 4 +forward 6 +forward 2 +up 9 +down 2 +forward 7 +down 7 +up 1 +forward 2 +forward 8 +down 2 +down 6 +down 1 +forward 3 +forward 5 +forward 6 +forward 3 +down 3 +down 7 +up 3 +forward 2 +forward 5 +down 9 +forward 3 +down 9 +up 6 +down 6 +forward 3 +down 5 +forward 1 +down 5 +up 3 +forward 8 +forward 8 +down 5 +down 6 +down 1 +forward 9 +forward 4 +forward 1 +forward 8 +down 8 +down 9 +forward 7 +forward 9 +down 2 +down 6 +down 8 +down 3 +forward 5 +forward 7 +forward 4 +down 9 +down 2 +forward 4 +forward 7 +down 2 +down 7 +forward 8 +down 8 +forward 4 +up 8 +forward 3 +forward 9 +forward 4 +down 9 +down 6 +up 1 +down 3 +down 7 +down 4 +forward 9 +forward 4 +up 9 +down 6 +forward 3 +up 1 +down 8 +down 5 +forward 9 +down 4 +down 2 +down 2 +down 5 +up 5 +down 5 +forward 5 +forward 2 +up 1 +forward 2 +up 2 +forward 8 +down 2 +down 7 +forward 1 diff --git a/2021/d02/ex2/ex2.py b/2021/d02/ex2/ex2.py new file mode 100755 index 0000000..a5a5f3d --- /dev/null +++ b/2021/d02/ex2/ex2.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List + + +def solve(input: List[str]) -> int: + x, y, aim = 0, 0, 0 + + for instruction in input: + dir, length = instruction.split(" ") + length = int(length) + if dir == "forward": + x += length + y += length * aim + elif dir == "down": + aim += length + elif dir == "up": + aim -= length + else: + assert False + + return x * y + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d02/ex2/input b/2021/d02/ex2/input new file mode 100644 index 0000000..2652d35 --- /dev/null +++ b/2021/d02/ex2/input @@ -0,0 +1,1000 @@ +forward 9 +forward 7 +forward 4 +down 7 +forward 5 +down 4 +down 2 +forward 1 +down 6 +forward 5 +forward 5 +forward 8 +forward 3 +forward 6 +down 2 +up 3 +forward 1 +up 4 +forward 1 +forward 6 +up 2 +forward 7 +up 2 +up 3 +down 9 +up 5 +down 5 +up 7 +down 5 +forward 4 +forward 1 +forward 8 +forward 9 +forward 3 +forward 9 +down 1 +down 1 +down 1 +forward 6 +up 8 +down 2 +forward 3 +down 9 +forward 7 +down 5 +up 7 +down 3 +forward 5 +forward 9 +down 9 +up 3 +forward 4 +forward 8 +up 2 +forward 4 +forward 2 +forward 2 +forward 8 +up 7 +up 4 +down 3 +forward 2 +down 9 +up 1 +forward 2 +down 3 +forward 2 +down 2 +up 6 +forward 6 +forward 2 +down 9 +forward 3 +forward 2 +down 1 +up 1 +down 1 +forward 5 +forward 4 +up 6 +forward 6 +forward 2 +up 9 +forward 9 +forward 5 +down 8 +up 9 +forward 2 +up 3 +forward 8 +forward 2 +down 4 +down 1 +up 9 +up 8 +forward 3 +forward 9 +down 9 +down 6 +forward 1 +forward 5 +up 9 +down 7 +up 9 +down 8 +down 2 +down 2 +up 9 +forward 7 +down 4 +down 7 +down 8 +down 9 +down 9 +forward 9 +down 9 +forward 2 +down 6 +forward 8 +forward 1 +down 6 +down 8 +forward 5 +forward 3 +forward 5 +down 5 +forward 6 +forward 3 +forward 4 +forward 3 +down 2 +down 9 +down 8 +down 9 +up 7 +up 9 +up 1 +down 6 +down 4 +forward 8 +forward 5 +forward 8 +down 5 +forward 7 +down 9 +forward 9 +forward 1 +up 4 +down 4 +forward 7 +forward 4 +up 9 +forward 6 +down 8 +down 5 +forward 8 +down 6 +down 3 +down 7 +forward 4 +down 8 +down 1 +up 6 +down 4 +down 9 +down 6 +forward 7 +down 8 +forward 5 +forward 8 +down 7 +down 5 +forward 1 +up 1 +down 1 +down 6 +forward 5 +forward 6 +down 1 +up 6 +forward 4 +forward 6 +down 4 +forward 3 +up 6 +forward 2 +forward 9 +down 8 +forward 8 +up 9 +forward 3 +forward 4 +forward 1 +down 4 +down 5 +forward 4 +down 6 +forward 7 +down 7 +down 8 +up 8 +up 5 +down 8 +down 5 +forward 8 +forward 2 +forward 6 +up 5 +forward 4 +forward 2 +forward 1 +up 7 +forward 1 +forward 6 +down 8 +down 5 +down 4 +forward 2 +up 8 +forward 4 +up 8 +forward 7 +forward 5 +down 4 +up 7 +down 5 +down 3 +forward 2 +down 2 +down 2 +forward 5 +forward 2 +down 2 +forward 5 +down 8 +forward 7 +up 8 +down 6 +up 5 +forward 6 +up 9 +down 2 +down 3 +up 1 +up 8 +forward 9 +forward 7 +forward 9 +forward 3 +down 2 +up 2 +down 2 +down 8 +up 8 +up 6 +forward 6 +down 9 +down 9 +up 4 +down 3 +forward 6 +forward 9 +down 6 +forward 7 +forward 4 +forward 4 +down 9 +down 3 +forward 1 +down 7 +forward 2 +forward 3 +forward 9 +forward 5 +forward 2 +forward 4 +forward 8 +up 1 +forward 5 +down 4 +down 2 +down 7 +forward 1 +up 1 +up 8 +up 6 +down 1 +forward 1 +forward 9 +forward 8 +down 7 +forward 6 +forward 8 +down 7 +forward 5 +down 5 +down 8 +down 8 +forward 8 +up 1 +down 7 +down 4 +up 4 +forward 5 +up 7 +forward 3 +forward 2 +down 1 +forward 3 +down 5 +forward 4 +down 4 +forward 6 +up 9 +forward 3 +down 7 +forward 7 +forward 9 +forward 9 +forward 4 +up 9 +up 5 +down 6 +down 6 +forward 8 +up 6 +down 2 +up 5 +forward 7 +forward 4 +down 6 +down 4 +down 9 +down 4 +up 2 +down 3 +down 7 +forward 1 +forward 4 +down 6 +forward 3 +forward 2 +forward 4 +down 9 +forward 8 +down 3 +up 4 +down 5 +forward 2 +down 6 +forward 8 +down 8 +down 7 +down 4 +forward 1 +down 3 +forward 9 +down 2 +down 9 +down 2 +forward 1 +down 3 +down 2 +down 2 +up 4 +down 8 +forward 6 +forward 4 +forward 4 +up 9 +forward 3 +forward 1 +forward 1 +up 3 +forward 9 +down 2 +forward 5 +down 9 +down 2 +forward 1 +forward 9 +down 3 +forward 3 +up 3 +forward 7 +down 6 +up 8 +down 2 +down 5 +forward 7 +down 8 +up 5 +down 4 +up 5 +forward 6 +forward 3 +down 2 +forward 4 +forward 3 +down 8 +forward 5 +forward 5 +down 5 +forward 1 +forward 8 +up 1 +down 7 +forward 6 +forward 3 +forward 8 +down 9 +down 7 +forward 1 +down 2 +down 6 +down 3 +forward 8 +down 7 +forward 2 +forward 1 +forward 5 +down 9 +forward 2 +forward 2 +up 4 +down 9 +down 4 +forward 7 +down 7 +up 8 +forward 6 +down 9 +down 8 +up 5 +down 8 +down 6 +forward 9 +up 5 +up 7 +down 3 +up 2 +down 4 +up 8 +up 3 +down 7 +forward 9 +forward 7 +down 7 +forward 5 +up 8 +forward 1 +down 2 +forward 8 +down 3 +up 5 +down 9 +forward 8 +down 7 +down 3 +down 3 +down 2 +forward 6 +up 5 +forward 4 +down 4 +down 3 +down 5 +forward 8 +down 3 +forward 7 +forward 2 +down 8 +down 6 +down 9 +down 3 +down 6 +down 7 +down 8 +up 6 +down 7 +forward 8 +down 9 +forward 1 +down 6 +forward 8 +down 5 +forward 3 +up 8 +forward 1 +down 6 +forward 4 +forward 5 +forward 8 +up 5 +forward 4 +down 2 +down 9 +up 2 +forward 1 +up 8 +forward 6 +up 4 +up 6 +forward 4 +up 5 +forward 6 +forward 1 +down 3 +down 6 +up 2 +forward 4 +up 2 +forward 4 +forward 6 +down 2 +down 4 +up 5 +down 9 +up 2 +down 4 +up 6 +forward 3 +down 6 +down 2 +up 8 +down 3 +down 1 +forward 6 +forward 5 +forward 8 +down 4 +down 6 +down 2 +forward 3 +down 3 +up 8 +down 4 +forward 5 +down 6 +down 3 +up 2 +forward 5 +forward 2 +down 6 +down 8 +forward 1 +forward 5 +forward 7 +forward 3 +forward 6 +down 9 +forward 7 +forward 4 +down 6 +down 2 +up 8 +down 3 +down 7 +down 7 +down 9 +down 8 +down 6 +down 6 +up 1 +up 6 +forward 4 +down 8 +up 7 +down 8 +forward 9 +down 9 +up 9 +forward 4 +forward 1 +down 3 +down 8 +forward 9 +down 9 +forward 3 +down 2 +forward 9 +down 2 +forward 8 +down 7 +down 2 +forward 4 +forward 3 +forward 3 +down 8 +up 3 +forward 9 +down 1 +down 6 +up 3 +down 6 +up 7 +forward 9 +up 9 +down 5 +forward 6 +up 1 +up 6 +down 4 +forward 9 +forward 6 +forward 9 +down 4 +up 9 +up 4 +forward 2 +forward 2 +forward 4 +up 6 +down 1 +down 4 +forward 9 +down 9 +forward 3 +up 9 +down 4 +forward 4 +down 1 +forward 8 +forward 2 +down 1 +down 7 +down 8 +forward 1 +up 7 +up 7 +forward 1 +down 3 +up 5 +down 4 +forward 2 +down 5 +up 1 +down 4 +forward 7 +down 2 +down 5 +down 4 +forward 7 +forward 6 +up 9 +forward 6 +forward 1 +forward 7 +forward 5 +up 6 +down 8 +forward 8 +down 9 +down 8 +forward 8 +down 2 +down 5 +forward 8 +forward 9 +down 6 +down 3 +down 3 +up 9 +down 6 +forward 6 +up 2 +forward 9 +forward 7 +forward 6 +forward 4 +forward 1 +down 2 +forward 1 +forward 3 +forward 9 +down 9 +forward 7 +forward 3 +down 8 +up 7 +forward 1 +down 8 +up 5 +down 8 +up 3 +down 7 +forward 2 +down 7 +forward 2 +down 3 +forward 3 +forward 8 +down 4 +forward 6 +down 3 +up 9 +forward 9 +up 6 +up 4 +up 6 +down 1 +forward 3 +down 7 +down 9 +up 9 +down 2 +up 6 +forward 4 +down 4 +down 3 +down 2 +down 6 +forward 1 +forward 1 +up 3 +forward 5 +forward 8 +down 1 +up 4 +forward 3 +up 4 +down 5 +up 7 +down 5 +down 6 +forward 9 +forward 8 +forward 9 +down 6 +forward 5 +down 3 +up 5 +down 7 +down 5 +down 7 +up 9 +forward 3 +forward 4 +forward 1 +up 3 +forward 2 +down 4 +up 9 +down 7 +forward 6 +forward 5 +forward 3 +forward 3 +forward 9 +up 7 +down 9 +forward 4 +down 7 +forward 9 +forward 5 +down 8 +up 2 +forward 2 +down 4 +up 5 +up 4 +forward 5 +down 4 +down 9 +down 7 +down 2 +forward 1 +forward 1 +down 4 +down 8 +down 6 +forward 1 +up 6 +up 3 +up 5 +down 1 +down 5 +up 1 +up 5 +forward 2 +up 2 +down 3 +forward 7 +forward 2 +down 1 +down 9 +forward 1 +down 1 +forward 9 +up 9 +down 9 +forward 9 +down 4 +down 1 +up 5 +down 2 +forward 9 +down 2 +up 3 +up 6 +forward 1 +forward 8 +down 5 +down 8 +up 2 +down 2 +up 4 +down 2 +down 4 +forward 6 +up 4 +down 1 +forward 9 +forward 4 +down 9 +up 7 +forward 7 +down 3 +forward 2 +down 6 +up 6 +down 5 +down 7 +forward 4 +forward 1 +forward 7 +forward 4 +forward 4 +up 2 +down 2 +down 5 +forward 7 +down 6 +forward 8 +down 3 +down 9 +forward 7 +forward 1 +down 2 +up 7 +forward 4 +forward 2 +forward 6 +forward 5 +forward 9 +forward 9 +down 9 +down 9 +up 7 +forward 7 +forward 7 +forward 1 +forward 2 +down 1 +down 4 +forward 7 +forward 5 +down 1 +up 2 +forward 3 +forward 2 +forward 1 +forward 6 +down 4 +up 6 +forward 7 +down 1 +forward 4 +up 6 +down 7 +down 4 +forward 1 +down 8 +down 2 +down 1 +down 8 +forward 4 +up 8 +down 4 +up 9 +up 3 +forward 6 +up 9 +down 1 +forward 3 +up 3 +forward 5 +up 3 +down 6 +forward 9 +down 3 +down 3 +up 5 +forward 5 +forward 8 +forward 9 +down 6 +down 3 +forward 6 +up 4 +up 3 +forward 3 +forward 2 +down 2 +up 9 +forward 4 +forward 6 +forward 2 +up 9 +down 2 +forward 7 +down 7 +up 1 +forward 2 +forward 8 +down 2 +down 6 +down 1 +forward 3 +forward 5 +forward 6 +forward 3 +down 3 +down 7 +up 3 +forward 2 +forward 5 +down 9 +forward 3 +down 9 +up 6 +down 6 +forward 3 +down 5 +forward 1 +down 5 +up 3 +forward 8 +forward 8 +down 5 +down 6 +down 1 +forward 9 +forward 4 +forward 1 +forward 8 +down 8 +down 9 +forward 7 +forward 9 +down 2 +down 6 +down 8 +down 3 +forward 5 +forward 7 +forward 4 +down 9 +down 2 +forward 4 +forward 7 +down 2 +down 7 +forward 8 +down 8 +forward 4 +up 8 +forward 3 +forward 9 +forward 4 +down 9 +down 6 +up 1 +down 3 +down 7 +down 4 +forward 9 +forward 4 +up 9 +down 6 +forward 3 +up 1 +down 8 +down 5 +forward 9 +down 4 +down 2 +down 2 +down 5 +up 5 +down 5 +forward 5 +forward 2 +up 1 +forward 2 +up 2 +forward 8 +down 2 +down 7 +forward 1 diff --git a/2021/d03/ex1/ex1.py b/2021/d03/ex1/ex1.py new file mode 100755 index 0000000..ed2eeb7 --- /dev/null +++ b/2021/d03/ex1/ex1.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List + + +def solve(input: List[int]) -> int: + gamma, epsilon = 0, 0 + bit = 1 + + while any(map(bool, input)): + num_bits = sum(n % 2 for n in input) + if num_bits >= len(input) / 2: + gamma += bit + else: + epsilon += bit + input = [n // 2 for n in input] + bit *= 2 + + return gamma * epsilon + + +def main() -> None: + input = [int(line, 2) for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d03/ex1/input b/2021/d03/ex1/input new file mode 100644 index 0000000..929c455 --- /dev/null +++ b/2021/d03/ex1/input @@ -0,0 +1,1000 @@ +010101110000 +010011000110 +010101000011 +111100100001 +011100110101 +110001010101 +001111110101 +101100011100 +010111111011 +101010111101 +101000001110 +001000100001 +000100011110 +100011000100 +101100100001 +101010111010 +111000001011 +101101001011 +000010010110 +110111100111 +111101011110 +100100010010 +110001011110 +010011101000 +111110000110 +110001011111 +001001010110 +110111100100 +100111000101 +110011110000 +000110000010 +010001100001 +111110111011 +100010101011 +000000010101 +100010101110 +100110100111 +100111101111 +110011110001 +001000111100 +001101010010 +111101011101 +011000110001 +111111011010 +011000000000 +100000111001 +011110101100 +011101010111 +011001111110 +011100101101 +101100010011 +001100110000 +110101101100 +110110001100 +000101101110 +001010110010 +111110110110 +111010010011 +100010111111 +001001001000 +110111001011 +010110000010 +100000000100 +100001010010 +110010011101 +000001011011 +000100010100 +101011000001 +011101110111 +001100010100 +101000010110 +111111001100 +110011001011 +110000000000 +010100110101 +001111100011 +100011010010 +100111100011 +110101001010 +011111011000 +001010100110 +010101010100 +110111011111 +001001010000 +001011010101 +101111011011 +101001101000 +000011101110 +000101110010 +100011001010 +011001010010 +100100110011 +010010011100 +001100100110 +100111110111 +000111111000 +100000001101 +001111010101 +000001001111 +000101100000 +000101001111 +101010001001 +111011110001 +000111100011 +110011000010 +110011111101 +101001010110 +101111111000 +000110100010 +101111010001 +010011110001 +111110010010 +101111011101 +101110111101 +010001011111 +101110011010 +001110001100 +000110011001 +000101000101 +101010111011 +110010101100 +000100101101 +010111011111 +111001010110 +000010100100 +100000111100 +101101110001 +100001111010 +000111010010 +111100000110 +010010000000 +010001001011 +111101010000 +010011111110 +111011101011 +110110100110 +100001000011 +010010000110 +010000000001 +000001000101 +011010100000 +001011011000 +110101010001 +011000111110 +010011101101 +010011000011 +011010011101 +001101110100 +010001100101 +111011100011 +010111101000 +111100000010 +010000110000 +000100111001 +010010110100 +000101110110 +000011001110 +111010111100 +100101010001 +111011000101 +011111101100 +000110010001 +100011101111 +100101001110 +101101110010 +000000011010 +000001101000 +010110011000 +110100001001 +111111101100 +011010110001 +011100111101 +001101010110 +100111000111 +000000001111 +001110101010 +101000011001 +000111010111 +100110110001 +100011000011 +110111101011 +000110111001 +000010010011 +010111011001 +000111001000 +100011011010 +011101000100 +101010010100 +010111110000 +011011100111 +000001110001 +000100111000 +111100001011 +100101010000 +000110110100 +110011110111 +111000010111 +101110011000 +110011010000 +001111000100 +111010001001 +110001111000 +011101011111 +000001001100 +110100111011 +110001011011 +001010000100 +110011101110 +101100100100 +100101100001 +001010001010 +101010001000 +000110101001 +001100010000 +110001000101 +000100111110 +000110100111 +100010001010 +100100010110 +010001110011 +101111010010 +100000001001 +000110110000 +100010011011 +111101000001 +101111111011 +111111100110 +101001101010 +000011111011 +110000000011 +000001111010 +001001000100 +101110001101 +100111011111 +110101101110 +100011011011 +101000010001 +101001111000 +111101110010 +000101000011 +100100010100 +010101111101 +100110001011 +010011010111 +110111100101 +110010010101 +100010101101 +100110000110 +001101000001 +111001001000 +010111010011 +000110001111 +010101011010 +000000001000 +001001100100 +101111111001 +001110101000 +000110100100 +001111101111 +010100011000 +010000110110 +011101101110 +010100100100 +111110010101 +101100000110 +011010110000 +001001011101 +000000000101 +100101111001 +110101110110 +100111101010 +010010101101 +010100001111 +111111111110 +011111000000 +000001101111 +011001011001 +001101101000 +011010110110 +100101000110 +110001101110 +110100101011 +010001110100 +011110110101 +010001010001 +110110101000 +010000100011 +010101011001 +101111111010 +000011110010 +001000011101 +110001100010 +110110000011 +010000111011 +111010010000 +011001001000 +000111011010 +011111111100 +111001111100 +001101000100 +101110001011 +101110000111 +011010111111 +110011100111 +001101110010 +011111101111 +001110000110 +010111100001 +110100101001 +101010110010 +111011010100 +101001110010 +101101000100 +100111010001 +000011010110 +100110000100 +101000101010 +000000001010 +110100111010 +110010011010 +100110010100 +011101110010 +000111111010 +001000101001 +110100110010 +100100111011 +011001010111 +111000101010 +011001011011 +011010000000 +001101101110 +101010111000 +101010011000 +011000010101 +111001011010 +100111111111 +001101001100 +111011011010 +110110100011 +111010010100 +000110011101 +011100010011 +011111100111 +010110100000 +001100001000 +000110000110 +000101011011 +101011101011 +111101111110 +111111110000 +101101001100 +011000110110 +100111001000 +011011111100 +001111011110 +111011100100 +000101010010 +100011011000 +100000100110 +100000110011 +011000010110 +001010110100 +100111100010 +011110101011 +110111111010 +011100110110 +100100000000 +011010101101 +001101000010 +010110010111 +100010011100 +111101010101 +011011010111 +000000000110 +101001100000 +010100110011 +010101111111 +101110111001 +101101111000 +101110101000 +011011111110 +010001101010 +001000101010 +111100111111 +001011011110 +101010101001 +011111001010 +001001001111 +101000101101 +001111011000 +000100001101 +101101011000 +001100000100 +001000111101 +000001110100 +111101011111 +111010000010 +101111011111 +001100110101 +101010110001 +001110111010 +010010111110 +101101010011 +100001100110 +110010010001 +111100111001 +000100010001 +110010101010 +111010110101 +000001010110 +000111110110 +111010101100 +011110001100 +010110001001 +010111100011 +001010111000 +100111100111 +110110011001 +010100000000 +001011001111 +110010110000 +100011001111 +100111111011 +110001001001 +000100101111 +011010011011 +001001111101 +111110001100 +101111110010 +101100101110 +100110111001 +111010110011 +110010011110 +001111001101 +010011100111 +000111000011 +101101000000 +000001100101 +011101111001 +110100100110 +000110000001 +110111011101 +011100000110 +001011110100 +010001011011 +110000011110 +110001001011 +110100000001 +011010010100 +010010000101 +001010110111 +110001001111 +101100000001 +010000000000 +101110010001 +001100101110 +010000011010 +010100101011 +011010101100 +111101011011 +110111010000 +111111101111 +111011111011 +110001110111 +011100100011 +100001110101 +100111011001 +100110010000 +100110101110 +110101100001 +001010001101 +011101101000 +110001001110 +110010111011 +111100110100 +101011100011 +010100100101 +010001101111 +111000110101 +001000101011 +101101000101 +011000100111 +001111000011 +011000000011 +000011001111 +001010011111 +101001100010 +101010100001 +001001110010 +101010000111 +010111011010 +110101110111 +000110101111 +000110010011 +010110110010 +100111001011 +001100111111 +111110000001 +110110111000 +101010000100 +011100101010 +001000010101 +010010011001 +011111000110 +010011010011 +001011101101 +001001110100 +110101011100 +011000110100 +010101101000 +100000100000 +011011111010 +011010011111 +111011011101 +001111101110 +001000110101 +010001011100 +110101100010 +001100100100 +001100101011 +100110111000 +001100101101 +101000001011 +001100010101 +001100011010 +101011010101 +110101011111 +101111001011 +000010001111 +011110001111 +110000000100 +000110100001 +010010101111 +110000000110 +010011000000 +011001000101 +001101011010 +000011001101 +110100101010 +111001010111 +010011010101 +111010100101 +111110110101 +111110011100 +110010000110 +000110100011 +001000111000 +000101101100 +101110001010 +010010010110 +100001110111 +111010100010 +110110010111 +101000011000 +100100111010 +001000011011 +111101101011 +101001010111 +100110000011 +100001010001 +011011000001 +010110010101 +110001010000 +001110000000 +111001001110 +011011101100 +000100001111 +111000110011 +111101101101 +100110000000 +100011110110 +001000000010 +110011011000 +111000100110 +100110110000 +010011101010 +111011001010 +001101111000 +001100000111 +001110011110 +100001000100 +000010000111 +011010101001 +111110001001 +110110000010 +011011101101 +110001111010 +011001101110 +010011000010 +100101110100 +101000100001 +000111011101 +101100001011 +100000011010 +111001001001 +100000000001 +000101111001 +100101101101 +111001101111 +001011011011 +000010101000 +001010111010 +000100100011 +001110101101 +100000111000 +110110001110 +000111101101 +001010001111 +011000111011 +100000100100 +100011010110 +000010000000 +001000001101 +010001001110 +000111111011 +100110000001 +110010111000 +111100111100 +001000001100 +000010110100 +011010001110 +110001110101 +001100000101 +100010110100 +111000000010 +110100100101 +010010111011 +010110011001 +001001101100 +001010101010 +100001011100 +010001101001 +000000010010 +000101111010 +011000101011 +111111010101 +011110101111 +011110011001 +001101101101 +111110101110 +101111110100 +010101001111 +010010011101 +000110101100 +011100000011 +100011101001 +101101100111 +110011101100 +000110111010 +000011001000 +111101010011 +011011101110 +111101001100 +100100101111 +111010110111 +000001100110 +110100110101 +110100001011 +111010000001 +001011110011 +001010110101 +100001100000 +101000101100 +011011100001 +000011011011 +100101110001 +101100111100 +010000111110 +010100101101 +001111011111 +110101010000 +000110010100 +001001011011 +110111111011 +111100010110 +110000101011 +111001000100 +000100000111 +001011001110 +011110100010 +011011110101 +001100011001 +111010011111 +011011110110 +111101000000 +101111110000 +011100111000 +010010011011 +101000110010 +001101101111 +010001000011 +001010010110 +101000010010 +110111001111 +011111010101 +111111011001 +100011110011 +110001100100 +100000010100 +001111011010 +111001111000 +110101001011 +101000110001 +111001111111 +110000010111 +000000100100 +101011101110 +111001110111 +001110011010 +110011101000 +001011100100 +011001011111 +010100010101 +011111111010 +010010110000 +100011101110 +000011000110 +001001010111 +010111110100 +010110110101 +010000101000 +101010101010 +000100100010 +000110011000 +101010110101 +100000100001 +101100010010 +010110000110 +011011010011 +000001010010 +011101111110 +100010000100 +000100101110 +010110010001 +101100011011 +010111010000 +101100011111 +010011001010 +100010100000 +001001101001 +110010011001 +111000110100 +111111010000 +111100101110 +101010001010 +111111100100 +011110001110 +101100001111 +001010001100 +110100100011 +011100010101 +110001011000 +000010100001 +011000011110 +000000101101 +000011101101 +111010011000 +000101110100 +111100011010 +101100010110 +100001101011 +110100110100 +101100111010 +010000011110 +101001100011 +000101110001 +001101111111 +111101000101 +100101111101 +001101011110 +011111101011 +100000010101 +011010000001 +011000011101 +110101011110 +111010101000 +110111111100 +101111110011 +101101001001 +000111101001 +010110000011 +110011000000 +000001111101 +001011101000 +001001111011 +110110000111 +101100010101 +101100100111 +000010110001 +110000111011 +110111001000 +010010111111 +100010110000 +010000111100 +101001000111 +010100001100 +001111001010 +010100101010 +100001000010 +010011101111 +100011000001 +110000001101 +011001011110 +100111111001 +001100111101 +010110100110 +001000011001 +101000111110 +000100001011 +111110100111 +011100111001 +100011111001 +100001100001 +110110001011 +110011101111 +011010111011 +110101010110 +010111101001 +111110000011 +111100000111 +011111100100 +101001000001 +110111010100 +000011000000 +000100111101 +001100010011 +100000010011 +010010001001 +010111000100 +110110010100 +011100101110 +110110100010 +100111010111 +001111010011 +000110110110 +000010000110 +110100010001 +010100111101 +011001000110 +101011010100 +001110001101 +101111110101 +110011001010 +110100011100 +001101011000 +100101101110 +000001000111 +111001101011 +101011000010 +001001011111 +111000111010 +111011100110 +001001011100 +000010011000 +000101001001 +100110001111 +010100100010 +001101000101 +010111111100 +100010000001 +110101101111 +100010101010 +110110010001 +011101000111 +011110001010 +100110011110 +010011100100 +110101110100 +000000110010 +001111101100 +010011010010 +010000100000 +110001000100 +110110111111 +011100001111 +110110001101 +111110000010 +010001110010 +001101110101 +111111101101 +010101101101 +001011011100 +001011000001 +001011011101 +010001100010 +011110110011 +000101101011 +000110111000 +101101110000 +101011011001 +001001001110 +000001000000 +101011010010 +101110010111 +110011100001 +001011101001 +000000100001 +010000100110 +101111010000 +011000011100 +100011100110 +110111110011 +110010000100 +101110000000 +110010101101 +011101111000 +001111000110 +101001011100 +011111001111 +111011101010 +001110101110 +101001000011 +111101101111 +111001110101 +000110100110 +111111011011 +101011011011 +111100101101 +111111010100 +101010010000 +101000110011 +011110100000 +010100101001 +010011100011 +101000111001 +101100000111 +101010100010 +101110011111 +111011011110 +110011011001 +101001101101 +110010001011 +010100101000 +001010011010 +001100000000 +110000010000 +000110111011 +011101111111 +011001001001 +011011001001 +000100101001 +110010010010 +000110001001 +001000100011 +101011101111 +100111110010 +110010101011 +000000110110 +010111001101 +100100001111 +100010001011 +011101100100 +000011111000 +010100111011 +010101101100 +100110100110 +110100101110 +010111111001 +010010011110 +111110000100 +000110001101 +100100100001 +111011010111 +101001010101 +111011010010 +101001000000 +100111101100 +101010110000 +000111001101 +000100100110 +100100101000 +111000011001 +000110110101 +111010000011 +101100110001 +000001011000 +001110110011 +101000100110 +100110100101 +010001000111 +100011010001 +010100011101 +110100110110 +100010100110 +101100010001 +010011000100 +100100010101 +110000101101 +010101001100 +100011100100 +001111010100 +100111001001 +110000100000 +100100010111 +010101000010 +101101001010 +110101111101 +010100000110 +011101100110 +011011010010 diff --git a/2021/d03/ex2/ex2.py b/2021/d03/ex2/ex2.py new file mode 100755 index 0000000..9c6515b --- /dev/null +++ b/2021/d03/ex2/ex2.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +import itertools +import sys +from copy import deepcopy +from typing import List + + +def solve(input: List[int]) -> int: + def highest_pow2(n: int) -> int: + return len(bin(n)) - 2 - 1 # '0b' prefix, and off-by-one + + def count_bits_at(input: List[int], bit: int) -> int: + return sum((n & pow(2, bit)) != 0 for n in input) + + def filter_by_bit_value(input: List[int], bit: int, value: int) -> List[int]: + # Simplify the filter by mapping the value to the actual power of 2 + if value != 0: + value = pow(2, bit) + return list(filter(lambda n: (n & pow(2, bit)) == value, input)) + + def filter_oxygen(input: List[int], bit: int) -> List[int]: + # No further processing needed + if len(input) <= 1: + return input + + num_bits = count_bits_at(input, bit) + # Keep 1s on equality + if num_bits >= len(input) / 2: + return filter_by_bit_value(input, bit, 1) + else: + return filter_by_bit_value(input, bit, 0) + + def filter_co2(input: List[int], bit: int) -> List[int]: + # No further processing needed + if len(input) <= 1: + return input + + num_bits = count_bits_at(input, bit) + # Keep 0s on equality + if num_bits < len(input) / 2: + return filter_by_bit_value(input, bit, 1) + else: + return filter_by_bit_value(input, bit, 0) + + oxygen, co2 = 0, 0 + max_bit = max(highest_pow2(n) for n in input) + oxygen_input, co2_input = deepcopy(input), deepcopy(input) + + for bit in range(max_bit, -1, -1): + oxygen_input = filter_oxygen(oxygen_input, bit) + co2_input = filter_co2(co2_input, bit) + + if len(oxygen_input) == 1: + oxygen = oxygen_input[0] + if len(co2_input) == 1: + co2 = co2_input[0] + + return oxygen * co2 + + +def main() -> None: + input = [int(line, 2) for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d03/ex2/input b/2021/d03/ex2/input new file mode 100644 index 0000000..929c455 --- /dev/null +++ b/2021/d03/ex2/input @@ -0,0 +1,1000 @@ +010101110000 +010011000110 +010101000011 +111100100001 +011100110101 +110001010101 +001111110101 +101100011100 +010111111011 +101010111101 +101000001110 +001000100001 +000100011110 +100011000100 +101100100001 +101010111010 +111000001011 +101101001011 +000010010110 +110111100111 +111101011110 +100100010010 +110001011110 +010011101000 +111110000110 +110001011111 +001001010110 +110111100100 +100111000101 +110011110000 +000110000010 +010001100001 +111110111011 +100010101011 +000000010101 +100010101110 +100110100111 +100111101111 +110011110001 +001000111100 +001101010010 +111101011101 +011000110001 +111111011010 +011000000000 +100000111001 +011110101100 +011101010111 +011001111110 +011100101101 +101100010011 +001100110000 +110101101100 +110110001100 +000101101110 +001010110010 +111110110110 +111010010011 +100010111111 +001001001000 +110111001011 +010110000010 +100000000100 +100001010010 +110010011101 +000001011011 +000100010100 +101011000001 +011101110111 +001100010100 +101000010110 +111111001100 +110011001011 +110000000000 +010100110101 +001111100011 +100011010010 +100111100011 +110101001010 +011111011000 +001010100110 +010101010100 +110111011111 +001001010000 +001011010101 +101111011011 +101001101000 +000011101110 +000101110010 +100011001010 +011001010010 +100100110011 +010010011100 +001100100110 +100111110111 +000111111000 +100000001101 +001111010101 +000001001111 +000101100000 +000101001111 +101010001001 +111011110001 +000111100011 +110011000010 +110011111101 +101001010110 +101111111000 +000110100010 +101111010001 +010011110001 +111110010010 +101111011101 +101110111101 +010001011111 +101110011010 +001110001100 +000110011001 +000101000101 +101010111011 +110010101100 +000100101101 +010111011111 +111001010110 +000010100100 +100000111100 +101101110001 +100001111010 +000111010010 +111100000110 +010010000000 +010001001011 +111101010000 +010011111110 +111011101011 +110110100110 +100001000011 +010010000110 +010000000001 +000001000101 +011010100000 +001011011000 +110101010001 +011000111110 +010011101101 +010011000011 +011010011101 +001101110100 +010001100101 +111011100011 +010111101000 +111100000010 +010000110000 +000100111001 +010010110100 +000101110110 +000011001110 +111010111100 +100101010001 +111011000101 +011111101100 +000110010001 +100011101111 +100101001110 +101101110010 +000000011010 +000001101000 +010110011000 +110100001001 +111111101100 +011010110001 +011100111101 +001101010110 +100111000111 +000000001111 +001110101010 +101000011001 +000111010111 +100110110001 +100011000011 +110111101011 +000110111001 +000010010011 +010111011001 +000111001000 +100011011010 +011101000100 +101010010100 +010111110000 +011011100111 +000001110001 +000100111000 +111100001011 +100101010000 +000110110100 +110011110111 +111000010111 +101110011000 +110011010000 +001111000100 +111010001001 +110001111000 +011101011111 +000001001100 +110100111011 +110001011011 +001010000100 +110011101110 +101100100100 +100101100001 +001010001010 +101010001000 +000110101001 +001100010000 +110001000101 +000100111110 +000110100111 +100010001010 +100100010110 +010001110011 +101111010010 +100000001001 +000110110000 +100010011011 +111101000001 +101111111011 +111111100110 +101001101010 +000011111011 +110000000011 +000001111010 +001001000100 +101110001101 +100111011111 +110101101110 +100011011011 +101000010001 +101001111000 +111101110010 +000101000011 +100100010100 +010101111101 +100110001011 +010011010111 +110111100101 +110010010101 +100010101101 +100110000110 +001101000001 +111001001000 +010111010011 +000110001111 +010101011010 +000000001000 +001001100100 +101111111001 +001110101000 +000110100100 +001111101111 +010100011000 +010000110110 +011101101110 +010100100100 +111110010101 +101100000110 +011010110000 +001001011101 +000000000101 +100101111001 +110101110110 +100111101010 +010010101101 +010100001111 +111111111110 +011111000000 +000001101111 +011001011001 +001101101000 +011010110110 +100101000110 +110001101110 +110100101011 +010001110100 +011110110101 +010001010001 +110110101000 +010000100011 +010101011001 +101111111010 +000011110010 +001000011101 +110001100010 +110110000011 +010000111011 +111010010000 +011001001000 +000111011010 +011111111100 +111001111100 +001101000100 +101110001011 +101110000111 +011010111111 +110011100111 +001101110010 +011111101111 +001110000110 +010111100001 +110100101001 +101010110010 +111011010100 +101001110010 +101101000100 +100111010001 +000011010110 +100110000100 +101000101010 +000000001010 +110100111010 +110010011010 +100110010100 +011101110010 +000111111010 +001000101001 +110100110010 +100100111011 +011001010111 +111000101010 +011001011011 +011010000000 +001101101110 +101010111000 +101010011000 +011000010101 +111001011010 +100111111111 +001101001100 +111011011010 +110110100011 +111010010100 +000110011101 +011100010011 +011111100111 +010110100000 +001100001000 +000110000110 +000101011011 +101011101011 +111101111110 +111111110000 +101101001100 +011000110110 +100111001000 +011011111100 +001111011110 +111011100100 +000101010010 +100011011000 +100000100110 +100000110011 +011000010110 +001010110100 +100111100010 +011110101011 +110111111010 +011100110110 +100100000000 +011010101101 +001101000010 +010110010111 +100010011100 +111101010101 +011011010111 +000000000110 +101001100000 +010100110011 +010101111111 +101110111001 +101101111000 +101110101000 +011011111110 +010001101010 +001000101010 +111100111111 +001011011110 +101010101001 +011111001010 +001001001111 +101000101101 +001111011000 +000100001101 +101101011000 +001100000100 +001000111101 +000001110100 +111101011111 +111010000010 +101111011111 +001100110101 +101010110001 +001110111010 +010010111110 +101101010011 +100001100110 +110010010001 +111100111001 +000100010001 +110010101010 +111010110101 +000001010110 +000111110110 +111010101100 +011110001100 +010110001001 +010111100011 +001010111000 +100111100111 +110110011001 +010100000000 +001011001111 +110010110000 +100011001111 +100111111011 +110001001001 +000100101111 +011010011011 +001001111101 +111110001100 +101111110010 +101100101110 +100110111001 +111010110011 +110010011110 +001111001101 +010011100111 +000111000011 +101101000000 +000001100101 +011101111001 +110100100110 +000110000001 +110111011101 +011100000110 +001011110100 +010001011011 +110000011110 +110001001011 +110100000001 +011010010100 +010010000101 +001010110111 +110001001111 +101100000001 +010000000000 +101110010001 +001100101110 +010000011010 +010100101011 +011010101100 +111101011011 +110111010000 +111111101111 +111011111011 +110001110111 +011100100011 +100001110101 +100111011001 +100110010000 +100110101110 +110101100001 +001010001101 +011101101000 +110001001110 +110010111011 +111100110100 +101011100011 +010100100101 +010001101111 +111000110101 +001000101011 +101101000101 +011000100111 +001111000011 +011000000011 +000011001111 +001010011111 +101001100010 +101010100001 +001001110010 +101010000111 +010111011010 +110101110111 +000110101111 +000110010011 +010110110010 +100111001011 +001100111111 +111110000001 +110110111000 +101010000100 +011100101010 +001000010101 +010010011001 +011111000110 +010011010011 +001011101101 +001001110100 +110101011100 +011000110100 +010101101000 +100000100000 +011011111010 +011010011111 +111011011101 +001111101110 +001000110101 +010001011100 +110101100010 +001100100100 +001100101011 +100110111000 +001100101101 +101000001011 +001100010101 +001100011010 +101011010101 +110101011111 +101111001011 +000010001111 +011110001111 +110000000100 +000110100001 +010010101111 +110000000110 +010011000000 +011001000101 +001101011010 +000011001101 +110100101010 +111001010111 +010011010101 +111010100101 +111110110101 +111110011100 +110010000110 +000110100011 +001000111000 +000101101100 +101110001010 +010010010110 +100001110111 +111010100010 +110110010111 +101000011000 +100100111010 +001000011011 +111101101011 +101001010111 +100110000011 +100001010001 +011011000001 +010110010101 +110001010000 +001110000000 +111001001110 +011011101100 +000100001111 +111000110011 +111101101101 +100110000000 +100011110110 +001000000010 +110011011000 +111000100110 +100110110000 +010011101010 +111011001010 +001101111000 +001100000111 +001110011110 +100001000100 +000010000111 +011010101001 +111110001001 +110110000010 +011011101101 +110001111010 +011001101110 +010011000010 +100101110100 +101000100001 +000111011101 +101100001011 +100000011010 +111001001001 +100000000001 +000101111001 +100101101101 +111001101111 +001011011011 +000010101000 +001010111010 +000100100011 +001110101101 +100000111000 +110110001110 +000111101101 +001010001111 +011000111011 +100000100100 +100011010110 +000010000000 +001000001101 +010001001110 +000111111011 +100110000001 +110010111000 +111100111100 +001000001100 +000010110100 +011010001110 +110001110101 +001100000101 +100010110100 +111000000010 +110100100101 +010010111011 +010110011001 +001001101100 +001010101010 +100001011100 +010001101001 +000000010010 +000101111010 +011000101011 +111111010101 +011110101111 +011110011001 +001101101101 +111110101110 +101111110100 +010101001111 +010010011101 +000110101100 +011100000011 +100011101001 +101101100111 +110011101100 +000110111010 +000011001000 +111101010011 +011011101110 +111101001100 +100100101111 +111010110111 +000001100110 +110100110101 +110100001011 +111010000001 +001011110011 +001010110101 +100001100000 +101000101100 +011011100001 +000011011011 +100101110001 +101100111100 +010000111110 +010100101101 +001111011111 +110101010000 +000110010100 +001001011011 +110111111011 +111100010110 +110000101011 +111001000100 +000100000111 +001011001110 +011110100010 +011011110101 +001100011001 +111010011111 +011011110110 +111101000000 +101111110000 +011100111000 +010010011011 +101000110010 +001101101111 +010001000011 +001010010110 +101000010010 +110111001111 +011111010101 +111111011001 +100011110011 +110001100100 +100000010100 +001111011010 +111001111000 +110101001011 +101000110001 +111001111111 +110000010111 +000000100100 +101011101110 +111001110111 +001110011010 +110011101000 +001011100100 +011001011111 +010100010101 +011111111010 +010010110000 +100011101110 +000011000110 +001001010111 +010111110100 +010110110101 +010000101000 +101010101010 +000100100010 +000110011000 +101010110101 +100000100001 +101100010010 +010110000110 +011011010011 +000001010010 +011101111110 +100010000100 +000100101110 +010110010001 +101100011011 +010111010000 +101100011111 +010011001010 +100010100000 +001001101001 +110010011001 +111000110100 +111111010000 +111100101110 +101010001010 +111111100100 +011110001110 +101100001111 +001010001100 +110100100011 +011100010101 +110001011000 +000010100001 +011000011110 +000000101101 +000011101101 +111010011000 +000101110100 +111100011010 +101100010110 +100001101011 +110100110100 +101100111010 +010000011110 +101001100011 +000101110001 +001101111111 +111101000101 +100101111101 +001101011110 +011111101011 +100000010101 +011010000001 +011000011101 +110101011110 +111010101000 +110111111100 +101111110011 +101101001001 +000111101001 +010110000011 +110011000000 +000001111101 +001011101000 +001001111011 +110110000111 +101100010101 +101100100111 +000010110001 +110000111011 +110111001000 +010010111111 +100010110000 +010000111100 +101001000111 +010100001100 +001111001010 +010100101010 +100001000010 +010011101111 +100011000001 +110000001101 +011001011110 +100111111001 +001100111101 +010110100110 +001000011001 +101000111110 +000100001011 +111110100111 +011100111001 +100011111001 +100001100001 +110110001011 +110011101111 +011010111011 +110101010110 +010111101001 +111110000011 +111100000111 +011111100100 +101001000001 +110111010100 +000011000000 +000100111101 +001100010011 +100000010011 +010010001001 +010111000100 +110110010100 +011100101110 +110110100010 +100111010111 +001111010011 +000110110110 +000010000110 +110100010001 +010100111101 +011001000110 +101011010100 +001110001101 +101111110101 +110011001010 +110100011100 +001101011000 +100101101110 +000001000111 +111001101011 +101011000010 +001001011111 +111000111010 +111011100110 +001001011100 +000010011000 +000101001001 +100110001111 +010100100010 +001101000101 +010111111100 +100010000001 +110101101111 +100010101010 +110110010001 +011101000111 +011110001010 +100110011110 +010011100100 +110101110100 +000000110010 +001111101100 +010011010010 +010000100000 +110001000100 +110110111111 +011100001111 +110110001101 +111110000010 +010001110010 +001101110101 +111111101101 +010101101101 +001011011100 +001011000001 +001011011101 +010001100010 +011110110011 +000101101011 +000110111000 +101101110000 +101011011001 +001001001110 +000001000000 +101011010010 +101110010111 +110011100001 +001011101001 +000000100001 +010000100110 +101111010000 +011000011100 +100011100110 +110111110011 +110010000100 +101110000000 +110010101101 +011101111000 +001111000110 +101001011100 +011111001111 +111011101010 +001110101110 +101001000011 +111101101111 +111001110101 +000110100110 +111111011011 +101011011011 +111100101101 +111111010100 +101010010000 +101000110011 +011110100000 +010100101001 +010011100011 +101000111001 +101100000111 +101010100010 +101110011111 +111011011110 +110011011001 +101001101101 +110010001011 +010100101000 +001010011010 +001100000000 +110000010000 +000110111011 +011101111111 +011001001001 +011011001001 +000100101001 +110010010010 +000110001001 +001000100011 +101011101111 +100111110010 +110010101011 +000000110110 +010111001101 +100100001111 +100010001011 +011101100100 +000011111000 +010100111011 +010101101100 +100110100110 +110100101110 +010111111001 +010010011110 +111110000100 +000110001101 +100100100001 +111011010111 +101001010101 +111011010010 +101001000000 +100111101100 +101010110000 +000111001101 +000100100110 +100100101000 +111000011001 +000110110101 +111010000011 +101100110001 +000001011000 +001110110011 +101000100110 +100110100101 +010001000111 +100011010001 +010100011101 +110100110110 +100010100110 +101100010001 +010011000100 +100100010101 +110000101101 +010101001100 +100011100100 +001111010100 +100111001001 +110000100000 +100100010111 +010101000010 +101101001010 +110101111101 +010100000110 +011101100110 +011011010010 diff --git a/2021/d04/ex1/ex1.py b/2021/d04/ex1/ex1.py new file mode 100755 index 0000000..9cfc0c2 --- /dev/null +++ b/2021/d04/ex1/ex1.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List, Tuple + +Board = List[List[int]] + + +def solve(input: List[str]) -> int: + def parse_input() -> Tuple[List[int], List[Board]]: + def listify(line: str, delim: str = " ") -> List[int]: + return [int(n) for n in line.split(delim) if n != ""] + + draw_order = listify(input[0], delim=",") + boards: List[Board] = [] + for l in input[1:]: + if l == "": + boards.append([]) + continue + boards[-1].append(listify(l)) + + return draw_order, boards + + def bingo(board: Board, draw: List[int]) -> bool: + assert len(board) == len(board[0]) + + def line(l: int) -> bool: + return all(n in draw for n in board[l]) + + def row(r: int) -> bool: + return all(board[i][r] in draw for i in range(len(board))) + + lines = [line(i) for i in range(len(board))] + rows = [row(i) for i in range(len(board[0]))] + + return any(itertools.chain(lines, rows)) + + draw_order, boards = parse_input() + + draw = [] + for d in draw_order: + draw.append(d) + for b in boards: + if not bingo(b, draw): + continue + return d * sum(n for n in itertools.chain.from_iterable(b) if n not in draw) + + # Sanity check + assert False + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d04/ex1/input b/2021/d04/ex1/input new file mode 100644 index 0000000..dc5dffc --- /dev/null +++ b/2021/d04/ex1/input @@ -0,0 +1,601 @@ +85,84,30,15,46,71,64,45,13,90,63,89,62,25,87,68,73,47,65,78,2,27,67,95,88,99,96,17,42,31,91,98,57,28,38,93,43,0,55,49,22,24,82,54,59,52,3,26,9,32,4,48,39,50,80,21,5,1,23,10,58,34,12,35,74,8,6,79,40,76,86,69,81,61,14,92,97,19,7,51,33,11,77,75,20,70,29,36,60,18,56,37,72,41,94,44,83,66,16,53 + +78 13 8 62 67 +42 89 97 16 65 +5 12 73 50 56 +45 10 63 41 64 +49 1 95 71 17 + +60 25 66 82 22 +94 45 68 5 12 +46 44 48 31 34 +10 56 37 96 81 +99 39 84 32 6 + +11 86 77 36 2 +57 68 27 74 4 +81 92 49 37 51 +78 43 94 46 63 +13 52 72 17 44 + +88 13 81 21 20 +80 99 23 37 53 +44 68 15 38 55 +84 48 82 97 6 +4 43 52 72 31 + +39 62 45 86 44 +12 17 16 7 6 +84 42 82 34 85 +19 77 9 48 98 +21 99 67 26 69 + +1 75 50 5 44 +3 28 62 17 43 +14 52 64 77 81 +32 89 7 11 70 +38 36 71 45 58 + +53 32 35 69 63 +6 21 75 64 96 +10 89 15 48 26 +23 20 43 57 33 +18 49 51 47 74 + +20 79 9 74 13 +52 28 77 26 43 +57 83 4 25 70 +90 1 30 53 38 +56 66 82 35 51 + +12 3 31 93 8 +20 27 51 78 9 +29 46 82 85 75 +15 76 91 70 63 +59 39 13 43 79 + +46 35 15 13 2 +65 69 97 77 87 +64 59 94 88 40 +34 79 92 93 58 +47 28 74 82 29 + +32 38 24 68 12 +8 78 79 89 43 +67 54 6 98 48 +1 14 83 15 37 +44 10 97 74 33 + +9 95 2 99 1 +8 42 60 56 40 +32 11 71 14 80 +77 6 68 46 48 +98 70 39 44 62 + +43 94 41 13 15 +96 99 35 27 8 +22 75 73 17 90 +62 23 5 88 3 +10 52 61 60 57 + +31 62 74 3 79 +15 49 60 28 71 +66 2 11 36 41 +34 80 33 94 75 +64 56 84 70 16 + +98 94 68 32 26 +61 7 52 66 18 +40 20 82 81 74 +28 36 89 14 35 +71 11 44 13 72 + +81 30 6 86 37 +46 45 64 83 62 +7 70 38 51 15 +91 41 26 40 4 +87 0 82 74 60 + +83 99 26 69 1 +6 98 53 31 43 +82 64 42 90 34 +87 62 11 40 39 +77 51 2 30 97 + +96 5 24 44 32 +48 92 78 74 76 +99 33 93 97 49 +45 8 88 66 59 +52 64 29 60 82 + +69 23 59 96 71 +14 93 21 44 62 +65 84 2 39 1 +0 68 38 81 4 +48 31 26 60 34 + +24 46 44 52 98 +65 23 31 89 5 +34 79 75 96 41 +76 28 90 12 11 +68 29 38 70 50 + +51 0 45 23 20 +44 49 12 31 7 +41 26 46 75 92 +90 30 72 95 55 +87 57 10 99 40 + +25 67 80 74 44 +3 82 27 81 11 +33 42 97 57 70 +19 94 0 2 49 +6 90 60 29 58 + +79 59 96 68 14 +38 70 65 66 69 +36 75 20 18 29 +64 88 35 61 43 +57 76 62 23 25 + +60 9 81 94 62 +73 20 87 72 14 +95 63 42 51 13 +75 83 32 30 66 +97 6 80 82 17 + +3 88 31 43 68 +20 78 47 10 91 +14 42 40 74 39 +5 32 16 97 1 +9 33 49 70 36 + +77 31 65 27 52 +49 74 57 25 66 +24 4 39 33 1 +23 14 19 2 21 +80 71 29 81 91 + +32 68 47 3 88 +1 97 99 28 80 +2 25 18 31 51 +26 10 73 34 40 +8 55 45 36 37 + +79 81 33 94 51 +84 4 91 0 69 +49 80 35 67 20 +98 48 64 38 30 +25 83 45 97 42 + +18 5 84 94 50 +36 47 2 52 65 +39 77 83 37 80 +51 88 15 12 31 +87 17 68 48 67 + +39 95 30 8 86 +45 57 40 51 60 +85 88 33 93 25 +76 52 37 68 6 +11 80 69 19 71 + +6 71 25 66 54 +33 17 98 63 20 +27 14 44 43 18 +68 10 50 35 65 +61 3 83 12 13 + +46 21 43 15 19 +99 82 8 95 80 +1 10 45 58 53 +23 94 50 66 52 +57 98 26 77 90 + +11 50 55 28 79 +4 3 26 57 56 +68 86 10 87 69 +32 35 89 63 29 +66 27 33 8 30 + +23 34 94 93 47 +7 71 9 52 50 +45 79 13 43 86 +0 51 17 6 26 +4 82 44 38 37 + +49 24 16 64 32 +46 84 3 29 51 +71 82 33 61 26 +15 5 94 86 41 +63 36 10 67 43 + +94 17 3 71 91 +93 50 88 36 27 +54 68 7 8 34 +9 92 37 45 52 +47 29 70 10 69 + +79 27 30 0 12 +51 70 19 89 20 +2 42 64 21 49 +48 39 1 3 56 +98 35 95 82 72 + +91 71 65 95 44 +26 72 92 59 43 +61 93 6 4 90 +76 31 8 1 29 +82 64 89 22 45 + +55 4 1 42 87 +88 34 67 83 45 +22 23 98 24 12 +74 72 49 32 25 +73 7 19 26 3 + +0 43 50 57 80 +68 21 87 1 91 +60 6 81 78 99 +35 98 72 49 16 +36 25 13 48 22 + +59 1 26 3 71 +43 55 50 7 16 +5 64 29 38 84 +41 23 60 19 24 +85 58 49 98 33 + +80 48 3 65 38 +30 97 96 45 7 +6 85 8 90 40 +37 78 84 16 24 +69 11 43 64 63 + +28 14 19 1 97 +37 39 86 23 64 +20 67 85 65 90 +54 51 59 91 43 +17 30 11 24 7 + +22 88 27 43 10 +35 3 72 52 57 +61 54 28 69 37 +71 78 96 82 81 +33 39 32 40 7 + +50 60 69 33 57 +84 22 95 74 6 +90 94 71 45 68 +72 86 77 9 24 +73 12 89 13 1 + +66 35 36 87 73 +77 96 52 47 68 +63 4 83 20 95 +17 70 9 18 50 +98 40 25 60 26 + +31 37 81 34 56 +3 15 43 51 35 +67 70 1 20 12 +80 54 69 17 88 +65 91 60 8 53 + +76 23 87 41 18 +49 58 92 98 25 +77 53 44 17 27 +67 28 37 66 95 +59 39 33 4 34 + +0 25 2 5 22 +26 85 90 51 21 +31 79 10 41 45 +69 56 1 67 40 +59 98 99 89 6 + +95 67 72 52 78 +88 61 96 11 43 +34 73 53 54 8 +71 3 70 42 58 +12 82 97 68 98 + +20 10 13 74 89 +82 25 45 92 61 +58 62 0 22 57 +68 90 36 18 75 +48 39 69 4 52 + +40 3 86 33 98 +30 67 39 7 69 +80 64 77 54 51 +24 49 6 68 61 +62 94 1 26 50 + +89 88 7 21 87 +83 10 78 27 97 +35 62 86 13 38 +28 80 19 36 75 +98 93 47 33 57 + +22 88 35 79 85 +98 96 89 69 17 +37 62 57 39 1 +99 10 55 50 71 +65 94 67 4 63 + +7 83 51 95 98 +56 93 62 85 9 +72 14 44 70 67 +42 4 65 37 54 +47 82 1 60 55 + +0 73 60 25 64 +90 11 93 85 89 +80 97 86 76 96 +43 92 88 72 44 +62 87 81 34 49 + +47 27 89 98 68 +86 76 14 96 17 +21 4 41 74 29 +18 82 33 34 20 +30 62 95 42 51 + +45 4 70 20 53 +66 39 43 82 1 +54 30 68 77 42 +61 41 65 94 35 +25 78 22 26 46 + +70 73 44 48 61 +69 7 85 47 89 +91 22 12 98 11 +25 60 58 46 54 +5 37 83 62 65 + +47 62 30 70 40 +86 9 64 61 0 +27 63 90 88 17 +18 71 42 33 93 +91 14 81 4 31 + +81 7 22 94 55 +99 90 60 9 46 +65 2 47 1 73 +78 76 75 19 88 +63 51 86 56 49 + +25 27 12 22 30 +87 75 16 4 32 +19 73 5 20 52 +18 6 34 94 31 +23 96 84 26 66 + +23 69 51 35 5 +13 76 99 89 82 +88 3 50 54 33 +19 59 92 84 34 +64 80 42 40 60 + +15 91 92 60 36 +46 40 53 34 27 +13 35 96 16 42 +4 61 81 56 24 +85 21 7 99 20 + +32 37 19 21 28 +66 7 96 46 88 +23 52 25 50 22 +53 62 34 81 27 +98 31 14 40 49 + +23 43 71 61 12 +8 94 91 74 7 +67 2 59 77 4 +39 18 97 41 21 +55 15 31 9 38 + +29 69 52 16 75 +71 15 34 79 86 +62 57 48 44 54 +11 32 96 13 60 +56 77 26 68 82 + +93 57 21 94 31 +29 4 59 24 40 +13 99 34 96 91 +70 55 47 62 51 +33 32 19 69 71 + +76 80 1 57 20 +13 28 72 27 79 +40 21 71 37 85 +26 12 67 33 99 +11 41 62 18 64 + +23 22 92 69 86 +38 79 47 56 83 +74 46 1 95 24 +93 71 28 54 52 +94 51 33 57 73 + +17 96 4 81 76 +67 20 24 21 70 +28 77 3 74 10 +45 78 18 7 15 +8 48 27 58 13 + +51 58 59 73 35 +13 7 92 15 98 +75 26 1 49 24 +91 85 44 34 74 +64 2 20 72 90 + +46 89 50 54 79 +9 60 98 36 78 +91 16 80 92 20 +77 69 13 76 75 +95 41 45 3 40 + +86 7 67 20 99 +14 18 97 70 0 +81 27 89 30 3 +39 37 56 42 32 +35 71 49 8 73 + +60 67 61 6 86 +25 41 24 29 88 +98 3 90 56 87 +45 22 84 70 99 +53 59 27 26 57 + +17 4 11 41 66 +28 39 27 54 89 +3 78 37 93 29 +95 23 86 51 40 +75 67 71 57 92 + +60 41 91 89 52 +68 46 83 62 1 +18 21 72 19 35 +55 34 11 16 75 +32 71 61 78 50 + +27 38 70 48 93 +16 2 80 17 63 +97 89 55 86 85 +54 5 41 33 60 +51 95 12 67 37 + +72 17 74 6 41 +53 19 8 12 92 +39 84 82 63 48 +22 21 87 13 32 +40 34 64 15 31 + +75 2 46 64 99 +26 72 79 90 76 +85 68 10 28 67 +20 34 81 12 83 +92 1 65 43 71 + +49 80 85 54 9 +31 40 22 94 51 +12 73 43 68 98 +78 91 70 3 28 +47 59 69 99 62 + +46 56 28 73 20 +5 29 69 68 22 +64 12 8 52 92 +36 44 90 72 0 +76 48 33 86 66 + +99 61 97 17 74 +32 52 44 42 9 +57 67 36 41 31 +68 1 50 22 11 +73 12 21 48 62 + +44 53 77 88 87 +27 99 59 98 74 +33 66 51 14 34 +29 30 60 49 80 +47 84 36 12 71 + +29 89 54 59 70 +87 65 77 38 25 +40 17 41 9 30 +45 27 0 5 24 +52 8 35 68 10 + +16 41 66 87 76 +94 70 51 48 96 +90 73 98 89 91 +4 46 30 28 63 +68 45 37 80 57 + +19 11 46 41 14 +94 48 66 86 9 +42 90 56 70 21 +95 54 74 30 87 +81 89 49 60 34 + +18 90 79 64 98 +27 74 59 53 11 +96 45 17 14 23 +9 60 30 42 12 +97 21 31 5 41 + +98 63 51 92 64 +55 30 46 22 91 +8 73 61 57 67 +37 60 49 31 10 +80 99 77 11 82 + +52 69 77 41 8 +94 11 78 62 28 +91 39 96 79 3 +44 88 37 0 47 +6 80 49 98 48 + +93 2 70 26 4 +47 8 94 12 3 +10 7 24 40 23 +49 84 50 56 44 +41 53 96 1 85 + +76 78 70 24 75 +71 19 85 77 25 +21 44 58 45 64 +40 38 9 50 61 +79 42 86 37 6 + +34 39 94 84 0 +90 80 78 54 49 +13 81 87 60 56 +74 59 75 41 28 +29 67 66 44 20 + +50 66 43 39 16 +88 94 60 70 64 +63 80 56 69 36 +53 48 32 22 79 +59 77 20 30 67 + +70 56 80 12 11 +35 55 40 71 87 +84 27 96 46 85 +20 23 26 29 14 +58 37 21 75 68 + +78 23 13 37 94 +65 44 54 43 38 +29 60 83 1 57 +98 2 75 12 14 +92 25 48 9 52 + +64 37 93 48 34 +22 81 58 5 13 +63 80 2 67 53 +62 52 79 41 44 +83 75 96 91 88 + +1 54 88 45 90 +81 78 19 8 40 +17 74 69 87 33 +9 64 85 50 71 +92 38 65 82 41 + +2 62 96 60 81 +51 1 34 48 25 +78 13 74 65 42 +46 64 57 19 72 +85 88 53 68 76 + +57 95 40 92 27 +65 37 42 90 9 +17 72 78 43 45 +87 28 48 81 79 +7 4 24 67 70 diff --git a/2021/d04/ex2/ex2.py b/2021/d04/ex2/ex2.py new file mode 100755 index 0000000..9928698 --- /dev/null +++ b/2021/d04/ex2/ex2.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List, Tuple + +Board = List[List[int]] + + +def solve(input: List[str]) -> int: + def parse_input() -> Tuple[List[int], List[Board]]: + def listify(line: str, delim: str = " ") -> List[int]: + return [int(n) for n in line.split(delim) if n != ""] + + draw_order = listify(input[0], delim=",") + boards: List[Board] = [] + for l in input[1:]: + if l == "": + boards.append([]) + continue + boards[-1].append(listify(l)) + + return draw_order, boards + + def bingo(board: Board, draw: List[int]) -> bool: + assert len(board) == len(board[0]) + + def line(l: int) -> bool: + return all(n in draw for n in board[l]) + + def row(r: int) -> bool: + return all(board[i][r] in draw for i in range(len(board))) + + lines = [line(i) for i in range(len(board))] + rows = [row(i) for i in range(len(board[0]))] + + return any(itertools.chain(lines, rows)) + + draw_order, boards = parse_input() + + draw = [] + losers = set(range(len(boards))) + + for d in draw_order: + draw.append(d) + for i, b in enumerate(boards): + # Stop early if we already know this board wins + if i not in losers: + continue + if not bingo(b, draw): + continue + # Discard winners until the last one + if len(losers) != 1: + losers.discard(i) + continue + # At thid point, we must be looking at the last winning board + return d * sum(n for n in itertools.chain.from_iterable(b) if n not in draw) + + # Sanity check + assert False + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d04/ex2/input b/2021/d04/ex2/input new file mode 100644 index 0000000..dc5dffc --- /dev/null +++ b/2021/d04/ex2/input @@ -0,0 +1,601 @@ +85,84,30,15,46,71,64,45,13,90,63,89,62,25,87,68,73,47,65,78,2,27,67,95,88,99,96,17,42,31,91,98,57,28,38,93,43,0,55,49,22,24,82,54,59,52,3,26,9,32,4,48,39,50,80,21,5,1,23,10,58,34,12,35,74,8,6,79,40,76,86,69,81,61,14,92,97,19,7,51,33,11,77,75,20,70,29,36,60,18,56,37,72,41,94,44,83,66,16,53 + +78 13 8 62 67 +42 89 97 16 65 +5 12 73 50 56 +45 10 63 41 64 +49 1 95 71 17 + +60 25 66 82 22 +94 45 68 5 12 +46 44 48 31 34 +10 56 37 96 81 +99 39 84 32 6 + +11 86 77 36 2 +57 68 27 74 4 +81 92 49 37 51 +78 43 94 46 63 +13 52 72 17 44 + +88 13 81 21 20 +80 99 23 37 53 +44 68 15 38 55 +84 48 82 97 6 +4 43 52 72 31 + +39 62 45 86 44 +12 17 16 7 6 +84 42 82 34 85 +19 77 9 48 98 +21 99 67 26 69 + +1 75 50 5 44 +3 28 62 17 43 +14 52 64 77 81 +32 89 7 11 70 +38 36 71 45 58 + +53 32 35 69 63 +6 21 75 64 96 +10 89 15 48 26 +23 20 43 57 33 +18 49 51 47 74 + +20 79 9 74 13 +52 28 77 26 43 +57 83 4 25 70 +90 1 30 53 38 +56 66 82 35 51 + +12 3 31 93 8 +20 27 51 78 9 +29 46 82 85 75 +15 76 91 70 63 +59 39 13 43 79 + +46 35 15 13 2 +65 69 97 77 87 +64 59 94 88 40 +34 79 92 93 58 +47 28 74 82 29 + +32 38 24 68 12 +8 78 79 89 43 +67 54 6 98 48 +1 14 83 15 37 +44 10 97 74 33 + +9 95 2 99 1 +8 42 60 56 40 +32 11 71 14 80 +77 6 68 46 48 +98 70 39 44 62 + +43 94 41 13 15 +96 99 35 27 8 +22 75 73 17 90 +62 23 5 88 3 +10 52 61 60 57 + +31 62 74 3 79 +15 49 60 28 71 +66 2 11 36 41 +34 80 33 94 75 +64 56 84 70 16 + +98 94 68 32 26 +61 7 52 66 18 +40 20 82 81 74 +28 36 89 14 35 +71 11 44 13 72 + +81 30 6 86 37 +46 45 64 83 62 +7 70 38 51 15 +91 41 26 40 4 +87 0 82 74 60 + +83 99 26 69 1 +6 98 53 31 43 +82 64 42 90 34 +87 62 11 40 39 +77 51 2 30 97 + +96 5 24 44 32 +48 92 78 74 76 +99 33 93 97 49 +45 8 88 66 59 +52 64 29 60 82 + +69 23 59 96 71 +14 93 21 44 62 +65 84 2 39 1 +0 68 38 81 4 +48 31 26 60 34 + +24 46 44 52 98 +65 23 31 89 5 +34 79 75 96 41 +76 28 90 12 11 +68 29 38 70 50 + +51 0 45 23 20 +44 49 12 31 7 +41 26 46 75 92 +90 30 72 95 55 +87 57 10 99 40 + +25 67 80 74 44 +3 82 27 81 11 +33 42 97 57 70 +19 94 0 2 49 +6 90 60 29 58 + +79 59 96 68 14 +38 70 65 66 69 +36 75 20 18 29 +64 88 35 61 43 +57 76 62 23 25 + +60 9 81 94 62 +73 20 87 72 14 +95 63 42 51 13 +75 83 32 30 66 +97 6 80 82 17 + +3 88 31 43 68 +20 78 47 10 91 +14 42 40 74 39 +5 32 16 97 1 +9 33 49 70 36 + +77 31 65 27 52 +49 74 57 25 66 +24 4 39 33 1 +23 14 19 2 21 +80 71 29 81 91 + +32 68 47 3 88 +1 97 99 28 80 +2 25 18 31 51 +26 10 73 34 40 +8 55 45 36 37 + +79 81 33 94 51 +84 4 91 0 69 +49 80 35 67 20 +98 48 64 38 30 +25 83 45 97 42 + +18 5 84 94 50 +36 47 2 52 65 +39 77 83 37 80 +51 88 15 12 31 +87 17 68 48 67 + +39 95 30 8 86 +45 57 40 51 60 +85 88 33 93 25 +76 52 37 68 6 +11 80 69 19 71 + +6 71 25 66 54 +33 17 98 63 20 +27 14 44 43 18 +68 10 50 35 65 +61 3 83 12 13 + +46 21 43 15 19 +99 82 8 95 80 +1 10 45 58 53 +23 94 50 66 52 +57 98 26 77 90 + +11 50 55 28 79 +4 3 26 57 56 +68 86 10 87 69 +32 35 89 63 29 +66 27 33 8 30 + +23 34 94 93 47 +7 71 9 52 50 +45 79 13 43 86 +0 51 17 6 26 +4 82 44 38 37 + +49 24 16 64 32 +46 84 3 29 51 +71 82 33 61 26 +15 5 94 86 41 +63 36 10 67 43 + +94 17 3 71 91 +93 50 88 36 27 +54 68 7 8 34 +9 92 37 45 52 +47 29 70 10 69 + +79 27 30 0 12 +51 70 19 89 20 +2 42 64 21 49 +48 39 1 3 56 +98 35 95 82 72 + +91 71 65 95 44 +26 72 92 59 43 +61 93 6 4 90 +76 31 8 1 29 +82 64 89 22 45 + +55 4 1 42 87 +88 34 67 83 45 +22 23 98 24 12 +74 72 49 32 25 +73 7 19 26 3 + +0 43 50 57 80 +68 21 87 1 91 +60 6 81 78 99 +35 98 72 49 16 +36 25 13 48 22 + +59 1 26 3 71 +43 55 50 7 16 +5 64 29 38 84 +41 23 60 19 24 +85 58 49 98 33 + +80 48 3 65 38 +30 97 96 45 7 +6 85 8 90 40 +37 78 84 16 24 +69 11 43 64 63 + +28 14 19 1 97 +37 39 86 23 64 +20 67 85 65 90 +54 51 59 91 43 +17 30 11 24 7 + +22 88 27 43 10 +35 3 72 52 57 +61 54 28 69 37 +71 78 96 82 81 +33 39 32 40 7 + +50 60 69 33 57 +84 22 95 74 6 +90 94 71 45 68 +72 86 77 9 24 +73 12 89 13 1 + +66 35 36 87 73 +77 96 52 47 68 +63 4 83 20 95 +17 70 9 18 50 +98 40 25 60 26 + +31 37 81 34 56 +3 15 43 51 35 +67 70 1 20 12 +80 54 69 17 88 +65 91 60 8 53 + +76 23 87 41 18 +49 58 92 98 25 +77 53 44 17 27 +67 28 37 66 95 +59 39 33 4 34 + +0 25 2 5 22 +26 85 90 51 21 +31 79 10 41 45 +69 56 1 67 40 +59 98 99 89 6 + +95 67 72 52 78 +88 61 96 11 43 +34 73 53 54 8 +71 3 70 42 58 +12 82 97 68 98 + +20 10 13 74 89 +82 25 45 92 61 +58 62 0 22 57 +68 90 36 18 75 +48 39 69 4 52 + +40 3 86 33 98 +30 67 39 7 69 +80 64 77 54 51 +24 49 6 68 61 +62 94 1 26 50 + +89 88 7 21 87 +83 10 78 27 97 +35 62 86 13 38 +28 80 19 36 75 +98 93 47 33 57 + +22 88 35 79 85 +98 96 89 69 17 +37 62 57 39 1 +99 10 55 50 71 +65 94 67 4 63 + +7 83 51 95 98 +56 93 62 85 9 +72 14 44 70 67 +42 4 65 37 54 +47 82 1 60 55 + +0 73 60 25 64 +90 11 93 85 89 +80 97 86 76 96 +43 92 88 72 44 +62 87 81 34 49 + +47 27 89 98 68 +86 76 14 96 17 +21 4 41 74 29 +18 82 33 34 20 +30 62 95 42 51 + +45 4 70 20 53 +66 39 43 82 1 +54 30 68 77 42 +61 41 65 94 35 +25 78 22 26 46 + +70 73 44 48 61 +69 7 85 47 89 +91 22 12 98 11 +25 60 58 46 54 +5 37 83 62 65 + +47 62 30 70 40 +86 9 64 61 0 +27 63 90 88 17 +18 71 42 33 93 +91 14 81 4 31 + +81 7 22 94 55 +99 90 60 9 46 +65 2 47 1 73 +78 76 75 19 88 +63 51 86 56 49 + +25 27 12 22 30 +87 75 16 4 32 +19 73 5 20 52 +18 6 34 94 31 +23 96 84 26 66 + +23 69 51 35 5 +13 76 99 89 82 +88 3 50 54 33 +19 59 92 84 34 +64 80 42 40 60 + +15 91 92 60 36 +46 40 53 34 27 +13 35 96 16 42 +4 61 81 56 24 +85 21 7 99 20 + +32 37 19 21 28 +66 7 96 46 88 +23 52 25 50 22 +53 62 34 81 27 +98 31 14 40 49 + +23 43 71 61 12 +8 94 91 74 7 +67 2 59 77 4 +39 18 97 41 21 +55 15 31 9 38 + +29 69 52 16 75 +71 15 34 79 86 +62 57 48 44 54 +11 32 96 13 60 +56 77 26 68 82 + +93 57 21 94 31 +29 4 59 24 40 +13 99 34 96 91 +70 55 47 62 51 +33 32 19 69 71 + +76 80 1 57 20 +13 28 72 27 79 +40 21 71 37 85 +26 12 67 33 99 +11 41 62 18 64 + +23 22 92 69 86 +38 79 47 56 83 +74 46 1 95 24 +93 71 28 54 52 +94 51 33 57 73 + +17 96 4 81 76 +67 20 24 21 70 +28 77 3 74 10 +45 78 18 7 15 +8 48 27 58 13 + +51 58 59 73 35 +13 7 92 15 98 +75 26 1 49 24 +91 85 44 34 74 +64 2 20 72 90 + +46 89 50 54 79 +9 60 98 36 78 +91 16 80 92 20 +77 69 13 76 75 +95 41 45 3 40 + +86 7 67 20 99 +14 18 97 70 0 +81 27 89 30 3 +39 37 56 42 32 +35 71 49 8 73 + +60 67 61 6 86 +25 41 24 29 88 +98 3 90 56 87 +45 22 84 70 99 +53 59 27 26 57 + +17 4 11 41 66 +28 39 27 54 89 +3 78 37 93 29 +95 23 86 51 40 +75 67 71 57 92 + +60 41 91 89 52 +68 46 83 62 1 +18 21 72 19 35 +55 34 11 16 75 +32 71 61 78 50 + +27 38 70 48 93 +16 2 80 17 63 +97 89 55 86 85 +54 5 41 33 60 +51 95 12 67 37 + +72 17 74 6 41 +53 19 8 12 92 +39 84 82 63 48 +22 21 87 13 32 +40 34 64 15 31 + +75 2 46 64 99 +26 72 79 90 76 +85 68 10 28 67 +20 34 81 12 83 +92 1 65 43 71 + +49 80 85 54 9 +31 40 22 94 51 +12 73 43 68 98 +78 91 70 3 28 +47 59 69 99 62 + +46 56 28 73 20 +5 29 69 68 22 +64 12 8 52 92 +36 44 90 72 0 +76 48 33 86 66 + +99 61 97 17 74 +32 52 44 42 9 +57 67 36 41 31 +68 1 50 22 11 +73 12 21 48 62 + +44 53 77 88 87 +27 99 59 98 74 +33 66 51 14 34 +29 30 60 49 80 +47 84 36 12 71 + +29 89 54 59 70 +87 65 77 38 25 +40 17 41 9 30 +45 27 0 5 24 +52 8 35 68 10 + +16 41 66 87 76 +94 70 51 48 96 +90 73 98 89 91 +4 46 30 28 63 +68 45 37 80 57 + +19 11 46 41 14 +94 48 66 86 9 +42 90 56 70 21 +95 54 74 30 87 +81 89 49 60 34 + +18 90 79 64 98 +27 74 59 53 11 +96 45 17 14 23 +9 60 30 42 12 +97 21 31 5 41 + +98 63 51 92 64 +55 30 46 22 91 +8 73 61 57 67 +37 60 49 31 10 +80 99 77 11 82 + +52 69 77 41 8 +94 11 78 62 28 +91 39 96 79 3 +44 88 37 0 47 +6 80 49 98 48 + +93 2 70 26 4 +47 8 94 12 3 +10 7 24 40 23 +49 84 50 56 44 +41 53 96 1 85 + +76 78 70 24 75 +71 19 85 77 25 +21 44 58 45 64 +40 38 9 50 61 +79 42 86 37 6 + +34 39 94 84 0 +90 80 78 54 49 +13 81 87 60 56 +74 59 75 41 28 +29 67 66 44 20 + +50 66 43 39 16 +88 94 60 70 64 +63 80 56 69 36 +53 48 32 22 79 +59 77 20 30 67 + +70 56 80 12 11 +35 55 40 71 87 +84 27 96 46 85 +20 23 26 29 14 +58 37 21 75 68 + +78 23 13 37 94 +65 44 54 43 38 +29 60 83 1 57 +98 2 75 12 14 +92 25 48 9 52 + +64 37 93 48 34 +22 81 58 5 13 +63 80 2 67 53 +62 52 79 41 44 +83 75 96 91 88 + +1 54 88 45 90 +81 78 19 8 40 +17 74 69 87 33 +9 64 85 50 71 +92 38 65 82 41 + +2 62 96 60 81 +51 1 34 48 25 +78 13 74 65 42 +46 64 57 19 72 +85 88 53 68 76 + +57 95 40 92 27 +65 37 42 90 9 +17 72 78 43 45 +87 28 48 81 79 +7 4 24 67 70 diff --git a/2021/d05/ex1/ex1.py b/2021/d05/ex1/ex1.py new file mode 100755 index 0000000..1281378 --- /dev/null +++ b/2021/d05/ex1/ex1.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from dataclasses import dataclass +from typing import Iterable, List, Tuple + + +@dataclass +class Point: + x: int + y: int + + +Line = Tuple[Point, Point] + + +def solve(input: List[str]) -> int: + def parse_line(line: str) -> Line: + def parse_point(point: str) -> Point: + x, y = map(int, point.split(",")) + return Point(x, y) + + p1, p2 = map(parse_point, line.split(" -> ")) + return (p1, p2) + + def is_of_interest(line: Line) -> bool: + p1, p2 = line + return p1.x == p2.x or p1.y == p2.y + + def line_to_points(line: Line) -> Iterable[Point]: + def inclusive_range_any_order(a: int, b: int) -> Iterable[int]: + if a < b: + yield from range(a, b + 1) + else: + yield from range(a, b - 1, -1) + + p1, p2 = line + + if p1.x == p2.x: + for y in inclusive_range_any_order(p1.y, p2.y): + yield (p1.x, y) + return + + if p1.y == p2.y: + for x in inclusive_range_any_order(p1.x, p2.x): + yield (x, p1.y) + return + + assert False # Sanity check + + lines = list(filter(is_of_interest, map(parse_line, input))) + counts = Counter(itertools.chain.from_iterable(line_to_points(l) for l in lines)) + + return sum(counts[p] > 1 for p in counts) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d05/ex1/input b/2021/d05/ex1/input new file mode 100644 index 0000000..abdeeb9 --- /dev/null +++ b/2021/d05/ex1/input @@ -0,0 +1,500 @@ +284,294 -> 733,743 +625,347 -> 653,375 +561,848 -> 561,181 +836,102 -> 836,339 +946,941 -> 22,17 +18,954 -> 956,16 +370,142 -> 370,700 +990,966 -> 677,966 +366,603 -> 366,465 +728,942 -> 57,271 +615,493 -> 847,493 +584,281 -> 301,281 +125,356 -> 301,180 +941,569 -> 555,183 +151,116 -> 509,116 +41,18 -> 841,818 +627,670 -> 627,630 +965,472 -> 965,100 +93,404 -> 330,641 +475,963 -> 475,514 +389,389 -> 389,326 +842,565 -> 842,576 +454,700 -> 650,700 +73,810 -> 73,319 +450,212 -> 450,284 +316,392 -> 316,697 +915,592 -> 578,592 +622,485 -> 434,485 +109,853 -> 952,10 +305,73 -> 305,222 +27,489 -> 157,489 +191,979 -> 867,979 +527,329 -> 527,292 +301,645 -> 301,162 +639,730 -> 176,730 +46,964 -> 46,458 +727,422 -> 435,714 +28,552 -> 404,552 +33,108 -> 33,21 +227,249 -> 327,249 +414,903 -> 784,903 +69,422 -> 888,422 +422,924 -> 103,605 +793,353 -> 450,10 +714,682 -> 714,972 +201,745 -> 410,745 +408,713 -> 408,847 +174,842 -> 818,198 +863,353 -> 775,353 +199,780 -> 670,780 +877,947 -> 340,410 +163,202 -> 163,91 +955,919 -> 955,585 +836,271 -> 533,271 +258,366 -> 728,836 +582,749 -> 582,12 +80,40 -> 80,704 +287,213 -> 287,635 +390,546 -> 390,194 +837,511 -> 538,810 +473,281 -> 902,281 +851,865 -> 731,745 +918,59 -> 445,532 +796,215 -> 796,248 +875,111 -> 604,111 +660,805 -> 538,805 +507,850 -> 145,850 +585,861 -> 585,52 +426,74 -> 700,348 +206,405 -> 529,405 +418,333 -> 418,17 +368,457 -> 33,792 +186,81 -> 957,852 +505,283 -> 113,283 +20,878 -> 462,878 +750,237 -> 69,918 +15,280 -> 358,623 +798,981 -> 500,683 +965,970 -> 22,970 +950,970 -> 148,970 +660,392 -> 660,884 +862,405 -> 862,527 +801,283 -> 801,361 +71,837 -> 136,837 +651,438 -> 945,144 +524,607 -> 614,517 +348,955 -> 138,955 +957,164 -> 404,717 +531,581 -> 454,504 +710,185 -> 710,271 +822,86 -> 822,966 +745,233 -> 490,488 +350,823 -> 663,823 +824,67 -> 447,444 +846,667 -> 796,617 +666,24 -> 666,906 +640,39 -> 640,145 +654,481 -> 985,481 +581,894 -> 416,729 +443,11 -> 697,11 +318,627 -> 799,146 +113,78 -> 891,856 +181,149 -> 179,151 +451,74 -> 451,262 +458,726 -> 314,726 +218,662 -> 533,662 +965,108 -> 527,108 +782,481 -> 896,367 +557,927 -> 557,938 +506,242 -> 941,677 +948,778 -> 948,629 +567,816 -> 567,956 +323,773 -> 323,364 +864,980 -> 864,12 +611,699 -> 611,886 +613,392 -> 901,104 +528,905 -> 156,905 +632,206 -> 798,40 +338,237 -> 919,818 +256,889 -> 11,644 +835,52 -> 55,832 +464,144 -> 322,144 +254,747 -> 254,509 +866,892 -> 866,916 +827,946 -> 30,149 +899,84 -> 177,806 +134,634 -> 357,634 +781,492 -> 244,492 +817,762 -> 817,976 +818,749 -> 818,860 +262,480 -> 263,480 +409,576 -> 409,698 +242,151 -> 981,890 +149,519 -> 149,557 +42,990 -> 42,930 +687,974 -> 50,337 +758,382 -> 465,382 +760,861 -> 760,934 +17,835 -> 17,915 +645,923 -> 645,648 +702,116 -> 72,746 +153,162 -> 955,964 +185,101 -> 918,834 +554,179 -> 554,353 +879,673 -> 879,949 +368,13 -> 368,512 +582,105 -> 591,114 +146,291 -> 600,745 +609,538 -> 930,538 +320,604 -> 320,146 +566,698 -> 443,575 +167,708 -> 844,31 +712,630 -> 712,421 +912,930 -> 64,82 +980,931 -> 87,38 +23,893 -> 888,28 +640,435 -> 676,435 +701,516 -> 190,516 +684,145 -> 62,767 +127,471 -> 91,435 +685,197 -> 78,197 +103,493 -> 103,522 +309,986 -> 309,850 +938,270 -> 938,300 +295,72 -> 354,72 +948,889 -> 948,455 +254,733 -> 254,175 +95,329 -> 942,329 +19,672 -> 19,445 +206,807 -> 206,934 +886,961 -> 886,690 +117,386 -> 117,292 +199,59 -> 668,528 +299,263 -> 299,878 +28,295 -> 638,905 +10,140 -> 276,406 +279,526 -> 921,526 +485,128 -> 856,499 +418,398 -> 186,398 +296,577 -> 296,521 +514,261 -> 10,765 +691,673 -> 776,758 +131,430 -> 152,430 +858,85 -> 62,85 +394,846 -> 270,970 +827,913 -> 827,376 +634,669 -> 910,669 +12,53 -> 945,986 +782,467 -> 782,421 +159,832 -> 109,832 +793,807 -> 79,93 +120,584 -> 356,584 +645,16 -> 645,355 +526,685 -> 217,376 +296,305 -> 296,929 +954,144 -> 954,839 +748,88 -> 103,733 +523,804 -> 473,754 +524,316 -> 524,756 +696,183 -> 912,183 +288,564 -> 55,797 +568,103 -> 568,348 +468,626 -> 682,412 +163,163 -> 961,961 +762,824 -> 27,89 +623,625 -> 32,34 +865,343 -> 490,718 +259,458 -> 259,33 +944,660 -> 944,176 +781,804 -> 826,759 +15,702 -> 15,553 +403,310 -> 918,825 +438,734 -> 835,734 +825,13 -> 825,245 +129,611 -> 370,611 +49,939 -> 172,939 +687,906 -> 687,532 +629,482 -> 273,126 +727,218 -> 424,218 +447,451 -> 233,451 +142,779 -> 813,779 +527,27 -> 527,804 +482,55 -> 482,200 +39,264 -> 806,264 +884,636 -> 458,636 +467,121 -> 199,389 +856,925 -> 856,666 +666,359 -> 378,359 +11,946 -> 705,946 +491,281 -> 940,730 +86,112 -> 918,944 +974,807 -> 974,707 +445,67 -> 914,536 +953,394 -> 953,822 +468,398 -> 157,87 +231,620 -> 231,646 +979,869 -> 979,911 +450,330 -> 450,79 +675,659 -> 617,659 +66,181 -> 66,723 +181,406 -> 181,192 +908,334 -> 908,526 +254,891 -> 282,891 +777,791 -> 127,141 +469,58 -> 694,58 +954,957 -> 566,569 +957,957 -> 123,123 +741,359 -> 741,986 +763,526 -> 763,101 +857,427 -> 600,170 +527,756 -> 490,719 +625,249 -> 397,249 +798,702 -> 712,702 +868,75 -> 868,853 +332,296 -> 332,629 +211,829 -> 100,940 +12,139 -> 12,218 +655,978 -> 655,242 +99,852 -> 855,96 +486,267 -> 486,855 +474,90 -> 474,244 +948,491 -> 186,491 +896,59 -> 278,677 +295,732 -> 629,732 +860,936 -> 860,556 +143,790 -> 143,26 +371,847 -> 395,847 +739,301 -> 739,44 +384,716 -> 748,716 +848,423 -> 848,923 +855,23 -> 218,660 +381,805 -> 381,438 +451,610 -> 91,610 +906,957 -> 191,957 +118,675 -> 169,675 +836,818 -> 95,818 +368,945 -> 825,488 +165,299 -> 899,299 +392,327 -> 926,861 +663,16 -> 131,548 +630,302 -> 888,302 +206,869 -> 206,331 +979,413 -> 979,204 +894,860 -> 62,28 +444,897 -> 962,379 +550,158 -> 550,885 +845,736 -> 811,736 +846,857 -> 12,857 +981,730 -> 981,154 +694,835 -> 88,835 +21,101 -> 21,385 +19,960 -> 964,15 +283,721 -> 450,721 +59,136 -> 758,835 +287,313 -> 719,313 +471,252 -> 849,630 +682,189 -> 168,189 +10,921 -> 774,157 +884,598 -> 884,540 +207,615 -> 207,443 +627,408 -> 67,408 +285,36 -> 285,792 +116,585 -> 254,585 +183,86 -> 183,702 +220,138 -> 868,138 +833,68 -> 286,615 +367,534 -> 766,534 +907,514 -> 621,228 +133,593 -> 133,581 +164,727 -> 768,123 +566,227 -> 566,555 +983,988 -> 105,110 +620,177 -> 620,821 +612,413 -> 612,176 +168,889 -> 168,210 +871,487 -> 559,175 +399,870 -> 761,870 +236,976 -> 582,630 +699,216 -> 699,887 +153,745 -> 790,745 +444,749 -> 444,257 +808,165 -> 939,165 +546,525 -> 95,976 +583,179 -> 373,389 +235,816 -> 840,816 +744,89 -> 832,89 +425,317 -> 465,357 +267,235 -> 114,82 +887,59 -> 572,374 +808,237 -> 808,626 +431,352 -> 400,383 +815,376 -> 815,905 +249,218 -> 989,958 +120,435 -> 357,198 +807,551 -> 490,234 +910,524 -> 910,725 +802,304 -> 447,659 +789,228 -> 678,339 +229,322 -> 52,322 +658,393 -> 506,393 +378,438 -> 378,569 +163,981 -> 473,671 +537,984 -> 935,586 +58,945 -> 966,37 +132,696 -> 565,263 +136,813 -> 136,284 +606,656 -> 298,348 +533,572 -> 673,712 +872,912 -> 301,341 +16,287 -> 16,613 +571,541 -> 980,950 +117,495 -> 35,495 +85,79 -> 682,676 +425,431 -> 117,739 +982,984 -> 10,12 +28,75 -> 431,478 +259,529 -> 259,436 +762,267 -> 170,859 +323,135 -> 929,741 +81,238 -> 561,718 +128,213 -> 876,961 +649,466 -> 649,540 +715,863 -> 119,863 +830,624 -> 794,660 +123,968 -> 977,114 +489,466 -> 489,811 +27,10 -> 980,963 +255,732 -> 255,484 +574,829 -> 431,829 +548,743 -> 22,217 +903,297 -> 903,763 +684,774 -> 64,154 +260,823 -> 683,823 +422,211 -> 422,826 +10,196 -> 988,196 +108,802 -> 15,802 +104,70 -> 104,452 +885,59 -> 885,36 +68,854 -> 68,774 +731,935 -> 731,718 +657,986 -> 617,986 +732,292 -> 732,32 +841,56 -> 841,83 +74,108 -> 862,896 +654,895 -> 323,895 +374,952 -> 374,217 +90,723 -> 750,63 +246,89 -> 911,754 +453,301 -> 755,301 +983,988 -> 23,28 +81,705 -> 133,757 +752,743 -> 752,397 +53,243 -> 449,639 +451,811 -> 451,187 +26,672 -> 26,699 +254,861 -> 943,861 +643,740 -> 643,966 +486,655 -> 149,318 +375,146 -> 375,973 +76,293 -> 103,293 +246,398 -> 246,248 +324,392 -> 595,121 +130,577 -> 131,577 +380,623 -> 549,454 +224,181 -> 985,942 +310,223 -> 310,594 +23,982 -> 23,738 +19,858 -> 832,858 +726,531 -> 726,578 +730,433 -> 196,433 +606,599 -> 242,599 +444,832 -> 444,238 +198,870 -> 47,870 +944,473 -> 795,473 +737,386 -> 178,945 +328,902 -> 328,644 +422,851 -> 567,851 +674,781 -> 215,781 +920,757 -> 302,757 +225,932 -> 640,517 +359,337 -> 791,337 +935,430 -> 935,262 +772,850 -> 280,358 +175,829 -> 175,451 +938,204 -> 234,908 +253,749 -> 308,749 +704,458 -> 468,458 +222,95 -> 743,616 +968,840 -> 123,840 +491,619 -> 491,889 +979,580 -> 979,459 +901,193 -> 171,923 +246,155 -> 246,680 +711,755 -> 247,755 +671,734 -> 475,734 +803,783 -> 129,109 +145,890 -> 920,115 +463,521 -> 463,700 +782,99 -> 782,311 +547,467 -> 630,467 +14,88 -> 795,869 +653,899 -> 653,90 +488,874 -> 488,570 +93,879 -> 645,327 +320,658 -> 40,938 +611,246 -> 611,22 +258,935 -> 258,829 +931,436 -> 931,263 +252,460 -> 252,461 +490,382 -> 965,382 +242,89 -> 242,617 +271,111 -> 595,435 +462,706 -> 242,486 +557,328 -> 747,328 +486,99 -> 486,333 +156,40 -> 488,372 +323,482 -> 138,297 +595,539 -> 812,756 +923,861 -> 377,315 +934,952 -> 256,274 +314,777 -> 314,12 +508,47 -> 508,144 +888,807 -> 701,807 +745,774 -> 878,907 +740,716 -> 740,215 +62,43 -> 62,12 +571,196 -> 454,196 +568,107 -> 408,107 +549,676 -> 404,676 +595,573 -> 595,970 +148,168 -> 193,123 +763,71 -> 759,71 +797,64 -> 307,64 +959,984 -> 32,57 +457,562 -> 634,562 +127,521 -> 601,47 +112,296 -> 112,120 +148,755 -> 451,755 +636,494 -> 870,494 +910,242 -> 945,277 +912,911 -> 912,892 +759,815 -> 759,314 +391,285 -> 391,959 +455,460 -> 182,460 +112,78 -> 112,385 +842,179 -> 842,592 +236,424 -> 421,424 +508,907 -> 30,907 +637,219 -> 34,822 +503,375 -> 503,205 +570,533 -> 626,533 +658,11 -> 658,94 +179,286 -> 326,433 +918,214 -> 200,932 +339,887 -> 81,887 +794,91 -> 50,835 +225,356 -> 225,261 +80,160 -> 80,335 +148,64 -> 847,763 +595,393 -> 941,393 diff --git a/2021/d05/ex2/ex2.py b/2021/d05/ex2/ex2.py new file mode 100755 index 0000000..9a63990 --- /dev/null +++ b/2021/d05/ex2/ex2.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from dataclasses import dataclass +from typing import Iterable, List, Tuple + + +@dataclass +class Point: + x: int + y: int + + +Line = Tuple[Point, Point] + + +def solve(input: List[str]) -> int: + def parse_line(line: str) -> Line: + def parse_point(point: str) -> Point: + x, y = map(int, point.split(",")) + return Point(x, y) + + p1, p2 = map(parse_point, line.split(" -> ")) + return (p1, p2) + + def line_to_points(line: Line) -> Iterable[Point]: + def inclusive_range_any_order(a: int, b: int) -> Iterable[int]: + if a < b: + yield from range(a, b + 1) + else: + yield from range(a, b - 1, -1) + + p1, p2 = line + + xs = inclusive_range_any_order(p1.x, p2.x) + ys = inclusive_range_any_order(p1.y, p2.y) + + if p1.x == p2.x: + xs = itertools.repeat(p1.x) + + if p1.y == p2.y: + ys = itertools.repeat(p1.y) + + yield from zip(xs, ys) + + lines = list(map(parse_line, input)) + counts = Counter(itertools.chain.from_iterable(line_to_points(l) for l in lines)) + + return sum(counts[p] > 1 for p in counts) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d05/ex2/input b/2021/d05/ex2/input new file mode 100644 index 0000000..abdeeb9 --- /dev/null +++ b/2021/d05/ex2/input @@ -0,0 +1,500 @@ +284,294 -> 733,743 +625,347 -> 653,375 +561,848 -> 561,181 +836,102 -> 836,339 +946,941 -> 22,17 +18,954 -> 956,16 +370,142 -> 370,700 +990,966 -> 677,966 +366,603 -> 366,465 +728,942 -> 57,271 +615,493 -> 847,493 +584,281 -> 301,281 +125,356 -> 301,180 +941,569 -> 555,183 +151,116 -> 509,116 +41,18 -> 841,818 +627,670 -> 627,630 +965,472 -> 965,100 +93,404 -> 330,641 +475,963 -> 475,514 +389,389 -> 389,326 +842,565 -> 842,576 +454,700 -> 650,700 +73,810 -> 73,319 +450,212 -> 450,284 +316,392 -> 316,697 +915,592 -> 578,592 +622,485 -> 434,485 +109,853 -> 952,10 +305,73 -> 305,222 +27,489 -> 157,489 +191,979 -> 867,979 +527,329 -> 527,292 +301,645 -> 301,162 +639,730 -> 176,730 +46,964 -> 46,458 +727,422 -> 435,714 +28,552 -> 404,552 +33,108 -> 33,21 +227,249 -> 327,249 +414,903 -> 784,903 +69,422 -> 888,422 +422,924 -> 103,605 +793,353 -> 450,10 +714,682 -> 714,972 +201,745 -> 410,745 +408,713 -> 408,847 +174,842 -> 818,198 +863,353 -> 775,353 +199,780 -> 670,780 +877,947 -> 340,410 +163,202 -> 163,91 +955,919 -> 955,585 +836,271 -> 533,271 +258,366 -> 728,836 +582,749 -> 582,12 +80,40 -> 80,704 +287,213 -> 287,635 +390,546 -> 390,194 +837,511 -> 538,810 +473,281 -> 902,281 +851,865 -> 731,745 +918,59 -> 445,532 +796,215 -> 796,248 +875,111 -> 604,111 +660,805 -> 538,805 +507,850 -> 145,850 +585,861 -> 585,52 +426,74 -> 700,348 +206,405 -> 529,405 +418,333 -> 418,17 +368,457 -> 33,792 +186,81 -> 957,852 +505,283 -> 113,283 +20,878 -> 462,878 +750,237 -> 69,918 +15,280 -> 358,623 +798,981 -> 500,683 +965,970 -> 22,970 +950,970 -> 148,970 +660,392 -> 660,884 +862,405 -> 862,527 +801,283 -> 801,361 +71,837 -> 136,837 +651,438 -> 945,144 +524,607 -> 614,517 +348,955 -> 138,955 +957,164 -> 404,717 +531,581 -> 454,504 +710,185 -> 710,271 +822,86 -> 822,966 +745,233 -> 490,488 +350,823 -> 663,823 +824,67 -> 447,444 +846,667 -> 796,617 +666,24 -> 666,906 +640,39 -> 640,145 +654,481 -> 985,481 +581,894 -> 416,729 +443,11 -> 697,11 +318,627 -> 799,146 +113,78 -> 891,856 +181,149 -> 179,151 +451,74 -> 451,262 +458,726 -> 314,726 +218,662 -> 533,662 +965,108 -> 527,108 +782,481 -> 896,367 +557,927 -> 557,938 +506,242 -> 941,677 +948,778 -> 948,629 +567,816 -> 567,956 +323,773 -> 323,364 +864,980 -> 864,12 +611,699 -> 611,886 +613,392 -> 901,104 +528,905 -> 156,905 +632,206 -> 798,40 +338,237 -> 919,818 +256,889 -> 11,644 +835,52 -> 55,832 +464,144 -> 322,144 +254,747 -> 254,509 +866,892 -> 866,916 +827,946 -> 30,149 +899,84 -> 177,806 +134,634 -> 357,634 +781,492 -> 244,492 +817,762 -> 817,976 +818,749 -> 818,860 +262,480 -> 263,480 +409,576 -> 409,698 +242,151 -> 981,890 +149,519 -> 149,557 +42,990 -> 42,930 +687,974 -> 50,337 +758,382 -> 465,382 +760,861 -> 760,934 +17,835 -> 17,915 +645,923 -> 645,648 +702,116 -> 72,746 +153,162 -> 955,964 +185,101 -> 918,834 +554,179 -> 554,353 +879,673 -> 879,949 +368,13 -> 368,512 +582,105 -> 591,114 +146,291 -> 600,745 +609,538 -> 930,538 +320,604 -> 320,146 +566,698 -> 443,575 +167,708 -> 844,31 +712,630 -> 712,421 +912,930 -> 64,82 +980,931 -> 87,38 +23,893 -> 888,28 +640,435 -> 676,435 +701,516 -> 190,516 +684,145 -> 62,767 +127,471 -> 91,435 +685,197 -> 78,197 +103,493 -> 103,522 +309,986 -> 309,850 +938,270 -> 938,300 +295,72 -> 354,72 +948,889 -> 948,455 +254,733 -> 254,175 +95,329 -> 942,329 +19,672 -> 19,445 +206,807 -> 206,934 +886,961 -> 886,690 +117,386 -> 117,292 +199,59 -> 668,528 +299,263 -> 299,878 +28,295 -> 638,905 +10,140 -> 276,406 +279,526 -> 921,526 +485,128 -> 856,499 +418,398 -> 186,398 +296,577 -> 296,521 +514,261 -> 10,765 +691,673 -> 776,758 +131,430 -> 152,430 +858,85 -> 62,85 +394,846 -> 270,970 +827,913 -> 827,376 +634,669 -> 910,669 +12,53 -> 945,986 +782,467 -> 782,421 +159,832 -> 109,832 +793,807 -> 79,93 +120,584 -> 356,584 +645,16 -> 645,355 +526,685 -> 217,376 +296,305 -> 296,929 +954,144 -> 954,839 +748,88 -> 103,733 +523,804 -> 473,754 +524,316 -> 524,756 +696,183 -> 912,183 +288,564 -> 55,797 +568,103 -> 568,348 +468,626 -> 682,412 +163,163 -> 961,961 +762,824 -> 27,89 +623,625 -> 32,34 +865,343 -> 490,718 +259,458 -> 259,33 +944,660 -> 944,176 +781,804 -> 826,759 +15,702 -> 15,553 +403,310 -> 918,825 +438,734 -> 835,734 +825,13 -> 825,245 +129,611 -> 370,611 +49,939 -> 172,939 +687,906 -> 687,532 +629,482 -> 273,126 +727,218 -> 424,218 +447,451 -> 233,451 +142,779 -> 813,779 +527,27 -> 527,804 +482,55 -> 482,200 +39,264 -> 806,264 +884,636 -> 458,636 +467,121 -> 199,389 +856,925 -> 856,666 +666,359 -> 378,359 +11,946 -> 705,946 +491,281 -> 940,730 +86,112 -> 918,944 +974,807 -> 974,707 +445,67 -> 914,536 +953,394 -> 953,822 +468,398 -> 157,87 +231,620 -> 231,646 +979,869 -> 979,911 +450,330 -> 450,79 +675,659 -> 617,659 +66,181 -> 66,723 +181,406 -> 181,192 +908,334 -> 908,526 +254,891 -> 282,891 +777,791 -> 127,141 +469,58 -> 694,58 +954,957 -> 566,569 +957,957 -> 123,123 +741,359 -> 741,986 +763,526 -> 763,101 +857,427 -> 600,170 +527,756 -> 490,719 +625,249 -> 397,249 +798,702 -> 712,702 +868,75 -> 868,853 +332,296 -> 332,629 +211,829 -> 100,940 +12,139 -> 12,218 +655,978 -> 655,242 +99,852 -> 855,96 +486,267 -> 486,855 +474,90 -> 474,244 +948,491 -> 186,491 +896,59 -> 278,677 +295,732 -> 629,732 +860,936 -> 860,556 +143,790 -> 143,26 +371,847 -> 395,847 +739,301 -> 739,44 +384,716 -> 748,716 +848,423 -> 848,923 +855,23 -> 218,660 +381,805 -> 381,438 +451,610 -> 91,610 +906,957 -> 191,957 +118,675 -> 169,675 +836,818 -> 95,818 +368,945 -> 825,488 +165,299 -> 899,299 +392,327 -> 926,861 +663,16 -> 131,548 +630,302 -> 888,302 +206,869 -> 206,331 +979,413 -> 979,204 +894,860 -> 62,28 +444,897 -> 962,379 +550,158 -> 550,885 +845,736 -> 811,736 +846,857 -> 12,857 +981,730 -> 981,154 +694,835 -> 88,835 +21,101 -> 21,385 +19,960 -> 964,15 +283,721 -> 450,721 +59,136 -> 758,835 +287,313 -> 719,313 +471,252 -> 849,630 +682,189 -> 168,189 +10,921 -> 774,157 +884,598 -> 884,540 +207,615 -> 207,443 +627,408 -> 67,408 +285,36 -> 285,792 +116,585 -> 254,585 +183,86 -> 183,702 +220,138 -> 868,138 +833,68 -> 286,615 +367,534 -> 766,534 +907,514 -> 621,228 +133,593 -> 133,581 +164,727 -> 768,123 +566,227 -> 566,555 +983,988 -> 105,110 +620,177 -> 620,821 +612,413 -> 612,176 +168,889 -> 168,210 +871,487 -> 559,175 +399,870 -> 761,870 +236,976 -> 582,630 +699,216 -> 699,887 +153,745 -> 790,745 +444,749 -> 444,257 +808,165 -> 939,165 +546,525 -> 95,976 +583,179 -> 373,389 +235,816 -> 840,816 +744,89 -> 832,89 +425,317 -> 465,357 +267,235 -> 114,82 +887,59 -> 572,374 +808,237 -> 808,626 +431,352 -> 400,383 +815,376 -> 815,905 +249,218 -> 989,958 +120,435 -> 357,198 +807,551 -> 490,234 +910,524 -> 910,725 +802,304 -> 447,659 +789,228 -> 678,339 +229,322 -> 52,322 +658,393 -> 506,393 +378,438 -> 378,569 +163,981 -> 473,671 +537,984 -> 935,586 +58,945 -> 966,37 +132,696 -> 565,263 +136,813 -> 136,284 +606,656 -> 298,348 +533,572 -> 673,712 +872,912 -> 301,341 +16,287 -> 16,613 +571,541 -> 980,950 +117,495 -> 35,495 +85,79 -> 682,676 +425,431 -> 117,739 +982,984 -> 10,12 +28,75 -> 431,478 +259,529 -> 259,436 +762,267 -> 170,859 +323,135 -> 929,741 +81,238 -> 561,718 +128,213 -> 876,961 +649,466 -> 649,540 +715,863 -> 119,863 +830,624 -> 794,660 +123,968 -> 977,114 +489,466 -> 489,811 +27,10 -> 980,963 +255,732 -> 255,484 +574,829 -> 431,829 +548,743 -> 22,217 +903,297 -> 903,763 +684,774 -> 64,154 +260,823 -> 683,823 +422,211 -> 422,826 +10,196 -> 988,196 +108,802 -> 15,802 +104,70 -> 104,452 +885,59 -> 885,36 +68,854 -> 68,774 +731,935 -> 731,718 +657,986 -> 617,986 +732,292 -> 732,32 +841,56 -> 841,83 +74,108 -> 862,896 +654,895 -> 323,895 +374,952 -> 374,217 +90,723 -> 750,63 +246,89 -> 911,754 +453,301 -> 755,301 +983,988 -> 23,28 +81,705 -> 133,757 +752,743 -> 752,397 +53,243 -> 449,639 +451,811 -> 451,187 +26,672 -> 26,699 +254,861 -> 943,861 +643,740 -> 643,966 +486,655 -> 149,318 +375,146 -> 375,973 +76,293 -> 103,293 +246,398 -> 246,248 +324,392 -> 595,121 +130,577 -> 131,577 +380,623 -> 549,454 +224,181 -> 985,942 +310,223 -> 310,594 +23,982 -> 23,738 +19,858 -> 832,858 +726,531 -> 726,578 +730,433 -> 196,433 +606,599 -> 242,599 +444,832 -> 444,238 +198,870 -> 47,870 +944,473 -> 795,473 +737,386 -> 178,945 +328,902 -> 328,644 +422,851 -> 567,851 +674,781 -> 215,781 +920,757 -> 302,757 +225,932 -> 640,517 +359,337 -> 791,337 +935,430 -> 935,262 +772,850 -> 280,358 +175,829 -> 175,451 +938,204 -> 234,908 +253,749 -> 308,749 +704,458 -> 468,458 +222,95 -> 743,616 +968,840 -> 123,840 +491,619 -> 491,889 +979,580 -> 979,459 +901,193 -> 171,923 +246,155 -> 246,680 +711,755 -> 247,755 +671,734 -> 475,734 +803,783 -> 129,109 +145,890 -> 920,115 +463,521 -> 463,700 +782,99 -> 782,311 +547,467 -> 630,467 +14,88 -> 795,869 +653,899 -> 653,90 +488,874 -> 488,570 +93,879 -> 645,327 +320,658 -> 40,938 +611,246 -> 611,22 +258,935 -> 258,829 +931,436 -> 931,263 +252,460 -> 252,461 +490,382 -> 965,382 +242,89 -> 242,617 +271,111 -> 595,435 +462,706 -> 242,486 +557,328 -> 747,328 +486,99 -> 486,333 +156,40 -> 488,372 +323,482 -> 138,297 +595,539 -> 812,756 +923,861 -> 377,315 +934,952 -> 256,274 +314,777 -> 314,12 +508,47 -> 508,144 +888,807 -> 701,807 +745,774 -> 878,907 +740,716 -> 740,215 +62,43 -> 62,12 +571,196 -> 454,196 +568,107 -> 408,107 +549,676 -> 404,676 +595,573 -> 595,970 +148,168 -> 193,123 +763,71 -> 759,71 +797,64 -> 307,64 +959,984 -> 32,57 +457,562 -> 634,562 +127,521 -> 601,47 +112,296 -> 112,120 +148,755 -> 451,755 +636,494 -> 870,494 +910,242 -> 945,277 +912,911 -> 912,892 +759,815 -> 759,314 +391,285 -> 391,959 +455,460 -> 182,460 +112,78 -> 112,385 +842,179 -> 842,592 +236,424 -> 421,424 +508,907 -> 30,907 +637,219 -> 34,822 +503,375 -> 503,205 +570,533 -> 626,533 +658,11 -> 658,94 +179,286 -> 326,433 +918,214 -> 200,932 +339,887 -> 81,887 +794,91 -> 50,835 +225,356 -> 225,261 +80,160 -> 80,335 +148,64 -> 847,763 +595,393 -> 941,393 diff --git a/2021/d06/ex1/ex1.py b/2021/d06/ex1/ex1.py new file mode 100755 index 0000000..92475ad --- /dev/null +++ b/2021/d06/ex1/ex1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from dataclasses import dataclass +from typing import Iterator, List + + +def nth(iterable: Iterator[int], n: int) -> int: + return next(itertools.islice(iterable, n, None)) + + +def solve(input: List[str]) -> int: + fish = [0] * 9 + for n, count in Counter(map(int, input[0].split(","))).items(): + fish[n] = count + + def step(fish: List[int]) -> List[int]: + # Count how many clones happen + new_fish = fish[0] + + # Do the next cycle + fish[0:-1] = fish[1:] + fish[6] += new_fish + fish[8] = new_fish # Override number of new fish + + return fish + + def iter(fish: List[int]) -> Iterator[List[int]]: + while True: + yield (fish := step(fish)) + + return sum(nth(iter(fish), 80 - 1)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d06/ex1/input b/2021/d06/ex1/input new file mode 100644 index 0000000..87141dd --- /dev/null +++ b/2021/d06/ex1/input @@ -0,0 +1 @@ +3,1,4,2,1,1,1,1,1,1,1,4,1,4,1,2,1,1,2,1,3,4,5,1,1,4,1,3,3,1,1,1,1,3,3,1,3,3,1,5,5,1,1,3,1,1,2,1,1,1,3,1,4,3,2,1,4,3,3,1,1,1,1,5,1,4,1,1,1,4,1,4,4,1,5,1,1,4,5,1,1,2,1,1,1,4,1,2,1,1,1,1,1,1,5,1,3,1,1,4,4,1,1,5,1,2,1,1,1,1,5,1,3,1,1,1,2,2,1,4,1,3,1,4,1,2,1,1,1,1,1,3,2,5,4,4,1,3,2,1,4,1,3,1,1,1,2,1,1,5,1,2,1,1,1,2,1,4,3,1,1,1,4,1,1,1,1,1,2,2,1,1,5,1,1,3,1,2,5,5,1,4,1,1,1,1,1,2,1,1,1,1,4,5,1,1,1,1,1,1,1,1,1,3,4,4,1,1,4,1,3,4,1,5,4,2,5,1,2,1,1,1,1,1,1,4,3,2,1,1,3,2,5,2,5,5,1,3,1,2,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1,4,1,4,2,1,3,4,1,1,1,2,3,1,1,1,4,1,2,5,1,2,1,5,1,1,2,1,2,1,1,1,1,4,3,4,1,5,5,4,1,1,5,2,1,3 diff --git a/2021/d06/ex2/ex2.py b/2021/d06/ex2/ex2.py new file mode 100755 index 0000000..439c21e --- /dev/null +++ b/2021/d06/ex2/ex2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from dataclasses import dataclass +from typing import Iterator, List + + +def nth(iterable: Iterator[int], n: int) -> int: + return next(itertools.islice(iterable, n, None)) + + +def solve(input: List[str]) -> int: + fish = [0] * 9 + for n, count in Counter(map(int, input[0].split(","))).items(): + fish[n] = count + + def step(fish: List[int]) -> List[int]: + # Count how many clones happen + new_fish = fish[0] + + # Do the next cycle + fish[0:-1] = fish[1:] + fish[6] += new_fish + fish[8] = new_fish # Override number of new fish + + return fish + + def iter(fish: List[int]) -> Iterator[List[int]]: + while True: + yield (fish := step(fish)) + + return sum(nth(iter(fish), 256 - 1)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d06/ex2/input b/2021/d06/ex2/input new file mode 100644 index 0000000..87141dd --- /dev/null +++ b/2021/d06/ex2/input @@ -0,0 +1 @@ +3,1,4,2,1,1,1,1,1,1,1,4,1,4,1,2,1,1,2,1,3,4,5,1,1,4,1,3,3,1,1,1,1,3,3,1,3,3,1,5,5,1,1,3,1,1,2,1,1,1,3,1,4,3,2,1,4,3,3,1,1,1,1,5,1,4,1,1,1,4,1,4,4,1,5,1,1,4,5,1,1,2,1,1,1,4,1,2,1,1,1,1,1,1,5,1,3,1,1,4,4,1,1,5,1,2,1,1,1,1,5,1,3,1,1,1,2,2,1,4,1,3,1,4,1,2,1,1,1,1,1,3,2,5,4,4,1,3,2,1,4,1,3,1,1,1,2,1,1,5,1,2,1,1,1,2,1,4,3,1,1,1,4,1,1,1,1,1,2,2,1,1,5,1,1,3,1,2,5,5,1,4,1,1,1,1,1,2,1,1,1,1,4,5,1,1,1,1,1,1,1,1,1,3,4,4,1,1,4,1,3,4,1,5,4,2,5,1,2,1,1,1,1,1,1,4,3,2,1,1,3,2,5,2,5,5,1,3,1,2,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1,4,1,4,2,1,3,4,1,1,1,2,3,1,1,1,4,1,2,5,1,2,1,5,1,1,2,1,2,1,1,1,1,4,3,4,1,5,5,4,1,1,5,2,1,3 diff --git a/2021/d07/ex1/ex1.py b/2021/d07/ex1/ex1.py new file mode 100755 index 0000000..4205009 --- /dev/null +++ b/2021/d07/ex1/ex1.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List + + +def solve(input: List[str]) -> int: + nums = sorted(int(n) for n in input[0].split(",")) + median = nums[len(nums) // 2] + + return sum(abs(n - median) for n in nums) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d07/ex1/input b/2021/d07/ex1/input new file mode 100644 index 0000000..4b58ac9 --- /dev/null +++ b/2021/d07/ex1/input @@ -0,0 +1 @@ +1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,1133,1029,1446,1005,596,277,439,544,201,317,237,33,252,774,482,291,57,1434,153,134,385,993,677,1189,99,1082,351,80,1563,195,581,693,5,633,184,552,11,606,462,48,134,1451,850,221,336,661,276,156,932,23,98,76,327,212,489,230,819,998,1037,1561,206,159,757,207,1203,224,1459,294,39,1108,96,89,1664,353,41,83,942,771,362,193,900,676,851,277,558,368,1054,316,143,464,85,896,558,52,669,163,696,140,340,542,817,783,1436,786,81,21,669,184,430,312,1500,797,698,611,314,145,125,391,785,867,488,144,9,967,560,245,116,96,1769,314,533,25,0,1375,1307,1273,1178,332,59,26,234,487,480,615,313,629,28,707,96,637,30,350,1286,900,777,115,56,79,809,1101,13,150,741,940,20,403,384,479,622,108,325,276,609,654,535,539,62,187,414,535,140,222,845,357,55,17,8,1430,853,759,331,673,202,482,1280,714,911,409,429,604,278,478,301,408,590,329,1482,110,423,488,7,628,66,196,399,86,241,1058,501,1284,594,710,799,34,60,668,457,0,1209,20,50,1134,288,415,399,86,540,1356,285,1541,172,3,634,1387,146,669,195,403,601,758,160,970,760,43,213,68,805,50,350,292,78,252,54,1021,882,241,808,601,892,878,1401,48,191,74,1429,94,520,505,679,1133,120,485,183,362,684,520,1366,301,123,290,1248,140,44,230,572,57,1101,217,906,1012,668,85,230,32,100,472,275,78,91,19,61,732,518,189,85,1531,1255,134,489,637,792,42,36,392,603,976,651,127,486,340,534,185,890,346,906,1295,319,321,597,252,183,554,124,44,426,131,408,582,429,645,1227,574,14,1828,359,184,1830,10,288,194,949,1578,492,502,149,609,77,92,320,233,1026,123,26,188,1123,4,665,1793,331,858,481,197,424,133,933,338,7,163,1269,665,19,1,538,126,895,1751,345,895,203,175,66,305,1479,239,718,386,8,1148,203,636,1211,635,149,489,1156,1828,61,328,331,287,262,8,3,522,1427,931,1103,199,329,930,779,124,446,391,903,696,1764,16,595,522,143,296,19,872,29,546,566,256,63,1195,862,516,267,452,1287,11,547,760,77,117,988,185,293,421,118,767,70,169,456,600,755,740,1799,97,507,1165,265,1126,376,1250,408,22,674,774,361,54,558,1021,529,29,871,527,474,218,47,309,61,188,1365,725,267,235,359,1004,1771,765,8,17,103,89,967,65,302,759,1688,882,709,1469,123,548,834,355,646,404,76,257,101,627,2,66,1328,137,42,23,127,110,632,683,1163,843,1119,16,497,1756,347,958,981,57,185,204,1403,530,536,104,68,1152,95,320,959,144,281,350,622,717,112,631,150,19,938,296,1272,825,37,192,350,847,306,824,1042,320,480,857,589,137,687,93,21,1601,547,550,491,161,49,124,292,396,34,24,95,932,56,968,197,109,1300,1326,605,357,412,14,179,450,991,173,120,1402,478,77,933,88,96,49,95,596,1885,841,441,659,309,418,87,134,34,815,759,631,209,728,7,232,1304,698,140,304,1448,101,1,239,1321,362,1367,1411,279,111,633,1347,110,18,710,443,1676,64,531,386,64,518,619,893,140,301,426,1451,261,1083,115,61,943,60,891,217,475,48,436,586,31,287,196,430,357,78,161,1533,745,198,715,8,307,225,604,263,992,371,749,700,1573,573,546,480,425,47,88,66,799,388,60,736,111,81,856,29,695,141,4,271,143,939,423,3,1260,265,24,903,292,23,80,196,1245,399,123,3,532,283,366,1175,187,15,450,487,117,1041,669,59,579,159,461,598,915,666,1231,999,253,185,1016,135,1317,253,111,1261,833,26,851,120,11,63,718,682,233,76,0,50,1678,777,286,279,90,47,158,71,35,475,245,550,4,942,1816,1646,102,175,343,12,446,12,623,44,157,10,555,1173,651,361,745,1870,97,237,1628,90,233,126,1596,1146,746,383,209,55,209,318,904,144,90,21,86,4,970,262,8,210,249,871,1216,1003,172,405,821,225,2,143,915,129,598,397,583,1400,315,113,33,75,426,2,611,293,196,419,125,176,496,4,607,1425,27,48,172,972,626,227,184,1257,514,209,524,22,58,927,4,931,3,6,104,716,961,17,4,154,249,558,203,180,180,1194,935,263,535,380,1439,274,1566,873,1763,2,89,636,407,667,438,966,757,245,730,328,915,167,245,126,52,652,938,1183,320,1298,10,844,36,263,382,37,142 diff --git a/2021/d07/ex2/ex2.py b/2021/d07/ex2/ex2.py new file mode 100755 index 0000000..56b818c --- /dev/null +++ b/2021/d07/ex2/ex2.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +import itertools +import sys +from math import ceil, floor +from typing import List + + +def solve(input: List[str]) -> int: + def fuel(dist: int) -> int: + return dist * (dist + 1) // 2 + + nums = list(int(n) for n in input[0].split(",")) + mean = sum(nums) / len(nums) + + upper = sum(fuel(abs(n - ceil(mean))) for n in nums) + lower = sum(fuel(abs(n - floor(mean))) for n in nums) + + return min(upper, lower) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d07/ex2/input b/2021/d07/ex2/input new file mode 100644 index 0000000..4b58ac9 --- /dev/null +++ b/2021/d07/ex2/input @@ -0,0 +1 @@ +1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,1133,1029,1446,1005,596,277,439,544,201,317,237,33,252,774,482,291,57,1434,153,134,385,993,677,1189,99,1082,351,80,1563,195,581,693,5,633,184,552,11,606,462,48,134,1451,850,221,336,661,276,156,932,23,98,76,327,212,489,230,819,998,1037,1561,206,159,757,207,1203,224,1459,294,39,1108,96,89,1664,353,41,83,942,771,362,193,900,676,851,277,558,368,1054,316,143,464,85,896,558,52,669,163,696,140,340,542,817,783,1436,786,81,21,669,184,430,312,1500,797,698,611,314,145,125,391,785,867,488,144,9,967,560,245,116,96,1769,314,533,25,0,1375,1307,1273,1178,332,59,26,234,487,480,615,313,629,28,707,96,637,30,350,1286,900,777,115,56,79,809,1101,13,150,741,940,20,403,384,479,622,108,325,276,609,654,535,539,62,187,414,535,140,222,845,357,55,17,8,1430,853,759,331,673,202,482,1280,714,911,409,429,604,278,478,301,408,590,329,1482,110,423,488,7,628,66,196,399,86,241,1058,501,1284,594,710,799,34,60,668,457,0,1209,20,50,1134,288,415,399,86,540,1356,285,1541,172,3,634,1387,146,669,195,403,601,758,160,970,760,43,213,68,805,50,350,292,78,252,54,1021,882,241,808,601,892,878,1401,48,191,74,1429,94,520,505,679,1133,120,485,183,362,684,520,1366,301,123,290,1248,140,44,230,572,57,1101,217,906,1012,668,85,230,32,100,472,275,78,91,19,61,732,518,189,85,1531,1255,134,489,637,792,42,36,392,603,976,651,127,486,340,534,185,890,346,906,1295,319,321,597,252,183,554,124,44,426,131,408,582,429,645,1227,574,14,1828,359,184,1830,10,288,194,949,1578,492,502,149,609,77,92,320,233,1026,123,26,188,1123,4,665,1793,331,858,481,197,424,133,933,338,7,163,1269,665,19,1,538,126,895,1751,345,895,203,175,66,305,1479,239,718,386,8,1148,203,636,1211,635,149,489,1156,1828,61,328,331,287,262,8,3,522,1427,931,1103,199,329,930,779,124,446,391,903,696,1764,16,595,522,143,296,19,872,29,546,566,256,63,1195,862,516,267,452,1287,11,547,760,77,117,988,185,293,421,118,767,70,169,456,600,755,740,1799,97,507,1165,265,1126,376,1250,408,22,674,774,361,54,558,1021,529,29,871,527,474,218,47,309,61,188,1365,725,267,235,359,1004,1771,765,8,17,103,89,967,65,302,759,1688,882,709,1469,123,548,834,355,646,404,76,257,101,627,2,66,1328,137,42,23,127,110,632,683,1163,843,1119,16,497,1756,347,958,981,57,185,204,1403,530,536,104,68,1152,95,320,959,144,281,350,622,717,112,631,150,19,938,296,1272,825,37,192,350,847,306,824,1042,320,480,857,589,137,687,93,21,1601,547,550,491,161,49,124,292,396,34,24,95,932,56,968,197,109,1300,1326,605,357,412,14,179,450,991,173,120,1402,478,77,933,88,96,49,95,596,1885,841,441,659,309,418,87,134,34,815,759,631,209,728,7,232,1304,698,140,304,1448,101,1,239,1321,362,1367,1411,279,111,633,1347,110,18,710,443,1676,64,531,386,64,518,619,893,140,301,426,1451,261,1083,115,61,943,60,891,217,475,48,436,586,31,287,196,430,357,78,161,1533,745,198,715,8,307,225,604,263,992,371,749,700,1573,573,546,480,425,47,88,66,799,388,60,736,111,81,856,29,695,141,4,271,143,939,423,3,1260,265,24,903,292,23,80,196,1245,399,123,3,532,283,366,1175,187,15,450,487,117,1041,669,59,579,159,461,598,915,666,1231,999,253,185,1016,135,1317,253,111,1261,833,26,851,120,11,63,718,682,233,76,0,50,1678,777,286,279,90,47,158,71,35,475,245,550,4,942,1816,1646,102,175,343,12,446,12,623,44,157,10,555,1173,651,361,745,1870,97,237,1628,90,233,126,1596,1146,746,383,209,55,209,318,904,144,90,21,86,4,970,262,8,210,249,871,1216,1003,172,405,821,225,2,143,915,129,598,397,583,1400,315,113,33,75,426,2,611,293,196,419,125,176,496,4,607,1425,27,48,172,972,626,227,184,1257,514,209,524,22,58,927,4,931,3,6,104,716,961,17,4,154,249,558,203,180,180,1194,935,263,535,380,1439,274,1566,873,1763,2,89,636,407,667,438,966,757,245,730,328,915,167,245,126,52,652,938,1183,320,1298,10,844,36,263,382,37,142 diff --git a/2021/d08/ex1/ex1.py b/2021/d08/ex1/ex1.py new file mode 100755 index 0000000..efab1fd --- /dev/null +++ b/2021/d08/ex1/ex1.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +import itertools +import sys +from dataclasses import dataclass +from typing import List, Set + + +@dataclass +class Entry: + signals: List[Set[str]] + outputs: List[Set[str]] + + +def solve(input: List[str]) -> int: + def parse_entry(input: str) -> Entry: + signals, outputs = input.split(" | ") + return Entry( + [set(s) for s in signals.split()], [set(o) for o in outputs.split()] + ) + + entries = [parse_entry(line) for line in input] + + return sum( + itertools.chain.from_iterable( + map(lambda __: 1, filter(lambda d: len(d) in (2, 3, 4, 7), entry.outputs)) + for entry in entries + ) + ) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d08/ex1/input b/2021/d08/ex1/input new file mode 100644 index 0000000..a5bf9d9 --- /dev/null +++ b/2021/d08/ex1/input @@ -0,0 +1,200 @@ +badc bd dbeaf cfdbge dfb cfbdea efbag edcfgab dcafe degfca | eacfd acdfbe cbdegf fcbaedg +cd fdbac egcfab gbadcfe cfgdeb cbadfe deca cdf dfabg abefc | dcf cfbad gbafced fcd +cg agecfb cbg eabgfdc egdc fdgba bafecd cbdfe bfcdeg cfgdb | efdcb adcfeb fbdcg gbc +bfceg gfadb dbcfgea bgaef efad abe bcdgfa ea fbdgea agecbd | eadf ceadbg abfge fecdbga +gdcafe eacb adc gbfda afdceb edgbcf badfc ecgbafd ac fdbce | ebfcd cefdab bdfgeca egbdacf +aefbgd fbdc fbecg egdcb edcbag bf gcefa fbedcg bagfced fbg | afgce cfbd bdcf geafdbc +ebgacd edacg gcdeaf cabfg dbc bd cdbgaef ebad fecgbd acbgd | dgbac db caegbdf gcbfa +defbga gead ge efagcb gdafbc cegbdfa egf bfdce bgdef dgabf | gef eg bfcdag ge +bae adcgfbe cdfeag ab dcgeb bfdage agecb cagfe abcf bfcaeg | bae aeb agfceb afceg +ae adefcb gaceb gadceb edag efadcgb badgc cfgbe cadbfg cea | ceabgd fbeacdg aged aged +aegbdc dbegfac gcbaf df febd egdafc deabg gdf gdfeab adfbg | bcdegaf dfeb bcegad df +aegcdfb becdaf gdecf ag fag dcfgba badg fcbad cdgaf acefgb | abcdf cefdab ga ga +gbcfad cefadg cegad aefdb gedacb gcfe fc cfbgead cfade caf | degac egcf geacfbd afc +bcfad afcdbe fd ecfba cfd afde cfeabg gcbfed dacbg fdgabec | cafbged edfa fcd dabgc +afdc adbfe bgecfad ecagdb dbcafe dfe fd agbfe bdace gdbfec | fadbe efbdgc fadbe edcba +bdface geba ecbdag acegd afcdg ge eadbc bfecgda edg fgbdce | eg abge fadgceb abge +fagbde fcegbd gec efcdg fdgbe ebfcag gc adcfe cgdb cagbdfe | defcg cbgdfea gcbd ecfgd +acfbg debgf gfcdba edcbfa fbdag fgbeca cfbagde gadc da bda | dacg acbgf cedfgab caefdgb +ca dfegca edcbgf gfcde aedbg gfdeacb dcbfea facg dgcea ace | fedcg fdagec cea ac +acdf gcfde debcga ecbgaf cf ebgdf bagfdce cedag cef gedafc | dgcbea fc dcgeaf cdaeg +ebagf cabgfed ed cbgad afcbge afdbge edg eagbd cedgfb aefd | fcgdbe de cgbeaf ed +fbcdeag cafbd fgcbea fdgacb daecfb cg gca defga gbdc fdcga | abfcged agc acfgd cbfaeg +dacfe ed ebdcag gcadfe dfbcaeg dce dfeg fbcadg bfeca acdfg | fcbdga gcbade aegdcf fbcgda +cfdegb cbef fgdec gdfbca gdecbfa egfdca bc gbc cbegd aedgb | befc bc abegd ebcdfga +agcefdb fdbg bf bdafe gdebaf eafdg acdbe gcebaf bef edcfga | bf fdbg efdab gefda +gcb bdcgef dcbfg bg edbg facegb cbedf edgafbc dfgca edacbf | gb cdebfa deagfcb bg +eafbg gfad afegbd caefbg befdgc ebagd gd bdg cfbdage acdeb | gd geafb cabed dbg +bcedfg dc dgc aedfbcg acgbed bgfead gedbf bfdcg cedf facbg | gabfed cdebag dafegb cd +fa adbceg afecd cafdbge eacgfb daegcf aef bcdfe fdga daceg | acedf afe fae afdg +cdfaeg agcfb bcdgea dcafeb cef fabec ef dfgcbae defb eabcd | gdabce fdeb ebdf ecf +cdefg ceafg gebfd cdg dc efbcdg cdgbea cfedbga cbfd fdagbe | fbcd afdgbe fabedg dcfb +cdafgb egdb fecgabd cbfdg fcbedg feb acefg begcf be dacebf | be be ebfdca abgfcd +eafgcd facegb acb cdbfaeg fagec dgcabe baefd cgbf cb afecb | bcafeg fcgb gfdeac eagcf +ecgdfb deb edfgab eb faedcg agfed bfaed dbacf gbae efgdcba | fabde eb ecdgfb eabg +aefbg bdegfa gacdb gefc fbc fc bfdcae gefbac cbfag dbgefac | ecfg fc cfge efgcdab +gcfbed gcbae dcaef cbegad bdag bgeacf adefgcb deg adgec gd | agcbde bgad gdbfec gcfabe +dfacb egbcda dac agdcfb fecab adecfgb bgadf cd fgeabd cgfd | gabfdec acd dc dc +bfecg dcgeab af gadf aedbg caefdbg bgfade bafeg abf eabdcf | ebcfg gafd ebacfd fgbdace +ge fdeab gcebfda fadcg fgead abcdef eag ebdgfa acgbef dgeb | cdagf cfdgbae fdeab eag +dba dgfceb fbcegad bagde bcdeag bcedg bdafce agfbe ad cgad | bdcafe agdc ebdcg cdga +edfg fedac fbegcad acgfe fabcd ead bgefac de daecgf bcaged | bafcd ade bacefg fdbac +gdecbf edabc ef fcgead fcadg bdcfga fec ceadf dgaefbc agfe | faedgc ef gabfcd fe +deafg eb egbaf cadegf fcdeab degb bcgaf bfe bfcdega gefdba | abgfe eb gfdaeb efdcga +fabcd beadf efabgc fc cafdgb gcfd adfcgeb abgdce cfb dgcba | dcgf bdcgaef gdcf cfdg +ebac acedf ceadfb cfe dbcgaf ec efcgdab degaf abfcd edgbcf | ce edgaf dgbceaf fce +ecbag fg gacdfe edafgcb cgefa eacdfb deafc bdagcf gcf dgef | fged gedf cefdga cabge +dgebc bcg cg gdeabf cgfeba gdfc gefbdc adbec bdefg fgcdbae | begdf cfgd eadbc gbfde +aefdb ecgb dgaeb agdbce ega fgdacb bcadg cbdeafg ge edacfg | age fcbdaeg gea bcfegda +cdeabg fcgda bdagc acfb dfa af cdeabfg efdgab fbcgda decgf | bcagd cfba gedfc af +ceadb caebgfd bdfaeg cbgaf ge ega gadcbf gfce ebgcfa gebca | aecdb febgcad bgcaf fadcgbe +daegb gfdae ceagfd bgfade feagcb fbgd bg cbagdfe ebdac ebg | gefbacd dbgf geb adgbfe +ecadfg acdfb aefgc ecbfdag dce cfbega fcdae edga gbecdf ed | fcdba ced egfcba dega +defgbc cgdea efag fdbcgae acbdf gcdaeb fe dfcega efc defca | fage fec dcafeg ecagfdb +bg dbcafg gdafecb dgfcae defcg gebd cefgb bgfecd fbaec fbg | gbf dfgec bedg cfdgae +ebgda ebd adce cdgaeb edfcgb bcagd agdcebf ed agbef gcbfda | efagb gbefa dbcfgae eadc +ebcfdg dbe de cdabgf fgdab dgae aecbf abfgced edbaf eagdfb | bface cdafebg gadcefb fedab +agc dabcge agbcd cabe dbagf cfgeadb gecafd gbcdfe ac gbced | cbegd beac dgbce ac +fdagb bdeacf fga eagd gcfdb gecafb ga feabd abfgde dcbfega | bdafe abgcfe gbecfad abdgefc +fbecd dbaef bdgc debafgc daecgf ebfcgd ebc abegfc bc gfced | fadecbg cb cdgeaf bfade +fagbe aebfgcd gef bgadf cbagfd deafbg cfdeag ge begd beafc | bcfadeg edbgaf fcgaed ge +gabfc gabde fbdga bfegca agfbcd df cdfagbe dcfg caefbd dbf | decfagb bdf gfcd fd +bdafeg gf gbadf gefb cgefda daecbfg bacfed cdagb fdg fdaeb | daegcf eagdfb adgcb bagfed +dafegb efdac bda fgedbac egfcdb bgfa fbaed bgdef debagc ba | ba bgcead bad ab +cfged cbegdf cb ecgdb adefbcg fdcabg cdb cdagef efbc gedab | bc gdebcf gecdb bagdcf +fbegcd gcedba eba acegf dbfa efbgd ebfadg ab fgceadb bgfea | fgbae gbedcf degfb agdebc +ceadf fdacbe ef edgafb dfe bgaedc cadfg bcef cfebgad ecabd | cafde fabedc debac eacfd +cd dgafe cbgfae decfg cfebg cfd gdbc febgdc fbegacd fceadb | dc beagfc aebcfg gcfeabd +adcefbg caefgb bafd dface bdcfe cegbd fbe gdfcae dceabf fb | efb ebcgd gbdcaef fb +fbdg gebac degbfc gd dfeagbc decfb gcd dafgce faecbd bdgec | gfdcae gfdb dg afgdce +fb fgedca fbe gfcde gcbfde dbceaf bgeca eafbdcg dgfb fbegc | fbe cbdegf bfe gedfc +acfbe fcbaged bgdcf cabgfd ag cagd fcbga bcfegd gfa eadbfg | afgcb gbdecf efdbcg fag +fbegc dgca dfc fagbedc bfadcg dc ebdfca fadbg cgbfd gfdbae | dabefg egdbaf gaebdf dc +cdbgf bdfaeg ca fgcab dgacfbe feac facgbe ebgcad bca gfbea | dafbeg cab cdagbe debfga +gfbe ebcfag bcedaf be egfac fegdca gebca eab cbgad gfacdbe | dabcgef bcagfed gcfea bea +bdefacg fbgedc efdagb beg geabf eg dafbce dage gfabc eabdf | gead gcafb ecfdab egfbdac +gd gfecbd dacefb dgbf cdegf acfge agbfced becdf aedbgc gdc | gdcef cgbead gd gefacbd +cgbfea cafed dbgefac gacb bc afbge fdabge efbac bcfgde cbe | gbac fcdbge agcb aecgdfb +abgefc cfeba gcdba fgdcea gf fcbgaed eadfcb gbfe fga bacgf | efcba fabecd dgcbfae eagcfd +gcdbfe fdec gcfdb bdfeg de efgba cbgdafe afgcbd cgdbea ged | cedgbf fced agfcdeb cgfbed +dbacfge cafdb gbcfea aegc afbec ea bae bgcedf befgc edgafb | dfgeabc bfgcde faceb fbecag +bfcgad bfegd fg dcgeb egaf bfedcag efabdc dfegba gfb abefd | gf abdgcf dcbfag fgb +degab dgebac bfdeacg cadeb fbdeac bag debgf cgda abgecf ga | dceba fdbeg edbac dbacfge +abdef gcbead bgce cgdab deg dgcbfa aedbg fbacdge eadcfg ge | cgfdba gcafde agfcedb fdacbge +defabg cabdg gcfed cabe gbeacd fgadbc eb geb aedcfgb bdgce | eb dbegc dfecg dbecag +egdabcf edcgb bcedgf cgb bgfe fcgabd bg acgfed cbaed dfegc | cgb gbc egcfad degbc +fe agebdc gfbead fcdea abecgfd bafcde beacd cbef def cgfad | dabgfe fde adfcg bfgead +ba fcabed bad dgacf dfgecab dcgba gdecb bdgcfa abgf caegfd | gdecb dgcfba gcdafe afbedgc +bdgef cdbgfa acbed gedcfb efdgba cg abcgedf cgb cgdbe cfeg | edabc ebdca edbcg ecgf +edfba bcfgead cbged defbcg ag gfadce gcaebd edabg cabg dga | fedagc bcag bdegc gaebfdc +edab fed egcfb ecgbfad fegbd fagdcb degcaf afgebd gabdf ed | def gdefb fgedb edcagf +fc ebfgda ebcfd cabed gcadbf baecfdg cgfe fdc egdfb gdecbf | defbg aecbfdg cadbegf adgfbe +bgdfc fgc fdegb dgecfb fcabd egbafdc gc dgce gabefc gedbfa | fbdgce gc dbfegca cg +bgedc ged gdfcea dcefb cdabg bgfe defbgc bdecaf dcgbfae ge | badefc gbfe cbegd fdagbce +cdefga cgdafeb cbe becdg gdefc cfbg cfdbeg cb febdac edgba | edbgcf abecfd ebgfcd fgbc +de aegcf agedcb afegbdc edbf fbdga facgdb gdaef dbaegf dea | cdabgf ead afgbcd edbf +cfagde eagfbc cbegf cg fcaegdb ebgfd gcf dafebc efabc acbg | bacfe fgc gcf cg +gadfce fbcaeg bdag eba bedcgfa dcfbe ab ebdgca ceagd ecabd | eabdc badec cdaeg dagb +aedb ebcagf fdeac be bdgfc eafbdc abcfegd aefgcd feb ecdfb | fecbd adeb be bfe +dg fgdecb dfecb fdcgeba gedcb gceab fdge cgd cgdbfa baedcf | ecbgd cagfdeb dcbfeg gd +fgcead bfdcag gecdf dfeacb dce aged gcbfe dcfgeab ed fgcda | cfegd de gcafd gefdc +dbec eafbdg dafegc eac gbacf decagb bcgae bdgea gbcefad ce | becag edgab cbadgfe edbc +gefcab agbdc febd bcegd de ecbfg afgdce ebafgdc dfebgc egd | de gdecfba edbf cdegb +abdcefg fbdega dcfag bd fegba badgec fgadb edbf fgaceb bdg | acdfg fagbce adcfg abgfd +ag agdb bfeag fbgdace bcfeda dgafeb egafdc begfc dfeba eag | ecbfg agbd dabg bfeacd +dagc dae fdaec edcafg fbadeg cgefa abcgef ad dfecb fdgcbae | eda eagcbf agfec debfc +ead beafd dfagb faceb bfedca facegd aefcbg cbed ed gfcbaed | abgdf eda agbfce ead +afdgb eabcgf dfgbe fecdgba dagceb gfa cafgdb af cdfa abdcg | abdfg dceagb decfagb fagcedb +dbcfga cb acb gcbafde fcbg egbfda dceaf gbfda dcfba cdbgae | fcadgb cdefgba agbfd cgfb +gceb fcgba cefdba caebfdg egfadb eagfcb cb beafg acb gfacd | abcedf bca gfcda bcge +eabdc caebf ad dgabcef fcaedg cfegba deacbf dabf dca begdc | dbgce dbfa fgebadc acedb +fbgce ec gcea dafcgeb fgbed fec adgbcf abcfeg fcbga cfbade | cbdfag ebgfc fgcbe agbfdc +afcg afebcg becgf fgadeb bdgaefc fa afe acedb abecf gdfebc | fgecb eacdfgb ceabf cgfa +fb gadeb aegdfb abgfe fab dfgb adfecbg bcaegd ebdafc cafeg | becdfga bf fbadec bgfd +ab dgafe fdaeb adb agcedf ecbfd agfb caedgb bdfage egfabdc | fedbc dfecag afdcge becfd +bgedf dgecfb fae gbaec fa cedafg dcabfge gedfab gafbe fbda | fcgdea geadcfb efbdg fa +cgfaed fdebg fcgabd fcegb bd dfaeg gfbeda fgdceba edba dgb | db ebcgf fgcbe edgfa +fgc egcafb dcgb fagdb bedafgc cdbgaf fedac cg gacfd dfbage | febgad cgfaeb fadbg gc +fdaebcg deabgc bfdeg dfcaeg efcgd cdaf cfbeag fcg cf cgeda | bgefcad bgdfe dafc ebagfc +egcfad dbecf cbgf fbe aecbd bcfdge dfbgea aebgdcf ecfdg fb | cgfb gecfd gefacdb fbcg +cdb adcf gbcdae bdceaf dfaeb cdfeb febgc fgedba cd cgdafeb | eadfb fcgeb cbedga bdacge +gd dacg gbdafc gfbdc bdegaf fbgca cbgdefa cbafge edfcb dfg | gbcafd dgac dgcafb cbfgae +cbf dafeb fbceag bc egbdfc edbgafc fbced ecdfg cdgb gdafec | bcf dbfea ebagcf gadfcbe +dcebgf eagfc aebfcd edcbg baefgdc fd cdefg dgaebc fde bfgd | ebagfcd acgefdb fagec gbdaec +afgdc bagec bdfg fb ecgdbfa fab dfecga bcgadf dcafbe bgafc | afgced fb dcafg feabcd +gef febag ebagc egcfbd fg cafg abfde abcfge afcgebd ebcgda | egf gaebf dfeba gadbce +ag cdeafg gdbfce daceb acgf efgbda adg cegda gaedbfc efcgd | debac eadbc bgaecdf cgbaedf +acefdbg debgac ecdgf ead facebg eafgb ad fedbga bfda eafgd | adbf eagfd eabcfgd ecagfb +cd bafegc fgcaed fcaeg dgc fdcag agdbf fedc gbadce egdabcf | fedbcga bgafd fcde cfed +decg egf ecgbfa degfa edbagfc dgcabf cdfag eg fcaedg faebd | gcadef efadg egf eg +feacbg cgfadbe efb efbga dfagb eb aefgc bgec cgedaf dcebfa | eb be be fbe +begc eacfdb dfacg agcfe ce eagbf eac eafdgb aefbcg dfgaecb | ce ce ce gbce +dfeagb dgaeb dbagefc gbcfae degf decba cbgdfa bgfda eg gae | ge agfdcbe bdace fdeg +cgdab cegdbf cfbad bg aegb caedfg eacgbfd dgb dgaec gdbaec | gbea eacgd gb cgaebd +ag ecdgbaf edcba eagcd aeg gcfa dfcgae egcdf gfdeba fcgbde | fgeadb dacge fdagceb egafbd +fdbgec bge fdacbe bfdga edfgb cbgaed gefc cefdb ge baegdfc | ebfgd gbe begdf eg +cedafb gdab fgced cabdf fgbaecd dcbgf gb bgc gabfdc ebfgca | bcadgf cbfda cdgfab agdb +fdcbg bgface ecdabf ad fgcbaed gcefad dac efgac cfagd daeg | dcfabge edga ad gcfea +bce gaecdb aefc bedfgca acbfge aebgf fbceg defgba dgfcb ce | ceaf ce bfgce ce +gefadc gefadb agd ebfcdag dbeg dfagb abfed gafcb dg adbcef | fbgad bged gd cfebda +dcfge egdbf adcgf bafecgd ecd gdfeac bdecaf ec cfgdab cage | acge dacgf facdg cgea +bagdec gecdfba gdabe deb eabc be acdgfe afgdb deagc gdecfb | aebgd cgdea adbge eabc +gebca bedgaf ac gcbeaf bcagedf bafge egcfda bedgc cabf cea | ecbdg efcgab ebagc bgadfec +edacbg gcfad efdabg bc cgfdbae bdc cfedab efbc beadf fadbc | dbc fcbe fbedacg cabfd +adfgce acgfb bgfadc dgbca fc gfc fgacdbe fagbe bcdf ebagcd | cbagdfe gfc fgbac cgbaed +gdbfec bea acdb ba bcged edabgc gcfaebd afebcg gedba gdeaf | ba fgcebd efgda gadfecb +gd gcda bgd gafbcde bdcfag bcgdf cedfb bgefda eacfbg cfbga | fgcab fdgcba bgacf bfedga +fgcadeb abdgc gce bagec fcbea ge aebcgd gead cedfgb bagdfc | gbdace baefc fdcagb cdgab +fbca aedfcg eagcbd fadbec bdgef fec cf bgcfade dbcef cbade | fgedb bgefadc fc cf +dbgfa feca gfbced cf abfgce fcb cafbg eabgc acdbge edafcbg | abgdf dbcgef geabfc fcb +dbaf fag bdfgea ecbgfa dgbfe fa edacg agcfdbe cefdbg fdgea | fgbaed cdegbf dacfbge gdcfbe +abc acefbd gacedbf gbcde dgabf ca fgcedb cega dgbca cgeadb | ca bcged abgfd bca +ceabgd cgfeb ea aedf gcbdfa cadbf acdfeb abfec eac dgcefba | cgdbafe cea adfe aec +dbcfgae agebc ebgd cebdfa ebacdg deagc be fdecga gbacf bce | deagcb agecdf caefdg cegad +dcaeg gea gdaf befgac cefgd facbdeg dcgbfe ga dagfec adecb | gadf gaedc age cabedgf +bead dagfbe gda bagfec ad egfba ecgfad fdcgb ecfabdg dfgab | agefdc dga bgfea dafcgbe +abcgd gecbfda cegd badfge bcaed fcaeb ed adcgfb gcabed edb | acefb acbgde deb ed +cgefdab dgbcfe gbe beca be fdecga bgcafe bfgda abgfe fgace | bfgda eb gbe bdgaf +age cefbadg bcfea cdagbe begca ag gedfca cbfdeg ebcgd dbga | efbac ega fecab dgba +cgedf fc defbgc cdf fceb dgebf bafgdce eadbgf ecgad gcfadb | cf deabgfc efgdbc fgbcda +bdgeacf bagdef gb becg bcfage cafbg bga fdbac caefdg eafcg | bcedafg cbeg bg gb +dfceb gcdab ecbad gfbdea eab gcbeda bgcdeaf ea abfgdc cgea | baedc egca dgacbe cedfb +gdaeb dgfbc cefg fe cfbgaed gdfeb fadcbg defgcb abcdfe dfe | gdcfba eagdb fe cfeg +abfcedg afgcde acgfd ae bdecga efbcd dea fdgabc feacd gfae | afdcge gaef aefgcd geacfd +beadfg cfdgb fdb agfcbde db abcgfd ecdgf cbagf bafgce bdca | efgcd dcefg cdgfe bd +fagbe fedbcag afbgcd agdfbe age adgcbe ea fead egbcf abgdf | gae cbegf afgdb ea +badfcg fagdc gaf fedcgba dagb acefd dbgcf cgfdbe ag gbecfa | ag bagd bdfgca fbadgc +cfebg gc fcbea dcbafe gbc gcedafb cegdba cagf fbgde baecgf | cg agcf befgc bgc +fegb ecdaf ecb gacefdb eb gdacbf cdegba abgfc afceb acegfb | ebafgcd afdgceb ebc be +adgb cgbae bg abecdg gcefa ecbad dbgfec gbe cbfdega baecfd | badg badg dbag aegbc +ab bfa gbedcaf adbgfe bfecg acefb fgdcae bcad fceda ebafdc | gebdaf edcfag ab ba +ceadbg cd gfdeca ebgfd gdfec dce fegbca ecfag fadc gdeabfc | gfaec gface fdac ecadgf +fbagd egdafb bdg adcefg gbfac daegbcf eadgf bd bfde dgceab | dbfe bd agfde agdef +ebg bgdfe acebdg dcfage abfdge agefd dgbcf eb bdfegac afbe | cdfbg aefb dcagef edfga +bfcd efc bfdcge gbdec bagfe agdceb cf dacgbef bfgec eadgfc | cfe dcbf cgebdf dbecag +cda cefdbg fgeca fdgbeca acgdf bdcgf da deafcb fbgcad bdga | afgbcd cfega gbfcda gdebcf +dcaf cagfb gdacb bgdfca fgaecb ebdag cd fdgcbae dbc bcfegd | cfdegb dc abcgd cbfedag +gabedc dgfab ecdfbg adegf afbc dbagc bacedgf bf fdb fdcbag | cfedgb dgcfab gbfcead dcbga +bcagde efd bgfcd fdecb aefb fe dcfbae gacfebd caebd afecgd | ebcdf afeb ef befa +abfc gcdaef agecdfb cb gacedb cgb gcbdf bdgfac gedfb gcdaf | gfceda bc bdfgaec bdgef +geabc gcebad cgbeaf begdcf gfabe fe bfgda gfe afce ebcfagd | febgac fcea fbcged baecgd +aedfb gbfe acbgde fe fcedgba aef fcadge bacdf fegdab ebdga | fcgdeba afdeb ef fae +gbcfd adfgcb gba dgcbafe agbfde ag cfag fecdbg gbdac edcab | fgcbd bgcad agb bdefga +agfde efgcba gaefc bdcfeg cfe bafc bgcedaf egbac agcedb cf | gebacf ecgafb gfceab cefag +febdc begcd ecgbdf dbacfe bdfagc adgec gbd gb afbdceg gefb | dbg gacbfd egcdfb gfebcd +decfbg dagfb afcgbd gdcfb cbaedf caefgdb da gdca gafeb abd | adbgcef dgafb abd cfbgeda +begcfd bgeaf dcfaeb cadfeg gcdb cadbgfe cg ecfbd cfbge cgf | cg gfc gdcb gcf +ecagdf dfcebg fgbea bg cbeadgf egb ebcafg edfab gbca fegac | bafeg aebfd gcab fbecdag +dgacf abfecg fcgadeb cgd gdbace cgbfa egfda dbfc cdbfga dc | cfbd gabdce dbgcaf egfda +afedcgb afge bfead gf gdfbe fgabed dgcbe dfceab dgf fabgdc | feag cdabef bgdacf gfea +adebgc de bfgacde beafdg egabc egcabf deg cead cbdeg dcgfb | ed eabdgf eadc dbafge +fcdbgae gbacf ebgdfc bcadeg bdgea fagdbe gce aecgb acde ce | cge ecg cabeg efdcgba +aefgcb fedagcb cefbdg ef dcbeg bacdge fegd edbfc fabdc cef | ecbgfd gdef bacdeg bcdeg +geadc gecfad gfcadb eg agdcf bgafce gdef acdbe gea dabegcf | ecfbag gebcaf baecd dfeg +cdeba bd aegcd bfadec ecfab bafd agbfce bfdcge bdc cgebdfa | abcfe agdce db adecg +fbadg faedgc bgdac bcegd bcadge agc gdefcb cbae gdfbace ca | defgcb ceagbd bdgca afedcg +acgfd cbdage agcbd dfa edcfg fa dbcfeag fabc dbaefg gdbcfa | af gedabfc af ebgdfac +dafgbc dfegc dc cgfae cgeafd cdf cagefb ceda bfged fdegcba | aecd cade deac fbged +cbegda dgfeb gefcb aefbgc fdgceb agdfe dgb bd fdbc bdgfaec | dcgbeaf db gfbed efdag +aefbd cdbeagf gd fdgc fgcdab afbcg bdg egfabc bfgad aebgcd | gdfc gadcfeb cfgd fgacb +eb gcbaed aeb fgdecba begd eagdc cadfb eabdc cfgade gacfeb | egdca dcbea bdfcgea be diff --git a/2021/d08/ex2/ex2.py b/2021/d08/ex2/ex2.py new file mode 100755 index 0000000..279b199 --- /dev/null +++ b/2021/d08/ex2/ex2.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python + +import itertools +import sys +from dataclasses import dataclass +from typing import Dict, List, Set + + +@dataclass +class Entry: + signals: List[Set[str]] + outputs: List[Set[str]] + + +def solve(input: List[str]) -> int: + def parse_entry(input: str) -> Entry: + signals, outputs = input.split(" | ") + return Entry( + [set(s) for s in signals.split()], [set(o) for o in outputs.split()] + ) + + def deduce_signals(entry: Entry) -> Dict[int, str]: + _1, _7, _4, *signals_to_deduce, _8 = sorted(entry.signals, key=len) + signals = { + 1: _1, + 4: _4, + 7: _7, + 8: _8, + } + + for sig in signals_to_deduce: + match = len(sig), len(sig & _4), len(sig & _1) + + if match == (6, 3, 2): + signals[0] = sig + elif match == (5, 2, 1): + signals[2] = sig + elif match == (5, 3, 2): + signals[3] = sig + elif match == (5, 3, 1): + signals[5] = sig + elif match == (6, 3, 1): + signals[6] = sig + elif match == (6, 4, 2): + signals[9] = sig + else: + assert False # Sanity check + + assert len(signals) == 10 # Sanity check + return signals + + def deduce_entry(entry: Entry) -> int: + decoded_signals = deduce_signals(entry) + + res = 0 + + for output in entry.outputs: + assert output in decoded_signals.values() # Sanity check + + for n, signal in decoded_signals.items(): + if output != signal: + continue + res = res * 10 + n + + return res + + entries = [parse_entry(line) for line in input] + + return sum(map(deduce_entry, entries)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d08/ex2/input b/2021/d08/ex2/input new file mode 100644 index 0000000..a5bf9d9 --- /dev/null +++ b/2021/d08/ex2/input @@ -0,0 +1,200 @@ +badc bd dbeaf cfdbge dfb cfbdea efbag edcfgab dcafe degfca | eacfd acdfbe cbdegf fcbaedg +cd fdbac egcfab gbadcfe cfgdeb cbadfe deca cdf dfabg abefc | dcf cfbad gbafced fcd +cg agecfb cbg eabgfdc egdc fdgba bafecd cbdfe bfcdeg cfgdb | efdcb adcfeb fbdcg gbc +bfceg gfadb dbcfgea bgaef efad abe bcdgfa ea fbdgea agecbd | eadf ceadbg abfge fecdbga +gdcafe eacb adc gbfda afdceb edgbcf badfc ecgbafd ac fdbce | ebfcd cefdab bdfgeca egbdacf +aefbgd fbdc fbecg egdcb edcbag bf gcefa fbedcg bagfced fbg | afgce cfbd bdcf geafdbc +ebgacd edacg gcdeaf cabfg dbc bd cdbgaef ebad fecgbd acbgd | dgbac db caegbdf gcbfa +defbga gead ge efagcb gdafbc cegbdfa egf bfdce bgdef dgabf | gef eg bfcdag ge +bae adcgfbe cdfeag ab dcgeb bfdage agecb cagfe abcf bfcaeg | bae aeb agfceb afceg +ae adefcb gaceb gadceb edag efadcgb badgc cfgbe cadbfg cea | ceabgd fbeacdg aged aged +aegbdc dbegfac gcbaf df febd egdafc deabg gdf gdfeab adfbg | bcdegaf dfeb bcegad df +aegcdfb becdaf gdecf ag fag dcfgba badg fcbad cdgaf acefgb | abcdf cefdab ga ga +gbcfad cefadg cegad aefdb gedacb gcfe fc cfbgead cfade caf | degac egcf geacfbd afc +bcfad afcdbe fd ecfba cfd afde cfeabg gcbfed dacbg fdgabec | cafbged edfa fcd dabgc +afdc adbfe bgecfad ecagdb dbcafe dfe fd agbfe bdace gdbfec | fadbe efbdgc fadbe edcba +bdface geba ecbdag acegd afcdg ge eadbc bfecgda edg fgbdce | eg abge fadgceb abge +fagbde fcegbd gec efcdg fdgbe ebfcag gc adcfe cgdb cagbdfe | defcg cbgdfea gcbd ecfgd +acfbg debgf gfcdba edcbfa fbdag fgbeca cfbagde gadc da bda | dacg acbgf cedfgab caefdgb +ca dfegca edcbgf gfcde aedbg gfdeacb dcbfea facg dgcea ace | fedcg fdagec cea ac +acdf gcfde debcga ecbgaf cf ebgdf bagfdce cedag cef gedafc | dgcbea fc dcgeaf cdaeg +ebagf cabgfed ed cbgad afcbge afdbge edg eagbd cedgfb aefd | fcgdbe de cgbeaf ed +fbcdeag cafbd fgcbea fdgacb daecfb cg gca defga gbdc fdcga | abfcged agc acfgd cbfaeg +dacfe ed ebdcag gcadfe dfbcaeg dce dfeg fbcadg bfeca acdfg | fcbdga gcbade aegdcf fbcgda +cfdegb cbef fgdec gdfbca gdecbfa egfdca bc gbc cbegd aedgb | befc bc abegd ebcdfga +agcefdb fdbg bf bdafe gdebaf eafdg acdbe gcebaf bef edcfga | bf fdbg efdab gefda +gcb bdcgef dcbfg bg edbg facegb cbedf edgafbc dfgca edacbf | gb cdebfa deagfcb bg +eafbg gfad afegbd caefbg befdgc ebagd gd bdg cfbdage acdeb | gd geafb cabed dbg +bcedfg dc dgc aedfbcg acgbed bgfead gedbf bfdcg cedf facbg | gabfed cdebag dafegb cd +fa adbceg afecd cafdbge eacgfb daegcf aef bcdfe fdga daceg | acedf afe fae afdg +cdfaeg agcfb bcdgea dcafeb cef fabec ef dfgcbae defb eabcd | gdabce fdeb ebdf ecf +cdefg ceafg gebfd cdg dc efbcdg cdgbea cfedbga cbfd fdagbe | fbcd afdgbe fabedg dcfb +cdafgb egdb fecgabd cbfdg fcbedg feb acefg begcf be dacebf | be be ebfdca abgfcd +eafgcd facegb acb cdbfaeg fagec dgcabe baefd cgbf cb afecb | bcafeg fcgb gfdeac eagcf +ecgdfb deb edfgab eb faedcg agfed bfaed dbacf gbae efgdcba | fabde eb ecdgfb eabg +aefbg bdegfa gacdb gefc fbc fc bfdcae gefbac cbfag dbgefac | ecfg fc cfge efgcdab +gcfbed gcbae dcaef cbegad bdag bgeacf adefgcb deg adgec gd | agcbde bgad gdbfec gcfabe +dfacb egbcda dac agdcfb fecab adecfgb bgadf cd fgeabd cgfd | gabfdec acd dc dc +bfecg dcgeab af gadf aedbg caefdbg bgfade bafeg abf eabdcf | ebcfg gafd ebacfd fgbdace +ge fdeab gcebfda fadcg fgead abcdef eag ebdgfa acgbef dgeb | cdagf cfdgbae fdeab eag +dba dgfceb fbcegad bagde bcdeag bcedg bdafce agfbe ad cgad | bdcafe agdc ebdcg cdga +edfg fedac fbegcad acgfe fabcd ead bgefac de daecgf bcaged | bafcd ade bacefg fdbac +gdecbf edabc ef fcgead fcadg bdcfga fec ceadf dgaefbc agfe | faedgc ef gabfcd fe +deafg eb egbaf cadegf fcdeab degb bcgaf bfe bfcdega gefdba | abgfe eb gfdaeb efdcga +fabcd beadf efabgc fc cafdgb gcfd adfcgeb abgdce cfb dgcba | dcgf bdcgaef gdcf cfdg +ebac acedf ceadfb cfe dbcgaf ec efcgdab degaf abfcd edgbcf | ce edgaf dgbceaf fce +ecbag fg gacdfe edafgcb cgefa eacdfb deafc bdagcf gcf dgef | fged gedf cefdga cabge +dgebc bcg cg gdeabf cgfeba gdfc gefbdc adbec bdefg fgcdbae | begdf cfgd eadbc gbfde +aefdb ecgb dgaeb agdbce ega fgdacb bcadg cbdeafg ge edacfg | age fcbdaeg gea bcfegda +cdeabg fcgda bdagc acfb dfa af cdeabfg efdgab fbcgda decgf | bcagd cfba gedfc af +ceadb caebgfd bdfaeg cbgaf ge ega gadcbf gfce ebgcfa gebca | aecdb febgcad bgcaf fadcgbe +daegb gfdae ceagfd bgfade feagcb fbgd bg cbagdfe ebdac ebg | gefbacd dbgf geb adgbfe +ecadfg acdfb aefgc ecbfdag dce cfbega fcdae edga gbecdf ed | fcdba ced egfcba dega +defgbc cgdea efag fdbcgae acbdf gcdaeb fe dfcega efc defca | fage fec dcafeg ecagfdb +bg dbcafg gdafecb dgfcae defcg gebd cefgb bgfecd fbaec fbg | gbf dfgec bedg cfdgae +ebgda ebd adce cdgaeb edfcgb bcagd agdcebf ed agbef gcbfda | efagb gbefa dbcfgae eadc +ebcfdg dbe de cdabgf fgdab dgae aecbf abfgced edbaf eagdfb | bface cdafebg gadcefb fedab +agc dabcge agbcd cabe dbagf cfgeadb gecafd gbcdfe ac gbced | cbegd beac dgbce ac +fdagb bdeacf fga eagd gcfdb gecafb ga feabd abfgde dcbfega | bdafe abgcfe gbecfad abdgefc +fbecd dbaef bdgc debafgc daecgf ebfcgd ebc abegfc bc gfced | fadecbg cb cdgeaf bfade +fagbe aebfgcd gef bgadf cbagfd deafbg cfdeag ge begd beafc | bcfadeg edbgaf fcgaed ge +gabfc gabde fbdga bfegca agfbcd df cdfagbe dcfg caefbd dbf | decfagb bdf gfcd fd +bdafeg gf gbadf gefb cgefda daecbfg bacfed cdagb fdg fdaeb | daegcf eagdfb adgcb bagfed +dafegb efdac bda fgedbac egfcdb bgfa fbaed bgdef debagc ba | ba bgcead bad ab +cfged cbegdf cb ecgdb adefbcg fdcabg cdb cdagef efbc gedab | bc gdebcf gecdb bagdcf +fbegcd gcedba eba acegf dbfa efbgd ebfadg ab fgceadb bgfea | fgbae gbedcf degfb agdebc +ceadf fdacbe ef edgafb dfe bgaedc cadfg bcef cfebgad ecabd | cafde fabedc debac eacfd +cd dgafe cbgfae decfg cfebg cfd gdbc febgdc fbegacd fceadb | dc beagfc aebcfg gcfeabd +adcefbg caefgb bafd dface bdcfe cegbd fbe gdfcae dceabf fb | efb ebcgd gbdcaef fb +fbdg gebac degbfc gd dfeagbc decfb gcd dafgce faecbd bdgec | gfdcae gfdb dg afgdce +fb fgedca fbe gfcde gcbfde dbceaf bgeca eafbdcg dgfb fbegc | fbe cbdegf bfe gedfc +acfbe fcbaged bgdcf cabgfd ag cagd fcbga bcfegd gfa eadbfg | afgcb gbdecf efdbcg fag +fbegc dgca dfc fagbedc bfadcg dc ebdfca fadbg cgbfd gfdbae | dabefg egdbaf gaebdf dc +cdbgf bdfaeg ca fgcab dgacfbe feac facgbe ebgcad bca gfbea | dafbeg cab cdagbe debfga +gfbe ebcfag bcedaf be egfac fegdca gebca eab cbgad gfacdbe | dabcgef bcagfed gcfea bea +bdefacg fbgedc efdagb beg geabf eg dafbce dage gfabc eabdf | gead gcafb ecfdab egfbdac +gd gfecbd dacefb dgbf cdegf acfge agbfced becdf aedbgc gdc | gdcef cgbead gd gefacbd +cgbfea cafed dbgefac gacb bc afbge fdabge efbac bcfgde cbe | gbac fcdbge agcb aecgdfb +abgefc cfeba gcdba fgdcea gf fcbgaed eadfcb gbfe fga bacgf | efcba fabecd dgcbfae eagcfd +gcdbfe fdec gcfdb bdfeg de efgba cbgdafe afgcbd cgdbea ged | cedgbf fced agfcdeb cgfbed +dbacfge cafdb gbcfea aegc afbec ea bae bgcedf befgc edgafb | dfgeabc bfgcde faceb fbecag +bfcgad bfegd fg dcgeb egaf bfedcag efabdc dfegba gfb abefd | gf abdgcf dcbfag fgb +degab dgebac bfdeacg cadeb fbdeac bag debgf cgda abgecf ga | dceba fdbeg edbac dbacfge +abdef gcbead bgce cgdab deg dgcbfa aedbg fbacdge eadcfg ge | cgfdba gcafde agfcedb fdacbge +defabg cabdg gcfed cabe gbeacd fgadbc eb geb aedcfgb bdgce | eb dbegc dfecg dbecag +egdabcf edcgb bcedgf cgb bgfe fcgabd bg acgfed cbaed dfegc | cgb gbc egcfad degbc +fe agebdc gfbead fcdea abecgfd bafcde beacd cbef def cgfad | dabgfe fde adfcg bfgead +ba fcabed bad dgacf dfgecab dcgba gdecb bdgcfa abgf caegfd | gdecb dgcfba gcdafe afbedgc +bdgef cdbgfa acbed gedcfb efdgba cg abcgedf cgb cgdbe cfeg | edabc ebdca edbcg ecgf +edfba bcfgead cbged defbcg ag gfadce gcaebd edabg cabg dga | fedagc bcag bdegc gaebfdc +edab fed egcfb ecgbfad fegbd fagdcb degcaf afgebd gabdf ed | def gdefb fgedb edcagf +fc ebfgda ebcfd cabed gcadbf baecfdg cgfe fdc egdfb gdecbf | defbg aecbfdg cadbegf adgfbe +bgdfc fgc fdegb dgecfb fcabd egbafdc gc dgce gabefc gedbfa | fbdgce gc dbfegca cg +bgedc ged gdfcea dcefb cdabg bgfe defbgc bdecaf dcgbfae ge | badefc gbfe cbegd fdagbce +cdefga cgdafeb cbe becdg gdefc cfbg cfdbeg cb febdac edgba | edbgcf abecfd ebgfcd fgbc +de aegcf agedcb afegbdc edbf fbdga facgdb gdaef dbaegf dea | cdabgf ead afgbcd edbf +cfagde eagfbc cbegf cg fcaegdb ebgfd gcf dafebc efabc acbg | bacfe fgc gcf cg +gadfce fbcaeg bdag eba bedcgfa dcfbe ab ebdgca ceagd ecabd | eabdc badec cdaeg dagb +aedb ebcagf fdeac be bdgfc eafbdc abcfegd aefgcd feb ecdfb | fecbd adeb be bfe +dg fgdecb dfecb fdcgeba gedcb gceab fdge cgd cgdbfa baedcf | ecbgd cagfdeb dcbfeg gd +fgcead bfdcag gecdf dfeacb dce aged gcbfe dcfgeab ed fgcda | cfegd de gcafd gefdc +dbec eafbdg dafegc eac gbacf decagb bcgae bdgea gbcefad ce | becag edgab cbadgfe edbc +gefcab agbdc febd bcegd de ecbfg afgdce ebafgdc dfebgc egd | de gdecfba edbf cdegb +abdcefg fbdega dcfag bd fegba badgec fgadb edbf fgaceb bdg | acdfg fagbce adcfg abgfd +ag agdb bfeag fbgdace bcfeda dgafeb egafdc begfc dfeba eag | ecbfg agbd dabg bfeacd +dagc dae fdaec edcafg fbadeg cgefa abcgef ad dfecb fdgcbae | eda eagcbf agfec debfc +ead beafd dfagb faceb bfedca facegd aefcbg cbed ed gfcbaed | abgdf eda agbfce ead +afdgb eabcgf dfgbe fecdgba dagceb gfa cafgdb af cdfa abdcg | abdfg dceagb decfagb fagcedb +dbcfga cb acb gcbafde fcbg egbfda dceaf gbfda dcfba cdbgae | fcadgb cdefgba agbfd cgfb +gceb fcgba cefdba caebfdg egfadb eagfcb cb beafg acb gfacd | abcedf bca gfcda bcge +eabdc caebf ad dgabcef fcaedg cfegba deacbf dabf dca begdc | dbgce dbfa fgebadc acedb +fbgce ec gcea dafcgeb fgbed fec adgbcf abcfeg fcbga cfbade | cbdfag ebgfc fgcbe agbfdc +afcg afebcg becgf fgadeb bdgaefc fa afe acedb abecf gdfebc | fgecb eacdfgb ceabf cgfa +fb gadeb aegdfb abgfe fab dfgb adfecbg bcaegd ebdafc cafeg | becdfga bf fbadec bgfd +ab dgafe fdaeb adb agcedf ecbfd agfb caedgb bdfage egfabdc | fedbc dfecag afdcge becfd +bgedf dgecfb fae gbaec fa cedafg dcabfge gedfab gafbe fbda | fcgdea geadcfb efbdg fa +cgfaed fdebg fcgabd fcegb bd dfaeg gfbeda fgdceba edba dgb | db ebcgf fgcbe edgfa +fgc egcafb dcgb fagdb bedafgc cdbgaf fedac cg gacfd dfbage | febgad cgfaeb fadbg gc +fdaebcg deabgc bfdeg dfcaeg efcgd cdaf cfbeag fcg cf cgeda | bgefcad bgdfe dafc ebagfc +egcfad dbecf cbgf fbe aecbd bcfdge dfbgea aebgdcf ecfdg fb | cgfb gecfd gefacdb fbcg +cdb adcf gbcdae bdceaf dfaeb cdfeb febgc fgedba cd cgdafeb | eadfb fcgeb cbedga bdacge +gd dacg gbdafc gfbdc bdegaf fbgca cbgdefa cbafge edfcb dfg | gbcafd dgac dgcafb cbfgae +cbf dafeb fbceag bc egbdfc edbgafc fbced ecdfg cdgb gdafec | bcf dbfea ebagcf gadfcbe +dcebgf eagfc aebfcd edcbg baefgdc fd cdefg dgaebc fde bfgd | ebagfcd acgefdb fagec gbdaec +afgdc bagec bdfg fb ecgdbfa fab dfecga bcgadf dcafbe bgafc | afgced fb dcafg feabcd +gef febag ebagc egcfbd fg cafg abfde abcfge afcgebd ebcgda | egf gaebf dfeba gadbce +ag cdeafg gdbfce daceb acgf efgbda adg cegda gaedbfc efcgd | debac eadbc bgaecdf cgbaedf +acefdbg debgac ecdgf ead facebg eafgb ad fedbga bfda eafgd | adbf eagfd eabcfgd ecagfb +cd bafegc fgcaed fcaeg dgc fdcag agdbf fedc gbadce egdabcf | fedbcga bgafd fcde cfed +decg egf ecgbfa degfa edbagfc dgcabf cdfag eg fcaedg faebd | gcadef efadg egf eg +feacbg cgfadbe efb efbga dfagb eb aefgc bgec cgedaf dcebfa | eb be be fbe +begc eacfdb dfacg agcfe ce eagbf eac eafdgb aefbcg dfgaecb | ce ce ce gbce +dfeagb dgaeb dbagefc gbcfae degf decba cbgdfa bgfda eg gae | ge agfdcbe bdace fdeg +cgdab cegdbf cfbad bg aegb caedfg eacgbfd dgb dgaec gdbaec | gbea eacgd gb cgaebd +ag ecdgbaf edcba eagcd aeg gcfa dfcgae egcdf gfdeba fcgbde | fgeadb dacge fdagceb egafbd +fdbgec bge fdacbe bfdga edfgb cbgaed gefc cefdb ge baegdfc | ebfgd gbe begdf eg +cedafb gdab fgced cabdf fgbaecd dcbgf gb bgc gabfdc ebfgca | bcadgf cbfda cdgfab agdb +fdcbg bgface ecdabf ad fgcbaed gcefad dac efgac cfagd daeg | dcfabge edga ad gcfea +bce gaecdb aefc bedfgca acbfge aebgf fbceg defgba dgfcb ce | ceaf ce bfgce ce +gefadc gefadb agd ebfcdag dbeg dfagb abfed gafcb dg adbcef | fbgad bged gd cfebda +dcfge egdbf adcgf bafecgd ecd gdfeac bdecaf ec cfgdab cage | acge dacgf facdg cgea +bagdec gecdfba gdabe deb eabc be acdgfe afgdb deagc gdecfb | aebgd cgdea adbge eabc +gebca bedgaf ac gcbeaf bcagedf bafge egcfda bedgc cabf cea | ecbdg efcgab ebagc bgadfec +edacbg gcfad efdabg bc cgfdbae bdc cfedab efbc beadf fadbc | dbc fcbe fbedacg cabfd +adfgce acgfb bgfadc dgbca fc gfc fgacdbe fagbe bcdf ebagcd | cbagdfe gfc fgbac cgbaed +gdbfec bea acdb ba bcged edabgc gcfaebd afebcg gedba gdeaf | ba fgcebd efgda gadfecb +gd gcda bgd gafbcde bdcfag bcgdf cedfb bgefda eacfbg cfbga | fgcab fdgcba bgacf bfedga +fgcadeb abdgc gce bagec fcbea ge aebcgd gead cedfgb bagdfc | gbdace baefc fdcagb cdgab +fbca aedfcg eagcbd fadbec bdgef fec cf bgcfade dbcef cbade | fgedb bgefadc fc cf +dbgfa feca gfbced cf abfgce fcb cafbg eabgc acdbge edafcbg | abgdf dbcgef geabfc fcb +dbaf fag bdfgea ecbgfa dgbfe fa edacg agcfdbe cefdbg fdgea | fgbaed cdegbf dacfbge gdcfbe +abc acefbd gacedbf gbcde dgabf ca fgcedb cega dgbca cgeadb | ca bcged abgfd bca +ceabgd cgfeb ea aedf gcbdfa cadbf acdfeb abfec eac dgcefba | cgdbafe cea adfe aec +dbcfgae agebc ebgd cebdfa ebacdg deagc be fdecga gbacf bce | deagcb agecdf caefdg cegad +dcaeg gea gdaf befgac cefgd facbdeg dcgbfe ga dagfec adecb | gadf gaedc age cabedgf +bead dagfbe gda bagfec ad egfba ecgfad fdcgb ecfabdg dfgab | agefdc dga bgfea dafcgbe +abcgd gecbfda cegd badfge bcaed fcaeb ed adcgfb gcabed edb | acefb acbgde deb ed +cgefdab dgbcfe gbe beca be fdecga bgcafe bfgda abgfe fgace | bfgda eb gbe bdgaf +age cefbadg bcfea cdagbe begca ag gedfca cbfdeg ebcgd dbga | efbac ega fecab dgba +cgedf fc defbgc cdf fceb dgebf bafgdce eadbgf ecgad gcfadb | cf deabgfc efgdbc fgbcda +bdgeacf bagdef gb becg bcfage cafbg bga fdbac caefdg eafcg | bcedafg cbeg bg gb +dfceb gcdab ecbad gfbdea eab gcbeda bgcdeaf ea abfgdc cgea | baedc egca dgacbe cedfb +gdaeb dgfbc cefg fe cfbgaed gdfeb fadcbg defgcb abcdfe dfe | gdcfba eagdb fe cfeg +abfcedg afgcde acgfd ae bdecga efbcd dea fdgabc feacd gfae | afdcge gaef aefgcd geacfd +beadfg cfdgb fdb agfcbde db abcgfd ecdgf cbagf bafgce bdca | efgcd dcefg cdgfe bd +fagbe fedbcag afbgcd agdfbe age adgcbe ea fead egbcf abgdf | gae cbegf afgdb ea +badfcg fagdc gaf fedcgba dagb acefd dbgcf cgfdbe ag gbecfa | ag bagd bdfgca fbadgc +cfebg gc fcbea dcbafe gbc gcedafb cegdba cagf fbgde baecgf | cg agcf befgc bgc +fegb ecdaf ecb gacefdb eb gdacbf cdegba abgfc afceb acegfb | ebafgcd afdgceb ebc be +adgb cgbae bg abecdg gcefa ecbad dbgfec gbe cbfdega baecfd | badg badg dbag aegbc +ab bfa gbedcaf adbgfe bfecg acefb fgdcae bcad fceda ebafdc | gebdaf edcfag ab ba +ceadbg cd gfdeca ebgfd gdfec dce fegbca ecfag fadc gdeabfc | gfaec gface fdac ecadgf +fbagd egdafb bdg adcefg gbfac daegbcf eadgf bd bfde dgceab | dbfe bd agfde agdef +ebg bgdfe acebdg dcfage abfdge agefd dgbcf eb bdfegac afbe | cdfbg aefb dcagef edfga +bfcd efc bfdcge gbdec bagfe agdceb cf dacgbef bfgec eadgfc | cfe dcbf cgebdf dbecag +cda cefdbg fgeca fdgbeca acgdf bdcgf da deafcb fbgcad bdga | afgbcd cfega gbfcda gdebcf +dcaf cagfb gdacb bgdfca fgaecb ebdag cd fdgcbae dbc bcfegd | cfdegb dc abcgd cbfedag +gabedc dgfab ecdfbg adegf afbc dbagc bacedgf bf fdb fdcbag | cfedgb dgcfab gbfcead dcbga +bcagde efd bgfcd fdecb aefb fe dcfbae gacfebd caebd afecgd | ebcdf afeb ef befa +abfc gcdaef agecdfb cb gacedb cgb gcbdf bdgfac gedfb gcdaf | gfceda bc bdfgaec bdgef +geabc gcebad cgbeaf begdcf gfabe fe bfgda gfe afce ebcfagd | febgac fcea fbcged baecgd +aedfb gbfe acbgde fe fcedgba aef fcadge bacdf fegdab ebdga | fcgdeba afdeb ef fae +gbcfd adfgcb gba dgcbafe agbfde ag cfag fecdbg gbdac edcab | fgcbd bgcad agb bdefga +agfde efgcba gaefc bdcfeg cfe bafc bgcedaf egbac agcedb cf | gebacf ecgafb gfceab cefag +febdc begcd ecgbdf dbacfe bdfagc adgec gbd gb afbdceg gefb | dbg gacbfd egcdfb gfebcd +decfbg dagfb afcgbd gdcfb cbaedf caefgdb da gdca gafeb abd | adbgcef dgafb abd cfbgeda +begcfd bgeaf dcfaeb cadfeg gcdb cadbgfe cg ecfbd cfbge cgf | cg gfc gdcb gcf +ecagdf dfcebg fgbea bg cbeadgf egb ebcafg edfab gbca fegac | bafeg aebfd gcab fbecdag +dgacf abfecg fcgadeb cgd gdbace cgbfa egfda dbfc cdbfga dc | cfbd gabdce dbgcaf egfda +afedcgb afge bfead gf gdfbe fgabed dgcbe dfceab dgf fabgdc | feag cdabef bgdacf gfea +adebgc de bfgacde beafdg egabc egcabf deg cead cbdeg dcgfb | ed eabdgf eadc dbafge +fcdbgae gbacf ebgdfc bcadeg bdgea fagdbe gce aecgb acde ce | cge ecg cabeg efdcgba +aefgcb fedagcb cefbdg ef dcbeg bacdge fegd edbfc fabdc cef | ecbgfd gdef bacdeg bcdeg +geadc gecfad gfcadb eg agdcf bgafce gdef acdbe gea dabegcf | ecfbag gebcaf baecd dfeg +cdeba bd aegcd bfadec ecfab bafd agbfce bfdcge bdc cgebdfa | abcfe agdce db adecg +fbadg faedgc bgdac bcegd bcadge agc gdefcb cbae gdfbace ca | defgcb ceagbd bdgca afedcg +acgfd cbdage agcbd dfa edcfg fa dbcfeag fabc dbaefg gdbcfa | af gedabfc af ebgdfac +dafgbc dfegc dc cgfae cgeafd cdf cagefb ceda bfged fdegcba | aecd cade deac fbged +cbegda dgfeb gefcb aefbgc fdgceb agdfe dgb bd fdbc bdgfaec | dcgbeaf db gfbed efdag +aefbd cdbeagf gd fdgc fgcdab afbcg bdg egfabc bfgad aebgcd | gdfc gadcfeb cfgd fgacb +eb gcbaed aeb fgdecba begd eagdc cadfb eabdc cfgade gacfeb | egdca dcbea bdfcgea be diff --git a/2021/d09/ex1/ex1.py b/2021/d09/ex1/ex1.py new file mode 100755 index 0000000..cf7d7d6 --- /dev/null +++ b/2021/d09/ex1/ex1.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import Iterator, List, Tuple + +HeightMap = List[List[int]] +Point = Tuple[int, int] + + +def solve(input: List[str]) -> int: + height_map = [[int(c) for c in line] for line in input] + + def neighbours_of(point: Point) -> Iterator[Point]: + for dx, dy in (-1, 0), (1, 0), (0, -1), (0, 1): + x, y = point[0] + dx, point[1] + dy + if x < 0 or x >= len(height_map): + continue + if y < 0 or y >= len(height_map[0]): + continue + yield x, y + + def is_low_point(point: Point) -> bool: + for neighbour in neighbours_of(point): + if height_map[neighbour[0]][neighbour[1]] <= height_map[point[0]][point[1]]: + return False + return True + + def risk_level(point: Point) -> int: + return 1 + height_map[point[0]][point[1]] + + points = [(x, y) for x in range(len(height_map)) for y in range(len(height_map[0]))] + return sum(risk_level(p) for p in points if is_low_point(p)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d09/ex1/input b/2021/d09/ex1/input new file mode 100644 index 0000000..c6f7fd9 --- /dev/null +++ b/2021/d09/ex1/input @@ -0,0 +1,100 @@ +9876543298765698956789545678992103976545976323678910997879876432123679765323567894679434987654596521 +7998789129854987545697658789789212985439765454567899876568976569012489874212779943598929976653987432 +6429898934943496434589769894658924976929898765679969965345698798923456976433567892456998765432196543 +5210987899874987645678979943547895989899989898789357893234599987894678986547678901349899896563987656 +4329896798765797657889989652126789998798967999899969954345989876789989797698789316498766987854598787 +5498755679876798968997699643015678987676759899999898965959878965878997649899899997987654298976689898 +7987834656997899878976578932123789998545745799998787899898767854567998798965969898999743109987789999 +9896321345698998989965489543456999867623234567897676789789854343456799987654358799298654312398898989 +8765430234999987697896789654567899954310123456998545785678963212567898992101245690129796453479987978 +7654321345899986576997999876778978965421236567895431234789654345678957895212767789298987894567896669 +9785532456799765434989643987989569877654345878976544345698765456789548954329878999987798979878975456 +9876743767987654323679932198995476988765456989987655466899896787891239765434989989865679654989764367 +0999899878998743212567893999674365699986567898998767877894949898962678986676799878654589943499876458 +1989998989987654501457899876543234799897679987859878988943234999853467897897899867723457892398976567 +9879867991099865212345789989656125789649899876545989999654345998765679998998987654012349910987987989 +8768756689987654323456897298743239891234989765534597898798759879876789569989998632134598929876599096 +8653344578999865784587976349994345910199878964523456789929898764987893498977987545245987999965432145 +6542123469764986895678965499879966899989867893212345698939987653498902987856798767959876989996543234 +7752056778953497898789878987769899998767656989101234567898765432459919876545689878998785678989654546 +9854145789101298989899989876545768989654545679914348978997654321347898765434799989679654545678965687 +7543236993212349878998998765432459876543234567895567889459865432456987654323988995498763234589896789 +7654747894523498767897999654321345998769102678976988992398999545767899765499867894309982123456789999 +8765678965654976654456899865210236799898993589987899101987978996988979876987658989219873256798999989 +9876789998799865432345678994321346789987889998698978919876456789699767997996545678934965345789789778 +4987899989891974321234789986545456899876777897569567898765347897432356989987439789549876956797674567 +3298978978910985445445891297669767998785656789423456789653298976545469879876598999656989897896523456 +3129469568899876656566990998798978989654345893214567898764989897656798767987987988978998679999314567 +2012395436789987767678989899987899876543212379201879969889978789987987656799876877899976567898901238 +2193989325679898978989579768976789965432101268912989456998965678999896547898765656999875456567895449 +3989878934589769989793498959895689876743412347894592347987854567898786434569654547989765345478989567 +9978968895699654997652987645784789987954523456789693469876432457897654321298763239876543217345678978 +8867846789898969876543498732123678998766634787899989978994321367999865432598654567987982101234589989 +7654437999987899989754989643034567899898745678998767899989993479899987543498765678999878212345678997 +6542323899876789598769876542137878987999859899987656798767789598789897655679986799698765433456789876 +4321016789765679349989987756756789876789878910199545987656698997655789796789997894549977567567898765 +5633225899954598956799899867897897765689989429298769876845457986543456989899898943534988978678979987 +8764334567893487897898789998998976454568997998999998765432356978532349878956769892123499989789459998 +9875765789932346798997634569989432323467996987999989887845779865431234669545458789012943299892398989 +5987876894321457989989429979874321012399875676889876998956889978560123458932345699129892109901987878 +4598987899430349979678998899965456133987764545778965698768995989999294567890458798998789298319876567 +3219399978921298767587897679876967845976543234667894539878954399878989698921239997987699987423965456 +4301234567932987656456796567989878956965432133456793124989876498767878999432549876796589876539874347 +5412345789743597542345895434593989869874321012349891013999999987654567898643498765987678987698765458 +6523656897654987656556789323901299998765442123457999229878987896543456998789569979998789498789876769 +5439787898765698787667893219892398999879543434568978998767986797855669999897689989879899349999987899 +7656898919896789899878954398789987999989698545679567893457895498966798986998789394567988998789898989 +8967999323987897976989765987679876889998787686893467892124789349997997895429893233459867999698769678 +9698999934598956795499899876598765778999998797912349951015689123989876796210932012399756896569954599 +6549387895999987989323902965439874355698789898909498932123478939876765989929993243987646789459893989 +6321236789898999878919999876323943234987676989898987993234567899965434567898989349998789894398789878 +5433345998797898767897889987213495349876565677797656789446889999876515698987678998999899965987698767 +6985469899545989654665678999901989498765434545698768998658992398965106789976567987898999987976569656 +7876798795439876543234889569899878999876323434569979569769321987654345678989456976447688999895498767 +8987987654321989754015679499798767898983210128789989498999210398765656789654319895323567998789349878 +9098999876510199863126789987652358997654321247899796987578931239976768899965498789212348987679257989 +2129998995431239765257891099543768998765432656789545995467892946988979987896796568901236896578998996 +3679976789542398954348999198959879999876558767893239876567899897899989896997987699322345985456789125 +4599865679954987895459998987899989987998769879992123987678976789976799765989698789533959876348993234 +5989234567899876799567897956789890196549878989789544998989765678965698943476569897659896987257899345 +9976123456798765678989986844456789987698989395678959899895454567894567892565456998998765432125678976 +8765277567987654569998765432349999898987693234569998789654323456923478921012345679539854321034567897 +7654356679599987678999654321267898789965432145698987678943210147898569543235789794323969834245688998 +8765467989459899789998874210158999679876541016987894599964521234997679659347898989019879765766899899 +9876579894398789899987654332345696567987662929876793488895435349898989798959987879123989989877899787 +3987698789298678967998965453456789349898799899985932376789655456789599987899976768934599999999989656 +2498987679976543459019879867899892198789987789984321245698767567893498876789895457995678999878767938 +1349876567895432398999989988957989987679876698765540356789878678932987545456789346889789998767656899 +0198765456789321256789099899545678976598765549854321456899989799891095432347993275678992987654545789 +1987674345699592345679129654334688965499994321965545567998999896789194321236892164568921298543237898 +9876543234598989456989298743212567894389986539876667679567954965678987210235791013569432987654568956 +5987621023987679867895497652101345789579876547988798789678942134567976521256789123456943498765678945 +4997732654976598978996598764212345678989989656799899899989653655679876432345898235597894569876789534 +9876543459865467899987987654325766789799999789899965957899879769989997543456797546678965778989899325 +4988654598764348998998999766434589994598999898998654345678998998799987676567897667799796989999998934 +3298797679974245697999429887847893212987898987987434234789897567688999789878998778945689998999987896 +2129898989765134976878999998956789109876987656896510123498765434567899899989469899434567897898756789 +3298959398754299865757889979767899912985436445689323234569854323776789998794357986523479956989434599 +4987643239965987654345679869878999894976721336578935446798765612845899987654219875612396549876526989 +9876543129876799765234889754999998789987530123489976557999976701234599998764329874323489932987789878 +1995432035987999832123598932101989699998432236599987698999964312345678989876598765435567893499898767 +3989654124599898641034567893219876568999543445679998899989899423456989879987699897576789965689989656 +9878965435698765432155678965898765432987657656789999999875678954567999765698989998798999986789878543 +8767896776789986749878789896799987621298767767899899989654579765678989854799878999939998997898765432 +5456789987899987856989896789986798532349898898965778976543459879889875423999967894321987898969987643 +2345678999998998767998945999965987643656929969434569198754678992994989567898656976439876749456898765 +1234589923457899879987899889894398784789019654323691019867899921012398978997645897899985432345679876 +2365699894578923989875987676789249895899998766513589129878987892124987899876536789999876521236789987 +5456789689989012399954298545892134976999899895405678934989656789439876987654324679998787210123996798 +7687893578899234569895987699976549899999789984312389545694545696598765699765312567899654323245695459 +9798932345688965998769898987898799768987698765423578999943234789987674198653202469998765534367789568 +9899321234567899899654679876789988657899579877567678987890125679876583019765313578929878946978897679 +3976532345678945798753498765698976545986467988678789876789236798989432123984323489212989897889998989 +2987645456789659987654579874987654324985358999799899765698945987998943439876534794343598789999999990 +1298756569898798798765989989876543219876469999899988954567899876587894646987645679654987678999889891 +2349869698999997659877996593987655424976567895999876543456998765456789656798789789769887567998768789 +3567998987898989541988987432998966565987678934598765432567899854345699787899899899898765456789657679 +7678987676487678932399998949899879677898989323459876554678998743234678998976989944999854346996545568 +9899878554345568943567899898799998788969793212589988965689987664145699999765678932499710157895433477 +1998765443123459956789998765678969899654579323679999878799876543234589987654567943987621238997312556 +0197654321012367897991019834789456998765678954568954989899987654545678998765678954598534567898101245 diff --git a/2021/d09/ex2/ex2.py b/2021/d09/ex2/ex2.py new file mode 100755 index 0000000..451883a --- /dev/null +++ b/2021/d09/ex2/ex2.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import Iterator, List, Tuple + +HeightMap = List[List[int]] +Point = Tuple[int, int] + + +def solve(input: List[str]) -> int: + height_map = [[int(c) for c in line] for line in input] + + def neighbours_of(point: Point) -> Iterator[Point]: + for dx, dy in (-1, 0), (1, 0), (0, -1), (0, 1): + x, y = point[0] + dx, point[1] + dy + if x < 0 or x >= len(height_map): + continue + if y < 0 or y >= len(height_map[0]): + continue + yield x, y + + def is_low_point(point: Point) -> bool: + for neighbour in neighbours_of(point): + if height_map[neighbour[0]][neighbour[1]] <= height_map[point[0]][point[1]]: + return False + return True + + def explore_bassin(point: Point) -> int: + to_be_seen = set(neighbours_of(point)) + explored = {point} + bassin = {point} + + while len(to_be_seen) > 0: + new = to_be_seen.pop() + explored.add(new) + if height_map[new[0]][new[1]] == 9: + continue + bassin.add(new) + for neighbour in neighbours_of(new): + if neighbour in explored: + continue + to_be_seen.add(neighbour) + + return len(bassin) + + points = [(x, y) for x in range(len(height_map)) for y in range(len(height_map[0]))] + low_points = filter(is_low_point, points) + + bassin_sizes = sorted(map(explore_bassin, low_points), reverse=True) + + return bassin_sizes[0] * bassin_sizes[1] * bassin_sizes[2] + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d09/ex2/input b/2021/d09/ex2/input new file mode 100644 index 0000000..c6f7fd9 --- /dev/null +++ b/2021/d09/ex2/input @@ -0,0 +1,100 @@ +9876543298765698956789545678992103976545976323678910997879876432123679765323567894679434987654596521 +7998789129854987545697658789789212985439765454567899876568976569012489874212779943598929976653987432 +6429898934943496434589769894658924976929898765679969965345698798923456976433567892456998765432196543 +5210987899874987645678979943547895989899989898789357893234599987894678986547678901349899896563987656 +4329896798765797657889989652126789998798967999899969954345989876789989797698789316498766987854598787 +5498755679876798968997699643015678987676759899999898965959878965878997649899899997987654298976689898 +7987834656997899878976578932123789998545745799998787899898767854567998798965969898999743109987789999 +9896321345698998989965489543456999867623234567897676789789854343456799987654358799298654312398898989 +8765430234999987697896789654567899954310123456998545785678963212567898992101245690129796453479987978 +7654321345899986576997999876778978965421236567895431234789654345678957895212767789298987894567896669 +9785532456799765434989643987989569877654345878976544345698765456789548954329878999987798979878975456 +9876743767987654323679932198995476988765456989987655466899896787891239765434989989865679654989764367 +0999899878998743212567893999674365699986567898998767877894949898962678986676799878654589943499876458 +1989998989987654501457899876543234799897679987859878988943234999853467897897899867723457892398976567 +9879867991099865212345789989656125789649899876545989999654345998765679998998987654012349910987987989 +8768756689987654323456897298743239891234989765534597898798759879876789569989998632134598929876599096 +8653344578999865784587976349994345910199878964523456789929898764987893498977987545245987999965432145 +6542123469764986895678965499879966899989867893212345698939987653498902987856798767959876989996543234 +7752056778953497898789878987769899998767656989101234567898765432459919876545689878998785678989654546 +9854145789101298989899989876545768989654545679914348978997654321347898765434799989679654545678965687 +7543236993212349878998998765432459876543234567895567889459865432456987654323988995498763234589896789 +7654747894523498767897999654321345998769102678976988992398999545767899765499867894309982123456789999 +8765678965654976654456899865210236799898993589987899101987978996988979876987658989219873256798999989 +9876789998799865432345678994321346789987889998698978919876456789699767997996545678934965345789789778 +4987899989891974321234789986545456899876777897569567898765347897432356989987439789549876956797674567 +3298978978910985445445891297669767998785656789423456789653298976545469879876598999656989897896523456 +3129469568899876656566990998798978989654345893214567898764989897656798767987987988978998679999314567 +2012395436789987767678989899987899876543212379201879969889978789987987656799876877899976567898901238 +2193989325679898978989579768976789965432101268912989456998965678999896547898765656999875456567895449 +3989878934589769989793498959895689876743412347894592347987854567898786434569654547989765345478989567 +9978968895699654997652987645784789987954523456789693469876432457897654321298763239876543217345678978 +8867846789898969876543498732123678998766634787899989978994321367999865432598654567987982101234589989 +7654437999987899989754989643034567899898745678998767899989993479899987543498765678999878212345678997 +6542323899876789598769876542137878987999859899987656798767789598789897655679986799698765433456789876 +4321016789765679349989987756756789876789878910199545987656698997655789796789997894549977567567898765 +5633225899954598956799899867897897765689989429298769876845457986543456989899898943534988978678979987 +8764334567893487897898789998998976454568997998999998765432356978532349878956769892123499989789459998 +9875765789932346798997634569989432323467996987999989887845779865431234669545458789012943299892398989 +5987876894321457989989429979874321012399875676889876998956889978560123458932345699129892109901987878 +4598987899430349979678998899965456133987764545778965698768995989999294567890458798998789298319876567 +3219399978921298767587897679876967845976543234667894539878954399878989698921239997987699987423965456 +4301234567932987656456796567989878956965432133456793124989876498767878999432549876796589876539874347 +5412345789743597542345895434593989869874321012349891013999999987654567898643498765987678987698765458 +6523656897654987656556789323901299998765442123457999229878987896543456998789569979998789498789876769 +5439787898765698787667893219892398999879543434568978998767986797855669999897689989879899349999987899 +7656898919896789899878954398789987999989698545679567893457895498966798986998789394567988998789898989 +8967999323987897976989765987679876889998787686893467892124789349997997895429893233459867999698769678 +9698999934598956795499899876598765778999998797912349951015689123989876796210932012399756896569954599 +6549387895999987989323902965439874355698789898909498932123478939876765989929993243987646789459893989 +6321236789898999878919999876323943234987676989898987993234567899965434567898989349998789894398789878 +5433345998797898767897889987213495349876565677797656789446889999876515698987678998999899965987698767 +6985469899545989654665678999901989498765434545698768998658992398965106789976567987898999987976569656 +7876798795439876543234889569899878999876323434569979569769321987654345678989456976447688999895498767 +8987987654321989754015679499798767898983210128789989498999210398765656789654319895323567998789349878 +9098999876510199863126789987652358997654321247899796987578931239976768899965498789212348987679257989 +2129998995431239765257891099543768998765432656789545995467892946988979987896796568901236896578998996 +3679976789542398954348999198959879999876558767893239876567899897899989896997987699322345985456789125 +4599865679954987895459998987899989987998769879992123987678976789976799765989698789533959876348993234 +5989234567899876799567897956789890196549878989789544998989765678965698943476569897659896987257899345 +9976123456798765678989986844456789987698989395678959899895454567894567892565456998998765432125678976 +8765277567987654569998765432349999898987693234569998789654323456923478921012345679539854321034567897 +7654356679599987678999654321267898789965432145698987678943210147898569543235789794323969834245688998 +8765467989459899789998874210158999679876541016987894599964521234997679659347898989019879765766899899 +9876579894398789899987654332345696567987662929876793488895435349898989798959987879123989989877899787 +3987698789298678967998965453456789349898799899985932376789655456789599987899976768934599999999989656 +2498987679976543459019879867899892198789987789984321245698767567893498876789895457995678999878767938 +1349876567895432398999989988957989987679876698765540356789878678932987545456789346889789998767656899 +0198765456789321256789099899545678976598765549854321456899989799891095432347993275678992987654545789 +1987674345699592345679129654334688965499994321965545567998999896789194321236892164568921298543237898 +9876543234598989456989298743212567894389986539876667679567954965678987210235791013569432987654568956 +5987621023987679867895497652101345789579876547988798789678942134567976521256789123456943498765678945 +4997732654976598978996598764212345678989989656799899899989653655679876432345898235597894569876789534 +9876543459865467899987987654325766789799999789899965957899879769989997543456797546678965778989899325 +4988654598764348998998999766434589994598999898998654345678998998799987676567897667799796989999998934 +3298797679974245697999429887847893212987898987987434234789897567688999789878998778945689998999987896 +2129898989765134976878999998956789109876987656896510123498765434567899899989469899434567897898756789 +3298959398754299865757889979767899912985436445689323234569854323776789998794357986523479956989434599 +4987643239965987654345679869878999894976721336578935446798765612845899987654219875612396549876526989 +9876543129876799765234889754999998789987530123489976557999976701234599998764329874323489932987789878 +1995432035987999832123598932101989699998432236599987698999964312345678989876598765435567893499898767 +3989654124599898641034567893219876568999543445679998899989899423456989879987699897576789965689989656 +9878965435698765432155678965898765432987657656789999999875678954567999765698989998798999986789878543 +8767896776789986749878789896799987621298767767899899989654579765678989854799878999939998997898765432 +5456789987899987856989896789986798532349898898965778976543459879889875423999967894321987898969987643 +2345678999998998767998945999965987643656929969434569198754678992994989567898656976439876749456898765 +1234589923457899879987899889894398784789019654323691019867899921012398978997645897899985432345679876 +2365699894578923989875987676789249895899998766513589129878987892124987899876536789999876521236789987 +5456789689989012399954298545892134976999899895405678934989656789439876987654324679998787210123996798 +7687893578899234569895987699976549899999789984312389545694545696598765699765312567899654323245695459 +9798932345688965998769898987898799768987698765423578999943234789987674198653202469998765534367789568 +9899321234567899899654679876789988657899579877567678987890125679876583019765313578929878946978897679 +3976532345678945798753498765698976545986467988678789876789236798989432123984323489212989897889998989 +2987645456789659987654579874987654324985358999799899765698945987998943439876534794343598789999999990 +1298756569898798798765989989876543219876469999899988954567899876587894646987645679654987678999889891 +2349869698999997659877996593987655424976567895999876543456998765456789656798789789769887567998768789 +3567998987898989541988987432998966565987678934598765432567899854345699787899899899898765456789657679 +7678987676487678932399998949899879677898989323459876554678998743234678998976989944999854346996545568 +9899878554345568943567899898799998788969793212589988965689987664145699999765678932499710157895433477 +1998765443123459956789998765678969899654579323679999878799876543234589987654567943987621238997312556 +0197654321012367897991019834789456998765678954568954989899987654545678998765678954598534567898101245 diff --git a/2021/d10/ex1/ex1.py b/2021/d10/ex1/ex1.py new file mode 100755 index 0000000..89d462d --- /dev/null +++ b/2021/d10/ex1/ex1.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List, Optional + + +def solve(input: List[str]) -> int: + def find_illegal_char(input: str) -> Optional[int]: + chunks: List[str] = [] + ends_to_start = { + ")": "(", + "]": "[", + "}": "{", + ">": "<", + } + + for i, c in enumerate(input): + # Is it a chunk beginning + if c not in ends_to_start: + chunks.append(c) + continue + # Is it matching the last element on the chunk stack + current = chunks.pop() + # If not, corruption has been found + if ends_to_start[c] != current: + return i + + return None + + score = { + ")": 3, + "]": 57, + "}": 1197, + ">": 25137, + } + + return sum( + score[line[find_illegal_char(line)]] + for line in input + if find_illegal_char(line) is not None + ) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d10/ex1/input b/2021/d10/ex1/input new file mode 100644 index 0000000..3a3d7bd --- /dev/null +++ b/2021/d10/ex1/input @@ -0,0 +1,110 @@ +<{[[({([{<[[([()<>]<<><>>)<[[]()]{<>()}>][<(()[])<()<>>>]]<(<(<><>)(())>)[<([]()){<><>}>{{()<>}<{}>}]>>[({ +<<({<{{{[(<{([{}{}]{{}[]}){({}())}}<<[[][]](()<>)>[{<><>}<{}<>>]>>(<[[()]([]{})]((()<>)[()() +({<<({[<[[<[([()])]<<<{}<>><()[]>>[[()<>]<[]()>]>>([((()[])[()])]{[[()()]<<><>>][{<>[]}(()<>)]}) +(([[<<[{(({{{(()<>)[()()]}[({}<>)[[][]]]}([{{}<>}<[]()}]{[[][]][()<>]})})(([({[]{}}{[][]}) +({{<[[<<{{[{[<{}{}>{[]{}}]<([]{}){()[]}>}]<{([<><>]([]<>)){({}())({}<>)}}[[<{}<>>([]{})][[()[]]]]>}}>>]] +[(<<<{([[[<{(<()<>>{<><>})(<[]<>>([][]))}[<[{}[]]>{<[]>(<><>)}]>([{{[]()}{[]()}}([<>[]][{}<> +<[{[{{([<(<{{[{}<>]({}{})}{{<>[]}(()())}}(<<<>{}>(<><>)>(<<>{}>[[]<>]))>)>[{[<[[()<>]{{}<> +{(<<[([<{<<<({()()}(<><>)}{((){})([]())}>>[<{<[]<>>{[]{}}}([()()])>]>}>]{{([{<{{[]<>}(<>)}<({}( +((<[{(({([<{(<[][]>)[<<>{}><()<>>]}<{<{}{}>}[{()[]}<{}[]>]>>])})<[{[{([{[]()}((){})][<<>()><()()>])>]}][[({{[ +[[{([[<<[({[<<[]{}>{[][]}>(<()<>>[{}()])][([{}[]}[<><>]){[{}()]}]}[<<<{}<>>{()<>}>(<{}()>([]()))>{[[<><>][ +{{{<[([[{<[<{([]{}>{<>()}}{<(){}><()()>}>[{[[][]](<>())}[{[]<>}[<>[]]]]]{<{{{}[]}{<><>}}[[()()](< +(([{(({[[[[{(<<>[]>((){})){<()<>><[]{}>}}{[{{}()}(()[])]((()){()<>})}]]]<[<<{(()[])<{}[]>}{ +{<<([(<([{{(<(()<>)[[][]]>{[[]{}]{(){}}})[{<(){}>[[]<>]}]}}])[[[([[{()()}{<>[]}]{[()]{[][]}}]<[(( +[{<<{<([(<[<{<{}[]>{{}[]}}(([]()))>{([(){}]<()[]>)(<[][]>{[]<>})}]>[{<<{<>()}[{}[]]>{(<><>)}>{[<[]<>>{()[]}]< +<{{<{[[{{([({<()>{(){}}}((<>[])(<><>)))[(<[]<>>[()[]])<<()()>{<>{}}>]])<[{[{[]<>}{()()}][[{}{}]<[]>]}<{{{ +[(<[{([{({<<[<<>()>[[]()]]{<<>{}><{}<>>}><{<()()>{{}{}}}(({}<>)<()<>>)>>})({(([<{}<>>{[][] +{(([{[<{{[({{[{}<>][()]}<{{}<>}>}(({<>[]})))]{((<[<>{}][<>[])>[[<>()]{[][]}]))<<<({}<>){{}<>}>( +{[<{({((([[{[(<>{}){<>()}][([]{}}]}]{[<(()()){[]()}>((<>[])<(){}>)]}]){<(<<{{}<>}>>)([[{<><>}< +{<{[(<{<[({<<[<><>]{()()}>[{()<>}<{}>]>[[<[]>][{()[]}{()}]]}(<(({}()){<><>})<(()())[<>()]>>{ +<[({[[{<([[{<{{}}>(<<><>>{[]()}}}[{{<>{}}<()<>>}{[[][]]{[]<>}}]]<((([][])<<>{}>)<((){})[{}() +{{[{<[{<<{<<(<{}[]><(){}>)<{<>[]}[{}()]>>[{{[]<>}<()<>>}[{{}<>}(<>())]]><[(({}<>)({}<>))<<{}<>><< +{<<({(<[(<[[{{[][]}{{}}}<[[]()]<<>())>]](<{{{}<>}{()<>}}>)>)]<(({{[[[][]]]}<[[(){}]<[]{}>]>}))> +({{([<<{[(<<{{<>()}<[]()>}<{(){}}{{}{}}>><(<{}[]>{<>{}})<([]<>)([]())>>>)]}>>[[{<{[<<(<>{}) +<{({{({<<[{<<{<>}{{}[]}>>[[{[]<>}{()()}]<<[][]>(()())>]}]{<<{[(){}><<><>>}{{<>[]}(()<>)}>[<<(){}>[[] +<({<([[[([({<{(){}}([][])>}<[{[][]}{<>()}]<[(){}][{}<>]>>){<({{}()}{[]{}})>{[{[]{})[()[]]]<[ +{([({[(([<{((({}()){{}<>})(<()[]>{()()})){[({}{})<<>[]>]([{}][()])}}>]{<<[<[[][]]{[][]}>({[]{}}<{}()>) +<<{[<({[(<[({<{}{}><()()>})]{<<[<><>]>>}>){{[((<<><>><{}[]>)){<{[]()}(<>())>}]{{{({}<>){[]<>}}{{ +<<({<[{(([{({({}())(<>{})}{((){})})[<[[][]]([][])>]}<<[[<>{}][[]<>]]<([]<>)[()()]>><<<{}[]>(()())>>]])[[[ +[{<({<(({([([{[]}]<{[]()}[()<>]>]{{(()())<{}()>}{{[]()}<()<>>}}][{(<[]<>>[<>{}])[<[]<>><<><>>]}<(<< +<{{((<<(<{({<{<>{}}[[]{}]>})[[{{[][]}{{}<>}}]]}[(([(()[])<()<>>]((<>[])<<>{}>))<[[<>()][<> +{[([<<<({[{<<[<>{}]<[]<>>>>({<<>{}>((){})}<{[][]}{[]{}}>)}<{(([]{})<<>>><{{}()}(<><>)>}<{<[] +<({[[{{{([(({[{}<>]{[]<>}}[{()<>}<(){}>])<[<{}()>[[]<>]]>)]{{[<{<>()}[{}()]><<<><>>{[][]}>]([[[][]](<>()) +[<<{{<[[{[<(<{()[]}[(){}]><[()[]]<<>{}>>)>[[[[[]{}]{[][]}]{<[]{}><(){}>}]({{<>()}<<>{}>}({()<> +[<[[(<[[[[<<<{()<>}[[]()]>>{[[<>[]]{[]{}}]{[<>[]][[]<>]}}>]]({[({[<><>]<{}<>>}<<(){}>[{}()]>)[[<<> +<{{({<([{({({{{}()}((){})})([([][])[[]<>]](([])[{}<>]))}<(([()<>][()[]])[<[]><{}{}>])<{({}<>)<<>()>} +{<[[[([{[<<(({{}<>})(<{}()](<>{}))){[[<>[]]({}<>)]}><[((<>()){[][]})[({}())<{}<>>]]<({<>[]}{{}<> +{<[<[({<({(<(({}[])<{}>)((<>[])({}<>))><(([][])(()()))>)})({{({{<>())}<{<>()}([]{})>)[[(()<>)<<>[]>](<< +{(<(<<{{({{<{(<>[])[[]]}{(<>{})>>{<(()())[{}{}]>{{[]{}}{{}<>}}}}(<{[{}[]]<(){}>}[[{}{}]{()<>}]>([{<>{}}[<>]] +[{[{{[[[{([<(({}{})<[][]>)<([]{})<<>{}>>>[{[[]{}]([]<>)}{(()())[<>[]]}}]((<([]<>)[()<>]>(<{}()>)){<[<>[]]( +{<<<<{(({<<({(()())(<>{})}<([][])[[]()]>)[{{[]()}(<>)}]><{[<<>()>]{<[]()>[[]<>]}}>>}>[(<<<[{()<>}{{}<> +[{[(<[<{<[({[{[]<>}<[][]>]{{<>()}}}[({<>[]}{{}{}}){[[]<>](<><>)}])({({{}<>}<{}<>>)}<[((){})[{ +{<[[{[(((<({([[]<>](()<>))}[{{()<>}({}())}(<[]{}>{[]{}})])<<(({})[{}{}])[(<>{})<()>]>>>))<[{{<[{{}<>}[[][] +[[<<([{<{((([<{}{}>(<><>)][({}[])])[[(<>{}){{}<>}](<()[]>[[]()])])[{({()}{{}{}})(({}())([]{}))}({[{}[]]{ +<<((<[<(([<{[<{}<>>][<{}{}>{{}[]}]}[{<<>()>[[]{}]}{[()[]]([]{})}]><{({()()}{[]})<{[]()}[{}{}]>}{((<>( +({<<{[(({{<<{[[]()]{{}()}}{[<>{}]<[][]>}>{(([]())[<>[]]){<[]{}>{<><>}}}>{{{{<>[]}{{}()]}{{<>{}}[{}{} +{((<<{<<<((<(({}{})(()))[[()()]{{}<>}]>{(<()[]][{}[]])[[<>[]]<<>>]}))>([[{({()[]}{()[]})(<[][]><{}{}>)}[[[[][ +[(<<{<[(<([<(<[]()><()()>)>]{({[<><>]{[][]}})}}<[([(()())[{}]]<<(){}>[<><>]>)][<<((){})>>[[{<><>}[{}()]][([] +[<{[<[[(({{{[<{}[]><<>{}}][[{}<>]<<>()>]}{[{[]}[{}[]]]{[()[]]<{}<>>}}}[({<(){}>{{}{}}}<(()[])( +<{([{(<[<<<<[[{}{}]([])](<{}{}>[[][]])>{{(()[]){<>[]}}<[<><>][(){}]>}>(([[{}{}]{{}<>}](<()()>))<<(<>{})<< +[(<[[[[(({[<<<<>{}><<><>>>>]<{[{{}<>}<()>]{{[]{}}[<>[]]}}<<<()[]>([]<>)><(<>{}){[]()}>>>}))[[([{< +[([(({<{([<[({{}{}}<{}{}>)[[[]{}]({}<>)]]<[([]<>)({}[])]{(()[]){[]<>}}>>{[<{[]<>}>{[()[]]<()<>>}][<([ +{<[<[[<[{({{<[[]()][{}()]>({()[]}(()[]))}([[<>()]])})}{{<{{[<>]<[]()>}{<{}[]]}}<{{()[]}<[]<>>}([()()]<{}()>)> +[{{(<(([([((<{{}{}}({}())>{{<>[]}<[]{}>})([{<>()}{{}<>}]{<()<>>[{}{}]})>]{{[<(<>){[]{}}>{<<>[]>[()[]]}] +[<<(({[[({({[{[]{}}<<>[]]]{[()()]<<>()>}}{[{<>[]}<()>]}){{<<()[]>{[]{}}><<<>>[[]()]>}}})<[{{[< +<([{{{(<{{{<<({}()){(){})>{<{}{}>{<>()}}>{(<()[]>({}()))<({}())<()()>>}}[(({[]{}}[<>{}])([{}<>])){{{{}}(< +<<{[{[[<([[<(<{}<>><()[]>)<{<>()>[<>()]>>]][{{{{()<>}<{}[]>}[<[]()>[()[]]]}<{[{}](<>{})}>}[<[[<><>]< +[{[([{<<[([[{<<>[]>(<>())}((()())({}{}))>{[({}())<<>()>]<(<><>){()<>}>}]({([(){}]<[]<>>){<[ +[{<<[[<((({[<[[]()]>(<<>>(<>{}))]<<([]<>)[<>{}]>{<[][]>(<>())}>}(([{{}<>}{{}[]}]{[()[]]{{}{}}})< +([<<{[([[<{<{({}())}{(()<>)}>[<[{}<>][[]()]><[<>{}]({}[])>]}<[([<>()]){[()<>]([]{})}][[[{}[]]][ +<{[[{({<{(<[[(()[])<<>[]>]<<<>()>{[]<>}>]>{[<(<>()){<>[]}>(([][]))]([<[]<>><{}{}>]([<>{}](()() +{[([{{(([[<{<[{}<>]([]{})>[((){})<()[]>]}[[{{}<>}<[][]>]<{[]<>}([]())>]>{<{{{}<>}{(){}}]{{[] +[{{<[([<{[[({[{}[]][(){}]}<{<>()}<[]{}>>)]<<({()<>}[[]()]){[<>[]]<()()>}>>]{[<<(<>[])<[]<>> +<[{<[<((<({[{[{}[])(<>{})}(({}[])[<>])]})>[[([{((){})<<>>}])[<((()<>)[{}{}])[[(){}]]>{<<{}()>{ +({[[[[[[[<((<[<><>][()[]]><(<><>)>))>{{<(<<>[]>{{}})[[[]<>]({}())]><{{()<>>[[]<>]}[<{}{}>{<>{}}]>}[{<(< +([([(<[{<[[{<{<>[]}>{{{}()]<{}()>}}<([{}()]{{}<>})[([][]){{}<>}]>]{<{{[]{}}{{}<>}}<[[]()]>>[[{()[]}{(){}}]{[ +{<{([([{<<<<{[<>()]<[]>}[[()<>]<()>]>>(([[<>[]][{}{}]])((([][]){<><>})([[]{}]<()<>})))><{<<[()()]<[]()> +[{({[{[(([([{{{}<>}{()<>}}(([]<>){{}{}})][<{()}{{}{}}>(<<>()>[<>()])])]))<<<({((<>()){[]{}})[{ +([([(<(({<(<<<{}[]>){{<><>}[[]{}]}>[{{[][]}<<><>>}])<{<<[]>(()[])>[[{}()]<[]<>>]}{({[]()}[<><>]){{{}[]}[{ +{{[{<{((<((<<<(){}>>{([]{})[[]()]}>([({}{})]{<()>{[]{}}}))[[(<<><>>)]<<<{}{}><(){}>>[({}[])({} +<{[({{<<((([[[(){}][{}<>]]<(<>[])<[]()>>]<[[{}()]({}())]>)({<[(){}]>{(<><>){[]{}}}})){{{<<[]()>[()<>]>[< +(<[[(<((<[[<{[[]()][()<>]}<[[][]]<[][]>>>((({}())((){}))(<{}<>]{()()}))]]>[[{<{[{}<>]}>([[{}<>](() +<<<{<(<[<{[[([<>()][()<>])(<<>()>[{}()])][<{<>()}>]]}<<<({<>[]}([]{}))<<(){}>>>[[({}())(())]]>{({({}[ +([<<<{<{({<[{(()<>)<()()>}]<[({}<>)]>>{[[{<>{}}(()[])](<<>>[[]<>])]}}{<<{<<>()>}><{{<>()}<<><>>}{<(){}>[(){ +{{(<<[{{({({({[]()}<{}()>)(([][])[()<>])}<{(<>())[()<>]}>)[[(([]<>)[[]<>])]]}[({[({}()){{}>]}) +<((((<{{{{{[{[(){}]([][])}[{<>{}}([]<>)]]([((){})]<[[][]][<><>]>)}}<(<{(()<>)([]{})}><([()<>]{<>() +<{<{<(<(<<<(<[[][]]<<>()>><[<>[]][[]]>)[<[<>{}][<>()]>]>{<{(()){{}()}}[<{}<>><<><>>]>[{<{}[]><<><>>}]}>{( +{[{<<(<([({{<<[]<>>[<>{}]>{<{}<>>([]<>)}}([<<>{}>((){})}<{<>[]}>)}<<({{}()})<(<>[])[[]]>>[[<<>[]>{()[]}][[[] +<<<<[<{<[{{(<[<>]<[]{}>><(<>{}){{}()}>)[[{<>{}}{{}[]}](<[]>[<>{}])]}{{[{{}[]}(()<>)]<([]())( +[([({[[{<{{<<{()()}<{}{}>>({{}{}}[{}{}]>>[{(<>{})<()()>}[[<>[]]<{}()>]]}[<<{<><>}(()[])>(<{}[]> +[<<[[(({<[[([(<>[]){()[]}][(<><>)[<>[]]])]<({<{}{}>(()[])}[<{}<>>({}())])((({}{})<{}[]>)[{{}<>}{{}{}}]) +(({({[<<[<[([<<><>){[]{}}][<()<>><[]<>>])({[{}<>]<[]<>>}<({}{})[{}[]]>)][{((<><>)(()[]))}[<<{}()>{<> +<((<[(<(<[[([{(){}}<<>()>]({(){}}{(){}}))]][{{[{[][]]{<>{}}]{[{}<>]([]{})}}}[<{[[]{}][<>()]}[(()[])< +{((<<{({<[([(([]())([]()))(<[][]>{()})])<<[<<>[]>[<>())](<()<>><()()>)>>]>{{[{<[<>{}]<[]<>>>}<{{<><>}< +{<<<<[((<{({<{<>[]}{<>()}><{<><>){<>()}>}([[[]()][(){}]]<<()<>>{<><>}>)){[{{<>[]}{[]()}}{(<>()) +({<<<<[{<{<{(<{}{}><()[]>)[{<>{}}]}>(<[([]{}){<><>}]{<<><>>[()[]]}}<[{()[]}{()[]}][{{}[]}{[][]}]>)}>}] +({({{<{{{[<{{(<><>)}({[]()}{<><>})}{<[{}[]]<[]<>>>[(<>[]){()()}]}><[[<<>()><[][]>]]>]<<[{[[]()]( +<{[<([<[({([{(<>{}){()}}<([]<>)[{}{}]>)[[<()[]><{}<>>][(<>{})[()()]]]){<{({}){{}{}}}<{<>()}[[ +{((({[{<{[<({[{}()]({}{})}<(<>)(()())>)({[[]{}](<><>)}[<<>[]>[<>[]]])><<[{[]<>}][([][])<[]()>]>( +({[((([<[(<{[(<>[])(()[])]}<[([][])([]<>)]<(()())>>>((([(){}])<(<>())<<><>>>)<[[()<>>{{}{} +[{{((<{[(<{[{{[][]}{<><>}}[[()[]]<[][]>]]<<({}[])((){})>>}>[(<([[]()]<{}[]>)([{}<>])>({<<>[]>(<>[])}[( +((<((<[<(<[{(<[]()>[()[]])((())(()[]))}{[[{}<>]([]{})]<[[]()]>}]>)><([<[<{[]<>}<{}[]>>[[(){}]]]({[[][]]{ +[(([([(([<<(<{<>}{[][]}>)[{[()<>]{{}{}}}({{}{}}<[]()>)]>>{([({<><>}<[]>){<{}{}>[()<>]}]<<[[]{}]{{ +[(<{<[[{[<<{<[[]<>]<[]()>>{{[]<>}}}><[[{{}()}([]<>)]][({{}<>}{{}{}})<[[][]](()())>]>><<({([]{})<<>{}>}){ +<{[<[(<<[[[[{<{}[]><[]<>>](<{}[]>{()[]})](<[<>()][[][]]>([()()]<<>()>))]]({([<()[]>[{}()]])<{[[]()]}{<[][ +<{{{([[([{{{<({}[])>}}<<({<>{}}{{}()))<({}{}){[]{}}>>[[(<>())[{}[]]]<<[]{}>{<>[]}>]>}([{[<< +[{<(({{<[{[[([<>{}]{<>{}})(((){})[{}[]])][{<{}<>>}[([]{})<{}>]]]}{<<([<>{}][()[]})[{{}}<{}()>]>( +[((<[{<<[<[{[{{}()}[{}[]]]<[<>[]][{}<>]>}]>]{[([([[]<>]{{}[]})[<(){}>[()[]]]]<<({}[])<[]()>>[( +[{([<{([(({(<[[]<>]>{({}()){<><>}})([([]())[[]<>]])}(<[({}())(<>())]<{()<>}[[]<>]>>)){{([[<><>][()[]>](<[][]> +<<(<<<{{{<<(<<[]<>>{<>()}>[<[]>])<{<{}<>>}{[{}{}]<<>[]>}>><{<<<>{}>({}<>)>}{([()[]]<<>()>)(<<><>><[]{}>)}>>< +{[<<[{{(<<[((({}{})[{}{}])(({}<>)[{}()]))]>{([[[(){}]<{}<>>][[{}[]]{()[]}]](<{[]{}}(<>[]>>))}>)}[(< +<{{[[<[[[(((({<><>}{{}{}})<[<>()]([]())>)[<{{}<>}>{((){})[[][]]}]))<{<{[[]()]<[][]>}{<[]<>>(<> +{<[<<([[[[{{<({}<>)<{}()>>[(<>())({}[])]}<{([][])({}<>)}>}(({[<>{}]{[]{}}}<(<>{})>)[<{[][]}{[][]}>{({}()){ +[[({{[(((({<{{<><>]}{(<><>){<><>}}>(<[()<>]<{}{}>>((<><>){<>[]}))}{<[[{}[]]([][])][{{}[]}[ +[{{<([((<<{(((<><>)<(){}>))((({}[]){<>()})(<{}()}({}{})))}><[<<{<>[]}[()<>]>{[<>{}]{[]()}}>{{ +[<{<{{({{<<<{[<><>]<[][]>}<<(){}>(<>)>>>([<{[]()}{{}[]}>{<{}()><[]<>>}]([([]())[[]]]([[]()]<<>{}>)))> +<[{<[(<{{([[<[{}{}]><([]<>)(()())>][<((){})[[]()]>[([]<>){<><>}]]]{<{<[]<>><<>>}{<{}<>><[]{} +{[((((((({([([(){}]([]<>)){[{}](<>[])}]{[<<>()>([]<>)]<<[][]>{[]<>}>})<<[{{}[]}(<><>)]<[()<>] +([({(([[[([[((<>{}){{}{}}]{[()<>]((){})}]((({})(<>[])){[{}{}]<<>()>})]{({(())[<>{}]}((<>{}) +{<[<{(<[{<[{(<{}()>)[<<>[]>(()<>)]}([{()[]}<{}<>>])}(({<[]{}><{}{}>}([[]<>]{{}()})){[[{}<>] +<<({[[<<[([(<[<><>]{<>{}}>{<(){}>(()())})<{[<>{}]<()[]>}>]<{[{<>{}}<<>()>]<{{}()}[()<>]>}<[[{}<>][{ diff --git a/2021/d10/ex2/ex2.py b/2021/d10/ex2/ex2.py new file mode 100755 index 0000000..377b73d --- /dev/null +++ b/2021/d10/ex2/ex2.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import Iterator, List, Optional + + +def solve(input: List[str]) -> int: + def find_illegal_char(input: str) -> Optional[int]: + chunks: List[str] = [] + ends_to_start = { + ")": "(", + "]": "[", + "}": "{", + ">": "<", + } + + for i, c in enumerate(input): + # Is it a chunk beginning + if c not in ends_to_start: + chunks.append(c) + continue + # Is it matching the last element on the chunk stack + current = chunks.pop() + # If not, corruption has been found + if ends_to_start[c] != current: + return i + + return None + + def complete_line(input: List[str]) -> str: + chunks: List[str] = [] + start_to_end = { + "(": ")", + "[": "]", + "{": "}", + "<": ">", + } + + for c in input: + # Is it a chunk beginning + if c in start_to_end: + chunks.append(c) + continue + # Otherwise we must match the last open chunk + assert start_to_end[chunks.pop()] == c # Sanity check + + return reversed(list(start_to_end[c] for c in chunks)) + + def score_completion(completion: str) -> int: + char_score = { + ")": 1, + "]": 2, + "}": 3, + ">": 4, + } + + score = 0 + + for c in completion: + score *= 5 + score += char_score[c] + + return score + + def score_completions(completions: Iterator[str]) -> int: + scores = sorted(map(score_completion, completions)) + return scores[len(scores) // 2] + + incomplete_lines = filter(lambda line: find_illegal_char(line) is None, input) + completions = map(complete_line, incomplete_lines) + + return score_completions(completions) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d10/ex2/input b/2021/d10/ex2/input new file mode 100644 index 0000000..3a3d7bd --- /dev/null +++ b/2021/d10/ex2/input @@ -0,0 +1,110 @@ +<{[[({([{<[[([()<>]<<><>>)<[[]()]{<>()}>][<(()[])<()<>>>]]<(<(<><>)(())>)[<([]()){<><>}>{{()<>}<{}>}]>>[({ +<<({<{{{[(<{([{}{}]{{}[]}){({}())}}<<[[][]](()<>)>[{<><>}<{}<>>]>>(<[[()]([]{})]((()<>)[()() +({<<({[<[[<[([()])]<<<{}<>><()[]>>[[()<>]<[]()>]>>([((()[])[()])]{[[()()]<<><>>][{<>[]}(()<>)]}) +(([[<<[{(({{{(()<>)[()()]}[({}<>)[[][]]]}([{{}<>}<[]()}]{[[][]][()<>]})})(([({[]{}}{[][]}) +({{<[[<<{{[{[<{}{}>{[]{}}]<([]{}){()[]}>}]<{([<><>]([]<>)){({}())({}<>)}}[[<{}<>>([]{})][[()[]]]]>}}>>]] +[(<<<{([[[<{(<()<>>{<><>})(<[]<>>([][]))}[<[{}[]]>{<[]>(<><>)}]>([{{[]()}{[]()}}([<>[]][{}<> +<[{[{{([<(<{{[{}<>]({}{})}{{<>[]}(()())}}(<<<>{}>(<><>)>(<<>{}>[[]<>]))>)>[{[<[[()<>]{{}<> +{(<<[([<{<<<({()()}(<><>)}{((){})([]())}>>[<{<[]<>>{[]{}}}([()()])>]>}>]{{([{<{{[]<>}(<>)}<({}( +((<[{(({([<{(<[][]>)[<<>{}><()<>>]}<{<{}{}>}[{()[]}<{}[]>]>>])})<[{[{([{[]()}((){})][<<>()><()()>])>]}][[({{[ +[[{([[<<[({[<<[]{}>{[][]}>(<()<>>[{}()])][([{}[]}[<><>]){[{}()]}]}[<<<{}<>>{()<>}>(<{}()>([]()))>{[[<><>][ +{{{<[([[{<[<{([]{}>{<>()}}{<(){}><()()>}>[{[[][]](<>())}[{[]<>}[<>[]]]]]{<{{{}[]}{<><>}}[[()()](< +(([{(({[[[[{(<<>[]>((){})){<()<>><[]{}>}}{[{{}()}(()[])]((()){()<>})}]]]<[<<{(()[])<{}[]>}{ +{<<([(<([{{(<(()<>)[[][]]>{[[]{}]{(){}}})[{<(){}>[[]<>]}]}}])[[[([[{()()}{<>[]}]{[()]{[][]}}]<[(( +[{<<{<([(<[<{<{}[]>{{}[]}}(([]()))>{([(){}]<()[]>)(<[][]>{[]<>})}]>[{<<{<>()}[{}[]]>{(<><>)}>{[<[]<>>{()[]}]< +<{{<{[[{{([({<()>{(){}}}((<>[])(<><>)))[(<[]<>>[()[]])<<()()>{<>{}}>]])<[{[{[]<>}{()()}][[{}{}]<[]>]}<{{{ +[(<[{([{({<<[<<>()>[[]()]]{<<>{}><{}<>>}><{<()()>{{}{}}}(({}<>)<()<>>)>>})({(([<{}<>>{[][] +{(([{[<{{[({{[{}<>][()]}<{{}<>}>}(({<>[]})))]{((<[<>{}][<>[])>[[<>()]{[][]}]))<<<({}<>){{}<>}>( +{[<{({((([[{[(<>{}){<>()}][([]{}}]}]{[<(()()){[]()}>((<>[])<(){}>)]}]){<(<<{{}<>}>>)([[{<><>}< +{<{[(<{<[({<<[<><>]{()()}>[{()<>}<{}>]>[[<[]>][{()[]}{()}]]}(<(({}()){<><>})<(()())[<>()]>>{ +<[({[[{<([[{<{{}}>(<<><>>{[]()}}}[{{<>{}}<()<>>}{[[][]]{[]<>}}]]<((([][])<<>{}>)<((){})[{}() +{{[{<[{<<{<<(<{}[]><(){}>)<{<>[]}[{}()]>>[{{[]<>}<()<>>}[{{}<>}(<>())]]><[(({}<>)({}<>))<<{}<>><< +{<<({(<[(<[[{{[][]}{{}}}<[[]()]<<>())>]](<{{{}<>}{()<>}}>)>)]<(({{[[[][]]]}<[[(){}]<[]{}>]>}))> +({{([<<{[(<<{{<>()}<[]()>}<{(){}}{{}{}}>><(<{}[]>{<>{}})<([]<>)([]())>>>)]}>>[[{<{[<<(<>{}) +<{({{({<<[{<<{<>}{{}[]}>>[[{[]<>}{()()}]<<[][]>(()())>]}]{<<{[(){}><<><>>}{{<>[]}(()<>)}>[<<(){}>[[] +<({<([[[([({<{(){}}([][])>}<[{[][]}{<>()}]<[(){}][{}<>]>>){<({{}()}{[]{}})>{[{[]{})[()[]]]<[ +{([({[(([<{((({}()){{}<>})(<()[]>{()()})){[({}{})<<>[]>]([{}][()])}}>]{<<[<[[][]]{[][]}>({[]{}}<{}()>) +<<{[<({[(<[({<{}{}><()()>})]{<<[<><>]>>}>){{[((<<><>><{}[]>)){<{[]()}(<>())>}]{{{({}<>){[]<>}}{{ +<<({<[{(([{({({}())(<>{})}{((){})})[<[[][]]([][])>]}<<[[<>{}][[]<>]]<([]<>)[()()]>><<<{}[]>(()())>>]])[[[ +[{<({<(({([([{[]}]<{[]()}[()<>]>]{{(()())<{}()>}{{[]()}<()<>>}}][{(<[]<>>[<>{}])[<[]<>><<><>>]}<(<< +<{{((<<(<{({<{<>{}}[[]{}]>})[[{{[][]}{{}<>}}]]}[(([(()[])<()<>>]((<>[])<<>{}>))<[[<>()][<> +{[([<<<({[{<<[<>{}]<[]<>>>>({<<>{}>((){})}<{[][]}{[]{}}>)}<{(([]{})<<>>><{{}()}(<><>)>}<{<[] +<({[[{{{([(({[{}<>]{[]<>}}[{()<>}<(){}>])<[<{}()>[[]<>]]>)]{{[<{<>()}[{}()]><<<><>>{[][]}>]([[[][]](<>()) +[<<{{<[[{[<(<{()[]}[(){}]><[()[]]<<>{}>>)>[[[[[]{}]{[][]}]{<[]{}><(){}>}]({{<>()}<<>{}>}({()<> +[<[[(<[[[[<<<{()<>}[[]()]>>{[[<>[]]{[]{}}]{[<>[]][[]<>]}}>]]({[({[<><>]<{}<>>}<<(){}>[{}()]>)[[<<> +<{{({<([{({({{{}()}((){})})([([][])[[]<>]](([])[{}<>]))}<(([()<>][()[]])[<[]><{}{}>])<{({}<>)<<>()>} +{<[[[([{[<<(({{}<>})(<{}()](<>{}))){[[<>[]]({}<>)]}><[((<>()){[][]})[({}())<{}<>>]]<({<>[]}{{}<> +{<[<[({<({(<(({}[])<{}>)((<>[])({}<>))><(([][])(()()))>)})({{({{<>())}<{<>()}([]{})>)[[(()<>)<<>[]>](<< +{(<(<<{{({{<{(<>[])[[]]}{(<>{})>>{<(()())[{}{}]>{{[]{}}{{}<>}}}}(<{[{}[]]<(){}>}[[{}{}]{()<>}]>([{<>{}}[<>]] +[{[{{[[[{([<(({}{})<[][]>)<([]{})<<>{}>>>[{[[]{}]([]<>)}{(()())[<>[]]}}]((<([]<>)[()<>]>(<{}()>)){<[<>[]]( +{<<<<{(({<<({(()())(<>{})}<([][])[[]()]>)[{{[]()}(<>)}]><{[<<>()>]{<[]()>[[]<>]}}>>}>[(<<<[{()<>}{{}<> +[{[(<[<{<[({[{[]<>}<[][]>]{{<>()}}}[({<>[]}{{}{}}){[[]<>](<><>)}])({({{}<>}<{}<>>)}<[((){})[{ +{<[[{[(((<({([[]<>](()<>))}[{{()<>}({}())}(<[]{}>{[]{}})])<<(({})[{}{}])[(<>{})<()>]>>>))<[{{<[{{}<>}[[][] +[[<<([{<{((([<{}{}>(<><>)][({}[])])[[(<>{}){{}<>}](<()[]>[[]()])])[{({()}{{}{}})(({}())([]{}))}({[{}[]]{ +<<((<[<(([<{[<{}<>>][<{}{}>{{}[]}]}[{<<>()>[[]{}]}{[()[]]([]{})}]><{({()()}{[]})<{[]()}[{}{}]>}{((<>( +({<<{[(({{<<{[[]()]{{}()}}{[<>{}]<[][]>}>{(([]())[<>[]]){<[]{}>{<><>}}}>{{{{<>[]}{{}()]}{{<>{}}[{}{} +{((<<{<<<((<(({}{})(()))[[()()]{{}<>}]>{(<()[]][{}[]])[[<>[]]<<>>]}))>([[{({()[]}{()[]})(<[][]><{}{}>)}[[[[][ +[(<<{<[(<([<(<[]()><()()>)>]{({[<><>]{[][]}})}}<[([(()())[{}]]<<(){}>[<><>]>)][<<((){})>>[[{<><>}[{}()]][([] +[<{[<[[(({{{[<{}[]><<>{}}][[{}<>]<<>()>]}{[{[]}[{}[]]]{[()[]]<{}<>>}}}[({<(){}>{{}{}}}<(()[])( +<{([{(<[<<<<[[{}{}]([])](<{}{}>[[][]])>{{(()[]){<>[]}}<[<><>][(){}]>}>(([[{}{}]{{}<>}](<()()>))<<(<>{})<< +[(<[[[[(({[<<<<>{}><<><>>>>]<{[{{}<>}<()>]{{[]{}}[<>[]]}}<<<()[]>([]<>)><(<>{}){[]()}>>>}))[[([{< +[([(({<{([<[({{}{}}<{}{}>)[[[]{}]({}<>)]]<[([]<>)({}[])]{(()[]){[]<>}}>>{[<{[]<>}>{[()[]]<()<>>}][<([ +{<[<[[<[{({{<[[]()][{}()]>({()[]}(()[]))}([[<>()]])})}{{<{{[<>]<[]()>}{<{}[]]}}<{{()[]}<[]<>>}([()()]<{}()>)> +[{{(<(([([((<{{}{}}({}())>{{<>[]}<[]{}>})([{<>()}{{}<>}]{<()<>>[{}{}]})>]{{[<(<>){[]{}}>{<<>[]>[()[]]}] +[<<(({[[({({[{[]{}}<<>[]]]{[()()]<<>()>}}{[{<>[]}<()>]}){{<<()[]>{[]{}}><<<>>[[]()]>}}})<[{{[< +<([{{{(<{{{<<({}()){(){})>{<{}{}>{<>()}}>{(<()[]>({}()))<({}())<()()>>}}[(({[]{}}[<>{}])([{}<>])){{{{}}(< +<<{[{[[<([[<(<{}<>><()[]>)<{<>()>[<>()]>>]][{{{{()<>}<{}[]>}[<[]()>[()[]]]}<{[{}](<>{})}>}[<[[<><>]< +[{[([{<<[([[{<<>[]>(<>())}((()())({}{}))>{[({}())<<>()>]<(<><>){()<>}>}]({([(){}]<[]<>>){<[ +[{<<[[<((({[<[[]()]>(<<>>(<>{}))]<<([]<>)[<>{}]>{<[][]>(<>())}>}(([{{}<>}{{}[]}]{[()[]]{{}{}}})< +([<<{[([[<{<{({}())}{(()<>)}>[<[{}<>][[]()]><[<>{}]({}[])>]}<[([<>()]){[()<>]([]{})}][[[{}[]]][ +<{[[{({<{(<[[(()[])<<>[]>]<<<>()>{[]<>}>]>{[<(<>()){<>[]}>(([][]))]([<[]<>><{}{}>]([<>{}](()() +{[([{{(([[<{<[{}<>]([]{})>[((){})<()[]>]}[[{{}<>}<[][]>]<{[]<>}([]())>]>{<{{{}<>}{(){}}]{{[] +[{{<[([<{[[({[{}[]][(){}]}<{<>()}<[]{}>>)]<<({()<>}[[]()]){[<>[]]<()()>}>>]{[<<(<>[])<[]<>> +<[{<[<((<({[{[{}[])(<>{})}(({}[])[<>])]})>[[([{((){})<<>>}])[<((()<>)[{}{}])[[(){}]]>{<<{}()>{ +({[[[[[[[<((<[<><>][()[]]><(<><>)>))>{{<(<<>[]>{{}})[[[]<>]({}())]><{{()<>>[[]<>]}[<{}{}>{<>{}}]>}[{<(< +([([(<[{<[[{<{<>[]}>{{{}()]<{}()>}}<([{}()]{{}<>})[([][]){{}<>}]>]{<{{[]{}}{{}<>}}<[[]()]>>[[{()[]}{(){}}]{[ +{<{([([{<<<<{[<>()]<[]>}[[()<>]<()>]>>(([[<>[]][{}{}]])((([][]){<><>})([[]{}]<()<>})))><{<<[()()]<[]()> +[{({[{[(([([{{{}<>}{()<>}}(([]<>){{}{}})][<{()}{{}{}}>(<<>()>[<>()])])]))<<<({((<>()){[]{}})[{ +([([(<(({<(<<<{}[]>){{<><>}[[]{}]}>[{{[][]}<<><>>}])<{<<[]>(()[])>[[{}()]<[]<>>]}{({[]()}[<><>]){{{}[]}[{ +{{[{<{((<((<<<(){}>>{([]{})[[]()]}>([({}{})]{<()>{[]{}}}))[[(<<><>>)]<<<{}{}><(){}>>[({}[])({} +<{[({{<<((([[[(){}][{}<>]]<(<>[])<[]()>>]<[[{}()]({}())]>)({<[(){}]>{(<><>){[]{}}}})){{{<<[]()>[()<>]>[< +(<[[(<((<[[<{[[]()][()<>]}<[[][]]<[][]>>>((({}())((){}))(<{}<>]{()()}))]]>[[{<{[{}<>]}>([[{}<>](() +<<<{<(<[<{[[([<>()][()<>])(<<>()>[{}()])][<{<>()}>]]}<<<({<>[]}([]{}))<<(){}>>>[[({}())(())]]>{({({}[ +([<<<{<{({<[{(()<>)<()()>}]<[({}<>)]>>{[[{<>{}}(()[])](<<>>[[]<>])]}}{<<{<<>()>}><{{<>()}<<><>>}{<(){}>[(){ +{{(<<[{{({({({[]()}<{}()>)(([][])[()<>])}<{(<>())[()<>]}>)[[(([]<>)[[]<>])]]}[({[({}()){{}>]}) +<((((<{{{{{[{[(){}]([][])}[{<>{}}([]<>)]]([((){})]<[[][]][<><>]>)}}<(<{(()<>)([]{})}><([()<>]{<>() +<{<{<(<(<<<(<[[][]]<<>()>><[<>[]][[]]>)[<[<>{}][<>()]>]>{<{(()){{}()}}[<{}<>><<><>>]>[{<{}[]><<><>>}]}>{( +{[{<<(<([({{<<[]<>>[<>{}]>{<{}<>>([]<>)}}([<<>{}>((){})}<{<>[]}>)}<<({{}()})<(<>[])[[]]>>[[<<>[]>{()[]}][[[] +<<<<[<{<[{{(<[<>]<[]{}>><(<>{}){{}()}>)[[{<>{}}{{}[]}](<[]>[<>{}])]}{{[{{}[]}(()<>)]<([]())( +[([({[[{<{{<<{()()}<{}{}>>({{}{}}[{}{}]>>[{(<>{})<()()>}[[<>[]]<{}()>]]}[<<{<><>}(()[])>(<{}[]> +[<<[[(({<[[([(<>[]){()[]}][(<><>)[<>[]]])]<({<{}{}>(()[])}[<{}<>>({}())])((({}{})<{}[]>)[{{}<>}{{}{}}]) +(({({[<<[<[([<<><>){[]{}}][<()<>><[]<>>])({[{}<>]<[]<>>}<({}{})[{}[]]>)][{((<><>)(()[]))}[<<{}()>{<> +<((<[(<(<[[([{(){}}<<>()>]({(){}}{(){}}))]][{{[{[][]]{<>{}}]{[{}<>]([]{})}}}[<{[[]{}][<>()]}[(()[])< +{((<<{({<[([(([]())([]()))(<[][]>{()})])<<[<<>[]>[<>())](<()<>><()()>)>>]>{{[{<[<>{}]<[]<>>>}<{{<><>}< +{<<<<[((<{({<{<>[]}{<>()}><{<><>){<>()}>}([[[]()][(){}]]<<()<>>{<><>}>)){[{{<>[]}{[]()}}{(<>()) +({<<<<[{<{<{(<{}{}><()[]>)[{<>{}}]}>(<[([]{}){<><>}]{<<><>>[()[]]}}<[{()[]}{()[]}][{{}[]}{[][]}]>)}>}] +({({{<{{{[<{{(<><>)}({[]()}{<><>})}{<[{}[]]<[]<>>>[(<>[]){()()}]}><[[<<>()><[][]>]]>]<<[{[[]()]( +<{[<([<[({([{(<>{}){()}}<([]<>)[{}{}]>)[[<()[]><{}<>>][(<>{})[()()]]]){<{({}){{}{}}}<{<>()}[[ +{((({[{<{[<({[{}()]({}{})}<(<>)(()())>)({[[]{}](<><>)}[<<>[]>[<>[]]])><<[{[]<>}][([][])<[]()>]>( +({[((([<[(<{[(<>[])(()[])]}<[([][])([]<>)]<(()())>>>((([(){}])<(<>())<<><>>>)<[[()<>>{{}{} +[{{((<{[(<{[{{[][]}{<><>}}[[()[]]<[][]>]]<<({}[])((){})>>}>[(<([[]()]<{}[]>)([{}<>])>({<<>[]>(<>[])}[( +((<((<[<(<[{(<[]()>[()[]])((())(()[]))}{[[{}<>]([]{})]<[[]()]>}]>)><([<[<{[]<>}<{}[]>>[[(){}]]]({[[][]]{ +[(([([(([<<(<{<>}{[][]}>)[{[()<>]{{}{}}}({{}{}}<[]()>)]>>{([({<><>}<[]>){<{}{}>[()<>]}]<<[[]{}]{{ +[(<{<[[{[<<{<[[]<>]<[]()>>{{[]<>}}}><[[{{}()}([]<>)]][({{}<>}{{}{}})<[[][]](()())>]>><<({([]{})<<>{}>}){ +<{[<[(<<[[[[{<{}[]><[]<>>](<{}[]>{()[]})](<[<>()][[][]]>([()()]<<>()>))]]({([<()[]>[{}()]])<{[[]()]}{<[][ +<{{{([[([{{{<({}[])>}}<<({<>{}}{{}()))<({}{}){[]{}}>>[[(<>())[{}[]]]<<[]{}>{<>[]}>]>}([{[<< +[{<(({{<[{[[([<>{}]{<>{}})(((){})[{}[]])][{<{}<>>}[([]{})<{}>]]]}{<<([<>{}][()[]})[{{}}<{}()>]>( +[((<[{<<[<[{[{{}()}[{}[]]]<[<>[]][{}<>]>}]>]{[([([[]<>]{{}[]})[<(){}>[()[]]]]<<({}[])<[]()>>[( +[{([<{([(({(<[[]<>]>{({}()){<><>}})([([]())[[]<>]])}(<[({}())(<>())]<{()<>}[[]<>]>>)){{([[<><>][()[]>](<[][]> +<<(<<<{{{<<(<<[]<>>{<>()}>[<[]>])<{<{}<>>}{[{}{}]<<>[]>}>><{<<<>{}>({}<>)>}{([()[]]<<>()>)(<<><>><[]{}>)}>>< +{[<<[{{(<<[((({}{})[{}{}])(({}<>)[{}()]))]>{([[[(){}]<{}<>>][[{}[]]{()[]}]](<{[]{}}(<>[]>>))}>)}[(< +<{{[[<[[[(((({<><>}{{}{}})<[<>()]([]())>)[<{{}<>}>{((){})[[][]]}]))<{<{[[]()]<[][]>}{<[]<>>(<> +{<[<<([[[[{{<({}<>)<{}()>>[(<>())({}[])]}<{([][])({}<>)}>}(({[<>{}]{[]{}}}<(<>{})>)[<{[][]}{[][]}>{({}()){ +[[({{[(((({<{{<><>]}{(<><>){<><>}}>(<[()<>]<{}{}>>((<><>){<>[]}))}{<[[{}[]]([][])][{{}[]}[ +[{{<([((<<{(((<><>)<(){}>))((({}[]){<>()})(<{}()}({}{})))}><[<<{<>[]}[()<>]>{[<>{}]{[]()}}>{{ +[<{<{{({{<<<{[<><>]<[][]>}<<(){}>(<>)>>>([<{[]()}{{}[]}>{<{}()><[]<>>}]([([]())[[]]]([[]()]<<>{}>)))> +<[{<[(<{{([[<[{}{}]><([]<>)(()())>][<((){})[[]()]>[([]<>){<><>}]]]{<{<[]<>><<>>}{<{}<>><[]{} +{[((((((({([([(){}]([]<>)){[{}](<>[])}]{[<<>()>([]<>)]<<[][]>{[]<>}>})<<[{{}[]}(<><>)]<[()<>] +([({(([[[([[((<>{}){{}{}}]{[()<>]((){})}]((({})(<>[])){[{}{}]<<>()>})]{({(())[<>{}]}((<>{}) +{<[<{(<[{<[{(<{}()>)[<<>[]>(()<>)]}([{()[]}<{}<>>])}(({<[]{}><{}{}>}([[]<>]{{}()})){[[{}<>] +<<({[[<<[([(<[<><>]{<>{}}>{<(){}>(()())})<{[<>{}]<()[]>}>]<{[{<>{}}<<>()>]<{{}()}[()<>]>}<[[{}<>][{ diff --git a/2021/d11/ex1/ex1.py b/2021/d11/ex1/ex1.py new file mode 100755 index 0000000..19669b3 --- /dev/null +++ b/2021/d11/ex1/ex1.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +import itertools +import sys +from copy import deepcopy +from typing import Iterator, List, Set, Tuple + +Grid = List[List[int]] +Point = Tuple[int, int] + + +def solve(input: List[str]) -> int: + levels = [[int(c) for c in line] for line in input] + + def step(levels: Grid) -> Tuple[Grid, int]: + # First step, increase levels + levels = [[l + 1 for l in line] for line in levels] + + def excited(levels: Grid) -> Set[Point]: + return set( + (i, j) + for i in range(len(levels)) + for j in range(len(levels[i])) + if levels[i][j] > 9 + ) + + def neighbours_of(point: Point) -> Iterator[Point]: + for dx, dy in itertools.product((-1, 0, 1), repeat=2): + if dx == 0 and dy == 0: + continue + x = point[0] + dx + y = point[1] + dy + if x < 0 or x >= len(levels): + continue + if y < 0 or y >= len(levels[x]): + continue + yield x, y + + # Second step, do flashes + has_flashed: Set[Point] = set() + while len(flashes := (excited(levels) - has_flashed)) > 0: + for (i, j) in flashes: + has_flashed.add((i, j)) + for x, y in neighbours_of((i, j)): + levels[x][y] += 1 + + # Finally, bring back energy levels to 0 + for i, j in has_flashed: + levels[i][j] = 0 + + return levels, len(has_flashed) + + res = 0 + for __ in range(100): + levels, flashes = step(levels) + res += flashes + return res + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d11/ex1/input b/2021/d11/ex1/input new file mode 100644 index 0000000..ea9c78d --- /dev/null +++ b/2021/d11/ex1/input @@ -0,0 +1,10 @@ +4341347643 +5477728451 +2322733878 +5453762556 +2718123421 +4237886115 +5631617114 +2217667227 +4236581255 +4482627641 diff --git a/2021/d11/ex2/ex2.py b/2021/d11/ex2/ex2.py new file mode 100755 index 0000000..0dee9eb --- /dev/null +++ b/2021/d11/ex2/ex2.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +import itertools +import sys +from copy import deepcopy +from typing import Iterator, List, Set, Tuple + +Grid = List[List[int]] +Point = Tuple[int, int] + + +def solve(input: List[str]) -> int: + levels = [[int(c) for c in line] for line in input] + + def step(levels: Grid) -> Tuple[Grid, int]: + # First step, increase levels + levels = [[l + 1 for l in line] for line in levels] + + def excited(levels: Grid) -> Set[Point]: + return set( + (i, j) + for i in range(len(levels)) + for j in range(len(levels[i])) + if levels[i][j] > 9 + ) + + def neighbours_of(point: Point) -> Iterator[Point]: + for dx, dy in itertools.product((-1, 0, 1), repeat=2): + if dx == 0 and dy == 0: + continue + x = point[0] + dx + y = point[1] + dy + if x < 0 or x >= len(levels): + continue + if y < 0 or y >= len(levels[x]): + continue + yield x, y + + # Second step, do flashes + has_flashed: Set[Point] = set() + while len(flashes := (excited(levels) - has_flashed)) > 0: + for (i, j) in flashes: + has_flashed.add((i, j)) + for x, y in neighbours_of((i, j)): + levels[x][y] += 1 + + # Finally, bring back energy levels to 0 + for i, j in has_flashed: + levels[i][j] = 0 + + return levels, len(has_flashed) + + for i in itertools.count(1): + levels, flashes = step(levels) + if flashes == len(list(itertools.chain.from_iterable(levels))): + return i + + assert False # Sanity check + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d11/ex2/input b/2021/d11/ex2/input new file mode 100644 index 0000000..ea9c78d --- /dev/null +++ b/2021/d11/ex2/input @@ -0,0 +1,10 @@ +4341347643 +5477728451 +2322733878 +5453762556 +2718123421 +4237886115 +5631617114 +2217667227 +4236581255 +4482627641 diff --git a/2021/d12/ex1/ex1.py b/2021/d12/ex1/ex1.py new file mode 100755 index 0000000..4d0cacf --- /dev/null +++ b/2021/d12/ex1/ex1.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import defaultdict +from typing import Dict, List, Set + +Map = Dict[str, Set[str]] + + +def solve(input: List[str]) -> int: + def parse() -> Map: + res: Map = defaultdict(set) + + for (start, to) in map(lambda s: s.split("-"), input): + res[start].add(to) + res[to].add(start) + + return res + + caves = parse() + + def dfs(start: str, seen: Set[str] = set()) -> int: + if start == "end": + return 1 + + seen = seen | {start} + res = 0 + + for dest in caves[start]: + if dest in seen and dest.islower(): + continue + res += dfs(dest, seen) + + return res + + return dfs("start") + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d12/ex1/input b/2021/d12/ex1/input new file mode 100644 index 0000000..c2b0b8d --- /dev/null +++ b/2021/d12/ex1/input @@ -0,0 +1,22 @@ +ax-end +xq-GF +end-xq +im-wg +ax-ie +start-ws +ie-ws +CV-start +ng-wg +ng-ie +GF-ng +ng-av +CV-end +ie-GF +CV-ie +im-xq +start-GF +GF-ws +wg-LY +CV-ws +im-CV +CV-wg diff --git a/2021/d12/ex2/ex2.py b/2021/d12/ex2/ex2.py new file mode 100755 index 0000000..69d9aa9 --- /dev/null +++ b/2021/d12/ex2/ex2.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import defaultdict +from typing import Dict, List, Set + +Map = Dict[str, Set[str]] + + +def solve(input: List[str]) -> int: + def parse() -> Map: + res: Map = defaultdict(set) + + for (start, to) in map(lambda s: s.split("-"), input): + res[start].add(to) + res[to].add(start) + + return res + + caves = parse() + + def dfs(start: str, seen: Set[str] = set(), has_doubled_back: bool = False) -> int: + if start == "end": + return 1 + + seen = seen | {start} + res = 0 + + for dest in caves[start]: + doubles_back = False + if dest in seen and dest.islower(): + if has_doubled_back or dest == "start": + continue + doubles_back = True + res += dfs(dest, seen, has_doubled_back or doubles_back) + + return res + + return dfs("start") + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2021/d12/ex2/input b/2021/d12/ex2/input new file mode 100644 index 0000000..c2b0b8d --- /dev/null +++ b/2021/d12/ex2/input @@ -0,0 +1,22 @@ +ax-end +xq-GF +end-xq +im-wg +ax-ie +start-ws +ie-ws +CV-start +ng-wg +ng-ie +GF-ng +ng-av +CV-end +ie-GF +CV-ie +im-xq +start-GF +GF-ws +wg-LY +CV-ws +im-CV +CV-wg