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..d6c0a79 --- /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, Tuple + + +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..f89cd44 --- /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, Tuple + + +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