From 59fafe6140659dc9ba8e4c2785fe87445dda90c7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 8 Dec 2019 19:54:16 +0100 Subject: [PATCH 001/479] 2019: d03: ex2: add solution --- 2019/d03/ex2/ex2.py | 108 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100755 2019/d03/ex2/ex2.py diff --git a/2019/d03/ex2/ex2.py b/2019/d03/ex2/ex2.py new file mode 100755 index 0000000..077f2e3 --- /dev/null +++ b/2019/d03/ex2/ex2.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python + +import sys +from fractions import Fraction +from typing import List, NamedTuple, Optional + + +class Point(NamedTuple): + x: int + y: int + + +class Line(NamedTuple): + p1: Point + p2: Point + + +def manhattan_dist(p1: Point, p2: Point = Point(0, 0)) -> int: + dx = p2.x - p1.x if p1.x < p2.x else p1.x - p2.x + dy = p2.y - p1.y if p1.y < p2.y else p1.y - p2.y + return dx + dy + + +def intersect(l1: Line, l2: Line) -> Optional[Point]: + (x1, y1), (x2, y2) = l1.p1, l1.p2 + (x3, y3), (x4, y4) = l2.p1, l2.p2 + + den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4) + + if den == 0: # Parallel lines + return None + + t = Fraction((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4), den) + if t < 0 or t > 1: # Out of l1 + return None + + u = -Fraction((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3), den) + if u < 0 or u > 1: # Out of l2 + return None + + dx = t * (x2 - x1) + dy = t * (y2 - y1) + + assert int(dx) == dx and int(dy) == dy # Sanity checks + + ix = x1 + int(dx) + iy = y1 + int(dy) + return Point(ix, iy) + + +def is_on(p: Point, l: Line) -> bool: + # Assume that l is horizontal or vertical + if l.p1.x == l.p2.x: + if l.p1.y < l.p2.y: + return p.x == l.p1.x and l.p1.y <= p.y <= l.p2.y + elif l.p2.y < l.p1.y: + return p.x == l.p1.x and l.p2.y <= p.y <= l.p1.y + elif l.p1.y == l.p2.y: + if l.p1.x < l.p2.x: + return p.y == l.p1.y and l.p1.x <= p.x <= l.p2.x + elif l.p2.x < l.p1.x: + return p.y == l.p1.y and l.p2.x <= p.x <= l.p1.x + assert False # Sanity checks + + +def parse_line(directions: str) -> List[Line]: + prev = Point(0, 0) + ans = [] + for inst in directions.split(","): + direction, length = inst[0], int(inst[1:]) + new_x, new_y = prev + if direction == "U": + new_y += length + elif direction == "R": + new_x += length + if direction == "D": + new_y -= length + elif direction == "L": + new_x -= length + new = Point(new_x, new_y) + ans.append(Line(prev, new)) + prev = new + return ans + + +def compute_delay(p: Point, lines: List[Line]) -> int: + dist = 0 + for l in lines: + if is_on(p, l): + return dist + manhattan_dist(l.p1, p) + dist += manhattan_dist(l.p1, l.p2) + assert False # Sanity check + + +def main() -> None: + wire1, wire2 = tuple(parse_line(l) for l in sys.stdin) + intersections = [intersect(l1, l2) for l1 in wire1 for l2 in wire2] + print( + min( + compute_delay(x, wire1) + compute_delay(x, wire2) + for x in intersections + if x is not None and x != Point(0, 0) # Discard origin + ) + ) + + +if __name__ == "__main__": + main() From 00ec65e9b07cf69b34598f3afb1532ea03168be3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 8 Dec 2019 20:07:14 +0100 Subject: [PATCH 002/479] 2019: d04: ex1: add solution --- 2019/d04/ex1/ex1.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100755 2019/d04/ex1/ex1.py diff --git a/2019/d04/ex1/ex1.py b/2019/d04/ex1/ex1.py new file mode 100755 index 0000000..460b7d8 --- /dev/null +++ b/2019/d04/ex1/ex1.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +from typing import Iterator + + +def is_valid_password(p: int) -> bool: + digits = str(p) + + def has_adjacent_digit(): + for (a, b) in zip(digits, digits[1:]): + if a == b: + return True + return False + + def digits_never_decrease(): + return all(a == b for a, b in zip(sorted(digits), digits)) + + return has_adjacent_digit() and digits_never_decrease() + + +def compute_pass(begin: int, end: int) -> Iterator[int]: + for p in range(begin, end + 1): + if is_valid_password(p): + yield p + + +def main() -> None: + begin = 264793 + end = 803935 + print(sum(1 for p in compute_pass(begin, end))) + + +if __name__ == "__main__": + main() From 67a5bb9695cf98890056d68f3974bb3e30cd6b9f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 8 Dec 2019 20:13:49 +0100 Subject: [PATCH 003/479] 2019: d04: ex2: add solution --- 2019/d04/ex2/ex2.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100755 2019/d04/ex2/ex2.py diff --git a/2019/d04/ex2/ex2.py b/2019/d04/ex2/ex2.py new file mode 100755 index 0000000..883abf9 --- /dev/null +++ b/2019/d04/ex2/ex2.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +from typing import Iterator + + +def is_valid_password(p: int) -> bool: + digits = str(p) + + def has_unique_adjacent_digit(): + counts = {d: 0 for d in range(10)} + for (a, b) in zip(digits, digits[1:]): + if a == b: + counts[int(a)] += 1 + return any(count == 1 for count in counts.values()) + + def digits_never_decrease(): + return all(a == b for a, b in zip(sorted(digits), digits)) + + return has_unique_adjacent_digit() and digits_never_decrease() + + +def compute_pass(begin: int, end: int) -> Iterator[int]: + for p in range(begin, end + 1): + if is_valid_password(p): + yield p + + +def main() -> None: + begin = 264793 + end = 803935 + print(sum(1 for p in compute_pass(begin, end))) + + +if __name__ == "__main__": + main() From ab3a8a824721324d13d22f40dd9c97d8571bd4be Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 8 Dec 2019 20:58:12 +0100 Subject: [PATCH 004/479] 2019: d05: ex1: add input --- 2019/d05/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d05/ex1/input diff --git a/2019/d05/ex1/input b/2019/d05/ex1/input new file mode 100644 index 0000000..fe477a1 --- /dev/null +++ b/2019/d05/ex1/input @@ -0,0 +1 @@ +3,225,1,225,6,6,1100,1,238,225,104,0,1002,114,46,224,1001,224,-736,224,4,224,1002,223,8,223,1001,224,3,224,1,223,224,223,1,166,195,224,1001,224,-137,224,4,224,102,8,223,223,101,5,224,224,1,223,224,223,1001,169,83,224,1001,224,-90,224,4,224,102,8,223,223,1001,224,2,224,1,224,223,223,101,44,117,224,101,-131,224,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,1101,80,17,225,1101,56,51,225,1101,78,89,225,1102,48,16,225,1101,87,78,225,1102,34,33,224,101,-1122,224,224,4,224,1002,223,8,223,101,7,224,224,1,223,224,223,1101,66,53,224,101,-119,224,224,4,224,102,8,223,223,1001,224,5,224,1,223,224,223,1102,51,49,225,1101,7,15,225,2,110,106,224,1001,224,-4539,224,4,224,102,8,223,223,101,3,224,224,1,223,224,223,1102,88,78,225,102,78,101,224,101,-6240,224,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,1107,226,677,224,102,2,223,223,1006,224,329,101,1,223,223,1108,226,677,224,1002,223,2,223,1005,224,344,101,1,223,223,8,226,677,224,102,2,223,223,1006,224,359,1001,223,1,223,1007,226,677,224,1002,223,2,223,1005,224,374,101,1,223,223,1008,677,677,224,1002,223,2,223,1005,224,389,1001,223,1,223,1108,677,226,224,1002,223,2,223,1006,224,404,1001,223,1,223,1007,226,226,224,1002,223,2,223,1005,224,419,1001,223,1,223,1107,677,226,224,1002,223,2,223,1006,224,434,101,1,223,223,108,677,677,224,1002,223,2,223,1005,224,449,1001,223,1,223,1107,677,677,224,102,2,223,223,1005,224,464,1001,223,1,223,108,226,226,224,1002,223,2,223,1006,224,479,1001,223,1,223,1008,226,226,224,102,2,223,223,1005,224,494,101,1,223,223,108,677,226,224,102,2,223,223,1005,224,509,1001,223,1,223,8,677,226,224,1002,223,2,223,1006,224,524,101,1,223,223,7,226,677,224,1002,223,2,223,1006,224,539,101,1,223,223,7,677,226,224,102,2,223,223,1006,224,554,1001,223,1,223,7,226,226,224,1002,223,2,223,1006,224,569,101,1,223,223,107,677,677,224,102,2,223,223,1006,224,584,101,1,223,223,1108,677,677,224,102,2,223,223,1006,224,599,1001,223,1,223,1008,677,226,224,1002,223,2,223,1005,224,614,1001,223,1,223,8,677,677,224,1002,223,2,223,1006,224,629,1001,223,1,223,107,226,677,224,1002,223,2,223,1006,224,644,101,1,223,223,1007,677,677,224,102,2,223,223,1006,224,659,101,1,223,223,107,226,226,224,1002,223,2,223,1006,224,674,1001,223,1,223,4,223,99,226 From 7b27a4a2faa4202c8d6790623810175db7b8dc50 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 8 Dec 2019 20:58:19 +0100 Subject: [PATCH 005/479] 2019: d05: ex1: add solution --- 2019/d05/ex1/ex1.py | 101 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100755 2019/d05/ex1/ex1.py diff --git a/2019/d05/ex1/ex1.py b/2019/d05/ex1/ex1.py new file mode 100755 index 0000000..fe46167 --- /dev/null +++ b/2019/d05/ex1/ex1.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python + +from enum import IntEnum +from typing import List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +def do_addition(instr: Instruction, memory: List[int]) -> int: + lhs, rhs, dest = memory[instr.address + 1 : instr.address + 4] + if instr.p1_mode == ParameterMode.POSITION: + lhs = memory[lhs] + if instr.p2_mode == ParameterMode.POSITION: + rhs = memory[rhs] + assert instr.p3_mode != ParameterMode.IMMEDIATE # Sanity check + memory[dest] = lhs + rhs + + return 4 # Length of the instruction + + +def do_multiplication(instr: Instruction, memory: List[int]) -> int: + lhs, rhs, dest = memory[instr.address + 1 : instr.address + 4] + if instr.p1_mode == ParameterMode.POSITION: + lhs = memory[lhs] + if instr.p2_mode == ParameterMode.POSITION: + rhs = memory[rhs] + assert instr.p3_mode != ParameterMode.IMMEDIATE # Sanity check + memory[dest] = lhs * rhs + + return 4 # Length of the instruction + + +def do_input(instr: Instruction, memory: List[int]) -> int: + value = int(input()) + param = memory[instr.address + 1] + + assert instr.p1_mode == ParameterMode.POSITION # Sanity check + memory[param] = value + + return 2 # Length of the instruction + + +def do_output(instr: Instruction, memory: List[int]) -> int: + value = memory[instr.address + 1] + if instr.p1_mode == ParameterMode.POSITION: + value = memory[value] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + print(value) + + return 2 # Length of the instruction + + +def run_op(memory: List[int]) -> None: + index = 0 + while True: + instr = lookup_ops(index, memory) + if instr.op == 99: # Halt + return + elif instr.op == 1: # Sum + index += do_addition(instr, memory) + elif instr.op == 2: # Multiplication + index += do_multiplication(instr, memory) + elif instr.op == 3: # Load from input + index += do_input(instr, memory) + elif instr.op == 4: # Store to output + index += do_output(instr, memory) + + +def main() -> None: + with open("input") as mem_f: + memory = [int(n) for n in mem_f.read().split(",")] + run_op(memory) + + +if __name__ == "__main__": + main() From 35cf0da3dc4f8cd4f3ce14fc09fb632f417514b8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 8 Dec 2019 21:25:24 +0100 Subject: [PATCH 006/479] 2019: d05: ex2: add input --- 2019/d05/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d05/ex2/input diff --git a/2019/d05/ex2/input b/2019/d05/ex2/input new file mode 100644 index 0000000..fe477a1 --- /dev/null +++ b/2019/d05/ex2/input @@ -0,0 +1 @@ +3,225,1,225,6,6,1100,1,238,225,104,0,1002,114,46,224,1001,224,-736,224,4,224,1002,223,8,223,1001,224,3,224,1,223,224,223,1,166,195,224,1001,224,-137,224,4,224,102,8,223,223,101,5,224,224,1,223,224,223,1001,169,83,224,1001,224,-90,224,4,224,102,8,223,223,1001,224,2,224,1,224,223,223,101,44,117,224,101,-131,224,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,1101,80,17,225,1101,56,51,225,1101,78,89,225,1102,48,16,225,1101,87,78,225,1102,34,33,224,101,-1122,224,224,4,224,1002,223,8,223,101,7,224,224,1,223,224,223,1101,66,53,224,101,-119,224,224,4,224,102,8,223,223,1001,224,5,224,1,223,224,223,1102,51,49,225,1101,7,15,225,2,110,106,224,1001,224,-4539,224,4,224,102,8,223,223,101,3,224,224,1,223,224,223,1102,88,78,225,102,78,101,224,101,-6240,224,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,1107,226,677,224,102,2,223,223,1006,224,329,101,1,223,223,1108,226,677,224,1002,223,2,223,1005,224,344,101,1,223,223,8,226,677,224,102,2,223,223,1006,224,359,1001,223,1,223,1007,226,677,224,1002,223,2,223,1005,224,374,101,1,223,223,1008,677,677,224,1002,223,2,223,1005,224,389,1001,223,1,223,1108,677,226,224,1002,223,2,223,1006,224,404,1001,223,1,223,1007,226,226,224,1002,223,2,223,1005,224,419,1001,223,1,223,1107,677,226,224,1002,223,2,223,1006,224,434,101,1,223,223,108,677,677,224,1002,223,2,223,1005,224,449,1001,223,1,223,1107,677,677,224,102,2,223,223,1005,224,464,1001,223,1,223,108,226,226,224,1002,223,2,223,1006,224,479,1001,223,1,223,1008,226,226,224,102,2,223,223,1005,224,494,101,1,223,223,108,677,226,224,102,2,223,223,1005,224,509,1001,223,1,223,8,677,226,224,1002,223,2,223,1006,224,524,101,1,223,223,7,226,677,224,1002,223,2,223,1006,224,539,101,1,223,223,7,677,226,224,102,2,223,223,1006,224,554,1001,223,1,223,7,226,226,224,1002,223,2,223,1006,224,569,101,1,223,223,107,677,677,224,102,2,223,223,1006,224,584,101,1,223,223,1108,677,677,224,102,2,223,223,1006,224,599,1001,223,1,223,1008,677,226,224,1002,223,2,223,1005,224,614,1001,223,1,223,8,677,677,224,1002,223,2,223,1006,224,629,1001,223,1,223,107,226,677,224,1002,223,2,223,1006,224,644,101,1,223,223,1007,677,677,224,102,2,223,223,1006,224,659,101,1,223,223,107,226,226,224,1002,223,2,223,1006,224,674,1001,223,1,223,4,223,99,226 From e12a9c9333446ea38950e5cdd0e2d595e065fe6d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 8 Dec 2019 21:25:32 +0100 Subject: [PATCH 007/479] 2019: d05: ex2: add solution --- 2019/d05/ex2/ex2.py | 199 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100755 2019/d05/ex2/ex2.py diff --git a/2019/d05/ex2/ex2.py b/2019/d05/ex2/ex2.py new file mode 100755 index 0000000..b8faa4b --- /dev/null +++ b/2019/d05/ex2/ex2.py @@ -0,0 +1,199 @@ +#!/usr/bin/env python + +from dataclasses import dataclass +from enum import IntEnum +from typing import List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + + def run(self): + while True: + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + return + elif instr.op == 1: # Sum + self.do_addition(instr) + elif instr.op == 2: # Multiplication + self.do_multiplication(instr) + elif instr.op == 3: # Load from input + self.do_input(instr) + elif instr.op == 4: # Store to output + self.do_output(instr) + elif instr.op == 5: # Jump if true + self.do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self.do_jump_if_false(instr) + elif instr.op == 7: # Less than + self.do_less_than(instr) + elif instr.op == 8: # Equal to + self.do_equal_to(instr) + else: + assert False # Sanity check + + def do_addition(self, instr: Instruction) -> None: + lhs, rhs, dest = self.memory[instr.address + 1 : instr.address + 4] + + if instr.p1_mode == ParameterMode.POSITION: + lhs = self.memory[lhs] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + rhs = self.memory[rhs] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = lhs + rhs + + self.rip += 4 # Length of the instruction + + def do_multiplication(self, instr: Instruction) -> None: + lhs, rhs, dest = self.memory[instr.address + 1 : instr.address + 4] + + if instr.p1_mode == ParameterMode.POSITION: + lhs = self.memory[lhs] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + rhs = self.memory[rhs] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = lhs * rhs + + self.rip += 4 # Length of the instruction + + def do_input(self, instr: Instruction) -> None: + value = int(input()) + param = self.memory[instr.address + 1] + + assert instr.p1_mode == ParameterMode.POSITION # Sanity check + self.memory[param] = value + + self.rip += 2 # Length of the instruction + + def do_output(self, instr: Instruction) -> None: + value = self.memory[instr.address + 1] + if instr.p1_mode == ParameterMode.POSITION: + value = self.memory[value] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + print(value) + + self.rip += 2 # Length of the instruction + + def do_jump_if_true(self, instr: Instruction) -> None: + cond, value = self.memory[instr.address + 1 : instr.address + 3] + + if instr.p1_mode == ParameterMode.POSITION: + cond = self.memory[cond] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + value = self.memory[value] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def do_jump_if_false(self, instr: Instruction) -> None: + cond, value = self.memory[instr.address + 1 : instr.address + 3] + + if instr.p1_mode == ParameterMode.POSITION: + cond = self.memory[cond] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + value = self.memory[value] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def do_less_than(self, instr: Instruction) -> None: + lhs, rhs, dest = self.memory[instr.address + 1 : instr.address + 4] + + if instr.p1_mode == ParameterMode.POSITION: + lhs = self.memory[lhs] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + rhs = self.memory[rhs] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = 1 if lhs < rhs else 0 + + self.rip += 4 # Length of the instruction + + def do_equal_to(self, instr: Instruction) -> None: + lhs, rhs, dest = self.memory[instr.address + 1 : instr.address + 4] + + if instr.p1_mode == ParameterMode.POSITION: + lhs = self.memory[lhs] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + rhs = self.memory[rhs] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = 1 if lhs == rhs else 0 + + self.rip += 4 # Length of the instruction + + +def main() -> None: + with open("input") as mem_f: + memory = [int(n) for n in mem_f.read().split(",")] + computer = Computer(memory) + computer.run() + + +if __name__ == "__main__": + main() From 4b549d4b2340e9ffdfebf093b692d82c9ca113d2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 8 Dec 2019 22:13:31 +0100 Subject: [PATCH 008/479] 2019: d06: ex1: add input --- 2019/d06/ex1/input | 1069 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1069 insertions(+) create mode 100644 2019/d06/ex1/input diff --git a/2019/d06/ex1/input b/2019/d06/ex1/input new file mode 100644 index 0000000..8cafbd0 --- /dev/null +++ b/2019/d06/ex1/input @@ -0,0 +1,1069 @@ +WGB)S14 +WN4)27C +18L)M18 +1HY)6ZP +TQ9)KQ6 +HQ3)HH1 +FLC)F1Z +D6R)ZPC +2VD)GK3 +YY3)3TP +PBL)3CK +5K4)CB5 +V5M)CNN +L4T)RHS +HHH)66F +Q3Y)DTL +DGN)YY3 +CCT)L3B +Z6X)FM2 +2QQ)VK9 +MX3)C9J +4JK)BPX +8BP)N13 +PBW)6Z6 +2LT)DT9 +JHX)GXM +5LW)BHQ +DNK)ZBT +29Z)T9D +WNP)TDC +S38)GL6 +DW9)V2F +4MG)3FW +Z9Z)CPK +FKL)QNH +55D)HT2 +D1D)N4Q +Y7W)1Y8 +SFQ)79W +JSR)62W +4WN)J18 +VK9)J2H +LS5)DCX +6LR)P4X +HDV)DGQ +1K9)KD1 +2PX)17C +KSB)GL8 +B4S)VTV +ZW1)KNR +BVH)43P +VKP)6L3 +P5K)MHR +XHR)STT +WBG)5X5 +HZF)8JQ +B47)NW4 +J5V)3ZW +KGP)VVR +24K)PK8 +31V)LXC +5XG)RHP +P1G)HN8 +R76)3GY +5CH)17Q +TVC)XJM +598)RD3 +J66)LKC +4DY)YSQ +M4Y)NLL +SMP)M2M +TBR)WNP +K22)KGP +MQ5)8MN +B9Q)6HQ +P9S)X92 +TJK)ZQK +XS7)7KL +H6J)DX1 +MTP)3Z6 +B17)B7P +S12)PC2 +47V)5KW +KCY)HWP +FB2)S38 +V5M)FNT +GXM)QPR +HXR)2R2 +2LV)NDP +6HQ)12S +22P)4HL +T8Q)9FB +8YW)TVZ +DR1)NNN +9TH)87Z +79W)TM2 +5GB)HQM +1HY)4WN +LFV)RYJ +YCN)ZMK +8SR)SB3 +P9H)PH9 +ZGQ)T3J +KWW)1HY +TLF)RPG +PFD)HZR +9SF)7PY +DCX)VCC +D1R)2RB +GXC)NN9 +ZZW)SCC +G44)Q8D +923)3J2 +KY2)8F4 +1XQ)7LD +GHX)Q6M +TZ5)V32 +LM9)1XK +Q7N)Z7H +YKD)73H +9RZ)C2Q +5KN)P1G +3FJ)L73 +ZPC)VYT +Y7D)FFY +C8W)J1Y +X5T)55D +Z3F)GK8 +WRS)PRR +T9M)JK2 +81P)5WT +7KL)5BK +S3R)VCD +56L)D1R +PR2)92L +91F)2F4 +ND4)PJ6 +9KY)YD4 +CLH)5D7 +J2F)L7Z +M4Y)PYG +891)P34 +VV6)18L +RQQ)X8P +7SR)8G6 +WJ8)CDL +9FB)TXD +RKK)2H5 +3W8)2QQ +27C)YFC +RZZ)91F +4CP)BWH +T4L)LS5 +788)G7S +47V)3W8 +FGK)719 +16Q)4KW +5H6)PC9 +KGS)TBR +44Y)BVH +GMF)VFM +LKC)PM4 +DPL)DXS +2WD)X5T +XWX)NYR +N44)Y36 +72S)56L +W25)4MG +P9S)HBC +W84)3YP +NW4)S78 +58Y)LDB +QJ9)VV1 +5D3)4Q7 +T3J)5M4 +394)ZW7 +JXL)QVK +7KL)FTL +885)ZGQ +58Y)8SR +GXN)PBW +HH1)JB4 +H6J)W95 +VYK)SQS +CCS)7CZ +PJ7)NLR +2VW)MSP +ZWK)H6X +HJ4)C1S +H41)1L3 +8B9)64N +RZR)WBJ +FNT)VL7 +K5M)S5Q +XJM)TC7 +QWT)7Q5 +43P)MY2 +YP7)51N +TDX)FWZ +DB3)NCK +37M)H2L +Z3X)XRS +SGV)R2T +Y2F)63M +ZVY)JTX +DJB)KQD +848)FQP +SX3)FM5 +PH9)ZPG +75S)Z9L +GPD)Y7D +9Y6)52N +SL4)S3R +4TH)T6F +K4V)D8V +89S)18F +GDN)WN4 +6HT)TQZ +V1Q)JVG +R55)2LC +KH3)NT5 +Q53)3DN +SRV)JND +XMC)MKK +T5J)6HT +HZR)M1M +P34)3RY +HF6)SD2 +PTM)C9X +3MZ)T9M +R76)MFF +B9Y)3MC +NFG)5FC +M63)4CP +FRG)PVQ +58Z)GDM +ZT8)4L5 +F5B)KF3 +SQT)NTZ +M2M)252 +35Y)5WF +C9J)8BP +W8H)F78 +H8Z)2VW +91P)5FP +VTV)YN7 +2KM)1K9 +KSX)TR8 +9DK)XD6 +MFF)KQR +414)6L9 +FQ7)T5K +G8M)WPX +794)FMS +WZV)XS7 +VVR)5CH +R8G)9RH +B4D)2RT +PJ6)GWB +63M)NHF +8G7)8B9 +QP5)9ZW +FW6)CDM +S5Q)172 +T24)TPD +YRT)GMF +1TJ)SGV +RV3)C3D +661)MHS +QYT)D2K +T49)MFP +GY7)T2Q +686)Z4G +J49)R9L +R5S)67X +L7Z)5RM +RPP)WG9 +5KW)2KM +5N2)Y7W +Z3X)JFD +KD8)4H5 +5MP)RVK +12S)S2Y +TPD)D5F +51N)81P +DCH)SGQ +L6N)VKP +2XQ)6LR +3DN)S3L +VS4)83N +8DJ)WZP +DCX)FX1 +SF9)Z3F +R49)S99 +D1C)794 +TKN)L83 +21R)GP3 +5RM)TG3 +ZMK)R49 +1QT)152 +9DX)GXC +GYC)TQ9 +JND)LMK +D8Z)SCW +VNZ)VS4 +C1S)9RZ +LKF)D8Z +G4J)R44 +92L)J66 +88P)657 +8Z5)R55 +VV1)KRY +N44)2QK +KBC)KKG +91P)L6N +SVH)7W3 +P9Z)34H +BWH)9TH +JNX)RZZ +YFG)ZT8 +DSM)FF3 +BMK)ZR6 +7W3)V82 +T9D)H2S +2QF)PFD +NDQ)F13 +ZVB)MX6 +KRY)7FB +KKG)HJ4 +QNH)MFQ +5X5)VQM +HQM)HF6 +HLT)TD2 +WV4)FWH +N2T)5B5 +D1R)P89 +HKT)3MZ +ZQK)1DK +QQQ)FLC +73Z)TTM +ZZW)769 +8G7)TYL +MFP)WMS +RQS)2YC +NLL)JHX +KCY)CSP +9F8)51H +SGQ)B27 +4KM)VYK +JDY)MTW +T8Q)DB3 +1VL)VV6 +VV5)B4D +SPF)JR5 +LYS)6CK +YMK)2VD +TD2)1VL +JKH)QHX +VD4)58J +9QQ)HKL +8JP)HQ3 +NHS)31S +81Z)Q5W +R7Q)Z9M +WMS)ZK2 +3J2)GY7 +MFQ)CLH +S14)934 +HY7)YBT +4SY)63F +NQF)PPQ +T9W)RZR +WL2)6QM +LZV)WRQ +TVZ)T9P +4X5)GN5 +NQ8)FPQ +J5J)K51 +Y8T)WGM +FPQ)B53 +1XK)TKX +XDW)72V +WW8)9QQ +XX7)Q7N +CDM)GHX +VCC)HPP +QRK)56B +MTW)2QT +7V5)58Z +PYY)T24 +9HB)J8F +TTM)PTB +FF3)ZY3 +ZW7)D1D +T4H)ZTG +2PW)DSM +9WB)4TH +17C)FKX +T6F)QP3 +G6R)XHR +H5T)QYT +DX1)Q9L +GJF)ZF3 +LJP)JXL +QHX)3XY +DNF)8KQ +8Q1)NDQ +GP3)6MY +FPQ)QQQ +XRS)923 +Q6M)7BS +K21)B47 +TQZ)WJ4 +9PB)3PQ +8G6)X7M +L3B)YOU +L5V)G2L +B8Y)JVS +GL6)MTP +9QZ)NRN +486)T8Q +HNN)PNM +NFK)B4S +G9C)LHT +4K9)SL4 +8X5)179 +VQM)47V +CNJ)J4R +ZD5)2PX +9TQ)X9Q +Q3Q)9DK +17Q)1KX +5GN)24K +K5Q)1NF +LCK)9WB +TYL)PYL +7XG)R2L +LXC)ZWK +Q62)SPF +89C)N7Z +GK8)GR7 +6X1)5N2 +XM8)8Q1 +MCD)GXQ +S2Y)N7G +CB5)C8W +NHF)44B +QPR)GF5 +HGX)YMY +3FW)2LV +5WF)RQQ +841)N31 +Q9L)876 +WQ8)HZ7 +6K1)QVC +C2T)FQX +J3M)HLT +H2S)K5Q +STQ)8ZF +VDX)NQF +YSR)G8M +CSL)NLF +MHS)3FH +YN7)VWC +RSW)X11 +FXS)L54 +YBT)HX4 +BHQ)FRG +83H)K4Q +NT5)2ZB +GWB)4K9 +YMY)5KN +4Q7)C3G +D3J)HZF +32D)GN7 +VGG)G3D +LVG)JXR +25V)GDN +L6V)KL8 +FW2)STQ +V6H)8G7 +COM)CB6 +6Z6)SQT +W81)6M3 +D2K)XF6 +2NX)9KY +KRQ)LKF +P1B)VVQ +QTV)Q3Y +DTZ)ZLY +R3T)FQ7 +D92)72S +H8N)9Y6 +FWZ)WGB +VQW)LHJ +2HB)848 +9ZW)NT8 +NLR)QTV +31V)DSZ +92J)WXY +8LK)QQ3 +769)ZD5 +8L9)T5J +TB2)V5M +VZQ)57T +Z7H)JMR +94D)YCN +ZPF)6WK +M1F)6C2 +MHV)ZCS +Q53)FBC +RPG)P3N +RHS)JDY +FTL)FB2 +J47)R3T +Y9S)4JK +ZVY)TK6 +LTX)BM5 +D8V)3R6 +J18)S19 +PVQ)WL2 +ZPV)QFW +719)CSV +XK9)9Q9 +BM5)L5V +LDF)WZT +MSP)DTZ +HRQ)JBG +19C)GSP +GPB)HGX +2F4)8HL +886)C8J +ZF3)LM9 +NQ1)394 +WM9)M79 +PM4)GNT +6J4)ML2 +5WT)HQS +KQD)5K4 +JBT)V1Q +JVS)DDT +3G2)52L +8ZF)D6R +4BQ)5H6 +G7T)7T6 +ZY3)83H +HYC)G9C +MX6)XC9 +2NW)2SH +YXJ)JSR +QNH)YJN +TG3)886 +N7Z)G98 +5D7)KNW +8TN)KH3 +C78)TSW +87Z)DFM +QGG)Q53 +NRN)YP7 +TTB)C2T +ZLY)25P +7KS)D5X +LNX)CNJ +QVK)YMK +CNN)N43 +5Q9)MWG +SCC)XFV +885)G7T +4BS)4BQ +N4Q)Z6X +FQX)7W4 +MLL)NF8 +52N)PZ2 +DNF)KBC +6C2)CCS +LZ8)P1B +CSV)686 +PZ2)KKC +JMR)327 +3TP)N6L +3W8)YFG +S62)J5V +FF3)VXL +4X4)MHQ +3TP)7Z7 +L83)VDN +Q8D)2HB +JB4)5LR +VYT)SAN +L54)X63 +15J)XF2 +FWZ)WLR +R44)K5M +TK6)Q5J +J81)QP5 +114)BGP +QQ3)PJ7 +D5F)HNN +MFF)WW8 +J18)MP3 +9JN)M8G +2YC)CSL +R2T)4TS +ZBT)WQ8 +XFV)MPD +R9S)XDW +8HL)99X +4MG)2QF +8X5)BMK +CN7)KSB +YJN)44Y +X11)WWY +5MP)VDX +R2L)PFY +6ZP)HPW +WGM)GPB +WCZ)KCY +NYR)TKN +1L3)SKC +MND)S5K +17N)2D1 +VL7)16Q +5FP)J5J +NBL)TLF +QDV)Z9Z +2S1)VXW +K22)G6R +DTL)9Z8 +BXN)YXJ +VYW)LNX +WJ4)4LM +JTX)DPL +SLM)DNF +YM4)J37 +4L5)BF4 +2RT)8DD +FNB)KD8 +PK8)9PD +RLR)4SY +TM2)661 +PQ6)2FF +92J)XMC +GDM)21R +ZTG)VV5 +X3B)ZZW +5XQ)H6J +WTL)W1N +PNM)H8Z +6MY)CG5 +72V)RLR +3R6)WCZ +PF8)YRM +HPY)88T +X8P)MHN +7LY)6VJ +2FF)C9G +K4Q)4BS +X63)2WD +XM8)R8Q +G98)Z3X +44B)8DJ +PWZ)V1P +MDD)7ZX +RRD)T49 +YBJ)DBX +GXQ)BXP +6FX)88P +WXZ)H22 +18F)WTL +NQF)885 +L4T)XM2 +V82)4DY +6N6)TDX +172)QRK +N6L)23T +CSP)5MP +GLG)9TQ +9P6)R76 +W1N)N3F +R8G)JZ1 +H2L)F2D +TGT)C9S +7BS)2XQ +FWH)TVM +23T)K3L +WQX)37M +3ZW)QH7 +BGP)FW6 +YFC)FGH +JCF)94D +WRQ)9JN +GN5)6RM +V6H)QGG +C1S)XK9 +FFY)9SF +WPX)HKT +7Y1)NBL +6RN)GPD +NYJ)YDT +934)FKL +P3N)FXS +ZQS)KXC +4KW)PVJ +FMS)V26 +NT8)WM9 +7Z7)G4J +NN9)2TT +VXW)DJB +C97)Q3Q +VVQ)486 +CB6)DGN +DGQ)WMN +FM5)GJF +6YY)DPN +DDT)814 +KF3)SFQ +G7S)TTB +R4C)S12 +R8Q)35Y +GXN)JKH +J2H)K22 +F5B)7LY +NCK)YSR +SMP)KY2 +P4X)X3B +DR5)LZ8 +8JQ)ZPV +WG9)SX3 +NDQ)LM2 +32S)LFV +K51)ND4 +DP3)QDV +2W7)CCT +RSK)YH6 +9NZ)NSB +K3L)RV3 +HN8)414 +92N)75S +61M)598 +ZR6)53T +J8F)TB2 +H22)5YX +HSJ)M63 +4KW)5GB +HR7)89C +FQP)15J +TZ5)LYS +5FP)WG4 +4HL)PBL +C8J)D1C +TS3)83C +C3G)1QT +GZD)DNK +2RB)KSF +BCD)SF9 +327)9QZ +4FF)ZQS +6L9)82F +TJK)123 +X9M)FMY +R92)TV1 +CDL)2PW +7ZX)58Y +C2N)H5T +8MN)TH2 +GN7)G44 +HKL)61M +XD6)1C9 +ZCS)NQ8 +2L8)QGH +DFC)XX7 +S5K)XM8 +58J)8L9 +PRR)4KM +6XT)N2T +FM2)7Y1 +V26)HR7 +2TT)91P +88F)ZW1 +JBG)891 +WZT)VZQ +PYG)NHS +2QT)P9H +FB2)9QT +MP3)PQ6 +WZV)YBJ +H53)VYW +N2T)VQW +ZK2)6RT +SQS)5XQ +DPN)W8H +TSW)2L8 +73H)R7Q +F1Z)B9Q +M8G)9KS +NSB)H41 +WBJ)THR +KSF)KGS +PXH)3BS +4NT)ZRV +VNZ)8X5 +98S)DR1 +3XY)TJK +JNX)P9Z +F4P)6YY +VRT)VKV +TVM)92N +WLR)S62 +D5X)ZVB +152)9P6 +F2D)PN3 +2R2)D6K +ZRV)2NX +67X)TS3 +HWP)YBD +5FC)SRV +X92)CQR +8N9)DFC +Q5J)H8N +GGG)8LK +PPQ)841 +6RT)WJ8 +KQR)788 +92N)Q62 +W7S)98S +S19)NFK +VRM)ZVY +GL8)DCH +4YM)17N +F13)D3J +QVC)VGG +31S)J81 +934)93X +Q21)R4C +TH2)HQ4 +1C9)114 +83N)X5B +S3L)T4L +SD2)ZWX +SC1)6K1 +TXD)ZPF +3GY)NQ1 +Z9M)9NS +D6R)7V5 +WG4)C2N +SVH)JBT +TR8)K4V +MPD)7SR +Y36)DP3 +LM2)K21 +KD1)2S1 +FC8)J3M +JFD)BWF +6Y3)88F +STT)GXN +KKC)DW9 +52L)B3G +5BK)XWX +H6X)5BQ +YH6)FGK +VM3)6RN +BWH)1PZ +JK2)BCD +9QT)LTX +6WK)F5B +HYC)C97 +GSP)3MR +6M3)B9P +7LD)9NZ +N31)7KS +GGG)9PB +6RM)SC1 +83C)TGT +BWT)1TJ +7YH)CN7 +JLD)PFT +W95)JNX +ZBT)Y2F +TPD)RSK +3BS)BR6 +KG9)X9M +6HL)5D3 +WMN)P9S +V32)V6H +RYJ)3HM +SF9)SBK +HQ4)19C +BWF)2W7 +2LC)91R +VCD)3G2 +VKJ)9BJ +NL2)VKJ +NLF)HY7 +BR6)L6V +TQ4)8N9 +QH7)W84 +D6K)GGG +W1J)SLM +DB2)RQS +M18)RRD +DXS)32S +KL8)YRT +Q5W)VD4 +SCC)WQX +GQW)VRT +52N)J47 +Z9M)6FX +FKX)GSK +TKX)WRS +7YH)NFG +9Y6)WZV +7BS)48W +NT5)KSX +1Y8)RYV +814)J2F +GSK)KRQ +FBC)W1J +C9G)VRY +V2F)8TN +5M4)Y9S +X9Q)T71 +Q7G)9HB +YLR)4YM +18L)29D +M1M)1BT +82F)MX3 +9BJ)BBL +R55)HRQ +9RH)R5S +414)MHV +ML2)Y8T +179)7YH +GK3)5Q9 +7CZ)VRM +QP3)LDF +YRM)D92 +KXC)B8Y +2ZB)6X1 +XWX)JCF +B3G)CG7 +LHT)4NT +NNN)5LW +48W)R9S +91R)6J4 +97T)BBF +1BT)KWW +B53)QL9 +HBC)DB2 +2D1)89S +BBL)WBG +7WK)LJP +TV1)SNJ +K5Q)L9Q +HNN)YKD +BXP)W81 +64N)GLG +L9Q)M4Y +PTB)8JP +RHP)3FJ +657)PWZ +HZ7)T8S +YKD)W25 +PYL)SMP +YSQ)HSJ +W84)9F8 +HQS)NL2 +3MC)6Y3 +24K)MDD +G3D)B17 +2QF)PXH +38D)FNB +614)SVH +34H)BWT +6L3)GZD +J1Y)QJ9 +3XF)GG9 +MHQ)25V +3PQ)L4T +57T)3W4 +8KQ)614 +PC9)P5K +C2Q)F4P +J37)FW2 +TDC)M1F +YD4)LZV +4H5)HYC +VRY)5XG +3W4)YLR +JZ1)Q21 +SBK)1XQ +RVK)6XT +9NS)LVG +JBT)612 +J4R)QWT +YDT)31V +123)C78 +PN3)PTM +6QM)5GN +CG7)PF8 +HX4)T4H +6CK)HXR +PFT)H53 +62W)FC8 +KQ6)4X5 +3CK)8Z5 +RHS)Q7G +N13)2LT +D3J)NYJ +PFY)N44 +N3F)4FF +P89)29Z +MHN)J49 +S78)LCK +8DD)DR5 +51H)VM3 +1NF)MLL +S99)RKK +9PD)JLD +7Q5)7WK +7WK)MND +CQR)KG9 +X5B)VTN +SCW)RPP +BF4)3XF +QL9)R8G +LDB)4X4 +VDN)73Z +9KY)BXN +VTN)WJ1 +8F4)PR2 +F78)92J +7SX)GQW +GR7)22P +56B)7SX +876)HPY +HNP)V7Y +SNJ)HHH +KNR)W7S +HT2)T9W +PC2)B9Y +6VJ)HNP +4TS)32D +7FB)TZ5 +5BQ)PRT +PRT)97T +G44)9DX +THR)81Z +25P)MCD +Z9L)R92 +V1P)L1D +DSZ)TVC +VKV)TQ4 +4LM)YM4 +T8S)6N6 +HPP)WV4 +99X)8YW +B9P)HDV +T2Q)TNM +JVG)7XG +QGH)KTD +DBX)VNZ +DFM)RSW +29D)GYC +LYS)38D +MKK)WXZ +5B5)MQ5 +BPX)2NW +5LR)PYY +VXL)6HL From 5d88e60832d3eda10b6c8671469022430cdc5786 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 8 Dec 2019 22:13:54 +0100 Subject: [PATCH 009/479] 2019: d06: ex1: add solution --- 2019/d06/ex1/ex1.py | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100755 2019/d06/ex1/ex1.py diff --git a/2019/d06/ex1/ex1.py b/2019/d06/ex1/ex1.py new file mode 100755 index 0000000..d4b3cf9 --- /dev/null +++ b/2019/d06/ex1/ex1.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +import sys +from dataclasses import dataclass, field +from typing import Dict, List + + +@dataclass +class OrbitGraph: + name: str + children: List["OrbitGraph"] = field(default_factory=list) + + +def make_orbits(description: List[str]) -> OrbitGraph: + orbits: Dict[str, OrbitGraph] = {} + + def find_or_add(name: str) -> OrbitGraph: + if name in orbits: + return orbits[name] + orbit = OrbitGraph(name) + orbits[name] = orbit + return orbit + + for l in description: + parent, child = map(find_or_add, map(lambda x: x.strip(), l.split(")"))) + parent.children.append(child) + + return orbits["COM"] # Assume common root is named 'COM' + + +def count_orbits(root: OrbitGraph) -> int: + ans = 0 + stack = 0 # Count the number of direct and indirect orbits to the current root + + def helper(root: OrbitGraph): + nonlocal ans + nonlocal stack + ans += stack # Count the number of orbits to this node + stack += 1 # Add the current root to stack of parents + for child in root.children: + helper(child) # Count those orbits for each child + stack -= 1 # Remove the current root from the stack of parents + + helper(root) + return ans + + +def main() -> None: + print(count_orbits(make_orbits(sys.stdin.readlines()))) + + +if __name__ == "__main__": + main() From e411c20e5aef15d4481fa6b4089e6af696b182e2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 9 Dec 2019 16:17:23 +0100 Subject: [PATCH 010/479] 2019: d06: ex2: add input --- 2019/d06/ex2/input | 1069 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1069 insertions(+) create mode 100644 2019/d06/ex2/input diff --git a/2019/d06/ex2/input b/2019/d06/ex2/input new file mode 100644 index 0000000..8cafbd0 --- /dev/null +++ b/2019/d06/ex2/input @@ -0,0 +1,1069 @@ +WGB)S14 +WN4)27C +18L)M18 +1HY)6ZP +TQ9)KQ6 +HQ3)HH1 +FLC)F1Z +D6R)ZPC +2VD)GK3 +YY3)3TP +PBL)3CK +5K4)CB5 +V5M)CNN +L4T)RHS +HHH)66F +Q3Y)DTL +DGN)YY3 +CCT)L3B +Z6X)FM2 +2QQ)VK9 +MX3)C9J +4JK)BPX +8BP)N13 +PBW)6Z6 +2LT)DT9 +JHX)GXM +5LW)BHQ +DNK)ZBT +29Z)T9D +WNP)TDC +S38)GL6 +DW9)V2F +4MG)3FW +Z9Z)CPK +FKL)QNH +55D)HT2 +D1D)N4Q +Y7W)1Y8 +SFQ)79W +JSR)62W +4WN)J18 +VK9)J2H +LS5)DCX +6LR)P4X +HDV)DGQ +1K9)KD1 +2PX)17C +KSB)GL8 +B4S)VTV +ZW1)KNR +BVH)43P +VKP)6L3 +P5K)MHR +XHR)STT +WBG)5X5 +HZF)8JQ +B47)NW4 +J5V)3ZW +KGP)VVR +24K)PK8 +31V)LXC +5XG)RHP +P1G)HN8 +R76)3GY +5CH)17Q +TVC)XJM +598)RD3 +J66)LKC +4DY)YSQ +M4Y)NLL +SMP)M2M +TBR)WNP +K22)KGP +MQ5)8MN +B9Q)6HQ +P9S)X92 +TJK)ZQK +XS7)7KL +H6J)DX1 +MTP)3Z6 +B17)B7P +S12)PC2 +47V)5KW +KCY)HWP +FB2)S38 +V5M)FNT +GXM)QPR +HXR)2R2 +2LV)NDP +6HQ)12S +22P)4HL +T8Q)9FB +8YW)TVZ +DR1)NNN +9TH)87Z +79W)TM2 +5GB)HQM +1HY)4WN +LFV)RYJ +YCN)ZMK +8SR)SB3 +P9H)PH9 +ZGQ)T3J +KWW)1HY +TLF)RPG +PFD)HZR +9SF)7PY +DCX)VCC +D1R)2RB +GXC)NN9 +ZZW)SCC +G44)Q8D +923)3J2 +KY2)8F4 +1XQ)7LD +GHX)Q6M +TZ5)V32 +LM9)1XK +Q7N)Z7H +YKD)73H +9RZ)C2Q +5KN)P1G +3FJ)L73 +ZPC)VYT +Y7D)FFY +C8W)J1Y +X5T)55D +Z3F)GK8 +WRS)PRR +T9M)JK2 +81P)5WT +7KL)5BK +S3R)VCD +56L)D1R +PR2)92L +91F)2F4 +ND4)PJ6 +9KY)YD4 +CLH)5D7 +J2F)L7Z +M4Y)PYG +891)P34 +VV6)18L +RQQ)X8P +7SR)8G6 +WJ8)CDL +9FB)TXD +RKK)2H5 +3W8)2QQ +27C)YFC +RZZ)91F +4CP)BWH +T4L)LS5 +788)G7S +47V)3W8 +FGK)719 +16Q)4KW +5H6)PC9 +KGS)TBR +44Y)BVH +GMF)VFM +LKC)PM4 +DPL)DXS +2WD)X5T +XWX)NYR +N44)Y36 +72S)56L +W25)4MG +P9S)HBC +W84)3YP +NW4)S78 +58Y)LDB +QJ9)VV1 +5D3)4Q7 +T3J)5M4 +394)ZW7 +JXL)QVK +7KL)FTL +885)ZGQ +58Y)8SR +GXN)PBW +HH1)JB4 +H6J)W95 +VYK)SQS +CCS)7CZ +PJ7)NLR +2VW)MSP +ZWK)H6X +HJ4)C1S +H41)1L3 +8B9)64N +RZR)WBJ +FNT)VL7 +K5M)S5Q +XJM)TC7 +QWT)7Q5 +43P)MY2 +YP7)51N +TDX)FWZ +DB3)NCK +37M)H2L +Z3X)XRS +SGV)R2T +Y2F)63M +ZVY)JTX +DJB)KQD +848)FQP +SX3)FM5 +PH9)ZPG +75S)Z9L +GPD)Y7D +9Y6)52N +SL4)S3R +4TH)T6F +K4V)D8V +89S)18F +GDN)WN4 +6HT)TQZ +V1Q)JVG +R55)2LC +KH3)NT5 +Q53)3DN +SRV)JND +XMC)MKK +T5J)6HT +HZR)M1M +P34)3RY +HF6)SD2 +PTM)C9X +3MZ)T9M +R76)MFF +B9Y)3MC +NFG)5FC +M63)4CP +FRG)PVQ +58Z)GDM +ZT8)4L5 +F5B)KF3 +SQT)NTZ +M2M)252 +35Y)5WF +C9J)8BP +W8H)F78 +H8Z)2VW +91P)5FP +VTV)YN7 +2KM)1K9 +KSX)TR8 +9DK)XD6 +MFF)KQR +414)6L9 +FQ7)T5K +G8M)WPX +794)FMS +WZV)XS7 +VVR)5CH +R8G)9RH +B4D)2RT +PJ6)GWB +63M)NHF +8G7)8B9 +QP5)9ZW +FW6)CDM +S5Q)172 +T24)TPD +YRT)GMF +1TJ)SGV +RV3)C3D +661)MHS +QYT)D2K +T49)MFP +GY7)T2Q +686)Z4G +J49)R9L +R5S)67X +L7Z)5RM +RPP)WG9 +5KW)2KM +5N2)Y7W +Z3X)JFD +KD8)4H5 +5MP)RVK +12S)S2Y +TPD)D5F +51N)81P +DCH)SGQ +L6N)VKP +2XQ)6LR +3DN)S3L +VS4)83N +8DJ)WZP +DCX)FX1 +SF9)Z3F +R49)S99 +D1C)794 +TKN)L83 +21R)GP3 +5RM)TG3 +ZMK)R49 +1QT)152 +9DX)GXC +GYC)TQ9 +JND)LMK +D8Z)SCW +VNZ)VS4 +C1S)9RZ +LKF)D8Z +G4J)R44 +92L)J66 +88P)657 +8Z5)R55 +VV1)KRY +N44)2QK +KBC)KKG +91P)L6N +SVH)7W3 +P9Z)34H +BWH)9TH +JNX)RZZ +YFG)ZT8 +DSM)FF3 +BMK)ZR6 +7W3)V82 +T9D)H2S +2QF)PFD +NDQ)F13 +ZVB)MX6 +KRY)7FB +KKG)HJ4 +QNH)MFQ +5X5)VQM +HQM)HF6 +HLT)TD2 +WV4)FWH +N2T)5B5 +D1R)P89 +HKT)3MZ +ZQK)1DK +QQQ)FLC +73Z)TTM +ZZW)769 +8G7)TYL +MFP)WMS +RQS)2YC +NLL)JHX +KCY)CSP +9F8)51H +SGQ)B27 +4KM)VYK +JDY)MTW +T8Q)DB3 +1VL)VV6 +VV5)B4D +SPF)JR5 +LYS)6CK +YMK)2VD +TD2)1VL +JKH)QHX +VD4)58J +9QQ)HKL +8JP)HQ3 +NHS)31S +81Z)Q5W +R7Q)Z9M +WMS)ZK2 +3J2)GY7 +MFQ)CLH +S14)934 +HY7)YBT +4SY)63F +NQF)PPQ +T9W)RZR +WL2)6QM +LZV)WRQ +TVZ)T9P +4X5)GN5 +NQ8)FPQ +J5J)K51 +Y8T)WGM +FPQ)B53 +1XK)TKX +XDW)72V +WW8)9QQ +XX7)Q7N +CDM)GHX +VCC)HPP +QRK)56B +MTW)2QT +7V5)58Z +PYY)T24 +9HB)J8F +TTM)PTB +FF3)ZY3 +ZW7)D1D +T4H)ZTG +2PW)DSM +9WB)4TH +17C)FKX +T6F)QP3 +G6R)XHR +H5T)QYT +DX1)Q9L +GJF)ZF3 +LJP)JXL +QHX)3XY +DNF)8KQ +8Q1)NDQ +GP3)6MY +FPQ)QQQ +XRS)923 +Q6M)7BS +K21)B47 +TQZ)WJ4 +9PB)3PQ +8G6)X7M +L3B)YOU +L5V)G2L +B8Y)JVS +GL6)MTP +9QZ)NRN +486)T8Q +HNN)PNM +NFK)B4S +G9C)LHT +4K9)SL4 +8X5)179 +VQM)47V +CNJ)J4R +ZD5)2PX +9TQ)X9Q +Q3Q)9DK +17Q)1KX +5GN)24K +K5Q)1NF +LCK)9WB +TYL)PYL +7XG)R2L +LXC)ZWK +Q62)SPF +89C)N7Z +GK8)GR7 +6X1)5N2 +XM8)8Q1 +MCD)GXQ +S2Y)N7G +CB5)C8W +NHF)44B +QPR)GF5 +HGX)YMY +3FW)2LV +5WF)RQQ +841)N31 +Q9L)876 +WQ8)HZ7 +6K1)QVC +C2T)FQX +J3M)HLT +H2S)K5Q +STQ)8ZF +VDX)NQF +YSR)G8M +CSL)NLF +MHS)3FH +YN7)VWC +RSW)X11 +FXS)L54 +YBT)HX4 +BHQ)FRG +83H)K4Q +NT5)2ZB +GWB)4K9 +YMY)5KN +4Q7)C3G +D3J)HZF +32D)GN7 +VGG)G3D +LVG)JXR +25V)GDN +L6V)KL8 +FW2)STQ +V6H)8G7 +COM)CB6 +6Z6)SQT +W81)6M3 +D2K)XF6 +2NX)9KY +KRQ)LKF +P1B)VVQ +QTV)Q3Y +DTZ)ZLY +R3T)FQ7 +D92)72S +H8N)9Y6 +FWZ)WGB +VQW)LHJ +2HB)848 +9ZW)NT8 +NLR)QTV +31V)DSZ +92J)WXY +8LK)QQ3 +769)ZD5 +8L9)T5J +TB2)V5M +VZQ)57T +Z7H)JMR +94D)YCN +ZPF)6WK +M1F)6C2 +MHV)ZCS +Q53)FBC +RPG)P3N +RHS)JDY +FTL)FB2 +J47)R3T +Y9S)4JK +ZVY)TK6 +LTX)BM5 +D8V)3R6 +J18)S19 +PVQ)WL2 +ZPV)QFW +719)CSV +XK9)9Q9 +BM5)L5V +LDF)WZT +MSP)DTZ +HRQ)JBG +19C)GSP +GPB)HGX +2F4)8HL +886)C8J +ZF3)LM9 +NQ1)394 +WM9)M79 +PM4)GNT +6J4)ML2 +5WT)HQS +KQD)5K4 +JBT)V1Q +JVS)DDT +3G2)52L +8ZF)D6R +4BQ)5H6 +G7T)7T6 +ZY3)83H +HYC)G9C +MX6)XC9 +2NW)2SH +YXJ)JSR +QNH)YJN +TG3)886 +N7Z)G98 +5D7)KNW +8TN)KH3 +C78)TSW +87Z)DFM +QGG)Q53 +NRN)YP7 +TTB)C2T +ZLY)25P +7KS)D5X +LNX)CNJ +QVK)YMK +CNN)N43 +5Q9)MWG +SCC)XFV +885)G7T +4BS)4BQ +N4Q)Z6X +FQX)7W4 +MLL)NF8 +52N)PZ2 +DNF)KBC +6C2)CCS +LZ8)P1B +CSV)686 +PZ2)KKC +JMR)327 +3TP)N6L +3W8)YFG +S62)J5V +FF3)VXL +4X4)MHQ +3TP)7Z7 +L83)VDN +Q8D)2HB +JB4)5LR +VYT)SAN +L54)X63 +15J)XF2 +FWZ)WLR +R44)K5M +TK6)Q5J +J81)QP5 +114)BGP +QQ3)PJ7 +D5F)HNN +MFF)WW8 +J18)MP3 +9JN)M8G +2YC)CSL +R2T)4TS +ZBT)WQ8 +XFV)MPD +R9S)XDW +8HL)99X +4MG)2QF +8X5)BMK +CN7)KSB +YJN)44Y +X11)WWY +5MP)VDX +R2L)PFY +6ZP)HPW +WGM)GPB +WCZ)KCY +NYR)TKN +1L3)SKC +MND)S5K +17N)2D1 +VL7)16Q +5FP)J5J +NBL)TLF +QDV)Z9Z +2S1)VXW +K22)G6R +DTL)9Z8 +BXN)YXJ +VYW)LNX +WJ4)4LM +JTX)DPL +SLM)DNF +YM4)J37 +4L5)BF4 +2RT)8DD +FNB)KD8 +PK8)9PD +RLR)4SY +TM2)661 +PQ6)2FF +92J)XMC +GDM)21R +ZTG)VV5 +X3B)ZZW +5XQ)H6J +WTL)W1N +PNM)H8Z +6MY)CG5 +72V)RLR +3R6)WCZ +PF8)YRM +HPY)88T +X8P)MHN +7LY)6VJ +2FF)C9G +K4Q)4BS +X63)2WD +XM8)R8Q +G98)Z3X +44B)8DJ +PWZ)V1P +MDD)7ZX +RRD)T49 +YBJ)DBX +GXQ)BXP +6FX)88P +WXZ)H22 +18F)WTL +NQF)885 +L4T)XM2 +V82)4DY +6N6)TDX +172)QRK +N6L)23T +CSP)5MP +GLG)9TQ +9P6)R76 +W1N)N3F +R8G)JZ1 +H2L)F2D +TGT)C9S +7BS)2XQ +FWH)TVM +23T)K3L +WQX)37M +3ZW)QH7 +BGP)FW6 +YFC)FGH +JCF)94D +WRQ)9JN +GN5)6RM +V6H)QGG +C1S)XK9 +FFY)9SF +WPX)HKT +7Y1)NBL +6RN)GPD +NYJ)YDT +934)FKL +P3N)FXS +ZQS)KXC +4KW)PVJ +FMS)V26 +NT8)WM9 +7Z7)G4J +NN9)2TT +VXW)DJB +C97)Q3Q +VVQ)486 +CB6)DGN +DGQ)WMN +FM5)GJF +6YY)DPN +DDT)814 +KF3)SFQ +G7S)TTB +R4C)S12 +R8Q)35Y +GXN)JKH +J2H)K22 +F5B)7LY +NCK)YSR +SMP)KY2 +P4X)X3B +DR5)LZ8 +8JQ)ZPV +WG9)SX3 +NDQ)LM2 +32S)LFV +K51)ND4 +DP3)QDV +2W7)CCT +RSK)YH6 +9NZ)NSB +K3L)RV3 +HN8)414 +92N)75S +61M)598 +ZR6)53T +J8F)TB2 +H22)5YX +HSJ)M63 +4KW)5GB +HR7)89C +FQP)15J +TZ5)LYS +5FP)WG4 +4HL)PBL +C8J)D1C +TS3)83C +C3G)1QT +GZD)DNK +2RB)KSF +BCD)SF9 +327)9QZ +4FF)ZQS +6L9)82F +TJK)123 +X9M)FMY +R92)TV1 +CDL)2PW +7ZX)58Y +C2N)H5T +8MN)TH2 +GN7)G44 +HKL)61M +XD6)1C9 +ZCS)NQ8 +2L8)QGH +DFC)XX7 +S5K)XM8 +58J)8L9 +PRR)4KM +6XT)N2T +FM2)7Y1 +V26)HR7 +2TT)91P +88F)ZW1 +JBG)891 +WZT)VZQ +PYG)NHS +2QT)P9H +FB2)9QT +MP3)PQ6 +WZV)YBJ +H53)VYW +N2T)VQW +ZK2)6RT +SQS)5XQ +DPN)W8H +TSW)2L8 +73H)R7Q +F1Z)B9Q +M8G)9KS +NSB)H41 +WBJ)THR +KSF)KGS +PXH)3BS +4NT)ZRV +VNZ)8X5 +98S)DR1 +3XY)TJK +JNX)P9Z +F4P)6YY +VRT)VKV +TVM)92N +WLR)S62 +D5X)ZVB +152)9P6 +F2D)PN3 +2R2)D6K +ZRV)2NX +67X)TS3 +HWP)YBD +5FC)SRV +X92)CQR +8N9)DFC +Q5J)H8N +GGG)8LK +PPQ)841 +6RT)WJ8 +KQR)788 +92N)Q62 +W7S)98S +S19)NFK +VRM)ZVY +GL8)DCH +4YM)17N +F13)D3J +QVC)VGG +31S)J81 +934)93X +Q21)R4C +TH2)HQ4 +1C9)114 +83N)X5B +S3L)T4L +SD2)ZWX +SC1)6K1 +TXD)ZPF +3GY)NQ1 +Z9M)9NS +D6R)7V5 +WG4)C2N +SVH)JBT +TR8)K4V +MPD)7SR +Y36)DP3 +LM2)K21 +KD1)2S1 +FC8)J3M +JFD)BWF +6Y3)88F +STT)GXN +KKC)DW9 +52L)B3G +5BK)XWX +H6X)5BQ +YH6)FGK +VM3)6RN +BWH)1PZ +JK2)BCD +9QT)LTX +6WK)F5B +HYC)C97 +GSP)3MR +6M3)B9P +7LD)9NZ +N31)7KS +GGG)9PB +6RM)SC1 +83C)TGT +BWT)1TJ +7YH)CN7 +JLD)PFT +W95)JNX +ZBT)Y2F +TPD)RSK +3BS)BR6 +KG9)X9M +6HL)5D3 +WMN)P9S +V32)V6H +RYJ)3HM +SF9)SBK +HQ4)19C +BWF)2W7 +2LC)91R +VCD)3G2 +VKJ)9BJ +NL2)VKJ +NLF)HY7 +BR6)L6V +TQ4)8N9 +QH7)W84 +D6K)GGG +W1J)SLM +DB2)RQS +M18)RRD +DXS)32S +KL8)YRT +Q5W)VD4 +SCC)WQX +GQW)VRT +52N)J47 +Z9M)6FX +FKX)GSK +TKX)WRS +7YH)NFG +9Y6)WZV +7BS)48W +NT5)KSX +1Y8)RYV +814)J2F +GSK)KRQ +FBC)W1J +C9G)VRY +V2F)8TN +5M4)Y9S +X9Q)T71 +Q7G)9HB +YLR)4YM +18L)29D +M1M)1BT +82F)MX3 +9BJ)BBL +R55)HRQ +9RH)R5S +414)MHV +ML2)Y8T +179)7YH +GK3)5Q9 +7CZ)VRM +QP3)LDF +YRM)D92 +KXC)B8Y +2ZB)6X1 +XWX)JCF +B3G)CG7 +LHT)4NT +NNN)5LW +48W)R9S +91R)6J4 +97T)BBF +1BT)KWW +B53)QL9 +HBC)DB2 +2D1)89S +BBL)WBG +7WK)LJP +TV1)SNJ +K5Q)L9Q +HNN)YKD +BXP)W81 +64N)GLG +L9Q)M4Y +PTB)8JP +RHP)3FJ +657)PWZ +HZ7)T8S +YKD)W25 +PYL)SMP +YSQ)HSJ +W84)9F8 +HQS)NL2 +3MC)6Y3 +24K)MDD +G3D)B17 +2QF)PXH +38D)FNB +614)SVH +34H)BWT +6L3)GZD +J1Y)QJ9 +3XF)GG9 +MHQ)25V +3PQ)L4T +57T)3W4 +8KQ)614 +PC9)P5K +C2Q)F4P +J37)FW2 +TDC)M1F +YD4)LZV +4H5)HYC +VRY)5XG +3W4)YLR +JZ1)Q21 +SBK)1XQ +RVK)6XT +9NS)LVG +JBT)612 +J4R)QWT +YDT)31V +123)C78 +PN3)PTM +6QM)5GN +CG7)PF8 +HX4)T4H +6CK)HXR +PFT)H53 +62W)FC8 +KQ6)4X5 +3CK)8Z5 +RHS)Q7G +N13)2LT +D3J)NYJ +PFY)N44 +N3F)4FF +P89)29Z +MHN)J49 +S78)LCK +8DD)DR5 +51H)VM3 +1NF)MLL +S99)RKK +9PD)JLD +7Q5)7WK +7WK)MND +CQR)KG9 +X5B)VTN +SCW)RPP +BF4)3XF +QL9)R8G +LDB)4X4 +VDN)73Z +9KY)BXN +VTN)WJ1 +8F4)PR2 +F78)92J +7SX)GQW +GR7)22P +56B)7SX +876)HPY +HNP)V7Y +SNJ)HHH +KNR)W7S +HT2)T9W +PC2)B9Y +6VJ)HNP +4TS)32D +7FB)TZ5 +5BQ)PRT +PRT)97T +G44)9DX +THR)81Z +25P)MCD +Z9L)R92 +V1P)L1D +DSZ)TVC +VKV)TQ4 +4LM)YM4 +T8S)6N6 +HPP)WV4 +99X)8YW +B9P)HDV +T2Q)TNM +JVG)7XG +QGH)KTD +DBX)VNZ +DFM)RSW +29D)GYC +LYS)38D +MKK)WXZ +5B5)MQ5 +BPX)2NW +5LR)PYY +VXL)6HL From 24062ea43a39e92f44dddcc2cf96eb450924f3e5 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 9 Dec 2019 16:17:34 +0100 Subject: [PATCH 011/479] 2019: d06: ex2: add solution --- 2019/d06/ex2/ex2.py | 86 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100755 2019/d06/ex2/ex2.py diff --git a/2019/d06/ex2/ex2.py b/2019/d06/ex2/ex2.py new file mode 100755 index 0000000..427fc3f --- /dev/null +++ b/2019/d06/ex2/ex2.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python + +import sys +from dataclasses import dataclass, field +from typing import Dict, List, Optional + + +@dataclass +class OrbitGraph: + name: str + children: List["OrbitGraph"] = field(default_factory=list) + + +def make_orbits(description: List[str]) -> OrbitGraph: + orbits: Dict[str, OrbitGraph] = {} + + def find_or_add(name: str) -> OrbitGraph: + if name in orbits: + return orbits[name] + orbit = OrbitGraph(name) + orbits[name] = orbit + return orbit + + for l in description: + parent, child = map(find_or_add, map(lambda x: x.strip(), l.split(")"))) + parent.children.append(child) + + return orbits["COM"] # Assume common root is named 'COM' + + +def count_orbits_hop(root: OrbitGraph) -> int: + nodes: List[OrbitGraph] = [] + + def ind_node(node: OrbitGraph) -> int: + return nodes.index(node) + + def fill_nodes(root: OrbitGraph) -> None: + nodes.append(root) + for child in root.children: + fill_nodes(child) + + fill_nodes(root) + n = len(nodes) + dist: List[List[int]] = [[2 * n] * len(nodes) for __ in range(len(nodes))] + next_nodes: List[List[Optional[OrbitGraph]]] = [[None] * n for __ in range(n)] + + def fill_mat(root: OrbitGraph) -> None: + # From root to itself + dist[ind_node(root)][ind_node(root)] = 0 + next_nodes[ind_node(root)][ind_node(root)] = root + for child in root.children: + # From root to child + dist[ind_node(root)][ind_node(child)] = 1 + next_nodes[ind_node(root)][ind_node(child)] = child + # The other way + dist[ind_node(child)][ind_node(root)] = 1 + next_nodes[ind_node(child)][ind_node(root)] = root + # Do it again + fill_mat(child) + + fill_mat(root) + + for k in range(n): + print(f"{k} / {n} rounds") + for i in range(n): + for j in range(n): + new_dist = dist[i][k] + dist[k][j] + if dist[i][j] > new_dist: + dist[i][j] = new_dist + next_nodes[i][j] = next_nodes[i][k] + + useful_indices: Dict[str, int] = {} + for index, node in enumerate(nodes): + if node.name in ("YOU", "SAN"): + useful_indices[node.name] = index + return ( + dist[useful_indices["YOU"]][useful_indices["SAN"]] - 2 + ) # Because we are in orbit + + +def main() -> None: + print(count_orbits_hop(make_orbits(sys.stdin.readlines()))) + + +if __name__ == "__main__": + main() From 74847ab4d80e3e124b116cfc84bc3c8c8675443e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 9 Dec 2019 17:42:55 +0100 Subject: [PATCH 012/479] 2019: d07: ex1: add input --- 2019/d07/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d07/ex1/input diff --git a/2019/d07/ex1/input b/2019/d07/ex1/input new file mode 100644 index 0000000..7c263e6 --- /dev/null +++ b/2019/d07/ex1/input @@ -0,0 +1 @@ +3,8,1001,8,10,8,105,1,0,0,21,46,55,76,89,106,187,268,349,430,99999,3,9,101,4,9,9,1002,9,2,9,101,5,9,9,1002,9,2,9,101,2,9,9,4,9,99,3,9,1002,9,5,9,4,9,99,3,9,1001,9,2,9,1002,9,4,9,101,2,9,9,1002,9,3,9,4,9,99,3,9,1001,9,3,9,1002,9,2,9,4,9,99,3,9,1002,9,4,9,1001,9,4,9,102,5,9,9,4,9,99,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,99,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,99,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,99 From cb6025af46c745fb1f57d3a3db70a9a52d3f7386 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 9 Dec 2019 17:43:02 +0100 Subject: [PATCH 013/479] 2019: d07: ex1: add solution --- 2019/d07/ex1/ex1.py | 259 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 259 insertions(+) create mode 100755 2019/d07/ex1/ex1.py diff --git a/2019/d07/ex1/ex1.py b/2019/d07/ex1/ex1.py new file mode 100755 index 0000000..1808ec8 --- /dev/null +++ b/2019/d07/ex1/ex1.py @@ -0,0 +1,259 @@ +#!/usr/bin/env python + +import itertools +import sys +from copy import deepcopy +from dataclasses import dataclass +from enum import IntEnum +from typing import Callable, List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + read_input: Callable[[], str] = input + print_output: Callable[[int], None] = print + + def run(self) -> None: + is_halted = self.run_single() + while not is_halted: + is_halted = self.run_single() + + def run_single(self) -> bool: # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + return True # Halted + elif instr.op == 1: # Sum + self.do_addition(instr) + elif instr.op == 2: # Multiplication + self.do_multiplication(instr) + elif instr.op == 3: # Load from input + self.do_input(instr) + elif instr.op == 4: # Store to output + self.do_output(instr) + elif instr.op == 5: # Jump if true + self.do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self.do_jump_if_false(instr) + elif instr.op == 7: # Less than + self.do_less_than(instr) + elif instr.op == 8: # Equal to + self.do_equal_to(instr) + else: + assert False # Sanity check + return False # Not halted + + def do_addition(self, instr: Instruction) -> None: + lhs, rhs, dest = self.memory[instr.address + 1 : instr.address + 4] + + if instr.p1_mode == ParameterMode.POSITION: + lhs = self.memory[lhs] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + rhs = self.memory[rhs] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = lhs + rhs + + self.rip += 4 # Length of the instruction + + def do_multiplication(self, instr: Instruction) -> None: + lhs, rhs, dest = self.memory[instr.address + 1 : instr.address + 4] + + if instr.p1_mode == ParameterMode.POSITION: + lhs = self.memory[lhs] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + rhs = self.memory[rhs] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = lhs * rhs + + self.rip += 4 # Length of the instruction + + def do_input(self, instr: Instruction) -> None: + value = int(self.read_input()) + param = self.memory[instr.address + 1] + + assert instr.p1_mode == ParameterMode.POSITION # Sanity check + self.memory[param] = value + + self.rip += 2 # Length of the instruction + + def do_output(self, instr: Instruction) -> None: + value = self.memory[instr.address + 1] + if instr.p1_mode == ParameterMode.POSITION: + value = self.memory[value] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + self.print_output(value) + + self.rip += 2 # Length of the instruction + + def do_jump_if_true(self, instr: Instruction) -> None: + cond, value = self.memory[instr.address + 1 : instr.address + 3] + + if instr.p1_mode == ParameterMode.POSITION: + cond = self.memory[cond] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + value = self.memory[value] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def do_jump_if_false(self, instr: Instruction) -> None: + cond, value = self.memory[instr.address + 1 : instr.address + 3] + + if instr.p1_mode == ParameterMode.POSITION: + cond = self.memory[cond] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + value = self.memory[value] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def do_less_than(self, instr: Instruction) -> None: + lhs, rhs, dest = self.memory[instr.address + 1 : instr.address + 4] + + if instr.p1_mode == ParameterMode.POSITION: + lhs = self.memory[lhs] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + rhs = self.memory[rhs] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = 1 if lhs < rhs else 0 + + self.rip += 4 # Length of the instruction + + def do_equal_to(self, instr: Instruction) -> None: + lhs, rhs, dest = self.memory[instr.address + 1 : instr.address + 4] + + if instr.p1_mode == ParameterMode.POSITION: + lhs = self.memory[lhs] + else: + assert instr.p1_mode == ParameterMode.IMMEDIATE # Sanity check + + if instr.p2_mode == ParameterMode.POSITION: + rhs = self.memory[rhs] + else: + assert instr.p2_mode == ParameterMode.IMMEDIATE # Sanity check + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = 1 if lhs == rhs else 0 + + self.rip += 4 # Length of the instruction + + +def main() -> None: + def get_input_fun(phase: int, last_output: List[int]) -> Callable[[], str]: + has_been_called = False + + def _input() -> str: + nonlocal has_been_called + if has_been_called: + return str(last_output.pop(0)) + has_been_called = True + return str(phase) + + return _input + + memory = [int(n) for n in sys.stdin.read().split(",")] + max = 0 + ans = tuple(-1 for __ in range(5)) + for a, b, c, d, e in itertools.permutations(range(5)): + amp1 = Computer(deepcopy(memory)) + amp1_output: List[int] = [] + amp1.read_input = get_input_fun(a, [0]) + amp1.print_output = lambda x: amp1_output.append(int(x)) + + amp2 = Computer(deepcopy(memory)) + amp2_output: List[int] = [] + amp2.read_input = get_input_fun(b, amp1_output) + amp2.print_output = lambda x: amp2_output.append(int(x)) + + amp3 = Computer(deepcopy(memory)) + amp3_output: List[int] = [] + amp3.read_input = get_input_fun(c, amp2_output) + amp3.print_output = lambda x: amp3_output.append(int(x)) + + amp4 = Computer(deepcopy(memory)) + amp4_output: List[int] = [] + amp4.read_input = get_input_fun(d, amp3_output) + amp4.print_output = lambda x: amp4_output.append(int(x)) + + amp5 = Computer(deepcopy(memory)) + amp5_output: List[int] = [] + amp5.read_input = get_input_fun(e, amp4_output) + amp5.print_output = lambda x: amp5_output.append(int(x)) + + amp1.run() + amp2.run() + amp3.run() + amp4.run() + amp5.run() + + res = amp5_output.pop(0) + if res > max: + max = res + ans = (a, b, c, d, e) + print(f"Max: {max}, res: {ans}") + + print(f"Final one: {max}, with {ans}") + + +if __name__ == "__main__": + main() From 77bcb1e5605a8fe543ae54bedb4e3796e454f41e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 10 Dec 2019 23:50:05 +0100 Subject: [PATCH 014/479] 2019: d07: ex2: add input --- 2019/d07/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d07/ex2/input diff --git a/2019/d07/ex2/input b/2019/d07/ex2/input new file mode 100644 index 0000000..7c263e6 --- /dev/null +++ b/2019/d07/ex2/input @@ -0,0 +1 @@ +3,8,1001,8,10,8,105,1,0,0,21,46,55,76,89,106,187,268,349,430,99999,3,9,101,4,9,9,1002,9,2,9,101,5,9,9,1002,9,2,9,101,2,9,9,4,9,99,3,9,1002,9,5,9,4,9,99,3,9,1001,9,2,9,1002,9,4,9,101,2,9,9,1002,9,3,9,4,9,99,3,9,1001,9,3,9,1002,9,2,9,4,9,99,3,9,1002,9,4,9,1001,9,4,9,102,5,9,9,4,9,99,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,99,3,9,101,1,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,99,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,99,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,99 From df3542b7d87d89b0a49453b51736f566bc93fcca Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 10 Dec 2019 23:50:12 +0100 Subject: [PATCH 015/479] 2019: d07: ex2: add solution --- 2019/d07/ex2/ex2.py | 196 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100755 2019/d07/ex2/ex2.py diff --git a/2019/d07/ex2/ex2.py b/2019/d07/ex2/ex2.py new file mode 100755 index 0000000..8f5e209 --- /dev/null +++ b/2019/d07/ex2/ex2.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python + +import itertools +import sys +from copy import deepcopy +from dataclasses import dataclass, field +from enum import IntEnum +from typing import List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_single(self): # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + else: + assert False # Sanity check + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = lhs + rhs + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = lhs * rhs + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + assert instr.p1_mode == ParameterMode.POSITION # Sanity check + self.memory[param] = value + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = 1 if lhs < rhs else 0 + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + assert instr.p3_mode == ParameterMode.POSITION # Sanity check + self.memory[dest] = 1 if lhs == rhs else 0 + + self.rip += 4 # Length of the instruction + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + max = 0 + ans = tuple(-1 for __ in range(5)) + for perm in itertools.permutations(range(5, 10)): + amps = [Computer(deepcopy(memory), input_list=[phase]) for phase in perm] + + amp1 = amps[0] # Keep track of this guy for the output solution + amp1.input_list.append(0) # Initial input + + while not all(amp.is_halted for amp in amps): + # Put a non halted comuter to the front + while amps[0].is_halted: + amps.append(amps.pop(0)) + # Run it until exhaustion or input/output interrupt + try: + amps[0].run() + except InputInterrupt: + amps.append(amps.pop(0)) + except OutputInterrupt: + amps[1].input_list.append(amps[0].output_list.pop()) + + res = amp1.input_list.pop(0) # Amplifier 5 output to amplifier 1 at the end + if res > max: + max = res + ans = perm + print(f"Max: {max}, res: {ans}") + + print(f"Final one: {max}, with {ans}") + + +if __name__ == "__main__": + main() From a37ef81ec3d4c31e14219b6589bdd8b29c08654a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 00:08:34 +0100 Subject: [PATCH 016/479] 2019: d08: ex1: add input --- 2019/d08/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d08/ex1/input diff --git a/2019/d08/ex1/input b/2019/d08/ex1/input new file mode 100644 index 0000000..e1cd4f9 --- /dev/null +++ b/2019/d08/ex1/input @@ -0,0 +1 @@ +212222222222220102221222222222222221222220222200222222222222200222200222222212222002221222202002222220202222221222222222222222222222220122202222222022222222222222222112222222222222222220222220222220222222222222220222221222222222222222220222202022222221222222220222222222222222222222220122212222222222202222222222220002221222222222222221222221222212222222222222221222211222222202222012221222202222222221212222220222222222222222222222221122202222222022222222222222222022221222222222222221222222222210222222222222211222222222222202222002221222212122222221212222222222222222222222222222222222212222222122202222222222222002221222222222222221222221222220222222222222212222212222222222222022222222202012202222202222220222222222222222222222221022212222222122212222222222220212222222222222222221222220222212222222222222211222211222222202222112220222212112222221202222220222222222222222222222221022222222222222212222222222222212221222222222222222222222222220222222222222221222222222222212222112222222202102212221222222220222222222222222222222222222212222222222202222222222222022222222222222222221221221222202222222222222212222201222222202222022220222222102212222222222222222222222222222222222220022222222222222202222222222220202222222212222222220222220222220222222222222200222220222222212222222222222212102212220222222220222222222222222222222221022222222222020222222222222220112220222202222222220220221222211222222222222201222202222222212222102221222212102202220222222220222222222222222222212221122212222222221202222222222222212222222202222222221221221222202222222220222221222202222222222222112220222222212202220222222222222222222222222222212220022222222222221222222222222220102221222202222222220222222222211222222220222211222221222222202222022220222222012222220212222222222222222222222222202222122222222222020202222222222221112222222222222222220220220222211222222220222220222201222222222222102222222212222212221222222222222222222222222222202220022222222222120222222222222220122221222222222222220222222222210222222221222222222220222222212222022221222222222222221212222222222222222222022222222220122212222222020222222222222221012222222212222222222221222222222222222220222220222200222222212222012220222202102222220222222220222222222222022222202222022212222222222202222222222222212221222212222222222022220222221222222222222211122222222222202222102220222212102212222212222220222222222222122222222220222202222222120212222222222222212220222222222222220121221222210222222222022201022210222222222222022220222222012202220212222220222222222222022222222220222212222222022222222222222222202222222212222222222121221222211222222220122212102212222222222222122222222222202222220222222222222222222202222222212221022202222222222222222222222222112220222202222222220222222222201222222220222221222221222222222222222220222212222202221222222220222222222202022222212221022202222222021202222222222222022221222212222222220020221220222222222222222200122201212122202222122222222202202212222202222221222222222202122222202222222212221222220202222222222222102220222212222222221021222222201222222221122201012202202122212222212220222222212212221202222222222222222202022222212220022222221222020212222222222202102222222202222222221121221221222222222221022102002221212022202222012221222222112212221212222220222222222222122222212220122212220222120222222222222200202220222212022222221022222221222222222222222102012211222122212222022222222222222222220202222222222222222202122222212121222202222222121212222222222222112221222222022222222120222201211222222222022121122210202022202222212221222222012222222202222220222222222202222222202120022212221222222202222222222212122220222222222222222221220202212222222221022012212221202122202222102220222212022202222212222222222222222212122222202122022212220222220202222222222200202220222212122222222021220201220222222220222012202200212122222222112221222222122202220222222222222222222202022222212121222212221222022212222222222211222222222202222222221021221220221222222220122011012102222122212222222222222212122202220212222222222222222202022222202121122202021222022222222222222210022220222222122222220021221222221222222222122001002000222022222222022220222212112202221202222221222222222222122222212122222202221222222222222222222211012222222222122222221201222211212222222220022202012200222122212222122220222212012202220202222222222222222222122222222121022222020222221202222222222220202222222222122222222111222122200222222220022011212112212122212222102220222202022222220212222220222222222212122222202122022222221222122212222222222221222222222202222222220110220201101222222221022120212021222022212222112221222202102222220202222220222222222222022222202222122202221222121212222222222222122220222222222222222002222210010222222220022021212222202122222222102221222202222212221222220220222222222222022222202021122212022222021222222222222211002221222212022222222120221022202221222222122022212202222122212222022220222212122222221202220221222222222202022222202221022212220222221222222222222221212222221222222222220120222202211220222222022101002021202122212222102221222112112212022202222222222222222212022222202021022202022222221222222222222211212221222202022222221021222011211220221221022220222222202122202222112221222202022202121212222221222222222202022222212222222212022222120222222222222221112220222202022222222220222222211220222220122001022000202022212222122221222102012212221212221220222222220212022222202020222212022222122222222222222200002220222212122222220020222110202220220222022122002202202222212222122222222202212222122212221222222222220212022222202222022212221222222202222222222210212222220222222222222202222001022221222222222111102111222122222222222220222002212222220212221221222220221222022222202222122212120222222222222222222222022220222212122222220222222120021220221221022001202220222122202222012221222012022202020222202222222221221222022222202220022212021222021202222222222200012221220202222222222200221121002221221222022112012202212122212222102222222102212212221202201221222220221202222222222220122212021222221222222222222222012221221222022222021002220102110220220221122000102011212022212222202220222222222222121212211200222220221222122222212220122222221222122212222222222202102220220222122222221101212012002222221222022112112202212022222022002221222002122222020202202202222221220222102222222220122202120022021202222222222222002222222222222222221100202002202221221221222200002222222222222021112220222022102202022222200201222221222212112222202121222222222122120202222222222212222222221212122222121100201201210222220221122211122220202222212122222221222002012202121202220212222220221202122222022121222212221022022202222222222210212200220212022222122112221012220220222222222201202111222122222121102220222022222222122222200202222222222202212222202221122222020122220202222222222221122220221222022222020112222111100220220221022022212120212122202222102220222102212222121202200220222220222222222222021220022202120022122202222222222210122211222202022222222100220222212220220222022211122002222022202021220222222022222212120202220200222222221222002222101120122212220022022202202222222211002222212212022220021000210010021220222221122111122120222222212021220222222212002202222212202201222222202222022222100222122202222022122222222222222220202201210222022222120100222110212222222222122212212110202122202020101222222022102202122202201211222222212202101222200221022202122122120212202222222220222200212222122222020011202100212201220221022012212202202022222221211222222222122202021202202220222220211222212222200221022222222122021202222222222202112210202202022221020211212120121210220222122210022011212222222222210221222202222222222202200220222220210212110222002122022212221222222222222222222220012201122212022220222011222010112221221220222120102010202222212220010222222222222202020212220200222222210222221222002120222212220122021212212222222200022222201202122220022212202020021202220222222221222112212122222122002220222022122202221212211220222220212222022222100122022222220222022202202222222221112202021202222220120120201000121221220220222212002202212022222022012222222112112222021212211222222212220222200022102022122202021122022212212222222222002201001212122221220020222220021220220222222222222001212122202122201222222202012202121212212222222222221222212122211220122222220122022202222222222211102220100212222222220000200212112211222220222020022212222022222222220222222102202212121202201221222212211222101022202020022202221122021212202222222210102222211212022221121202212102210212221220022210002202202222202222000221222202002222121202200201222212221222022022201122222212222222122222222222222222212211210222222222122122210221201212222220122011212112212022212020212221222122212202221212201222222202202222212022211122222212221022120222212222222220012200210222122220222000212002121201221222022011022100222222212022222222222002012202021212201221222210211212111222201220122212222122022202222222222222112222222202222220022001221000000211222221222120102200222022202220220222222112202212221212210221222201200222112021120220122202020222122222212222222221102222121222222222020011222001212220221220022202202000202122212122201220222002102222022212220210222212222212012122012020022222021122121212222222222222122211010212022222020210202001120201221222022222112220212022222120111222222022202202222212200222222220201202120120221022122222022022020202222222222220122221200222022222121011212210222211220222122122012221222022202022101220222002222202220212220220222200211212221020211020222202122122221212202222222200002220020202222220222021201102000212220221122001002122222222202222212221222122012222221222200221222201210222022221110022022202121022120222222222222200222201220212022220120100212112010212220221122102002011202222212120110220222012222222220222210222222202201212001120210022222222120222020222202222222222002210000212122221122022201011120211220220022200112101212122212220202221222222222222021222221210222221221222002122221120022222122022121212202222022200002222011202122220022110212211002210220220022120012221222222202120100221222122002222120212201200222200222222100001022222122202122122222212212220022201022202102212122221022000220112102221222221122202102211222022202122110222222102212222120212202221222211221202200022112220122222220222021222212222122202102201202212022221220102221201222220222221122100122102202222212220010221222222022212221202211212222220210222211100110221222222121122020202222222122202122201202222022222022120212110222212221222022122002101202022222121211221222122122202122222220200222202211222021210100221122212222222220212222220022220122210122202222221221022202002221201200221022020112101222222222022110220222202112202220202222202222200202222210001001121222202022022220212202220122201002220021222022222222012212010000210222220022001012121212022222120110221222112112202220222210201222200221202000222200021122212022122020212222221122201102220011222222222021200212021001210211221122120202111222122222122110220220202022222220202201222222201211202112222201021122212021222001222222220122221222202201202122222022221222220111202200220222000022022222122222120002220222102212202022222200202222221210102112202011121122202020022222202222221222221022212121202022220220211201101122220200222022221222110222122202122101220220022222222221212210202222200211012122201122220122202222022201212222220022220010220210202122222121121220121021221021221122220212220222222212122021222221201002202120212212200022202210222101100220122022212121122022202222220222211022202010202022220120100201200210202101221122002122020202220222121101220222222122202110222220200022201202002210222012022122202222222200212202222022202011210200202022222221122200000101201022221222112202212222220202021002222220011002222010202220220122200220012112212010120222202122222102202202221222220101212212212122220020020221112200201012222122111102102202020202021202221120100122212011222201200122221202112110122202221022212221222121122202220222201201211021222222220020102210020221222000221122021022022212121212120221222121022122212022212110212222210200102112212020121022212022022020202222222022210100202102212222222221012200000100212222222022120012020202220202122010222120012122212022222120200022200222102210211101020022222022222011222212220022212210201200222222221021200201202021200020220222022002210212002202121221221020000022022222202220220222201212122100102200022122222020022220102222220122210000201020220222222122201220010121212212221022102102102202110222122120221220200012022111212022202022201201022220202100122022212122222222212202221122212022210101202122222221212212022201202210221222201012012212100222020122220122112022102011212202212022211200010200202121121022222121122111102222220122202210222211220022220222221212212212201101211022000002022202101201020001220120200002002121202211211222212200222110110222020022202020222222002212222122212222122121200022221121000002212220201122202122020102001202200202020110210022000002012122222212220022212210110020001100122122222222122101012202221022200112111101200020220121022011121010210112201122121222111202122212121000212120002022202002212010220022211210020012122002121122212022022011222202221022212110201201200021222121201200211120221011220022101002021222120222021102222220121212122012222202222222222222012011221000022222202121122111212222221122202222101122210022222121101200020011210121220222102112001212002202222110200020121122122201222220201022210210222000101020222022222120022022202222221122210221222102222021221021202200220111201200200022002202002212120202121200020122201202202012212100220222200220120122112111121022222222122011112212220022202220121100220221222222012122120201211212221122100102112002001221121110012120011002002102222221201122220200101011121000122022202122120221102212220222222221012021200022220021121021022122212012211102022102010222010221220010222120202002122100212212202122202220011000010102222022202221221011022202220122222112100201201221220221200010201202211222210202122222010001001211220202100020101202202211112112210122210101200121110022021022112222221120112222220022200120112022211220222121010011112011220110220012021202120000020210222211112021212112112101112101200122210000222102010121220122122221122101202221221022222110222100221121221122002220202221210121212202120202112002021211201101210120122202012002222200220222200221202211100101120122212120120211202201220022210121220222201021221020210201210120210200221202101122000000020211212120001120212212122010202220220122211002212020110221221222102021021210112200222222222112212002202122221221220022101101200200211002120002201122122201220202201220212122002212022221202222222120201100210221121222212122122212022211222222201101102022201222220020001001111000201002221002210222120100212210100011222222121012212022022010222022220002022021120122021222012020121120202200222122202020222002210022221222121120112222211210211202221022010012002210211012222122100012202101012101210022222001120022201222120022222220212010211022002101122021120011020110100201212120111001012121022120021001200001210120201112022212102111100210020221011201001201222212211020210000121202201011 From 1b5bd3faf56bdc46237684f8e4c455aeb4a84dfd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 00:08:42 +0100 Subject: [PATCH 017/479] 2019: d08: ex1: add solution --- 2019/d08/ex1/ex1.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 2019/d08/ex1/ex1.py diff --git a/2019/d08/ex1/ex1.py b/2019/d08/ex1/ex1.py new file mode 100755 index 0000000..b2ac967 --- /dev/null +++ b/2019/d08/ex1/ex1.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import sys + + +def main() -> None: + COLUMNS = 25 + ROWS = 6 + digits = [int(d) for d in str(int(sys.stdin.read()))] + + assert len(digits) % (COLUMNS * ROWS) == 0 # Sanity check + LAYERS = int(len(digits) / (COLUMNS * ROWS)) + + layers = [ + [digits.pop(0) for __ in range(COLUMNS) for __ in range(ROWS)] + for __ in range(LAYERS) + ] + + least_zeros = min(layers, key=lambda l: sum(1 for d in l if d == 0)) + + print(sum(1 for d in least_zeros if d == 1) * sum(1 for d in least_zeros if d == 2)) + + +if __name__ == "__main__": + main() From 83355136231a0d245cb6b767ab1bebc84d1ac6f2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 00:22:15 +0100 Subject: [PATCH 018/479] 2019: d08: ex2: add input --- 2019/d08/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d08/ex2/input diff --git a/2019/d08/ex2/input b/2019/d08/ex2/input new file mode 100644 index 0000000..e1cd4f9 --- /dev/null +++ b/2019/d08/ex2/input @@ -0,0 +1 @@ +212222222222220102221222222222222221222220222200222222222222200222200222222212222002221222202002222220202222221222222222222222222222220122202222222022222222222222222112222222222222222220222220222220222222222222220222221222222222222222220222202022222221222222220222222222222222222222220122212222222222202222222222220002221222222222222221222221222212222222222222221222211222222202222012221222202222222221212222220222222222222222222222221122202222222022222222222222222022221222222222222221222222222210222222222222211222222222222202222002221222212122222221212222222222222222222222222222222222212222222122202222222222222002221222222222222221222221222220222222222222212222212222222222222022222222202012202222202222220222222222222222222222221022212222222122212222222222220212222222222222222221222220222212222222222222211222211222222202222112220222212112222221202222220222222222222222222222221022222222222222212222222222222212221222222222222222222222222220222222222222221222222222222212222112222222202102212221222222220222222222222222222222222222212222222222202222222222222022222222222222222221221221222202222222222222212222201222222202222022220222222102212222222222222222222222222222222222220022222222222222202222222222220202222222212222222220222220222220222222222222200222220222222212222222222222212102212220222222220222222222222222222222221022222222222020222222222222220112220222202222222220220221222211222222222222201222202222222212222102221222212102202220222222220222222222222222222212221122212222222221202222222222222212222222202222222221221221222202222222220222221222202222222222222112220222222212202220222222222222222222222222222212220022222222222221222222222222220102221222202222222220222222222211222222220222211222221222222202222022220222222012222220212222222222222222222222222202222122222222222020202222222222221112222222222222222220220220222211222222220222220222201222222222222102222222212222212221222222222222222222222222222202220022222222222120222222222222220122221222222222222220222222222210222222221222222222220222222212222022221222222222222221212222222222222222222022222222220122212222222020222222222222221012222222212222222222221222222222222222220222220222200222222212222012220222202102222220222222220222222222222022222202222022212222222222202222222222222212221222212222222222022220222221222222222222211122222222222202222102220222212102212222212222220222222222222122222222220222202222222120212222222222222212220222222222222220121221222210222222222022201022210222222222222022220222222012202220212222220222222222222022222222220222212222222022222222222222222202222222212222222222121221222211222222220122212102212222222222222122222222222202222220222222222222222222202222222212221022202222222222222222222222222112220222202222222220222222222201222222220222221222221222222222222222220222212222202221222222220222222222202022222212221022202222222021202222222222222022221222212222222220020221220222222222222222200122201212122202222122222222202202212222202222221222222222202122222202222222212221222220202222222222222102220222212222222221021222222201222222221122201012202202122212222212220222222212212221202222222222222222202022222212220022222221222020212222222222202102222222202222222221121221221222222222221022102002221212022202222012221222222112212221212222220222222222222122222212220122212220222120222222222222200202220222212022222221022222221222222222222222102012211222122212222022222222222222222220202222222222222222202122222212121222202222222121212222222222222112221222222022222222120222201211222222222022121122210202022202222212221222222012222222202222220222222222202222222202120022212221222222202222222222212122220222222222222222221220202212222222221022012212221202122202222102220222212022202222212222222222222222212122222202122022212220222220202222222222200202220222212122222222021220201220222222220222012202200212122222222112221222222122202220222222222222222222202022222212121222212221222022212222222222211222222222202222222221021221220221222222220122011012102222122212222222222222212122202220212222222222222222202022222202121122202021222022222222222222210022220222222122222220021221222221222222222122001002000222022222222022220222212112202221202222221222222222222122222212122222202221222222222222222222211012222222222122222221201222211212222222220022202012200222122212222122220222212012202220202222222222222222222122222222121022222020222221202222222222220202222222222122222222111222122200222222220022011212112212122212222102220222202022222220212222220222222222212122222202122022222221222122212222222222221222222222202222222220110220201101222222221022120212021222022212222112221222202102222220202222220222222222222022222202222122202221222121212222222222222122220222222222222222002222210010222222220022021212222202122222222102221222202222212221222220220222222222222022222202021122212022222021222222222222211002221222212022222222120221022202221222222122022212202222122212222022220222212122222221202220221222222222202022222202221022212220222221222222222222221212222221222222222220120222202211220222222022101002021202122212222102221222112112212022202222222222222222212022222202021022202022222221222222222222211212221222202022222221021222011211220221221022220222222202122202222112221222202022202121212222221222222222202022222212222222212022222120222222222222221112220222202022222222220222222211220222220122001022000202022212222122221222102012212221212221220222222220212022222202020222212022222122222222222222200002220222212122222220020222110202220220222022122002202202222212222122222222202212222122212221222222222220212022222202222022212221222222202222222222210212222220222222222222202222001022221222222222111102111222122222222222220222002212222220212221221222220221222022222202222122212120222222222222222222222022220222212122222220222222120021220221221022001202220222122202222012221222012022202020222202222222221221222022222202220022212021222021202222222222200012221220202222222222200221121002221221222022112012202212122212222102222222102212212221202201221222220221202222222222220122212021222221222222222222222012221221222022222021002220102110220220221122000102011212022212222202220222222222222121212211200222220221222122222212220122222221222122212222222222202102220220222122222221101212012002222221222022112112202212022222022002221222002122222020202202202222221220222102222222220122202120022021202222222222222002222222222222222221100202002202221221221222200002222222222222021112220222022102202022222200201222221222212112222202121222222222122120202222222222212222222221212122222121100201201210222220221122211122220202222212122222221222002012202121202220212222220221202122222022121222212221022022202222222222210212200220212022222122112221012220220222222222201202111222122222121102220222022222222122222200202222222222202212222202221122222020122220202222222222221122220221222022222020112222111100220220221022022212120212122202222102220222102212222121202200220222220222222222222021220022202120022122202222222222210122211222202022222222100220222212220220222022211122002222022202021220222222022222212120202220200222222221222002222101120122212220022022202202222222211002222212212022220021000210010021220222221122111122120222222212021220222222212002202222212202201222222202222022222100222122202222022122222222222222220202201210222022222120100222110212222222222122212212110202122202020101222222022102202122202201211222222212202101222200221022202122122120212202222222220222200212222122222020011202100212201220221022012212202202022222221211222222222122202021202202220222220211222212222200221022222222122021202222222222202112210202202022221020211212120121210220222122210022011212222222222210221222202222222222202200220222220210212110222002122022212221222222222222222222220012201122212022220222011222010112221221220222120102010202222212220010222222222222202020212220200222222210222221222002120222212220122021212212222222200022222201202122220022212202020021202220222222221222112212122222122002220222022122202221212211220222220212222022222100122022222220222022202202222222221112202021202222220120120201000121221220220222212002202212022222022012222222112112222021212211222222212220222200022102022122202021122022212212222222222002201001212122221220020222220021220220222222222222001212122202122201222222202012202121212212222222222221222212122211220122222220122022202222222222211102220100212222222220000200212112211222220222020022212222022222222220222222102202212121202201221222212211222101022202020022202221122021212202222222210102222211212022221121202212102210212221220022210002202202222202222000221222202002222121202200201222212221222022022201122222212222222122222222222222222212211210222222222122122210221201212222220122011212112212022212020212221222122212202221212201222222202202222212022211122222212221022120222212222222220012200210222122220222000212002121201221222022011022100222222212022222222222002012202021212201221222210211212111222201220122212222122022202222222222222112222222202222220022001221000000211222221222120102200222022202220220222222112202212221212210221222201200222112021120220122202020222122222212222222221102222121222222222020011222001212220221220022202202000202122212122201220222002102222022212220210222212222212012122012020022222021122121212222222222222122211010212022222020210202001120201221222022222112220212022222120111222222022202202222212200222222220201202120120221022122222022022020202222222222220122221200222022222121011212210222211220222122122012221222022202022101220222002222202220212220220222200211212221020211020222202122122221212202222222200002220020202222220222021201102000212220221122001002122222222202222212221222122012222221222200221222201210222022221110022022202121022120222222222222200222201220212022220120100212112010212220221122102002011202222212120110220222012222222220222210222222202201212001120210022222222120222020222202222222222002210000212122221122022201011120211220220022200112101212122212220202221222222222222021222221210222221221222002122221120022222122022121212202222022200002222011202122220022110212211002210220220022120012221222222202120100221222122002222120212201200222200222222100001022222122202122122222212212220022201022202102212122221022000220112102221222221122202102211222022202122110222222102212222120212202221222211221202200022112220122222220222021222212222122202102201202212022221220102221201222220222221122100122102202222212220010221222222022212221202211212222220210222211100110221222222121122020202222222122202122201202222022222022120212110222212221222022122002101202022222121211221222122122202122222220200222202211222021210100221122212222222220212222220022220122210122202222221221022202002221201200221022020112101222222222022110220222202112202220202222202222200202222210001001121222202022022220212202220122201002220021222022222222012212010000210222220022001012121212022222120110221222112112202220222210201222200221202000222200021122212022122020212222221122201102220011222222222021200212021001210211221122120202111222122222122110220220202022222220202201222222201211202112222201021122212021222001222222220122221222202201202122222022221222220111202200220222000022022222122222120002220222102212202022222200202222221210102112202011121122202020022222202222221222221022212121202022220220211201101122220200222022221222110222122202122101220220022222222221212210202222200211012122201122220122202222022201212222220022220010220210202122222121121220121021221021221122220212220222222212122021222221201002202120212212200022202210222101100220122022212121122022202222220222211022202010202022220120100201200210202101221122002122020202220222121101220222222122202110222220200022201202002210222012022122202222222200212202222022202011210200202022222221122200000101201022221222112202212222220202021002222220011002222010202220220122200220012112212010120222202122222102202202221222220101212212212122220020020221112200201012222122111102102202020202021202221120100122212011222201200122221202112110122202221022212221222121122202220222201201211021222222220020102210020221222000221122021022022212121212120221222121022122212022212110212222210200102112212020121022212022022020202222222022210100202102212222222221012200000100212222222022120012020202220202122010222120012122212022222120200022200222102210211101020022222022222011222212220022212210201200222222221021200201202021200020220222022002210212002202121221221020000022022222202220220222201212122100102200022122222020022220102222220122210000201020220222222122201220010121212212221022102102102202110222122120221220200012022111212022202022201201022220202100122022212122222222212202221122212022210101202122222221212212022201202210221222201012012212100222020122220122112022102011212202212022211200010200202121121022222121122111102222220122202210222211220022220222221212212212201101211022000002022202101201020001220120200002002121202211211222212200222110110222020022202020222222002212222122212222122121200022221121000002212220201122202122020102001202200202020110210022000002012122222212220022212210110020001100122122222222122101012202221022200112111101200020220121022011121010210112201122121222111202122212121000212120002022202002212010220022211210020012122002121122212022022011222202221022212110201201200021222121201200211120221011220022101002021222120222021102222220121212122012222202222222222222012011221000022222202121122111212222221122202222101122210022222121101200020011210121220222102112001212002202222110200020121122122201222220201022210210222000101020222022222120022022202222221122210221222102222021221021202200220111201200200022002202002212120202121200020122201202202012212100220222200220120122112111121022222222122011112212220022202220121100220221222222012122120201211212221122100102112002001221121110012120011002002102222221201122220200101011121000122022202122120221102212220222222221012021200022220021121021022122212012211102022102010222010221220010222120202002122100212212202122202220011000010102222022202221221011022202220122222112100201201221220221200010201202211222210202122222010001001211220202100020101202202211112112210122210101200121110022021022112222221120112222220022200120112022211220222121010011112011220110220012021202120000020210222211112021212112112101112101200122210000222102010121220122122221122101202221221022222110222100221121221122002220202221210121212202120202112002021211201101210120122202012002222200220222200221202211100101120122212120120211202201220022210121220222201021221020210201210120210200221202101122000000020211212120001120212212122010202220220122211002212020110221221222102021021210112200222222222112212002202122221221220022101101200200211002120002201122122201220202201220212122002212022221202222222120201100210221121222212122122212022211222222201101102022201222220020001001111000201002221002210222120100212210100011222222121012212022022010222022220002022021120122021222012020121120202200222122202020222002210022221222121120112222211210211202221022010012002210211012222122100012202101012101210022222001120022201222120022222220212010211022002101122021120011020110100201212120111001012121022120021001200001210120201112022212102111100210020221011201001201222212211020210000121202201011 From b15c967b8d53a1b95dea52360e9773438e78c043 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 00:22:21 +0100 Subject: [PATCH 019/479] 2019: d08: ex2: add solution --- 2019/d08/ex2/ex2.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100755 2019/d08/ex2/ex2.py diff --git a/2019/d08/ex2/ex2.py b/2019/d08/ex2/ex2.py new file mode 100755 index 0000000..dafe9a5 --- /dev/null +++ b/2019/d08/ex2/ex2.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +import sys + + +def main() -> None: + COLUMNS = 25 + ROWS = 6 + digits = [int(d) for d in str(int(sys.stdin.read()))] + + assert len(digits) % (COLUMNS * ROWS) == 0 # Sanity check + LAYERS = int(len(digits) / (COLUMNS * ROWS)) + + layers = [ + [digits.pop(0) for __ in range(COLUMNS) for __ in range(ROWS)] + for __ in range(LAYERS) + ] + + ans = [] + for pixels in zip(*(layer for layer in layers)): + ans.append(next(color for color in pixels if color != 2)) + + print( + "\n".join( + "".join("â–ˆ" if ans.pop(0) == 0 else " " for __ in range(COLUMNS)) + for __ in range(ROWS) + ) + ) + + +if __name__ == "__main__": + main() From c5e3cac6ed3ec10d303f745a153f6edeb38896e2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 01:00:11 +0100 Subject: [PATCH 020/479] 2019: d09: ex1: add input --- 2019/d09/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d09/ex1/input diff --git a/2019/d09/ex1/input b/2019/d09/ex1/input new file mode 100644 index 0000000..e3fc113 --- /dev/null +++ b/2019/d09/ex1/input @@ -0,0 +1 @@ +1102,34463338,34463338,63,1007,63,34463338,63,1005,63,53,1102,1,3,1000,109,988,209,12,9,1000,209,6,209,3,203,0,1008,1000,1,63,1005,63,65,1008,1000,2,63,1005,63,904,1008,1000,0,63,1005,63,58,4,25,104,0,99,4,0,104,0,99,4,17,104,0,99,0,0,1102,26,1,1005,1101,0,24,1019,1102,1,32,1007,1101,0,704,1027,1102,0,1,1020,1101,0,348,1029,1102,28,1,1002,1101,34,0,1016,1102,29,1,1008,1102,1,30,1013,1102,25,1,1012,1101,0,33,1009,1102,1,37,1001,1101,31,0,1017,1101,245,0,1022,1102,39,1,1000,1101,27,0,1011,1102,770,1,1025,1101,0,22,1015,1102,1,1,1021,1101,711,0,1026,1101,20,0,1004,1101,0,23,1018,1101,242,0,1023,1102,21,1,1003,1101,38,0,1010,1101,0,35,1014,1101,0,36,1006,1101,0,357,1028,1102,1,775,1024,109,-3,2102,1,9,63,1008,63,36,63,1005,63,203,4,187,1105,1,207,1001,64,1,64,1002,64,2,64,109,8,21101,40,0,5,1008,1010,41,63,1005,63,227,1106,0,233,4,213,1001,64,1,64,1002,64,2,64,109,16,2105,1,2,1105,1,251,4,239,1001,64,1,64,1002,64,2,64,109,1,21107,41,40,-4,1005,1018,271,1001,64,1,64,1105,1,273,4,257,1002,64,2,64,109,-18,1207,0,21,63,1005,63,295,4,279,1001,64,1,64,1105,1,295,1002,64,2,64,109,-3,1207,0,36,63,1005,63,311,1105,1,317,4,301,1001,64,1,64,1002,64,2,64,109,6,2108,20,-3,63,1005,63,339,4,323,1001,64,1,64,1106,0,339,1002,64,2,64,109,28,2106,0,-7,4,345,1001,64,1,64,1106,0,357,1002,64,2,64,109,-18,1206,4,373,1001,64,1,64,1105,1,375,4,363,1002,64,2,64,109,-6,2107,31,-4,63,1005,63,397,4,381,1001,64,1,64,1105,1,397,1002,64,2,64,109,1,21102,42,1,-1,1008,1011,39,63,1005,63,421,1001,64,1,64,1106,0,423,4,403,1002,64,2,64,109,-2,2108,26,-2,63,1005,63,439,1106,0,445,4,429,1001,64,1,64,1002,64,2,64,109,6,21102,43,1,-5,1008,1011,43,63,1005,63,467,4,451,1105,1,471,1001,64,1,64,1002,64,2,64,109,6,21101,44,0,-3,1008,1019,44,63,1005,63,493,4,477,1105,1,497,1001,64,1,64,1002,64,2,64,109,-9,1206,7,511,4,503,1105,1,515,1001,64,1,64,1002,64,2,64,109,14,1205,-7,531,1001,64,1,64,1106,0,533,4,521,1002,64,2,64,109,-27,1201,0,0,63,1008,63,39,63,1005,63,555,4,539,1105,1,559,1001,64,1,64,1002,64,2,64,109,10,2101,0,-5,63,1008,63,24,63,1005,63,583,1001,64,1,64,1105,1,585,4,565,1002,64,2,64,109,-11,2107,21,5,63,1005,63,601,1105,1,607,4,591,1001,64,1,64,1002,64,2,64,109,10,1208,0,36,63,1005,63,627,1001,64,1,64,1106,0,629,4,613,1002,64,2,64,109,15,21108,45,45,-9,1005,1015,647,4,635,1105,1,651,1001,64,1,64,1002,64,2,64,109,-19,2101,0,-4,63,1008,63,37,63,1005,63,677,4,657,1001,64,1,64,1106,0,677,1002,64,2,64,109,22,1205,-6,695,4,683,1001,64,1,64,1105,1,695,1002,64,2,64,109,-10,2106,0,10,1001,64,1,64,1105,1,713,4,701,1002,64,2,64,109,-9,1201,-8,0,63,1008,63,36,63,1005,63,733,1105,1,739,4,719,1001,64,1,64,1002,64,2,64,109,7,21107,46,47,0,1005,1015,757,4,745,1106,0,761,1001,64,1,64,1002,64,2,64,109,14,2105,1,-5,4,767,1105,1,779,1001,64,1,64,1002,64,2,64,109,-34,2102,1,6,63,1008,63,39,63,1005,63,799,1105,1,805,4,785,1001,64,1,64,1002,64,2,64,109,25,21108,47,49,-4,1005,1016,825,1001,64,1,64,1106,0,827,4,811,1002,64,2,64,109,-6,1208,-8,36,63,1005,63,845,4,833,1106,0,849,1001,64,1,64,1002,64,2,64,109,-10,1202,2,1,63,1008,63,36,63,1005,63,875,4,855,1001,64,1,64,1105,1,875,1002,64,2,64,109,-5,1202,10,1,63,1008,63,30,63,1005,63,895,1106,0,901,4,881,1001,64,1,64,4,64,99,21101,27,0,1,21101,0,915,0,1105,1,922,21201,1,65916,1,204,1,99,109,3,1207,-2,3,63,1005,63,964,21201,-2,-1,1,21101,942,0,0,1105,1,922,21201,1,0,-1,21201,-2,-3,1,21102,1,957,0,1105,1,922,22201,1,-1,-2,1106,0,968,22102,1,-2,-2,109,-3,2105,1,0 From fc2aa2df6db30a76e342374e33a0e4eacbc7f302 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 01:00:17 +0100 Subject: [PATCH 021/479] 2019: d09: ex1: add solution --- 2019/d09/ex1/ex1.py | 210 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100755 2019/d09/ex1/ex1.py diff --git a/2019/d09/ex1/ex1.py b/2019/d09/ex1/ex1.py new file mode 100755 index 0000000..9a2df1e --- /dev/null +++ b/2019/d09/ex1/ex1.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python + +import sys +from copy import deepcopy +from dataclasses import dataclass, field +from enum import IntEnum +from typing import List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self): # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + computer = Computer(deepcopy(memory), input_list=[1]) + + computer.run_no_output_interrupt() + print(computer.output_list.pop()) + assert len(computer.output_list) == 0 # Sanity check + + +if __name__ == "__main__": + main() From ad8a08e4946b4165e5a6d3fe942ea74cf6a8435f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 01:02:16 +0100 Subject: [PATCH 022/479] 2019: d09: ex2: add input --- 2019/d09/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d09/ex2/input diff --git a/2019/d09/ex2/input b/2019/d09/ex2/input new file mode 100644 index 0000000..e3fc113 --- /dev/null +++ b/2019/d09/ex2/input @@ -0,0 +1 @@ +1102,34463338,34463338,63,1007,63,34463338,63,1005,63,53,1102,1,3,1000,109,988,209,12,9,1000,209,6,209,3,203,0,1008,1000,1,63,1005,63,65,1008,1000,2,63,1005,63,904,1008,1000,0,63,1005,63,58,4,25,104,0,99,4,0,104,0,99,4,17,104,0,99,0,0,1102,26,1,1005,1101,0,24,1019,1102,1,32,1007,1101,0,704,1027,1102,0,1,1020,1101,0,348,1029,1102,28,1,1002,1101,34,0,1016,1102,29,1,1008,1102,1,30,1013,1102,25,1,1012,1101,0,33,1009,1102,1,37,1001,1101,31,0,1017,1101,245,0,1022,1102,39,1,1000,1101,27,0,1011,1102,770,1,1025,1101,0,22,1015,1102,1,1,1021,1101,711,0,1026,1101,20,0,1004,1101,0,23,1018,1101,242,0,1023,1102,21,1,1003,1101,38,0,1010,1101,0,35,1014,1101,0,36,1006,1101,0,357,1028,1102,1,775,1024,109,-3,2102,1,9,63,1008,63,36,63,1005,63,203,4,187,1105,1,207,1001,64,1,64,1002,64,2,64,109,8,21101,40,0,5,1008,1010,41,63,1005,63,227,1106,0,233,4,213,1001,64,1,64,1002,64,2,64,109,16,2105,1,2,1105,1,251,4,239,1001,64,1,64,1002,64,2,64,109,1,21107,41,40,-4,1005,1018,271,1001,64,1,64,1105,1,273,4,257,1002,64,2,64,109,-18,1207,0,21,63,1005,63,295,4,279,1001,64,1,64,1105,1,295,1002,64,2,64,109,-3,1207,0,36,63,1005,63,311,1105,1,317,4,301,1001,64,1,64,1002,64,2,64,109,6,2108,20,-3,63,1005,63,339,4,323,1001,64,1,64,1106,0,339,1002,64,2,64,109,28,2106,0,-7,4,345,1001,64,1,64,1106,0,357,1002,64,2,64,109,-18,1206,4,373,1001,64,1,64,1105,1,375,4,363,1002,64,2,64,109,-6,2107,31,-4,63,1005,63,397,4,381,1001,64,1,64,1105,1,397,1002,64,2,64,109,1,21102,42,1,-1,1008,1011,39,63,1005,63,421,1001,64,1,64,1106,0,423,4,403,1002,64,2,64,109,-2,2108,26,-2,63,1005,63,439,1106,0,445,4,429,1001,64,1,64,1002,64,2,64,109,6,21102,43,1,-5,1008,1011,43,63,1005,63,467,4,451,1105,1,471,1001,64,1,64,1002,64,2,64,109,6,21101,44,0,-3,1008,1019,44,63,1005,63,493,4,477,1105,1,497,1001,64,1,64,1002,64,2,64,109,-9,1206,7,511,4,503,1105,1,515,1001,64,1,64,1002,64,2,64,109,14,1205,-7,531,1001,64,1,64,1106,0,533,4,521,1002,64,2,64,109,-27,1201,0,0,63,1008,63,39,63,1005,63,555,4,539,1105,1,559,1001,64,1,64,1002,64,2,64,109,10,2101,0,-5,63,1008,63,24,63,1005,63,583,1001,64,1,64,1105,1,585,4,565,1002,64,2,64,109,-11,2107,21,5,63,1005,63,601,1105,1,607,4,591,1001,64,1,64,1002,64,2,64,109,10,1208,0,36,63,1005,63,627,1001,64,1,64,1106,0,629,4,613,1002,64,2,64,109,15,21108,45,45,-9,1005,1015,647,4,635,1105,1,651,1001,64,1,64,1002,64,2,64,109,-19,2101,0,-4,63,1008,63,37,63,1005,63,677,4,657,1001,64,1,64,1106,0,677,1002,64,2,64,109,22,1205,-6,695,4,683,1001,64,1,64,1105,1,695,1002,64,2,64,109,-10,2106,0,10,1001,64,1,64,1105,1,713,4,701,1002,64,2,64,109,-9,1201,-8,0,63,1008,63,36,63,1005,63,733,1105,1,739,4,719,1001,64,1,64,1002,64,2,64,109,7,21107,46,47,0,1005,1015,757,4,745,1106,0,761,1001,64,1,64,1002,64,2,64,109,14,2105,1,-5,4,767,1105,1,779,1001,64,1,64,1002,64,2,64,109,-34,2102,1,6,63,1008,63,39,63,1005,63,799,1105,1,805,4,785,1001,64,1,64,1002,64,2,64,109,25,21108,47,49,-4,1005,1016,825,1001,64,1,64,1106,0,827,4,811,1002,64,2,64,109,-6,1208,-8,36,63,1005,63,845,4,833,1106,0,849,1001,64,1,64,1002,64,2,64,109,-10,1202,2,1,63,1008,63,36,63,1005,63,875,4,855,1001,64,1,64,1105,1,875,1002,64,2,64,109,-5,1202,10,1,63,1008,63,30,63,1005,63,895,1106,0,901,4,881,1001,64,1,64,4,64,99,21101,27,0,1,21101,0,915,0,1105,1,922,21201,1,65916,1,204,1,99,109,3,1207,-2,3,63,1005,63,964,21201,-2,-1,1,21101,942,0,0,1105,1,922,21201,1,0,-1,21201,-2,-3,1,21102,1,957,0,1105,1,922,22201,1,-1,-2,1106,0,968,22102,1,-2,-2,109,-3,2105,1,0 From 31069149062b80c3bf6c44b56051df39e27227f5 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 01:02:22 +0100 Subject: [PATCH 023/479] 2019: d09: ex2: add solution --- 2019/d09/ex2/ex2.py | 210 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100755 2019/d09/ex2/ex2.py diff --git a/2019/d09/ex2/ex2.py b/2019/d09/ex2/ex2.py new file mode 100755 index 0000000..7c8be67 --- /dev/null +++ b/2019/d09/ex2/ex2.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python + +import sys +from copy import deepcopy +from dataclasses import dataclass, field +from enum import IntEnum +from typing import List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self): # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + computer = Computer(deepcopy(memory), input_list=[2]) + + computer.run_no_output_interrupt() + print(computer.output_list.pop()) + assert len(computer.output_list) == 0 # Sanity check + + +if __name__ == "__main__": + main() From 72a07f9ac420e22c590cc6b77fa5f7650f96e116 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 02:04:21 +0100 Subject: [PATCH 024/479] 2019: d10: ex1: add input --- 2019/d10/ex1/input | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 2019/d10/ex1/input diff --git a/2019/d10/ex1/input b/2019/d10/ex1/input new file mode 100644 index 0000000..df2b4d5 --- /dev/null +++ b/2019/d10/ex1/input @@ -0,0 +1,31 @@ +#...##.####.#.......#.##..##.#. +#.##.#..#..#...##..##.##.#..... +#..#####.#......#..#....#.###.# +...#.#.#...#..#.....#..#..#.#.. +.#.....##..#...#..#.#...##..... +##.....#..........##..#......## +.##..##.#.#....##..##.......#.. +#.##.##....###..#...##...##.... +##.#.#............##..#...##..# +###..##.###.....#.##...####.... +...##..#...##...##..#.#..#...#. +..#.#.##.#.#.#####.#....####.#. +#......###.##....#...#...#...## +.....#...#.#.#.#....#...#...... +#..#.#.#..#....#..#...#..#..##. +#.....#..##.....#...###..#..#.# +.....####.#..#...##..#..#..#..# +..#.....#.#........#.#.##..#### +.#.....##..#.##.....#...###.... +###.###....#..#..#.....#####... +#..##.##..##.#.#....#.#......#. +.#....#.##..#.#.#.......##..... +##.##...#...#....###.#....#.... +.....#.######.#.#..#..#.#.....# +.#..#.##.#....#.##..#.#...##..# +.##.###..#..#..#.###...#####.#. +#...#...........#.....#.......# +#....##.#.#..##...#..####...#.. +#.####......#####.....#.##..#.. +.#...#....#...##..##.#.#......# +#..###.....##.#.......#.##...## From cf42aaa2b03d6f25c2051d720a5a649e5e8b2a9f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 02:04:28 +0100 Subject: [PATCH 025/479] 2019: d10: ex1: add solution --- 2019/d10/ex1/ex1.py | 81 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 2019/d10/ex1/ex1.py diff --git a/2019/d10/ex1/ex1.py b/2019/d10/ex1/ex1.py new file mode 100755 index 0000000..79f1ed4 --- /dev/null +++ b/2019/d10/ex1/ex1.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python + +import sys +from itertools import chain +from math import gcd +from typing import Set, Tuple + +Position = Tuple[int, int] + + +def main() -> None: + asteroids = [[c == "#" for c in line.rstrip()] for line in sys.stdin.readlines()] + + def count_spotted(i: int, j: int) -> int: + def is_valid(pos: Position) -> bool: + return 0 <= pos[0] < len(asteroids) and 0 <= pos[1] < len(asteroids[0]) + + def pos_around(radius: int) -> Set[Position]: + return set( + chain( + filter( + is_valid, + ( + (i - offset, j - radius) + for offset in range(-radius, radius + 1) + ), + ), + filter( + is_valid, + ( + (i - offset, j + radius) + for offset in range(-radius, radius + 1) + ), + ), + filter( + is_valid, + ( + (i - radius, j - offset) + for offset in range(-radius, radius + 1) + ), + ), + filter( + is_valid, + ( + (i + radius, j - offset) + for offset in range(-radius, radius + 1) + ), + ), + ) + ) + + seen: Set[Position] = set() + ans = 0 + radius = 1 + while asteroids[i][j]: # Only do this if are on an asteroid + to_visit = pos_around(radius) + radius += 1 + if len(to_visit) == 0: + break + for pos in to_visit: + if not asteroids[pos[0]][pos[1]]: + continue # No asteroid there + rel = (pos[0] - i, pos[1] - j) + common = gcd(*rel) + rel = (rel[0] // common, rel[1] // common) + if rel in seen: + continue # Already have an asteroid on this path + seen.add(rel) + ans += 1 + return ans + + ans, y, x = max( + (count_spotted(i, j), i, j) + for i in range(len(asteroids)) + for j in range(len(asteroids[0])) + ) + print(f"({x}, {y}): {ans}") + + +if __name__ == "__main__": + main() From 47f702ec2e2672403458949469f9d2fee00034a1 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 16:37:36 +0100 Subject: [PATCH 026/479] 2019: d10: ex1: clean-up solution --- 2019/d10/ex1/ex1.py | 76 ++++++++++++++------------------------------- 1 file changed, 23 insertions(+), 53 deletions(-) diff --git a/2019/d10/ex1/ex1.py b/2019/d10/ex1/ex1.py index 79f1ed4..eb538df 100755 --- a/2019/d10/ex1/ex1.py +++ b/2019/d10/ex1/ex1.py @@ -1,79 +1,49 @@ #!/usr/bin/env python import sys -from itertools import chain from math import gcd -from typing import Set, Tuple +from typing import NamedTuple, Set -Position = Tuple[int, int] + +class Position(NamedTuple): + x: int + y: int def main() -> None: - asteroids = [[c == "#" for c in line.rstrip()] for line in sys.stdin.readlines()] - - def count_spotted(i: int, j: int) -> int: - def is_valid(pos: Position) -> bool: - return 0 <= pos[0] < len(asteroids) and 0 <= pos[1] < len(asteroids[0]) - - def pos_around(radius: int) -> Set[Position]: - return set( - chain( - filter( - is_valid, - ( - (i - offset, j - radius) - for offset in range(-radius, radius + 1) - ), - ), - filter( - is_valid, - ( - (i - offset, j + radius) - for offset in range(-radius, radius + 1) - ), - ), - filter( - is_valid, - ( - (i - radius, j - offset) - for offset in range(-radius, radius + 1) - ), - ), - filter( - is_valid, - ( - (i + radius, j - offset) - for offset in range(-radius, radius + 1) - ), - ), - ) - ) + asteroids = [ + Position(x, y) + for y, line in enumerate(sys.stdin.readlines()) + for x, c in enumerate(line.rstrip()) + if c == "#" + ] + def count_spotted(x: int, y: int) -> int: seen: Set[Position] = set() ans = 0 radius = 1 - while asteroids[i][j]: # Only do this if are on an asteroid - to_visit = pos_around(radius) + + while True: + + def is_r_away(pos: Position) -> bool: + return max(abs(pos.x - x), abs(pos.y - y)) == radius + + to_visit = list(filter(is_r_away, asteroids)) radius += 1 if len(to_visit) == 0: break for pos in to_visit: - if not asteroids[pos[0]][pos[1]]: - continue # No asteroid there - rel = (pos[0] - i, pos[1] - j) + rel = (pos.x - x, pos.y - y) common = gcd(*rel) - rel = (rel[0] // common, rel[1] // common) + rel = Position(*(a // common for a in rel)) if rel in seen: continue # Already have an asteroid on this path seen.add(rel) ans += 1 + return ans - ans, y, x = max( - (count_spotted(i, j), i, j) - for i in range(len(asteroids)) - for j in range(len(asteroids[0])) - ) + ans, x, y = max((count_spotted(*pos), *pos) for pos in asteroids) print(f"({x}, {y}): {ans}") From 59af5aae07b016d977e2a134a73f4331f4fac49d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 18:14:01 +0100 Subject: [PATCH 027/479] 2019: d10: ex2: add input --- 2019/d10/ex2/input | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 2019/d10/ex2/input diff --git a/2019/d10/ex2/input b/2019/d10/ex2/input new file mode 100644 index 0000000..df2b4d5 --- /dev/null +++ b/2019/d10/ex2/input @@ -0,0 +1,31 @@ +#...##.####.#.......#.##..##.#. +#.##.#..#..#...##..##.##.#..... +#..#####.#......#..#....#.###.# +...#.#.#...#..#.....#..#..#.#.. +.#.....##..#...#..#.#...##..... +##.....#..........##..#......## +.##..##.#.#....##..##.......#.. +#.##.##....###..#...##...##.... +##.#.#............##..#...##..# +###..##.###.....#.##...####.... +...##..#...##...##..#.#..#...#. +..#.#.##.#.#.#####.#....####.#. +#......###.##....#...#...#...## +.....#...#.#.#.#....#...#...... +#..#.#.#..#....#..#...#..#..##. +#.....#..##.....#...###..#..#.# +.....####.#..#...##..#..#..#..# +..#.....#.#........#.#.##..#### +.#.....##..#.##.....#...###.... +###.###....#..#..#.....#####... +#..##.##..##.#.#....#.#......#. +.#....#.##..#.#.#.......##..... +##.##...#...#....###.#....#.... +.....#.######.#.#..#..#.#.....# +.#..#.##.#....#.##..#.#...##..# +.##.###..#..#..#.###...#####.#. +#...#...........#.....#.......# +#....##.#.#..##...#..####...#.. +#.####......#####.....#.##..#.. +.#...#....#...##..##.#.#......# +#..###.....##.#.......#.##...## From 1242388be754d7bb9055aaa14deeadc4aa84fe42 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 18:14:11 +0100 Subject: [PATCH 028/479] 2019: d10: ex2: add solution --- 2019/d10/ex2/ex2.py | 86 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100755 2019/d10/ex2/ex2.py diff --git a/2019/d10/ex2/ex2.py b/2019/d10/ex2/ex2.py new file mode 100755 index 0000000..480234e --- /dev/null +++ b/2019/d10/ex2/ex2.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python + +import sys +from cmath import phase +from itertools import groupby +from math import gcd, pi +from typing import NamedTuple, Set, Tuple + + +class Position(NamedTuple): + x: int + y: int + + +def pos_to_angle_dist(pos: Position) -> Tuple[float, float]: + cartesian = complex(*pos) + angle = phase(cartesian) + if angle < -pi / 2: + angle += 2.5 * pi + else: + angle += pi / 2 + return (angle, abs(cartesian)) + + +def main() -> None: + asteroids = [ + Position(x, y) + for y, line in enumerate(sys.stdin.readlines()) + for x, c in enumerate(line.rstrip()) + if c == "#" + ] + + def count_spotted(x: int, y: int) -> int: + seen: Set[Position] = set() + ans = 0 + radius = 1 + + while True: + + def is_r_away(pos: Position) -> bool: + return max(abs(pos.x - x), abs(pos.y - y)) == radius + + to_visit = list(filter(is_r_away, asteroids)) + radius += 1 + if len(to_visit) == 0: + break + for pos in to_visit: + rel = (pos.x - x, pos.y - y) + common = gcd(*rel) + rel = Position(*(a // common for a in rel)) + if rel in seen: + continue # Already have an asteroid on this path + seen.add(rel) + ans += 1 + + return ans + + # We need to find the observatory's position as a prerequisite + ans, orig = max((count_spotted(*pos), pos) for pos in asteroids) + print(f"({orig.x}, {orig.y}): {ans}") + + def to_rel(p: Position) -> Position: + return Position(*(a - o for (a, o) in zip(p, orig))) + + angle_dists = sorted( + (pos_to_angle_dist(to_rel(p)), p) for p in asteroids if p != orig + ) + grouped_angle_dists = [ + [val[1] for val in group] + for __, group in groupby(angle_dists, key=lambda x: x[0][0]) + ] + + def find_n_th(n: int) -> Position: + assert 0 < n < len(asteroids) # Sanity check + while n >= len(grouped_angle_dists): + for group in grouped_angle_dists: + group.pop(0) + n -= 1 + return grouped_angle_dists[n - 1][0] + + x, y = find_n_th(200) + print(x * 100 + y) + + +if __name__ == "__main__": + main() From 5f776c6880b7fed7b7423b4fe18eb34d9a88bf20 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 18:53:06 +0100 Subject: [PATCH 029/479] 2019: d11: ex1: add input --- 2019/d11/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d11/ex1/input diff --git a/2019/d11/ex1/input b/2019/d11/ex1/input new file mode 100644 index 0000000..317d100 --- /dev/null +++ b/2019/d11/ex1/input @@ -0,0 +1 @@ +3,8,1005,8,330,1106,0,11,0,0,0,104,1,104,0,3,8,102,-1,8,10,101,1,10,10,4,10,1008,8,0,10,4,10,102,1,8,29,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,0,10,4,10,101,0,8,51,1,1103,2,10,1006,0,94,1006,0,11,1,1106,13,10,3,8,1002,8,-1,10,101,1,10,10,4,10,1008,8,1,10,4,10,1001,8,0,87,3,8,102,-1,8,10,101,1,10,10,4,10,1008,8,0,10,4,10,1001,8,0,109,2,1105,5,10,2,103,16,10,1,1103,12,10,2,105,2,10,3,8,102,-1,8,10,1001,10,1,10,4,10,108,1,8,10,4,10,1001,8,0,146,1006,0,49,2,1,12,10,2,1006,6,10,1,1101,4,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,108,0,8,10,4,10,1001,8,0,183,1,6,9,10,1006,0,32,3,8,102,-1,8,10,1001,10,1,10,4,10,1008,8,1,10,4,10,101,0,8,213,2,1101,9,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,1,10,4,10,101,0,8,239,1006,0,47,1006,0,4,2,6,0,10,1006,0,58,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,0,10,4,10,102,1,8,274,2,1005,14,10,1006,0,17,1,104,20,10,1006,0,28,3,8,102,-1,8,10,1001,10,1,10,4,10,108,1,8,10,4,10,1002,8,1,309,101,1,9,9,1007,9,928,10,1005,10,15,99,109,652,104,0,104,1,21101,0,937263411860,1,21102,347,1,0,1105,1,451,21101,932440724376,0,1,21102,1,358,0,1105,1,451,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,21101,0,29015167015,1,21101,0,405,0,1106,0,451,21102,1,3422723163,1,21101,0,416,0,1106,0,451,3,10,104,0,104,0,3,10,104,0,104,0,21101,0,868389376360,1,21101,0,439,0,1105,1,451,21102,825544712960,1,1,21102,1,450,0,1106,0,451,99,109,2,21201,-1,0,1,21101,0,40,2,21102,482,1,3,21102,1,472,0,1106,0,515,109,-2,2106,0,0,0,1,0,0,1,109,2,3,10,204,-1,1001,477,478,493,4,0,1001,477,1,477,108,4,477,10,1006,10,509,1101,0,0,477,109,-2,2106,0,0,0,109,4,2101,0,-1,514,1207,-3,0,10,1006,10,532,21102,1,0,-3,22101,0,-3,1,22102,1,-2,2,21102,1,1,3,21101,551,0,0,1106,0,556,109,-4,2105,1,0,109,5,1207,-3,1,10,1006,10,579,2207,-4,-2,10,1006,10,579,22102,1,-4,-4,1106,0,647,21201,-4,0,1,21201,-3,-1,2,21202,-2,2,3,21102,1,598,0,1106,0,556,22101,0,1,-4,21101,1,0,-1,2207,-4,-2,10,1006,10,617,21102,0,1,-1,22202,-2,-1,-2,2107,0,-3,10,1006,10,639,21201,-1,0,1,21102,639,1,0,105,1,514,21202,-2,-1,-2,22201,-4,-2,-4,109,-5,2105,1,0 From 8de251a301a08978a943a55c710c95859a82456a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 18:53:11 +0100 Subject: [PATCH 030/479] 2019: d11: ex1: add solution --- 2019/d11/ex1/ex1.py | 243 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 243 insertions(+) create mode 100755 2019/d11/ex1/ex1.py diff --git a/2019/d11/ex1/ex1.py b/2019/d11/ex1/ex1.py new file mode 100755 index 0000000..92d2a57 --- /dev/null +++ b/2019/d11/ex1/ex1.py @@ -0,0 +1,243 @@ +#!/usr/bin/env python + +import sys +from dataclasses import dataclass, field +from enum import IntEnum +from typing import Dict, List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self): # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +class Position(NamedTuple): + x: int + y: int + + +# Up, Right, Down, Left offsets +offsets = [Position(1, 0), Position(0, 1), Position(-1, 0), Position(0, -1)] + + +class Color(IntEnum): + BLACK = 0 + WHITE = 1 + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + painter = Computer(memory) + pos = Position(0, 0) + orientation = 0 + painted: Dict[Position, Color] = {} + + has_painted = False + while not painter.is_halted: + try: + painter.run() + except InputInterrupt: + painter.input_list.append(int(painted.get(pos, Color.BLACK))) + except OutputInterrupt: + if has_painted: + orientation += 1 if painter.output_list.pop(0) == 1 else -1 + if orientation < 0: + orientation += len(offsets) + else: + orientation = orientation % len(offsets) + offset = offsets[orientation] + pos = Position(pos.x + offset.x, pos.y + offset.y) + else: + painted[pos] = Color(painter.output_list.pop(0)) + has_painted = not has_painted + + print(len(painted)) + + +if __name__ == "__main__": + main() From 3f55e37b8243c97569e8384ffc6360f700fe208f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 20:26:08 +0100 Subject: [PATCH 031/479] 2019: d11: ex2: add input --- 2019/d11/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d11/ex2/input diff --git a/2019/d11/ex2/input b/2019/d11/ex2/input new file mode 100644 index 0000000..317d100 --- /dev/null +++ b/2019/d11/ex2/input @@ -0,0 +1 @@ +3,8,1005,8,330,1106,0,11,0,0,0,104,1,104,0,3,8,102,-1,8,10,101,1,10,10,4,10,1008,8,0,10,4,10,102,1,8,29,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,0,10,4,10,101,0,8,51,1,1103,2,10,1006,0,94,1006,0,11,1,1106,13,10,3,8,1002,8,-1,10,101,1,10,10,4,10,1008,8,1,10,4,10,1001,8,0,87,3,8,102,-1,8,10,101,1,10,10,4,10,1008,8,0,10,4,10,1001,8,0,109,2,1105,5,10,2,103,16,10,1,1103,12,10,2,105,2,10,3,8,102,-1,8,10,1001,10,1,10,4,10,108,1,8,10,4,10,1001,8,0,146,1006,0,49,2,1,12,10,2,1006,6,10,1,1101,4,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,108,0,8,10,4,10,1001,8,0,183,1,6,9,10,1006,0,32,3,8,102,-1,8,10,1001,10,1,10,4,10,1008,8,1,10,4,10,101,0,8,213,2,1101,9,10,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,1,10,4,10,101,0,8,239,1006,0,47,1006,0,4,2,6,0,10,1006,0,58,3,8,1002,8,-1,10,1001,10,1,10,4,10,1008,8,0,10,4,10,102,1,8,274,2,1005,14,10,1006,0,17,1,104,20,10,1006,0,28,3,8,102,-1,8,10,1001,10,1,10,4,10,108,1,8,10,4,10,1002,8,1,309,101,1,9,9,1007,9,928,10,1005,10,15,99,109,652,104,0,104,1,21101,0,937263411860,1,21102,347,1,0,1105,1,451,21101,932440724376,0,1,21102,1,358,0,1105,1,451,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,3,10,104,0,104,1,3,10,104,0,104,0,3,10,104,0,104,1,21101,0,29015167015,1,21101,0,405,0,1106,0,451,21102,1,3422723163,1,21101,0,416,0,1106,0,451,3,10,104,0,104,0,3,10,104,0,104,0,21101,0,868389376360,1,21101,0,439,0,1105,1,451,21102,825544712960,1,1,21102,1,450,0,1106,0,451,99,109,2,21201,-1,0,1,21101,0,40,2,21102,482,1,3,21102,1,472,0,1106,0,515,109,-2,2106,0,0,0,1,0,0,1,109,2,3,10,204,-1,1001,477,478,493,4,0,1001,477,1,477,108,4,477,10,1006,10,509,1101,0,0,477,109,-2,2106,0,0,0,109,4,2101,0,-1,514,1207,-3,0,10,1006,10,532,21102,1,0,-3,22101,0,-3,1,22102,1,-2,2,21102,1,1,3,21101,551,0,0,1106,0,556,109,-4,2105,1,0,109,5,1207,-3,1,10,1006,10,579,2207,-4,-2,10,1006,10,579,22102,1,-4,-4,1106,0,647,21201,-4,0,1,21201,-3,-1,2,21202,-2,2,3,21102,1,598,0,1106,0,556,22101,0,1,-4,21101,1,0,-1,2207,-4,-2,10,1006,10,617,21102,0,1,-1,22202,-2,-1,-2,2107,0,-3,10,1006,10,639,21201,-1,0,1,21102,639,1,0,105,1,514,21202,-2,-1,-2,22201,-4,-2,-4,109,-5,2105,1,0 From 699792cf1240bd60bb9373bbccc143a84ff0bd93 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 11 Dec 2019 20:26:16 +0100 Subject: [PATCH 032/479] 2019: d11: ex2: add solution --- 2019/d11/ex2/ex2.py | 253 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100755 2019/d11/ex2/ex2.py diff --git a/2019/d11/ex2/ex2.py b/2019/d11/ex2/ex2.py new file mode 100755 index 0000000..9109aa1 --- /dev/null +++ b/2019/d11/ex2/ex2.py @@ -0,0 +1,253 @@ +#!/usr/bin/env python + +import sys +from dataclasses import dataclass, field +from enum import IntEnum +from typing import Dict, List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self): # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +class Position(NamedTuple): + x: int + y: int + + +# Up, Right, Down, Left offsets +offsets = [Position(1, 0), Position(0, 1), Position(-1, 0), Position(0, -1)] + + +class Color(IntEnum): + BLACK = 0 + WHITE = 1 + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + painter = Computer(memory) + pos = Position(0, 0) + orientation = 0 + painted: Dict[Position, Color] = {pos: Color.WHITE} + + has_painted = False + while not painter.is_halted: + try: + painter.run() + except InputInterrupt: + painter.input_list.append(int(painted.get(pos, Color.BLACK))) + except OutputInterrupt: + if has_painted: + orientation += 1 if painter.output_list.pop(0) == 1 else -1 + if orientation < 0: + orientation += len(offsets) + else: + orientation = orientation % len(offsets) + offset = offsets[orientation] + pos = Position(pos.x + offset.x, pos.y + offset.y) + else: + painted[pos] = Color(painter.output_list.pop(0)) + has_painted = not has_painted + + maxx, maxy = max(p.x for p in painted), max(p.y for p in painted) + minx, miny = min(p.x for p in painted), min(p.y for p in painted) + + ans: List[List[str]] = [] + for x in range(minx, maxx + 1): + ans.append([]) + for y in range(miny, maxy + 1): + color = painted.get(Position(x, y), Color.BLACK) + ans[-1].append("â–ˆ" if color == Color.WHITE else " ") + lines = ["".join(l) for l in ans] + print("\n".join(reversed(lines))) # Seems like my coordinates are reversed + + +if __name__ == "__main__": + main() From ca46ca6de8cc1bf71a923da7568c822a2ffa5c7f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 12 Dec 2019 10:53:30 +0100 Subject: [PATCH 033/479] 2019: d12: ex1: add input --- 2019/d12/ex1/input | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 2019/d12/ex1/input diff --git a/2019/d12/ex1/input b/2019/d12/ex1/input new file mode 100644 index 0000000..aac01e0 --- /dev/null +++ b/2019/d12/ex1/input @@ -0,0 +1,4 @@ + + + + From d6d0f1a94f129d36151eac385076e5444893fb2b Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 12 Dec 2019 10:53:38 +0100 Subject: [PATCH 034/479] 2019: d12: ex1: add solution --- 2019/d12/ex1/ex1.py | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100755 2019/d12/ex1/ex1.py diff --git a/2019/d12/ex1/ex1.py b/2019/d12/ex1/ex1.py new file mode 100755 index 0000000..b3a708a --- /dev/null +++ b/2019/d12/ex1/ex1.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + + +import re +import sys +from dataclasses import dataclass + + +@dataclass +class Position: + x: int + y: int + z: int + + +def line_to_pos(l: str) -> Position: + "" + regex = r"[^,]*), y=(?P[^,]*), z=(?P[^,]*)>" + match = re.search(regex, l) + assert match is not None # Sanity check + return Position(*(int(match.group(g)) for g in ("x", "y", "z"))) + + +def main() -> None: + asteroids = [line_to_pos(line) for line in sys.stdin.readlines()] + velocities = [Position(0, 0, 0) for __ in asteroids] + + for __ in range(1000): + for orig, v in zip(asteroids, velocities): + for other in asteroids: + if orig.x != other.x: + v.x += 1 if orig.x < other.x else -1 + if orig.y != other.y: + v.y += 1 if orig.y < other.y else -1 + if orig.z != other.z: + v.z += 1 if orig.z < other.z else -1 + + for asteroid, v in zip(asteroids, velocities): + asteroid.x += v.x + asteroid.y += v.y + asteroid.z += v.z + + pot = (abs(p.x) + abs(p.y) + abs(p.z) for p in asteroids) + kin = (abs(v.x) + abs(v.y) + abs(v.z) for v in velocities) + + print(sum(p * k for p, k in zip(pot, kin))) + + +if __name__ == "__main__": + main() From b2ea586869fa9ab78bc70cbd3667b4f73f1fe7bd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 12 Dec 2019 11:23:03 +0100 Subject: [PATCH 035/479] 2019: d12: ex2: add input --- 2019/d12/ex2/input | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 2019/d12/ex2/input diff --git a/2019/d12/ex2/input b/2019/d12/ex2/input new file mode 100644 index 0000000..aac01e0 --- /dev/null +++ b/2019/d12/ex2/input @@ -0,0 +1,4 @@ + + + + From 3c109418357f608fdcd0d6e67c913d103278692e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 12 Dec 2019 11:23:09 +0100 Subject: [PATCH 036/479] 2019: d12: ex2: add solution --- 2019/d12/ex2/ex2.py | 77 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100755 2019/d12/ex2/ex2.py diff --git a/2019/d12/ex2/ex2.py b/2019/d12/ex2/ex2.py new file mode 100755 index 0000000..64bb73d --- /dev/null +++ b/2019/d12/ex2/ex2.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python + + +import re +import sys +from copy import deepcopy +from dataclasses import dataclass +from math import gcd +from typing import List + + +@dataclass +class Position: + x: int + y: int + z: int + + +def line_to_pos(l: str) -> Position: + "" + regex = r"[^,]*), y=(?P[^,]*), z=(?P[^,]*)>" + match = re.search(regex, l) + assert match is not None # Sanity check + return Position(*(int(match.group(g)) for g in ("x", "y", "z"))) + + +def lcm(a: int, b: int, c: int) -> int: + def lcm_2(a: int, b: int) -> int: + return abs(a * b) // gcd(a, b) + + return lcm_2(lcm_2(a, b), c) + + +def main() -> None: + asteroids = [line_to_pos(line) for line in sys.stdin.readlines()] + velocities = [Position(0, 0, 0) for __ in asteroids] + + cycles: List[int] = [] + for attr in ("x", "y", "z"): + all_prev_pos = [deepcopy(asteroids)] + all_prev_vel = [deepcopy(velocities)] + i = 0 + + found = False + while not found: + i += 1 + for orig, v in zip(asteroids, velocities): + for other in asteroids: + if orig.x != other.x: + v.x += 1 if orig.x < other.x else -1 + if orig.y != other.y: + v.y += 1 if orig.y < other.y else -1 + if orig.z != other.z: + v.z += 1 if orig.z < other.z else -1 + + for asteroid, v in zip(asteroids, velocities): + asteroid.x += v.x + asteroid.y += v.y + asteroid.z += v.z + + for old_pos, old_vel in zip(all_prev_pos, all_prev_vel): + if all( + n.__getattribute__(attr) == o.__getattribute__(attr) + for n, o in zip(asteroids, old_pos) + ) and all( + n.__getattribute__(attr) == o.__getattribute__(attr) + for n, o in zip(velocities, old_vel) + ): + found = True + + cycles.append(i) + + print(lcm(*cycles)) + + +if __name__ == "__main__": + main() From 8713082ed608a155f1673c0af755c5f8954bf671 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 13 Dec 2019 22:17:18 +0100 Subject: [PATCH 037/479] 2019: d13: ex1: add input --- 2019/d13/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d13/ex1/input diff --git a/2019/d13/ex1/input b/2019/d13/ex1/input new file mode 100644 index 0000000..98d5ab4 --- /dev/null +++ b/2019/d13/ex1/input @@ -0,0 +1 @@ +1,380,379,385,1008,2663,704183,381,1005,381,12,99,109,2664,1102,1,0,383,1102,0,1,382,20102,1,382,1,21001,383,0,2,21102,37,1,0,1105,1,578,4,382,4,383,204,1,1001,382,1,382,1007,382,44,381,1005,381,22,1001,383,1,383,1007,383,23,381,1005,381,18,1006,385,69,99,104,-1,104,0,4,386,3,384,1007,384,0,381,1005,381,94,107,0,384,381,1005,381,108,1105,1,161,107,1,392,381,1006,381,161,1102,-1,1,384,1105,1,119,1007,392,42,381,1006,381,161,1101,0,1,384,20102,1,392,1,21102,21,1,2,21102,1,0,3,21102,138,1,0,1105,1,549,1,392,384,392,20101,0,392,1,21102,21,1,2,21101,3,0,3,21101,0,161,0,1106,0,549,1101,0,0,384,20001,388,390,1,21002,389,1,2,21102,180,1,0,1106,0,578,1206,1,213,1208,1,2,381,1006,381,205,20001,388,390,1,20102,1,389,2,21101,0,205,0,1105,1,393,1002,390,-1,390,1102,1,1,384,21001,388,0,1,20001,389,391,2,21102,1,228,0,1106,0,578,1206,1,261,1208,1,2,381,1006,381,253,20102,1,388,1,20001,389,391,2,21101,253,0,0,1105,1,393,1002,391,-1,391,1101,1,0,384,1005,384,161,20001,388,390,1,20001,389,391,2,21101,0,279,0,1105,1,578,1206,1,316,1208,1,2,381,1006,381,304,20001,388,390,1,20001,389,391,2,21101,0,304,0,1106,0,393,1002,390,-1,390,1002,391,-1,391,1101,0,1,384,1005,384,161,20102,1,388,1,21002,389,1,2,21102,0,1,3,21101,0,338,0,1106,0,549,1,388,390,388,1,389,391,389,21002,388,1,1,21001,389,0,2,21102,1,4,3,21102,365,1,0,1105,1,549,1007,389,22,381,1005,381,75,104,-1,104,0,104,0,99,0,1,0,0,0,0,0,0,414,20,18,1,1,22,109,3,22102,1,-2,1,21202,-1,1,2,21102,1,0,3,21101,0,414,0,1106,0,549,21201,-2,0,1,21202,-1,1,2,21101,429,0,0,1105,1,601,1201,1,0,435,1,386,0,386,104,-1,104,0,4,386,1001,387,-1,387,1005,387,451,99,109,-3,2106,0,0,109,8,22202,-7,-6,-3,22201,-3,-5,-3,21202,-4,64,-2,2207,-3,-2,381,1005,381,492,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,481,21202,-4,8,-2,2207,-3,-2,381,1005,381,518,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,507,2207,-3,-4,381,1005,381,540,21202,-4,-1,-1,22201,-3,-1,-3,2207,-3,-4,381,1006,381,529,22102,1,-3,-7,109,-8,2106,0,0,109,4,1202,-2,44,566,201,-3,566,566,101,639,566,566,2101,0,-1,0,204,-3,204,-2,204,-1,109,-4,2105,1,0,109,3,1202,-1,44,594,201,-2,594,594,101,639,594,594,20101,0,0,-2,109,-3,2106,0,0,109,3,22102,23,-2,1,22201,1,-1,1,21102,509,1,2,21102,150,1,3,21101,1012,0,4,21102,630,1,0,1106,0,456,21201,1,1651,-2,109,-3,2105,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,2,2,0,2,0,2,2,2,2,2,0,2,2,2,2,2,2,0,2,0,2,2,2,0,2,0,0,2,2,2,0,2,2,2,2,0,2,0,0,2,0,1,1,0,2,0,2,0,2,2,2,2,0,0,2,2,2,2,0,2,2,0,2,2,2,2,2,2,2,2,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,1,1,0,2,2,2,0,0,2,0,0,2,0,2,0,2,0,0,0,0,2,2,2,2,2,2,0,2,0,0,0,0,0,2,0,2,2,2,2,2,2,2,0,0,1,1,0,2,2,2,2,2,2,0,0,0,2,2,2,0,2,2,0,2,2,2,0,0,2,2,0,2,0,2,2,2,0,2,2,0,2,2,2,2,2,2,2,0,1,1,0,2,0,2,2,0,2,2,0,2,0,2,2,0,0,2,2,2,2,2,2,2,0,0,0,0,2,2,0,2,2,0,0,2,2,0,0,2,2,2,2,0,1,1,0,2,2,2,2,2,2,2,0,0,2,0,2,0,2,2,2,2,2,0,0,2,0,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,0,2,0,0,1,1,0,2,0,0,2,0,2,0,2,2,2,2,2,0,2,2,0,2,0,2,0,2,2,0,0,2,2,2,2,2,0,2,2,0,2,0,0,2,2,2,0,0,1,1,0,0,2,2,2,2,0,0,0,2,2,0,2,2,2,0,2,2,2,2,2,0,2,2,2,2,2,2,2,0,0,0,0,2,2,0,2,2,2,2,2,0,1,1,0,2,0,2,2,2,2,2,2,0,2,2,2,0,2,0,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,0,0,1,1,0,2,0,2,2,2,0,2,0,2,0,2,2,2,0,0,0,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,0,0,0,0,1,1,0,2,0,2,0,0,2,2,2,2,2,2,2,2,0,0,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,0,0,2,2,0,2,0,1,1,0,2,2,2,0,2,2,0,2,2,2,2,2,2,2,2,2,0,2,2,0,0,2,2,2,0,0,2,2,2,0,2,2,2,2,0,2,0,2,2,2,0,1,1,0,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,0,2,0,2,2,2,2,2,0,2,2,2,2,0,0,2,2,2,2,2,0,1,1,0,2,2,0,2,2,0,2,0,2,2,0,0,2,2,2,2,2,0,2,2,0,2,2,0,2,2,2,2,0,2,2,0,2,0,2,2,2,2,0,0,0,1,1,0,2,0,2,2,2,0,2,2,2,2,2,2,0,2,0,2,2,2,0,0,2,2,2,2,2,0,2,0,2,0,2,0,2,0,2,2,2,0,0,2,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,34,29,24,40,90,52,13,48,86,82,86,77,3,16,27,97,89,38,11,82,76,15,50,46,33,57,17,38,39,91,43,86,43,55,15,24,23,74,5,53,20,10,16,77,73,84,85,36,89,77,79,82,37,7,24,68,14,78,75,7,86,80,18,84,68,62,89,7,64,11,9,56,62,3,29,95,41,23,18,90,1,10,4,94,8,69,57,13,72,89,61,72,61,17,54,88,96,53,73,21,92,16,52,18,26,89,32,2,50,8,3,5,36,26,64,75,51,55,49,45,78,49,27,55,2,29,37,77,69,3,21,69,6,18,59,91,57,92,6,26,58,40,26,54,33,40,96,45,89,23,53,94,61,44,32,33,41,12,31,67,17,96,34,72,72,49,90,21,1,40,75,97,56,57,77,20,21,68,14,4,7,9,41,88,32,40,79,77,17,48,70,56,50,67,36,16,98,98,65,98,53,7,36,47,27,15,77,80,83,39,8,22,61,11,9,10,54,16,65,54,82,60,66,21,92,51,70,17,53,22,39,89,92,29,12,60,37,42,75,65,1,61,90,86,46,62,81,2,64,64,21,43,17,46,57,72,25,63,51,30,22,65,81,54,85,45,93,24,23,23,27,37,94,11,15,93,78,75,11,41,56,42,89,20,73,23,27,98,89,29,68,73,89,75,80,31,90,36,62,44,65,18,97,24,22,84,30,56,41,44,67,63,71,85,76,66,64,51,58,98,30,66,4,90,38,8,49,49,62,55,53,5,74,18,93,4,34,48,86,17,37,35,28,45,38,76,95,67,21,67,6,36,38,1,16,5,8,89,9,37,32,78,90,46,92,61,3,96,40,91,31,98,35,90,96,44,43,55,39,51,64,51,39,12,90,58,69,58,39,13,49,60,35,40,56,56,74,47,54,23,8,54,59,97,12,8,62,21,66,59,96,61,54,12,98,28,85,95,2,4,14,89,78,4,16,66,48,37,43,17,59,77,20,63,28,87,10,20,58,46,55,26,94,3,71,5,13,90,67,68,55,93,38,16,28,45,47,41,88,98,90,95,44,33,89,54,24,33,38,94,79,32,15,62,26,52,39,8,22,38,79,3,60,75,55,91,53,36,59,86,1,98,25,87,84,47,83,40,74,22,91,86,73,73,6,15,72,90,43,87,97,63,24,77,20,76,10,96,65,27,69,87,93,17,34,5,52,31,24,46,4,26,3,34,87,96,68,16,82,85,67,65,11,57,71,49,62,77,5,68,20,51,26,40,67,69,32,82,46,57,15,31,81,38,74,98,3,77,78,36,10,55,76,48,90,2,8,21,29,17,66,51,91,59,36,8,2,85,50,53,76,38,91,24,54,6,6,28,20,25,7,56,87,44,54,98,6,10,94,44,93,25,26,65,22,87,52,47,36,1,22,21,32,49,7,72,66,89,92,63,85,90,82,79,33,36,39,69,15,57,80,46,39,28,79,73,43,95,81,21,47,39,68,30,34,79,33,72,14,54,96,52,60,16,9,73,54,78,77,26,89,14,14,28,83,47,81,87,14,86,11,96,29,10,2,84,1,70,59,81,64,29,25,40,53,87,4,42,76,80,48,39,85,60,96,95,78,30,8,83,46,62,68,82,40,15,43,51,81,65,64,3,81,13,48,70,97,95,6,23,91,66,63,22,70,28,10,42,90,91,80,34,29,48,18,96,78,14,17,88,13,96,72,72,86,45,95,59,20,67,65,35,89,46,76,35,7,35,4,64,58,15,98,39,81,2,95,10,75,56,85,22,31,22,14,9,12,48,15,75,91,85,91,26,40,78,23,76,5,45,6,79,58,4,70,7,10,79,56,98,86,34,18,73,57,70,97,72,59,75,36,30,21,41,38,83,93,64,92,89,17,65,19,93,9,83,51,3,20,71,89,37,70,3,90,13,35,95,43,14,78,3,43,15,11,21,36,50,12,27,47,58,18,8,66,23,32,7,88,82,27,21,23,5,80,79,44,87,19,11,47,15,14,18,14,95,54,81,76,93,51,53,63,97,39,11,30,26,89,6,29,15,21,49,57,53,52,93,83,11,95,28,58,79,22,65,58,93,89,60,49,78,55,22,42,25,14,61,66,28,84,43,4,68,54,68,17,46,13,88,30,39,40,35,35,14,69,34,55,93,43,7,20,82,83,50,25,50,26,78,17,93,7,10,24,3,27,85,97,88,62,65,11,66,36,38,14,32,31,94,14,3,38,39,96,23,64,89,91,37,9,5,44,4,18,43,64,53,58,96,84,67,96,24,86,49,30,49,24,4,46,57,704183 From 223851a43039990532e776699e27371256eb6f04 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 13 Dec 2019 22:17:27 +0100 Subject: [PATCH 038/479] 2019: d13: ex1: add solution --- 2019/d13/ex1/ex1.py | 213 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100755 2019/d13/ex1/ex1.py diff --git a/2019/d13/ex1/ex1.py b/2019/d13/ex1/ex1.py new file mode 100755 index 0000000..924ffb7 --- /dev/null +++ b/2019/d13/ex1/ex1.py @@ -0,0 +1,213 @@ +#!/usr/bin/env python + +import sys +from dataclasses import dataclass, field +from enum import IntEnum +from typing import Iterable, List, NamedTuple, Tuple, TypeVar + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self): # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + game = Computer(memory) + game.run_no_output_interrupt() + + T = TypeVar("T") + + def grouped(l: Iterable[T], n: int) -> Iterable[Tuple[T, ...]]: + return zip(*[iter(l)] * n) + + print(sum(1 for __, __, tile in grouped(game.output_list, 3) if tile == 2)) + + +if __name__ == "__main__": + main() From bb41df870976ee3b960ce8b2c1e59e0a237c7f74 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 13 Dec 2019 22:36:41 +0100 Subject: [PATCH 039/479] 2019: d13: ex2: add input --- 2019/d13/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d13/ex2/input diff --git a/2019/d13/ex2/input b/2019/d13/ex2/input new file mode 100644 index 0000000..98d5ab4 --- /dev/null +++ b/2019/d13/ex2/input @@ -0,0 +1 @@ +1,380,379,385,1008,2663,704183,381,1005,381,12,99,109,2664,1102,1,0,383,1102,0,1,382,20102,1,382,1,21001,383,0,2,21102,37,1,0,1105,1,578,4,382,4,383,204,1,1001,382,1,382,1007,382,44,381,1005,381,22,1001,383,1,383,1007,383,23,381,1005,381,18,1006,385,69,99,104,-1,104,0,4,386,3,384,1007,384,0,381,1005,381,94,107,0,384,381,1005,381,108,1105,1,161,107,1,392,381,1006,381,161,1102,-1,1,384,1105,1,119,1007,392,42,381,1006,381,161,1101,0,1,384,20102,1,392,1,21102,21,1,2,21102,1,0,3,21102,138,1,0,1105,1,549,1,392,384,392,20101,0,392,1,21102,21,1,2,21101,3,0,3,21101,0,161,0,1106,0,549,1101,0,0,384,20001,388,390,1,21002,389,1,2,21102,180,1,0,1106,0,578,1206,1,213,1208,1,2,381,1006,381,205,20001,388,390,1,20102,1,389,2,21101,0,205,0,1105,1,393,1002,390,-1,390,1102,1,1,384,21001,388,0,1,20001,389,391,2,21102,1,228,0,1106,0,578,1206,1,261,1208,1,2,381,1006,381,253,20102,1,388,1,20001,389,391,2,21101,253,0,0,1105,1,393,1002,391,-1,391,1101,1,0,384,1005,384,161,20001,388,390,1,20001,389,391,2,21101,0,279,0,1105,1,578,1206,1,316,1208,1,2,381,1006,381,304,20001,388,390,1,20001,389,391,2,21101,0,304,0,1106,0,393,1002,390,-1,390,1002,391,-1,391,1101,0,1,384,1005,384,161,20102,1,388,1,21002,389,1,2,21102,0,1,3,21101,0,338,0,1106,0,549,1,388,390,388,1,389,391,389,21002,388,1,1,21001,389,0,2,21102,1,4,3,21102,365,1,0,1105,1,549,1007,389,22,381,1005,381,75,104,-1,104,0,104,0,99,0,1,0,0,0,0,0,0,414,20,18,1,1,22,109,3,22102,1,-2,1,21202,-1,1,2,21102,1,0,3,21101,0,414,0,1106,0,549,21201,-2,0,1,21202,-1,1,2,21101,429,0,0,1105,1,601,1201,1,0,435,1,386,0,386,104,-1,104,0,4,386,1001,387,-1,387,1005,387,451,99,109,-3,2106,0,0,109,8,22202,-7,-6,-3,22201,-3,-5,-3,21202,-4,64,-2,2207,-3,-2,381,1005,381,492,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,481,21202,-4,8,-2,2207,-3,-2,381,1005,381,518,21202,-2,-1,-1,22201,-3,-1,-3,2207,-3,-2,381,1006,381,507,2207,-3,-4,381,1005,381,540,21202,-4,-1,-1,22201,-3,-1,-3,2207,-3,-4,381,1006,381,529,22102,1,-3,-7,109,-8,2106,0,0,109,4,1202,-2,44,566,201,-3,566,566,101,639,566,566,2101,0,-1,0,204,-3,204,-2,204,-1,109,-4,2105,1,0,109,3,1202,-1,44,594,201,-2,594,594,101,639,594,594,20101,0,0,-2,109,-3,2106,0,0,109,3,22102,23,-2,1,22201,1,-1,1,21102,509,1,2,21102,150,1,3,21101,1012,0,4,21102,630,1,0,1106,0,456,21201,1,1651,-2,109,-3,2105,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,2,2,0,2,0,2,2,2,2,2,0,2,2,2,2,2,2,0,2,0,2,2,2,0,2,0,0,2,2,2,0,2,2,2,2,0,2,0,0,2,0,1,1,0,2,0,2,0,2,2,2,2,0,0,2,2,2,2,0,2,2,0,2,2,2,2,2,2,2,2,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,1,1,0,2,2,2,0,0,2,0,0,2,0,2,0,2,0,0,0,0,2,2,2,2,2,2,0,2,0,0,0,0,0,2,0,2,2,2,2,2,2,2,0,0,1,1,0,2,2,2,2,2,2,0,0,0,2,2,2,0,2,2,0,2,2,2,0,0,2,2,0,2,0,2,2,2,0,2,2,0,2,2,2,2,2,2,2,0,1,1,0,2,0,2,2,0,2,2,0,2,0,2,2,0,0,2,2,2,2,2,2,2,0,0,0,0,2,2,0,2,2,0,0,2,2,0,0,2,2,2,2,0,1,1,0,2,2,2,2,2,2,2,0,0,2,0,2,0,2,2,2,2,2,0,0,2,0,2,2,2,2,2,2,2,0,0,0,0,2,2,2,2,0,2,0,0,1,1,0,2,0,0,2,0,2,0,2,2,2,2,2,0,2,2,0,2,0,2,0,2,2,0,0,2,2,2,2,2,0,2,2,0,2,0,0,2,2,2,0,0,1,1,0,0,2,2,2,2,0,0,0,2,2,0,2,2,2,0,2,2,2,2,2,0,2,2,2,2,2,2,2,0,0,0,0,2,2,0,2,2,2,2,2,0,1,1,0,2,0,2,2,2,2,2,2,0,2,2,2,0,2,0,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,0,0,1,1,0,2,0,2,2,2,0,2,0,2,0,2,2,2,0,0,0,2,2,2,2,0,0,2,2,2,2,2,2,2,2,2,2,2,0,0,2,2,0,0,0,0,1,1,0,2,0,2,0,0,2,2,2,2,2,2,2,2,0,0,0,2,2,0,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,0,0,2,2,0,2,0,1,1,0,2,2,2,0,2,2,0,2,2,2,2,2,2,2,2,2,0,2,2,0,0,2,2,2,0,0,2,2,2,0,2,2,2,2,0,2,0,2,2,2,0,1,1,0,2,2,2,2,2,2,0,2,2,2,2,2,2,2,0,2,2,2,2,2,0,2,0,2,2,2,2,2,0,2,2,2,2,0,0,2,2,2,2,2,0,1,1,0,2,2,0,2,2,0,2,0,2,2,0,0,2,2,2,2,2,0,2,2,0,2,2,0,2,2,2,2,0,2,2,0,2,0,2,2,2,2,0,0,0,1,1,0,2,0,2,2,2,0,2,2,2,2,2,2,0,2,0,2,2,2,0,0,2,2,2,2,2,0,2,0,2,0,2,0,2,0,2,2,2,0,0,2,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,34,29,24,40,90,52,13,48,86,82,86,77,3,16,27,97,89,38,11,82,76,15,50,46,33,57,17,38,39,91,43,86,43,55,15,24,23,74,5,53,20,10,16,77,73,84,85,36,89,77,79,82,37,7,24,68,14,78,75,7,86,80,18,84,68,62,89,7,64,11,9,56,62,3,29,95,41,23,18,90,1,10,4,94,8,69,57,13,72,89,61,72,61,17,54,88,96,53,73,21,92,16,52,18,26,89,32,2,50,8,3,5,36,26,64,75,51,55,49,45,78,49,27,55,2,29,37,77,69,3,21,69,6,18,59,91,57,92,6,26,58,40,26,54,33,40,96,45,89,23,53,94,61,44,32,33,41,12,31,67,17,96,34,72,72,49,90,21,1,40,75,97,56,57,77,20,21,68,14,4,7,9,41,88,32,40,79,77,17,48,70,56,50,67,36,16,98,98,65,98,53,7,36,47,27,15,77,80,83,39,8,22,61,11,9,10,54,16,65,54,82,60,66,21,92,51,70,17,53,22,39,89,92,29,12,60,37,42,75,65,1,61,90,86,46,62,81,2,64,64,21,43,17,46,57,72,25,63,51,30,22,65,81,54,85,45,93,24,23,23,27,37,94,11,15,93,78,75,11,41,56,42,89,20,73,23,27,98,89,29,68,73,89,75,80,31,90,36,62,44,65,18,97,24,22,84,30,56,41,44,67,63,71,85,76,66,64,51,58,98,30,66,4,90,38,8,49,49,62,55,53,5,74,18,93,4,34,48,86,17,37,35,28,45,38,76,95,67,21,67,6,36,38,1,16,5,8,89,9,37,32,78,90,46,92,61,3,96,40,91,31,98,35,90,96,44,43,55,39,51,64,51,39,12,90,58,69,58,39,13,49,60,35,40,56,56,74,47,54,23,8,54,59,97,12,8,62,21,66,59,96,61,54,12,98,28,85,95,2,4,14,89,78,4,16,66,48,37,43,17,59,77,20,63,28,87,10,20,58,46,55,26,94,3,71,5,13,90,67,68,55,93,38,16,28,45,47,41,88,98,90,95,44,33,89,54,24,33,38,94,79,32,15,62,26,52,39,8,22,38,79,3,60,75,55,91,53,36,59,86,1,98,25,87,84,47,83,40,74,22,91,86,73,73,6,15,72,90,43,87,97,63,24,77,20,76,10,96,65,27,69,87,93,17,34,5,52,31,24,46,4,26,3,34,87,96,68,16,82,85,67,65,11,57,71,49,62,77,5,68,20,51,26,40,67,69,32,82,46,57,15,31,81,38,74,98,3,77,78,36,10,55,76,48,90,2,8,21,29,17,66,51,91,59,36,8,2,85,50,53,76,38,91,24,54,6,6,28,20,25,7,56,87,44,54,98,6,10,94,44,93,25,26,65,22,87,52,47,36,1,22,21,32,49,7,72,66,89,92,63,85,90,82,79,33,36,39,69,15,57,80,46,39,28,79,73,43,95,81,21,47,39,68,30,34,79,33,72,14,54,96,52,60,16,9,73,54,78,77,26,89,14,14,28,83,47,81,87,14,86,11,96,29,10,2,84,1,70,59,81,64,29,25,40,53,87,4,42,76,80,48,39,85,60,96,95,78,30,8,83,46,62,68,82,40,15,43,51,81,65,64,3,81,13,48,70,97,95,6,23,91,66,63,22,70,28,10,42,90,91,80,34,29,48,18,96,78,14,17,88,13,96,72,72,86,45,95,59,20,67,65,35,89,46,76,35,7,35,4,64,58,15,98,39,81,2,95,10,75,56,85,22,31,22,14,9,12,48,15,75,91,85,91,26,40,78,23,76,5,45,6,79,58,4,70,7,10,79,56,98,86,34,18,73,57,70,97,72,59,75,36,30,21,41,38,83,93,64,92,89,17,65,19,93,9,83,51,3,20,71,89,37,70,3,90,13,35,95,43,14,78,3,43,15,11,21,36,50,12,27,47,58,18,8,66,23,32,7,88,82,27,21,23,5,80,79,44,87,19,11,47,15,14,18,14,95,54,81,76,93,51,53,63,97,39,11,30,26,89,6,29,15,21,49,57,53,52,93,83,11,95,28,58,79,22,65,58,93,89,60,49,78,55,22,42,25,14,61,66,28,84,43,4,68,54,68,17,46,13,88,30,39,40,35,35,14,69,34,55,93,43,7,20,82,83,50,25,50,26,78,17,93,7,10,24,3,27,85,97,88,62,65,11,66,36,38,14,32,31,94,14,3,38,39,96,23,64,89,91,37,9,5,44,4,18,43,64,53,58,96,84,67,96,24,86,49,30,49,24,4,46,57,704183 From eebd801537513483bb5c05d495b68d11e8fd08d2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 13 Dec 2019 22:36:47 +0100 Subject: [PATCH 040/479] 2019: d13: ex2: add solution --- 2019/d13/ex2/ex2.py | 249 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 249 insertions(+) create mode 100755 2019/d13/ex2/ex2.py diff --git a/2019/d13/ex2/ex2.py b/2019/d13/ex2/ex2.py new file mode 100755 index 0000000..af0d24f --- /dev/null +++ b/2019/d13/ex2/ex2.py @@ -0,0 +1,249 @@ +#!/usr/bin/env python + +import sys +from dataclasses import dataclass, field +from enum import IntEnum +from typing import Iterable, List, NamedTuple, Tuple, TypeVar + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self): # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +class Tile(IntEnum): + EMPTY = 0 + WALL = 1 + BLOCK = 2 + PADDLE = 3 + BALL = 4 + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + memory[0] = 2 # Play for free + game = Computer(memory) + + T = TypeVar("T") + + def grouped(l: Iterable[T], n: int) -> Iterable[Tuple[T, ...]]: + return zip(*[iter(l)] * n) + + paddle_pos = None + ball_pos = None + score = None + output_num = 0 + while not game.is_halted: + try: + game.run() + except OutputInterrupt: + output_num += 1 + if output_num < 3: # Not processable yet + continue + x, y = game.output_list[0:2] + if x == -1 and y == 0: # Score display + score = game.output_list[2] + else: + tile_type = Tile(game.output_list[2]) + if tile_type == Tile.PADDLE: + paddle_pos = x + elif tile_type == Tile.BALL: + ball_pos = x + game.output_list.clear() # Remove processed tiles + output_num = 0 # Reset count for next output + except InputInterrupt: + assert paddle_pos is not None and ball_pos is not None # Sanity check + offset = ball_pos - paddle_pos + game.input_list.append(0 if offset == 0 else offset // abs(offset)) + + assert score is not None # Sanity check + print(score) + + +if __name__ == "__main__": + main() From e85fa35b30bd266649d6660b7f2d6953338e4720 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 14 Dec 2019 17:35:40 +0100 Subject: [PATCH 041/479] 2019: d14: ex1: add input --- 2019/d14/ex1/input | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 2019/d14/ex1/input diff --git a/2019/d14/ex1/input b/2019/d14/ex1/input new file mode 100644 index 0000000..7e55064 --- /dev/null +++ b/2019/d14/ex1/input @@ -0,0 +1,59 @@ +10 LSZLT, 29 XQJK => 4 BMRQJ +22 HCKS => 1 GQKCZ +1 HCKS, 8 WZWRV, 18 HVZR => 7 BGFR +1 LSZLT, 1 WRKJ, 3 LJFP, 3 RNLPB, 1 NZGK, 3 LDSV, 5 RJDN, 8 HGFGC => 3 QZTXD +1 BRSGQ, 1 XGLF, 1 ZHSK, 20 LSZLT, 16 WFCPT, 3 KTWV, 1 QRJC => 4 XPKX +1 DCLR, 6 RNLPB => 5 HCKS +1 HFHFV => 3 SHLMF +2 LTMZQ, 21 FGCXN => 6 QKFKV +3 BGFR => 7 WRKJ +3 KHSB => 2 XQJL +3 SHLMF => 2 LPLG +12 SVHWT, 20 BXPSZ => 9 NBMF +2 FGCXN, 32 DCSVN => 8 TBDWZ +1 KHSB, 3 HGFGC => 6 WZWRV +27 WFCPT, 4 KTWV, 14 BRSGQ, 1 MFNK, 1 WRKJ, 2 NZGK, 24 FBFLK => 5 TRLCK +2 SVHWT => 3 QRJC +1 MNVR, 1 FKBMW => 2 FGCXN +4 GJXW => 9 JXFS +3 XQJK => 5 WNJM +1 WZVWZ, 1 XQJL => 9 SHKJV +2 DCSVN => 4 HDVC +2 GJXW => 2 RNLPB +1 QKFKV, 1 PBRWB => 5 WTZQ +14 QKFKV => 6 RDFTD +166 ORE => 1 QDSXV +2 DCSVN => 5 BXPSZ +113 ORE => 6 LTMZQ +13 MNVR => 7 RJDN +2 NZGK, 9 XQJK, 18 WRKJ => 9 KTWV +1 NZGK => 8 XQJK +6 RZCGN, 6 HDVC, 1 DLKR => 9 DSLXW +18 HVZR => 8 LJFP +7 XQJL => 1 NPDS +15 DLKR, 1 DSLXW, 26 MJFVP => 3 FBFLK +125 ORE => 9 MNVR +3 RJDN => 4 HFHFV +1 TBDWZ, 1 DCLR => 2 HVZR +2 SHKJV => 5 GJXW +7 LTMZQ, 1 QDSXV, 1 FKBMW => 3 DCSVN +9 LPLG, 11 JXFS => 3 BRSGQ +5 JXFS, 1 ZHSK, 25 XGLF => 4 MFNK +5 PBRWB => 2 SVHWT +15 SHKJV => 5 XGLF +1 XQJL, 2 NPDS => 4 DLKR +39 JXFS => 5 KSHF +6 GJXW, 1 FBFLK => 7 HGFGC +3 JXFS => 1 LSZLT +3 NBMF, 1 BMRQJ => 2 LDSV +1 JXFS, 25 GJXW, 10 HGFGC => 4 NZGK +8 QZTXD, 26 KSHF, 60 WNJM, 6 GJXW, 9 TRLCK, 20 XPKX, 21 FGCXN, 57 GQKCZ, 6 WRKJ => 1 FUEL +4 SVHWT, 1 RZCGN => 3 ZHSK +1 BXPSZ => 7 DCLR +8 RDFTD, 1 SHKJV, 1 HFHFV => 6 MJFVP +1 LTMZQ => 9 KHSB +5 WTZQ, 4 HGFGC, 4 HCKS => 9 WFCPT +184 ORE => 4 FKBMW +4 XQJL => 3 WZVWZ +12 QDSXV => 9 RZCGN +1 FBFLK, 7 HVZR => 9 PBRWB From f4bd381a1adab1d68a53e03a10e340acbf41919e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 14 Dec 2019 17:35:44 +0100 Subject: [PATCH 042/479] 2019: d14: ex1: add solution --- 2019/d14/ex1/ex1.py | 89 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100755 2019/d14/ex1/ex1.py diff --git a/2019/d14/ex1/ex1.py b/2019/d14/ex1/ex1.py new file mode 100755 index 0000000..66144b2 --- /dev/null +++ b/2019/d14/ex1/ex1.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +import sys +from dataclasses import dataclass +from math import ceil +from typing import Dict, List + + +@dataclass +class Ingredient: + name: str + quantity: int + + +@dataclass +class ReactionEquation: + quantity: int + inputs: List[Ingredient] + + +Reactions = Dict[str, ReactionEquation] + + +def solve_for(n: int, reactions: Reactions) -> int: + ore_needed = 0 + wanted = [("FUEL", n)] + excess: Dict[str, int] = {} + + def provide_ingredient(name: str, wanted_quantity: int) -> None: + nonlocal ore_needed + nonlocal excess + nonlocal wanted + + if name == "ORE": + ore_needed += wanted_quantity # There's no recipy for this one + return + + if name in excess: + # Take from excess + if excess[name] > wanted_quantity: + excess[name] -= wanted_quantity + return # Nothing left to do + wanted_quantity -= excess[name] + del excess[name] # Took everything + + if wanted_quantity == 0: # In case we provided just enough by excess + return + + equation = reactions[name] + reaction_num = ceil(wanted_quantity / equation.quantity) + + for ingredient in equation.inputs: + needed_quantity = ingredient.quantity * reaction_num + provide_ingredient(ingredient.name, needed_quantity) + + produced_quantity = equation.quantity * reaction_num + excess_quantity = produced_quantity - wanted_quantity + if excess_quantity > 0: + if name in excess: + excess[name] += excess_quantity + else: + excess[name] = excess_quantity + + while len(wanted) != 0: + provide_ingredient(*(wanted.pop())) + + return ore_needed + + +def main() -> None: + reactions: Reactions = {} + + def parse_react(l: str) -> None: + def parse_ingredient(i: str) -> Ingredient: + quantity, name = i.strip().split(" ") + return Ingredient(name, int(quantity)) + + input_list, output_str = l.split("=>") + inputs = [i for i in map(parse_ingredient, input_list.split(", "))] + output = parse_ingredient(output_str) + reactions[output.name] = ReactionEquation(output.quantity, inputs) + + for line in sys.stdin.readlines(): + parse_react(line) + print(solve_for(1, reactions)) + + +if __name__ == "__main__": + main() From 68df040691a18f3a714f142c1e36b137b37dbfed Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 14 Dec 2019 17:46:10 +0100 Subject: [PATCH 043/479] 2019: d14: ex2: add input --- 2019/d14/ex2/input | 59 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 2019/d14/ex2/input diff --git a/2019/d14/ex2/input b/2019/d14/ex2/input new file mode 100644 index 0000000..7e55064 --- /dev/null +++ b/2019/d14/ex2/input @@ -0,0 +1,59 @@ +10 LSZLT, 29 XQJK => 4 BMRQJ +22 HCKS => 1 GQKCZ +1 HCKS, 8 WZWRV, 18 HVZR => 7 BGFR +1 LSZLT, 1 WRKJ, 3 LJFP, 3 RNLPB, 1 NZGK, 3 LDSV, 5 RJDN, 8 HGFGC => 3 QZTXD +1 BRSGQ, 1 XGLF, 1 ZHSK, 20 LSZLT, 16 WFCPT, 3 KTWV, 1 QRJC => 4 XPKX +1 DCLR, 6 RNLPB => 5 HCKS +1 HFHFV => 3 SHLMF +2 LTMZQ, 21 FGCXN => 6 QKFKV +3 BGFR => 7 WRKJ +3 KHSB => 2 XQJL +3 SHLMF => 2 LPLG +12 SVHWT, 20 BXPSZ => 9 NBMF +2 FGCXN, 32 DCSVN => 8 TBDWZ +1 KHSB, 3 HGFGC => 6 WZWRV +27 WFCPT, 4 KTWV, 14 BRSGQ, 1 MFNK, 1 WRKJ, 2 NZGK, 24 FBFLK => 5 TRLCK +2 SVHWT => 3 QRJC +1 MNVR, 1 FKBMW => 2 FGCXN +4 GJXW => 9 JXFS +3 XQJK => 5 WNJM +1 WZVWZ, 1 XQJL => 9 SHKJV +2 DCSVN => 4 HDVC +2 GJXW => 2 RNLPB +1 QKFKV, 1 PBRWB => 5 WTZQ +14 QKFKV => 6 RDFTD +166 ORE => 1 QDSXV +2 DCSVN => 5 BXPSZ +113 ORE => 6 LTMZQ +13 MNVR => 7 RJDN +2 NZGK, 9 XQJK, 18 WRKJ => 9 KTWV +1 NZGK => 8 XQJK +6 RZCGN, 6 HDVC, 1 DLKR => 9 DSLXW +18 HVZR => 8 LJFP +7 XQJL => 1 NPDS +15 DLKR, 1 DSLXW, 26 MJFVP => 3 FBFLK +125 ORE => 9 MNVR +3 RJDN => 4 HFHFV +1 TBDWZ, 1 DCLR => 2 HVZR +2 SHKJV => 5 GJXW +7 LTMZQ, 1 QDSXV, 1 FKBMW => 3 DCSVN +9 LPLG, 11 JXFS => 3 BRSGQ +5 JXFS, 1 ZHSK, 25 XGLF => 4 MFNK +5 PBRWB => 2 SVHWT +15 SHKJV => 5 XGLF +1 XQJL, 2 NPDS => 4 DLKR +39 JXFS => 5 KSHF +6 GJXW, 1 FBFLK => 7 HGFGC +3 JXFS => 1 LSZLT +3 NBMF, 1 BMRQJ => 2 LDSV +1 JXFS, 25 GJXW, 10 HGFGC => 4 NZGK +8 QZTXD, 26 KSHF, 60 WNJM, 6 GJXW, 9 TRLCK, 20 XPKX, 21 FGCXN, 57 GQKCZ, 6 WRKJ => 1 FUEL +4 SVHWT, 1 RZCGN => 3 ZHSK +1 BXPSZ => 7 DCLR +8 RDFTD, 1 SHKJV, 1 HFHFV => 6 MJFVP +1 LTMZQ => 9 KHSB +5 WTZQ, 4 HGFGC, 4 HCKS => 9 WFCPT +184 ORE => 4 FKBMW +4 XQJL => 3 WZVWZ +12 QDSXV => 9 RZCGN +1 FBFLK, 7 HVZR => 9 PBRWB From 947a6e99702fa5d11466fb4f36a54886d86aeadb Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 14 Dec 2019 17:46:19 +0100 Subject: [PATCH 044/479] 2019: d14: ex2: add solution --- 2019/d14/ex2/ex2.py | 106 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100755 2019/d14/ex2/ex2.py diff --git a/2019/d14/ex2/ex2.py b/2019/d14/ex2/ex2.py new file mode 100755 index 0000000..177ed1c --- /dev/null +++ b/2019/d14/ex2/ex2.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python + +import sys +from dataclasses import dataclass +from math import ceil +from typing import Dict, List + + +@dataclass +class Ingredient: + name: str + quantity: int + + +@dataclass +class ReactionEquation: + quantity: int + inputs: List[Ingredient] + + +Reactions = Dict[str, ReactionEquation] + + +def solve_for(n: int, reactions: Reactions) -> int: + ore_needed = 0 + wanted = [("FUEL", n)] + excess: Dict[str, int] = {} + + def provide_ingredient(name: str, wanted_quantity: int) -> None: + nonlocal ore_needed + nonlocal excess + nonlocal wanted + + if name == "ORE": + ore_needed += wanted_quantity # There's no recipy for this one + return + + if name in excess: + # Take from excess + if excess[name] > wanted_quantity: + excess[name] -= wanted_quantity + return # Nothing left to do + wanted_quantity -= excess[name] + del excess[name] # Took everything + + if wanted_quantity == 0: # In case we provided just enough by excess + return + + equation = reactions[name] + reaction_num = ceil(wanted_quantity / equation.quantity) + + for ingredient in equation.inputs: + needed_quantity = ingredient.quantity * reaction_num + provide_ingredient(ingredient.name, needed_quantity) + + produced_quantity = equation.quantity * reaction_num + excess_quantity = produced_quantity - wanted_quantity + if excess_quantity > 0: + if name in excess: + excess[name] += excess_quantity + else: + excess[name] = excess_quantity + + while len(wanted) != 0: + provide_ingredient(*(wanted.pop())) + + return ore_needed + + +def main() -> None: + reactions: Reactions = {} + + def parse_react(l: str) -> None: + def parse_ingredient(i: str) -> Ingredient: + quantity, name = i.strip().split(" ") + return Ingredient(name, int(quantity)) + + input_list, output_str = l.split("=>") + inputs = [i for i in map(parse_ingredient, input_list.split(", "))] + output = parse_ingredient(output_str) + reactions[output.name] = ReactionEquation(output.quantity, inputs) + + for line in sys.stdin.readlines(): + parse_react(line) + + for_one = solve_for(1, reactions) + target = 1000000000000 + # Educated guesses about minimum and maximum fuel needed to use 'target' ORE + min_fuel_needed = target // for_one + max_fuel_needed = 2 * min_fuel_needed + while min_fuel_needed < max_fuel_needed: + # We already know that minimum value is valid, offset it by one for the search + mid = ceil((min_fuel_needed + max_fuel_needed) / 2) + mid_res = solve_for(mid, reactions) + if mid_res > target: + # Exclude the maximum that was already searched + max_fuel_needed = mid - 1 + else: + # Keep the valid minimum value + min_fuel_needed = mid + + print(max_fuel_needed) + + +if __name__ == "__main__": + main() From 65cb0c224bee0742e48d78b03ad8965dec78f9a3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 15 Dec 2019 14:10:42 +0100 Subject: [PATCH 045/479] 2019: d15: ex1: add input --- 2019/d15/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d15/ex1/input diff --git a/2019/d15/ex1/input b/2019/d15/ex1/input new file mode 100644 index 0000000..7dbcaac --- /dev/null +++ b/2019/d15/ex1/input @@ -0,0 +1 @@ +3,1033,1008,1033,1,1032,1005,1032,31,1008,1033,2,1032,1005,1032,58,1008,1033,3,1032,1005,1032,81,1008,1033,4,1032,1005,1032,104,99,101,0,1034,1039,1001,1036,0,1041,1001,1035,-1,1040,1008,1038,0,1043,102,-1,1043,1032,1,1037,1032,1042,1105,1,124,1002,1034,1,1039,1001,1036,0,1041,1001,1035,1,1040,1008,1038,0,1043,1,1037,1038,1042,1106,0,124,1001,1034,-1,1039,1008,1036,0,1041,101,0,1035,1040,1001,1038,0,1043,1002,1037,1,1042,1105,1,124,1001,1034,1,1039,1008,1036,0,1041,1002,1035,1,1040,101,0,1038,1043,1001,1037,0,1042,1006,1039,217,1006,1040,217,1008,1039,40,1032,1005,1032,217,1008,1040,40,1032,1005,1032,217,1008,1039,33,1032,1006,1032,165,1008,1040,33,1032,1006,1032,165,1101,2,0,1044,1106,0,224,2,1041,1043,1032,1006,1032,179,1101,0,1,1044,1106,0,224,1,1041,1043,1032,1006,1032,217,1,1042,1043,1032,1001,1032,-1,1032,1002,1032,39,1032,1,1032,1039,1032,101,-1,1032,1032,101,252,1032,211,1007,0,68,1044,1106,0,224,1101,0,0,1044,1105,1,224,1006,1044,247,1002,1039,1,1034,102,1,1040,1035,1001,1041,0,1036,1002,1043,1,1038,1001,1042,0,1037,4,1044,1105,1,0,67,55,37,80,63,12,30,78,95,7,20,63,83,54,86,58,97,11,84,24,11,77,42,78,22,54,89,52,44,28,93,30,81,60,58,78,87,60,54,59,78,96,17,82,74,85,66,41,89,96,54,40,82,17,22,89,65,96,71,55,81,34,90,11,85,44,58,83,79,93,30,76,62,80,16,73,20,43,40,73,69,39,39,15,93,39,99,8,74,33,97,84,24,50,91,5,71,34,81,76,22,98,50,93,80,36,76,16,76,43,19,71,63,41,21,99,40,75,55,27,82,80,83,54,66,75,61,86,14,10,74,38,92,31,49,97,20,98,15,71,59,96,53,86,35,60,6,73,71,59,79,10,84,69,23,82,14,7,76,99,45,19,96,92,14,63,55,71,46,71,34,74,73,22,95,89,10,24,59,69,17,42,96,12,92,94,66,1,69,91,36,90,94,13,17,33,46,20,89,90,24,12,94,92,83,42,73,43,70,83,55,17,92,66,23,74,99,1,92,82,54,71,96,1,22,78,74,94,66,78,40,87,13,87,73,74,89,26,26,70,42,79,3,9,84,72,55,98,56,27,73,74,57,85,66,76,88,55,58,30,97,40,71,76,6,10,55,71,43,36,99,46,59,34,37,84,61,85,90,62,98,18,39,46,84,23,70,93,9,71,5,71,94,5,59,40,71,26,90,12,45,57,74,5,92,86,32,99,20,92,82,22,44,88,29,41,89,7,86,81,72,76,9,94,94,3,8,94,71,12,93,6,82,91,91,20,86,86,38,85,95,42,86,85,19,57,90,17,85,6,84,17,81,42,77,63,26,59,9,24,85,22,31,35,93,64,90,4,16,91,67,83,23,43,63,75,3,88,93,52,14,84,85,36,95,12,51,79,54,1,16,72,1,76,79,88,63,95,77,6,91,86,23,92,54,91,51,82,45,14,98,89,74,47,52,82,80,65,74,44,58,90,14,98,42,91,6,50,88,29,81,96,25,1,97,62,62,73,61,48,82,76,93,98,49,14,74,6,97,30,47,73,77,8,89,10,17,65,21,74,95,43,83,89,72,96,27,59,20,58,80,10,70,86,42,92,26,50,98,85,3,62,20,93,86,78,19,78,91,23,90,37,71,66,97,97,95,86,40,46,79,70,37,14,98,51,91,81,4,9,77,93,19,53,70,87,40,11,95,25,93,90,17,98,39,76,92,55,57,93,39,76,13,99,58,92,26,88,80,65,34,71,62,72,17,64,38,97,85,32,4,88,69,82,51,63,61,71,77,33,90,59,74,49,76,8,76,93,55,36,71,84,7,67,47,3,85,98,9,99,32,8,79,18,28,55,77,10,30,79,77,4,1,99,82,66,90,41,64,22,82,33,20,87,24,29,80,53,72,27,17,85,84,70,16,94,11,81,92,48,85,61,47,83,21,45,92,92,38,61,75,98,52,73,80,29,82,94,29,85,61,69,59,35,84,86,60,98,63,83,69,39,10,15,64,18,85,88,63,97,95,56,13,43,75,93,13,34,85,57,37,96,39,65,60,73,73,82,11,81,80,38,88,76,23,88,19,70,2,93,46,28,79,92,91,18,6,92,96,50,77,56,45,77,36,64,83,91,64,75,48,72,71,17,69,40,82,7,6,92,70,25,23,72,9,23,84,16,17,75,76,70,60,61,99,86,21,27,85,63,80,81,55,87,93,97,53,78,53,97,14,97,49,85,65,91,72,72,5,93,34,81,10,85,86,81,19,87,61,84,11,99,96,94,8,78,13,84,9,70,0,0,21,21,1,10,1,0,0,0,0,0,0 From 90cc65bb3a7b734f0cc3b134b45aa3a079c5fb7f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 15 Dec 2019 14:10:54 +0100 Subject: [PATCH 046/479] 2019: d15: ex1: add solution --- 2019/d15/ex1/ex1.py | 315 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 315 insertions(+) create mode 100755 2019/d15/ex1/ex1.py diff --git a/2019/d15/ex1/ex1.py b/2019/d15/ex1/ex1.py new file mode 100755 index 0000000..59b99ad --- /dev/null +++ b/2019/d15/ex1/ex1.py @@ -0,0 +1,315 @@ +#!/usr/bin/env python + +import heapq +import sys +from dataclasses import dataclass, field +from enum import Enum, IntEnum, auto +from typing import List, NamedTuple, Optional, Set + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self): # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +class Movement(IntEnum): + NORTH = 1 + SOUTH = 2 + WEST = 3 + EAST = 4 + + +class StatusCode(IntEnum): + BLOCKED = 0 + SUCCESS = 1 + ON_TANK = 2 + + +class BlockType(Enum): + WALL = auto() + HALLWAY = auto() + OXYGEN_TANK = auto() + + +class Coordinate(NamedTuple): + x: int + y: int + + +@dataclass +class GraphNode: + memory_state: Optional[List[int]] # Only walls have no need for the memory state + block_type: BlockType + parent: Optional[Coordinate] # Only the root of the exploration has no parent + + +def coord_plus_dir(c: Coordinate, d: Movement) -> Coordinate: + offset = { + Movement.NORTH: Coordinate(0, 1), + Movement.SOUTH: Coordinate(0, -1), + Movement.WEST: Coordinate(-1, 0), + Movement.EAST: Coordinate(1, 0), + } + return Coordinate(*(a + b for (a, b) in zip(c, offset[d]))) + + +def move_to_opposite(d: Movement) -> Movement: + if d == Movement.NORTH: + return Movement.SOUTH + elif d == Movement.SOUTH: + return Movement.NORTH + elif d == Movement.WEST: + return Movement.EAST + else: + return Movement.WEST + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + droid = Computer(memory) + block_map = {Coordinate(0, 0): BlockType.HALLWAY} + + def dfs(p: Coordinate, direction: Movement) -> None: + end_coord = coord_plus_dir(p, direction) + if end_coord in block_map: + return # Nothing to do + + droid.input_list.append(int(direction)) + try: + droid.run() + except OutputInterrupt: + status = StatusCode(droid.output_list.pop(0)) + if status == StatusCode.BLOCKED: + block_map[end_coord] = BlockType.WALL + return # Don't need to backtrack + block_map[end_coord] = ( + BlockType.OXYGEN_TANK + if status == StatusCode.ON_TANK + else BlockType.HALLWAY + ) + for d in Movement: + dfs(end_coord, d) + droid.input_list.append(int(move_to_opposite(direction))) + try: + droid.run() + except OutputInterrupt: + droid.output_list.pop(0) + + for direction in Movement: + dfs(Coordinate(0, 0), direction) + assert len(droid.input_list) == 0 and len(droid.output_list) == 0 # Sanity check + + block_map = {p: t for p, t in block_map.items() if t != BlockType.WALL} + oxygen_gen = ( + pos for pos, block in block_map.items() if block == BlockType.OXYGEN_TANK + ) + oxygen_pos = next(oxygen_gen) + assert next(oxygen_gen, None) is None # Sanity check + + seen: Set[Coordinate] = set() + to_visit = [(0, oxygen_pos)] + + def find_shortest() -> int: + while True: + dist, pos = heapq.heappop(to_visit) + if pos == Coordinate(0, 0): + return dist + if pos in seen: + continue + if pos not in block_map: + continue + seen.add(pos) + for d in Movement: + new_pos = coord_plus_dir(pos, d) + heapq.heappush(to_visit, (dist + 1, new_pos)) + + print(find_shortest()) + + +if __name__ == "__main__": + main() From 3217af1859e3bae0dfd21e869027ff5356e23b5a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 15 Dec 2019 14:13:59 +0100 Subject: [PATCH 047/479] 2019: d15: ex2: add input --- 2019/d15/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d15/ex2/input diff --git a/2019/d15/ex2/input b/2019/d15/ex2/input new file mode 100644 index 0000000..7dbcaac --- /dev/null +++ b/2019/d15/ex2/input @@ -0,0 +1 @@ +3,1033,1008,1033,1,1032,1005,1032,31,1008,1033,2,1032,1005,1032,58,1008,1033,3,1032,1005,1032,81,1008,1033,4,1032,1005,1032,104,99,101,0,1034,1039,1001,1036,0,1041,1001,1035,-1,1040,1008,1038,0,1043,102,-1,1043,1032,1,1037,1032,1042,1105,1,124,1002,1034,1,1039,1001,1036,0,1041,1001,1035,1,1040,1008,1038,0,1043,1,1037,1038,1042,1106,0,124,1001,1034,-1,1039,1008,1036,0,1041,101,0,1035,1040,1001,1038,0,1043,1002,1037,1,1042,1105,1,124,1001,1034,1,1039,1008,1036,0,1041,1002,1035,1,1040,101,0,1038,1043,1001,1037,0,1042,1006,1039,217,1006,1040,217,1008,1039,40,1032,1005,1032,217,1008,1040,40,1032,1005,1032,217,1008,1039,33,1032,1006,1032,165,1008,1040,33,1032,1006,1032,165,1101,2,0,1044,1106,0,224,2,1041,1043,1032,1006,1032,179,1101,0,1,1044,1106,0,224,1,1041,1043,1032,1006,1032,217,1,1042,1043,1032,1001,1032,-1,1032,1002,1032,39,1032,1,1032,1039,1032,101,-1,1032,1032,101,252,1032,211,1007,0,68,1044,1106,0,224,1101,0,0,1044,1105,1,224,1006,1044,247,1002,1039,1,1034,102,1,1040,1035,1001,1041,0,1036,1002,1043,1,1038,1001,1042,0,1037,4,1044,1105,1,0,67,55,37,80,63,12,30,78,95,7,20,63,83,54,86,58,97,11,84,24,11,77,42,78,22,54,89,52,44,28,93,30,81,60,58,78,87,60,54,59,78,96,17,82,74,85,66,41,89,96,54,40,82,17,22,89,65,96,71,55,81,34,90,11,85,44,58,83,79,93,30,76,62,80,16,73,20,43,40,73,69,39,39,15,93,39,99,8,74,33,97,84,24,50,91,5,71,34,81,76,22,98,50,93,80,36,76,16,76,43,19,71,63,41,21,99,40,75,55,27,82,80,83,54,66,75,61,86,14,10,74,38,92,31,49,97,20,98,15,71,59,96,53,86,35,60,6,73,71,59,79,10,84,69,23,82,14,7,76,99,45,19,96,92,14,63,55,71,46,71,34,74,73,22,95,89,10,24,59,69,17,42,96,12,92,94,66,1,69,91,36,90,94,13,17,33,46,20,89,90,24,12,94,92,83,42,73,43,70,83,55,17,92,66,23,74,99,1,92,82,54,71,96,1,22,78,74,94,66,78,40,87,13,87,73,74,89,26,26,70,42,79,3,9,84,72,55,98,56,27,73,74,57,85,66,76,88,55,58,30,97,40,71,76,6,10,55,71,43,36,99,46,59,34,37,84,61,85,90,62,98,18,39,46,84,23,70,93,9,71,5,71,94,5,59,40,71,26,90,12,45,57,74,5,92,86,32,99,20,92,82,22,44,88,29,41,89,7,86,81,72,76,9,94,94,3,8,94,71,12,93,6,82,91,91,20,86,86,38,85,95,42,86,85,19,57,90,17,85,6,84,17,81,42,77,63,26,59,9,24,85,22,31,35,93,64,90,4,16,91,67,83,23,43,63,75,3,88,93,52,14,84,85,36,95,12,51,79,54,1,16,72,1,76,79,88,63,95,77,6,91,86,23,92,54,91,51,82,45,14,98,89,74,47,52,82,80,65,74,44,58,90,14,98,42,91,6,50,88,29,81,96,25,1,97,62,62,73,61,48,82,76,93,98,49,14,74,6,97,30,47,73,77,8,89,10,17,65,21,74,95,43,83,89,72,96,27,59,20,58,80,10,70,86,42,92,26,50,98,85,3,62,20,93,86,78,19,78,91,23,90,37,71,66,97,97,95,86,40,46,79,70,37,14,98,51,91,81,4,9,77,93,19,53,70,87,40,11,95,25,93,90,17,98,39,76,92,55,57,93,39,76,13,99,58,92,26,88,80,65,34,71,62,72,17,64,38,97,85,32,4,88,69,82,51,63,61,71,77,33,90,59,74,49,76,8,76,93,55,36,71,84,7,67,47,3,85,98,9,99,32,8,79,18,28,55,77,10,30,79,77,4,1,99,82,66,90,41,64,22,82,33,20,87,24,29,80,53,72,27,17,85,84,70,16,94,11,81,92,48,85,61,47,83,21,45,92,92,38,61,75,98,52,73,80,29,82,94,29,85,61,69,59,35,84,86,60,98,63,83,69,39,10,15,64,18,85,88,63,97,95,56,13,43,75,93,13,34,85,57,37,96,39,65,60,73,73,82,11,81,80,38,88,76,23,88,19,70,2,93,46,28,79,92,91,18,6,92,96,50,77,56,45,77,36,64,83,91,64,75,48,72,71,17,69,40,82,7,6,92,70,25,23,72,9,23,84,16,17,75,76,70,60,61,99,86,21,27,85,63,80,81,55,87,93,97,53,78,53,97,14,97,49,85,65,91,72,72,5,93,34,81,10,85,86,81,19,87,61,84,11,99,96,94,8,78,13,84,9,70,0,0,21,21,1,10,1,0,0,0,0,0,0 From c1047501a619f40a6994ec2f42fd030b9903c997 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 15 Dec 2019 14:14:05 +0100 Subject: [PATCH 048/479] 2019: d15: ex2: add solution --- 2019/d15/ex2/ex2.py | 318 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 318 insertions(+) create mode 100755 2019/d15/ex2/ex2.py diff --git a/2019/d15/ex2/ex2.py b/2019/d15/ex2/ex2.py new file mode 100755 index 0000000..ee99d3b --- /dev/null +++ b/2019/d15/ex2/ex2.py @@ -0,0 +1,318 @@ +#!/usr/bin/env python + +import heapq +import sys +from dataclasses import dataclass, field +from enum import Enum, IntEnum, auto +from typing import List, NamedTuple, Optional, Set + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self): # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +class Movement(IntEnum): + NORTH = 1 + SOUTH = 2 + WEST = 3 + EAST = 4 + + +class StatusCode(IntEnum): + BLOCKED = 0 + SUCCESS = 1 + ON_TANK = 2 + + +class BlockType(Enum): + WALL = auto() + HALLWAY = auto() + OXYGEN_TANK = auto() + + +class Coordinate(NamedTuple): + x: int + y: int + + +@dataclass +class GraphNode: + memory_state: Optional[List[int]] # Only walls have no need for the memory state + block_type: BlockType + parent: Optional[Coordinate] # Only the root of the exploration has no parent + + +def coord_plus_dir(c: Coordinate, d: Movement) -> Coordinate: + offset = { + Movement.NORTH: Coordinate(0, 1), + Movement.SOUTH: Coordinate(0, -1), + Movement.WEST: Coordinate(-1, 0), + Movement.EAST: Coordinate(1, 0), + } + return Coordinate(*(a + b for (a, b) in zip(c, offset[d]))) + + +def move_to_opposite(d: Movement) -> Movement: + if d == Movement.NORTH: + return Movement.SOUTH + elif d == Movement.SOUTH: + return Movement.NORTH + elif d == Movement.WEST: + return Movement.EAST + else: + return Movement.WEST + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + droid = Computer(memory) + block_map = {Coordinate(0, 0): BlockType.HALLWAY} + + def dfs(p: Coordinate, direction: Movement) -> None: + end_coord = coord_plus_dir(p, direction) + if end_coord in block_map: + return # Nothing to do + + droid.input_list.append(int(direction)) + try: + droid.run() + except OutputInterrupt: + status = StatusCode(droid.output_list.pop(0)) + if status == StatusCode.BLOCKED: + block_map[end_coord] = BlockType.WALL + return # Don't need to backtrack + block_map[end_coord] = ( + BlockType.OXYGEN_TANK + if status == StatusCode.ON_TANK + else BlockType.HALLWAY + ) + for d in Movement: + dfs(end_coord, d) + droid.input_list.append(int(move_to_opposite(direction))) + try: + droid.run() + except OutputInterrupt: + droid.output_list.pop(0) + + for direction in Movement: + dfs(Coordinate(0, 0), direction) + assert len(droid.input_list) == 0 and len(droid.output_list) == 0 # Sanity check + + block_map = {p: t for p, t in block_map.items() if t != BlockType.WALL} + oxygen_gen = ( + pos for pos, block in block_map.items() if block == BlockType.OXYGEN_TANK + ) + oxygen_pos = next(oxygen_gen) + assert next(oxygen_gen, None) is None # Sanity check + + seen: Set[Coordinate] = set() + to_visit = [(0, oxygen_pos)] + + max_dist = 0 + + def fill_oxygen() -> None: + nonlocal max_dist + while len(to_visit) != 0: + dist, pos = heapq.heappop(to_visit) + if pos in seen: + continue + if pos not in block_map: + continue + seen.add(pos) + max_dist = max(max_dist, dist) + for d in Movement: + new_pos = coord_plus_dir(pos, d) + heapq.heappush(to_visit, (dist + 1, new_pos)) + + fill_oxygen() + print(max_dist) + + +if __name__ == "__main__": + main() From 36dfeb9fc272102100dec9caacd223e54799bad8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 16 Dec 2019 11:37:41 +0100 Subject: [PATCH 049/479] 2019: d16: ex1: add input --- 2019/d16/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d16/ex1/input diff --git a/2019/d16/ex1/input b/2019/d16/ex1/input new file mode 100644 index 0000000..c2f8a5f --- /dev/null +++ b/2019/d16/ex1/input @@ -0,0 +1 @@ +59793513516782374825915243993822865203688298721919339628274587775705006728427921751430533510981343323758576985437451867752936052153192753660463974146842169169504066730474876587016668826124639010922391218906707376662919204980583671961374243713362170277231101686574078221791965458164785925384486127508173239563372833776841606271237694768938831709136453354321708319835083666223956618272981294631469954624760620412170069396383335680428214399523030064601263676270903213996956414287336234682903859823675958155009987384202594409175930384736760416642456784909043049471828143167853096088824339425988907292558707480725410676823614387254696304038713756368483311 From 8ad65f864f9f34ce0e9663c0509d9be79ef1e37f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 16 Dec 2019 11:37:47 +0100 Subject: [PATCH 050/479] 2019: d16: ex1: add solution --- 2019/d16/ex1/ex1.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100755 2019/d16/ex1/ex1.py diff --git a/2019/d16/ex1/ex1.py b/2019/d16/ex1/ex1.py new file mode 100755 index 0000000..0d8d731 --- /dev/null +++ b/2019/d16/ex1/ex1.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +import sys +from functools import reduce +from itertools import chain, cycle +from typing import Iterable, List + + +def sequencer(pattern: List[int], n: int) -> Iterable[int]: + gen = cycle(list(chain(*([a] * n for a in pattern)))) + next(gen) # Skip the first one + yield from gen + + +def main() -> None: + signal = [int(d) for d in sys.stdin.read().strip()] + base_pattern = [0, 1, 0, -1] + + for __ in range(100): + signal = [ + abs(sum(a * b for a, b in zip(signal, sequencer(base_pattern, i + 1)))) % 10 + for i in range(len(signal)) + ] + + print(reduce(lambda a, b: a * 10 + b, signal[0:8])) + + +if __name__ == "__main__": + main() From 9e0b69d56eca9e7fbae527e60ac3dd882b5cfaa5 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 16 Dec 2019 14:34:17 +0100 Subject: [PATCH 051/479] 2019: d16: ex2: add input --- 2019/d16/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d16/ex2/input diff --git a/2019/d16/ex2/input b/2019/d16/ex2/input new file mode 100644 index 0000000..c2f8a5f --- /dev/null +++ b/2019/d16/ex2/input @@ -0,0 +1 @@ +59793513516782374825915243993822865203688298721919339628274587775705006728427921751430533510981343323758576985437451867752936052153192753660463974146842169169504066730474876587016668826124639010922391218906707376662919204980583671961374243713362170277231101686574078221791965458164785925384486127508173239563372833776841606271237694768938831709136453354321708319835083666223956618272981294631469954624760620412170069396383335680428214399523030064601263676270903213996956414287336234682903859823675958155009987384202594409175930384736760416642456784909043049471828143167853096088824339425988907292558707480725410676823614387254696304038713756368483311 From 576769e648603d0a769dbcbaaa38feb63f0e90b4 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 16 Dec 2019 14:34:26 +0100 Subject: [PATCH 052/479] 2019: d16: ex2: add solution --- 2019/d16/ex2/ex2.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100755 2019/d16/ex2/ex2.py diff --git a/2019/d16/ex2/ex2.py b/2019/d16/ex2/ex2.py new file mode 100755 index 0000000..317d157 --- /dev/null +++ b/2019/d16/ex2/ex2.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +import sys +from functools import reduce + + +def main() -> None: + rep = 10000 + signal = [int(d) for d in sys.stdin.read().strip()] * rep + offset = reduce(lambda a, b: a * 10 + b, signal[0:7]) + + assert offset >= len(signal) / 2 # Sanity check + # The trick is that the second half is only affected by itself (triangular matrix): + # For i > len(signal) / 2, new_signal[i] = sum(signal, i, len(signal)) + # Therefore, we're only interested in numbers that start at the offset + signal = signal[offset:] # Only take the end we need + + for __ in range(100): + for i in range(len(signal) - 1, 0, -1): # Do the sum from the end + signal[i - 1] += signal[i] + signal[i - 1] = signal[i - 1] % 10 + + print(reduce(lambda a, b: a * 10 + b, signal[:8])) + + +if __name__ == "__main__": + main() From a895dc761a6257f02bebd53fa7f80ebf785ad21e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 17 Dec 2019 11:04:34 +0100 Subject: [PATCH 053/479] 2019: d17: ex1: add input --- 2019/d17/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d17/ex1/input diff --git a/2019/d17/ex1/input b/2019/d17/ex1/input new file mode 100644 index 0000000..75af154 --- /dev/null +++ b/2019/d17/ex1/input @@ -0,0 +1 @@ +1,330,331,332,109,2952,1101,1182,0,16,1101,1467,0,24,102,1,0,570,1006,570,36,1002,571,1,0,1001,570,-1,570,1001,24,1,24,1106,0,18,1008,571,0,571,1001,16,1,16,1008,16,1467,570,1006,570,14,21101,0,58,0,1105,1,786,1006,332,62,99,21102,1,333,1,21101,73,0,0,1106,0,579,1101,0,0,572,1101,0,0,573,3,574,101,1,573,573,1007,574,65,570,1005,570,151,107,67,574,570,1005,570,151,1001,574,-64,574,1002,574,-1,574,1001,572,1,572,1007,572,11,570,1006,570,165,101,1182,572,127,101,0,574,0,3,574,101,1,573,573,1008,574,10,570,1005,570,189,1008,574,44,570,1006,570,158,1105,1,81,21101,340,0,1,1105,1,177,21101,477,0,1,1106,0,177,21101,514,0,1,21101,0,176,0,1105,1,579,99,21102,1,184,0,1106,0,579,4,574,104,10,99,1007,573,22,570,1006,570,165,101,0,572,1182,21101,375,0,1,21101,211,0,0,1106,0,579,21101,1182,11,1,21101,222,0,0,1105,1,979,21101,0,388,1,21102,233,1,0,1106,0,579,21101,1182,22,1,21101,0,244,0,1106,0,979,21101,401,0,1,21102,1,255,0,1106,0,579,21101,1182,33,1,21101,266,0,0,1105,1,979,21101,414,0,1,21102,1,277,0,1106,0,579,3,575,1008,575,89,570,1008,575,121,575,1,575,570,575,3,574,1008,574,10,570,1006,570,291,104,10,21101,1182,0,1,21101,313,0,0,1105,1,622,1005,575,327,1101,0,1,575,21102,327,1,0,1106,0,786,4,438,99,0,1,1,6,77,97,105,110,58,10,33,10,69,120,112,101,99,116,101,100,32,102,117,110,99,116,105,111,110,32,110,97,109,101,32,98,117,116,32,103,111,116,58,32,0,12,70,117,110,99,116,105,111,110,32,65,58,10,12,70,117,110,99,116,105,111,110,32,66,58,10,12,70,117,110,99,116,105,111,110,32,67,58,10,23,67,111,110,116,105,110,117,111,117,115,32,118,105,100,101,111,32,102,101,101,100,63,10,0,37,10,69,120,112,101,99,116,101,100,32,82,44,32,76,44,32,111,114,32,100,105,115,116,97,110,99,101,32,98,117,116,32,103,111,116,58,32,36,10,69,120,112,101,99,116,101,100,32,99,111,109,109,97,32,111,114,32,110,101,119,108,105,110,101,32,98,117,116,32,103,111,116,58,32,43,10,68,101,102,105,110,105,116,105,111,110,115,32,109,97,121,32,98,101,32,97,116,32,109,111,115,116,32,50,48,32,99,104,97,114,97,99,116,101,114,115,33,10,94,62,118,60,0,1,0,-1,-1,0,1,0,0,0,0,0,0,1,20,14,0,109,4,2102,1,-3,586,21001,0,0,-1,22101,1,-3,-3,21102,1,0,-2,2208,-2,-1,570,1005,570,617,2201,-3,-2,609,4,0,21201,-2,1,-2,1105,1,597,109,-4,2105,1,0,109,5,2101,0,-4,629,21001,0,0,-2,22101,1,-4,-4,21101,0,0,-3,2208,-3,-2,570,1005,570,781,2201,-4,-3,652,21002,0,1,-1,1208,-1,-4,570,1005,570,709,1208,-1,-5,570,1005,570,734,1207,-1,0,570,1005,570,759,1206,-1,774,1001,578,562,684,1,0,576,576,1001,578,566,692,1,0,577,577,21101,702,0,0,1105,1,786,21201,-1,-1,-1,1106,0,676,1001,578,1,578,1008,578,4,570,1006,570,724,1001,578,-4,578,21101,0,731,0,1105,1,786,1106,0,774,1001,578,-1,578,1008,578,-1,570,1006,570,749,1001,578,4,578,21102,1,756,0,1105,1,786,1105,1,774,21202,-1,-11,1,22101,1182,1,1,21101,0,774,0,1105,1,622,21201,-3,1,-3,1106,0,640,109,-5,2106,0,0,109,7,1005,575,802,20102,1,576,-6,20101,0,577,-5,1106,0,814,21101,0,0,-1,21102,1,0,-5,21101,0,0,-6,20208,-6,576,-2,208,-5,577,570,22002,570,-2,-2,21202,-5,45,-3,22201,-6,-3,-3,22101,1467,-3,-3,1202,-3,1,843,1005,0,863,21202,-2,42,-4,22101,46,-4,-4,1206,-2,924,21102,1,1,-1,1106,0,924,1205,-2,873,21101,0,35,-4,1105,1,924,1201,-3,0,878,1008,0,1,570,1006,570,916,1001,374,1,374,1201,-3,0,895,1102,1,2,0,1201,-3,0,902,1001,438,0,438,2202,-6,-5,570,1,570,374,570,1,570,438,438,1001,578,558,921,21001,0,0,-4,1006,575,959,204,-4,22101,1,-6,-6,1208,-6,45,570,1006,570,814,104,10,22101,1,-5,-5,1208,-5,33,570,1006,570,810,104,10,1206,-1,974,99,1206,-1,974,1101,0,1,575,21101,973,0,0,1106,0,786,99,109,-7,2105,1,0,109,6,21101,0,0,-4,21102,1,0,-3,203,-2,22101,1,-3,-3,21208,-2,82,-1,1205,-1,1030,21208,-2,76,-1,1205,-1,1037,21207,-2,48,-1,1205,-1,1124,22107,57,-2,-1,1205,-1,1124,21201,-2,-48,-2,1106,0,1041,21102,-4,1,-2,1106,0,1041,21102,1,-5,-2,21201,-4,1,-4,21207,-4,11,-1,1206,-1,1138,2201,-5,-4,1059,1202,-2,1,0,203,-2,22101,1,-3,-3,21207,-2,48,-1,1205,-1,1107,22107,57,-2,-1,1205,-1,1107,21201,-2,-48,-2,2201,-5,-4,1090,20102,10,0,-1,22201,-2,-1,-2,2201,-5,-4,1103,1201,-2,0,0,1106,0,1060,21208,-2,10,-1,1205,-1,1162,21208,-2,44,-1,1206,-1,1131,1105,1,989,21101,0,439,1,1105,1,1150,21102,477,1,1,1106,0,1150,21102,1,514,1,21102,1149,1,0,1106,0,579,99,21102,1157,1,0,1105,1,579,204,-2,104,10,99,21207,-3,22,-1,1206,-1,1138,1202,-5,1,1176,2102,1,-4,0,109,-6,2105,1,0,10,11,34,1,9,1,34,1,9,1,7,9,18,1,9,1,7,1,7,1,18,1,9,1,7,1,7,1,18,1,9,1,7,1,7,1,18,1,9,1,7,1,7,1,18,1,9,1,7,1,7,1,18,9,1,13,3,1,26,1,9,1,3,1,3,1,20,11,5,1,1,9,18,1,5,1,3,1,5,1,1,1,1,1,3,1,1,1,18,1,5,1,3,1,5,1,1,1,1,1,3,1,1,1,18,1,5,1,3,1,5,1,1,1,1,1,3,1,1,1,18,1,5,1,1,9,1,1,1,1,3,9,12,1,5,1,3,1,7,1,1,1,5,1,5,1,10,9,3,1,1,9,5,1,5,1,10,1,1,1,9,1,1,1,5,1,7,1,5,14,9,9,7,1,5,2,9,1,13,1,13,1,5,2,7,9,7,1,13,1,5,2,7,1,1,1,5,1,7,1,19,2,7,1,1,1,5,1,7,1,19,2,7,1,1,1,5,1,7,1,19,2,7,1,1,13,1,1,7,14,7,1,7,1,5,1,1,1,7,1,12,1,7,1,7,1,5,1,1,1,7,1,12,1,7,1,7,1,5,1,1,1,7,1,12,9,7,9,7,1,34,1,9,1,34,1,9,1,34,1,9,1,34,11,12 From f416b7c366334fc7d14204c509f0d46bdf116be8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 17 Dec 2019 11:04:40 +0100 Subject: [PATCH 054/479] 2019: d17: ex1: add solution --- 2019/d17/ex1/ex1.py | 223 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 223 insertions(+) create mode 100755 2019/d17/ex1/ex1.py diff --git a/2019/d17/ex1/ex1.py b/2019/d17/ex1/ex1.py new file mode 100755 index 0000000..838d696 --- /dev/null +++ b/2019/d17/ex1/ex1.py @@ -0,0 +1,223 @@ +#!/usr/bin/env python + + +import sys +from dataclasses import dataclass, field +from enum import IntEnum +from typing import List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self): # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + camera = Computer(memory) + + camera.run_no_output_interrupt() + + view = "".join(chr(c) for c in camera.output_list) + mapped_view = [[c for c in line] for line in view.split("\n") if line != ""] + + def is_intersection(x: int, y: int) -> bool: + neighbors_and_point = ((x, y), (x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1)) + return all(mapped_view[a][b] not in (".", "X") for a, b in neighbors_and_point) + + tot = 0 + for x in range(1, len(mapped_view) - 1): + for y in range(1, len(mapped_view[0]) - 1): # No need to look at the borders + if is_intersection(x, y): + tot += x * y + + print(tot) + + +if __name__ == "__main__": + main() From 27995b2bb95757b37d694a715a6c362178afe97f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 17 Dec 2019 13:40:40 +0100 Subject: [PATCH 055/479] 2019: d17: ex2: add input --- 2019/d17/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d17/ex2/input diff --git a/2019/d17/ex2/input b/2019/d17/ex2/input new file mode 100644 index 0000000..75af154 --- /dev/null +++ b/2019/d17/ex2/input @@ -0,0 +1 @@ +1,330,331,332,109,2952,1101,1182,0,16,1101,1467,0,24,102,1,0,570,1006,570,36,1002,571,1,0,1001,570,-1,570,1001,24,1,24,1106,0,18,1008,571,0,571,1001,16,1,16,1008,16,1467,570,1006,570,14,21101,0,58,0,1105,1,786,1006,332,62,99,21102,1,333,1,21101,73,0,0,1106,0,579,1101,0,0,572,1101,0,0,573,3,574,101,1,573,573,1007,574,65,570,1005,570,151,107,67,574,570,1005,570,151,1001,574,-64,574,1002,574,-1,574,1001,572,1,572,1007,572,11,570,1006,570,165,101,1182,572,127,101,0,574,0,3,574,101,1,573,573,1008,574,10,570,1005,570,189,1008,574,44,570,1006,570,158,1105,1,81,21101,340,0,1,1105,1,177,21101,477,0,1,1106,0,177,21101,514,0,1,21101,0,176,0,1105,1,579,99,21102,1,184,0,1106,0,579,4,574,104,10,99,1007,573,22,570,1006,570,165,101,0,572,1182,21101,375,0,1,21101,211,0,0,1106,0,579,21101,1182,11,1,21101,222,0,0,1105,1,979,21101,0,388,1,21102,233,1,0,1106,0,579,21101,1182,22,1,21101,0,244,0,1106,0,979,21101,401,0,1,21102,1,255,0,1106,0,579,21101,1182,33,1,21101,266,0,0,1105,1,979,21101,414,0,1,21102,1,277,0,1106,0,579,3,575,1008,575,89,570,1008,575,121,575,1,575,570,575,3,574,1008,574,10,570,1006,570,291,104,10,21101,1182,0,1,21101,313,0,0,1105,1,622,1005,575,327,1101,0,1,575,21102,327,1,0,1106,0,786,4,438,99,0,1,1,6,77,97,105,110,58,10,33,10,69,120,112,101,99,116,101,100,32,102,117,110,99,116,105,111,110,32,110,97,109,101,32,98,117,116,32,103,111,116,58,32,0,12,70,117,110,99,116,105,111,110,32,65,58,10,12,70,117,110,99,116,105,111,110,32,66,58,10,12,70,117,110,99,116,105,111,110,32,67,58,10,23,67,111,110,116,105,110,117,111,117,115,32,118,105,100,101,111,32,102,101,101,100,63,10,0,37,10,69,120,112,101,99,116,101,100,32,82,44,32,76,44,32,111,114,32,100,105,115,116,97,110,99,101,32,98,117,116,32,103,111,116,58,32,36,10,69,120,112,101,99,116,101,100,32,99,111,109,109,97,32,111,114,32,110,101,119,108,105,110,101,32,98,117,116,32,103,111,116,58,32,43,10,68,101,102,105,110,105,116,105,111,110,115,32,109,97,121,32,98,101,32,97,116,32,109,111,115,116,32,50,48,32,99,104,97,114,97,99,116,101,114,115,33,10,94,62,118,60,0,1,0,-1,-1,0,1,0,0,0,0,0,0,1,20,14,0,109,4,2102,1,-3,586,21001,0,0,-1,22101,1,-3,-3,21102,1,0,-2,2208,-2,-1,570,1005,570,617,2201,-3,-2,609,4,0,21201,-2,1,-2,1105,1,597,109,-4,2105,1,0,109,5,2101,0,-4,629,21001,0,0,-2,22101,1,-4,-4,21101,0,0,-3,2208,-3,-2,570,1005,570,781,2201,-4,-3,652,21002,0,1,-1,1208,-1,-4,570,1005,570,709,1208,-1,-5,570,1005,570,734,1207,-1,0,570,1005,570,759,1206,-1,774,1001,578,562,684,1,0,576,576,1001,578,566,692,1,0,577,577,21101,702,0,0,1105,1,786,21201,-1,-1,-1,1106,0,676,1001,578,1,578,1008,578,4,570,1006,570,724,1001,578,-4,578,21101,0,731,0,1105,1,786,1106,0,774,1001,578,-1,578,1008,578,-1,570,1006,570,749,1001,578,4,578,21102,1,756,0,1105,1,786,1105,1,774,21202,-1,-11,1,22101,1182,1,1,21101,0,774,0,1105,1,622,21201,-3,1,-3,1106,0,640,109,-5,2106,0,0,109,7,1005,575,802,20102,1,576,-6,20101,0,577,-5,1106,0,814,21101,0,0,-1,21102,1,0,-5,21101,0,0,-6,20208,-6,576,-2,208,-5,577,570,22002,570,-2,-2,21202,-5,45,-3,22201,-6,-3,-3,22101,1467,-3,-3,1202,-3,1,843,1005,0,863,21202,-2,42,-4,22101,46,-4,-4,1206,-2,924,21102,1,1,-1,1106,0,924,1205,-2,873,21101,0,35,-4,1105,1,924,1201,-3,0,878,1008,0,1,570,1006,570,916,1001,374,1,374,1201,-3,0,895,1102,1,2,0,1201,-3,0,902,1001,438,0,438,2202,-6,-5,570,1,570,374,570,1,570,438,438,1001,578,558,921,21001,0,0,-4,1006,575,959,204,-4,22101,1,-6,-6,1208,-6,45,570,1006,570,814,104,10,22101,1,-5,-5,1208,-5,33,570,1006,570,810,104,10,1206,-1,974,99,1206,-1,974,1101,0,1,575,21101,973,0,0,1106,0,786,99,109,-7,2105,1,0,109,6,21101,0,0,-4,21102,1,0,-3,203,-2,22101,1,-3,-3,21208,-2,82,-1,1205,-1,1030,21208,-2,76,-1,1205,-1,1037,21207,-2,48,-1,1205,-1,1124,22107,57,-2,-1,1205,-1,1124,21201,-2,-48,-2,1106,0,1041,21102,-4,1,-2,1106,0,1041,21102,1,-5,-2,21201,-4,1,-4,21207,-4,11,-1,1206,-1,1138,2201,-5,-4,1059,1202,-2,1,0,203,-2,22101,1,-3,-3,21207,-2,48,-1,1205,-1,1107,22107,57,-2,-1,1205,-1,1107,21201,-2,-48,-2,2201,-5,-4,1090,20102,10,0,-1,22201,-2,-1,-2,2201,-5,-4,1103,1201,-2,0,0,1106,0,1060,21208,-2,10,-1,1205,-1,1162,21208,-2,44,-1,1206,-1,1131,1105,1,989,21101,0,439,1,1105,1,1150,21102,477,1,1,1106,0,1150,21102,1,514,1,21102,1149,1,0,1106,0,579,99,21102,1157,1,0,1105,1,579,204,-2,104,10,99,21207,-3,22,-1,1206,-1,1138,1202,-5,1,1176,2102,1,-4,0,109,-6,2105,1,0,10,11,34,1,9,1,34,1,9,1,7,9,18,1,9,1,7,1,7,1,18,1,9,1,7,1,7,1,18,1,9,1,7,1,7,1,18,1,9,1,7,1,7,1,18,1,9,1,7,1,7,1,18,9,1,13,3,1,26,1,9,1,3,1,3,1,20,11,5,1,1,9,18,1,5,1,3,1,5,1,1,1,1,1,3,1,1,1,18,1,5,1,3,1,5,1,1,1,1,1,3,1,1,1,18,1,5,1,3,1,5,1,1,1,1,1,3,1,1,1,18,1,5,1,1,9,1,1,1,1,3,9,12,1,5,1,3,1,7,1,1,1,5,1,5,1,10,9,3,1,1,9,5,1,5,1,10,1,1,1,9,1,1,1,5,1,7,1,5,14,9,9,7,1,5,2,9,1,13,1,13,1,5,2,7,9,7,1,13,1,5,2,7,1,1,1,5,1,7,1,19,2,7,1,1,1,5,1,7,1,19,2,7,1,1,1,5,1,7,1,19,2,7,1,1,13,1,1,7,14,7,1,7,1,5,1,1,1,7,1,12,1,7,1,7,1,5,1,1,1,7,1,12,1,7,1,7,1,5,1,1,1,7,1,12,9,7,9,7,1,34,1,9,1,34,1,9,1,34,1,9,1,34,11,12 From 70d7ffc8c6380e5ce0367193d5cb319b18f6b751 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 17 Dec 2019 13:40:47 +0100 Subject: [PATCH 056/479] 2019: d17: ex2: add solution --- 2019/d17/ex2/ex2.py | 350 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 350 insertions(+) create mode 100755 2019/d17/ex2/ex2.py diff --git a/2019/d17/ex2/ex2.py b/2019/d17/ex2/ex2.py new file mode 100755 index 0000000..62d5dd0 --- /dev/null +++ b/2019/d17/ex2/ex2.py @@ -0,0 +1,350 @@ +#!/usr/bin/env python + + +import sys +from copy import deepcopy +from dataclasses import dataclass, field +from enum import Enum, IntEnum, auto +from typing import List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self): # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +class Position(NamedTuple): + x: int + y: int + + +class Direction(Enum): + NORTH = auto() + WEST = auto() + SOUTH = auto() + EAST = auto() + + +DIRECTIONS = [d for d in Direction] +ARROW_DIRECTION = { + "^": Direction.NORTH, + "v": Direction.SOUTH, + "<": Direction.WEST, + ">": Direction.EAST, +} +DIRECTION_OFFSET = { + Direction.NORTH: (-1, 0), + Direction.SOUTH: (1, 0), + Direction.WEST: (0, -1), + Direction.EAST: (0, 1), +} + + +def turn(d: Direction, turn: str) -> Direction: + def turn_left() -> Direction: + return DIRECTIONS[(DIRECTIONS.index(d) + 1) % len(DIRECTIONS)] + + def turn_right() -> Direction: + return DIRECTIONS[DIRECTIONS.index(d) - 1] + + if turn == "L": + return turn_left() + elif turn == "R": + return turn_right() + assert False # Sanity check + + +def find_arrow(mapped_view: List[List[str]]) -> Position: + for x in range(len(mapped_view)): + for y in range(len(mapped_view[0])): + if mapped_view[x][y] in ARROW_DIRECTION: + return Position(x, y) + + assert False # Sanity check + + +def get_path(mapped_view: List[List[str]]) -> List[str]: + pos = find_arrow(mapped_view) + + def pos_is_valid(p: Position) -> bool: + return 0 <= p.x < len(mapped_view) and 0 <= p.y < len(mapped_view[0]) + + def pos_is_scaffold(p: Position) -> bool: + return pos_is_valid(p) and mapped_view[p.x][p.y] != "." + + direction = ARROW_DIRECTION[mapped_view[pos.x][pos.y]] + ans: List[str] = [] + + def advance_until_stopped(turn_string: str) -> bool: + nonlocal pos + nonlocal direction + d = turn(direction, turn_string) + offset = DIRECTION_OFFSET[d] + neighbor = Position(*(a + b for a, b in zip(pos, offset))) + tot = 0 + while pos_is_scaffold(neighbor): + tot += 1 + mapped_view[pos.x][pos.y] = "@" + pos = neighbor + neighbor = Position(*(a + b for a, b in zip(pos, offset))) + + if tot == 0: + return False + direction = d + ans.append(turn_string) + ans.append(str(tot)) + return True + + has_no_neighbors = False + while not has_no_neighbors: + for turn_string in ("L", "R"): + if advance_until_stopped(turn_string): + break + else: + has_no_neighbors = True + return ans + + +def sequitur_algorithm(path: str) -> None: + # FIXME: seems like a good candidate for compression + pass + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + camera = Computer(deepcopy(memory)) + + camera.run_no_output_interrupt() + + view = "".join(chr(c) for c in camera.output_list) + mapped_view = [[c for c in line] for line in view.split("\n") if line != ""] + + path = get_path(mapped_view) + print(path) + + # I didn't want to write the compression algorithm when I could just use Vim + # The answere is A,B,B,A,C,A,A,C,B,C + # A: R,8,L,12,R,8 + # B: R,12,L,8,R,10 + # C: R,8,L,8,L,8,R,8,R,10 + + ans = "A,B,B,A,C,A,A,C,B,C" + A = "R,8,L,12,R,8" + B = "R,12,L,8,R,10" + C = "R,8,L,8,L,8,R,8,R,10" + + assert len(ans) <= 20 # Sanity check + assert len(A) <= 20 # Sanity check + assert len(B) <= 20 # Sanity check + assert len(C) <= 20 # Sanity check + + memory[0] = 2 # Wake up the robot + robot = Computer(memory) + + for c in ans: + robot.input_list.append(ord(c)) + robot.input_list.append(ord("\n")) + for c in A: + robot.input_list.append(ord(c)) + robot.input_list.append(ord("\n")) + for c in B: + robot.input_list.append(ord(c)) + robot.input_list.append(ord("\n")) + for c in C: + robot.input_list.append(ord(c)) + robot.input_list.append(ord("\n")) + + for c in "n\n": # Do not output the video feed + robot.input_list.append(ord(c)) + + robot.run_no_output_interrupt() + print(robot.output_list.pop()) + + +if __name__ == "__main__": + main() From ec30c7851124546bd59ef7918ab3b8e2a770dbfe Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 1 Dec 2020 16:36:34 +0100 Subject: [PATCH 057/479] 2020: d01: ex1: add input --- 2020/d01/ex1/input | 200 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 2020/d01/ex1/input diff --git a/2020/d01/ex1/input b/2020/d01/ex1/input new file mode 100644 index 0000000..45d090d --- /dev/null +++ b/2020/d01/ex1/input @@ -0,0 +1,200 @@ +1742 +1763 +1238 +1424 +1736 +1903 +1580 +1847 +1860 +1933 +1779 +1901 +1984 +1861 +1769 +1896 +1428 +2010 +1673 +1491 +1996 +1746 +1973 +1696 +1616 +2006 +1890 +1600 +1991 +1724 +1804 +1794 +462 +1706 +2002 +1939 +1834 +1312 +1943 +1465 +1405 +1459 +1659 +1288 +1241 +1935 +1294 +1388 +1772 +1945 +1649 +813 +1956 +1274 +1686 +1404 +1770 +1631 +1366 +1321 +1353 +1685 +1365 +1738 +1911 +1235 +1495 +1837 +1456 +1283 +1929 +1326 +1735 +1604 +1223 +1261 +1844 +1850 +1429 +277 +1848 +1818 +1395 +1522 +1863 +1475 +1562 +1351 +1538 +1313 +1416 +1690 +1539 +1338 +1982 +1297 +1821 +780 +1859 +1420 +1934 +1303 +1731 +1714 +1702 +1417 +1872 +1998 +1908 +1957 +1270 +1359 +1760 +1997 +1773 +2000 +1203 +1880 +1955 +1273 +1775 +1893 +1237 +1707 +1885 +1900 +1801 +1367 +1561 +1524 +1678 +1511 +1623 +1464 +1477 +1733 +1423 +1575 +1851 +2007 +1651 +804 +1836 +1849 +1713 +1401 +1502 +1806 +1506 +1646 +1968 +1253 +1889 +1759 +1734 +1611 +1558 +1256 +1657 +1778 +1953 +1578 +1717 +1498 +1381 +1919 +1512 +1391 +384 +1802 +1573 +1940 +1323 +2003 +1689 +1936 +1368 +1962 +1964 +1586 +1619 +1482 +1445 +372 +1792 +96 +1468 +1999 +1301 +1757 +1613 +1807 +1941 +1642 +1557 +1884 +1626 +489 +1989 +1327 From 186c3981c28176a008918ebb765e3abfea6d5948 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 1 Dec 2020 16:36:39 +0100 Subject: [PATCH 058/479] 2020: d01: ex1: add solution --- 2020/d01/ex1/ex1.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100755 2020/d01/ex1/ex1.py diff --git a/2020/d01/ex1/ex1.py b/2020/d01/ex1/ex1.py new file mode 100755 index 0000000..50358b7 --- /dev/null +++ b/2020/d01/ex1/ex1.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python +import functools +import itertools +import operator +import sys + + +def main() -> None: + values = [int(n) for n in sys.stdin.readlines()] + for tup in itertools.combinations(values, 2): + if sum(tup) == 2020: + print(functools.reduce(operator.mul, tup)) + break + + +if __name__ == "__main__": + main() From a5e4bf17152b41d64e2f0e77d54d8a089c9d292d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 1 Dec 2020 16:36:50 +0100 Subject: [PATCH 059/479] 2020: d01: ex2: add input --- 2020/d01/ex2/input | 200 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 2020/d01/ex2/input diff --git a/2020/d01/ex2/input b/2020/d01/ex2/input new file mode 100644 index 0000000..45d090d --- /dev/null +++ b/2020/d01/ex2/input @@ -0,0 +1,200 @@ +1742 +1763 +1238 +1424 +1736 +1903 +1580 +1847 +1860 +1933 +1779 +1901 +1984 +1861 +1769 +1896 +1428 +2010 +1673 +1491 +1996 +1746 +1973 +1696 +1616 +2006 +1890 +1600 +1991 +1724 +1804 +1794 +462 +1706 +2002 +1939 +1834 +1312 +1943 +1465 +1405 +1459 +1659 +1288 +1241 +1935 +1294 +1388 +1772 +1945 +1649 +813 +1956 +1274 +1686 +1404 +1770 +1631 +1366 +1321 +1353 +1685 +1365 +1738 +1911 +1235 +1495 +1837 +1456 +1283 +1929 +1326 +1735 +1604 +1223 +1261 +1844 +1850 +1429 +277 +1848 +1818 +1395 +1522 +1863 +1475 +1562 +1351 +1538 +1313 +1416 +1690 +1539 +1338 +1982 +1297 +1821 +780 +1859 +1420 +1934 +1303 +1731 +1714 +1702 +1417 +1872 +1998 +1908 +1957 +1270 +1359 +1760 +1997 +1773 +2000 +1203 +1880 +1955 +1273 +1775 +1893 +1237 +1707 +1885 +1900 +1801 +1367 +1561 +1524 +1678 +1511 +1623 +1464 +1477 +1733 +1423 +1575 +1851 +2007 +1651 +804 +1836 +1849 +1713 +1401 +1502 +1806 +1506 +1646 +1968 +1253 +1889 +1759 +1734 +1611 +1558 +1256 +1657 +1778 +1953 +1578 +1717 +1498 +1381 +1919 +1512 +1391 +384 +1802 +1573 +1940 +1323 +2003 +1689 +1936 +1368 +1962 +1964 +1586 +1619 +1482 +1445 +372 +1792 +96 +1468 +1999 +1301 +1757 +1613 +1807 +1941 +1642 +1557 +1884 +1626 +489 +1989 +1327 From a1578499a1ec15b3a8f6d92b510f1fc21ba56355 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 1 Dec 2020 16:36:56 +0100 Subject: [PATCH 060/479] 2020: d01: ex2: add solution --- 2020/d01/ex2/ex2.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100755 2020/d01/ex2/ex2.py diff --git a/2020/d01/ex2/ex2.py b/2020/d01/ex2/ex2.py new file mode 100755 index 0000000..0dac64e --- /dev/null +++ b/2020/d01/ex2/ex2.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python +import functools +import itertools +import operator +import sys + + +def main() -> None: + values = [int(n) for n in sys.stdin.readlines()] + for tup in itertools.combinations(values, 3): + if sum(tup) == 2020: + print(functools.reduce(operator.mul, tup)) + break + + +if __name__ == "__main__": + main() From 84ea3e232579f0ede9ee022575c918ed64dc9905 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 11:20:04 +0100 Subject: [PATCH 061/479] 2020: d02: ex1: add input --- 2020/d02/ex1/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2020/d02/ex1/input diff --git a/2020/d02/ex1/input b/2020/d02/ex1/input new file mode 100644 index 0000000..0f3ccea --- /dev/null +++ b/2020/d02/ex1/input @@ -0,0 +1,1000 @@ +7-9 l: vslmtglbc +2-3 s: hpbs +1-3 v: pvvr +2-8 h: hhhhvhhh +9-10 x: xxxxxxxxzv +2-5 q: xdqbjj +17-19 n: nnnnnnnnnnnnnnnnrnsn +5-7 f: fxfkffffff +4-7 h: hrjhxlhh +11-12 v: vvvwdvvvvvvvvv +6-7 q: tqqqqvqqq +2-4 b: vlmndngvbkptbb +1-4 t: mttwt +3-4 v: vmgdcj +4-17 n: nwnnnnnnwqncnxxnn +3-4 c: gscc +3-4 w: wwwwww +8-12 j: jdjjtjxjjjjj +1-5 b: bmbfbbb +5-11 k: kkkkkkdkkkkk +1-4 m: mmmm +5-6 z: zzzzhzzz +8-10 z: zmqzzzzgzlzdz +14-15 r: rrrrrrrrrrrrvnr +11-13 q: qqqqqqqpqvpqwq +3-7 q: qnqhqcqq +11-17 r: vrrrrrrjrrrrrrrrrrrr +2-5 g: srqmltncfgdg +7-11 w: wwwwwwtwwwqj +5-14 j: hhwjmjzmjjxjjkjgjj +11-14 x: xffrxxxxxxzxrxxmxqlw +14-16 c: hqcchcjwrxbcgclctx +10-14 k: kkvkkdbqnqkkbfftxm +10-12 c: cccccccccccc +7-13 x: dbjtkxxfjsvvx +9-11 d: ddddddddxdb +4-8 h: mhbhrsvtl +8-13 h: hbhrhjhhjhhqpthxnwhh +10-11 s: sssksssrsssss +6-8 m: mmfmmmmm +4-14 h: bhhnhvhhhhhhlvhmqkh +1-17 c: cccccccccccccccccc +10-11 r: rsrprprrrnr +10-13 d: dddddddddhdddd +5-7 s: msfscsndswsl +3-8 b: bbzzbhbwb +9-20 b: cbbcrbwjfrddqbvzrfxb +9-15 h: shpdthhhhhshhhhh +5-6 n: nnnnnn +1-7 f: dfffffffff +10-11 f: fffffffffvf +3-4 z: xmkkvcrqdz +15-19 h: hhghhhhhhhmhhhhhhhh +4-7 m: lmxkhmmm +3-4 l: zlllkfzcldctlmhq +2-5 j: jxjjqj +10-11 s: sssssssjsgw +2-4 j: vjkjp +9-18 l: lffnlbmrmrvlkrpchj +3-6 q: qqhqqdqq +18-19 d: ddddddddddddddddddd +1-8 m: mmsmzwbchmmlmljslkk +2-6 m: tmbtmmgmmwm +2-8 j: jrjjjjjp +8-12 d: ddddxdbtvdnbdk +8-13 t: tttttttxttrtr +8-13 w: wwwwjgwzdxwwp +3-14 j: jjkjjjrjjcjqjjj +3-4 q: qgpx +6-9 p: ppppppppp +6-8 f: fdffffff +5-10 x: xsmxxxxkxxhtxxmx +1-4 j: dzrhcjljjv +13-14 s: sdxcbwfsprkpss +9-13 n: nnnnnnnnnnnnnn +3-7 r: rrrcrkrrrrm +4-11 f: fmfrfgphxqf +4-13 t: tttrtptttzgttwj +10-12 w: wwwwwwwwwfhh +10-11 q: qvqqqqqjqptqq +8-10 s: sssssxsssv +12-15 c: dsmccckcccbccwcccdc +5-7 l: nllffcmrwkdhw +8-10 t: tttzttvttgtqt +7-8 m: mmmbmmjmm +7-9 c: ckccqmmcccjckdc +3-4 w: twwwd +11-13 g: ghgpggggwggclgfggtzm +10-11 m: lvwmmmmmbfmm +9-12 g: gggggnggtgdgg +5-7 k: kkkkkkk +11-13 g: ghgggggggbrgzgg +3-7 z: zzzzzgzz +7-10 z: zzzzzmszzdzzz +15-20 w: wwwwwlwwwwwwwwwwwwwc +7-9 z: zzzzzzzzz +1-8 q: qqnhbczhtzg +11-14 s: sgcssssvsssvsslvss +2-4 w: mcztwwt +3-7 w: wtwtdwpb +5-8 r: rrrrrrrsr +7-8 v: vnvvvvvv +7-8 j: jjjjjglwj +5-6 w: ktkvwwgqbxgckq +7-9 f: ffffzfffff +12-14 n: nnnnnnnnnnnnngn +3-5 z: zzzzdz +5-11 j: xmjjtjjbjngk +3-5 l: llvldllllvl +7-8 h: hhhhhhhnhh +17-18 p: ptpppppppppppppprq +2-6 s: sssdnlgqjxcvssh +3-6 h: dhhthhhhch +6-18 k: khkkkkzkmkkkvttkkkkk +3-4 x: dxsxxx +4-11 b: bbbbbpbbbbb +5-7 t: ttzthtx +3-6 k: kkrkkxkkhkkk +2-7 b: mbzbjfnb +9-12 l: fglllllllllkl +11-14 l: plctdxwbmnbqnczwvjlv +2-10 f: jfdtpsntnf +18-19 d: dddddddpddddddddddd +4-6 h: gkhbkhhhkhppb +7-9 f: ffqvffffffnfr +3-4 l: llzl +2-12 d: dccfdbdddddndd +12-17 b: bbbbbbbbbbbbbbbbbbbb +2-3 k: bkkp +5-9 h: hlhhjhhhl +4-12 f: ffffrffffffffffflffz +1-5 v: vvvvvwvv +8-9 l: lllllllgb +15-18 t: ttttttttntttltvtts +6-7 q: zqpqcgbqqq +5-11 w: lgrktkmkqzjvwg +8-9 p: ppppppppp +3-4 c: cccc +7-15 b: bqbxzbbbdtbbbmbb +9-11 k: kkkkkkvkdkktk +4-6 t: bktttttt +6-10 m: bwtpbsmmnmmlmfd +5-12 z: zzckszrdzzpmzzzzk +4-5 q: qqqck +3-6 k: kkwpsbbqkntgz +1-6 k: kkkkkk +1-7 f: fffzffffffffffjq +3-4 p: jqpxgn +7-13 v: wvhzbmvvvvvvgvvv +3-5 p: ppvdfgr +16-18 c: ccccqcccwccgcbctsk +5-8 p: ppgpgpjgpzqpw +1-3 t: tspmnttttfm +2-9 b: bmbbbhbbxbb +2-7 n: dnnngnnnmnnnnckn +12-14 c: cccccccccbccrm +12-14 q: qqqqqqqqqhnmlpqqqq +2-3 n: whnnmf +13-15 h: hhhhhhhhhhhhchp +4-5 k: kkcmw +6-7 z: wfqwfkhdvd +3-4 h: bqnhhhncph +3-4 j: kjgkj +16-17 s: ssssssssssssssfqx +4-6 r: rrzbpw +2-3 m: vzmmmm +17-19 z: zzzxzzzzzzzzzzzzfzz +7-12 s: nmpsssdhszssssssnhs +4-5 l: lfqlcl +3-5 d: fdtdb +6-9 b: mlbbjhbbbbbbl +1-5 g: gggggg +4-7 x: xxbxxhxxkxsx +3-6 j: kspjgjzxfpdclkrzk +2-7 s: ffwpjssskscsv +4-5 n: nnndf +5-15 g: gtljgmrlggmghbv +13-16 v: vvvvjvqbvvvvvvvhvvs +6-9 b: dldbmbsmb +5-7 f: sfvffffft +1-3 b: ztblbcxnrmkvnfvz +10-12 r: dljvqxnjttjvtfrcxgh +14-16 w: hgwslvnzbhhxwwvwprww +6-8 s: vssnsssgptshmkst +6-8 s: scssssshs +6-12 g: gggggfgggtnhm +6-10 j: hlcjjlfpljpwjjrvpl +2-8 m: zbbmxlzlrckhrcmksf +1-7 v: vvvnmvl +3-4 x: fxpt +3-12 h: hhhhhhhhqhhhh +8-9 t: tttttttftt +12-18 r: rrrrrrrrrrrrvrrrrdr +10-14 d: dbdddddddvddddd +15-17 r: dvrhrrrrbnrrprrrrrr +7-11 v: fvjgvgvvvsvz +5-6 m: dsmjmm +7-12 k: kkkkkkknkkpkkz +4-7 h: fhdhmhmvwfsh +8-9 f: ffffffffgf +2-4 h: hhhk +5-9 r: mdrcwmllvgnjfzfcwztt +8-9 g: gggggggnjggg +11-16 v: vlgfvvnvvvvvvvvv +12-16 t: tttttttwtttptttk +4-6 w: jfvkvwx +12-17 w: phmrqwdwwqwwwwbwzbwr +16-17 m: mmrmmmmmmmmmmmmdm +9-10 z: jzhzzzzzzzz +11-14 x: xxxxxxxjxxxcxm +11-12 b: bbbbbbbbrbgq +3-5 j: sxjjmxjrztjjldkpbcq +10-16 l: lhlldlldljlllmlm +2-10 t: szsnwnkttt +7-9 q: ppxcslxzj +14-15 c: ccczcccccccccnm +2-9 l: dllppswblllkltl +1-7 z: kcklcmt +8-9 p: ppppppfhjp +4-8 f: ffjkkffl +5-11 g: hgxgggcgjglbgzcdzg +2-4 d: ccdq +11-14 r: rvrtrrrrrtrnrqrrr +9-11 k: kkckkgkzsmkkkrwknkm +7-9 x: sgmxhhjxnpgcx +6-8 t: qhbpjtjtttttttt +7-8 q: wqqrqqqqqn +3-4 z: jzqgm +4-19 g: gdgmgjggkgpghgggggg +2-11 g: ggtgggggsgs +3-5 j: xdtjdjpjwljmd +1-5 h: hbnwh +2-4 h: hhfhhzhdqzhwchql +3-11 k: kjgjltkkmkkm +17-20 d: ddfnglddnddpqdqwdwbd +1-4 x: gxkpxx +2-3 b: zbbmkb +2-9 r: hrhphqrcr +7-10 d: dkdvddddddn +3-4 x: dsxbt +18-19 p: npnnpwpppgvxwmzpszv +14-16 v: vvgvvvvvvvvvvjvvv +1-8 h: nhthchpdnh +7-14 s: ssgssfsmrsssldgscfd +8-9 h: hhhhghhpv +4-5 g: kggslg +3-9 g: gggglngjzgg +11-13 h: hhhhhhhhhhhhhh +4-7 l: lllslgll +2-4 c: cccccnk +1-11 l: hltwqljjlzllhq +1-2 x: bkxtxx +4-5 v: vvvvg +7-8 x: xxxxxxqd +13-14 n: nwvcqqtwttfhnn +2-7 c: cccchcs +2-5 p: pbpgv +16-17 t: tttttvttttttmttlvttt +1-2 j: fbjj +2-5 n: knznnncnfnvn +11-12 l: llglllcnlfllllkllr +7-8 v: vvvvvvtr +8-9 k: kkkkvkkkp +6-7 q: tpxqqqr +5-7 s: sssnssshvxs +13-18 m: mmfmmmmmmmmwlmmmmn +7-11 p: ppppppppppp +6-7 s: bsssssds +3-7 q: qmqwqqqqqqhfp +4-5 r: tffrr +9-11 c: ccccccccccc +1-3 w: vvlhw +1-8 g: vgggggghg +5-6 p: txlxppppspkplxf +7-13 f: fffffffffffff +2-8 g: gggggsgggg +2-5 w: wbwwz +2-3 p: spsrhtmjzpmgvj +1-4 d: vbtd +4-5 g: ggggf +14-16 v: dvvfhdjcvvvmvdvnm +6-8 x: xxxxxxxxx +5-6 j: jjnjjj +13-15 m: mmpmmvmmmmszmdgkm +4-16 z: zzzzzzzzzzzzzzzq +4-10 x: xxxxxxxxxxxx +4-5 r: rrrrr +10-11 m: rmmdmmmmmmdnm +2-3 q: qqqs +7-11 m: mmmmmmmcmmmmx +2-4 x: dcfr +2-4 p: cpppgpp +1-3 n: vnqgqbhn +3-4 p: pppx +13-14 f: fffgfpfffffffqftfn +2-5 h: hsdhhhh +3-6 q: pdqvtq +6-8 l: lllllmlll +5-6 v: vvvvld +10-11 x: jxhxdchxjwx +7-8 h: hhhhhhhh +11-19 z: dtzzxcztmzzzzzzjqzzz +3-4 h: thcchhh +3-5 b: dbbwjbbnb +11-12 q: qqtgqqldkqqqqqqctqq +12-13 l: lllllllklllcxl +2-8 s: sppbsvjfp +10-20 g: xgswhgldgggdkxjggzzg +2-4 n: nnnnn +3-5 c: xmtccjj +1-7 w: wbqwwwsc +3-6 g: wgghgngg +4-6 p: pppptpppwp +1-3 j: jjjjjjjjjjjjjjjsjjjj +2-6 r: drbwrrmtjnzrfsrxwq +1-5 v: rcvvd +2-3 w: dwnzf +4-6 l: lrlbld +3-7 h: hhhhhhkhh +6-12 b: bktbzmzlbbmvmbpm +1-7 n: znfnngntfsh +2-14 z: jzzsgxsqkqmzlzhzljz +3-8 q: qmqfzhfq +8-9 d: ddzdddddd +11-14 k: gkwtwksxrdwxkkh +3-5 v: vvvvnv +6-12 s: pksrzgvspsswsxrpsvss +6-8 w: whpwhwjwwpkww +8-10 w: wdwwbbwwsw +13-19 z: zzzfzzzzzzzzwzzzzzr +3-4 v: vkbv +7-10 x: wxxxkjkxxxdfxx +1-3 g: gpgsgqgb +15-17 r: pfntnqmbtcfcsrlgprqk +7-10 s: sjdssmsssbssssl +3-16 p: ppnjzcppkpppmwvkp +3-7 r: srkrvrjrgrrrr +3-4 x: xmxx +1-5 k: zkkhqdgrt +1-13 c: rcncccdclcccc +4-7 n: nxfmnnbn +8-9 g: gngggpgfwggg +2-5 m: smmfs +1-12 p: snppbhspvzpppnwpwjpp +2-6 s: rczxxsvknqcpwklsbc +4-9 d: ddndgtdddqddddqd +10-13 f: ffffffffftfff +8-9 x: xxxxxxxxxx +4-7 r: krkrsgrfvqzxpcrrgjr +3-4 c: chdc +13-14 k: xkkkkkkkkkkkkq +4-8 t: tmmvccgxfbtttttttt +14-16 l: trkllqstdlclqzlv +1-3 x: qkxx +2-6 s: nsfhklqbnvs +4-5 g: rlggcgg +10-12 l: llzlllllllll +12-14 w: wwwwwwwwdwwtwl +3-4 m: qmvp +2-3 d: dddd +2-6 j: mwqfjdjlnb +7-9 z: zlzwzrzshd +5-8 k: jmkjkqdcwkrtvb +17-18 s: sssssgssssstssssxcds +1-3 k: qfxkt +3-11 j: tsjjvpcnsmd +12-14 v: vfvvdvvvvvvbvjvvvvvv +4-12 v: wvxmcvzlrvtv +4-8 q: qqqqqqqqqqqqq +16-17 s: sssssssssssssssvqs +3-4 d: ddwx +3-4 h: hhhh +8-9 z: znbzzzzgzzz +1-3 b: tkffshrzkxwjbrxkkv +3-8 n: nnqnnnnbnn +6-8 n: bnpnnhfnnnqndxncpgq +10-16 d: sddddlddjszdddtc +6-8 x: wwwmqxzwl +12-16 j: jjjjjmjjjjbxjjjtpv +15-18 z: zzzzzzzzdzzzczhzznf +1-18 n: nvhddhnqnnrbvpnnwn +14-17 z: lbznszzzzzzzzzzzm +7-9 l: jfqxkllcll +8-14 l: lllllllllnllllc +7-13 m: ncmkkmmhwsvhmmsk +2-5 t: ttttth +4-5 k: kgkkkk +4-9 d: ddddddddd +3-6 n: nnntnnn +9-10 h: bbjqqhhhwr +12-16 g: ggfgsjggghcfggbpjggp +2-3 x: dktxtxh +1-2 x: grnz +5-7 x: txxcgddxnwxxx +12-15 b: bbbbbbbbbbjbbbj +11-17 f: fffffrfffcfpfcffff +3-9 l: lllllsvllhltll +1-4 g: lggfg +6-7 l: lgllltl +10-11 c: cccxcwchchcccn +1-2 m: mmmm +8-10 h: hhhhdhhbhh +5-8 d: dnddddtdd +16-20 l: llrlllgldllllllslllt +9-13 w: wwwwwwwwswwww +1-5 f: fpzffwffhrnfdtl +5-12 w: blwkbsstnvhmw +7-13 g: ggjngkmgfkngggggg +1-3 r: rrzr +17-19 d: ddddnddbddddddddqdz +9-13 v: zvvhgkvbvqvvvv +10-14 n: vxxmbptzjnnnxnqshqq +9-10 h: hlhhhhhqpthhhdds +3-5 v: vvcsv +1-5 g: dmggng +2-8 q: pnprhcxqhmf +6-7 z: zzstfvm +6-15 d: ddddddddjdddddd +2-13 c: fgqtczjthccjcc +5-6 j: jjgwjjjjs +11-13 b: bbbbbhbwbzwbqb +1-4 q: jpqdqqr +9-12 p: hpwpqppwpbhj +7-9 l: lllllljfln +13-14 z: zzzzzzzzzzzzzz +10-14 w: qjgqwwzrjwpjcjp +12-13 j: jjxrjjjjjjjsvj +10-12 n: nrnnnnnpnnnb +14-19 s: sszssszsssssswssssms +6-11 z: tzcvzzzlzzmtqzzzh +14-16 f: zfffkfffffqvffff +3-4 f: dfzf +3-5 g: ggsgx +9-11 f: fffjrfffffpfdfqdff +5-8 f: ffffvfgfm +5-8 c: ccccccclc +4-6 p: ppppppp +11-16 b: bbbbbbbbbgvbbbbbbbb +11-12 r: rrnrrrtrrrlbrr +3-4 d: ldqdp +11-13 s: lssnssssssssls +3-4 v: vvvvq +5-6 d: dkdddd +7-17 g: ggggggbgggggggggg +11-12 h: fhpbcfbbhlsj +5-12 d: hdpdddftmdrhdndjfj +2-13 m: stmmmmmmmmmmlbmm +2-6 r: vhqlrnr +13-18 n: dpmnnwnwgpnhnngndn +16-18 m: mmmmmmmmmmmmmmmpmm +13-17 h: vhmhchmthqzshhdthf +4-12 h: hhhkhhhhhhhmhh +2-3 p: pppppp +4-9 g: gmfgxgsgg +3-5 n: fnnhnn +6-7 j: gbdjhrjh +3-4 g: fvgggbgxgk +4-9 v: lvkdlmhvl +1-3 d: dddd +3-5 j: jjjkj +7-10 w: kzsbhmgjwdsvvqcqwlw +1-6 v: vldvvvldvvhvx +3-4 s: hspss +6-7 k: gpkkkkvkpxk +1-13 w: whwwwwzwgwdrwzfx +3-12 k: kkvkkkkkkkkkk +10-12 s: ssscvmsslsgsshsmss +3-9 s: msbncdgwbqsksh +5-9 l: kwlllnwwlhlmlqxdjn +1-10 l: llldldlllglllj +4-5 b: bbbbtbbbbbbbbbbbbbbb +5-7 b: bhbmwsgdcdpbxbfbjls +4-5 b: bbbnz +6-8 z: zzzzzzzz +9-16 q: qmqjqqqxqqqwqqqqpqq +2-4 s: ssssl +10-11 t: tlfttttktgbt +10-11 b: bbbbbbbbbbx +3-6 p: nvpgwlbfdvtjwzqt +14-15 x: xxxgxxxmxxxgxwqrxxx +13-14 w: wwwwwwwwwwwwws +5-6 t: vprgttk +3-4 n: hnnx +14-20 m: vxjbmmfwdhfvmmnnhwrm +9-10 f: ffpxfwfrjffffff +2-10 c: cccctcccccfc +6-10 v: vvvvgkvvvjv +10-14 x: xxxxpsxxxxnlxvfvx +3-4 h: gthpwdbhbmtbgsqwpht +1-2 r: dvfgmprq +1-4 z: hzzlnjbfgrzlzm +4-5 x: rxgcxjxxjxsld +2-14 j: tjmjjgbklphjjbr +2-4 v: vbvv +5-6 v: vvvvnw +4-12 z: zzqzzzzxczzzzz +1-4 l: mhllllwzd +17-18 p: zmsrkxhwghxkfbbsgp +3-8 k: gxvkhkkkb +1-2 c: cctvchzgnmznck +14-16 g: wgggmgggggggggglg +3-8 b: zbrbpbfp +9-10 b: bbbbbbbbwt +1-5 t: tgtvl +11-13 k: kkgkkkkkkkkkk +9-10 h: hbwhjhjfrvhhhhh +4-5 w: zdwdw +1-4 k: kwkkx +5-6 h: hhhhnhhhh +2-4 q: npqxsqgqqs +7-10 j: jjjsljjljjjj +5-9 d: dwhddqddsdnn +4-6 d: ddddddd +5-6 w: wwwkzwnw +3-4 s: rrksrs +2-3 x: cgkg +1-10 t: tfthtmhttz +1-4 b: mlckbj +5-10 t: htttjctltkf +4-5 w: wwnwh +2-15 j: dvqjjjjsjjmjjgb +12-13 l: llkllllllzlggll +3-15 h: hzrlhwcvnhhvhtztvhh +5-7 r: krrrbrn +1-20 d: dfddpddddddddddddddd +2-15 h: kdhhmvshhhpghhphhhh +4-8 k: wfbkcxkkpsktks +3-5 v: pfnmkv +4-5 f: fffff +3-6 k: rnpnkkkg +4-7 j: jjjjjjwb +12-14 r: rrrrrprrrrrrrrrrfw +3-5 v: vvvvv +2-4 b: bbqbb +1-8 j: jbjgnwzj +4-5 s: sssxm +1-3 g: zgggrbzjsk +4-10 w: wgwwwwxtjwf +2-12 p: jrpjhnpppzplk +3-11 q: gpqqwqqqqqq +8-13 m: nmjcmckjmqlmmmnqmmm +7-8 x: wxxxxxxx +11-14 s: dsssssshssnsxpsv +16-18 s: skssssssssssssssss +5-7 d: gzxmjddx +3-8 k: kkkkkkkvkk +9-12 w: wlwwwwtwfwgwnwwwh +5-7 l: llllllnl +1-3 h: mhhh +7-19 w: wkfwpvlmwqcpwmqscws +3-8 k: srtkpksf +6-13 q: hxqqtqrqnqpqqpjqqv +4-6 l: llkllkllllllqs +17-18 q: qjsqqqmqqqqqqqsqqq +5-9 l: llllvlllbll +17-18 m: mmmmmmmmmmmmgmmmff +2-5 z: zzzzzzz +1-15 q: pqqqrfqkkqqbqqfqhnk +11-12 w: wwwwwwwwwwcw +2-11 f: sffqtlfhffdfgfwff +5-6 l: llllll +9-14 f: fvffffffmffffff +1-5 j: jrjmfl +1-11 b: wbbbbxbbbqv +11-13 x: xxxxxxxxxxwxsxx +9-12 p: qpppplphppppps +3-4 k: kkvs +10-20 f: rffqfgthxvfqwffrmmms +13-16 x: xxxxxxxxxxwxxxxm +6-9 z: lzzxnbzwjzgzgz +11-14 c: qrhwwxczldwcdl +3-7 f: fpffffff +3-6 n: nnnnnnn +7-8 z: zzzzzzpm +3-7 w: wwmwwwz +5-9 w: wfwtwjwlwddqlrw +9-12 k: kkkkkkkkkkkk +7-12 q: qbqwqqqqqbzrqcq +4-7 h: hhkhkhhh +7-10 t: fkktttttkfsrtqt +2-3 d: tbclbd +6-8 l: lllllhlll +8-9 v: vlcvtvvvvvvv +4-8 x: njcxxtpxbhv +3-6 k: kxkkkdjxbkh +4-7 j: xjjjfjjsjjsnfjjdd +4-6 d: bkddhddvdsdq +13-17 k: kkkfkkkckkkkkkkkp +5-8 m: xrptnmpbcmfmm +9-10 k: khkkkkkkkq +2-3 n: nnjjn +6-8 p: kkppdsqp +10-11 s: sssshssssbd +8-16 n: tnnrngnnnnnvnnsznn +10-11 m: mdmmmmnmmmlmmm +1-7 k: tkggrkkkkw +7-11 h: hhvhhfrhhhfh +3-7 g: gmggzmggrsw +3-8 h: hwvldcwddhthsk +4-7 f: fskfvlfdfsfs +2-14 d: vdwsmsgjhftncg +14-18 q: qqqfqqqqqqqqnqqqqqq +10-12 l: jllllllllzcdllll +1-9 k: jkpkbhkkd +1-2 n: nnvhbn +6-7 q: rzqsqvqqqdw +2-5 s: wclgs +1-17 b: tbrbbbbnbbbbbwbrp +1-3 x: xxxx +2-3 k: kknkkkk +2-9 j: btjjpbjzmrjbjj +4-8 r: rrjkqrwn +2-5 x: vncxpjxqmsx +1-15 c: zmfgtshnzwhqskchtc +1-6 g: gqgkbqtz +13-17 z: zzbdzzzzzzjzzzzzdzzz +6-7 n: nxnnnnnn +5-6 k: dzsrsknkkkwbk +3-11 s: kzsljkcgkhmpfssssr +2-3 q: pqtq +17-20 p: pppsppkpppppppppvppl +2-6 h: hfbhmkh +3-13 d: qhdlvhddldnxwtvrndx +10-12 v: vvvvvvvvmfvhv +6-7 g: gggtlgggg +11-14 s: ssssssspscssssshrq +3-7 z: zdzgzqkcvzhzsb +3-4 h: hhdkhhhhhhg +2-4 s: sswps +4-10 p: zpsppzppczpd +3-14 j: jjxjjjjjjjjjjvjjjjjj +2-3 m: fmmmm +3-9 h: hhzbjrhhg +2-12 c: cccccccqwcpvccpc +5-8 h: hbhhfhhv +1-5 p: pppprp +3-6 z: zzzzzz +4-5 d: dddgddd +5-6 p: nxfhvqpqpnpmpmp +3-8 q: qqqqqmqqqqmdqq +6-8 b: bbbbzrbhbbbzp +17-18 t: ttttttttttttvttflgt +7-13 m: vsmmmjmbmmzwmmhbs +5-11 h: bbzxzdhhhhhndtfhgv +6-9 x: xxxtqxxxxfxxxh +8-9 r: rrrqrrrxr +5-6 p: ppspqp +9-11 d: qqqddddpdddtzd +4-6 s: sszlssk +15-16 s: ssjssssssssssssssst +5-6 f: ffffff +6-7 k: kkkkkns +10-11 h: hhmvhhhndhchhxshhhh +14-15 w: wwwwwwwwwwwwwrx +3-15 g: gzggggggggggglgg +11-12 n: nnntnnnnnnnn +4-10 r: rrrrrrrrbrcv +2-4 r: vrxtk +13-14 v: vvvvvvvvvvvvvc +3-5 v: vhrvnvnvd +2-15 f: dnfnkzbfvlfnfqfh +1-2 j: jjfj +3-5 w: wwwwwg +3-5 m: bmmmlp +5-6 w: wwwwww +13-14 n: nnnnnhnnnnnnnj +6-7 f: ffcffhbgzkt +6-9 f: kzffzzffjffgfxzf +18-19 g: gggggwgggggggggggpr +13-15 x: xlxxxxxxxxxxcxx +1-6 j: tjjjjhj +3-4 h: shpqdhl +9-15 l: rslpllllkplflqlhpzl +2-7 r: rrvrprl +15-18 d: gdddddddddddpddddddd +13-19 n: nnnnmnnxnxntnnnnnkn +10-11 x: xjxxxpxxxxxxqx +7-10 w: wwwwwwwwww +2-10 l: xllqjvzlwzpl +13-15 m: mmmmmmmmqmmwmmr +9-10 t: zptjnttktttttkvttvt +16-17 j: jjjjfjjgjjjjjjjpjjj +3-6 w: bnjnqwhhqpxcrgx +7-8 z: zzzzqdzzzz +2-4 g: dgkggk +1-3 q: mqqq +9-12 n: twqnnnsxlnnpnnn +12-18 z: czzpzzzzzzztzzzzznz +3-4 x: xglr +8-9 n: nnnhnnnnnn +1-2 v: vgxstl +10-12 p: qvpwpnjpkwpp +13-14 r: qrrrrrrrjnrrrq +3-8 d: ddhddddpddddddd +4-13 k: kkkkkrkckkgkpkkk +8-9 q: qvtbqdscg +3-6 f: fxjqfwdrqxmffhd +6-7 g: gggggjt +14-18 x: prxxtgxmxxhrfxtxkx +11-15 l: lllllllllllllllll +10-14 n: nnnnnznmnnntnn +1-3 d: dddd +16-17 s: sssssssssssssssss +14-15 w: wwwwlwgwwwwswwwww +3-9 f: dfblnfrfffrff +6-7 g: wggfpggggg +1-9 z: kxjqqkzczx +3-9 q: qqqqbqqqq +6-9 w: whwwcwqwwkxwpsbwpnw +7-15 g: rwggggggggzssmggjx +2-5 t: dtxbttt +1-5 x: xxtxxjdxxn +12-13 n: nnnnnnnnnnnznn +2-6 b: bxrpbbq +6-11 n: nnnnndrnnnnn +10-11 k: kkpkkkbkkpkkjk +6-8 c: gccccccm +2-3 x: ptxktrxtv +13-14 x: xxtxxxxdxxxxmhx +10-11 v: vvvdlvvvvlvvv +2-3 k: rtcdksdxk +17-18 w: zmhvwnndrjbvsmnhlw +11-12 m: dmmmmmmmmmml +7-8 g: gvndbzzbsjkpxg +9-16 c: cccggcqtdkcccccj +7-10 m: mqmmmmmmmmnmgbgmmbcq +5-13 c: pcbqcwcnjtvccccfgjx +3-8 f: ffpffffffffffff +9-11 n: cdndnntnnnnnnn +10-16 n: nnnnnnncntnnnmnwnn +6-10 r: rrrwrrrrpn +4-8 v: vcwsvvxvwvcvvh +4-5 g: ggghdg +8-10 v: vmvdvlrvtvtvvjvvd +13-16 j: vrgplxbmgwvljtjgzbw +2-9 s: ssssssnskss +18-20 v: vvvvvvvvvvvldvvvvfvv +8-13 r: rrrprrrhrrrgj +4-6 g: dgjkrhwggg +2-3 n: nnnw +7-11 s: sssscsgsssqs +7-10 c: cccccctccg +9-16 m: mmhmjwzmmgmdmnmmmm +1-4 c: ccvcc +11-15 m: mmmmmmmmmlvmrmmm +10-11 l: zgcnmxlplml +2-11 m: fmsmnmlhmmmmmbgm +6-7 g: hqggggggg +7-9 z: zzzzkznxzzzz +3-5 n: ngntcnnpsdnqnnmnrj +3-9 h: dhhhhfgkthxh +14-15 x: zbxmkfmtznnnxjjtsr +4-7 l: tlklltcll +5-10 s: hffslrssgrsrcwncmqw +5-12 f: ffffjffpfpfp +5-6 h: hhwhhhh +8-10 v: vvvvvzvvvfv +1-8 n: wqnnnglnrnln +11-15 q: qqqqqqqfgqnqqqnwql +2-7 d: wkdwddt +2-5 m: mxmmm +8-15 d: ddddddddddddddxld +6-9 s: sssssgscds +6-8 z: zzwzzzzzz +4-8 x: xfxxxxkxsckrwg +1-9 b: pnlbgtsfwp +6-10 l: dfrrklhrvp +15-16 n: qnnnnnnnnnnnnnlh +16-18 z: zzfczncnztzzkzzzqzz +12-13 r: rwrrqnrrrrrrkrrr +1-2 q: qkqqq +4-8 f: sfpffjfgfw +5-10 q: qqqqqqqqlqq +13-14 q: qqqqqqqqqqqqqd +1-6 v: vvvvtvmqfwvgjjgbtvm +3-8 f: dfffkdjftf +1-4 t: hgtttttttw +5-7 k: kzmkzkmkr +15-17 w: wwwwwwwwwwwwwwxpw +2-14 z: mnzkfkzbzhwfzbkzzzz +13-15 x: xtgxxqxxxxxxvpgrxx +9-10 q: qcqqvqsqssqqq +8-12 g: qghgrlggggggggszg +15-20 l: llllllwllllvllllllll +2-4 b: whhdhlzp +6-7 t: tttxtxct +1-9 g: bgtnvszsk +6-8 g: gggggggg +7-10 z: zqzzzzzszzpzkz +4-8 x: xxxxxxxxx +7-8 n: ztnnnknhpknvzn +11-12 g: gggggzpgxggg +10-13 b: bbbjbbbdbwbbrbq +1-5 w: whzmwwzwwlwwl +4-12 p: pbppdzcxhlllpxqxjm +8-10 f: fzbfpfrdfzff +6-7 v: vvvvrxh +1-4 t: gtjt +3-5 b: jzhpbbbwp +1-2 t: dtttn +3-9 r: dqrfrtvsxbrjwbrg +4-5 p: spppxqpb +4-12 c: sntctfrcsmwcmrlst +1-13 n: nnnnnnnncnnncfnn +4-5 z: zzzzz +11-15 n: nwnnsnfnntnnsnnxnnn +3-13 f: ffnfffffffsfffffff +11-12 b: brfbbqtpbhzrd +5-9 r: krrmrrrrjr +9-10 g: gggggggksc +6-12 m: mmmmmsmmmmth +11-12 w: wwwwwwwwwwww +10-11 x: xxxxxxpxxxs +3-8 j: qgzjmkqhqjszwxjj +4-6 g: kgggwgfg +16-18 r: rrdgrrrrrrrrrrrrrkfl +18-19 r: rrnrrrrrrrrrrrrrrrr +1-7 d: dprhvrdzdjxddd +3-4 p: ppxr +6-13 b: bbwbbbbbbbbhbbh +10-12 g: hrggghfkqtgswxdjcb +8-9 p: pcppppppm +3-4 w: vwlkwbwvp +11-15 f: fnhfffhfdffffffffff +2-7 c: kfccccrlc +9-17 z: zphgvhzrzzzwjzzczxf +3-4 v: vnxvkdrvvf +1-11 w: xxnlwlbzmpgwcw +10-12 v: vvvvvvxlvvvvvvvv +12-13 t: xtrctttpwptjb +6-7 z: zzzzzzz +3-19 m: fmgfmmjpfxmmprmmqhsm +18-19 m: fkmkpdrrbxzwgvdhqmm +2-3 h: xchwlphpkhlc +4-10 j: xrjjjjrjfjjjj +6-9 z: zzzzzvzzz +1-7 d: jdddddddd +4-9 x: xxxrxxxxxx +1-6 w: dwnwws +9-13 l: llllllljkllhlhlvx +4-7 t: tvsttbsqzcwzthtx +11-13 s: sbssrssssscsdsrss +5-6 n: bnnnncnznm +10-15 g: ggggrggggggggwggg +10-15 g: gggrfggxjgbgggjgs +3-5 v: vvvbvmvzvcv +2-5 r: rrrrrr +4-5 k: bkjkkkkf +4-8 z: mxddnzzjpbzm +2-3 r: frrkfzjrncrgpwsf +10-15 m: mmmmshmmmgmskcv +5-8 c: ctcchhczcq +7-8 b: skbqjbbwbncbtbb +6-7 d: ddddjjxgdd +6-13 v: tvcmvbvvvdvvvrzgk +5-10 x: xgsxdxqxxsxxjx +3-12 f: xfbqfffcftkh +4-5 j: wmjkhjj +7-11 n: nnnnpwpnnnrn +8-13 l: lqnlllllmlwll +8-12 s: sssssssssssssss +1-8 g: lggggggwgg +15-17 w: wwwwwwwwwwfwwwwwww +4-17 r: qrrlfhrrlrjrrrkcrrbr +4-5 n: rsrnplnttvxnnkhnvtxz +4-5 n: nnhts +5-6 x: xxxxxxn +1-4 s: gssss +4-6 p: qpppsgjppz +12-16 n: zcnkhqnnnnwtqnrnknnn +13-14 m: mmcmmmmmmmmmmn +9-11 d: kdpdddbdpgdddhd +3-8 k: krkbxgvq +2-6 t: tbhtslxhtfcphkwnth +3-8 z: gzzxzzzmjzzzz +4-5 c: cccwp +3-9 s: skszskstjs +4-10 l: qljlllzqlllvhlls +7-11 c: cccclccccccc +1-2 v: vgfv +14-17 m: hmmmmmmmmmmmmmmmm +2-4 p: pppp +2-3 c: cccs +2-3 k: xppklhkhsfw +5-7 m: mmmmzmqs +3-12 n: nnnqxdvbxnhnrnzfnnp +15-16 s: kssmjbzlwktbddltd +8-9 j: jjjjjjjjkntjh +3-5 g: ggvgpggggmggggg +6-11 t: rstjsmttmkdtttmttttp +5-6 r: rrrrbb +7-8 q: qqqqqtbbq +3-8 c: ccsccccbcccb +6-10 q: qplqqlmqqqq +5-6 v: vvvvvv +1-3 q: sqdqqqqgqqqqqqqq +11-12 j: lnjjjjpjjpwjjjjl +5-7 b: bsdsbbrbqbrpb +5-6 m: rmxmmmjdrvvmmmt +1-4 l: llfwh +1-2 d: hcsd +2-5 m: mmrjmnnmmmm +7-11 k: kkkwkbkkkkk +15-16 g: xsmrgbbgwzqrjgfk +7-8 x: xxxxxxxxxxx +3-7 n: nrmnnnndj +6-10 x: xxkzxpxxxwx +10-14 x: pxxxxxxpxxxxxxfxb +7-9 j: pjwjjjjjjjwp +9-10 r: rfspfrrlrf +1-5 r: rrrpfr +6-11 k: qjsqjnkckqfkcvkk +1-2 b: bbpqjnpbb +5-11 c: kcjxmstklbcjwktcwgk +2-3 h: phcshb +6-18 d: dddhdddddddvpdpdddd +3-7 t: qtkttttqtttn +8-10 j: jfjwjjjbsjjjj +9-11 m: mmmmmmfmmscm +3-4 v: ldvfvvllh +5-11 b: wbbbbvzmckbbtl +2-4 m: msmm +2-3 f: ffffvjff +3-13 c: pmchdcwhdwdnchs +7-12 s: sskdsssssssss +1-4 x: kwqtxnhhxp +13-14 n: nnnnnhnnnnnnnl +11-15 f: nrffwclmlgxgdblj +3-15 w: wvwwllsksktbbbdxmgmh +6-7 g: gggggtgg +12-13 r: rrrrrrrrrrjrrr +4-5 k: lkkkkkxv +8-10 h: hhhhhhhkhh +17-18 q: qqqqqqqqqzqvqqqqxvdq +3-6 w: wwvwsxj +8-15 z: zxczhwthhhzrzzpzfzs +3-5 q: qqqqk +11-18 z: zzzzzzzzzzlhbzzzzzz +6-8 m: mmmphqmt +2-4 h: hnsrkhv +4-9 x: xxxrxfxxvxwxx +1-4 d: ddsxjrmdnwswd +3-6 r: rprvrwrrnflvhnlrv +7-10 r: rrrrrrrcrwtrh +13-14 g: gntfgtrbgdfsgk +12-13 c: cccnbcccccjtkccl +2-3 f: fgsf +2-5 f: dfftfsrkz +6-8 p: wpppprmpp +8-9 k: kkkxkkkkdk +8-10 l: lrmlzpllllltlrblgcld +3-6 z: tfqzzzpz +4-5 r: nrrrrrj +5-10 l: llllsrnslglllqcl +10-17 j: jjjjhjjkjcjjjxjjhj +10-13 h: hhnlhhhhhhhhh +15-16 h: chrhphvhxhjphhxk +5-18 c: cccctcccccccccccccc +14-15 h: hhhhhhhhrhhhhxb +5-6 w: wwwtsdq +2-5 s: slsscz +8-9 f: fffffffdx +7-10 s: fdsssgkrpgssss +16-19 n: nnnnnnnnnnnnnnnnnnnn +8-18 d: dxdvkddjddddzddddgg +12-13 q: qqqqqvqqqqqvq +6-7 l: pvmnlfwzb +3-5 c: cfnclcfrccxstc +4-10 m: mmmjmmmmmmmm +15-17 s: sssssssssssssshsmss +8-10 q: qqwwktqtqsqtb +3-4 n: nbxnn +6-7 p: pppvpvr +1-5 h: dmqlb +9-15 g: gplxmjgdgjgzqlgkxhg +7-11 l: llsltxlllmblgp +7-8 h: hhhhhghhhw +12-13 x: xxxxxxxxxxxxx +2-7 m: tmxtdmmfgn +12-14 r: wrrrrrrmrrrwrn +10-16 t: tlttqdtttgcstttntt +2-10 z: zzzzzzzhzpzzzzzz +8-10 s: sssssssssss +5-7 z: zvzzzzzczzzq +12-13 c: scccwccccccccc +14-18 v: vvqvvvvvxvvvvvdvvv +14-16 v: vvvvvvvvvvvvvtvzv +4-9 d: zddgpddqwdtdd +7-11 l: xllvlzclflzlnhtls +6-7 l: lllllczl +4-12 s: slbsmstssscs +8-11 b: xbqbtjsfbbgq +5-15 r: frrrqwcnrrrrhrrqk +2-3 n: nmtxqfxnnnnnh +14-17 l: glwlzllglblwlmlll +10-12 g: ggggggnjggggg +9-10 b: bbbbbbbbkt +4-9 m: mcmmmmnfmwmwfmmljxmv +7-11 l: lxmllrqllwlhl +9-13 p: bppxpjpmpwcpppdprpp From 4f8c876f2d5a8b416c95e1156af60bf43d1fdfd6 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 11:20:12 +0100 Subject: [PATCH 062/479] 2020: d02: ex1: add solution --- 2020/d02/ex1/ex1.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 2020/d02/ex1/ex1.py diff --git a/2020/d02/ex1/ex1.py b/2020/d02/ex1/ex1.py new file mode 100755 index 0000000..fca2919 --- /dev/null +++ b/2020/d02/ex1/ex1.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +import re +import sys +from dataclasses import dataclass +from typing import List + + +@dataclass +class Policy: + min: int + max: int + letter: str + + +@dataclass +class Password: + policy: Policy + password: str + + +def is_valid(pwd: Password) -> bool: + occurences = pwd.password.count(pwd.policy.letter) + return pwd.policy.min <= occurences <= pwd.policy.max + + +def solve(passwords: List[Password]) -> int: + return sum(map(is_valid, passwords)) + + +def main() -> None: + pattern = re.compile("([0-9]+)-([0-9]+) (.): (.+)") + input = [ + Password(Policy(int(m.group(1)), int(m.group(2)), m.group(3)), m.group(4)) + for m in (pattern.match(line) for line in sys.stdin.readlines()) + if m + ] + print(solve(input)) + + +if __name__ == "__main__": + main() From 28ee1e006d191f495788f13f5844eae63404251c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 11:20:25 +0100 Subject: [PATCH 063/479] 2020: d02: ex2: add input --- 2020/d02/ex2/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2020/d02/ex2/input diff --git a/2020/d02/ex2/input b/2020/d02/ex2/input new file mode 100644 index 0000000..0f3ccea --- /dev/null +++ b/2020/d02/ex2/input @@ -0,0 +1,1000 @@ +7-9 l: vslmtglbc +2-3 s: hpbs +1-3 v: pvvr +2-8 h: hhhhvhhh +9-10 x: xxxxxxxxzv +2-5 q: xdqbjj +17-19 n: nnnnnnnnnnnnnnnnrnsn +5-7 f: fxfkffffff +4-7 h: hrjhxlhh +11-12 v: vvvwdvvvvvvvvv +6-7 q: tqqqqvqqq +2-4 b: vlmndngvbkptbb +1-4 t: mttwt +3-4 v: vmgdcj +4-17 n: nwnnnnnnwqncnxxnn +3-4 c: gscc +3-4 w: wwwwww +8-12 j: jdjjtjxjjjjj +1-5 b: bmbfbbb +5-11 k: kkkkkkdkkkkk +1-4 m: mmmm +5-6 z: zzzzhzzz +8-10 z: zmqzzzzgzlzdz +14-15 r: rrrrrrrrrrrrvnr +11-13 q: qqqqqqqpqvpqwq +3-7 q: qnqhqcqq +11-17 r: vrrrrrrjrrrrrrrrrrrr +2-5 g: srqmltncfgdg +7-11 w: wwwwwwtwwwqj +5-14 j: hhwjmjzmjjxjjkjgjj +11-14 x: xffrxxxxxxzxrxxmxqlw +14-16 c: hqcchcjwrxbcgclctx +10-14 k: kkvkkdbqnqkkbfftxm +10-12 c: cccccccccccc +7-13 x: dbjtkxxfjsvvx +9-11 d: ddddddddxdb +4-8 h: mhbhrsvtl +8-13 h: hbhrhjhhjhhqpthxnwhh +10-11 s: sssksssrsssss +6-8 m: mmfmmmmm +4-14 h: bhhnhvhhhhhhlvhmqkh +1-17 c: cccccccccccccccccc +10-11 r: rsrprprrrnr +10-13 d: dddddddddhdddd +5-7 s: msfscsndswsl +3-8 b: bbzzbhbwb +9-20 b: cbbcrbwjfrddqbvzrfxb +9-15 h: shpdthhhhhshhhhh +5-6 n: nnnnnn +1-7 f: dfffffffff +10-11 f: fffffffffvf +3-4 z: xmkkvcrqdz +15-19 h: hhghhhhhhhmhhhhhhhh +4-7 m: lmxkhmmm +3-4 l: zlllkfzcldctlmhq +2-5 j: jxjjqj +10-11 s: sssssssjsgw +2-4 j: vjkjp +9-18 l: lffnlbmrmrvlkrpchj +3-6 q: qqhqqdqq +18-19 d: ddddddddddddddddddd +1-8 m: mmsmzwbchmmlmljslkk +2-6 m: tmbtmmgmmwm +2-8 j: jrjjjjjp +8-12 d: ddddxdbtvdnbdk +8-13 t: tttttttxttrtr +8-13 w: wwwwjgwzdxwwp +3-14 j: jjkjjjrjjcjqjjj +3-4 q: qgpx +6-9 p: ppppppppp +6-8 f: fdffffff +5-10 x: xsmxxxxkxxhtxxmx +1-4 j: dzrhcjljjv +13-14 s: sdxcbwfsprkpss +9-13 n: nnnnnnnnnnnnnn +3-7 r: rrrcrkrrrrm +4-11 f: fmfrfgphxqf +4-13 t: tttrtptttzgttwj +10-12 w: wwwwwwwwwfhh +10-11 q: qvqqqqqjqptqq +8-10 s: sssssxsssv +12-15 c: dsmccckcccbccwcccdc +5-7 l: nllffcmrwkdhw +8-10 t: tttzttvttgtqt +7-8 m: mmmbmmjmm +7-9 c: ckccqmmcccjckdc +3-4 w: twwwd +11-13 g: ghgpggggwggclgfggtzm +10-11 m: lvwmmmmmbfmm +9-12 g: gggggnggtgdgg +5-7 k: kkkkkkk +11-13 g: ghgggggggbrgzgg +3-7 z: zzzzzgzz +7-10 z: zzzzzmszzdzzz +15-20 w: wwwwwlwwwwwwwwwwwwwc +7-9 z: zzzzzzzzz +1-8 q: qqnhbczhtzg +11-14 s: sgcssssvsssvsslvss +2-4 w: mcztwwt +3-7 w: wtwtdwpb +5-8 r: rrrrrrrsr +7-8 v: vnvvvvvv +7-8 j: jjjjjglwj +5-6 w: ktkvwwgqbxgckq +7-9 f: ffffzfffff +12-14 n: nnnnnnnnnnnnngn +3-5 z: zzzzdz +5-11 j: xmjjtjjbjngk +3-5 l: llvldllllvl +7-8 h: hhhhhhhnhh +17-18 p: ptpppppppppppppprq +2-6 s: sssdnlgqjxcvssh +3-6 h: dhhthhhhch +6-18 k: khkkkkzkmkkkvttkkkkk +3-4 x: dxsxxx +4-11 b: bbbbbpbbbbb +5-7 t: ttzthtx +3-6 k: kkrkkxkkhkkk +2-7 b: mbzbjfnb +9-12 l: fglllllllllkl +11-14 l: plctdxwbmnbqnczwvjlv +2-10 f: jfdtpsntnf +18-19 d: dddddddpddddddddddd +4-6 h: gkhbkhhhkhppb +7-9 f: ffqvffffffnfr +3-4 l: llzl +2-12 d: dccfdbdddddndd +12-17 b: bbbbbbbbbbbbbbbbbbbb +2-3 k: bkkp +5-9 h: hlhhjhhhl +4-12 f: ffffrffffffffffflffz +1-5 v: vvvvvwvv +8-9 l: lllllllgb +15-18 t: ttttttttntttltvtts +6-7 q: zqpqcgbqqq +5-11 w: lgrktkmkqzjvwg +8-9 p: ppppppppp +3-4 c: cccc +7-15 b: bqbxzbbbdtbbbmbb +9-11 k: kkkkkkvkdkktk +4-6 t: bktttttt +6-10 m: bwtpbsmmnmmlmfd +5-12 z: zzckszrdzzpmzzzzk +4-5 q: qqqck +3-6 k: kkwpsbbqkntgz +1-6 k: kkkkkk +1-7 f: fffzffffffffffjq +3-4 p: jqpxgn +7-13 v: wvhzbmvvvvvvgvvv +3-5 p: ppvdfgr +16-18 c: ccccqcccwccgcbctsk +5-8 p: ppgpgpjgpzqpw +1-3 t: tspmnttttfm +2-9 b: bmbbbhbbxbb +2-7 n: dnnngnnnmnnnnckn +12-14 c: cccccccccbccrm +12-14 q: qqqqqqqqqhnmlpqqqq +2-3 n: whnnmf +13-15 h: hhhhhhhhhhhhchp +4-5 k: kkcmw +6-7 z: wfqwfkhdvd +3-4 h: bqnhhhncph +3-4 j: kjgkj +16-17 s: ssssssssssssssfqx +4-6 r: rrzbpw +2-3 m: vzmmmm +17-19 z: zzzxzzzzzzzzzzzzfzz +7-12 s: nmpsssdhszssssssnhs +4-5 l: lfqlcl +3-5 d: fdtdb +6-9 b: mlbbjhbbbbbbl +1-5 g: gggggg +4-7 x: xxbxxhxxkxsx +3-6 j: kspjgjzxfpdclkrzk +2-7 s: ffwpjssskscsv +4-5 n: nnndf +5-15 g: gtljgmrlggmghbv +13-16 v: vvvvjvqbvvvvvvvhvvs +6-9 b: dldbmbsmb +5-7 f: sfvffffft +1-3 b: ztblbcxnrmkvnfvz +10-12 r: dljvqxnjttjvtfrcxgh +14-16 w: hgwslvnzbhhxwwvwprww +6-8 s: vssnsssgptshmkst +6-8 s: scssssshs +6-12 g: gggggfgggtnhm +6-10 j: hlcjjlfpljpwjjrvpl +2-8 m: zbbmxlzlrckhrcmksf +1-7 v: vvvnmvl +3-4 x: fxpt +3-12 h: hhhhhhhhqhhhh +8-9 t: tttttttftt +12-18 r: rrrrrrrrrrrrvrrrrdr +10-14 d: dbdddddddvddddd +15-17 r: dvrhrrrrbnrrprrrrrr +7-11 v: fvjgvgvvvsvz +5-6 m: dsmjmm +7-12 k: kkkkkkknkkpkkz +4-7 h: fhdhmhmvwfsh +8-9 f: ffffffffgf +2-4 h: hhhk +5-9 r: mdrcwmllvgnjfzfcwztt +8-9 g: gggggggnjggg +11-16 v: vlgfvvnvvvvvvvvv +12-16 t: tttttttwtttptttk +4-6 w: jfvkvwx +12-17 w: phmrqwdwwqwwwwbwzbwr +16-17 m: mmrmmmmmmmmmmmmdm +9-10 z: jzhzzzzzzzz +11-14 x: xxxxxxxjxxxcxm +11-12 b: bbbbbbbbrbgq +3-5 j: sxjjmxjrztjjldkpbcq +10-16 l: lhlldlldljlllmlm +2-10 t: szsnwnkttt +7-9 q: ppxcslxzj +14-15 c: ccczcccccccccnm +2-9 l: dllppswblllkltl +1-7 z: kcklcmt +8-9 p: ppppppfhjp +4-8 f: ffjkkffl +5-11 g: hgxgggcgjglbgzcdzg +2-4 d: ccdq +11-14 r: rvrtrrrrrtrnrqrrr +9-11 k: kkckkgkzsmkkkrwknkm +7-9 x: sgmxhhjxnpgcx +6-8 t: qhbpjtjtttttttt +7-8 q: wqqrqqqqqn +3-4 z: jzqgm +4-19 g: gdgmgjggkgpghgggggg +2-11 g: ggtgggggsgs +3-5 j: xdtjdjpjwljmd +1-5 h: hbnwh +2-4 h: hhfhhzhdqzhwchql +3-11 k: kjgjltkkmkkm +17-20 d: ddfnglddnddpqdqwdwbd +1-4 x: gxkpxx +2-3 b: zbbmkb +2-9 r: hrhphqrcr +7-10 d: dkdvddddddn +3-4 x: dsxbt +18-19 p: npnnpwpppgvxwmzpszv +14-16 v: vvgvvvvvvvvvvjvvv +1-8 h: nhthchpdnh +7-14 s: ssgssfsmrsssldgscfd +8-9 h: hhhhghhpv +4-5 g: kggslg +3-9 g: gggglngjzgg +11-13 h: hhhhhhhhhhhhhh +4-7 l: lllslgll +2-4 c: cccccnk +1-11 l: hltwqljjlzllhq +1-2 x: bkxtxx +4-5 v: vvvvg +7-8 x: xxxxxxqd +13-14 n: nwvcqqtwttfhnn +2-7 c: cccchcs +2-5 p: pbpgv +16-17 t: tttttvttttttmttlvttt +1-2 j: fbjj +2-5 n: knznnncnfnvn +11-12 l: llglllcnlfllllkllr +7-8 v: vvvvvvtr +8-9 k: kkkkvkkkp +6-7 q: tpxqqqr +5-7 s: sssnssshvxs +13-18 m: mmfmmmmmmmmwlmmmmn +7-11 p: ppppppppppp +6-7 s: bsssssds +3-7 q: qmqwqqqqqqhfp +4-5 r: tffrr +9-11 c: ccccccccccc +1-3 w: vvlhw +1-8 g: vgggggghg +5-6 p: txlxppppspkplxf +7-13 f: fffffffffffff +2-8 g: gggggsgggg +2-5 w: wbwwz +2-3 p: spsrhtmjzpmgvj +1-4 d: vbtd +4-5 g: ggggf +14-16 v: dvvfhdjcvvvmvdvnm +6-8 x: xxxxxxxxx +5-6 j: jjnjjj +13-15 m: mmpmmvmmmmszmdgkm +4-16 z: zzzzzzzzzzzzzzzq +4-10 x: xxxxxxxxxxxx +4-5 r: rrrrr +10-11 m: rmmdmmmmmmdnm +2-3 q: qqqs +7-11 m: mmmmmmmcmmmmx +2-4 x: dcfr +2-4 p: cpppgpp +1-3 n: vnqgqbhn +3-4 p: pppx +13-14 f: fffgfpfffffffqftfn +2-5 h: hsdhhhh +3-6 q: pdqvtq +6-8 l: lllllmlll +5-6 v: vvvvld +10-11 x: jxhxdchxjwx +7-8 h: hhhhhhhh +11-19 z: dtzzxcztmzzzzzzjqzzz +3-4 h: thcchhh +3-5 b: dbbwjbbnb +11-12 q: qqtgqqldkqqqqqqctqq +12-13 l: lllllllklllcxl +2-8 s: sppbsvjfp +10-20 g: xgswhgldgggdkxjggzzg +2-4 n: nnnnn +3-5 c: xmtccjj +1-7 w: wbqwwwsc +3-6 g: wgghgngg +4-6 p: pppptpppwp +1-3 j: jjjjjjjjjjjjjjjsjjjj +2-6 r: drbwrrmtjnzrfsrxwq +1-5 v: rcvvd +2-3 w: dwnzf +4-6 l: lrlbld +3-7 h: hhhhhhkhh +6-12 b: bktbzmzlbbmvmbpm +1-7 n: znfnngntfsh +2-14 z: jzzsgxsqkqmzlzhzljz +3-8 q: qmqfzhfq +8-9 d: ddzdddddd +11-14 k: gkwtwksxrdwxkkh +3-5 v: vvvvnv +6-12 s: pksrzgvspsswsxrpsvss +6-8 w: whpwhwjwwpkww +8-10 w: wdwwbbwwsw +13-19 z: zzzfzzzzzzzzwzzzzzr +3-4 v: vkbv +7-10 x: wxxxkjkxxxdfxx +1-3 g: gpgsgqgb +15-17 r: pfntnqmbtcfcsrlgprqk +7-10 s: sjdssmsssbssssl +3-16 p: ppnjzcppkpppmwvkp +3-7 r: srkrvrjrgrrrr +3-4 x: xmxx +1-5 k: zkkhqdgrt +1-13 c: rcncccdclcccc +4-7 n: nxfmnnbn +8-9 g: gngggpgfwggg +2-5 m: smmfs +1-12 p: snppbhspvzpppnwpwjpp +2-6 s: rczxxsvknqcpwklsbc +4-9 d: ddndgtdddqddddqd +10-13 f: ffffffffftfff +8-9 x: xxxxxxxxxx +4-7 r: krkrsgrfvqzxpcrrgjr +3-4 c: chdc +13-14 k: xkkkkkkkkkkkkq +4-8 t: tmmvccgxfbtttttttt +14-16 l: trkllqstdlclqzlv +1-3 x: qkxx +2-6 s: nsfhklqbnvs +4-5 g: rlggcgg +10-12 l: llzlllllllll +12-14 w: wwwwwwwwdwwtwl +3-4 m: qmvp +2-3 d: dddd +2-6 j: mwqfjdjlnb +7-9 z: zlzwzrzshd +5-8 k: jmkjkqdcwkrtvb +17-18 s: sssssgssssstssssxcds +1-3 k: qfxkt +3-11 j: tsjjvpcnsmd +12-14 v: vfvvdvvvvvvbvjvvvvvv +4-12 v: wvxmcvzlrvtv +4-8 q: qqqqqqqqqqqqq +16-17 s: sssssssssssssssvqs +3-4 d: ddwx +3-4 h: hhhh +8-9 z: znbzzzzgzzz +1-3 b: tkffshrzkxwjbrxkkv +3-8 n: nnqnnnnbnn +6-8 n: bnpnnhfnnnqndxncpgq +10-16 d: sddddlddjszdddtc +6-8 x: wwwmqxzwl +12-16 j: jjjjjmjjjjbxjjjtpv +15-18 z: zzzzzzzzdzzzczhzznf +1-18 n: nvhddhnqnnrbvpnnwn +14-17 z: lbznszzzzzzzzzzzm +7-9 l: jfqxkllcll +8-14 l: lllllllllnllllc +7-13 m: ncmkkmmhwsvhmmsk +2-5 t: ttttth +4-5 k: kgkkkk +4-9 d: ddddddddd +3-6 n: nnntnnn +9-10 h: bbjqqhhhwr +12-16 g: ggfgsjggghcfggbpjggp +2-3 x: dktxtxh +1-2 x: grnz +5-7 x: txxcgddxnwxxx +12-15 b: bbbbbbbbbbjbbbj +11-17 f: fffffrfffcfpfcffff +3-9 l: lllllsvllhltll +1-4 g: lggfg +6-7 l: lgllltl +10-11 c: cccxcwchchcccn +1-2 m: mmmm +8-10 h: hhhhdhhbhh +5-8 d: dnddddtdd +16-20 l: llrlllgldllllllslllt +9-13 w: wwwwwwwwswwww +1-5 f: fpzffwffhrnfdtl +5-12 w: blwkbsstnvhmw +7-13 g: ggjngkmgfkngggggg +1-3 r: rrzr +17-19 d: ddddnddbddddddddqdz +9-13 v: zvvhgkvbvqvvvv +10-14 n: vxxmbptzjnnnxnqshqq +9-10 h: hlhhhhhqpthhhdds +3-5 v: vvcsv +1-5 g: dmggng +2-8 q: pnprhcxqhmf +6-7 z: zzstfvm +6-15 d: ddddddddjdddddd +2-13 c: fgqtczjthccjcc +5-6 j: jjgwjjjjs +11-13 b: bbbbbhbwbzwbqb +1-4 q: jpqdqqr +9-12 p: hpwpqppwpbhj +7-9 l: lllllljfln +13-14 z: zzzzzzzzzzzzzz +10-14 w: qjgqwwzrjwpjcjp +12-13 j: jjxrjjjjjjjsvj +10-12 n: nrnnnnnpnnnb +14-19 s: sszssszsssssswssssms +6-11 z: tzcvzzzlzzmtqzzzh +14-16 f: zfffkfffffqvffff +3-4 f: dfzf +3-5 g: ggsgx +9-11 f: fffjrfffffpfdfqdff +5-8 f: ffffvfgfm +5-8 c: ccccccclc +4-6 p: ppppppp +11-16 b: bbbbbbbbbgvbbbbbbbb +11-12 r: rrnrrrtrrrlbrr +3-4 d: ldqdp +11-13 s: lssnssssssssls +3-4 v: vvvvq +5-6 d: dkdddd +7-17 g: ggggggbgggggggggg +11-12 h: fhpbcfbbhlsj +5-12 d: hdpdddftmdrhdndjfj +2-13 m: stmmmmmmmmmmlbmm +2-6 r: vhqlrnr +13-18 n: dpmnnwnwgpnhnngndn +16-18 m: mmmmmmmmmmmmmmmpmm +13-17 h: vhmhchmthqzshhdthf +4-12 h: hhhkhhhhhhhmhh +2-3 p: pppppp +4-9 g: gmfgxgsgg +3-5 n: fnnhnn +6-7 j: gbdjhrjh +3-4 g: fvgggbgxgk +4-9 v: lvkdlmhvl +1-3 d: dddd +3-5 j: jjjkj +7-10 w: kzsbhmgjwdsvvqcqwlw +1-6 v: vldvvvldvvhvx +3-4 s: hspss +6-7 k: gpkkkkvkpxk +1-13 w: whwwwwzwgwdrwzfx +3-12 k: kkvkkkkkkkkkk +10-12 s: ssscvmsslsgsshsmss +3-9 s: msbncdgwbqsksh +5-9 l: kwlllnwwlhlmlqxdjn +1-10 l: llldldlllglllj +4-5 b: bbbbtbbbbbbbbbbbbbbb +5-7 b: bhbmwsgdcdpbxbfbjls +4-5 b: bbbnz +6-8 z: zzzzzzzz +9-16 q: qmqjqqqxqqqwqqqqpqq +2-4 s: ssssl +10-11 t: tlfttttktgbt +10-11 b: bbbbbbbbbbx +3-6 p: nvpgwlbfdvtjwzqt +14-15 x: xxxgxxxmxxxgxwqrxxx +13-14 w: wwwwwwwwwwwwws +5-6 t: vprgttk +3-4 n: hnnx +14-20 m: vxjbmmfwdhfvmmnnhwrm +9-10 f: ffpxfwfrjffffff +2-10 c: cccctcccccfc +6-10 v: vvvvgkvvvjv +10-14 x: xxxxpsxxxxnlxvfvx +3-4 h: gthpwdbhbmtbgsqwpht +1-2 r: dvfgmprq +1-4 z: hzzlnjbfgrzlzm +4-5 x: rxgcxjxxjxsld +2-14 j: tjmjjgbklphjjbr +2-4 v: vbvv +5-6 v: vvvvnw +4-12 z: zzqzzzzxczzzzz +1-4 l: mhllllwzd +17-18 p: zmsrkxhwghxkfbbsgp +3-8 k: gxvkhkkkb +1-2 c: cctvchzgnmznck +14-16 g: wgggmgggggggggglg +3-8 b: zbrbpbfp +9-10 b: bbbbbbbbwt +1-5 t: tgtvl +11-13 k: kkgkkkkkkkkkk +9-10 h: hbwhjhjfrvhhhhh +4-5 w: zdwdw +1-4 k: kwkkx +5-6 h: hhhhnhhhh +2-4 q: npqxsqgqqs +7-10 j: jjjsljjljjjj +5-9 d: dwhddqddsdnn +4-6 d: ddddddd +5-6 w: wwwkzwnw +3-4 s: rrksrs +2-3 x: cgkg +1-10 t: tfthtmhttz +1-4 b: mlckbj +5-10 t: htttjctltkf +4-5 w: wwnwh +2-15 j: dvqjjjjsjjmjjgb +12-13 l: llkllllllzlggll +3-15 h: hzrlhwcvnhhvhtztvhh +5-7 r: krrrbrn +1-20 d: dfddpddddddddddddddd +2-15 h: kdhhmvshhhpghhphhhh +4-8 k: wfbkcxkkpsktks +3-5 v: pfnmkv +4-5 f: fffff +3-6 k: rnpnkkkg +4-7 j: jjjjjjwb +12-14 r: rrrrrprrrrrrrrrrfw +3-5 v: vvvvv +2-4 b: bbqbb +1-8 j: jbjgnwzj +4-5 s: sssxm +1-3 g: zgggrbzjsk +4-10 w: wgwwwwxtjwf +2-12 p: jrpjhnpppzplk +3-11 q: gpqqwqqqqqq +8-13 m: nmjcmckjmqlmmmnqmmm +7-8 x: wxxxxxxx +11-14 s: dsssssshssnsxpsv +16-18 s: skssssssssssssssss +5-7 d: gzxmjddx +3-8 k: kkkkkkkvkk +9-12 w: wlwwwwtwfwgwnwwwh +5-7 l: llllllnl +1-3 h: mhhh +7-19 w: wkfwpvlmwqcpwmqscws +3-8 k: srtkpksf +6-13 q: hxqqtqrqnqpqqpjqqv +4-6 l: llkllkllllllqs +17-18 q: qjsqqqmqqqqqqqsqqq +5-9 l: llllvlllbll +17-18 m: mmmmmmmmmmmmgmmmff +2-5 z: zzzzzzz +1-15 q: pqqqrfqkkqqbqqfqhnk +11-12 w: wwwwwwwwwwcw +2-11 f: sffqtlfhffdfgfwff +5-6 l: llllll +9-14 f: fvffffffmffffff +1-5 j: jrjmfl +1-11 b: wbbbbxbbbqv +11-13 x: xxxxxxxxxxwxsxx +9-12 p: qpppplphppppps +3-4 k: kkvs +10-20 f: rffqfgthxvfqwffrmmms +13-16 x: xxxxxxxxxxwxxxxm +6-9 z: lzzxnbzwjzgzgz +11-14 c: qrhwwxczldwcdl +3-7 f: fpffffff +3-6 n: nnnnnnn +7-8 z: zzzzzzpm +3-7 w: wwmwwwz +5-9 w: wfwtwjwlwddqlrw +9-12 k: kkkkkkkkkkkk +7-12 q: qbqwqqqqqbzrqcq +4-7 h: hhkhkhhh +7-10 t: fkktttttkfsrtqt +2-3 d: tbclbd +6-8 l: lllllhlll +8-9 v: vlcvtvvvvvvv +4-8 x: njcxxtpxbhv +3-6 k: kxkkkdjxbkh +4-7 j: xjjjfjjsjjsnfjjdd +4-6 d: bkddhddvdsdq +13-17 k: kkkfkkkckkkkkkkkp +5-8 m: xrptnmpbcmfmm +9-10 k: khkkkkkkkq +2-3 n: nnjjn +6-8 p: kkppdsqp +10-11 s: sssshssssbd +8-16 n: tnnrngnnnnnvnnsznn +10-11 m: mdmmmmnmmmlmmm +1-7 k: tkggrkkkkw +7-11 h: hhvhhfrhhhfh +3-7 g: gmggzmggrsw +3-8 h: hwvldcwddhthsk +4-7 f: fskfvlfdfsfs +2-14 d: vdwsmsgjhftncg +14-18 q: qqqfqqqqqqqqnqqqqqq +10-12 l: jllllllllzcdllll +1-9 k: jkpkbhkkd +1-2 n: nnvhbn +6-7 q: rzqsqvqqqdw +2-5 s: wclgs +1-17 b: tbrbbbbnbbbbbwbrp +1-3 x: xxxx +2-3 k: kknkkkk +2-9 j: btjjpbjzmrjbjj +4-8 r: rrjkqrwn +2-5 x: vncxpjxqmsx +1-15 c: zmfgtshnzwhqskchtc +1-6 g: gqgkbqtz +13-17 z: zzbdzzzzzzjzzzzzdzzz +6-7 n: nxnnnnnn +5-6 k: dzsrsknkkkwbk +3-11 s: kzsljkcgkhmpfssssr +2-3 q: pqtq +17-20 p: pppsppkpppppppppvppl +2-6 h: hfbhmkh +3-13 d: qhdlvhddldnxwtvrndx +10-12 v: vvvvvvvvmfvhv +6-7 g: gggtlgggg +11-14 s: ssssssspscssssshrq +3-7 z: zdzgzqkcvzhzsb +3-4 h: hhdkhhhhhhg +2-4 s: sswps +4-10 p: zpsppzppczpd +3-14 j: jjxjjjjjjjjjjvjjjjjj +2-3 m: fmmmm +3-9 h: hhzbjrhhg +2-12 c: cccccccqwcpvccpc +5-8 h: hbhhfhhv +1-5 p: pppprp +3-6 z: zzzzzz +4-5 d: dddgddd +5-6 p: nxfhvqpqpnpmpmp +3-8 q: qqqqqmqqqqmdqq +6-8 b: bbbbzrbhbbbzp +17-18 t: ttttttttttttvttflgt +7-13 m: vsmmmjmbmmzwmmhbs +5-11 h: bbzxzdhhhhhndtfhgv +6-9 x: xxxtqxxxxfxxxh +8-9 r: rrrqrrrxr +5-6 p: ppspqp +9-11 d: qqqddddpdddtzd +4-6 s: sszlssk +15-16 s: ssjssssssssssssssst +5-6 f: ffffff +6-7 k: kkkkkns +10-11 h: hhmvhhhndhchhxshhhh +14-15 w: wwwwwwwwwwwwwrx +3-15 g: gzggggggggggglgg +11-12 n: nnntnnnnnnnn +4-10 r: rrrrrrrrbrcv +2-4 r: vrxtk +13-14 v: vvvvvvvvvvvvvc +3-5 v: vhrvnvnvd +2-15 f: dnfnkzbfvlfnfqfh +1-2 j: jjfj +3-5 w: wwwwwg +3-5 m: bmmmlp +5-6 w: wwwwww +13-14 n: nnnnnhnnnnnnnj +6-7 f: ffcffhbgzkt +6-9 f: kzffzzffjffgfxzf +18-19 g: gggggwgggggggggggpr +13-15 x: xlxxxxxxxxxxcxx +1-6 j: tjjjjhj +3-4 h: shpqdhl +9-15 l: rslpllllkplflqlhpzl +2-7 r: rrvrprl +15-18 d: gdddddddddddpddddddd +13-19 n: nnnnmnnxnxntnnnnnkn +10-11 x: xjxxxpxxxxxxqx +7-10 w: wwwwwwwwww +2-10 l: xllqjvzlwzpl +13-15 m: mmmmmmmmqmmwmmr +9-10 t: zptjnttktttttkvttvt +16-17 j: jjjjfjjgjjjjjjjpjjj +3-6 w: bnjnqwhhqpxcrgx +7-8 z: zzzzqdzzzz +2-4 g: dgkggk +1-3 q: mqqq +9-12 n: twqnnnsxlnnpnnn +12-18 z: czzpzzzzzzztzzzzznz +3-4 x: xglr +8-9 n: nnnhnnnnnn +1-2 v: vgxstl +10-12 p: qvpwpnjpkwpp +13-14 r: qrrrrrrrjnrrrq +3-8 d: ddhddddpddddddd +4-13 k: kkkkkrkckkgkpkkk +8-9 q: qvtbqdscg +3-6 f: fxjqfwdrqxmffhd +6-7 g: gggggjt +14-18 x: prxxtgxmxxhrfxtxkx +11-15 l: lllllllllllllllll +10-14 n: nnnnnznmnnntnn +1-3 d: dddd +16-17 s: sssssssssssssssss +14-15 w: wwwwlwgwwwwswwwww +3-9 f: dfblnfrfffrff +6-7 g: wggfpggggg +1-9 z: kxjqqkzczx +3-9 q: qqqqbqqqq +6-9 w: whwwcwqwwkxwpsbwpnw +7-15 g: rwggggggggzssmggjx +2-5 t: dtxbttt +1-5 x: xxtxxjdxxn +12-13 n: nnnnnnnnnnnznn +2-6 b: bxrpbbq +6-11 n: nnnnndrnnnnn +10-11 k: kkpkkkbkkpkkjk +6-8 c: gccccccm +2-3 x: ptxktrxtv +13-14 x: xxtxxxxdxxxxmhx +10-11 v: vvvdlvvvvlvvv +2-3 k: rtcdksdxk +17-18 w: zmhvwnndrjbvsmnhlw +11-12 m: dmmmmmmmmmml +7-8 g: gvndbzzbsjkpxg +9-16 c: cccggcqtdkcccccj +7-10 m: mqmmmmmmmmnmgbgmmbcq +5-13 c: pcbqcwcnjtvccccfgjx +3-8 f: ffpffffffffffff +9-11 n: cdndnntnnnnnnn +10-16 n: nnnnnnncntnnnmnwnn +6-10 r: rrrwrrrrpn +4-8 v: vcwsvvxvwvcvvh +4-5 g: ggghdg +8-10 v: vmvdvlrvtvtvvjvvd +13-16 j: vrgplxbmgwvljtjgzbw +2-9 s: ssssssnskss +18-20 v: vvvvvvvvvvvldvvvvfvv +8-13 r: rrrprrrhrrrgj +4-6 g: dgjkrhwggg +2-3 n: nnnw +7-11 s: sssscsgsssqs +7-10 c: cccccctccg +9-16 m: mmhmjwzmmgmdmnmmmm +1-4 c: ccvcc +11-15 m: mmmmmmmmmlvmrmmm +10-11 l: zgcnmxlplml +2-11 m: fmsmnmlhmmmmmbgm +6-7 g: hqggggggg +7-9 z: zzzzkznxzzzz +3-5 n: ngntcnnpsdnqnnmnrj +3-9 h: dhhhhfgkthxh +14-15 x: zbxmkfmtznnnxjjtsr +4-7 l: tlklltcll +5-10 s: hffslrssgrsrcwncmqw +5-12 f: ffffjffpfpfp +5-6 h: hhwhhhh +8-10 v: vvvvvzvvvfv +1-8 n: wqnnnglnrnln +11-15 q: qqqqqqqfgqnqqqnwql +2-7 d: wkdwddt +2-5 m: mxmmm +8-15 d: ddddddddddddddxld +6-9 s: sssssgscds +6-8 z: zzwzzzzzz +4-8 x: xfxxxxkxsckrwg +1-9 b: pnlbgtsfwp +6-10 l: dfrrklhrvp +15-16 n: qnnnnnnnnnnnnnlh +16-18 z: zzfczncnztzzkzzzqzz +12-13 r: rwrrqnrrrrrrkrrr +1-2 q: qkqqq +4-8 f: sfpffjfgfw +5-10 q: qqqqqqqqlqq +13-14 q: qqqqqqqqqqqqqd +1-6 v: vvvvtvmqfwvgjjgbtvm +3-8 f: dfffkdjftf +1-4 t: hgtttttttw +5-7 k: kzmkzkmkr +15-17 w: wwwwwwwwwwwwwwxpw +2-14 z: mnzkfkzbzhwfzbkzzzz +13-15 x: xtgxxqxxxxxxvpgrxx +9-10 q: qcqqvqsqssqqq +8-12 g: qghgrlggggggggszg +15-20 l: llllllwllllvllllllll +2-4 b: whhdhlzp +6-7 t: tttxtxct +1-9 g: bgtnvszsk +6-8 g: gggggggg +7-10 z: zqzzzzzszzpzkz +4-8 x: xxxxxxxxx +7-8 n: ztnnnknhpknvzn +11-12 g: gggggzpgxggg +10-13 b: bbbjbbbdbwbbrbq +1-5 w: whzmwwzwwlwwl +4-12 p: pbppdzcxhlllpxqxjm +8-10 f: fzbfpfrdfzff +6-7 v: vvvvrxh +1-4 t: gtjt +3-5 b: jzhpbbbwp +1-2 t: dtttn +3-9 r: dqrfrtvsxbrjwbrg +4-5 p: spppxqpb +4-12 c: sntctfrcsmwcmrlst +1-13 n: nnnnnnnncnnncfnn +4-5 z: zzzzz +11-15 n: nwnnsnfnntnnsnnxnnn +3-13 f: ffnfffffffsfffffff +11-12 b: brfbbqtpbhzrd +5-9 r: krrmrrrrjr +9-10 g: gggggggksc +6-12 m: mmmmmsmmmmth +11-12 w: wwwwwwwwwwww +10-11 x: xxxxxxpxxxs +3-8 j: qgzjmkqhqjszwxjj +4-6 g: kgggwgfg +16-18 r: rrdgrrrrrrrrrrrrrkfl +18-19 r: rrnrrrrrrrrrrrrrrrr +1-7 d: dprhvrdzdjxddd +3-4 p: ppxr +6-13 b: bbwbbbbbbbbhbbh +10-12 g: hrggghfkqtgswxdjcb +8-9 p: pcppppppm +3-4 w: vwlkwbwvp +11-15 f: fnhfffhfdffffffffff +2-7 c: kfccccrlc +9-17 z: zphgvhzrzzzwjzzczxf +3-4 v: vnxvkdrvvf +1-11 w: xxnlwlbzmpgwcw +10-12 v: vvvvvvxlvvvvvvvv +12-13 t: xtrctttpwptjb +6-7 z: zzzzzzz +3-19 m: fmgfmmjpfxmmprmmqhsm +18-19 m: fkmkpdrrbxzwgvdhqmm +2-3 h: xchwlphpkhlc +4-10 j: xrjjjjrjfjjjj +6-9 z: zzzzzvzzz +1-7 d: jdddddddd +4-9 x: xxxrxxxxxx +1-6 w: dwnwws +9-13 l: llllllljkllhlhlvx +4-7 t: tvsttbsqzcwzthtx +11-13 s: sbssrssssscsdsrss +5-6 n: bnnnncnznm +10-15 g: ggggrggggggggwggg +10-15 g: gggrfggxjgbgggjgs +3-5 v: vvvbvmvzvcv +2-5 r: rrrrrr +4-5 k: bkjkkkkf +4-8 z: mxddnzzjpbzm +2-3 r: frrkfzjrncrgpwsf +10-15 m: mmmmshmmmgmskcv +5-8 c: ctcchhczcq +7-8 b: skbqjbbwbncbtbb +6-7 d: ddddjjxgdd +6-13 v: tvcmvbvvvdvvvrzgk +5-10 x: xgsxdxqxxsxxjx +3-12 f: xfbqfffcftkh +4-5 j: wmjkhjj +7-11 n: nnnnpwpnnnrn +8-13 l: lqnlllllmlwll +8-12 s: sssssssssssssss +1-8 g: lggggggwgg +15-17 w: wwwwwwwwwwfwwwwwww +4-17 r: qrrlfhrrlrjrrrkcrrbr +4-5 n: rsrnplnttvxnnkhnvtxz +4-5 n: nnhts +5-6 x: xxxxxxn +1-4 s: gssss +4-6 p: qpppsgjppz +12-16 n: zcnkhqnnnnwtqnrnknnn +13-14 m: mmcmmmmmmmmmmn +9-11 d: kdpdddbdpgdddhd +3-8 k: krkbxgvq +2-6 t: tbhtslxhtfcphkwnth +3-8 z: gzzxzzzmjzzzz +4-5 c: cccwp +3-9 s: skszskstjs +4-10 l: qljlllzqlllvhlls +7-11 c: cccclccccccc +1-2 v: vgfv +14-17 m: hmmmmmmmmmmmmmmmm +2-4 p: pppp +2-3 c: cccs +2-3 k: xppklhkhsfw +5-7 m: mmmmzmqs +3-12 n: nnnqxdvbxnhnrnzfnnp +15-16 s: kssmjbzlwktbddltd +8-9 j: jjjjjjjjkntjh +3-5 g: ggvgpggggmggggg +6-11 t: rstjsmttmkdtttmttttp +5-6 r: rrrrbb +7-8 q: qqqqqtbbq +3-8 c: ccsccccbcccb +6-10 q: qplqqlmqqqq +5-6 v: vvvvvv +1-3 q: sqdqqqqgqqqqqqqq +11-12 j: lnjjjjpjjpwjjjjl +5-7 b: bsdsbbrbqbrpb +5-6 m: rmxmmmjdrvvmmmt +1-4 l: llfwh +1-2 d: hcsd +2-5 m: mmrjmnnmmmm +7-11 k: kkkwkbkkkkk +15-16 g: xsmrgbbgwzqrjgfk +7-8 x: xxxxxxxxxxx +3-7 n: nrmnnnndj +6-10 x: xxkzxpxxxwx +10-14 x: pxxxxxxpxxxxxxfxb +7-9 j: pjwjjjjjjjwp +9-10 r: rfspfrrlrf +1-5 r: rrrpfr +6-11 k: qjsqjnkckqfkcvkk +1-2 b: bbpqjnpbb +5-11 c: kcjxmstklbcjwktcwgk +2-3 h: phcshb +6-18 d: dddhdddddddvpdpdddd +3-7 t: qtkttttqtttn +8-10 j: jfjwjjjbsjjjj +9-11 m: mmmmmmfmmscm +3-4 v: ldvfvvllh +5-11 b: wbbbbvzmckbbtl +2-4 m: msmm +2-3 f: ffffvjff +3-13 c: pmchdcwhdwdnchs +7-12 s: sskdsssssssss +1-4 x: kwqtxnhhxp +13-14 n: nnnnnhnnnnnnnl +11-15 f: nrffwclmlgxgdblj +3-15 w: wvwwllsksktbbbdxmgmh +6-7 g: gggggtgg +12-13 r: rrrrrrrrrrjrrr +4-5 k: lkkkkkxv +8-10 h: hhhhhhhkhh +17-18 q: qqqqqqqqqzqvqqqqxvdq +3-6 w: wwvwsxj +8-15 z: zxczhwthhhzrzzpzfzs +3-5 q: qqqqk +11-18 z: zzzzzzzzzzlhbzzzzzz +6-8 m: mmmphqmt +2-4 h: hnsrkhv +4-9 x: xxxrxfxxvxwxx +1-4 d: ddsxjrmdnwswd +3-6 r: rprvrwrrnflvhnlrv +7-10 r: rrrrrrrcrwtrh +13-14 g: gntfgtrbgdfsgk +12-13 c: cccnbcccccjtkccl +2-3 f: fgsf +2-5 f: dfftfsrkz +6-8 p: wpppprmpp +8-9 k: kkkxkkkkdk +8-10 l: lrmlzpllllltlrblgcld +3-6 z: tfqzzzpz +4-5 r: nrrrrrj +5-10 l: llllsrnslglllqcl +10-17 j: jjjjhjjkjcjjjxjjhj +10-13 h: hhnlhhhhhhhhh +15-16 h: chrhphvhxhjphhxk +5-18 c: cccctcccccccccccccc +14-15 h: hhhhhhhhrhhhhxb +5-6 w: wwwtsdq +2-5 s: slsscz +8-9 f: fffffffdx +7-10 s: fdsssgkrpgssss +16-19 n: nnnnnnnnnnnnnnnnnnnn +8-18 d: dxdvkddjddddzddddgg +12-13 q: qqqqqvqqqqqvq +6-7 l: pvmnlfwzb +3-5 c: cfnclcfrccxstc +4-10 m: mmmjmmmmmmmm +15-17 s: sssssssssssssshsmss +8-10 q: qqwwktqtqsqtb +3-4 n: nbxnn +6-7 p: pppvpvr +1-5 h: dmqlb +9-15 g: gplxmjgdgjgzqlgkxhg +7-11 l: llsltxlllmblgp +7-8 h: hhhhhghhhw +12-13 x: xxxxxxxxxxxxx +2-7 m: tmxtdmmfgn +12-14 r: wrrrrrrmrrrwrn +10-16 t: tlttqdtttgcstttntt +2-10 z: zzzzzzzhzpzzzzzz +8-10 s: sssssssssss +5-7 z: zvzzzzzczzzq +12-13 c: scccwccccccccc +14-18 v: vvqvvvvvxvvvvvdvvv +14-16 v: vvvvvvvvvvvvvtvzv +4-9 d: zddgpddqwdtdd +7-11 l: xllvlzclflzlnhtls +6-7 l: lllllczl +4-12 s: slbsmstssscs +8-11 b: xbqbtjsfbbgq +5-15 r: frrrqwcnrrrrhrrqk +2-3 n: nmtxqfxnnnnnh +14-17 l: glwlzllglblwlmlll +10-12 g: ggggggnjggggg +9-10 b: bbbbbbbbkt +4-9 m: mcmmmmnfmwmwfmmljxmv +7-11 l: lxmllrqllwlhl +9-13 p: bppxpjpmpwcpppdprpp From 04329c9fd3b5e8435a720d80a9cb6b23956e926c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 11:20:32 +0100 Subject: [PATCH 064/479] 2020: d02: ex2: add solution --- 2020/d02/ex2/ex2.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100755 2020/d02/ex2/ex2.py diff --git a/2020/d02/ex2/ex2.py b/2020/d02/ex2/ex2.py new file mode 100755 index 0000000..2e11cca --- /dev/null +++ b/2020/d02/ex2/ex2.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +import re +import sys +from dataclasses import dataclass +from typing import List + + +@dataclass +class Policy: + min: int + max: int + letter: str + + +@dataclass +class Password: + policy: Policy + password: str + + +def is_valid(pwd: Password) -> bool: + min = pwd.password[pwd.policy.min - 1] == pwd.policy.letter + max = pwd.password[pwd.policy.max - 1] == pwd.policy.letter + return min ^ max + + +def solve(passwords: List[Password]) -> int: + return sum(map(is_valid, passwords)) + + +def main() -> None: + pattern = re.compile("([0-9]+)-([0-9]+) (.): (.+)") + input = [ + Password(Policy(int(m.group(1)), int(m.group(2)), m.group(3)), m.group(4)) + for m in (pattern.match(line) for line in sys.stdin.readlines()) + if m + ] + print(solve(input)) + + +if __name__ == "__main__": + main() From a268eb1f1e4fec7644e3d29e7c9783571ad067be Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 15:49:22 +0100 Subject: [PATCH 065/479] 2019: d18: ex1: add input --- 2019/d18/ex1/input | 81 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 2019/d18/ex1/input diff --git a/2019/d18/ex1/input b/2019/d18/ex1/input new file mode 100644 index 0000000..f376feb --- /dev/null +++ b/2019/d18/ex1/input @@ -0,0 +1,81 @@ +################################################################################# +#.......#...#...#...........#.....#...#.#.....#m......#.......#.....#........u..# +#####.#.#.#.#.#.###.#######.###.#.#.#.#.#.###.###.#####.#.###.###.#.###########.# +#.....#...#...#.....#.#.....#...#...#...#.#....e#.......#...#.....#.....#.......# +#.###################.#.#####.#########.#.#####.###########.###########.#.####### +#.#...#...#...........#.#.....#.......#.#.....#.....#.....#...#.......#.#.#.....# +#.#S#.###.#.#####.#####.#.###.#.###.###.#####.#####.#.###.###.#.#.#####.#.#.###.# +#.#.#...#.#...#.#.......#.#.#.#.#...#...#.D.#.#...#...#.#.#...#.#.#.....#j..#...# +#.#.###.#.###.#.#########.#.#.###.###.###.#.#.#.#.#####.#.#.###.###.#########.### +#.#...#.#...#...#.#.........#...#.#...#.#.#...#.#.....#...#...#...#.#.#.....#...# +#.###.#.###.###.#.#.#########.#.#.#.###.#.#####.#####.#.#####.###.#.#.#.#.#.###.# +#...#.#c..#.....#.......#...#.#.#.#.#...#...#.....#.#.#.#.....#...#.#...#.#...#.# +#.###.###.#.#############.#.###.#.#.#.#.###.#####.#.#.#.#.#####.###.#.###.###.#.# +#.#...#.#.#.........#.....#...#.#.....#.#.#...#.#...#.#...#...#.....#.#...#...K.# +#.#.###.#.#########.#.#######.#.#########.###.#.###.#.#####.#.#.#######.######### +#.......#.#.......#h..#.....#.#.........#...#.#.....#.......#...#.....#.#...#...# +#.#######.#O#####.#######.#.#.#.#######.###.#.#.#######.#######.#.###F#.#.#.#.#.# +#.#....y..#...#...#.....#.#.#.#.#.#.....#...#.#.#.....#.#.....#...#.#.#...#.#.#.# +###.#####.###.#.###.###.#.###.#.#.#.###.#.#.#.###.###.#.#.###.#####.#.#.###.#.#.# +#...#.....#.#.#...#.#.Z.#...#.#.#.#.#...#.#.#.....#.#.#.#.#.#...#.....#...#...#.# +#.###.#####.#.###A#.#.###.#.#.#.#.#.#####.#########.#.#.#.#.###.#.#########.###.# +#.#.#.#.....#.#.#...#.#...#...#...#.....#.#.........#.#.#.#.#...#.#.......#.#...# +#.#.#.#####.#.#.#######.#########.#####.#.#.#####.#.#.#.#.#.#####.#.###.#.###.#.# +#.#.#...#...#.#...#.....#.....#.......#.#.#.#.#...#.#.#.#.#.....#.#.#...#.....#.# +#.#.###.#.#.#.###.#.#######.#.#####.###.#.#.#.#.#####.#.#.#.#.###.###.#########X# +#.#...#...#.#...#.#...#.....#.....#.#...#.....#.#...#.#.#.#.#...#...#.....#.....# +#.#W#.#####.###N#.###.#.#.#######.###.#.#######.#.#.#.###.#.###.###.#####.###.### +#i#.#.....#.#.#.#...#.#.#.#.....#.....#.#..r..#...#.#...#.#.#.....#.#...#...#.#.# +#.#######.#.#.#.#.###.###.#.###########.#.###.#.###.###.#.###.#####.#.#.###.#.#.# +#.......#...#.#.#...#...#.#.............#.#.#.#.#.#...#...#...#.....#.#.....#.#.# +#.#####.#.###.#.#.#.###.#.#.#############.#.#.#.#.###.#####.###.#####.#######.#.# +#.#.#...#.....#.#.#...#..t#...#.#.......#.#.#.#...#.....#.....#...#...#.....#.#.# +#.#.#.#######.#.#.###.#######.#.#.#.#####.#.#.#.###.###.#####.###.###.#.###.#.#.# +#...#.#...#...#.#...#.....#.#.#...#.....#.#.#.#.#...#.........#.#...#...T.#.#...# +###.#.#.#.#.###.###.#.###.#.#.#########.#.#.#.###.###########.#.###.#####.#.###.# +#...#...#.#.#...#...#...#...#.......#...#.#.#...#.#.....#...#...#...#...#.#...#.# +#.#######.###.###.#####.###########.#.###.#.###.#.#.###.#.#.###.#.###.#.#####.### +#.#...#v#...#.#.#.....#.........#...#...#.#.......#...#..l#...#.#.....#.....#.P.# +#.#.#.#.###.#.#.#####.#########.#.#####.#.###########.#######.#############.###.# +#...#.....#...#...............#.............................#....b..............# +#######################################.@.####################################### +#...#.#.........#.....#...........#...........#...#.....#.......#...#.....Q.#...# +#.#.#.#.#####.###.#.#.#.#####.###.#.###.#.###.#.#.#.###.#.#####.#.#.#.#.###.###.# +#.#.#.#.#...#.....#.#.#.#.#...#...#...#.#.#.....#.#...#...#.....#.#.#.#...#.#...# +#.#.#.#.#.#.#######.###.#.#.#####.###.#.#.#######.###.#####.#####.#.#.###.#.#.#.# +#.#...#.#.#.....#.#.#.B...#.....#.#...#.#.....#.....#.#...#.......#.#.#...#...#.# +#.#####.#.#####.#.#.#.#######.#.###.###.#.###.###.###.#.#####.#####.#.#.#######.# +#.#...#q#..f#.....#...#.....#.#...#.#...#.#.#...#.#.....#...#.#...#...#.#.....#.# +#.#.#.#.#.#.#######.###.###.###.#.#.#.###.#.###.###.#####.#.#.###.#####.#.###.#.# +#...#.#.#.#...#...#p..#.#.#...#.#...#...#.....#...#.#.....#.#.....#...#...#...#.# +#####.#.#####.#.#.###.#.#.###.#########.#####.###.#.#.#####.#####.###.#####.###.# +#.....#.......#.#.#...#.#...#.#.......#.#...#.#.#...#.#...#.....#.....#.#...#.#.# +#.###########.#.#.#####.###.#L#.#####R#.#.#.#.#.#####.#.#.#####.#####.#.#.###.#.# +#...........#.#.#.......#...#...#...#...#.#.#.....#...#.#.....#...#...#.#...#...# +#######.###.#.#.#########.#.#####.#.#######.#####.#.#######.#.###.#.###.###.###.# +#.......#...#.#.#.........#.......#.....#...#.....#.#.....#.#...#.#...#...#...#.# +#.#######.###.#.#.###.#################.#.###.#####.#.#.#.###.###.###.###.###.#.# +#.#.........#.#.#...#.............#.....#.........#.#.#.#.....#...#.#.......#.#.# +#.###.#######.#.###########.#####.#.###############.###.#####.#.###.#.#####.#.### +#...#.#.......#.#.........#.#...#.#.#...#.......#...#...#.#...#.#.....#...#.#...# +#.#G###.#######.#.#######.#.###.#.###.#.#.#####.#.###.###.#.###.#######.#.#####.# +#.#...#....x#.#.#.#z#.....#.....#.....#.#.....#...#...#...#.#...#.......#.#...#.# +#.###.#####.#.#.#.#.#########.#########.#####.#######.#.###.#####.#######.#.#.#.# +#k#.#.....#...#...#.#.....#...#.......#.#...#.#.......#.#...#.....#.#...#...#.#.# +#.#.#####.###.#####.#.###.#.###.#####.#.#.#.#.#.#.#####.#.###.#####.#.#.#####.#H# +#.#.....#...#.....#.#...#.#.#...#...#...#.#...#.#.#.....#.#...#...#...#...#.#.#.# +#.#.###.###.#####.#.###.#.#.#.###.#.###.#.#######.#.###.#.#.###.#.#.###.#Y#.#.#.# +#...#...#.#...#...#.....#..o#.#.#.#.....#.#.......#.#...#...#...#...#...#...#..g# +#####.###.#.###.#######.#####.#.#.#######.#####.###.###.#############.#####.###.# +#...#.#...#.....#.....#.....#.#.#...#...#.......#.....#...#...........#.#...#...# +#.#.#.###.#######.###.#######.#.###.#.###########.###.###.#.###########.#.###.### +#.#.#.#.....#.#.....#.#.......#...#.#...#...#...#...#.#...#.......#...#.I.#.#...# +#.#.#.#.###.#.#.###.#.#.#######.#.#.###.#.###.#.#.###.#.#########.###.#.###.###.# +#.#.#.#.#...#s....#.#.#.......#a#.#.....#.#...#.#.#...#.....#.....#...#.....#.#.# +#.###M#U###.#####.#.#.###.###.###.#####.#.#.###.#.#.#.#####.#.#####.#V#####.#.#.# +#.....#...#...#...#.#...#...#.#...#....n#.#...#d..#.#.#.J.#...#.....#...#..w#.#.# +#.#######.###.#####.###.#####.#.###.#####.###.#####.#.#.#.###.#####.#####.###.#.# +#.......#.#.#...#...#.#.....#.#...#.#...#...#.#.#...#.#.#.#...#...#...........#.# +#######.#.#.###E#.###.#####.#.#.#.#.###.#.###.#.#.#####.#.#####.#.#############.# +#.........#.......#.........C.#.#.......#.......#.......#.......#...............# +################################################################################# From 30fe0f57860085ff7238ebc989eaebc13dc95a0f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 15:49:28 +0100 Subject: [PATCH 066/479] 2019: d18: ex1: add solution --- 2019/d18/ex1/ex1.py | 128 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100755 2019/d18/ex1/ex1.py diff --git a/2019/d18/ex1/ex1.py b/2019/d18/ex1/ex1.py new file mode 100755 index 0000000..1968be5 --- /dev/null +++ b/2019/d18/ex1/ex1.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python +import heapq +import sys +from collections import defaultdict, deque +from dataclasses import dataclass +from functools import lru_cache +from math import inf +from typing import DefaultDict, Deque, Dict, FrozenSet, Iterator, List, Tuple, Union + +RawGrid = List[str] +GraphInfo = List[Tuple[str, int]] +Graph = Dict[str, GraphInfo] + + +@dataclass(eq=True, frozen=True) # Hash-able +class Position: + x: int + y: int + + +def neighbours(grid: RawGrid, pos: Position) -> Iterator[Position]: + for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)): + new_pos = Position(pos.x + dx, pos.y + dy) + if not (0 <= new_pos.x < len(grid) and 0 <= new_pos.y < len(grid[0])): + continue + if grid[new_pos.x][new_pos.y] == "#": + continue + yield new_pos + + +def find_adjacent(grid: RawGrid, pos: Position) -> GraphInfo: + queue: Deque[Tuple[Position, int]] = deque() + visited = {pos} + adjacent: GraphInfo = [] + + for n in neighbours(grid, pos): + queue.append((n, 1)) # Distance is 1 + + while queue: + n, d = queue.popleft() + if n in visited: + continue + visited |= {n} + cell = grid[n.x][n.y] + + if cell not in "#.@": # We don't care about those + adjacent.append((cell, d)) + continue # Do not go through doors and keys + + for neighbour in neighbours(grid, n): + queue.append((neighbour, d + 1)) + + return adjacent + + +def build_graph(grid: RawGrid) -> Graph: + graph = {} + + for x, row in enumerate(grid): + for y, cell in enumerate(row): + if cell not in "#.": + graph[cell] = find_adjacent(grid, Position(x, y)) + + return graph + + +def solve(G: Graph, start: str) -> int: + @lru_cache(2 ** 20) + def reachable_keys(src: str, found: FrozenSet[str]) -> List[Tuple[str, int]]: + queue = [] + distance: DefaultDict[str, Union[float, int]] = defaultdict(lambda: inf) + reachable: List[Tuple[str, int]] = [] + + for neighbor, weight in G[src]: + queue.append((weight, neighbor)) # Weight first for heap comparisons + + heapq.heapify(queue) + + while queue: + dist, node = heapq.heappop(queue) + + # Do key, add it to reachable if not found previously + if node.islower() and node not in found: + reachable.append((node, dist)) + continue + + # Do door, if not opened by a key that was found in the search + if node.lower() not in found: + continue + + # If not a key and not a closed door + for neighbor, weight in G[node]: + new_dist = dist + weight + if new_dist < distance[neighbor]: + distance[neighbor] = new_dist + heapq.heappush(queue, (new_dist, neighbor)) + + return reachable + + @lru_cache(2 ** 20) + def min_steps( + src: str, keys_to_find: int, found: FrozenSet[str] = frozenset() + ) -> int: + if keys_to_find == 0: + return 0 + + best = inf + + for key, dist in reachable_keys(src, found): + new_keys = found | {key} + dist += min_steps(key, keys_to_find - 1, new_keys) + + if dist < best: + best = dist + + return int(best) # That way we throw if we kept the infinite float + + total_keys = sum(node.islower() for node in G) + return min_steps(start, total_keys) + + +def main() -> None: + G = build_graph(list(line.strip() for line in sys.stdin.readlines())) + print(solve(G, "@")) + + +if __name__ == "__main__": + main() From ebeebbe5eaee9ab0c0d4ad01a36836199411e029 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 16:43:38 +0100 Subject: [PATCH 067/479] 2019: d18: ex2: add input --- 2019/d18/ex2/input | 81 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 2019/d18/ex2/input diff --git a/2019/d18/ex2/input b/2019/d18/ex2/input new file mode 100644 index 0000000..9596324 --- /dev/null +++ b/2019/d18/ex2/input @@ -0,0 +1,81 @@ +################################################################################# +#.......#...#...#...........#.....#...#.#.....#m......#.......#.....#........u..# +#####.#.#.#.#.#.###.#######.###.#.#.#.#.#.###.###.#####.#.###.###.#.###########.# +#.....#...#...#.....#.#.....#...#...#...#.#....e#.......#...#.....#.....#.......# +#.###################.#.#####.#########.#.#####.###########.###########.#.####### +#.#...#...#...........#.#.....#.......#.#.....#.....#.....#...#.......#.#.#.....# +#.#S#.###.#.#####.#####.#.###.#.###.###.#####.#####.#.###.###.#.#.#####.#.#.###.# +#.#.#...#.#...#.#.......#.#.#.#.#...#...#.D.#.#...#...#.#.#...#.#.#.....#j..#...# +#.#.###.#.###.#.#########.#.#.###.###.###.#.#.#.#.#####.#.#.###.###.#########.### +#.#...#.#...#...#.#.........#...#.#...#.#.#...#.#.....#...#...#...#.#.#.....#...# +#.###.#.###.###.#.#.#########.#.#.#.###.#.#####.#####.#.#####.###.#.#.#.#.#.###.# +#...#.#c..#.....#.......#...#.#.#.#.#...#...#.....#.#.#.#.....#...#.#...#.#...#.# +#.###.###.#.#############.#.###.#.#.#.#.###.#####.#.#.#.#.#####.###.#.###.###.#.# +#.#...#.#.#.........#.....#...#.#.....#.#.#...#.#...#.#...#...#.....#.#...#...K.# +#.#.###.#.#########.#.#######.#.#########.###.#.###.#.#####.#.#.#######.######### +#.......#.#.......#h..#.....#.#.........#...#.#.....#.......#...#.....#.#...#...# +#.#######.#O#####.#######.#.#.#.#######.###.#.#.#######.#######.#.###F#.#.#.#.#.# +#.#....y..#...#...#.....#.#.#.#.#.#.....#...#.#.#.....#.#.....#...#.#.#...#.#.#.# +###.#####.###.#.###.###.#.###.#.#.#.###.#.#.#.###.###.#.#.###.#####.#.#.###.#.#.# +#...#.....#.#.#...#.#.Z.#...#.#.#.#.#...#.#.#.....#.#.#.#.#.#...#.....#...#...#.# +#.###.#####.#.###A#.#.###.#.#.#.#.#.#####.#########.#.#.#.#.###.#.#########.###.# +#.#.#.#.....#.#.#...#.#...#...#...#.....#.#.........#.#.#.#.#...#.#.......#.#...# +#.#.#.#####.#.#.#######.#########.#####.#.#.#####.#.#.#.#.#.#####.#.###.#.###.#.# +#.#.#...#...#.#...#.....#.....#.......#.#.#.#.#...#.#.#.#.#.....#.#.#...#.....#.# +#.#.###.#.#.#.###.#.#######.#.#####.###.#.#.#.#.#####.#.#.#.#.###.###.#########X# +#.#...#...#.#...#.#...#.....#.....#.#...#.....#.#...#.#.#.#.#...#...#.....#.....# +#.#W#.#####.###N#.###.#.#.#######.###.#.#######.#.#.#.###.#.###.###.#####.###.### +#i#.#.....#.#.#.#...#.#.#.#.....#.....#.#..r..#...#.#...#.#.#.....#.#...#...#.#.# +#.#######.#.#.#.#.###.###.#.###########.#.###.#.###.###.#.###.#####.#.#.###.#.#.# +#.......#...#.#.#...#...#.#.............#.#.#.#.#.#...#...#...#.....#.#.....#.#.# +#.#####.#.###.#.#.#.###.#.#.#############.#.#.#.#.###.#####.###.#####.#######.#.# +#.#.#...#.....#.#.#...#..t#...#.#.......#.#.#.#...#.....#.....#...#...#.....#.#.# +#.#.#.#######.#.#.###.#######.#.#.#.#####.#.#.#.###.###.#####.###.###.#.###.#.#.# +#...#.#...#...#.#...#.....#.#.#...#.....#.#.#.#.#...#.........#.#...#...T.#.#...# +###.#.#.#.#.###.###.#.###.#.#.#########.#.#.#.###.###########.#.###.#####.#.###.# +#...#...#.#.#...#...#...#...#.......#...#.#.#...#.#.....#...#...#...#...#.#...#.# +#.#######.###.###.#####.###########.#.###.#.###.#.#.###.#.#.###.#.###.#.#####.### +#.#...#v#...#.#.#.....#.........#...#...#.#.......#...#..l#...#.#.....#.....#.P.# +#.#.#.#.###.#.#.#####.#########.#.#####.#.###########.#######.#############.###.# +#...#.....#...#...............#........1#2..................#....b..............# +########################################@.####################################### +#...#.#.........#.....#...........#....3#4....#...#.....#.......#...#.....Q.#...# +#.#.#.#.#####.###.#.#.#.#####.###.#.###.#.###.#.#.#.###.#.#####.#.#.#.#.###.###.# +#.#.#.#.#...#.....#.#.#.#.#...#...#...#.#.#.....#.#...#...#.....#.#.#.#...#.#...# +#.#.#.#.#.#.#######.###.#.#.#####.###.#.#.#######.###.#####.#####.#.#.###.#.#.#.# +#.#...#.#.#.....#.#.#.B...#.....#.#...#.#.....#.....#.#...#.......#.#.#...#...#.# +#.#####.#.#####.#.#.#.#######.#.###.###.#.###.###.###.#.#####.#####.#.#.#######.# +#.#...#q#..f#.....#...#.....#.#...#.#...#.#.#...#.#.....#...#.#...#...#.#.....#.# +#.#.#.#.#.#.#######.###.###.###.#.#.#.###.#.###.###.#####.#.#.###.#####.#.###.#.# +#...#.#.#.#...#...#p..#.#.#...#.#...#...#.....#...#.#.....#.#.....#...#...#...#.# +#####.#.#####.#.#.###.#.#.###.#########.#####.###.#.#.#####.#####.###.#####.###.# +#.....#.......#.#.#...#.#...#.#.......#.#...#.#.#...#.#...#.....#.....#.#...#.#.# +#.###########.#.#.#####.###.#L#.#####R#.#.#.#.#.#####.#.#.#####.#####.#.#.###.#.# +#...........#.#.#.......#...#...#...#...#.#.#.....#...#.#.....#...#...#.#...#...# +#######.###.#.#.#########.#.#####.#.#######.#####.#.#######.#.###.#.###.###.###.# +#.......#...#.#.#.........#.......#.....#...#.....#.#.....#.#...#.#...#...#...#.# +#.#######.###.#.#.###.#################.#.###.#####.#.#.#.###.###.###.###.###.#.# +#.#.........#.#.#...#.............#.....#.........#.#.#.#.....#...#.#.......#.#.# +#.###.#######.#.###########.#####.#.###############.###.#####.#.###.#.#####.#.### +#...#.#.......#.#.........#.#...#.#.#...#.......#...#...#.#...#.#.....#...#.#...# +#.#G###.#######.#.#######.#.###.#.###.#.#.#####.#.###.###.#.###.#######.#.#####.# +#.#...#....x#.#.#.#z#.....#.....#.....#.#.....#...#...#...#.#...#.......#.#...#.# +#.###.#####.#.#.#.#.#########.#########.#####.#######.#.###.#####.#######.#.#.#.# +#k#.#.....#...#...#.#.....#...#.......#.#...#.#.......#.#...#.....#.#...#...#.#.# +#.#.#####.###.#####.#.###.#.###.#####.#.#.#.#.#.#.#####.#.###.#####.#.#.#####.#H# +#.#.....#...#.....#.#...#.#.#...#...#...#.#...#.#.#.....#.#...#...#...#...#.#.#.# +#.#.###.###.#####.#.###.#.#.#.###.#.###.#.#######.#.###.#.#.###.#.#.###.#Y#.#.#.# +#...#...#.#...#...#.....#..o#.#.#.#.....#.#.......#.#...#...#...#...#...#...#..g# +#####.###.#.###.#######.#####.#.#.#######.#####.###.###.#############.#####.###.# +#...#.#...#.....#.....#.....#.#.#...#...#.......#.....#...#...........#.#...#...# +#.#.#.###.#######.###.#######.#.###.#.###########.###.###.#.###########.#.###.### +#.#.#.#.....#.#.....#.#.......#...#.#...#...#...#...#.#...#.......#...#.I.#.#...# +#.#.#.#.###.#.#.###.#.#.#######.#.#.###.#.###.#.#.###.#.#########.###.#.###.###.# +#.#.#.#.#...#s....#.#.#.......#a#.#.....#.#...#.#.#...#.....#.....#...#.....#.#.# +#.###M#U###.#####.#.#.###.###.###.#####.#.#.###.#.#.#.#####.#.#####.#V#####.#.#.# +#.....#...#...#...#.#...#...#.#...#....n#.#...#d..#.#.#.J.#...#.....#...#..w#.#.# +#.#######.###.#####.###.#####.#.###.#####.###.#####.#.#.#.###.#####.#####.###.#.# +#.......#.#.#...#...#.#.....#.#...#.#...#...#.#.#...#.#.#.#...#...#...........#.# +#######.#.#.###E#.###.#####.#.#.#.#.###.#.###.#.#.#####.#.#####.#.#############.# +#.........#.......#.........C.#.#.......#.......#.......#.......#...............# +################################################################################# From 09b8e80ca2efc40d1661fe283332ba7cf4526ef7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 16:43:49 +0100 Subject: [PATCH 068/479] 2019: d18: ex2: add solution --- 2019/d18/ex2/ex2.py | 130 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100755 2019/d18/ex2/ex2.py diff --git a/2019/d18/ex2/ex2.py b/2019/d18/ex2/ex2.py new file mode 100755 index 0000000..4463618 --- /dev/null +++ b/2019/d18/ex2/ex2.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python +import heapq +import sys +from collections import defaultdict, deque +from dataclasses import dataclass +from functools import lru_cache +from math import inf +from typing import DefaultDict, Deque, Dict, FrozenSet, Iterator, List, Tuple, Union + +RawGrid = List[str] +GraphInfo = List[Tuple[str, int]] +Graph = Dict[str, GraphInfo] + + +@dataclass(eq=True, frozen=True) # Hash-able +class Position: + x: int + y: int + + +def neighbours(grid: RawGrid, pos: Position) -> Iterator[Position]: + for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)): + new_pos = Position(pos.x + dx, pos.y + dy) + if not (0 <= new_pos.x < len(grid) and 0 <= new_pos.y < len(grid[0])): + continue + if grid[new_pos.x][new_pos.y] == "#": + continue + yield new_pos + + +def find_adjacent(grid: RawGrid, pos: Position) -> GraphInfo: + queue: Deque[Tuple[Position, int]] = deque() + visited = {pos} + adjacent: GraphInfo = [] + + for n in neighbours(grid, pos): + queue.append((n, 1)) # Distance is 1 + + while queue: + n, d = queue.popleft() + if n in visited: + continue + visited |= {n} + cell = grid[n.x][n.y] + + if cell not in "#.1234": # We don't care about those + adjacent.append((cell, d)) + continue # Do not go through doors and keys + + for neighbour in neighbours(grid, n): + queue.append((neighbour, d + 1)) + + return adjacent + + +def build_graph(grid: RawGrid) -> Graph: + graph = {} + + for x, row in enumerate(grid): + for y, cell in enumerate(row): + if cell not in "#.": + graph[cell] = find_adjacent(grid, Position(x, y)) + + return graph + + +def solve(G: Graph, start: str) -> int: + @lru_cache(2 ** 20) + def reachable_keys(src: str, found: FrozenSet[str]) -> GraphInfo: + queue = [] + distance: DefaultDict[str, Union[float, int]] = defaultdict(lambda: inf) + reachable: GraphInfo = [] + + for neighbor, weight in G[src]: + queue.append((weight, neighbor)) # Weight first for heap comparisons + + heapq.heapify(queue) + + while queue: + dist, node = heapq.heappop(queue) + + # Do key, add it to reachable if not found previously + if node.islower() and node not in found: + reachable.append((node, dist)) + continue + + # Do door, if not opened by a key that was found in the search + if node.lower() not in found: + continue + + # If not a key and not a closed door + for neighbor, weight in G[node]: + new_dist = dist + weight + if new_dist < distance[neighbor]: + distance[neighbor] = new_dist + heapq.heappush(queue, (new_dist, neighbor)) + + return reachable + + @lru_cache(2 ** 20) + def min_steps( + sources: str, keys_to_find: int, found: FrozenSet[str] = frozenset() + ) -> Union[float, int]: + if keys_to_find == 0: + return 0 + + best = inf + + for src in sources: + for key, dist in reachable_keys(src, found): + new_keys = found | {key} + new_sources = sources.replace(src, key) + new_dist = dist + min_steps(new_sources, keys_to_find - 1, new_keys) + + if new_dist < best: + best = new_dist + + return best + + total_keys = sum(node.islower() for node in G) + return int(min_steps(start, total_keys)) # Throw if we kept the infinite float + + +def main() -> None: + G = build_graph(list(line.strip() for line in sys.stdin.readlines())) + print(solve(G, "1234")) + + +if __name__ == "__main__": + main() From 5c8bee87413866f24cc51f5bacd59991e78a5716 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 18:16:20 +0100 Subject: [PATCH 069/479] 2019: d19: ex1: add input --- 2019/d19/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d19/ex1/input diff --git a/2019/d19/ex1/input b/2019/d19/ex1/input new file mode 100644 index 0000000..0647194 --- /dev/null +++ b/2019/d19/ex1/input @@ -0,0 +1 @@ +109,424,203,1,21102,11,1,0,1106,0,282,21102,18,1,0,1106,0,259,1201,1,0,221,203,1,21102,31,1,0,1106,0,282,21101,38,0,0,1106,0,259,21002,23,1,2,22102,1,1,3,21101,1,0,1,21102,57,1,0,1105,1,303,2102,1,1,222,20101,0,221,3,20101,0,221,2,21102,259,1,1,21101,80,0,0,1106,0,225,21101,0,44,2,21102,91,1,0,1105,1,303,1201,1,0,223,20101,0,222,4,21101,0,259,3,21102,225,1,2,21101,225,0,1,21102,118,1,0,1105,1,225,21002,222,1,3,21101,100,0,2,21101,133,0,0,1105,1,303,21202,1,-1,1,22001,223,1,1,21101,148,0,0,1106,0,259,2102,1,1,223,20102,1,221,4,21002,222,1,3,21102,1,12,2,1001,132,-2,224,1002,224,2,224,1001,224,3,224,1002,132,-1,132,1,224,132,224,21001,224,1,1,21102,1,195,0,106,0,108,20207,1,223,2,21002,23,1,1,21102,-1,1,3,21101,0,214,0,1105,1,303,22101,1,1,1,204,1,99,0,0,0,0,109,5,2102,1,-4,249,21201,-3,0,1,22101,0,-2,2,22101,0,-1,3,21101,0,250,0,1105,1,225,22102,1,1,-4,109,-5,2106,0,0,109,3,22107,0,-2,-1,21202,-1,2,-1,21201,-1,-1,-1,22202,-1,-2,-2,109,-3,2106,0,0,109,3,21207,-2,0,-1,1206,-1,294,104,0,99,21202,-2,1,-2,109,-3,2105,1,0,109,5,22207,-3,-4,-1,1206,-1,346,22201,-4,-3,-4,21202,-3,-1,-1,22201,-4,-1,2,21202,2,-1,-1,22201,-4,-1,1,22102,1,-2,3,21101,0,343,0,1105,1,303,1105,1,415,22207,-2,-3,-1,1206,-1,387,22201,-3,-2,-3,21202,-2,-1,-1,22201,-3,-1,3,21202,3,-1,-1,22201,-3,-1,2,21201,-4,0,1,21101,0,384,0,1106,0,303,1106,0,415,21202,-4,-1,-4,22201,-4,-3,-4,22202,-3,-2,-2,22202,-2,-4,-4,22202,-3,-2,-3,21202,-4,-1,-2,22201,-3,-2,1,22102,1,1,-4,109,-5,2106,0,0 From 3ad3b9df5d3591602102f9631d2b79f9283dfaf1 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 18:16:26 +0100 Subject: [PATCH 070/479] 2019: d19: ex1: add solution --- 2019/d19/ex1/ex1.py | 214 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100755 2019/d19/ex1/ex1.py diff --git a/2019/d19/ex1/ex1.py b/2019/d19/ex1/ex1.py new file mode 100755 index 0000000..0e1d70d --- /dev/null +++ b/2019/d19/ex1/ex1.py @@ -0,0 +1,214 @@ +#!/usr/bin/env python + +import sys +from copy import deepcopy +from dataclasses import dataclass, field +from enum import IntEnum +from itertools import product +from typing import List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self) -> None: # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + + lines: List[List[int]] = [[0 for i in range(50)] for __ in range(50)] + for x, y in product(range(50), range(50)): + drone = Computer(deepcopy(memory), input_list=[x, y]) + drone.run_no_output_interrupt() + assert len(drone.output_list) == 1 + lines[x][y] = drone.output_list.pop() + print(sum(map(sum, lines))) + + +if __name__ == "__main__": + main() From ddf4217147c6fe953c3fb0861630531ce985cb2d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 18:16:38 +0100 Subject: [PATCH 071/479] 2019: d19: ex2: add input --- 2019/d19/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2019/d19/ex2/input diff --git a/2019/d19/ex2/input b/2019/d19/ex2/input new file mode 100644 index 0000000..0647194 --- /dev/null +++ b/2019/d19/ex2/input @@ -0,0 +1 @@ +109,424,203,1,21102,11,1,0,1106,0,282,21102,18,1,0,1106,0,259,1201,1,0,221,203,1,21102,31,1,0,1106,0,282,21101,38,0,0,1106,0,259,21002,23,1,2,22102,1,1,3,21101,1,0,1,21102,57,1,0,1105,1,303,2102,1,1,222,20101,0,221,3,20101,0,221,2,21102,259,1,1,21101,80,0,0,1106,0,225,21101,0,44,2,21102,91,1,0,1105,1,303,1201,1,0,223,20101,0,222,4,21101,0,259,3,21102,225,1,2,21101,225,0,1,21102,118,1,0,1105,1,225,21002,222,1,3,21101,100,0,2,21101,133,0,0,1105,1,303,21202,1,-1,1,22001,223,1,1,21101,148,0,0,1106,0,259,2102,1,1,223,20102,1,221,4,21002,222,1,3,21102,1,12,2,1001,132,-2,224,1002,224,2,224,1001,224,3,224,1002,132,-1,132,1,224,132,224,21001,224,1,1,21102,1,195,0,106,0,108,20207,1,223,2,21002,23,1,1,21102,-1,1,3,21101,0,214,0,1105,1,303,22101,1,1,1,204,1,99,0,0,0,0,109,5,2102,1,-4,249,21201,-3,0,1,22101,0,-2,2,22101,0,-1,3,21101,0,250,0,1105,1,225,22102,1,1,-4,109,-5,2106,0,0,109,3,22107,0,-2,-1,21202,-1,2,-1,21201,-1,-1,-1,22202,-1,-2,-2,109,-3,2106,0,0,109,3,21207,-2,0,-1,1206,-1,294,104,0,99,21202,-2,1,-2,109,-3,2105,1,0,109,5,22207,-3,-4,-1,1206,-1,346,22201,-4,-3,-4,21202,-3,-1,-1,22201,-4,-1,2,21202,2,-1,-1,22201,-4,-1,1,22102,1,-2,3,21101,0,343,0,1105,1,303,1105,1,415,22207,-2,-3,-1,1206,-1,387,22201,-3,-2,-3,21202,-2,-1,-1,22201,-3,-1,3,21202,3,-1,-1,22201,-3,-1,2,21201,-4,0,1,21101,0,384,0,1106,0,303,1106,0,415,21202,-4,-1,-4,22201,-4,-3,-4,22202,-3,-2,-2,22202,-2,-4,-4,22202,-3,-2,-3,21202,-4,-1,-2,22201,-3,-2,1,22102,1,1,-4,109,-5,2106,0,0 From f9852eac25cc929159b32bb97cc05139ee69ef6d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 2 Dec 2020 18:16:49 +0100 Subject: [PATCH 072/479] 2019: d19: ex2: add solution --- 2019/d19/ex2/ex2.py | 221 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100755 2019/d19/ex2/ex2.py diff --git a/2019/d19/ex2/ex2.py b/2019/d19/ex2/ex2.py new file mode 100755 index 0000000..8dd132c --- /dev/null +++ b/2019/d19/ex2/ex2.py @@ -0,0 +1,221 @@ +#!/usr/bin/env python + +import sys +from copy import deepcopy +from dataclasses import dataclass, field +from enum import IntEnum +from typing import List, NamedTuple + + +class ParameterMode(IntEnum): + POSITION = 0 # Acts on address + IMMEDIATE = 1 # Acts on the immediate value + RELATIVE = 2 # Acts on offset to relative base + + +class Instruction(NamedTuple): + address: int # The address of the instruction, for convenience + op: int # The opcode + p1_mode: ParameterMode # Which mode is the first parameter in + p2_mode: ParameterMode # Which mode is the second parameter in + p3_mode: ParameterMode # Which mode is the third parameter in + + +def lookup_ops(index: int, memory: List[int]) -> Instruction: + digits = list(map(int, str(memory[index]))) + a, b, c, d, e = [0] * (5 - len(digits)) + digits # Pad with default values + return Instruction( + address=index, + op=d * 10 + e, + p1_mode=ParameterMode(c), + p2_mode=ParameterMode(b), + p3_mode=ParameterMode(a), + ) + + +class InputInterrupt(Exception): + pass + + +class OutputInterrupt(Exception): + pass + + +@dataclass +class Computer: + memory: List[int] # Memory space + rip: int = 0 # Instruction pointer + input_list: List[int] = field(default_factory=list) + output_list: List[int] = field(default_factory=list) + is_halted: bool = field(default=False, init=False) + relative_base: int = field(default=0, init=False) + + def run(self) -> None: + while not self.is_halted: + self.run_single() + + def run_no_output_interrupt(self) -> None: + while not self.is_halted: + try: + self.run_single() + except OutputInterrupt: + continue + + def run_single(self) -> None: # Returns True when halted + instr = lookup_ops(self.rip, self.memory) + if instr.op == 99: # Halt + self.is_halted = True + elif instr.op == 1: # Sum + self._do_addition(instr) + elif instr.op == 2: # Multiplication + self._do_multiplication(instr) + elif instr.op == 3: # Load from input + self._do_input(instr) + elif instr.op == 4: # Store to output + self._do_output(instr) + elif instr.op == 5: # Jump if true + self._do_jump_if_true(instr) + elif instr.op == 6: # Jump if false + self._do_jump_if_false(instr) + elif instr.op == 7: # Less than + self._do_less_than(instr) + elif instr.op == 8: # Equal to + self._do_equal_to(instr) + elif instr.op == 9: # Change relative base + self._do_change_relative_base(instr) + else: + assert False # Sanity check + + def _fill_to_addres(self, address: int) -> None: + values = address - len(self.memory) + 1 + if values <= 0: + return + for __ in range(values): + self.memory.append(0) + + def _get_value(self, mode: ParameterMode, val: int) -> int: + if mode == ParameterMode.POSITION: + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + elif mode == ParameterMode.RELATIVE: + val += self.relative_base + assert 0 <= val # Sanity check + self._fill_to_addres(val) + return self.memory[val] + assert mode == ParameterMode.IMMEDIATE # Sanity check + return val + + def _set_value(self, mode: ParameterMode, address: int, value: int) -> None: + if mode == ParameterMode.RELATIVE: + address += self.relative_base + else: + assert mode == ParameterMode.POSITION # Sanity check + + assert address >= 0 # Sanity check + self._fill_to_addres(address) + + self.memory[address] = value + + def _do_addition(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs + rhs) + + self.rip += 4 # Length of the instruction + + def _do_multiplication(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, lhs * rhs) + + self.rip += 4 # Length of the instruction + + def _do_input(self, instr: Instruction) -> None: + if len(self.input_list) == 0: + raise InputInterrupt # No input, halt until an input is provided + + value = int(self.input_list.pop(0)) + param = self.memory[instr.address + 1] + + self._set_value(instr.p1_mode, param, value) + + self.rip += 2 # Length of the instruction + + def _do_output(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.output_list.append(value) + + self.rip += 2 # Length of the instruction + raise OutputInterrupt # Alert that we got an output to give + + def _do_jump_if_true(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond != 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_jump_if_false(self, instr: Instruction) -> None: + cond = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + value = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + + if cond == 0: + self.rip = value + else: + self.rip += 3 # Length of the instruction + + def _do_less_than(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs < rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_equal_to(self, instr: Instruction) -> None: + lhs = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + rhs = self._get_value(instr.p2_mode, self.memory[instr.address + 2]) + dest = self.memory[instr.address + 3] + + self._set_value(instr.p3_mode, dest, 1 if lhs == rhs else 0) + + self.rip += 4 # Length of the instruction + + def _do_change_relative_base(self, instr: Instruction) -> None: + value = self._get_value(instr.p1_mode, self.memory[instr.address + 1]) + + self.relative_base += value + self.rip += 2 # Length of the instruction + + +def true_at(memory: List[int], x: int, y: int) -> bool: + drone = Computer(deepcopy(memory), input_list=[x, y]) + drone.run_no_output_interrupt() + assert len(drone.output_list) == 1 + return drone.output_list.pop() == 1 + + +def main() -> None: + memory = [int(n) for n in sys.stdin.read().split(",")] + + x = 0 + y = 0 + size = 100 + while not true_at(memory, x + size - 1, y): + y += 1 + while not true_at(memory, x, y + size - 1): + x += 1 + print((x * 10000 + y)) + + +if __name__ == "__main__": + main() From 3fbdb62a6dffca7e9edc5bcd57543a9754081ca5 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 3 Dec 2020 18:21:51 +0100 Subject: [PATCH 073/479] 2020: d03: ex1: add input --- 2020/d03/ex1/input | 323 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) create mode 100644 2020/d03/ex1/input diff --git a/2020/d03/ex1/input b/2020/d03/ex1/input new file mode 100644 index 0000000..9256a36 --- /dev/null +++ b/2020/d03/ex1/input @@ -0,0 +1,323 @@ +...............#.#............. +##..#....................#...## +......#..#.#.....#..#.#.##..... +.........#...#..............#.# +............#.......##......... +...#.....#.....#...#.....#..#.. +..............#..##.#..#......# +.##.....#.....#......##.#...... +.#..........###....#...##....#. +.....#....#.#.......#......##.. +.#....#......#.......#........# +..#.#.......#..##.....##....... +...#.#....#.......#.......#...# +##.##...##..#......#.#.....#..# +.#.#.......#..#.#......#...#.#. +#.......##.......#...#......... +.....#......#.#.#.....#....##.. +.#.#........#....#..#..#....... +...#....#..###.........#.....#. +........#........#........#.... +..##..............#.....#.#..#. +.#...##.............#.#........ +....#..#...........#.......#... +..#....#.....................#. +#.#..................##......## +.#.##....#......#........#..... +.........##.....#....#...##..#. +#..........#..#.#.............# +.........#...#.#.#.#..##..##... +#...#.....#..#..#....#...#..... +..##.....#..................#.. +#..###.....#....#.......#..#... +...##.##..#............#......# +........###.........###......#. +#..##....#.........#.........#. +....#.....................#.... +#..#..##..#..####.##..#.....##. +..#...#.#....#....##.....#..... +...#.#.........#.....#.#....... +....#................#..#...##. +....#..#..........#...#.#.##... +........#..##............#....# +...#......##..........#.##...#. +.......##...................... +.......##..........#....#.#...# +......###.##..##..#....#...#..# +#.#...........##.....#........# +..#...........#..###....#.#.#.. +........#...........#......##.. +.........#...##.###...###..#... +.....#.....#..##.........##.... +...##..............#.....#...## +.##....#.......###.....#....... +.#...........##.............##. +......#..#..##.##......#......# +........###........#......#.#.. +#.#....#.....#........#......#. +.##..#.........##...##....#.... +.....#.........#...##.....#.... +.............#........###....#. +......#.......#.#........#.#... +..#....#.#...#....#...#.#...##. +#...#......##..##......#.##.### +...##.#....#...#....#.........# +...#..####.....##.#..#.#...##.. +##.#..#....##......#......##... +###.........#.#..#.#.....#..... +...#........#..##...#.#.#..#.#. +...###..#.###.#...#............ +....................###........ +...........#...........#....... +#..............#.#.........###. +....................##.....#..# +#.#.....#.......#...#.......... +.#...#......#....##...#...#.... +.....#.##..................###. +.........#.#..#.#......#....... +.......#.....##..#.##.#........ +..#..........#.###.....#....#.. +......#.............#.#........ +........##....#........#....... +...#.............#....#.#...... +#........#..####.....#.....#.#. +.##......##...#........#..#.#.. +....##....#...#...#..##...#.#.. +#.##...###..#....##.#.......... +....#.#...#.#...#..##.###...#.. +#.....##..#..#....#.#.....##... +.#..#..........##.#.....##..... +.#..#........#.#.#.#........... +.#..#.....#...........#...#.... +...#......##..........##..#.... +...#..#....#.##...#..#.....###. +#.#....#.....##................ +#..#......#.#.#.......#........ +......#....#.#....#..##....#..# +.#.....#.#....###.##.........#. +.###..#.....#........#.#....... +.#...#......#..#.#......#.....# +#...............####...#.....#. +.......#..........##.#........# +#........##....##.....###..##.. +#..#.....#..##.....#....#..#... +#.....#.......##......#.#.....# +#.##..#......##..#............. +##...#.....#........##......... +....#..##....#...#.......#.#... +....#...#...##..#....#..#...#.. +..............#.#...#....###... +...#....#..##...##..#....##.... +#.##.#..#..#......#.#.#.#...#.. +.......#..#..##........#......# +##.#....#....##.#......##.#.... +.#...#..............#........#. +.#.#....#.........#............ +.#..#..###.............#....#.. +#......#...#.#..##..#...#....#. +.......................#...#.#. +.............#..#...##......... +..#.#..#....#....#........#.... +#......#.##..#...#.#........... +.....#....#...........##.#..#.. +..#.#.....#..............#.#... +#.......#.....#................ +#..............#...#....#...#.. +...#...##..#..#............#... +......###.....................# +.........#.......##..#....#.... +........#...#.##..#.##......#.. +....###..#.#...#...#..#.#...### +##...#...##.#...#.#...#.#....#. +.........#...#.....###......... +...#........##..#.......##..... +.#.......##.........#.....##..# +.#..................#...#...... +.##..#..#.#.....#.###.......... +...#.....##..#.........#...#... +.#......#.#.......#.#.......... +.........#.#...#..........#.#.. +#..........#.##..#.##....#..... +.#.#....#.....#..##.....#...#.. +..#........##...##..#..#....#.. +#...........##....#..###....#.. +...........##.........####...#. +..#........###...#.#.........#. +.#...............#.##.#.#...#.. +.#.##..#.....#.#.....##..#..... +...#...#..#.##.##...#.......##. +..#...#...#......##.##.##...#.. +##....#...#...#...............# +...##...........#......#..#.#.. +#.........#......#.#.##.....#.. +........#..#.........##........ +..#.#....###.....##..#...#..... +.........#...#.......#.....##.. +##.....................#...##.. +.#.#..#......#................. +.....###..#......#..###..#..... +...#.....##.........#......#..# +......##.....#...#........#.#.. +..#.#...#......#...#.##.##..... +...#..........#...#.......#..## +.###........#........##........ +..#.#.#..........#.#...##...... +.........#........#......###..# +....##..#.........#...........# +..####..#............##.......# +.....##.#..##.........#...#.#.. +...#.........#.....#.....#..... +.......#...#..#...##.........#. +...#...#..#...#....#..#........ +#............##.##...#......... +.#.#.....#.......####.....#.... +..............#......#.#....... +..............#...........#...# +#...#........###....#.#....#.#. +##.#..#..#......#......#.#.#... +.#..#.....#..#.#..#.#.......##. +......##.#...#...#......#...#.. +#...........##....#.#.......... +....#.......###.#...#.......... +.......................#.....#. +........#...#..#...#.#.#.#.#... +.#.#...........#......##...#... +.........................#..... +.................#.##.#...##... +...#...##.....#.....##....#.#.. +...#...#...................#... +...#..#..#...#...#....#........ +#....#...#.....#............... +.......#...........#...#....... +....#....#.....##.......#...... +.......#..........##........... +.#.#........#..##....#......#.. +.....#.......#.#.........#...#. +.#..####.#.#...............#..# +.....###..#..#..........#.#..## +..#.......#...#.....##..#..#.#. +#....#......#.................. +........#.##.#....#...........# +....#.#....##..#.#.....##...... +...#..#.......#....#.....#.#.#. +#...#......#.....#.#..........# +....#....#...............#..... +..###......................###. +.##....#..#.......###.....#..#. +..###............#........#.##. +.#........#......#.....#..#.... +....#..##...#...#.###.......#.# +.......#.##...........#.#..#... +.....#...##.................... +....#....#...##......#......... +..#............##....###.#...#. +.#........#...............#.... +#..#.#.##.........#..##....##.. +#.#....#..#.##....##...#.#..... +.....#.....##....#.#........#.. +#..#...#...#....#....#......... +...#........#..#.#.....##...... +..#...#...#................##.. +#........#.#.##.......#.#...#.. +#......#..####.##.....#.#..#.#. +............#..#.#....#......## +..#.....##....#...#.#.......... +...#...#.........#...#.#....... +.###..#.......##.##.....#.#.#.. +...#....#...............##.#... +....##..#..#..#.#......##.....# +#.#..............##...##...#### +.....#.##...#.#...............# +.##.....#.........#.......#.#.# +#.#..#.....#.......#.......#..# +...#.#.....#.....#......#...... +.......#....#..#.#..........#.. +......#......#.##...#.......... +.....#.......###...#...#.#..... +#..#.#.........#.....#.##....#. +..#.#.........#..#..#..#.....#. +.#..##..#..#....#......#.##..#. +...##......###.....#.##.##..... +.#.....#...#..#...#............ +##..##..#.##....#..#........... +...#..##..#..#.............#.## +...............##............#. +..#.....##........##.#...#....# +.#.#...#.#.#..#.#.....#....#... +.#....#...............#..#..... +....#.##..#....#......#...###.. +#................###...#.#..... +...#...#......##..#.#....#..... +.#....#....#.#...##............ +....#...##..#..#........#.##... +..##.....#..#..##.............. +..#..##..#.#..##....#....#....# +...##.............#............ +#....#....#.#........#.....##.# +.....#..#.#.....####...###..... +................#......#....... +.....#.#.#.#.#....#..#........# +.##.#...#.#.......##....#....#. +.....#........#................ +..#.....#..#...#..#...........# +.#.....#...##.....##..#.#....## +......#.......#..#......##.#... +#.#..........#.##.#........#... +...#..#.............#.......... +#..#..#..........#..##.#....... +.#..#...............####..#.... +.......#.....#......#.....#.#.. +.#...............#...#......... +.#..#..........#..#.#..##..#..# +......##..#.....#..#......###.. +..........#...#..#.......#..... +.#.#.#..#.....#.##.#...#..#.... +........#.......#.....#.#...... +......#.....##.....#....##.#... +...............#......#.......# +..#.#...#.....#.#...##......#.. +#.#.........#.#...#........#### +#..........##..#..#........##.. +.............#..#.......##.#..# +..#........#.#....#........#.#. +.#......####..#..#............. +............###.......#.#..#... +#.##......##...#...#.........#. +....##.#.#.#......#....#..#...# +.#..#.#....#...#.........#..... +#...#.....##............#...#.. +#.#...#..#.................#... +............#.#..#.....#.#.#..# +...................#....#.##... +.....#...#.#....#....#.#......# +.......##.#.#......##.......... +.#..#...##.#...#..#......#..... +......#.#..#..###..##..##...... +.#.#.#.#.....#...###.....#..#.. +.#....#.....#.......#.......#.. +..........##.........####...... +.#.#.............#..#.#...#.... +........#........##...#.#....#. +........#...................... +..#.#....#...............#...## +.......#.#...#..#.....##......# +.#...#....#..........##........ +.#.........#.#............##... +.....#......##...#.......#..#.. +#.#..#.............#...#...#... +......#.......#............#... +...........##....#......##..... +.#.#..#.....................#.. +##..##.....###..##.#........... +...##......##....#...##.....#.. +#...#.##.............#......... +......#..#.........###.#......# +#.#.....#.....................# +....#####.....##........#.#..#. +...........##..##.###.......... +..........##.....#........#...# +.......#..#......#.....##..##.# +.....##.#........#.........#... +......##......................# +.#.......#.#.#............#..#. +.....##.#.......#.#........#... From 8efe93e2786692c06e63e6ffe1203e7d660dcd80 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 3 Dec 2020 18:21:57 +0100 Subject: [PATCH 074/479] 2020: d03: ex1: add solution --- 2020/d03/ex1/ex1.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 2020/d03/ex1/ex1.py diff --git a/2020/d03/ex1/ex1.py b/2020/d03/ex1/ex1.py new file mode 100755 index 0000000..c964770 --- /dev/null +++ b/2020/d03/ex1/ex1.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import sys +from typing import List, Tuple + + +def solve(trees: List[str], delta: Tuple[int, int]) -> int: + x, y = 0, 0 + sum = 0 + while True: + x += delta[0] + y += delta[1] + if y >= len(trees): + break + sum += trees[y][x % len(trees[0])] == "#" + return sum + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input, (3, 1))) + + +if __name__ == "__main__": + main() From b9bed5c506779e421782a413d0a2c05c6ef7024d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 3 Dec 2020 18:22:04 +0100 Subject: [PATCH 075/479] 2020: d03: ex2: add input --- 2020/d03/ex2/input | 323 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) create mode 100644 2020/d03/ex2/input diff --git a/2020/d03/ex2/input b/2020/d03/ex2/input new file mode 100644 index 0000000..9256a36 --- /dev/null +++ b/2020/d03/ex2/input @@ -0,0 +1,323 @@ +...............#.#............. +##..#....................#...## +......#..#.#.....#..#.#.##..... +.........#...#..............#.# +............#.......##......... +...#.....#.....#...#.....#..#.. +..............#..##.#..#......# +.##.....#.....#......##.#...... +.#..........###....#...##....#. +.....#....#.#.......#......##.. +.#....#......#.......#........# +..#.#.......#..##.....##....... +...#.#....#.......#.......#...# +##.##...##..#......#.#.....#..# +.#.#.......#..#.#......#...#.#. +#.......##.......#...#......... +.....#......#.#.#.....#....##.. +.#.#........#....#..#..#....... +...#....#..###.........#.....#. +........#........#........#.... +..##..............#.....#.#..#. +.#...##.............#.#........ +....#..#...........#.......#... +..#....#.....................#. +#.#..................##......## +.#.##....#......#........#..... +.........##.....#....#...##..#. +#..........#..#.#.............# +.........#...#.#.#.#..##..##... +#...#.....#..#..#....#...#..... +..##.....#..................#.. +#..###.....#....#.......#..#... +...##.##..#............#......# +........###.........###......#. +#..##....#.........#.........#. +....#.....................#.... +#..#..##..#..####.##..#.....##. +..#...#.#....#....##.....#..... +...#.#.........#.....#.#....... +....#................#..#...##. +....#..#..........#...#.#.##... +........#..##............#....# +...#......##..........#.##...#. +.......##...................... +.......##..........#....#.#...# +......###.##..##..#....#...#..# +#.#...........##.....#........# +..#...........#..###....#.#.#.. +........#...........#......##.. +.........#...##.###...###..#... +.....#.....#..##.........##.... +...##..............#.....#...## +.##....#.......###.....#....... +.#...........##.............##. +......#..#..##.##......#......# +........###........#......#.#.. +#.#....#.....#........#......#. +.##..#.........##...##....#.... +.....#.........#...##.....#.... +.............#........###....#. +......#.......#.#........#.#... +..#....#.#...#....#...#.#...##. +#...#......##..##......#.##.### +...##.#....#...#....#.........# +...#..####.....##.#..#.#...##.. +##.#..#....##......#......##... +###.........#.#..#.#.....#..... +...#........#..##...#.#.#..#.#. +...###..#.###.#...#............ +....................###........ +...........#...........#....... +#..............#.#.........###. +....................##.....#..# +#.#.....#.......#...#.......... +.#...#......#....##...#...#.... +.....#.##..................###. +.........#.#..#.#......#....... +.......#.....##..#.##.#........ +..#..........#.###.....#....#.. +......#.............#.#........ +........##....#........#....... +...#.............#....#.#...... +#........#..####.....#.....#.#. +.##......##...#........#..#.#.. +....##....#...#...#..##...#.#.. +#.##...###..#....##.#.......... +....#.#...#.#...#..##.###...#.. +#.....##..#..#....#.#.....##... +.#..#..........##.#.....##..... +.#..#........#.#.#.#........... +.#..#.....#...........#...#.... +...#......##..........##..#.... +...#..#....#.##...#..#.....###. +#.#....#.....##................ +#..#......#.#.#.......#........ +......#....#.#....#..##....#..# +.#.....#.#....###.##.........#. +.###..#.....#........#.#....... +.#...#......#..#.#......#.....# +#...............####...#.....#. +.......#..........##.#........# +#........##....##.....###..##.. +#..#.....#..##.....#....#..#... +#.....#.......##......#.#.....# +#.##..#......##..#............. +##...#.....#........##......... +....#..##....#...#.......#.#... +....#...#...##..#....#..#...#.. +..............#.#...#....###... +...#....#..##...##..#....##.... +#.##.#..#..#......#.#.#.#...#.. +.......#..#..##........#......# +##.#....#....##.#......##.#.... +.#...#..............#........#. +.#.#....#.........#............ +.#..#..###.............#....#.. +#......#...#.#..##..#...#....#. +.......................#...#.#. +.............#..#...##......... +..#.#..#....#....#........#.... +#......#.##..#...#.#........... +.....#....#...........##.#..#.. +..#.#.....#..............#.#... +#.......#.....#................ +#..............#...#....#...#.. +...#...##..#..#............#... +......###.....................# +.........#.......##..#....#.... +........#...#.##..#.##......#.. +....###..#.#...#...#..#.#...### +##...#...##.#...#.#...#.#....#. +.........#...#.....###......... +...#........##..#.......##..... +.#.......##.........#.....##..# +.#..................#...#...... +.##..#..#.#.....#.###.......... +...#.....##..#.........#...#... +.#......#.#.......#.#.......... +.........#.#...#..........#.#.. +#..........#.##..#.##....#..... +.#.#....#.....#..##.....#...#.. +..#........##...##..#..#....#.. +#...........##....#..###....#.. +...........##.........####...#. +..#........###...#.#.........#. +.#...............#.##.#.#...#.. +.#.##..#.....#.#.....##..#..... +...#...#..#.##.##...#.......##. +..#...#...#......##.##.##...#.. +##....#...#...#...............# +...##...........#......#..#.#.. +#.........#......#.#.##.....#.. +........#..#.........##........ +..#.#....###.....##..#...#..... +.........#...#.......#.....##.. +##.....................#...##.. +.#.#..#......#................. +.....###..#......#..###..#..... +...#.....##.........#......#..# +......##.....#...#........#.#.. +..#.#...#......#...#.##.##..... +...#..........#...#.......#..## +.###........#........##........ +..#.#.#..........#.#...##...... +.........#........#......###..# +....##..#.........#...........# +..####..#............##.......# +.....##.#..##.........#...#.#.. +...#.........#.....#.....#..... +.......#...#..#...##.........#. +...#...#..#...#....#..#........ +#............##.##...#......... +.#.#.....#.......####.....#.... +..............#......#.#....... +..............#...........#...# +#...#........###....#.#....#.#. +##.#..#..#......#......#.#.#... +.#..#.....#..#.#..#.#.......##. +......##.#...#...#......#...#.. +#...........##....#.#.......... +....#.......###.#...#.......... +.......................#.....#. +........#...#..#...#.#.#.#.#... +.#.#...........#......##...#... +.........................#..... +.................#.##.#...##... +...#...##.....#.....##....#.#.. +...#...#...................#... +...#..#..#...#...#....#........ +#....#...#.....#............... +.......#...........#...#....... +....#....#.....##.......#...... +.......#..........##........... +.#.#........#..##....#......#.. +.....#.......#.#.........#...#. +.#..####.#.#...............#..# +.....###..#..#..........#.#..## +..#.......#...#.....##..#..#.#. +#....#......#.................. +........#.##.#....#...........# +....#.#....##..#.#.....##...... +...#..#.......#....#.....#.#.#. +#...#......#.....#.#..........# +....#....#...............#..... +..###......................###. +.##....#..#.......###.....#..#. +..###............#........#.##. +.#........#......#.....#..#.... +....#..##...#...#.###.......#.# +.......#.##...........#.#..#... +.....#...##.................... +....#....#...##......#......... +..#............##....###.#...#. +.#........#...............#.... +#..#.#.##.........#..##....##.. +#.#....#..#.##....##...#.#..... +.....#.....##....#.#........#.. +#..#...#...#....#....#......... +...#........#..#.#.....##...... +..#...#...#................##.. +#........#.#.##.......#.#...#.. +#......#..####.##.....#.#..#.#. +............#..#.#....#......## +..#.....##....#...#.#.......... +...#...#.........#...#.#....... +.###..#.......##.##.....#.#.#.. +...#....#...............##.#... +....##..#..#..#.#......##.....# +#.#..............##...##...#### +.....#.##...#.#...............# +.##.....#.........#.......#.#.# +#.#..#.....#.......#.......#..# +...#.#.....#.....#......#...... +.......#....#..#.#..........#.. +......#......#.##...#.......... +.....#.......###...#...#.#..... +#..#.#.........#.....#.##....#. +..#.#.........#..#..#..#.....#. +.#..##..#..#....#......#.##..#. +...##......###.....#.##.##..... +.#.....#...#..#...#............ +##..##..#.##....#..#........... +...#..##..#..#.............#.## +...............##............#. +..#.....##........##.#...#....# +.#.#...#.#.#..#.#.....#....#... +.#....#...............#..#..... +....#.##..#....#......#...###.. +#................###...#.#..... +...#...#......##..#.#....#..... +.#....#....#.#...##............ +....#...##..#..#........#.##... +..##.....#..#..##.............. +..#..##..#.#..##....#....#....# +...##.............#............ +#....#....#.#........#.....##.# +.....#..#.#.....####...###..... +................#......#....... +.....#.#.#.#.#....#..#........# +.##.#...#.#.......##....#....#. +.....#........#................ +..#.....#..#...#..#...........# +.#.....#...##.....##..#.#....## +......#.......#..#......##.#... +#.#..........#.##.#........#... +...#..#.............#.......... +#..#..#..........#..##.#....... +.#..#...............####..#.... +.......#.....#......#.....#.#.. +.#...............#...#......... +.#..#..........#..#.#..##..#..# +......##..#.....#..#......###.. +..........#...#..#.......#..... +.#.#.#..#.....#.##.#...#..#.... +........#.......#.....#.#...... +......#.....##.....#....##.#... +...............#......#.......# +..#.#...#.....#.#...##......#.. +#.#.........#.#...#........#### +#..........##..#..#........##.. +.............#..#.......##.#..# +..#........#.#....#........#.#. +.#......####..#..#............. +............###.......#.#..#... +#.##......##...#...#.........#. +....##.#.#.#......#....#..#...# +.#..#.#....#...#.........#..... +#...#.....##............#...#.. +#.#...#..#.................#... +............#.#..#.....#.#.#..# +...................#....#.##... +.....#...#.#....#....#.#......# +.......##.#.#......##.......... +.#..#...##.#...#..#......#..... +......#.#..#..###..##..##...... +.#.#.#.#.....#...###.....#..#.. +.#....#.....#.......#.......#.. +..........##.........####...... +.#.#.............#..#.#...#.... +........#........##...#.#....#. +........#...................... +..#.#....#...............#...## +.......#.#...#..#.....##......# +.#...#....#..........##........ +.#.........#.#............##... +.....#......##...#.......#..#.. +#.#..#.............#...#...#... +......#.......#............#... +...........##....#......##..... +.#.#..#.....................#.. +##..##.....###..##.#........... +...##......##....#...##.....#.. +#...#.##.............#......... +......#..#.........###.#......# +#.#.....#.....................# +....#####.....##........#.#..#. +...........##..##.###.......... +..........##.....#........#...# +.......#..#......#.....##..##.# +.....##.#........#.........#... +......##......................# +.#.......#.#.#............#..#. +.....##.#.......#.#........#... From 721750965b37f903a52525cafa90f180b1a0d0ad Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 3 Dec 2020 18:22:09 +0100 Subject: [PATCH 076/479] 2020: d03: ex2: add solution --- 2020/d03/ex2/ex2.py | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100755 2020/d03/ex2/ex2.py diff --git a/2020/d03/ex2/ex2.py b/2020/d03/ex2/ex2.py new file mode 100755 index 0000000..c061deb --- /dev/null +++ b/2020/d03/ex2/ex2.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +import sys +from math import prod +from typing import List, Tuple + + +def solve(trees: List[str], delta: Tuple[int, int]) -> int: + x, y = 0, 0 + sum = 0 + while True: + x += delta[0] + y += delta[1] + if y >= len(trees): + break + sum += trees[y][x % len(trees[0])] == "#" + return sum + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + deltas = [ + (1, 1), + (3, 1), + (5, 1), + (7, 1), + (1, 2), + ] + print(prod(solve(input, delt) for delt in deltas)) + + +if __name__ == "__main__": + main() From a76a2447792b84ea528742036a821aae7c32bac8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 4 Dec 2020 09:50:17 +0100 Subject: [PATCH 077/479] 2020: d04: ex1: add input --- 2020/d04/ex1/input | 1069 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1069 insertions(+) create mode 100644 2020/d04/ex1/input diff --git a/2020/d04/ex1/input b/2020/d04/ex1/input new file mode 100644 index 0000000..710a26b --- /dev/null +++ b/2020/d04/ex1/input @@ -0,0 +1,1069 @@ +byr:2010 pid:#1bb4d8 eyr:2021 hgt:186cm iyr:2020 ecl:grt + +pid:937877382 eyr:2029 +ecl:amb hgt:187cm iyr:2019 +byr:1933 hcl:#888785 + +ecl:hzl +eyr:2020 +hcl:#18171d +iyr:2019 hgt:183cm +byr:1935 + +hcl:#7d3b0c hgt:183cm cid:135 +byr:1992 eyr:2024 iyr:2013 pid:138000309 +ecl:oth + +ecl:hzl +hgt:176cm pid:346059944 byr:1929 cid:150 eyr:1924 hcl:#fffffd iyr:2016 + +iyr:2011 +cid:99 ecl:amb +eyr:2030 hcl:#18171d +hgt:165cm pid:897123249 byr:1948 + +hcl:#cfa07d pid:827609097 ecl:gry iyr:2017 byr:1963 +eyr:2029 hgt:72in + +hcl:#6b5442 eyr:2028 iyr:2016 ecl:hzl +hgt:152cm +pid:432183209 byr:1984 + +hgt:169cm hcl:#888785 ecl:hzl pid:626107466 byr:1929 iyr:2013 cid:217 +eyr:2026 + +hcl:#bdb95d byr:1935 eyr:2023 ecl:blu iyr:2011 cid:90 hgt:64cm +pid:155167914 + +iyr:2017 +byr:1943 cid:56 +hcl:#888785 hgt:193cm pid:621305634 +ecl:amb +eyr:2024 + +ecl:gry +hcl:#a97842 pid:936999610 cid:169 byr:1991 eyr:2029 hgt:175cm iyr:2017 + +hcl:#866857 ecl:gry +byr:1975 hgt:71in +pid:180628540 eyr:2020 +iyr:2017 + +hcl:#cfa07d hgt:153cm byr:1962 cid:325 +iyr:2018 eyr:2020 +ecl:amb pid:579364506 + +hcl:#6b5442 iyr:2010 ecl:amb byr:2001 +eyr:2020 pid:406219444 +hgt:173cm + +pid:#430c70 +ecl:gry iyr:2018 hcl:#866857 eyr:2021 cid:97 byr:1997 +hgt:75cm + +iyr:2023 pid:#518780 +eyr:2034 +ecl:zzz +hgt:72cm +hcl:z byr:2010 + +pid:1961614335 hcl:#c0946f hgt:157 ecl:grn eyr:2031 byr:1972 iyr:1992 + +cid:142 +eyr:2022 ecl:amb +hgt:68in +hcl:#6b5442 byr:1927 pid:112372155 iyr:2012 + +byr:1972 +hgt:169cm +hcl:#888785 +cid:75 iyr:2015 eyr:2021 ecl:oth +pid:7889059161 + +ecl:brn +iyr:2020 +eyr:2026 hgt:151cm byr:1961 pid:468038868 hcl:#18171d + +ecl:blu +hcl:#b6652a +byr:1959 +hgt:151cm cid:109 pid:708689901 +eyr:2026 iyr:2012 + +ecl:grt byr:2024 iyr:1995 pid:225263933 hcl:z +eyr:2040 hgt:127 cid:162 + +pid:683129831 cid:144 +hcl:#a97842 hgt:155cm eyr:2030 byr:1962 +iyr:2015 +ecl:oth + +byr:2009 hcl:#866857 cid:329 iyr:1955 +eyr:1994 pid:085929595 + +byr:1940 +pid:936748944 hgt:160cm eyr:2024 iyr:2013 cid:205 +ecl:grn hcl:#c0946f + +hgt:193in cid:161 iyr:1984 +pid:#f82e35 +byr:2018 +hcl:b1a551 eyr:2014 ecl:#4d2d5b + +byr:1978 +iyr:2011 hgt:172cm hcl:#efcc98 ecl:brn pid:759624394 eyr:2020 + +eyr:2020 pid:622444743 +hcl:#a97842 +ecl:gry iyr:2014 hgt:157cm byr:1980 + +hgt:181cm eyr:2020 +iyr:2014 +hcl:#602927 ecl:brn byr:1934 + +hgt:188cm +ecl:blu eyr:2029 pid:757878469 hcl:#b6652a iyr:2017 + +byr:1995 ecl:blu hcl:#341e13 eyr:2027 iyr:2020 pid:283341241 +hgt:174cm + +byr:1960 iyr:2012 hcl:dc007d eyr:2011 hgt:166cm +pid:9889788504 +ecl:#a9b3a1 + +ecl:hzl hgt:70in pid:620966688 iyr:1998 hcl:z +eyr:2022 + +hgt:187cm cid:190 pid:818634983 byr:1925 ecl:gry hcl:#ceb3a1 +eyr:2021 iyr:2015 + +hcl:#c0946f iyr:2017 +byr:1953 eyr:2030 hgt:67in pid:085876735 ecl:hzl + +pid:205284134 +hcl:#cfa07d byr:1987 hgt:167cm +eyr:2022 ecl:oth iyr:2020 + +iyr:2018 +hgt:180cm pid:232535961 eyr:2027 byr:1999 +hcl:#18171d ecl:oth + +cid:342 hgt:171cm ecl:blu byr:1920 hcl:#18171d eyr:2023 iyr:2012 +pid:353601791 + +byr:1956 +ecl:brn pid:141896408 iyr:2012 cid:116 eyr:2028 hgt:164cm +hcl:#866857 + +hcl:#fffffd ecl:oth eyr:2030 hgt:67in pid:855777018 byr:1975 +iyr:2012 + +ecl:blu pid:45257034 hcl:#c5447e iyr:1928 cid:212 byr:1974 + +pid:080116868 cid:97 eyr:2021 iyr:2020 ecl:grn byr:1987 hgt:62in hcl:#efcc98 + +eyr:2027 hcl:#efcc98 iyr:2020 ecl:amb cid:111 +pid:143966954 +hgt:165cm + +iyr:2015 byr:1941 pid:798564127 +hgt:183cm ecl:oth eyr:2020 + +byr:1999 +iyr:2017 hcl:#ceb3a1 +pid:640883740 hgt:164cm +cid:105 ecl:hzl +eyr:2022 + +iyr:2014 eyr:2023 +ecl:grn hcl:#ceb3a1 +hgt:188cm byr:1981 pid:185076942 cid:342 + +hgt:150cm +iyr:2013 eyr:2035 cid:184 hcl:#341e13 pid:#e2dd63 byr:2014 ecl:brn + +eyr:2024 iyr:2015 ecl:brn hgt:76in +hcl:#866857 byr:1958 +pid:886486245 + +ecl:amb cid:113 byr:1931 pid:087380735 +iyr:2010 +eyr:2028 +hgt:161cm + +byr:1926 eyr:2024 iyr:2012 pid:036335738 hcl:#c0946f hgt:153cm ecl:brn + +hcl:bf952a +hgt:169in +eyr:1925 pid:166cm iyr:2028 ecl:lzr byr:1938 + +hgt:154cm hcl:#733820 ecl:oth iyr:2016 +byr:1925 +eyr:2020 pid:590365390 + +eyr:2029 hgt:166cm pid:670283165 +hcl:#ceb3a1 iyr:2018 +byr:1955 +ecl:gry + +hgt:181cm +iyr:2016 hcl:#866857 byr:1933 +eyr:2028 ecl:blu + +hgt:184cm +cid:138 hcl:#623a2f +pid:081880232 +byr:1929 ecl:hzl eyr:2030 +iyr:2015 + +pid:825698872 +eyr:2026 hgt:181cm iyr:2015 hcl:#866857 byr:1950 ecl:gry + +eyr:2022 byr:2002 iyr:2013 hcl:#fffffd ecl:hzl pid:687380398 +hgt:173cm + +byr:2016 ecl:zzz pid:0514910377 hcl:ebe8b2 eyr:2025 +iyr:2011 hgt:183cm + +ecl:amb hgt:67in +pid:602547016 byr:1985 +eyr:2021 +iyr:2014 + +iyr:2014 eyr:2020 ecl:grn pid:642261584 +byr:1970 hgt:190cm cid:278 hcl:#7d3b0c + +eyr:2035 cid:226 hcl:64ac73 +byr:2007 +pid:176cm ecl:#927fbf iyr:2006 + +iyr:2019 eyr:2026 ecl:brn hgt:162cm +cid:108 +hcl:#ceb3a1 pid:774441166 byr:1951 + +hgt:166cm eyr:2024 hcl:#b6652a byr:1934 pid:260873380 iyr:2016 + +hcl:z +iyr:2015 ecl:blu +eyr:2040 byr:1927 pid:431855667 +hgt:173cm +cid:209 + +eyr:2034 cid:139 +ecl:#cb7564 +byr:2023 hgt:172in iyr:2027 pid:2877047600 + +ecl:brn +cid:125 hcl:#888785 +iyr:2011 pid:739399822 hgt:184cm byr:1989 + +hcl:#c0946f +pid:891125961 +hgt:175cm +iyr:2010 eyr:2027 ecl:gry +byr:1930 + +hgt:164cm byr:1935 eyr:2023 pid:684366743 +ecl:oth +hcl:#18171d iyr:2013 + +hcl:#341e13 hgt:64in byr:1959 ecl:#c53bbb iyr:2014 eyr:2029 pid:174cm + +eyr:1943 ecl:#e52638 +hcl:06a964 byr:1959 cid:342 iyr:2029 hgt:178in pid:150cm + +byr:1966 hcl:#733820 iyr:2020 +ecl:gry eyr:2021 pid:229789071 + +pid:363947487 +ecl:blu +hcl:#623a2f +byr:1972 +iyr:2017 hgt:184cm +eyr:2023 + +ecl:oth pid:460855562 +iyr:2010 cid:148 hcl:z hgt:74cm byr:2005 + +eyr:2027 iyr:2017 hgt:172cm +byr:1975 +ecl:amb cid:97 hcl:#c0946f pid:591950054 + +eyr:2022 ecl:oth hgt:185cm +hcl:#6b5442 +byr:1978 +iyr:2018 pid:849124937 cid:78 + +iyr:1927 hgt:121 +eyr:2020 ecl:#c73b1a hcl:#cfa07d pid:4505701953 byr:2020 +cid:235 + +hgt:183cm hcl:#341e13 iyr:2019 byr:1932 ecl:#144539 +pid:184cm eyr:1954 + +iyr:2020 cid:332 byr:1930 hcl:#6b5442 hgt:168cm ecl:amb +eyr:2023 pid:332084752 + +ecl:blu +byr:1922 cid:135 iyr:2019 eyr:2028 pid:481801918 +hcl:#efcc98 hgt:76in + +ecl:grn pid:188906975 cid:153 hgt:173cm eyr:2029 iyr:2012 hcl:#733820 byr:2001 + +eyr:2029 +byr:1948 iyr:2020 +hgt:167cm ecl:brn hcl:#623a2f pid:577624152 + +hcl:#18171d +pid:262528276 byr:1949 +iyr:2020 +eyr:2023 + +hcl:#c0946f iyr:2016 byr:1967 ecl:brn +hgt:162cm +pid:139002508 eyr:2030 + +eyr:2030 +hgt:72in iyr:2013 pid:542944485 cid:112 +byr:1950 hcl:#a97842 ecl:amb + +pid:772544664 eyr:2023 ecl:gry hgt:159cm iyr:2012 +byr:1956 hcl:#602927 + +hgt:172in ecl:grt pid:668387651 byr:2019 +iyr:1995 hcl:bc51ff eyr:1921 + +pid:322272953 ecl:brn hcl:#a97842 byr:1990 +eyr:2021 +iyr:2017 +hgt:181cm + +eyr:2029 +iyr:2011 +pid:503169142 byr:1980 +hcl:#a97842 ecl:oth + +pid:514042929 +ecl:amb eyr:2030 hgt:154cm +iyr:2010 hcl:#623a2f +byr:1989 + +byr:1988 pid:156381939 iyr:2016 hgt:161cm eyr:2030 ecl:brn hcl:#7d3b0c + +pid:545819361 hgt:191cm iyr:2012 byr:1982 eyr:2025 ecl:zzz +hcl:z + +pid:872911892 +byr:1924 iyr:1974 +hcl:#602927 +ecl:brn hgt:154cm +eyr:2028 + +hcl:#602927 hgt:188cm +byr:2007 pid:503933918 ecl:utc +eyr:2030 iyr:2020 cid:132 + +ecl:hzl +eyr:2020 hcl:#888785 hgt:181cm +pid:721383537 +iyr:2018 +byr:1983 cid:50 + +pid:8590606 hcl:#18171d +eyr:2039 iyr:2024 +cid:161 byr:2027 + +hgt:160in byr:1956 +cid:214 pid:187cm iyr:2027 +hcl:z +eyr:2033 ecl:grn + +byr:2029 pid:90562860 hcl:4fa0d1 iyr:2024 +eyr:2040 cid:62 ecl:#07ae33 hgt:186in + +pid:557319679 byr:1945 hgt:182cm eyr:2026 iyr:2012 hcl:#866857 ecl:hzl cid:219 + +eyr:2028 iyr:2022 ecl:zzz cid:273 +hgt:133 pid:4084335529 byr:2011 hcl:z + +pid:69196974 hcl:z iyr:2014 ecl:amb byr:1928 + +hgt:183in +eyr:2028 pid:771762218 byr:2003 ecl:dne hcl:70eb58 iyr:2027 cid:330 + +ecl:hzl pid:195721774 hcl:#602927 byr:1945 hgt:186cm +eyr:2037 +iyr:2011 + +ecl:brn eyr:2028 hgt:171cm +byr:1980 hcl:#fffffd pid:563089389 iyr:2016 + +eyr:2027 iyr:2011 ecl:gry byr:1932 hcl:#18171d +pid:398526372 + +pid:97363921 hgt:178cm +ecl:oth eyr:2028 +byr:1930 cid:345 iyr:2018 hcl:#1fb2f0 + +ecl:amb iyr:2012 +byr:1961 pid:679312513 eyr:2026 hcl:#cfa07d +hgt:174cm + +byr:1980 +hcl:#80055d +cid:235 +ecl:oth pid:159696517 eyr:2030 +hgt:191cm +iyr:2012 + +iyr:2013 eyr:2027 hcl:#866857 +pid:621184472 cid:137 hgt:175cm byr:2000 +ecl:hzl + +byr:1998 hgt:166cm +ecl:oth eyr:2025 +iyr:2018 +hcl:#a97842 pid:358495679 + +byr:1928 ecl:oth cid:122 hcl:#6b5442 +hgt:189cm eyr:2020 iyr:2018 + +hgt:186cm +byr:2020 hcl:79d685 ecl:grt iyr:1944 pid:3659998623 eyr:2000 + +hgt:63in ecl:oth eyr:2029 +iyr:2013 pid:942282912 hcl:#c0946f byr:1989 + +byr:1997 hcl:#623a2f eyr:2026 cid:149 +pid:702981538 +ecl:amb hgt:178cm iyr:2017 + +ecl:brn iyr:2015 byr:1932 pid:191192548 cid:318 +hcl:#7d3b0c eyr:2020 + +hcl:#866857 eyr:2028 pid:341036511 cid:343 iyr:2020 hgt:173cm +byr:1973 ecl:blu + +iyr:2016 pid:165707654 hgt:181cm ecl:hzl +cid:119 byr:1973 hcl:#b6652a + +iyr:2014 pid:833337583 byr:1936 cid:91 hcl:#602927 ecl:amb hgt:165cm +eyr:2021 + +byr:1938 ecl:grn hcl:#a55daf eyr:2021 cid:199 pid:701515796 +iyr:2015 hgt:71in + +hcl:#a97842 +ecl:blu +eyr:2030 iyr:2020 +hgt:155cm byr:1927 +pid:524488639 + +pid:385084163 eyr:2025 +hcl:#866857 ecl:oth iyr:2020 hgt:177cm byr:2002 + +eyr:2029 hgt:177cm +cid:142 ecl:hzl hcl:#866857 +iyr:2015 byr:1946 pid:459543573 + +pid:826977286 eyr:2030 iyr:2016 byr:1996 +hcl:#efcc98 +ecl:gry hgt:180cm + +eyr:2029 +iyr:1976 pid:872821863 ecl:gry byr:2030 + +hgt:191cm byr:1924 pid:918753019 ecl:blu +iyr:2019 hcl:#5d69e0 eyr:2024 + +ecl:lzr iyr:2020 pid:991375034 byr:1947 +eyr:1923 hcl:8224f6 hgt:157 + +eyr:2021 byr:1946 +hgt:189cm ecl:grn iyr:2010 hcl:#cfa07d pid:246923037 + +iyr:2016 +ecl:oth hgt:155cm byr:1962 pid:924702739 eyr:2028 hcl:#7d3b0c + +pid:7358100461 hgt:183cm byr:2011 hcl:#a97842 +iyr:2020 eyr:1963 cid:71 + +ecl:hzl hcl:#c0946f +byr:1934 +hgt:183cm +iyr:2018 pid:433993423 eyr:2028 + +hgt:183cm hcl:#cfa07d iyr:2018 +byr:1975 eyr:2024 + +eyr:2021 ecl:amb byr:1992 hgt:164cm iyr:2020 +cid:302 + +pid:271720491 hgt:161cm +iyr:2012 byr:1947 hcl:#6b5442 ecl:grn eyr:2024 + +pid:860852799 eyr:2021 byr:1980 hcl:#6b5442 iyr:2010 hgt:174cm +ecl:hzl + +hcl:#623a2f eyr:2028 iyr:2016 pid:813453232 hgt:173cm cid:131 +byr:1962 + +byr:1975 +hgt:177cm +pid:290098810 cid:241 +ecl:oth hcl:#a5fc9f eyr:2021 iyr:2013 + +byr:1947 pid:762351259 hgt:178cm ecl:amb hcl:#d07b27 iyr:2017 eyr:2028 cid:271 + +iyr:2012 pid:053790533 eyr:2023 ecl:grn hcl:#623a2f byr:1939 cid:70 hgt:189cm + +hcl:#c0946f pid:891312170 byr:1986 iyr:2012 +hgt:163cm eyr:2023 cid:150 + +iyr:2015 +byr:1963 +pid:695024197 hcl:#efcc98 ecl:brn hgt:166cm eyr:2022 +cid:276 + +eyr:1945 hgt:150in byr:2007 +ecl:utc hcl:z cid:272 +pid:186cm iyr:1927 + +pid:956296646 iyr:2015 hgt:168cm +byr:1979 eyr:2029 ecl:gry hcl:#866857 + +pid:745452488 byr:1998 eyr:2025 hcl:#602927 +hgt:158cm iyr:2015 + +eyr:2027 +iyr:2017 +pid:6173634679 byr:2001 ecl:hzl +hcl:babc41 +hgt:76cm + +ecl:grn +iyr:2019 +hcl:#3881ca byr:1975 eyr:2023 hgt:162cm + +hcl:#ceb3a1 hgt:169in pid:398759957 +eyr:2020 byr:2016 +iyr:2011 ecl:#be3622 + +hgt:156cm +hcl:#b6652a pid:166cm iyr:2027 byr:2003 +eyr:2036 ecl:#6d4df1 +cid:109 + +eyr:2026 pid:295161300 ecl:gry +hgt:160cm byr:1950 hcl:#746f08 +iyr:2017 + +iyr:2010 cid:335 +eyr:2024 +hcl:#866857 +byr:1948 hgt:166cm pid:178927953 +ecl:blu + +hgt:161cm cid:210 eyr:2025 +byr:1920 +ecl:gry iyr:2020 +hcl:#7d3b0c pid:443548961 + +iyr:2019 +pid:320015839 eyr:2029 +hcl:#fffffd ecl:oth byr:1953 hgt:182cm + +eyr:2038 hcl:abb3ad iyr:2015 pid:174cm hgt:167cm +ecl:hzl + +byr:1982 pid:798153758 +ecl:brn +hgt:161cm hcl:#341e13 eyr:2023 +iyr:2014 + +byr:1938 +pid:193cm hgt:190cm ecl:amb iyr:2019 +eyr:2028 cid:270 +hcl:#18171d + +pid:711886098 byr:1962 +eyr:2028 ecl:grn +hgt:151cm +hcl:#cfa07d +iyr:2019 + +eyr:2028 iyr:2011 +ecl:gry +pid:550207629 hgt:183cm +hcl:#888785 byr:1920 cid:96 + +ecl:utc +eyr:2021 +byr:1962 hgt:175cm +pid:872298092 +hcl:z iyr:2017 cid:197 + +iyr:2010 +hcl:5b88b0 byr:2021 ecl:gmt +eyr:2040 hgt:179cm pid:161cm + +pid:56869473 eyr:2036 ecl:lzr +iyr:2027 hcl:z + +hcl:#602927 +hgt:151cm pid:780342729 ecl:oth iyr:2015 + +byr:2027 hcl:#fffffd +pid:5609758115 eyr:2037 +iyr:2017 +ecl:#6f0329 hgt:97 + +iyr:2025 hcl:z byr:2007 ecl:gmt +pid:#eda9ab +hgt:154in eyr:2028 cid:247 + +ecl:utc pid:216181141 +hgt:161cm eyr:2026 +hcl:#d38f20 byr:2028 + +ecl:grn byr:1955 hcl:#c0946f +iyr:2017 eyr:2027 pid:746303487 +hgt:72in + +pid:489225602 +iyr:2018 ecl:gry hgt:65in byr:1982 +cid:248 +eyr:2025 + +hcl:#ceb3a1 pid:663798116 byr:1937 iyr:2010 +hgt:167cm ecl:hzl + +pid:329032527 +hcl:#ceb3a1 +iyr:2014 ecl:gry +hgt:169cm +byr:1932 + +hcl:#545d0c +ecl:brn iyr:2023 hgt:186cm cid:209 +pid:886392748 +eyr:2030 byr:1984 + +hgt:80 iyr:1943 hcl:#733820 byr:1937 eyr:2029 pid:625851706 cid:309 + +pid:73586582 hgt:156 +cid:162 ecl:zzz eyr:2025 +iyr:1990 byr:1940 hcl:z + +iyr:2010 +eyr:2023 pid:162901454 +hcl:#733820 byr:1958 ecl:gry +hgt:159cm + +byr:2007 +hcl:#cfa07d +cid:261 pid:148538600 ecl:hzl +hgt:64cm iyr:2021 +eyr:2040 + +iyr:1997 byr:2007 ecl:#24adc8 +pid:55794137 cid:219 eyr:2037 +hgt:75cm hcl:z + +hcl:#efcc98 byr:1940 ecl:amb iyr:2012 +pid:594237790 eyr:2029 cid:112 +hgt:173cm + +byr:1941 cid:70 eyr:2026 hgt:178cm hcl:#733820 +ecl:brn iyr:2013 pid:425263722 + +eyr:2025 byr:1998 iyr:2014 ecl:amb pid:188113611 hcl:#341e13 + +byr:1950 +iyr:2017 hgt:74in cid:238 +pid:897969952 +ecl:hzl eyr:2022 hcl:#0a18bb + +eyr:2022 +iyr:2015 ecl:grn +hgt:179cm byr:1956 hcl:#7fd789 pid:201629099 + +eyr:2024 +pid:483257417 ecl:hzl iyr:2010 hgt:159cm +hcl:z +byr:1968 + +pid:916586207 ecl:amb iyr:2011 eyr:2022 hgt:191cm hcl:#602927 byr:1923 + +pid:175608183 +hgt:190cm hcl:#fffffd iyr:2017 byr:1993 +ecl:blu + +eyr:2029 hgt:173cm +pid:669662258 byr:1997 iyr:2015 ecl:brn cid:153 hcl:#888785 + +hcl:d899cf +ecl:#876029 hgt:76cm iyr:1997 pid:40406158 +eyr:2032 byr:2010 + +eyr:2023 ecl:hzl cid:162 hcl:#602927 iyr:2015 +pid:82885029 +hgt:75cm byr:1946 + +byr:1962 hgt:167in +ecl:brn +hcl:#c0946f iyr:2014 pid:488520708 eyr:2027 cid:271 + +hgt:180cm pid:358771245 eyr:2020 +ecl:grn iyr:2018 hcl:#efcc98 +byr:1979 + +cid:273 ecl:gry pid:424388351 iyr:2010 hcl:#c0946f byr:1988 +hgt:166cm +eyr:2027 + +ecl:gry hcl:#a97842 hgt:189cm +pid:743213778 iyr:2015 byr:1959 + +iyr:2021 byr:2021 +ecl:#a79d2e cid:89 +hcl:#5fb8d7 eyr:2001 pid:#5575b3 hgt:60cm + +eyr:2021 +iyr:2017 +cid:87 hgt:164cm pid:560394910 ecl:hzl hcl:#ceb3a1 +byr:1955 + +iyr:2018 +hcl:#27f7e6 hgt:160cm +eyr:2029 pid:033692111 +ecl:amb byr:1920 + +hgt:160cm eyr:2028 iyr:2010 ecl:blu byr:1974 pid:858060501 hcl:#733820 + +byr:1961 pid:818700605 cid:93 eyr:2024 +hgt:188cm hcl:#866857 +ecl:gry + +eyr:2029 +hgt:180cm iyr:2017 +ecl:hzl byr:1951 cid:158 +hcl:#888785 + +cid:290 +eyr:2027 byr:1986 +ecl:blu +pid:076339632 iyr:2010 +hcl:#341e13 +hgt:167cm + +eyr:2023 iyr:1990 +hcl:#623a2f byr:2005 hgt:116 + +hgt:167in iyr:1944 ecl:dne eyr:2031 hcl:465775 pid:2505694463 + +cid:93 eyr:2024 iyr:2010 +hgt:143 pid:154cm +ecl:#c6f352 +hcl:#a97842 byr:1925 + +pid:600685520 byr:1967 hcl:#ceb3a1 iyr:2014 ecl:oth cid:226 hgt:179cm eyr:2026 + +hcl:#ceb3a1 +pid:789956738 +byr:1938 hgt:171cm cid:183 eyr:2021 iyr:2011 ecl:amb + +hcl:#613f4b hgt:151cm eyr:2025 +ecl:amb byr:1985 pid:493339889 +iyr:2013 + +hcl:78cda6 pid:36823553 +iyr:2021 cid:235 byr:2028 eyr:2011 hgt:113 +ecl:#02ce86 + +pid:529274811 +iyr:2012 hgt:103 ecl:blu hcl:#341e13 eyr:2023 +byr:1959 + +hgt:166cm iyr:2014 ecl:xry cid:276 byr:2014 hcl:#7d3b0c pid:146851133 + +pid:359823289 hgt:181cm byr:1978 hcl:#c0946f +eyr:2022 +iyr:2011 ecl:hzl + +pid:029400877 +eyr:2026 +byr:1983 iyr:2015 hcl:#cfa07d cid:70 ecl:gry + +hcl:#ceb3a1 eyr:2021 hgt:190cm +ecl:amb iyr:2017 +pid:411804678 byr:1950 + +byr:1926 iyr:2017 ecl:blu pid:103821113 eyr:2026 hcl:#c0946f cid:71 hgt:152cm + +cid:108 byr:1955 +iyr:2010 eyr:2022 hgt:169cm hcl:#733820 +pid:208715596 ecl:gry + +pid:352807405 ecl:blu +hcl:#b1214c iyr:2012 hgt:165cm byr:1929 +cid:139 +eyr:2020 + +hcl:#cfa07d hgt:151cm byr:1987 +eyr:2024 +cid:140 pid:884441477 + +pid:#dade9c eyr:1979 hgt:191cm +byr:2026 iyr:2018 hcl:z ecl:lzr + +cid:259 +pid:644561358 +ecl:blu hgt:164cm iyr:2013 byr:1997 +eyr:2023 hcl:#108f16 + +ecl:oth +cid:141 hgt:66in pid:877258886 iyr:2019 byr:1949 hcl:#18171d +eyr:2027 + +byr:1932 cid:103 hgt:175cm pid:464473181 ecl:xry iyr:2013 hcl:51fd65 + +cid:175 iyr:2014 eyr:1959 +ecl:#d83076 hgt:182cm pid:863972537 hcl:#efcc98 byr:1986 + +hgt:181cm pid:869641194 hcl:#efcc98 cid:141 ecl:gmt iyr:2017 byr:1981 eyr:2027 + +eyr:1938 +iyr:2026 cid:278 ecl:brn byr:1936 hgt:150 pid:6902040050 + +eyr:2027 iyr:2014 pid:110887179 +hcl:#a97842 ecl:brn cid:262 hgt:66in +byr:1954 + +ecl:grn +pid:498972747 +eyr:2024 hcl:#341e13 iyr:2011 byr:1932 hgt:186cm + +cid:59 +hcl:#6b5442 iyr:2018 eyr:2028 pid:866696485 +hgt:178cm ecl:gry + +pid:598961001 +eyr:2024 iyr:2019 +byr:1963 ecl:grn +hcl:#c0946f + +eyr:2024 hgt:172cm pid:295056305 ecl:blu byr:1926 +iyr:2017 hcl:#341e13 + +byr:2001 hcl:#6b5442 hgt:164cm +pid:862982189 ecl:grn iyr:2019 eyr:2030 + +hgt:69cm eyr:2014 ecl:hzl iyr:2025 +hcl:2812c9 +cid:74 byr:1980 + +hcl:#888785 +pid:409489862 +iyr:2011 hgt:186cm ecl:gry byr:1985 +eyr:2028 + +cid:221 pid:6849250876 hgt:169cm hcl:z +iyr:2013 +byr:1950 eyr:2022 + +pid:189083891 byr:1983 hcl:#623a2f ecl:hzl iyr:2013 eyr:2026 hgt:66in + +pid:581546673 cid:269 eyr:2030 hgt:191cm byr:1945 hcl:#18171d +iyr:2015 +ecl:amb + +hgt:158cm ecl:hzl +cid:234 eyr:2023 +byr:1996 hcl:#7ac7ad +iyr:2020 pid:666748924 + +iyr:2013 ecl:grn cid:53 hgt:172cm eyr:2028 pid:406602771 hcl:#fffffd byr:1959 + +hgt:63cm hcl:eaaf60 byr:2026 iyr:1981 +pid:#baf2cf cid:117 ecl:hzl + +eyr:2035 byr:2014 +iyr:2028 hcl:z ecl:#acd426 +cid:261 pid:174cm hgt:182in + +ecl:amb pid:#4bb0a8 eyr:2027 hgt:155cm hcl:#623a2f +byr:1956 +iyr:2011 + +eyr:2012 cid:53 byr:2005 ecl:oth +hgt:183in iyr:1974 pid:150cm + +iyr:2020 pid:833821322 ecl:blu byr:1944 hgt:169cm hcl:#623a2f eyr:2020 + +hgt:60in ecl:oth byr:1962 eyr:2022 cid:99 +iyr:2019 +pid:281039464 hcl:#733820 + +ecl:hzl hcl:#7d3b0c hgt:191cm pid:771871096 +iyr:2012 eyr:2027 +byr:2025 + +hgt:188in hcl:z eyr:2032 iyr:1955 +byr:2027 ecl:#517bfe pid:#206bab + +hcl:#733820 iyr:2010 pid:784128823 +hgt:169cm cid:305 +ecl:grn byr:1962 + +cid:50 eyr:2022 +hcl:a916cf pid:407148034 iyr:1926 ecl:#fa1ba7 hgt:69 +byr:2028 + +hgt:193cm pid:507697987 cid:275 byr:1958 eyr:2023 ecl:brn iyr:2013 hcl:#326596 + +eyr:2025 hgt:192cm cid:95 iyr:2011 ecl:grn byr:2002 pid:399623583 hcl:#b6652a + +ecl:brn hcl:#602927 eyr:2023 pid:089068603 hgt:189cm +byr:1953 iyr:2018 +cid:160 + +hcl:f1bf94 byr:2030 +ecl:gry hgt:60in iyr:2016 +pid:4816152 + +hgt:154cm iyr:2015 ecl:gry +eyr:2024 pid:718845487 byr:1999 +hcl:#866857 + +cid:294 +hgt:186cm eyr:2026 byr:1984 +ecl:grn +hcl:#ceb3a1 pid:325370778 iyr:2010 + +pid:156980004 hcl:#c0946f iyr:2013 ecl:brn +hgt:181cm byr:1933 eyr:2023 + +hcl:#efcc98 byr:2002 hgt:158cm ecl:gmt iyr:1964 pid:195262032 +eyr:2021 + +hcl:#602927 eyr:2027 hgt:192cm byr:1945 iyr:2018 pid:366509171 ecl:oth + +pid:163cm iyr:2016 ecl:lzr hcl:#341e13 hgt:79 +cid:130 +eyr:2038 byr:2030 + +hcl:#efcc98 +byr:1979 +ecl:oth eyr:2020 pid:095314628 +hgt:162cm iyr:2015 + +byr:1998 cid:157 +pid:346442779 hcl:#b6652a hgt:162cm +ecl:amb +eyr:2023 iyr:2018 + +hcl:#d6a701 byr:1971 hgt:160cm ecl:#98c896 pid:627704105 eyr:2024 iyr:2010 + +byr:2021 +iyr:2023 +eyr:1981 hgt:68cm ecl:dne +hcl:z pid:20981493 + +pid:159037919 hgt:162cm +ecl:amb cid:244 +byr:1971 eyr:2027 +iyr:2017 hcl:#18171d + +iyr:2011 pid:086826874 +cid:162 +hgt:189cm ecl:gry +byr:1926 hcl:#888785 + +eyr:2022 hgt:152cm pid:919970712 byr:1955 hcl:#733820 iyr:2018 ecl:brn + +cid:111 ecl:#a1843f +byr:2015 hcl:z iyr:1956 +pid:186cm eyr:2030 + +byr:1991 +eyr:2024 pid:050818633 +hcl:#888785 cid:124 hgt:176cm ecl:gry iyr:2018 + +byr:1963 hgt:188cm +eyr:2021 cid:255 +ecl:oth +hcl:#a97842 +iyr:2010 pid:030540064 + +byr:1921 hgt:164cm pid:748078322 hcl:#c0946f ecl:blu +eyr:2027 +iyr:2020 + +eyr:2020 cid:214 hcl:7a942e hgt:191cm byr:1998 iyr:2012 ecl:grn pid:054135231 + +eyr:1927 pid:242147946 iyr:2010 +hcl:ea3cb1 byr:2028 +hgt:186cm ecl:dne + +ecl:brn hcl:#efcc98 eyr:2021 +hgt:160cm pid:333644730 byr:1999 +iyr:2019 + +iyr:2013 byr:1921 +hcl:#a97842 eyr:2027 +ecl:gry hgt:157cm pid:682013109 + +ecl:gry hcl:#733820 byr:1945 hgt:174cm +eyr:2020 pid:505827627 iyr:2019 + +eyr:2021 iyr:2015 ecl:oth hgt:162cm pid:137342936 byr:1922 hcl:#888785 + +hcl:#efcc98 +ecl:oth +hgt:151cm cid:312 byr:1983 +eyr:2030 pid:289512908 iyr:2020 + +byr:1989 iyr:2015 pid:057335770 ecl:grn eyr:2022 hgt:167cm hcl:#602927 + +hgt:184cm iyr:2013 hcl:#c0946f byr:1969 eyr:2028 +pid:802041641 +ecl:brn + +pid:155cm hcl:#b6652a cid:288 byr:2028 iyr:2028 hgt:150cm +ecl:#996e72 eyr:1960 + +eyr:2020 +iyr:2011 +pid:934576102 byr:1994 +ecl:amb +hcl:#18171d + +eyr:1993 byr:1995 +hgt:64cm iyr:2020 pid:15714997 hcl:#b6652a ecl:blu + +iyr:2014 +eyr:2030 pid:866047540 cid:59 hcl:#733820 byr:1951 +hgt:64in ecl:amb + +iyr:2015 +byr:1962 +hgt:69in ecl:brn +hcl:#623a2f eyr:2023 +pid:671492881 + +iyr:2020 ecl:oth hgt:154cm byr:1950 pid:924256973 +eyr:2028 +hcl:#b6652a + +byr:2021 +hgt:116 cid:348 iyr:1930 pid:76948864 hcl:z +eyr:2036 + +hgt:156cm iyr:2014 +byr:1960 +pid:720786216 +cid:99 +ecl:gry +hcl:#a97842 +eyr:2028 From cdbfc2b9736129402f1097bbedbe715db064ea8d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 4 Dec 2020 09:50:23 +0100 Subject: [PATCH 078/479] 2020: d04: ex1: add solution --- 2020/d04/ex1/ex1.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100755 2020/d04/ex1/ex1.py diff --git a/2020/d04/ex1/ex1.py b/2020/d04/ex1/ex1.py new file mode 100755 index 0000000..5193652 --- /dev/null +++ b/2020/d04/ex1/ex1.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +import sys +from typing import List + + +def validate(passport: List[str]) -> int: + fields = [ + "byr", + "iyr", + "eyr", + "hgt", + "hcl", + "ecl", + "pid", + ] + for field in fields: + if field not in passport: + return False + return True + + +def solve(passport_fields: List[List[str]]) -> int: + return sum(validate(passport) for passport in passport_fields) + + +def main() -> None: + passports: List[List[str]] = [[]] + for line in sys.stdin: + if line == "\n" or line == "": + passports.append([]) + continue + passports[-1] += [s.split(":")[0] for s in line.split(" ")] + print(solve(passports)) + + +if __name__ == "__main__": + main() From 586e95d353d3391cf9da0f414d4621cfd2b272e4 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 4 Dec 2020 09:50:31 +0100 Subject: [PATCH 079/479] 2020: d04: ex2: add input --- 2020/d04/ex2/input | 1069 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1069 insertions(+) create mode 100644 2020/d04/ex2/input diff --git a/2020/d04/ex2/input b/2020/d04/ex2/input new file mode 100644 index 0000000..710a26b --- /dev/null +++ b/2020/d04/ex2/input @@ -0,0 +1,1069 @@ +byr:2010 pid:#1bb4d8 eyr:2021 hgt:186cm iyr:2020 ecl:grt + +pid:937877382 eyr:2029 +ecl:amb hgt:187cm iyr:2019 +byr:1933 hcl:#888785 + +ecl:hzl +eyr:2020 +hcl:#18171d +iyr:2019 hgt:183cm +byr:1935 + +hcl:#7d3b0c hgt:183cm cid:135 +byr:1992 eyr:2024 iyr:2013 pid:138000309 +ecl:oth + +ecl:hzl +hgt:176cm pid:346059944 byr:1929 cid:150 eyr:1924 hcl:#fffffd iyr:2016 + +iyr:2011 +cid:99 ecl:amb +eyr:2030 hcl:#18171d +hgt:165cm pid:897123249 byr:1948 + +hcl:#cfa07d pid:827609097 ecl:gry iyr:2017 byr:1963 +eyr:2029 hgt:72in + +hcl:#6b5442 eyr:2028 iyr:2016 ecl:hzl +hgt:152cm +pid:432183209 byr:1984 + +hgt:169cm hcl:#888785 ecl:hzl pid:626107466 byr:1929 iyr:2013 cid:217 +eyr:2026 + +hcl:#bdb95d byr:1935 eyr:2023 ecl:blu iyr:2011 cid:90 hgt:64cm +pid:155167914 + +iyr:2017 +byr:1943 cid:56 +hcl:#888785 hgt:193cm pid:621305634 +ecl:amb +eyr:2024 + +ecl:gry +hcl:#a97842 pid:936999610 cid:169 byr:1991 eyr:2029 hgt:175cm iyr:2017 + +hcl:#866857 ecl:gry +byr:1975 hgt:71in +pid:180628540 eyr:2020 +iyr:2017 + +hcl:#cfa07d hgt:153cm byr:1962 cid:325 +iyr:2018 eyr:2020 +ecl:amb pid:579364506 + +hcl:#6b5442 iyr:2010 ecl:amb byr:2001 +eyr:2020 pid:406219444 +hgt:173cm + +pid:#430c70 +ecl:gry iyr:2018 hcl:#866857 eyr:2021 cid:97 byr:1997 +hgt:75cm + +iyr:2023 pid:#518780 +eyr:2034 +ecl:zzz +hgt:72cm +hcl:z byr:2010 + +pid:1961614335 hcl:#c0946f hgt:157 ecl:grn eyr:2031 byr:1972 iyr:1992 + +cid:142 +eyr:2022 ecl:amb +hgt:68in +hcl:#6b5442 byr:1927 pid:112372155 iyr:2012 + +byr:1972 +hgt:169cm +hcl:#888785 +cid:75 iyr:2015 eyr:2021 ecl:oth +pid:7889059161 + +ecl:brn +iyr:2020 +eyr:2026 hgt:151cm byr:1961 pid:468038868 hcl:#18171d + +ecl:blu +hcl:#b6652a +byr:1959 +hgt:151cm cid:109 pid:708689901 +eyr:2026 iyr:2012 + +ecl:grt byr:2024 iyr:1995 pid:225263933 hcl:z +eyr:2040 hgt:127 cid:162 + +pid:683129831 cid:144 +hcl:#a97842 hgt:155cm eyr:2030 byr:1962 +iyr:2015 +ecl:oth + +byr:2009 hcl:#866857 cid:329 iyr:1955 +eyr:1994 pid:085929595 + +byr:1940 +pid:936748944 hgt:160cm eyr:2024 iyr:2013 cid:205 +ecl:grn hcl:#c0946f + +hgt:193in cid:161 iyr:1984 +pid:#f82e35 +byr:2018 +hcl:b1a551 eyr:2014 ecl:#4d2d5b + +byr:1978 +iyr:2011 hgt:172cm hcl:#efcc98 ecl:brn pid:759624394 eyr:2020 + +eyr:2020 pid:622444743 +hcl:#a97842 +ecl:gry iyr:2014 hgt:157cm byr:1980 + +hgt:181cm eyr:2020 +iyr:2014 +hcl:#602927 ecl:brn byr:1934 + +hgt:188cm +ecl:blu eyr:2029 pid:757878469 hcl:#b6652a iyr:2017 + +byr:1995 ecl:blu hcl:#341e13 eyr:2027 iyr:2020 pid:283341241 +hgt:174cm + +byr:1960 iyr:2012 hcl:dc007d eyr:2011 hgt:166cm +pid:9889788504 +ecl:#a9b3a1 + +ecl:hzl hgt:70in pid:620966688 iyr:1998 hcl:z +eyr:2022 + +hgt:187cm cid:190 pid:818634983 byr:1925 ecl:gry hcl:#ceb3a1 +eyr:2021 iyr:2015 + +hcl:#c0946f iyr:2017 +byr:1953 eyr:2030 hgt:67in pid:085876735 ecl:hzl + +pid:205284134 +hcl:#cfa07d byr:1987 hgt:167cm +eyr:2022 ecl:oth iyr:2020 + +iyr:2018 +hgt:180cm pid:232535961 eyr:2027 byr:1999 +hcl:#18171d ecl:oth + +cid:342 hgt:171cm ecl:blu byr:1920 hcl:#18171d eyr:2023 iyr:2012 +pid:353601791 + +byr:1956 +ecl:brn pid:141896408 iyr:2012 cid:116 eyr:2028 hgt:164cm +hcl:#866857 + +hcl:#fffffd ecl:oth eyr:2030 hgt:67in pid:855777018 byr:1975 +iyr:2012 + +ecl:blu pid:45257034 hcl:#c5447e iyr:1928 cid:212 byr:1974 + +pid:080116868 cid:97 eyr:2021 iyr:2020 ecl:grn byr:1987 hgt:62in hcl:#efcc98 + +eyr:2027 hcl:#efcc98 iyr:2020 ecl:amb cid:111 +pid:143966954 +hgt:165cm + +iyr:2015 byr:1941 pid:798564127 +hgt:183cm ecl:oth eyr:2020 + +byr:1999 +iyr:2017 hcl:#ceb3a1 +pid:640883740 hgt:164cm +cid:105 ecl:hzl +eyr:2022 + +iyr:2014 eyr:2023 +ecl:grn hcl:#ceb3a1 +hgt:188cm byr:1981 pid:185076942 cid:342 + +hgt:150cm +iyr:2013 eyr:2035 cid:184 hcl:#341e13 pid:#e2dd63 byr:2014 ecl:brn + +eyr:2024 iyr:2015 ecl:brn hgt:76in +hcl:#866857 byr:1958 +pid:886486245 + +ecl:amb cid:113 byr:1931 pid:087380735 +iyr:2010 +eyr:2028 +hgt:161cm + +byr:1926 eyr:2024 iyr:2012 pid:036335738 hcl:#c0946f hgt:153cm ecl:brn + +hcl:bf952a +hgt:169in +eyr:1925 pid:166cm iyr:2028 ecl:lzr byr:1938 + +hgt:154cm hcl:#733820 ecl:oth iyr:2016 +byr:1925 +eyr:2020 pid:590365390 + +eyr:2029 hgt:166cm pid:670283165 +hcl:#ceb3a1 iyr:2018 +byr:1955 +ecl:gry + +hgt:181cm +iyr:2016 hcl:#866857 byr:1933 +eyr:2028 ecl:blu + +hgt:184cm +cid:138 hcl:#623a2f +pid:081880232 +byr:1929 ecl:hzl eyr:2030 +iyr:2015 + +pid:825698872 +eyr:2026 hgt:181cm iyr:2015 hcl:#866857 byr:1950 ecl:gry + +eyr:2022 byr:2002 iyr:2013 hcl:#fffffd ecl:hzl pid:687380398 +hgt:173cm + +byr:2016 ecl:zzz pid:0514910377 hcl:ebe8b2 eyr:2025 +iyr:2011 hgt:183cm + +ecl:amb hgt:67in +pid:602547016 byr:1985 +eyr:2021 +iyr:2014 + +iyr:2014 eyr:2020 ecl:grn pid:642261584 +byr:1970 hgt:190cm cid:278 hcl:#7d3b0c + +eyr:2035 cid:226 hcl:64ac73 +byr:2007 +pid:176cm ecl:#927fbf iyr:2006 + +iyr:2019 eyr:2026 ecl:brn hgt:162cm +cid:108 +hcl:#ceb3a1 pid:774441166 byr:1951 + +hgt:166cm eyr:2024 hcl:#b6652a byr:1934 pid:260873380 iyr:2016 + +hcl:z +iyr:2015 ecl:blu +eyr:2040 byr:1927 pid:431855667 +hgt:173cm +cid:209 + +eyr:2034 cid:139 +ecl:#cb7564 +byr:2023 hgt:172in iyr:2027 pid:2877047600 + +ecl:brn +cid:125 hcl:#888785 +iyr:2011 pid:739399822 hgt:184cm byr:1989 + +hcl:#c0946f +pid:891125961 +hgt:175cm +iyr:2010 eyr:2027 ecl:gry +byr:1930 + +hgt:164cm byr:1935 eyr:2023 pid:684366743 +ecl:oth +hcl:#18171d iyr:2013 + +hcl:#341e13 hgt:64in byr:1959 ecl:#c53bbb iyr:2014 eyr:2029 pid:174cm + +eyr:1943 ecl:#e52638 +hcl:06a964 byr:1959 cid:342 iyr:2029 hgt:178in pid:150cm + +byr:1966 hcl:#733820 iyr:2020 +ecl:gry eyr:2021 pid:229789071 + +pid:363947487 +ecl:blu +hcl:#623a2f +byr:1972 +iyr:2017 hgt:184cm +eyr:2023 + +ecl:oth pid:460855562 +iyr:2010 cid:148 hcl:z hgt:74cm byr:2005 + +eyr:2027 iyr:2017 hgt:172cm +byr:1975 +ecl:amb cid:97 hcl:#c0946f pid:591950054 + +eyr:2022 ecl:oth hgt:185cm +hcl:#6b5442 +byr:1978 +iyr:2018 pid:849124937 cid:78 + +iyr:1927 hgt:121 +eyr:2020 ecl:#c73b1a hcl:#cfa07d pid:4505701953 byr:2020 +cid:235 + +hgt:183cm hcl:#341e13 iyr:2019 byr:1932 ecl:#144539 +pid:184cm eyr:1954 + +iyr:2020 cid:332 byr:1930 hcl:#6b5442 hgt:168cm ecl:amb +eyr:2023 pid:332084752 + +ecl:blu +byr:1922 cid:135 iyr:2019 eyr:2028 pid:481801918 +hcl:#efcc98 hgt:76in + +ecl:grn pid:188906975 cid:153 hgt:173cm eyr:2029 iyr:2012 hcl:#733820 byr:2001 + +eyr:2029 +byr:1948 iyr:2020 +hgt:167cm ecl:brn hcl:#623a2f pid:577624152 + +hcl:#18171d +pid:262528276 byr:1949 +iyr:2020 +eyr:2023 + +hcl:#c0946f iyr:2016 byr:1967 ecl:brn +hgt:162cm +pid:139002508 eyr:2030 + +eyr:2030 +hgt:72in iyr:2013 pid:542944485 cid:112 +byr:1950 hcl:#a97842 ecl:amb + +pid:772544664 eyr:2023 ecl:gry hgt:159cm iyr:2012 +byr:1956 hcl:#602927 + +hgt:172in ecl:grt pid:668387651 byr:2019 +iyr:1995 hcl:bc51ff eyr:1921 + +pid:322272953 ecl:brn hcl:#a97842 byr:1990 +eyr:2021 +iyr:2017 +hgt:181cm + +eyr:2029 +iyr:2011 +pid:503169142 byr:1980 +hcl:#a97842 ecl:oth + +pid:514042929 +ecl:amb eyr:2030 hgt:154cm +iyr:2010 hcl:#623a2f +byr:1989 + +byr:1988 pid:156381939 iyr:2016 hgt:161cm eyr:2030 ecl:brn hcl:#7d3b0c + +pid:545819361 hgt:191cm iyr:2012 byr:1982 eyr:2025 ecl:zzz +hcl:z + +pid:872911892 +byr:1924 iyr:1974 +hcl:#602927 +ecl:brn hgt:154cm +eyr:2028 + +hcl:#602927 hgt:188cm +byr:2007 pid:503933918 ecl:utc +eyr:2030 iyr:2020 cid:132 + +ecl:hzl +eyr:2020 hcl:#888785 hgt:181cm +pid:721383537 +iyr:2018 +byr:1983 cid:50 + +pid:8590606 hcl:#18171d +eyr:2039 iyr:2024 +cid:161 byr:2027 + +hgt:160in byr:1956 +cid:214 pid:187cm iyr:2027 +hcl:z +eyr:2033 ecl:grn + +byr:2029 pid:90562860 hcl:4fa0d1 iyr:2024 +eyr:2040 cid:62 ecl:#07ae33 hgt:186in + +pid:557319679 byr:1945 hgt:182cm eyr:2026 iyr:2012 hcl:#866857 ecl:hzl cid:219 + +eyr:2028 iyr:2022 ecl:zzz cid:273 +hgt:133 pid:4084335529 byr:2011 hcl:z + +pid:69196974 hcl:z iyr:2014 ecl:amb byr:1928 + +hgt:183in +eyr:2028 pid:771762218 byr:2003 ecl:dne hcl:70eb58 iyr:2027 cid:330 + +ecl:hzl pid:195721774 hcl:#602927 byr:1945 hgt:186cm +eyr:2037 +iyr:2011 + +ecl:brn eyr:2028 hgt:171cm +byr:1980 hcl:#fffffd pid:563089389 iyr:2016 + +eyr:2027 iyr:2011 ecl:gry byr:1932 hcl:#18171d +pid:398526372 + +pid:97363921 hgt:178cm +ecl:oth eyr:2028 +byr:1930 cid:345 iyr:2018 hcl:#1fb2f0 + +ecl:amb iyr:2012 +byr:1961 pid:679312513 eyr:2026 hcl:#cfa07d +hgt:174cm + +byr:1980 +hcl:#80055d +cid:235 +ecl:oth pid:159696517 eyr:2030 +hgt:191cm +iyr:2012 + +iyr:2013 eyr:2027 hcl:#866857 +pid:621184472 cid:137 hgt:175cm byr:2000 +ecl:hzl + +byr:1998 hgt:166cm +ecl:oth eyr:2025 +iyr:2018 +hcl:#a97842 pid:358495679 + +byr:1928 ecl:oth cid:122 hcl:#6b5442 +hgt:189cm eyr:2020 iyr:2018 + +hgt:186cm +byr:2020 hcl:79d685 ecl:grt iyr:1944 pid:3659998623 eyr:2000 + +hgt:63in ecl:oth eyr:2029 +iyr:2013 pid:942282912 hcl:#c0946f byr:1989 + +byr:1997 hcl:#623a2f eyr:2026 cid:149 +pid:702981538 +ecl:amb hgt:178cm iyr:2017 + +ecl:brn iyr:2015 byr:1932 pid:191192548 cid:318 +hcl:#7d3b0c eyr:2020 + +hcl:#866857 eyr:2028 pid:341036511 cid:343 iyr:2020 hgt:173cm +byr:1973 ecl:blu + +iyr:2016 pid:165707654 hgt:181cm ecl:hzl +cid:119 byr:1973 hcl:#b6652a + +iyr:2014 pid:833337583 byr:1936 cid:91 hcl:#602927 ecl:amb hgt:165cm +eyr:2021 + +byr:1938 ecl:grn hcl:#a55daf eyr:2021 cid:199 pid:701515796 +iyr:2015 hgt:71in + +hcl:#a97842 +ecl:blu +eyr:2030 iyr:2020 +hgt:155cm byr:1927 +pid:524488639 + +pid:385084163 eyr:2025 +hcl:#866857 ecl:oth iyr:2020 hgt:177cm byr:2002 + +eyr:2029 hgt:177cm +cid:142 ecl:hzl hcl:#866857 +iyr:2015 byr:1946 pid:459543573 + +pid:826977286 eyr:2030 iyr:2016 byr:1996 +hcl:#efcc98 +ecl:gry hgt:180cm + +eyr:2029 +iyr:1976 pid:872821863 ecl:gry byr:2030 + +hgt:191cm byr:1924 pid:918753019 ecl:blu +iyr:2019 hcl:#5d69e0 eyr:2024 + +ecl:lzr iyr:2020 pid:991375034 byr:1947 +eyr:1923 hcl:8224f6 hgt:157 + +eyr:2021 byr:1946 +hgt:189cm ecl:grn iyr:2010 hcl:#cfa07d pid:246923037 + +iyr:2016 +ecl:oth hgt:155cm byr:1962 pid:924702739 eyr:2028 hcl:#7d3b0c + +pid:7358100461 hgt:183cm byr:2011 hcl:#a97842 +iyr:2020 eyr:1963 cid:71 + +ecl:hzl hcl:#c0946f +byr:1934 +hgt:183cm +iyr:2018 pid:433993423 eyr:2028 + +hgt:183cm hcl:#cfa07d iyr:2018 +byr:1975 eyr:2024 + +eyr:2021 ecl:amb byr:1992 hgt:164cm iyr:2020 +cid:302 + +pid:271720491 hgt:161cm +iyr:2012 byr:1947 hcl:#6b5442 ecl:grn eyr:2024 + +pid:860852799 eyr:2021 byr:1980 hcl:#6b5442 iyr:2010 hgt:174cm +ecl:hzl + +hcl:#623a2f eyr:2028 iyr:2016 pid:813453232 hgt:173cm cid:131 +byr:1962 + +byr:1975 +hgt:177cm +pid:290098810 cid:241 +ecl:oth hcl:#a5fc9f eyr:2021 iyr:2013 + +byr:1947 pid:762351259 hgt:178cm ecl:amb hcl:#d07b27 iyr:2017 eyr:2028 cid:271 + +iyr:2012 pid:053790533 eyr:2023 ecl:grn hcl:#623a2f byr:1939 cid:70 hgt:189cm + +hcl:#c0946f pid:891312170 byr:1986 iyr:2012 +hgt:163cm eyr:2023 cid:150 + +iyr:2015 +byr:1963 +pid:695024197 hcl:#efcc98 ecl:brn hgt:166cm eyr:2022 +cid:276 + +eyr:1945 hgt:150in byr:2007 +ecl:utc hcl:z cid:272 +pid:186cm iyr:1927 + +pid:956296646 iyr:2015 hgt:168cm +byr:1979 eyr:2029 ecl:gry hcl:#866857 + +pid:745452488 byr:1998 eyr:2025 hcl:#602927 +hgt:158cm iyr:2015 + +eyr:2027 +iyr:2017 +pid:6173634679 byr:2001 ecl:hzl +hcl:babc41 +hgt:76cm + +ecl:grn +iyr:2019 +hcl:#3881ca byr:1975 eyr:2023 hgt:162cm + +hcl:#ceb3a1 hgt:169in pid:398759957 +eyr:2020 byr:2016 +iyr:2011 ecl:#be3622 + +hgt:156cm +hcl:#b6652a pid:166cm iyr:2027 byr:2003 +eyr:2036 ecl:#6d4df1 +cid:109 + +eyr:2026 pid:295161300 ecl:gry +hgt:160cm byr:1950 hcl:#746f08 +iyr:2017 + +iyr:2010 cid:335 +eyr:2024 +hcl:#866857 +byr:1948 hgt:166cm pid:178927953 +ecl:blu + +hgt:161cm cid:210 eyr:2025 +byr:1920 +ecl:gry iyr:2020 +hcl:#7d3b0c pid:443548961 + +iyr:2019 +pid:320015839 eyr:2029 +hcl:#fffffd ecl:oth byr:1953 hgt:182cm + +eyr:2038 hcl:abb3ad iyr:2015 pid:174cm hgt:167cm +ecl:hzl + +byr:1982 pid:798153758 +ecl:brn +hgt:161cm hcl:#341e13 eyr:2023 +iyr:2014 + +byr:1938 +pid:193cm hgt:190cm ecl:amb iyr:2019 +eyr:2028 cid:270 +hcl:#18171d + +pid:711886098 byr:1962 +eyr:2028 ecl:grn +hgt:151cm +hcl:#cfa07d +iyr:2019 + +eyr:2028 iyr:2011 +ecl:gry +pid:550207629 hgt:183cm +hcl:#888785 byr:1920 cid:96 + +ecl:utc +eyr:2021 +byr:1962 hgt:175cm +pid:872298092 +hcl:z iyr:2017 cid:197 + +iyr:2010 +hcl:5b88b0 byr:2021 ecl:gmt +eyr:2040 hgt:179cm pid:161cm + +pid:56869473 eyr:2036 ecl:lzr +iyr:2027 hcl:z + +hcl:#602927 +hgt:151cm pid:780342729 ecl:oth iyr:2015 + +byr:2027 hcl:#fffffd +pid:5609758115 eyr:2037 +iyr:2017 +ecl:#6f0329 hgt:97 + +iyr:2025 hcl:z byr:2007 ecl:gmt +pid:#eda9ab +hgt:154in eyr:2028 cid:247 + +ecl:utc pid:216181141 +hgt:161cm eyr:2026 +hcl:#d38f20 byr:2028 + +ecl:grn byr:1955 hcl:#c0946f +iyr:2017 eyr:2027 pid:746303487 +hgt:72in + +pid:489225602 +iyr:2018 ecl:gry hgt:65in byr:1982 +cid:248 +eyr:2025 + +hcl:#ceb3a1 pid:663798116 byr:1937 iyr:2010 +hgt:167cm ecl:hzl + +pid:329032527 +hcl:#ceb3a1 +iyr:2014 ecl:gry +hgt:169cm +byr:1932 + +hcl:#545d0c +ecl:brn iyr:2023 hgt:186cm cid:209 +pid:886392748 +eyr:2030 byr:1984 + +hgt:80 iyr:1943 hcl:#733820 byr:1937 eyr:2029 pid:625851706 cid:309 + +pid:73586582 hgt:156 +cid:162 ecl:zzz eyr:2025 +iyr:1990 byr:1940 hcl:z + +iyr:2010 +eyr:2023 pid:162901454 +hcl:#733820 byr:1958 ecl:gry +hgt:159cm + +byr:2007 +hcl:#cfa07d +cid:261 pid:148538600 ecl:hzl +hgt:64cm iyr:2021 +eyr:2040 + +iyr:1997 byr:2007 ecl:#24adc8 +pid:55794137 cid:219 eyr:2037 +hgt:75cm hcl:z + +hcl:#efcc98 byr:1940 ecl:amb iyr:2012 +pid:594237790 eyr:2029 cid:112 +hgt:173cm + +byr:1941 cid:70 eyr:2026 hgt:178cm hcl:#733820 +ecl:brn iyr:2013 pid:425263722 + +eyr:2025 byr:1998 iyr:2014 ecl:amb pid:188113611 hcl:#341e13 + +byr:1950 +iyr:2017 hgt:74in cid:238 +pid:897969952 +ecl:hzl eyr:2022 hcl:#0a18bb + +eyr:2022 +iyr:2015 ecl:grn +hgt:179cm byr:1956 hcl:#7fd789 pid:201629099 + +eyr:2024 +pid:483257417 ecl:hzl iyr:2010 hgt:159cm +hcl:z +byr:1968 + +pid:916586207 ecl:amb iyr:2011 eyr:2022 hgt:191cm hcl:#602927 byr:1923 + +pid:175608183 +hgt:190cm hcl:#fffffd iyr:2017 byr:1993 +ecl:blu + +eyr:2029 hgt:173cm +pid:669662258 byr:1997 iyr:2015 ecl:brn cid:153 hcl:#888785 + +hcl:d899cf +ecl:#876029 hgt:76cm iyr:1997 pid:40406158 +eyr:2032 byr:2010 + +eyr:2023 ecl:hzl cid:162 hcl:#602927 iyr:2015 +pid:82885029 +hgt:75cm byr:1946 + +byr:1962 hgt:167in +ecl:brn +hcl:#c0946f iyr:2014 pid:488520708 eyr:2027 cid:271 + +hgt:180cm pid:358771245 eyr:2020 +ecl:grn iyr:2018 hcl:#efcc98 +byr:1979 + +cid:273 ecl:gry pid:424388351 iyr:2010 hcl:#c0946f byr:1988 +hgt:166cm +eyr:2027 + +ecl:gry hcl:#a97842 hgt:189cm +pid:743213778 iyr:2015 byr:1959 + +iyr:2021 byr:2021 +ecl:#a79d2e cid:89 +hcl:#5fb8d7 eyr:2001 pid:#5575b3 hgt:60cm + +eyr:2021 +iyr:2017 +cid:87 hgt:164cm pid:560394910 ecl:hzl hcl:#ceb3a1 +byr:1955 + +iyr:2018 +hcl:#27f7e6 hgt:160cm +eyr:2029 pid:033692111 +ecl:amb byr:1920 + +hgt:160cm eyr:2028 iyr:2010 ecl:blu byr:1974 pid:858060501 hcl:#733820 + +byr:1961 pid:818700605 cid:93 eyr:2024 +hgt:188cm hcl:#866857 +ecl:gry + +eyr:2029 +hgt:180cm iyr:2017 +ecl:hzl byr:1951 cid:158 +hcl:#888785 + +cid:290 +eyr:2027 byr:1986 +ecl:blu +pid:076339632 iyr:2010 +hcl:#341e13 +hgt:167cm + +eyr:2023 iyr:1990 +hcl:#623a2f byr:2005 hgt:116 + +hgt:167in iyr:1944 ecl:dne eyr:2031 hcl:465775 pid:2505694463 + +cid:93 eyr:2024 iyr:2010 +hgt:143 pid:154cm +ecl:#c6f352 +hcl:#a97842 byr:1925 + +pid:600685520 byr:1967 hcl:#ceb3a1 iyr:2014 ecl:oth cid:226 hgt:179cm eyr:2026 + +hcl:#ceb3a1 +pid:789956738 +byr:1938 hgt:171cm cid:183 eyr:2021 iyr:2011 ecl:amb + +hcl:#613f4b hgt:151cm eyr:2025 +ecl:amb byr:1985 pid:493339889 +iyr:2013 + +hcl:78cda6 pid:36823553 +iyr:2021 cid:235 byr:2028 eyr:2011 hgt:113 +ecl:#02ce86 + +pid:529274811 +iyr:2012 hgt:103 ecl:blu hcl:#341e13 eyr:2023 +byr:1959 + +hgt:166cm iyr:2014 ecl:xry cid:276 byr:2014 hcl:#7d3b0c pid:146851133 + +pid:359823289 hgt:181cm byr:1978 hcl:#c0946f +eyr:2022 +iyr:2011 ecl:hzl + +pid:029400877 +eyr:2026 +byr:1983 iyr:2015 hcl:#cfa07d cid:70 ecl:gry + +hcl:#ceb3a1 eyr:2021 hgt:190cm +ecl:amb iyr:2017 +pid:411804678 byr:1950 + +byr:1926 iyr:2017 ecl:blu pid:103821113 eyr:2026 hcl:#c0946f cid:71 hgt:152cm + +cid:108 byr:1955 +iyr:2010 eyr:2022 hgt:169cm hcl:#733820 +pid:208715596 ecl:gry + +pid:352807405 ecl:blu +hcl:#b1214c iyr:2012 hgt:165cm byr:1929 +cid:139 +eyr:2020 + +hcl:#cfa07d hgt:151cm byr:1987 +eyr:2024 +cid:140 pid:884441477 + +pid:#dade9c eyr:1979 hgt:191cm +byr:2026 iyr:2018 hcl:z ecl:lzr + +cid:259 +pid:644561358 +ecl:blu hgt:164cm iyr:2013 byr:1997 +eyr:2023 hcl:#108f16 + +ecl:oth +cid:141 hgt:66in pid:877258886 iyr:2019 byr:1949 hcl:#18171d +eyr:2027 + +byr:1932 cid:103 hgt:175cm pid:464473181 ecl:xry iyr:2013 hcl:51fd65 + +cid:175 iyr:2014 eyr:1959 +ecl:#d83076 hgt:182cm pid:863972537 hcl:#efcc98 byr:1986 + +hgt:181cm pid:869641194 hcl:#efcc98 cid:141 ecl:gmt iyr:2017 byr:1981 eyr:2027 + +eyr:1938 +iyr:2026 cid:278 ecl:brn byr:1936 hgt:150 pid:6902040050 + +eyr:2027 iyr:2014 pid:110887179 +hcl:#a97842 ecl:brn cid:262 hgt:66in +byr:1954 + +ecl:grn +pid:498972747 +eyr:2024 hcl:#341e13 iyr:2011 byr:1932 hgt:186cm + +cid:59 +hcl:#6b5442 iyr:2018 eyr:2028 pid:866696485 +hgt:178cm ecl:gry + +pid:598961001 +eyr:2024 iyr:2019 +byr:1963 ecl:grn +hcl:#c0946f + +eyr:2024 hgt:172cm pid:295056305 ecl:blu byr:1926 +iyr:2017 hcl:#341e13 + +byr:2001 hcl:#6b5442 hgt:164cm +pid:862982189 ecl:grn iyr:2019 eyr:2030 + +hgt:69cm eyr:2014 ecl:hzl iyr:2025 +hcl:2812c9 +cid:74 byr:1980 + +hcl:#888785 +pid:409489862 +iyr:2011 hgt:186cm ecl:gry byr:1985 +eyr:2028 + +cid:221 pid:6849250876 hgt:169cm hcl:z +iyr:2013 +byr:1950 eyr:2022 + +pid:189083891 byr:1983 hcl:#623a2f ecl:hzl iyr:2013 eyr:2026 hgt:66in + +pid:581546673 cid:269 eyr:2030 hgt:191cm byr:1945 hcl:#18171d +iyr:2015 +ecl:amb + +hgt:158cm ecl:hzl +cid:234 eyr:2023 +byr:1996 hcl:#7ac7ad +iyr:2020 pid:666748924 + +iyr:2013 ecl:grn cid:53 hgt:172cm eyr:2028 pid:406602771 hcl:#fffffd byr:1959 + +hgt:63cm hcl:eaaf60 byr:2026 iyr:1981 +pid:#baf2cf cid:117 ecl:hzl + +eyr:2035 byr:2014 +iyr:2028 hcl:z ecl:#acd426 +cid:261 pid:174cm hgt:182in + +ecl:amb pid:#4bb0a8 eyr:2027 hgt:155cm hcl:#623a2f +byr:1956 +iyr:2011 + +eyr:2012 cid:53 byr:2005 ecl:oth +hgt:183in iyr:1974 pid:150cm + +iyr:2020 pid:833821322 ecl:blu byr:1944 hgt:169cm hcl:#623a2f eyr:2020 + +hgt:60in ecl:oth byr:1962 eyr:2022 cid:99 +iyr:2019 +pid:281039464 hcl:#733820 + +ecl:hzl hcl:#7d3b0c hgt:191cm pid:771871096 +iyr:2012 eyr:2027 +byr:2025 + +hgt:188in hcl:z eyr:2032 iyr:1955 +byr:2027 ecl:#517bfe pid:#206bab + +hcl:#733820 iyr:2010 pid:784128823 +hgt:169cm cid:305 +ecl:grn byr:1962 + +cid:50 eyr:2022 +hcl:a916cf pid:407148034 iyr:1926 ecl:#fa1ba7 hgt:69 +byr:2028 + +hgt:193cm pid:507697987 cid:275 byr:1958 eyr:2023 ecl:brn iyr:2013 hcl:#326596 + +eyr:2025 hgt:192cm cid:95 iyr:2011 ecl:grn byr:2002 pid:399623583 hcl:#b6652a + +ecl:brn hcl:#602927 eyr:2023 pid:089068603 hgt:189cm +byr:1953 iyr:2018 +cid:160 + +hcl:f1bf94 byr:2030 +ecl:gry hgt:60in iyr:2016 +pid:4816152 + +hgt:154cm iyr:2015 ecl:gry +eyr:2024 pid:718845487 byr:1999 +hcl:#866857 + +cid:294 +hgt:186cm eyr:2026 byr:1984 +ecl:grn +hcl:#ceb3a1 pid:325370778 iyr:2010 + +pid:156980004 hcl:#c0946f iyr:2013 ecl:brn +hgt:181cm byr:1933 eyr:2023 + +hcl:#efcc98 byr:2002 hgt:158cm ecl:gmt iyr:1964 pid:195262032 +eyr:2021 + +hcl:#602927 eyr:2027 hgt:192cm byr:1945 iyr:2018 pid:366509171 ecl:oth + +pid:163cm iyr:2016 ecl:lzr hcl:#341e13 hgt:79 +cid:130 +eyr:2038 byr:2030 + +hcl:#efcc98 +byr:1979 +ecl:oth eyr:2020 pid:095314628 +hgt:162cm iyr:2015 + +byr:1998 cid:157 +pid:346442779 hcl:#b6652a hgt:162cm +ecl:amb +eyr:2023 iyr:2018 + +hcl:#d6a701 byr:1971 hgt:160cm ecl:#98c896 pid:627704105 eyr:2024 iyr:2010 + +byr:2021 +iyr:2023 +eyr:1981 hgt:68cm ecl:dne +hcl:z pid:20981493 + +pid:159037919 hgt:162cm +ecl:amb cid:244 +byr:1971 eyr:2027 +iyr:2017 hcl:#18171d + +iyr:2011 pid:086826874 +cid:162 +hgt:189cm ecl:gry +byr:1926 hcl:#888785 + +eyr:2022 hgt:152cm pid:919970712 byr:1955 hcl:#733820 iyr:2018 ecl:brn + +cid:111 ecl:#a1843f +byr:2015 hcl:z iyr:1956 +pid:186cm eyr:2030 + +byr:1991 +eyr:2024 pid:050818633 +hcl:#888785 cid:124 hgt:176cm ecl:gry iyr:2018 + +byr:1963 hgt:188cm +eyr:2021 cid:255 +ecl:oth +hcl:#a97842 +iyr:2010 pid:030540064 + +byr:1921 hgt:164cm pid:748078322 hcl:#c0946f ecl:blu +eyr:2027 +iyr:2020 + +eyr:2020 cid:214 hcl:7a942e hgt:191cm byr:1998 iyr:2012 ecl:grn pid:054135231 + +eyr:1927 pid:242147946 iyr:2010 +hcl:ea3cb1 byr:2028 +hgt:186cm ecl:dne + +ecl:brn hcl:#efcc98 eyr:2021 +hgt:160cm pid:333644730 byr:1999 +iyr:2019 + +iyr:2013 byr:1921 +hcl:#a97842 eyr:2027 +ecl:gry hgt:157cm pid:682013109 + +ecl:gry hcl:#733820 byr:1945 hgt:174cm +eyr:2020 pid:505827627 iyr:2019 + +eyr:2021 iyr:2015 ecl:oth hgt:162cm pid:137342936 byr:1922 hcl:#888785 + +hcl:#efcc98 +ecl:oth +hgt:151cm cid:312 byr:1983 +eyr:2030 pid:289512908 iyr:2020 + +byr:1989 iyr:2015 pid:057335770 ecl:grn eyr:2022 hgt:167cm hcl:#602927 + +hgt:184cm iyr:2013 hcl:#c0946f byr:1969 eyr:2028 +pid:802041641 +ecl:brn + +pid:155cm hcl:#b6652a cid:288 byr:2028 iyr:2028 hgt:150cm +ecl:#996e72 eyr:1960 + +eyr:2020 +iyr:2011 +pid:934576102 byr:1994 +ecl:amb +hcl:#18171d + +eyr:1993 byr:1995 +hgt:64cm iyr:2020 pid:15714997 hcl:#b6652a ecl:blu + +iyr:2014 +eyr:2030 pid:866047540 cid:59 hcl:#733820 byr:1951 +hgt:64in ecl:amb + +iyr:2015 +byr:1962 +hgt:69in ecl:brn +hcl:#623a2f eyr:2023 +pid:671492881 + +iyr:2020 ecl:oth hgt:154cm byr:1950 pid:924256973 +eyr:2028 +hcl:#b6652a + +byr:2021 +hgt:116 cid:348 iyr:1930 pid:76948864 hcl:z +eyr:2036 + +hgt:156cm iyr:2014 +byr:1960 +pid:720786216 +cid:99 +ecl:gry +hcl:#a97842 +eyr:2028 From f8afee351caa730181a767f96cfeb83c0fc93555 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 4 Dec 2020 09:50:41 +0100 Subject: [PATCH 080/479] 2020: d04: ex2: add solution --- 2020/d04/ex2/ex2.py | 109 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100755 2020/d04/ex2/ex2.py diff --git a/2020/d04/ex2/ex2.py b/2020/d04/ex2/ex2.py new file mode 100755 index 0000000..61cc674 --- /dev/null +++ b/2020/d04/ex2/ex2.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python + +import re +import sys +from typing import List, Tuple + +Field = Tuple[str, ...] + + +def validate_byr(field: str) -> bool: + pattern = "^[0-9]{4}$" + if not re.fullmatch(pattern, field): + return False + val = int(field) + return 1920 <= val <= 2002 + + +def validate_iyr(field: str) -> bool: + pattern = "^[0-9]{4}$" + if not re.fullmatch(pattern, field): + return False + val = int(field) + return 2010 <= val <= 2020 + + +def validate_eyr(field: str) -> bool: + pattern = "^[0-9]{4}$" + if not re.fullmatch(pattern, field): + return False + val = int(field) + return 2020 <= val <= 2030 + + +def validate_hgt(field: str) -> bool: + pattern = "^[0-9]+(cm|in)$" + if not re.fullmatch(pattern, field): + return False + val = int(field[:-2]) + if "cm" in field: + return 150 <= val <= 193 + return 59 <= val <= 76 + + +def validate_hcl(field: str) -> bool: + pattern = "^#[a-f0-9]{6}$" + if not re.fullmatch(pattern, field): + return False + return True + + +def validate_ecl(field: str) -> bool: + return field in { + "amb", + "blu", + "brn", + "gry", + "grn", + "hzl", + "oth", + } + + +def validate_pid(field: str) -> bool: + pattern = "^[0-9]{9}$" + if not re.fullmatch(pattern, field): + return False + return True + + +def validate(passport: List[Field]) -> int: + fields = { + "byr": validate_byr, + "iyr": validate_iyr, + "eyr": validate_eyr, + "hgt": validate_hgt, + "hcl": validate_hcl, + "ecl": validate_ecl, + "pid": validate_pid, + } + tot = 0 + for field in passport: + if len(field) != 2: + continue + if field[0] not in fields: + if field[0] == "cid": + continue + return False + if not fields[field[0]](field[1].strip()): + return False + tot += 1 + return tot == len(fields) + + +def solve(passport_fields: List[List[Field]]) -> int: + return sum(validate(passport) for passport in passport_fields) + + +def main() -> None: + passports: List[List[Field]] = [[]] + for line in sys.stdin: + if line == "\n" or line == "": + passports.append([]) + continue + passports[-1] += [tuple(s.split(":")) for s in line.split(" ") if s] + print(solve(passports)) + + +if __name__ == "__main__": + main() From 83e4e426ab42e3ac1396a87f25e183be3edf27ac Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 5 Dec 2020 09:28:45 +0100 Subject: [PATCH 081/479] 2020: d05: ex1: add input --- 2020/d05/ex1/input | 781 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 781 insertions(+) create mode 100644 2020/d05/ex1/input diff --git a/2020/d05/ex1/input b/2020/d05/ex1/input new file mode 100644 index 0000000..5145d8e --- /dev/null +++ b/2020/d05/ex1/input @@ -0,0 +1,781 @@ +FBFFBFFRLL +BFFFFBBRLR +FFFBBBBRLR +FBFFFBFLRL +FFBFBFFRRL +FFBBBBFRRR +FBFFBFBLRR +FFBBFBFRRL +FFFFBBFRRL +BFBBBBBLLL +FFBFBFBLLL +FFBFFFBLLL +FBBBFBFRLL +BBFFFBFRRR +FFFBFBBLLR +FBFBFBFRRR +BBFFBFBRLL +FBFBBBBLRL +FBFFFFFLLL +BFFFFFFRLL +BFFFBFBLRL +BFBBBFBRRL +BFFFBFFRRL +FBFFFFFRRR +FFBBBBBLLR +BFBBFFBLRL +FBBFBBBRLR +BFBFBFFRLL +BFBFBFBRLL +BFFBFBFLLL +FFBBFFBLRL +FBBFFBFLRR +FBBBFBBRRR +BFBFFBFRLR +BFBBBFBLLL +FFBFBBBLRR +BFBFFBFLLL +FBFBFBBLLL +BFBBBFBLRL +FBFBFBFLRL +FFBFFBFRRL +FBBFFBFLLL +BFBBBBBLRL +FBBBBBFRLR +BFFFBBFRLL +FBBBBFFLLR +FBBBBBFRLL +BFBBBFFRLR +BFBBBFBRLL +BFFFBFFLLL +FFFBFBFLRL +BFFBBFFLRL +BBFFFBFRLL +BFBBFFBRLR +BFBFBFBRRL +BBFFFBFRRL +FBBFBBBLRR +FFBFBBBLLL +BFFFBFBRLR +FFBBFBBLLL +FBFBBFBLLL +BFBBFBFLLR +FFBFBBBRRL +FFBFFFFLRL +FFFBBFFLRR +FBBBBBFRRR +FFFFBBBRLL +BFBFBBBRRR +BBFFBFBRRL +FBFBBFFRLR +FBBFFBFRRR +BBFFBFBRRR +FBFBBFBLRR +FBBFFBBLRR +FBBBBFFRLL +BFBFFFBRLR +FBFBBFBRRL +FFBFBBFRRR +FBFBFFFRLL +BFBBFFBLLR +FBFFFFBRLR +BFBBBFFRLL +FFBBFFBRLR +FFFBBFBRLL +FBBBBBBLRR +FBFFBBBLRR +BFFFFBFLRL +BBFFFFFLRR +BFFBFFBLLR +FFBBBFFRLL +BFBFBFBRLR +FBBFBFBLRR +FBFBBBFRLR +FBFFBBBRRR +FBBFFBFRLL +FBBBFFFRLR +BFBBBBFLLR +BFFFBFFLLR +FFBFFFBRRR +FBFFFBFLLR +FFFFBBBLLR +BFBFFFBRLL +BFFBBFBLRL +BFFBFBFLLR +FFBFFBFRLR +BFBFFFBRRL +FFBBFBFLLL +BFBBBBBRLR +BFBFBFBLRR +FBFFBFBLLR +FBFBFBBRRL +BFBFBBBLLL +FFBBFBBLRL +FBFFFBFRRL +BFBBFFFLRR +BFBFBBFRRR +FBFFFFBLRL +BBFFBBFRRR +FFBFFBBRLR +FBBFBFBLRL +BFBFFFBRRR +FFFBBBFLRL +BFFBFFBRLL +FBFBFFBLRR +FFBFBBFLLL +FFBBBFFLRL +FFBBFFFRLR +BBFFBFBLRL +FFFFBBFRLR +FFFBFFBLRR +BFFBBBFLLR +BFFFBBBRRL +FBBFBFBRLL +BFFBFFFRRR +BBFFFFFLRL +BBFFFBBRLL +BFFFBBBRRR +BFFFBBBLRL +BBFFBFFRRR +BFFBFFBLRL +FBBBBFBRLR +FFFBFBFRRL +BFFBBBBRRL +FBBBBBFLRR +FBFBBBBLLR +FBBBBFBLRR +FFFBFFBRLL +FFBBBBFLLR +FFBBBBBRRL +FBBFFFFLLL +FBFFBBBRLL +FBFBFFBLLR +FBBBBBFRRL +BFFFBFBLLL +FFFBFFFLRL +FFFFBBFRLL +BFBBFFFRLR +BFFFBBBRLR +FFBBBFBLLR +BFFFBFBRRR +BFFBFBBLRL +FFBFBFBLRR +FBBBBFBRRR +FFBFBFFLLR +BBFFFFFLLR +FBBBFBFRRR +BBFFFFBRRL +FBFBFBBLRL +BFBBBFFLLR +BBFFBBFLRL +BFBFFBBRLR +FBFBBBFRRL +FBBBFFBRLL +BBFFFFBLLR +FFBBFBBLRR +FBBBBBBRLR +FFFFBBBRRL +FBFBBBBRLR +BBFFBFFRRL +FBBBFFBLRL +FFBBBFBLRR +BFBFBBBRLL +FBFFFBBLRL +FBFBBBBRLL +BBFFFBBLLL +BFBBFFBLLL +BFFBBBBRRR +FBFBFFBLLL +FBFBFBFRRL +FBBFFFBLLL +BBFFFBFRLR +FBBBBFFLRR +FBFFFBBRLL +FFBBFBFRRR +FBFFFFFLRR +BFBFFBBLRR +FFBFBFFRRR +BFBFFBBRLL +FBBFFFFRRL +BFFBBFBRLL +BFFFFFBLLR +FBFBBFBLLR +BFFBBFBRLR +BFFBFBFRRR +FFBFBBFRLL +FFFBBBBLRR +BFFFBFBLLR +FBBBBFBLRL +FBFBBFFLRL +FFFBFFFRLL +BFFFFBBRRL +FBBFFFBRRR +FBBFBFFLLR +BFBBBBBRRR +BFFBFBFRLL +FFBFBBFRRL +BFBFBFBLLR +FFBFBBFLLR +FFBFFFFLRR +FBBBFBBRRL +BFFBFBFRLR +BFFBFFBRRL +BFBBBFBRLR +BBFFFFBLRL +FBBBFFBRRL +FBFFFBBRRL +FBBBBBBLLL +FFFBFFBLLL +BFBBFBFRLL +FBFBFFBRLR +FFFFBBBRRR +BBFFFBBRLR +BFBBBBFRLR +FBFFBBFLRR +BFFFBFFRLR +FFFBBBBLLR +FBFFFFBLRR +FBFBFBBRLL +FBFFBBBRLR +BFFFFFFLRR +FBFFFFFRLL +FFBFBFFRLL +FFFBBFFRLR +FBBFBFFRRL +FBBBBBBRRR +BFBFBBBLRL +BBFFFFBRRR +FFBFFBBLRL +FBBBBBBLLR +FFBBFFFLRL +FBBBFBBLRR +FFBBBBBRLR +BFBFFFFLLR +BFFBBBBRLL +BFBFBFFLRL +FBBFFFBLRL +BFBFBBBRRL +BFBFBFBLRL +BFBBFBFLRR +BFFFFBFRLR +BFFFBFBRLL +FBFBFBFLLL +FBFFBFFLRL +BFFFFFFRRL +FBBFBFFRLR +FFBBBFFLLR +FBBBBFFLRL +FBBBFBBRLR +BFBBBFFLRL +FBFFBBBLRL +BFFFFBFRRL +BFFFBFFLRR +FFBFBBFLRL +BFBFFFBLRL +BFFFFFBLLL +FBFFBFBLLL +FBFBBBBRRL +FBBFFBBRLR +BFFFBBFRRL +BFBBFBBRLR +FFFBFBBLRR +FFFBFBFRLR +FBFBFBFRLR +BFBFBBBRLR +BFFFFBBLLL +BFFBBFBRRR +BFFBBBFLLL +FFBBBFFRRL +BFBBBFBLLR +FBBFFBBLLR +FBBFBBFLRL +BFFFFFBRRR +FBBBFBBRLL +FBFBFFBRRR +BFFBBBFRRR +FBBBBBBLRL +FFBBBFFLRR +BFFBBBFRLL +BBFFBBFRLL +FBBFBBFRLR +BFBFBFFRRR +BFBFBBFLRL +BFFFFBFRLL +FFBBFBFLLR +BFFBFBBLRR +FBFFBBBRRL +FBBFBBFRLL +FBFFFBBLLR +FFFBBBBRRR +FFFFBBBLRL +FFBBFFFRRL +BFFBBFFRRL +BFFFBBFLRL +BFFFFBBLRR +BBFFBBBLRR +BFBFFFFLRR +FBFBBBBLLL +BBFFFBBLRR +FFFBFBFLRR +FBBFFFFLRL +FFBBBBFRLL +FBFFBFBLRL +BFBBFBBLLL +FBBFBBFLLL +FFBFFBBRLL +BFBFFFFRLR +FBFFBBFRRR +FFFBBFFRRR +FFFBFFBRLR +FBBBBBFLLL +FBBBFFFLRL +FFBBFFFLRR +FFFBBBBRRL +BFBFBBFRLL +BFBFFBBRRL +FBBFBBFRRL +BFBFBBFLLR +BBFFBBBRRR +BFFFBBFRLR +FFFBBBFRLR +BFFBFFFRLL +BFBFFFFRRL +FFBBFFFLLL +FBFBBBBLRR +FBFBFFFLRR +BBFFBFFLRR +FBBBFBBLRL +BFBFBFBLLL +FBFBFFFLLR +BFFBBFBLRR +FBBFFFBRRL +BFFBBFFRRR +FBBFBBBRRL +BFFFFBBLLR +FFBBBBFLLL +BFFBFFBRRR +BFFFFBFRRR +FFFBBBFRRR +FBFBFFFRLR +FBBBFBFLLR +FFBBFFBRLL +FBFBFFFLLL +BFFBFBFRRL +BFBFFBFRRL +BFBBBBFLLL +FBBBFBFRRL +FFBFBFFLLL +BFBBFFFRRL +FFBBFFBLLR +BFFBBBBRLR +FFBBBBBLRR +BFFBFFFRRL +BFFBFBBRLL +FBBBFBFRLR +FBBFFFFLRR +BFFFBBFLLR +FFFBBFBRRL +FFBBFFBLRR +FBBFFFBRLR +BFBBBBBRLL +BBFFFFFRRL +FFBFFBBRRL +BFBFFBFLLR +FBFBBBFLLL +FBFFFFFRRL +BFFFBFBLRR +FBFFFFBLLR +FBBFBFBRRR +FBBBFFFLLR +BBFFBFBLRR +BBFFFBFLLL +FBFFFBFRLR +BFFFBFFLRL +BBFFBFFLRL +BFFFFFFLLR +BBFFBBBLLL +FFBFBBBLLR +FBBFBBBLRL +BFBBFBBLRR +FFBFBFBLLR +FFBFBFBRRL +BFBBFBBRRL +BFFBFFFLLR +FFBBFFBRRL +BBFFBBBRRL +FFFBBFBRLR +BFBBFBFRRR +BFFFFFFRRR +FBBBFFBLLL +BFBFFFFLLL +BBFFBFBLLR +BFBFBBFRLR +FFBFBBBRRR +BFFFBBFLLL +FBFFBBFRLL +FFBBFBFRLL +BFBFBBBLLR +FBBFBFBLLL +BBFFFFBRLL +BBFFBFBLLL +BFFBFFBLRR +BFFBBFBLLL +FFBFFFBLRR +FBBFFBFRRL +FBBBBFBLLL +FFBFFBBLLR +BFFBBBFLRR +FBFBFFBRLL +FFBFFFBRLL +FFBFFBFLLL +FBFBBFBLRL +FBBFBFFRRR +BFBFBFFLLR +FBBFFFBLLR +BFBBBBFRRR +FBBFBBFRRR +BBFFBFFRLR +FBFBBBFRLL +FBBFBBBLLR +BFFFFFFLRL +BFBFFBBRRR +BFFFBFFRLL +BFBBFBFLRL +FFBFFFFRRR +BFFBBFFRLR +FBBBBBFLLR +FBFBFFBLRL +FFFBBFBLLR +FBBFBFBLLR +FFFBFFBRRR +FBFFFFFRLR +FBFBBFBRLR +FBBBFBFLRR +FBFBBBFLRL +BFFBFFFLRL +FFBBBFFRRR +FFBBBBBLLL +FBFFBBFLLR +FFBFBFFLRR +FFFBBBFLRR +BFBFBBFLLL +BBFFBFFLLR +FFBBFBBRLL +FBBFFBBLLL +FBFFBFBRLL +BFBFBFFLRR +FBBBFFBRLR +FFBFFBFRLL +FFFFBBBLLL +FFBFFBBRRR +FBBBBFBRLL +BFFFFBBRRR +FFBBFFFRLL +FFBFBFBRLL +BBFFFFBLLL +FFBBBFBRRL +BFFFFBBLRL +FBBBFBBLLR +FBBBFBBLLL +FFBFBFBLRL +FBBBBFFRRR +FBBFFFFRLR +FFBFFFBRLR +BFBFBFBRRR +FFFBFBBRLL +FBBBFFBRRR +FBBFBFFRLL +BFFBFBFLRR +BFBBBFFRRL +BFFBBFBLLR +FFBBBFBRLL +FBFBFBBLRR +BFBBFFFLRL +BFBFBBFLRR +BFBBBFFRRR +FBBBFFFRRL +FBFBFBFLLR +FBBFFFFLLR +FFBFBBFRLR +FFFBFBBLRL +BBFFFBBLLR +BFFBBBFRLR +FFFFBBBRLR +BBFFBBFRLR +FBFFFFBRLL +FBFBFFFRRR +FBFFFBBLLL +BFBBBBFRLL +FBFBFFBRRL +FFFBFFFRLR +BFBBFBFRRL +FBFFBFFLRR +FBFFFBBLRR +FFBFBBBRLR +FBBFBFFLRR +FBFFFBBRRR +FFBFBBBRLL +FFBBBBBRRR +BFFBBFFLLL +BFBBBBBRRL +BBFFBBBRLL +FBFFFFFLRL +BFFBBFFLRR +FBFFBBFLRL +BFBFFBFRRR +FBFBBFBRLL +BFFFBFBRRL +FBBFFBFLLR +BFFFFFFLLL +FBFBFBFRLL +FBBBBFFRRL +BFBFFBBLLR +FBBFBFBRRL +FFFBFFFLLR +FFBBBBBLRL +FFBFFBBLRR +FFFBFBFRRR +BFBBFBBRLL +BFBBBFBLRR +FFBBBBFLRR +FBBBFFBLLR +BBFFBBBLLR +FBFBBFFRRL +FBBBBBFLRL +FFFBBFFRRL +BFFBBBBLRR +FFFFBBBLRR +FFFFBBFLRR +FBFFFBFLLL +FBFBFBBLLR +BFFBBBBLLL +FFBFFFFRLR +BFBBFFBLRR +FFBBFBFLRL +BFBFBFFLLL +BFFBFBBLLR +BFBBFBBLRL +FFBBBBFLRL +FBBBFFFLLL +FFFBFFBRRL +BFFFFBBRLL +BFFFBBBRLL +BFFBFFFLRR +FFBFBFBRRR +BBFFBBFLLR +FFBBFBBLLR +FFBFFBFRRR +FFBBBFFRLR +BFFBBBBLLR +FFFBFFFLRR +FBFFFFFLLR +FBFFBBBLLL +BBFFBBFLLL +FFBBFBFLRR +BFFBFBFLRL +FBFBBBFRRR +BFBBFBBLLR +FBFFFFBRRL +FFFBBFBLRR +BBFFFFBLRR +BFBBBBFRRL +FFBBBFBLLL +BFBBFBFRLR +BFBBFFBRRL +BFBFBFFRRL +FBBFFBBLRL +FFFBFFBLRL +BFFBBFFRLL +FBBBFFFRLL +FBBFBBFLLR +FFBFFFFLLR +FBBBFBFLRL +BFFFBBBLLR +FBFBBBBRRR +FBBFBFBRLR +FFFBFBFLLR +FFFFBBFRRR +FFFBBFFLRL +BFBFFBFRLL +FFFBFFBLLR +FBBFFFBRLL +FFBBBFBRRR +FFBBFBBRLR +BBFFFFFRRR +FFBFFFFRLL +FBBFFBBRRL +BBFFFBFLRR +FBBFFFFRRR +FFBFFFBRRL +BFBBFBFLLL +BFFFFBFLRR +BBFFFFFLLL +FFBBFBBRRL +FFBFBFFLRL +FBFFBBFRRL +BBFFBFBRLR +BBFFBBFLRR +FBFFBFBRRR +FBBFBBFLRR +FBFFFBFRLL +BFBFFFFLRL +FFFBBFBRRR +BFBBBBBLLR +FBBFFBBRRR +FFBBBFFLLL +FBBBBFBLLR +BBFFFFFRLL +FFBBBBFRLR +FBFBFBBRRR +FBFFBFFLLL +FBFFBBBLLR +FBBBBFBRRL +BFBFBFFRLR +FBBFBBBRLL +BFBBFFFRLL +FBBBFBFLLL +FFBFFFFRRL +FBFBBFFRRR +FBFFFFBLLL +FBBBBBBRLL +BFFBFBBRRR +BBFFBBFRRL +FBBFBFFLRL +FBFFFFBRRR +FBBFFFFRLL +FFFBFFFRRR +FBFFBBFLLL +BFFFFBFLLL +BFFFFBFLLR +FFBFFBFLLR +FFBFFBFLRR +BFFBBBBLRL +FFBBFFBLLL +FBBFBBBLLL +FBFBBBFLLR +BFFBBBFLRL +BFBBFFBRLL +FBFFBFFRRR +FFBFFFBLRL +FFFBBBFRRL +FFBFBBFLRR +FFFBBBBLRL +FFFBBFFLLL +FFFBFBBRRR +FBBFBFFLLL +BFFFBBBLLL +BFFBFFFRLR +FFFBBBBLLL +BFFFFFBRRL +FFBBFFFLLR +BFBBFFFRRR +BFBFFBFLRR +FFFBBBFLLR +FBFBBBFLRR +BBFFBBBRLR +FBFBBFFLRR +FFBBBFBLRL +FFFBBBFRLL +BFFBFFBRLR +BBFFFBBRRR +BFBBBBFLRL +BFBBBFBRRR +FBBBBFFLLL +FFFBFBBLLL +BBFFFFFRLR +BBFFBFFLLL +FFBFBBBLRL +FFBBFBFRLR +BFBBBBBLRR +FFBFFFBLLR +FFBFFBFLRL +BFFBFBBRLR +FBFBFFFRRL +FBBBFFFLRR +FFFBBFFLLR +FBBBBFFRLR +FFBBFBBRRR +BFBBFBBRRR +BFBFBBFRRL +BFFBBBFRRL +FFFBFFFLLL +FBBFFBFLRL +FFFBFBBRLR +BFBBFFFLLR +BFBBFFBRRR +FBFFBFBRRL +FFBBBBBRLL +BFFBFFBLLL +BFFFBBFRRR +FBFFFBFRRR +FFBFBFBRLR +FBFBBFFLLR +FBBFBBBRRR +BFBFFFFRRR +FFBFFFFLLL +FBFBBFFRLL +BFBFFBFLRL +BFBBFFFLLL +FBFBBFBRRR +BFBFFFBLLR +BFBFFFBLLL +BBFFFBFLLR +BBFFBFFRLL +FFBBBBFRRL +BBFFFBFLRL +BBFFBBBLRL +BFBFFFBLRR +FFFBFBFRLL +BFBFFBBLLL +BBFFFBBRRL +BFBBBFFLLL +BFFBBFFLLR +FFBFFBBLLL +BFFBBFBRRL +BFFFFFBLRL +BBFFFFBRLR +FBFBBFFLLL +FFBBBFBRLR +FFFBBFBLLL +FBFFFBBRLR +FFBFBFFRLR +BFFFFFBLRR +FFFBBBBRLL +FFBBFFFRRR +BFFFFFBRLR +FBBBFFBLRR +FBFBFBBRLR +FBBFFFBLRR +BFBFFBBLRL +FBFFBFBRLR +FBFBFFFLRL +BFFFFFBRLL +BFBBBBFLRR +BFFBFFFLLL +FBFFBFFRRL +FFFBBFFRLL +BFFFBFFRRR +FBFFBFFLLR +FFFBBBFLLL +FBFFFBFLRR +BFFBFBBLLL +BFFFBBBLRR +FBBBBBBRRL +FBFFBFFRLR +FBBFFBBRLL +FBBBFFFRRR +BFFBFBBRRL +FFBBFFBRRR +BFBBBFFLRR +FFFBFBBRRL +BFBFBBBLRR +FFFBBFBLRL +FBFFBBFRLR +BFFFBBFLRR +BBFFFBBLRL +FBBFFBFRLR +FFFBFBFLLL +FFFBFFFRRL +BBFBFFFLLL +FBFBFBFLRR +BFBFFFFRLL From 39d5509da5e36a55fe29351487a89e1bca219ca7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 5 Dec 2020 09:28:52 +0100 Subject: [PATCH 082/479] 2020: d05: ex1: add solution --- 2020/d05/ex1/ex1.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100755 2020/d05/ex1/ex1.py diff --git a/2020/d05/ex1/ex1.py b/2020/d05/ex1/ex1.py new file mode 100755 index 0000000..1d9d023 --- /dev/null +++ b/2020/d05/ex1/ex1.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +import sys +from typing import List + + +def seat_id(boarding_pass: str) -> int: + min_x = 0 + max_x = 128 + min_y = 0 + max_y = 8 + + for char in boarding_pass: + if char == "F": + max_x = (min_x + max_x) // 2 + elif char == "B": + min_x = (min_x + max_x) // 2 + elif char == "L": + max_y = (min_y + max_y) // 2 + elif char == "R": + min_y = (min_y + max_y) // 2 + return min_x * 8 + min_y + + +def solve(passes: List[str]) -> int: + return max(seat_id(p) for p in passes) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 32597cd01a7138c4a5fd8c4e6aeea71488ed8079 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 5 Dec 2020 09:29:06 +0100 Subject: [PATCH 083/479] 2020: d05: ex2: add input --- 2020/d05/ex2/input | 781 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 781 insertions(+) create mode 100644 2020/d05/ex2/input diff --git a/2020/d05/ex2/input b/2020/d05/ex2/input new file mode 100644 index 0000000..5145d8e --- /dev/null +++ b/2020/d05/ex2/input @@ -0,0 +1,781 @@ +FBFFBFFRLL +BFFFFBBRLR +FFFBBBBRLR +FBFFFBFLRL +FFBFBFFRRL +FFBBBBFRRR +FBFFBFBLRR +FFBBFBFRRL +FFFFBBFRRL +BFBBBBBLLL +FFBFBFBLLL +FFBFFFBLLL +FBBBFBFRLL +BBFFFBFRRR +FFFBFBBLLR +FBFBFBFRRR +BBFFBFBRLL +FBFBBBBLRL +FBFFFFFLLL +BFFFFFFRLL +BFFFBFBLRL +BFBBBFBRRL +BFFFBFFRRL +FBFFFFFRRR +FFBBBBBLLR +BFBBFFBLRL +FBBFBBBRLR +BFBFBFFRLL +BFBFBFBRLL +BFFBFBFLLL +FFBBFFBLRL +FBBFFBFLRR +FBBBFBBRRR +BFBFFBFRLR +BFBBBFBLLL +FFBFBBBLRR +BFBFFBFLLL +FBFBFBBLLL +BFBBBFBLRL +FBFBFBFLRL +FFBFFBFRRL +FBBFFBFLLL +BFBBBBBLRL +FBBBBBFRLR +BFFFBBFRLL +FBBBBFFLLR +FBBBBBFRLL +BFBBBFFRLR +BFBBBFBRLL +BFFFBFFLLL +FFFBFBFLRL +BFFBBFFLRL +BBFFFBFRLL +BFBBFFBRLR +BFBFBFBRRL +BBFFFBFRRL +FBBFBBBLRR +FFBFBBBLLL +BFFFBFBRLR +FFBBFBBLLL +FBFBBFBLLL +BFBBFBFLLR +FFBFBBBRRL +FFBFFFFLRL +FFFBBFFLRR +FBBBBBFRRR +FFFFBBBRLL +BFBFBBBRRR +BBFFBFBRRL +FBFBBFFRLR +FBBFFBFRRR +BBFFBFBRRR +FBFBBFBLRR +FBBFFBBLRR +FBBBBFFRLL +BFBFFFBRLR +FBFBBFBRRL +FFBFBBFRRR +FBFBFFFRLL +BFBBFFBLLR +FBFFFFBRLR +BFBBBFFRLL +FFBBFFBRLR +FFFBBFBRLL +FBBBBBBLRR +FBFFBBBLRR +BFFFFBFLRL +BBFFFFFLRR +BFFBFFBLLR +FFBBBFFRLL +BFBFBFBRLR +FBBFBFBLRR +FBFBBBFRLR +FBFFBBBRRR +FBBFFBFRLL +FBBBFFFRLR +BFBBBBFLLR +BFFFBFFLLR +FFBFFFBRRR +FBFFFBFLLR +FFFFBBBLLR +BFBFFFBRLL +BFFBBFBLRL +BFFBFBFLLR +FFBFFBFRLR +BFBFFFBRRL +FFBBFBFLLL +BFBBBBBRLR +BFBFBFBLRR +FBFFBFBLLR +FBFBFBBRRL +BFBFBBBLLL +FFBBFBBLRL +FBFFFBFRRL +BFBBFFFLRR +BFBFBBFRRR +FBFFFFBLRL +BBFFBBFRRR +FFBFFBBRLR +FBBFBFBLRL +BFBFFFBRRR +FFFBBBFLRL +BFFBFFBRLL +FBFBFFBLRR +FFBFBBFLLL +FFBBBFFLRL +FFBBFFFRLR +BBFFBFBLRL +FFFFBBFRLR +FFFBFFBLRR +BFFBBBFLLR +BFFFBBBRRL +FBBFBFBRLL +BFFBFFFRRR +BBFFFFFLRL +BBFFFBBRLL +BFFFBBBRRR +BFFFBBBLRL +BBFFBFFRRR +BFFBFFBLRL +FBBBBFBRLR +FFFBFBFRRL +BFFBBBBRRL +FBBBBBFLRR +FBFBBBBLLR +FBBBBFBLRR +FFFBFFBRLL +FFBBBBFLLR +FFBBBBBRRL +FBBFFFFLLL +FBFFBBBRLL +FBFBFFBLLR +FBBBBBFRRL +BFFFBFBLLL +FFFBFFFLRL +FFFFBBFRLL +BFBBFFFRLR +BFFFBBBRLR +FFBBBFBLLR +BFFFBFBRRR +BFFBFBBLRL +FFBFBFBLRR +FBBBBFBRRR +FFBFBFFLLR +BBFFFFFLLR +FBBBFBFRRR +BBFFFFBRRL +FBFBFBBLRL +BFBBBFFLLR +BBFFBBFLRL +BFBFFBBRLR +FBFBBBFRRL +FBBBFFBRLL +BBFFFFBLLR +FFBBFBBLRR +FBBBBBBRLR +FFFFBBBRRL +FBFBBBBRLR +BBFFBFFRRL +FBBBFFBLRL +FFBBBFBLRR +BFBFBBBRLL +FBFFFBBLRL +FBFBBBBRLL +BBFFFBBLLL +BFBBFFBLLL +BFFBBBBRRR +FBFBFFBLLL +FBFBFBFRRL +FBBFFFBLLL +BBFFFBFRLR +FBBBBFFLRR +FBFFFBBRLL +FFBBFBFRRR +FBFFFFFLRR +BFBFFBBLRR +FFBFBFFRRR +BFBFFBBRLL +FBBFFFFRRL +BFFBBFBRLL +BFFFFFBLLR +FBFBBFBLLR +BFFBBFBRLR +BFFBFBFRRR +FFBFBBFRLL +FFFBBBBLRR +BFFFBFBLLR +FBBBBFBLRL +FBFBBFFLRL +FFFBFFFRLL +BFFFFBBRRL +FBBFFFBRRR +FBBFBFFLLR +BFBBBBBRRR +BFFBFBFRLL +FFBFBBFRRL +BFBFBFBLLR +FFBFBBFLLR +FFBFFFFLRR +FBBBFBBRRL +BFFBFBFRLR +BFFBFFBRRL +BFBBBFBRLR +BBFFFFBLRL +FBBBFFBRRL +FBFFFBBRRL +FBBBBBBLLL +FFFBFFBLLL +BFBBFBFRLL +FBFBFFBRLR +FFFFBBBRRR +BBFFFBBRLR +BFBBBBFRLR +FBFFBBFLRR +BFFFBFFRLR +FFFBBBBLLR +FBFFFFBLRR +FBFBFBBRLL +FBFFBBBRLR +BFFFFFFLRR +FBFFFFFRLL +FFBFBFFRLL +FFFBBFFRLR +FBBFBFFRRL +FBBBBBBRRR +BFBFBBBLRL +BBFFFFBRRR +FFBFFBBLRL +FBBBBBBLLR +FFBBFFFLRL +FBBBFBBLRR +FFBBBBBRLR +BFBFFFFLLR +BFFBBBBRLL +BFBFBFFLRL +FBBFFFBLRL +BFBFBBBRRL +BFBFBFBLRL +BFBBFBFLRR +BFFFFBFRLR +BFFFBFBRLL +FBFBFBFLLL +FBFFBFFLRL +BFFFFFFRRL +FBBFBFFRLR +FFBBBFFLLR +FBBBBFFLRL +FBBBFBBRLR +BFBBBFFLRL +FBFFBBBLRL +BFFFFBFRRL +BFFFBFFLRR +FFBFBBFLRL +BFBFFFBLRL +BFFFFFBLLL +FBFFBFBLLL +FBFBBBBRRL +FBBFFBBRLR +BFFFBBFRRL +BFBBFBBRLR +FFFBFBBLRR +FFFBFBFRLR +FBFBFBFRLR +BFBFBBBRLR +BFFFFBBLLL +BFFBBFBRRR +BFFBBBFLLL +FFBBBFFRRL +BFBBBFBLLR +FBBFFBBLLR +FBBFBBFLRL +BFFFFFBRRR +FBBBFBBRLL +FBFBFFBRRR +BFFBBBFRRR +FBBBBBBLRL +FFBBBFFLRR +BFFBBBFRLL +BBFFBBFRLL +FBBFBBFRLR +BFBFBFFRRR +BFBFBBFLRL +BFFFFBFRLL +FFBBFBFLLR +BFFBFBBLRR +FBFFBBBRRL +FBBFBBFRLL +FBFFFBBLLR +FFFBBBBRRR +FFFFBBBLRL +FFBBFFFRRL +BFFBBFFRRL +BFFFBBFLRL +BFFFFBBLRR +BBFFBBBLRR +BFBFFFFLRR +FBFBBBBLLL +BBFFFBBLRR +FFFBFBFLRR +FBBFFFFLRL +FFBBBBFRLL +FBFFBFBLRL +BFBBFBBLLL +FBBFBBFLLL +FFBFFBBRLL +BFBFFFFRLR +FBFFBBFRRR +FFFBBFFRRR +FFFBFFBRLR +FBBBBBFLLL +FBBBFFFLRL +FFBBFFFLRR +FFFBBBBRRL +BFBFBBFRLL +BFBFFBBRRL +FBBFBBFRRL +BFBFBBFLLR +BBFFBBBRRR +BFFFBBFRLR +FFFBBBFRLR +BFFBFFFRLL +BFBFFFFRRL +FFBBFFFLLL +FBFBBBBLRR +FBFBFFFLRR +BBFFBFFLRR +FBBBFBBLRL +BFBFBFBLLL +FBFBFFFLLR +BFFBBFBLRR +FBBFFFBRRL +BFFBBFFRRR +FBBFBBBRRL +BFFFFBBLLR +FFBBBBFLLL +BFFBFFBRRR +BFFFFBFRRR +FFFBBBFRRR +FBFBFFFRLR +FBBBFBFLLR +FFBBFFBRLL +FBFBFFFLLL +BFFBFBFRRL +BFBFFBFRRL +BFBBBBFLLL +FBBBFBFRRL +FFBFBFFLLL +BFBBFFFRRL +FFBBFFBLLR +BFFBBBBRLR +FFBBBBBLRR +BFFBFFFRRL +BFFBFBBRLL +FBBBFBFRLR +FBBFFFFLRR +BFFFBBFLLR +FFFBBFBRRL +FFBBFFBLRR +FBBFFFBRLR +BFBBBBBRLL +BBFFFFFRRL +FFBFFBBRRL +BFBFFBFLLR +FBFBBBFLLL +FBFFFFFRRL +BFFFBFBLRR +FBFFFFBLLR +FBBFBFBRRR +FBBBFFFLLR +BBFFBFBLRR +BBFFFBFLLL +FBFFFBFRLR +BFFFBFFLRL +BBFFBFFLRL +BFFFFFFLLR +BBFFBBBLLL +FFBFBBBLLR +FBBFBBBLRL +BFBBFBBLRR +FFBFBFBLLR +FFBFBFBRRL +BFBBFBBRRL +BFFBFFFLLR +FFBBFFBRRL +BBFFBBBRRL +FFFBBFBRLR +BFBBFBFRRR +BFFFFFFRRR +FBBBFFBLLL +BFBFFFFLLL +BBFFBFBLLR +BFBFBBFRLR +FFBFBBBRRR +BFFFBBFLLL +FBFFBBFRLL +FFBBFBFRLL +BFBFBBBLLR +FBBFBFBLLL +BBFFFFBRLL +BBFFBFBLLL +BFFBFFBLRR +BFFBBFBLLL +FFBFFFBLRR +FBBFFBFRRL +FBBBBFBLLL +FFBFFBBLLR +BFFBBBFLRR +FBFBFFBRLL +FFBFFFBRLL +FFBFFBFLLL +FBFBBFBLRL +FBBFBFFRRR +BFBFBFFLLR +FBBFFFBLLR +BFBBBBFRRR +FBBFBBFRRR +BBFFBFFRLR +FBFBBBFRLL +FBBFBBBLLR +BFFFFFFLRL +BFBFFBBRRR +BFFFBFFRLL +BFBBFBFLRL +FFBFFFFRRR +BFFBBFFRLR +FBBBBBFLLR +FBFBFFBLRL +FFFBBFBLLR +FBBFBFBLLR +FFFBFFBRRR +FBFFFFFRLR +FBFBBFBRLR +FBBBFBFLRR +FBFBBBFLRL +BFFBFFFLRL +FFBBBFFRRR +FFBBBBBLLL +FBFFBBFLLR +FFBFBFFLRR +FFFBBBFLRR +BFBFBBFLLL +BBFFBFFLLR +FFBBFBBRLL +FBBFFBBLLL +FBFFBFBRLL +BFBFBFFLRR +FBBBFFBRLR +FFBFFBFRLL +FFFFBBBLLL +FFBFFBBRRR +FBBBBFBRLL +BFFFFBBRRR +FFBBFFFRLL +FFBFBFBRLL +BBFFFFBLLL +FFBBBFBRRL +BFFFFBBLRL +FBBBFBBLLR +FBBBFBBLLL +FFBFBFBLRL +FBBBBFFRRR +FBBFFFFRLR +FFBFFFBRLR +BFBFBFBRRR +FFFBFBBRLL +FBBBFFBRRR +FBBFBFFRLL +BFFBFBFLRR +BFBBBFFRRL +BFFBBFBLLR +FFBBBFBRLL +FBFBFBBLRR +BFBBFFFLRL +BFBFBBFLRR +BFBBBFFRRR +FBBBFFFRRL +FBFBFBFLLR +FBBFFFFLLR +FFBFBBFRLR +FFFBFBBLRL +BBFFFBBLLR +BFFBBBFRLR +FFFFBBBRLR +BBFFBBFRLR +FBFFFFBRLL +FBFBFFFRRR +FBFFFBBLLL +BFBBBBFRLL +FBFBFFBRRL +FFFBFFFRLR +BFBBFBFRRL +FBFFBFFLRR +FBFFFBBLRR +FFBFBBBRLR +FBBFBFFLRR +FBFFFBBRRR +FFBFBBBRLL +FFBBBBBRRR +BFFBBFFLLL +BFBBBBBRRL +BBFFBBBRLL +FBFFFFFLRL +BFFBBFFLRR +FBFFBBFLRL +BFBFFBFRRR +FBFBBFBRLL +BFFFBFBRRL +FBBFFBFLLR +BFFFFFFLLL +FBFBFBFRLL +FBBBBFFRRL +BFBFFBBLLR +FBBFBFBRRL +FFFBFFFLLR +FFBBBBBLRL +FFBFFBBLRR +FFFBFBFRRR +BFBBFBBRLL +BFBBBFBLRR +FFBBBBFLRR +FBBBFFBLLR +BBFFBBBLLR +FBFBBFFRRL +FBBBBBFLRL +FFFBBFFRRL +BFFBBBBLRR +FFFFBBBLRR +FFFFBBFLRR +FBFFFBFLLL +FBFBFBBLLR +BFFBBBBLLL +FFBFFFFRLR +BFBBFFBLRR +FFBBFBFLRL +BFBFBFFLLL +BFFBFBBLLR +BFBBFBBLRL +FFBBBBFLRL +FBBBFFFLLL +FFFBFFBRRL +BFFFFBBRLL +BFFFBBBRLL +BFFBFFFLRR +FFBFBFBRRR +BBFFBBFLLR +FFBBFBBLLR +FFBFFBFRRR +FFBBBFFRLR +BFFBBBBLLR +FFFBFFFLRR +FBFFFFFLLR +FBFFBBBLLL +BBFFBBFLLL +FFBBFBFLRR +BFFBFBFLRL +FBFBBBFRRR +BFBBFBBLLR +FBFFFFBRRL +FFFBBFBLRR +BBFFFFBLRR +BFBBBBFRRL +FFBBBFBLLL +BFBBFBFRLR +BFBBFFBRRL +BFBFBFFRRL +FBBFFBBLRL +FFFBFFBLRL +BFFBBFFRLL +FBBBFFFRLL +FBBFBBFLLR +FFBFFFFLLR +FBBBFBFLRL +BFFFBBBLLR +FBFBBBBRRR +FBBFBFBRLR +FFFBFBFLLR +FFFFBBFRRR +FFFBBFFLRL +BFBFFBFRLL +FFFBFFBLLR +FBBFFFBRLL +FFBBBFBRRR +FFBBFBBRLR +BBFFFFFRRR +FFBFFFFRLL +FBBFFBBRRL +BBFFFBFLRR +FBBFFFFRRR +FFBFFFBRRL +BFBBFBFLLL +BFFFFBFLRR +BBFFFFFLLL +FFBBFBBRRL +FFBFBFFLRL +FBFFBBFRRL +BBFFBFBRLR +BBFFBBFLRR +FBFFBFBRRR +FBBFBBFLRR +FBFFFBFRLL +BFBFFFFLRL +FFFBBFBRRR +BFBBBBBLLR +FBBFFBBRRR +FFBBBFFLLL +FBBBBFBLLR +BBFFFFFRLL +FFBBBBFRLR +FBFBFBBRRR +FBFFBFFLLL +FBFFBBBLLR +FBBBBFBRRL +BFBFBFFRLR +FBBFBBBRLL +BFBBFFFRLL +FBBBFBFLLL +FFBFFFFRRL +FBFBBFFRRR +FBFFFFBLLL +FBBBBBBRLL +BFFBFBBRRR +BBFFBBFRRL +FBBFBFFLRL +FBFFFFBRRR +FBBFFFFRLL +FFFBFFFRRR +FBFFBBFLLL +BFFFFBFLLL +BFFFFBFLLR +FFBFFBFLLR +FFBFFBFLRR +BFFBBBBLRL +FFBBFFBLLL +FBBFBBBLLL +FBFBBBFLLR +BFFBBBFLRL +BFBBFFBRLL +FBFFBFFRRR +FFBFFFBLRL +FFFBBBFRRL +FFBFBBFLRR +FFFBBBBLRL +FFFBBFFLLL +FFFBFBBRRR +FBBFBFFLLL +BFFFBBBLLL +BFFBFFFRLR +FFFBBBBLLL +BFFFFFBRRL +FFBBFFFLLR +BFBBFFFRRR +BFBFFBFLRR +FFFBBBFLLR +FBFBBBFLRR +BBFFBBBRLR +FBFBBFFLRR +FFBBBFBLRL +FFFBBBFRLL +BFFBFFBRLR +BBFFFBBRRR +BFBBBBFLRL +BFBBBFBRRR +FBBBBFFLLL +FFFBFBBLLL +BBFFFFFRLR +BBFFBFFLLL +FFBFBBBLRL +FFBBFBFRLR +BFBBBBBLRR +FFBFFFBLLR +FFBFFBFLRL +BFFBFBBRLR +FBFBFFFRRL +FBBBFFFLRR +FFFBBFFLLR +FBBBBFFRLR +FFBBFBBRRR +BFBBFBBRRR +BFBFBBFRRL +BFFBBBFRRL +FFFBFFFLLL +FBBFFBFLRL +FFFBFBBRLR +BFBBFFFLLR +BFBBFFBRRR +FBFFBFBRRL +FFBBBBBRLL +BFFBFFBLLL +BFFFBBFRRR +FBFFFBFRRR +FFBFBFBRLR +FBFBBFFLLR +FBBFBBBRRR +BFBFFFFRRR +FFBFFFFLLL +FBFBBFFRLL +BFBFFBFLRL +BFBBFFFLLL +FBFBBFBRRR +BFBFFFBLLR +BFBFFFBLLL +BBFFFBFLLR +BBFFBFFRLL +FFBBBBFRRL +BBFFFBFLRL +BBFFBBBLRL +BFBFFFBLRR +FFFBFBFRLL +BFBFFBBLLL +BBFFFBBRRL +BFBBBFFLLL +BFFBBFFLLR +FFBFFBBLLL +BFFBBFBRRL +BFFFFFBLRL +BBFFFFBRLR +FBFBBFFLLL +FFBBBFBRLR +FFFBBFBLLL +FBFFFBBRLR +FFBFBFFRLR +BFFFFFBLRR +FFFBBBBRLL +FFBBFFFRRR +BFFFFFBRLR +FBBBFFBLRR +FBFBFBBRLR +FBBFFFBLRR +BFBFFBBLRL +FBFFBFBRLR +FBFBFFFLRL +BFFFFFBRLL +BFBBBBFLRR +BFFBFFFLLL +FBFFBFFRRL +FFFBBFFRLL +BFFFBFFRRR +FBFFBFFLLR +FFFBBBFLLL +FBFFFBFLRR +BFFBFBBLLL +BFFFBBBLRR +FBBBBBBRRL +FBFFBFFRLR +FBBFFBBRLL +FBBBFFFRRR +BFFBFBBRRL +FFBBFFBRRR +BFBBBFFLRR +FFFBFBBRRL +BFBFBBBLRR +FFFBBFBLRL +FBFFBBFRLR +BFFFBBFLRR +BBFFFBBLRL +FBBFFBFRLR +FFFBFBFLLL +FFFBFFFRRL +BBFBFFFLLL +FBFBFBFLRR +BFBFFFFRLL From 57a50ec803bae5ce09ddfdea4f741b9dfb43d34d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 5 Dec 2020 09:29:34 +0100 Subject: [PATCH 084/479] 2020: d05: ex2: add solution --- 2020/d05/ex2/ex2.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100755 2020/d05/ex2/ex2.py diff --git a/2020/d05/ex2/ex2.py b/2020/d05/ex2/ex2.py new file mode 100755 index 0000000..05fa9b2 --- /dev/null +++ b/2020/d05/ex2/ex2.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +import sys +from typing import List + + +def seat_id(boarding_pass: str) -> int: + min_x = 0 + max_x = 128 + min_y = 0 + max_y = 8 + + for char in boarding_pass: + if char == "F": + max_x = (min_x + max_x) // 2 + elif char == "B": + min_x = (min_x + max_x) // 2 + elif char == "L": + max_y = (min_y + max_y) // 2 + elif char == "R": + min_y = (min_y + max_y) // 2 + return min_x * 8 + min_y + + +def solve(passes: List[str]) -> int: + ids = sorted(seat_id(p) for p in passes) + + for prev, cur in zip(ids, ids[1:]): + if prev + 1 != cur: + return prev + 1 + + assert False # Sanity check + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 45571a06d33fcef2f571638c55f1218bbc530ff3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 6 Dec 2020 07:22:31 +0100 Subject: [PATCH 085/479] 2020: d06: ex1: add input --- 2020/d06/ex1/input | 2246 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2246 insertions(+) create mode 100644 2020/d06/ex1/input diff --git a/2020/d06/ex1/input b/2020/d06/ex1/input new file mode 100644 index 0000000..7315fba --- /dev/null +++ b/2020/d06/ex1/input @@ -0,0 +1,2246 @@ +lfnghcsvpyrdjtxozimb +mdtbnorpfalcijxvhsy +elmwjkfbihydxcpqtovsrun +tlhmsdjingyxcbfrvpo + +a +a +xqh + +mxdeqcinvfg +vbncrgzxqefka + +oejsdfwm +fojsmewd +ewxfsouimdj +eodafjwsm +edjwsmfo + +d +d +j + +mgxywknlt +khgwmr +wkpezgboavm +mjgkwni +mwkcg + +mqzjtgskhadecwy +nhkjeqgdtfsa + +rc +cru +hcr + +vuaeqdcnty +nltovzycbeidu + +phcqe +chep +hpce + +smjuow +jwktu +ujw + +ljphnwtmugi +giltnpuwm +mgtulpkiwn +uxltinpgwm +jmglintwpu + +slbguajo +lqwardbuo +zlqmdobau +ucalqob +lobua + +uwtcp +umtlwc + +lrcpgjwqfaybxtisoznuhe +wjpnrsxiultyabgzhcqfe + +clmfrxgbqikzpsoduvjy +uoxibjmkygrsdqczplfnv + +oncmzsf +onzmds +snzmo + +zlmegxcnavjb +bmloajdecvwzxgn +pjgzecxvsmbhnla +fngpcvhaexzlbjm + +ulhkjzxadgvc +uejbgctld + +xuindfqzvpg +ugdofws + +qrpvexjlywfmgbintuzk +wrtnibqvuflkeypxg +kretgquypbinwxfvl + +tmrdpzxvily +itorywvlxjcd +rltdvygbxic +xyliotvrdc +xrvtdilygc + +uihswfvanoyzl +owgnzcshuvaqlfiy +whrtnuoyimzlsvqfac +jiekwxbznhfvuplo + +jgbtesurivfxclapnqdmkzhyw +dcnjhsqgkzyitwfplvearubxm + +umovhtgaekjixwfcdnq +fcoamwkvjeqxhdbgitn +datcxweqzhirmjfnkogv +vwahorqcxfilmkgtndej +myhkadptsgcxfojinqewv + +oys +syo +oys +yso +oys + +fatvyeruxnilcmpd +ydacelgfmrxtvin +tgdirmynaxclqwe +jstnbxmdlcezhraiy + +fkbnpgyhs +ktnhbya +ybhan +wqconhbey + +zicrfu +dblyczk +eshjmczvn +cdzgofpx +rawzc + +hcuypzdfalvt +dfplcsyvazrqh +lfcdvzrhyabtqup +lycegwaofdkmzpnihv +ayvzdhscplf + +rvowpcnbjlfhe +hsgbdivpcjlxo + +wbiplofhkmgvr +wvmrohkbfeglpi +bvklotpghrfiwm +wltkighfbrmvpo +bgvkflitwhmpor + +dwmorjebnchvuaz +hyikgfenl +nykhxegq + +pnsactlj +knytclorg + +w +wj +w + +gushnlqjctfvwiyz +shtqjuvzcgniy +cgdusyjpntzivqh +ivuzjgcnqhwtsy +vcusgtqinyzhj + +fjnacgiw +ngijcfw +gcwnifjo +wvhsncikgtfj + +tecvxgzsjridpa +azvtdgprjesixc +mxspejvzrdcaigkt +vristcjaexpzdg +jvipeagxdtczsr + +v +f +w +w + +wrsxdmlay +yxalwfs +xlatysmwe +bgqyohvpzswnlxujcak +silxayw + +zxelswo +slwzpxo + +aizvyoqg +ealnxdyczgpsrj +hkmwbutf + +cohalxbk +suiydp + +qebdumfwsjagk +cxaokgmr + +r +x +a + +xhey +exhy +hxey + +zchi +izhc + +dh +dsh +hd + +lfjcmoauvzxqitdspbw +febzhrmowptvsqiyaudjkgc +ijausfvcdznmpqowtb +vcsfzqbjoipuwadmt + +up +rkpy +nzjdbg +twkl + +tuepkzc +opzst + +rgszfijlxneuvqcmktpa +azcjfnkuvlpegmrsq +fgjzkvusqnmlcarep +kvrcpumgsfqalezjn + +tvqiwkmdf +qfdtvowsk +tvkifsrqdw +vgdxeubfkjhqzlpwt +dvkytawfqm + +yhiogvbkxlzjwsafd +fylwkxhotbasivdjzg +cdjfgnkshmwyxvaliozb +xusvawyhzklgjoifbd +vkisfrjowaxhglydubtz + +kqws +xqysrkw +lcjsqkmw +qwsk +koqsw + +wc +cjw +wc +cw +wc + +awrshieplc +ixelpycsrvw +qebsmzklpwiuocg + +cxf +xf +najxvf +xfh + +umgylpoz +fxwcyet + +yt +t + +gbeskji +ejbsqki + +grmdbezfou +ufzbredgom + +wmtvcfhk +cyleh +prseclyhz + +cyrwzamnoxhue +hxacmyenru +ndyrashxgmecu +eilychmuraxnfbtv + +fbgwal +ablhjg +agxlb + +cvw +vcoz +nvmrc + +prvbngaqh +qbhgpvarn +palgyevfrqnhb +vgqnbarhp +rbhavqpgn + +fztoevmhwgnb +nbhfweomvg +zfmghoevwbn +vhmsfgwcbeonq +negfvwobhm + +qbx +dev +hyzl +wr + +ltnibrq +qrbnil +rlbinq +qinrbl +irnqbl + +thfng +gfhkbd +hmucga +rhdg + +fqwalrhvpyxieu +plehrstgivfx +xbcvtrpefldih +efpxrlhvdi + +kculvzfnesawmty +vkztnuycwfamlse +ecvnzlumykwatsf +zatkulemcyfsvnw +tafczlusnywekmv + +a +a +a +a + +cktun +lnrdyfk + +rexndcwvkibpflzjqymu +exivdprnjzyblfmkwc +czbknjlrfdivxypmwe +fjvgyixpedkmrwzncbl +hricxbjypenlzfdwvkom + +vqebrauop +ebopavuc +upabhveo +vobeaup + +iaxlnehuycwkrmzqsbp +bynlcreqpswzmxikhau + +nb +ikqoh +ho +qjh + +oaixhtmeqc +envpiuhkqdmjx +xhforyeqwim +hcaezwimxq + +ctubrpd +dstub + +vchgnkea +hkegyxivc +fpychegtvk + +apxkiotyjzsqufvbld +daviftqlxopsbyjku +zblyqpajvkdsixuotf +lafqdsyjuckbtoixvp + +pmlwfdcbik +xzjebqshotrnygu + +cepzjtkamvnfuloqrig +vkoiepjfnztuglqmarc +pnjrlqgmkzotiuevfca +tluscvmjrzkgaeipnfqo + +k +k +r + +ae +ea +ae +ea +ae + +ypvtzi +mtu +tjs +fjust +ufmtj + +zilgoaqmr +aqopzmuvxlwrjg +ozrmnadbqgl + +rbfm +r +rep +vfmr + +ajrsgqiodfmwuezkltv +tqsfiwvgzmeurdkajlo +sqgywzoakturjlimfdev + +wplbfyivhasrujdgzqcmxnk +tklsezcwrihvj + +vshfrae +bhnocstidq +xlhsfmza +swlxah +mpksvhy + +uelktdbswyjpaxqmnr +ruvwjsnyadhmzepb + +jepzvwaqublirdftgcmx +lwncbxgqkvdjpztiuamf +vxmfwtlaibpjgzucdq +pfidxgumvtacwblqzj +dsgivqfnptwzmbaxucjl + +gotqzew +jdfn +dub +v + +nzj +jg +g +vp +n + +clbgtr +tgrlbc +rtbclg +rtbylgac + +uyit +iuqtpc +ituj +tui + +jlsipo +hpijl +solxjip +izplej +xlpitsj + +zd +grntma +w +iz + +lkxgcpywohifnu +hyglocfnkpqwux + +fjz +hj + +fxpjdrglkntmzce +qznmtgfpljcrhd + +w +hauesfy + +goixwvdy +dxivyow +dowvyix +idxowvy +dvowxyi + +bw +y +swg +uyw +aijx + +xhkdzbts +pedonw +gqld + +neslgchypjqavwr +aclkpygqtnwiosh + +vboyhcijednm +neyvjcd +yvdjnec +ednvjcy + +pezkudgxf +zpfxgkbedu +exkzgfdpu + +oulheigbsfjn +ltnagbieju + +vmyhslndzaroiqpgxutfk +dpilskvjutayrghzon +dctniozulkhpsvgrya +srhtzkyupavdngoli + +aeybn +slcoixqtkgh +bw +rvfzp +uynjmpd + +zexkwslndgyi +encftykmx +rhbenmkoyjx +xymnrke +kyxjbnumer + +egdq +efkxg +lmnscieutozapj +wye + +nk +ny +wn +nk + +wnmubxsrvqzcyhtpjf +sjymafxtzhcnriubwv + +msub +ubvyhkm +ulmocbq +blfcuepqm + +gtsfubrozwdiapm +oqkuvhncxbzip + +vfbklexjnhziwsayqtrpm +ntrzifljyqvesamhpk +hnvmkyprultqsifazoejc +ejcvmtnipfalyrhkzqs +qtiavmhrlneydpjgkszf + +yxst +hgtwy + +ymf +yv +zpdyb + +amdhqbzjkxilowtuvgnrfpsy +fugmwydqvsihkntlxjeazbo +rsvxyzqjoadibglfthunmkw + +qzbsk +bqzsk +zsbqhk +zkbsdq +qdbkzs + +dwlij +jldiwn +jiwnl +ljwrbi +jiwl + +nmbhlqkaovrgiudte +dbnotamqvikeglhzrx +ohgnmkrztblaidvqef +tbqvahorjgniewldmk +qrtvyobigemkdlhan + +par +rpx + +rq +r +r +r +r + +nuxaoymrctdsikpeghzqwjb +lrnpzwbyiksdcjeumxga +efzlgxyvdubrsmjwpnakci + +ftm +t + +zjydrsx +syrxjdz +sjrxyzd + +rxczvljiahfwmbok +olznqgdawfjtchibvmrx + +ydlwknjzhugeamq +jzvylqmgdewhaukn +zyluqhnewjdamgk +lnuygmwdaehkqzj +jindyaeqzulwghmk + +ujcbsanxhmltdvzeg +uznjaedcmlgstbhxv + +ejxp +dypjn +lan +bwgvkrm + +v +s +s +s +s + +rdswzekavfj +jubothxgani + +jazgdw +gazjdw +gajzdw +wdjzga + +mnecwfslyp +yfntmsl +mcnfghls +xlinzojsvm + +ocgxrsmheynbvuiw +handgupyeslixmwcbvr + +yfzhmrpdkustegwoalbq +lyftdmopzrewsgbu +rwuglfsbkdtcnpqozme +etzuwbsoyprfdglm +dmwtljgrszpfeobiux + +ealrftgbzy +blgearjyz +yngdbxclrzmea +jayfrezbglh +leargyszbf + +clkedspwxzqhfojb +nsxhezwcjpkdfoqb +czowphbeskfjqxdl + +pkzoadrt +dozrtapk +dtorzpka +atdpzrko + +vrjyxhnqfg +yjhrnvqag + +owgadqkfusicxrztl +qicupjdzgkolftw + +o +q + +csbaloz +cozblas +soczalb +lczabso +mtozcbsla + +faljzbneuxympogctdi +cailgjmzqexdptbvfynu +wjpknbfhelcimtxrdyzg +gmyebdfipnxljczvt + +j +j +j +j + +getbmjnwazok +czenqpftw +nlxzweqtf +drwuzetnyl + +ywmi +sgqdt +lnhzfxpbruovja +cqe +gyk + +vp +dxesf +krp +ar +gz + +xeo +q + +myfw +qnelw +jrodw + +ndajkhfmzxslvopb +ajsckbhdpqfnlgzmvx + +imldxsptvaqyhcgbjn +ghnyicdvpqtljasxbm +lqjesvdhtbaxpmcginy +andpytcblvsixmghjq +tdvyxcnimahlsjqgbp + +vsopuwdxhtabgej +gjahsudbxtwpeov +vsawxbgedzotphju +detawvgbouxhpsj + +xriwbfaocqgztydvnelkspj +xkjfpcaqibswtdelyrgzovn +zpdexnfwalqhyjsokgbvcirt +zevfqwxcrjplgoskyitadnb +jcsvkgtwezobdnxyfqprial + +uvigr +i +i +i + +zyatdpgjrle +ezsyrdhxptav +kapdyuzreotm +qeryptdagz + +z +z +z +z +z + +sizxwqmegyflndk +fnweyjdbckugxtmpv + +vjtkzol +hwjtzmqdykosv +jtzokev +xztkvojc + +o +utxgqfenh +d +yvkj +kswvm + +uefcqyzgalm +qafcezlmguy +cumafzlgeqy + +lmfzyt +mltf +tlgfm + +ne +eu +e +zen +e + +tepckxywbnuqahilvr +cwqpuveanixogmbtlyk + +mgyu +usyz +nyu +uy + +hvnilwjcgbekmt +mljgckftviwhneq + +rdaspohl +lfxjad +amdl +dla + +ncjmux +hxzemjuoqnc + +slhdpwkc +plhkwsc +wslphnkc + +kx +kx + +klbmqja +cbpikxjoaswyhg +lakbmuj +kbja + +do +dl +qd +d + +uwbktzrfax +xfvtkl + +pvylfnsder +dnfprelvys +srlpdefnoyv +fvnesrpldy +rdfyneplsv + +cietjkmyu +gkqjcrubel +gvjouc +ajuco +nsfjpdcwuh + +zeacqhdkltxi +mtldxqcha +adqcxlhwt +whatcdxql + +gsrhkdwnyt +wvngykhtd +otvwdnhgk +dkmtnhwg + +gdq +asgqd +gkuqd +cgdaq + +amoriyvlens +nfrdvltkyes + +bgemhciuqtnpw +jqwtgbpcnhmui +zyogtixnwmhcqbp +gqtwinhbcmepu + +jn +nj + +gkqz +gvjyzmk +kagwzf + +qimgwjex +qcxjemi +xjmqige +jqxgmei +emjxqi + +bftzjip +fkjvzbcy +kzjthybdm +nogjbrezl + +lukfvrc +lkrfucv +drbfuklvc +uflckrv + +tekijdqozns +djsiekoqtn +noektqjdis +hndojsiqekt +usndjteqiokg + +cw +c +cs +wc +cn + +lxfgopvmh +ckpatzifnwxsjum +bfemqdyrpx + +xosicnwrb +wsocbr +brwcasoy + +esiz +ise +ies + +dcungxvhipzorlbwsjqkt +pvgzlihbocskdnuwqxjr +jwqvrboixdchpsklzugn + +jsizhem +zjsbhi +tjhzu + +tgldmihkjb +hbekplin +borvflqchzauxi + +eosqa +zpqgusowa +okqslrae +qofskay +olaqst + +dbulmwerfxjoiha +jdiwhoumflbxra +rxbdihmofuwalj + +gqzwfumsipboyjnl +forhywgnulpsbmiz + +ql +qml +owq + +dpbxiqjy +bxyqjpdi +yisjxpqdb + +hxcrzpjvmnkgeuo +hryatdbx +rxlhytfwds + +ljdozibqytwnfhvkxp +fqxiwhcyzbptkjlvnod +iptkxndvjzlyqwmhofb +efgvoxydhpjqiztwlbkrnus +vfzqpjblnidytkxaowh + +onewvclt +vhcteos +vecnto + +fpoisndugqmb +fqkgntpwjbmdus +elfqmcnbudgshzp +gnqpdmbfsvu +snrqdupbvgfmj + +euvtmyohfqkscjdn +fydvukotsmpnjhqec +fhqumnvydstkoejc + +zcoupardbfvns +siufbpodcnlva + +dwkfe +nfdz +ibjodf +xdyhvltgpu +dzjnmrcasq + +k +k +k +bk +ckj + +tavfsckigh +hquzcnbdorlwm +ycgh + +qplvetmdc +qdmvetcpl +pqmdcvtel +lpetvmdqc + +lhcq +qcuk + +whmnsqpkjov +wtjgu +tlcjdw + +egicls +cioegs +cesgi + +lxaifjhyrqgsem +mafexiryqdsjghl +xemjlkgfqyraish + +zwrdcmavo +zvrcadfmo +madfozrcv + +slfagzbjwotdni +mdspebtajxfiwknzlc +dqsitfarvljnbzhw +auilefztdjonwbs +tsiebdwjlnfaz + +svgnwpr +nsaiguwl +xmplcdgsn +eotjkyshbqnzgf + +bl +ly +iafxle + +wnckbplriv +ixdbelhpgmqfscvwzj +lpwivbc +byptliwvuac +vbicwoklpyu + +eskwamyvgxzqbtprculijf +eipbrxystfkgucjazwqmvl +wvplyjkrbcguzqsfteimxa +vhtrlousjbpmfzanqkwgcxyei + +p +m + +ntfspeyqrj +pqyernsftj +tnrspejfqy + +gx +x +x +x + +gizducfvmtohe +genmuitdvzkhxf +tbpyaruimeshzgwldqv +kidmjnuovehzgt +mxthzudigve + +kudjgcbhna +lcajungkd +chdankjug +cekjgpanud + +zqlucvfkmnpoighxb +ohcpgetlvzufinkqmbx +cunpqvgkziflbxhom +cgklbnvfxouqmpzih +kjimlchzgxpqvyuofbn + +uwmz +nz +zbofx +zw + +r +or +av +j +j + +tvbqc +qedctbv +tqzvbc + +t +t +ts +t +t + +qhkbwa +awubqtzx +fqbyja +mbaiqhrt + +wzcuyqanpdtsghr +zpocrshdwynaqtxvge + +gpq +qeh +cq + +jfltaouwri +ygbxsqdz +skd + +jmlh +hlmj +hjlm +jmlh +umihknslj + +ute +ltdzqf + +ygkx +mywxcrd +apyx + +xy +y +dy + +mivusqxpzyljehgkotrf +ajlizqnpegckfohdvsxrwb + +pl +lp +pl +lp + +xmnaupwtcvozrfekbdshlq +dlafzmnhvpeskwoqucb +uzydhfovwmapneqlgkbcs +cjapswblfmnzqokeuvhid +dzlaovqnmsuwkhcyfpeb + +wpb +bp +bp +bp +bp + +pusm +umpshr +musp + +xdz +z +f +ecjo +nkxz + +tjmvdf +st +trn + +hkfgarys +rghfasy + +ljyixtumsfngvdwoqzpakecrbh +kfpuvicgrsnoetabmywjzqxlhd + +az +z + +rgkf +khrgn +nrgk +gkrfoc +werzgkpa + +vkg +k +k +ku +ik + +blruxyvehtsn +thdl +mtldh +lht +thil + +rnzqadiplhbegj +qlezpgnabdrji +lnrzaqjpdigeb +rbjlnpiegqazd +jprzlegqdbnia + +kgo +okg + +rjm +kiml +cuxstqpwod +kghb + +yckovthbrigazfxq +atriygxofzkcqh + +vudbtxjpgaqfzhlkmncswyi +lgfjahksybqmncoeuwvixtrd + +dmlyrgkwfjovqasxit +ylawsjxrftdegmkqvi +stqgmxfrjvlkhaydwie +mypcdrjnkgtsxvqawlfzi + +ethrvfnyasdkb +eanwdyfcsbhr +xayerdsbhlf +ejdrshvywbaf + +hqyfnrxjzsd +buly +yukpm +likmy + +zlpditkvsawocunjqyhmrx +rdtjsunpqymlhxkvcwzoai +oaprkqhumtvlcwxdnzsyij +uxmdclkpjqrotahysizvnw +olwhpitmraqdnkxuvjsycz + +srnhuf +hrsxfwynuo +gnzsfbutcrh +krnhusf + +l +lsb +ujqtvol + +cptnhxgdkivyjlsbrwmuf +nkbshfmrxgjdoclwivy +fxibalcmhydvkjnwgsr + +txye +cjvqsulagn +kihdbf +ohpmzwr +rbtw + +tgm +mgt + +nhucrjmq + +rubajlyszwn +nlbsjzwryau +zrwuynsjbla + +flvdypkxabzm +lipzbtrmqof +ljmghurbifpzns + +bsv +wsux +vs +s +sv + +vfqsehx +xseqvhf +svxefqh + +fipwjdl +jpilwfd +whflvdipjx + +oclrqnubyhpmdks +wmkchdsqujbpxlnyo +onulmdsbyhkqp +mlubkpyhnqods +tfmesqblonudihypk + +gcwf +a +v +q +o + +xpqlzcfvtjgr +fxwprjglmasiqev +xljpgbrfqvo +fbvqrcgxpdljt + +nxpktofqglvrsjbi +wvkotsgijlbnrufdxq + +rpfew +iflep + +tdy +teyvdjo +tdy + +ix +gzkwchaqd +oysure + +hxvkjmneycuspbwroqaligf +qkhpisjmxblnwezrgoauycfvt +emcqhiufkjbrlwyngapsovx +aixrbgcfynwelsoqkpmhjuv + +ckxhmridjbfalqo +yzunwpsdlgev + +ls +lzk +sl + +kdpzmau +gzamukp +kpfua +pkau + +usmywivnpgt +biqxymnosaklrehzj + +orwcjpkbiexz +bpzikgwn +winpbkz + +wobslxnhfyjtg +vqdecolzarnm + +rgfloc +yufcor + +tgwnebxyzkchqvoulmprdijasf +zmpdjlekigtswronhubqcvfa + +fyrbd +yfbr +frby +fbkghytr + +stexkgyiqpaodnm +opecuqrdnytkxaig +oxykdtnaegpiq +xtgaydoepqikn +oyktnixegqpbad + +irgbyxhwm +iwgykrbx +yibgrwx + +dxejzvrocb +tbxhmqscrid +cjrodlgbxz +zcbxwpjrd + +l +lg +g +lg +nfi + +ab +aw + +vlbi +zegtwnc + +dgbj +dgjybl +ardgupbsqjv + +xoquygizahnwpkvds +duaoyzvgqxhkiwspn +gpvyukzaiqdnwoxsh +qpwnyzihovukasxgd + +fcepzibvulyxhsjqdanwmtrg +bijrdfxcqhplwnymsezatuv +uxbcwnrmisvqhljpzdaetfy +umwzscitfjhxyrelpvdabnq +usahyzdmtqfibxcjvlepwnr + +tpk +gzetqkypuhj +pknct +mfticpk +akiwtfsp + +qedhju +lvdqtzehyj + +vyfe +vey +yve +yve +yev + +dseopbmfcuk +msfekpuodcb + +jm +jm +mj +jm + +jfgevdqxm +mqftev +fmeqv +etfmqv + +grhalzpfsjweuyt +zteylfsaugpj +jtuzpeyflgsa +zlajntyufgkspe +fjyapletgzsu + +ixhz +n + +mqekbhiu +ikgbhmeq + +xscglkt +ctglkxr +kxlctg + +siygouxkzhetdrqcfp +eiftxuyhpkczrqdsgo +qgfryxepotiucskhdz +pfruziqyxgedkthcso +pezofhisdcxygurqkt + +kp +kqyxp + +hzbtkxlyipegra +lkrgehiyapzxtb +zhliaprgbkexty +axgyhlpekbiztr + +mh +al +hien +zxkprdvo + +xfjokhuyszwt +ujotxwsfkzyh +tfhwozsujykx + +bqudfgvjeiy +djefqvibug +yvxuiedqjgbf +xuefjqgdvib +ibveujdqgnf + +liyqzxwogcdhvjsr +nvcigxswpoedq + +zjdgxfqwhcbm +qxhjgdwmbzcvf +cxgfmzjwbdqh +qjzwphxibcmfdg + +tdflsxicwmpar +iawprsxtmcfdl +rxpafwlihsdtcm +amtwplscxrfdi + +sgjmp +sojg +gsj +sjgu + +pjtayfvqgubsdzh +rxwbhcekljnm + +fhsmgpyblcitz +zmibgvhylwf +vigmfbzylh +iyfvglwhmzb + +bprqyialnmkveohuxs +iykvuxbpshemloarqn +ivnoqlxrpyabheukms +xvqnmyhbkueslipora + +ogdijpwtxuchrv +ovjhdwxptiugcr +jxutokrfwpighcvd + +oizhtyglwbnjfuverqps +syaiuqhzeltbovrwjpgn +eohzgwjbtrqulsivnpy + +uptch +igt + +up +uhy +u +oua +hu + +owtkc +oktwc +wkcto +wcokt + +qosvjmkcixhdb +upaweznmgjt + +pcnabt +bapct +dcbaqzuvyl +jcab + +siw +iws +wsi +siw +zskiw + +b +by + +vdljnuawqg +daluqjvwgn + +vqctdhulbpj +citavlqhjkdpe +glhsjpryofnzwvcqdt + +xo +xo +xo +ox + +l +vkjflgh +ld + +oftdbe +jutioleh +ebcrtgo + +dcwx +zgcxtb +dcqt +opfucrjikea + +kjogaebchpmxzudy +yvxmabpdgznjoe + +dtfrbceshaupizxqwl +wlefqdxbarzitscpuh +lrafisdhktxpzcbwuqe +tleibrqsazhufdpcxw + +mwjahec +wcjme +kjrwcme +cemjw + +jfgonrqkezumxdsbvaci +vgsindtuyzjbomrkqf +osfbklvjiumwznhdgp + +nwmgfludzhoyb +jwmgonfzhdkiuab +huvgwsfrbdcenmotzqp +zdhgxofwbijmnu + +wahstyxvugdmolp +tdalphmxsuoygwv +glpudovmtshawxy +hwstlopuyxmagvd +lgayovuwdnxptshjm + +a +a +a +rca + +szlidbpwxq +slbzpqdwx +qzwxhrpybls + +ewhjlxfcmuidsgnbrkyoq +enmiavrkwzlobjsuyq +pisbwokteznlqjuymr + +brnec +nwcrei +bnecor +ncerb +rnkedc + +pqw +kbct +hviudfjyars +wbe +b + +xtsbynudvwjkfalre +auwkntbfeyvxsrdlj +nyewflsxkjuartdbv +adexltvsbymrwnkujf + +yima +miay +amiy +czimay + +yagqmw +mwqgya +gqwyam + +acqibtfwlnyvjumrdgspoxz +dxzbqownsgylajucitmrpfv +ztpcrulxjomvwbdgyfinas +scbwynpftarmgjduxliovz +mpgtuyzhxwcoibdrsanflvj + +bdftwqgsaimhxvn +stmaqbxhgwvfdni +abmfshgnxvqitdw +thabinfgmvdqsxwy +dtwvbasxnhiqfgm + +siomckdrlhnytjaqpzwu +cqxytvoanbulrekzwfpd +uxadwqkgptrzlycon + +stwohnvrq +kfnpxvcy + +ijlkvrdacmuhotxwbsqpegyn +gopemwhirtcbynxaskvulqj +aweqlciybkguopsjtmxrhvn +pwelrvhicybstoqkujgaxmn + +ckpdbfs +kcdfqv +foecjkqsvbh +muzckif + +zsblxdetgovunfiqwhjpkmracy +wvkxysnjdraclzgemouphbt + +qmtx +xqt + +dmieulgon +jfmyra +fsjma +xmsq +tvcm + +xklcpvzje +lpjrvaez +zpjlev +fvpjlez + +bodrkvzcmhyxulswnijt +ynilmcwzrvohtsubkdx + +tewspzja +wjtsplzfega +atzsewjp + +tu +but +atdnsu + +y +u + +qbtawmldjsy +mjqdsylbatw +tyalbmqjswd +ljsdtwbqyma + +msgytaj +vygscje +qjciogk +nhpflxzrduw + +vcmrtws +srwyc +wursckd +cpwrs +wsrc + +ielm +pilfr +mhxlcaf +gvzosdytl + +ij +avi +ylio +kaim +ijamw + +cgxwjydavlhbpior +adckqejbhysinlo +ajwczfloydthbmvi +cubojhwagryild + +jyqagilxfsk +yfasltokjgqx + +impglqcwn +ngcaydziwp +ipbgnzwcu + +lj +j +jfrb + +xncgrjkpsmwailbdeouzqht +rayuhpxqsezkdlowicfnmjgbt +ijzwpaqtdxcuhegsmlkvborn +upndtklhgeoibmzcxrswaqj + +ohsckdiej +dochisejk +dcsiojkeh + +xcbnwtzqu +oeywhzn +jgfskirml + +dsrvqfctojm +facqi +yflgqcw +cqnlfz +qefkcy + +xvwadfktl +fltkxwa +wptxjalf +mtfaxlw +awtflx + +vzxqjbrwlpysguonctmf +orynmphcqbfuzwtaxjs +mrunfcqjxoytszbpw +podxzyserwjbqutnfcm +sxqdfercbnopmyujtwz + +anzbwplo +ingwuxc +dwrketnsv + +goz +go +goa + +msgopxyt +tsopygmx +gmxyustpko +xpmtsoyg +xptgmosy + +ohj +ojf +jo + +gvm +c +nrhjkwda + +ryqudzpvg +vzugpqr + +wya +wa +bajqno +gxa +da + +eobwrtihcqfp +rhbkdep + +spnlubhavkw +obiqgzyxdfercj + +jtfq +q + +jyx +wuz + +bhqnegu +uehqngo +ehvqgu +edquhg +ucgyqdhe + +cigbdtul +agicltduv +cgytuidl +utgcdilm +ulgejtcwfxdi + +efk +fd + +yekuojwtxp +odky +ngz +tpwyd + +vo +og +o +o +ofj + +wavejohibzrk +wijeafkrvzob +ierabjvkzwoq + +bxtkfhcyigulzdp +ihjfyukgltb +nafkrhwibgyulqvm + +wljfgnvr +aowxfliqpr + +swkxmvhcriylgt +cgitkxhlvmrwy + +ilnzkweohypu +axfcdrtsmjqbv + +xolcuzgfvitedbkyr +gkldfetvpuxyorzi +fxituzlqvokersgjhyd +btkzyxiedrlfvgou +koryuemagtixfdlzv + +hsubfgecvrjna +nctvf + +pyeaxfmr +eyxprfam + +zr +uez +zou +zqdxnsakmvifj +hz + +jhbwgfrpvdx +mcnrpehvufgtb +pvzubqhfgar +ofipybhktlqrvgs + +bsfu +hu + +xk +kx +uk +k +k + +qymaugnc +ajigmczroyxb + +dxjisapbrcqnltwv +anzrjtiqxslbce +qnxgjalrtiscmyb + +rkmxv +hmrkvx + +nha +pqjeh +h +ahv +vah + +ipl +svirqdjpmx +pjimx +whpekfzgtbi + +qlshkevani +eshaknilvq + +xpi +pxio +xpjoi +pnxi +piox + +kxub +dkmxu +nka +cku +quxzmk + +exthvjmbrl +ebsamihlxrvt +utfbrexmkljhvn +hbxmelrvtj +mlerbhxtv + +ykzvcm +vfackzmy +zvmkyc + +cdnqv +vcqdn +dcsqn +dcnzq + +odv +jdokvasx +dqvo +dwplnvo +qsodv + +ud +du +du + +sfoihm +oisf +siohf +sifo +qdjkifalso + +eabz +bpza +bz +ezb +bzuyvg + +d +x +d +d +d + +muf +m + +ohtfclrqkabuvynewidxgjp +lchojyerxwianpbtfkdvqu + +h +h +vh +h + +uthpecmangsirovj +itzrvywgmaushc +cumrhqtasvgnfi +mvgtorachqiebsu + +icrlaxzefw +ceibjhywlvzdrsao +xelqaiczmufwr +ialnczmewr + +v +frwckiy + +qne +zsgn + +ysaxl +xqwlasey +xsyalb + +ntevywd +hxungtl + +snzgpbyhtlamxroec +wczfumyrjhidgsqbkavot + +sapbxcfrthquln +kqafnsuhob + +eaxhmlnuwco +qigzs +gkfjy +jrvdg + +bztomjpxycqnkse +qcotlpesajmfk +oetdksqpcmj + +pwtjdilcyx +liejpwtcdyx +ticlpwyjxd +iwldjcpytx + +aoznvbfrxy +zbfvyxroan +fybavroznx +fbavnyzrox +xobyfvrnza + +ioxynh +xinyho + +io +uyiwon +oxi +ivo +cio + +y +ny + +l +lc +gl +cl +l + +akxs +asxk +akxs + +vglhiwm +hkv +rducpj + +iszjbtaouvcdkgfylxhqnrm +cagdmhlziutfxqrkjynovsb +kmcdrvgxynzoafusjlebqtih + +kqduelpmh +uplhedkmq +dupqelkh +eflyuhwqgdkp +hqplekdu + +gwkfxo +fowxgk +foxkwg +xkfwog +fwkgxo + +xpegdzcsoyjt +zpcsgetjydxo +stoxjgfzecvdpy +typecgxjzosd + +digfewr +psxv + +pntydfukzoecihxv +vtfzihungkcdxoey + +ktaqydchpr +kcalptydhx +ydkprcaht + +qep +pqew +qvpe +qepx + +l +o +o +n + +zubsojhtqep +bujqpsytoieh +upeqthsobyj + +regblhcjn +djgecrtblnh +jhebcnlrg +brehclngj + +lprbihju +jhzoplsnk + +hgnlwjfqczu +cjyuntigwzqeh +qhwlgunfzcajv + +adjmogquh +wpsodnth + +brueif +teiuqrfb +ufrbei +fbieru + +zeaufk +ukfeza + +qk +cqkf +kq +kq +qk + +dfw +ndwft +wfd + +sdevru +fdsr +nbtmord + +vlhxnguq +qvlgun + +nkcoszpaivjqybwt +qjdzgrumbsiopkveaylcx +szypwickvjfoqbha + +xbtzcjeimsnwf +vtkicgmnhbx +xnhabvqicmtdpr + +uxt +utx +utx + +yurfmzncxwbil +vyi +yovi +iya +ksyi + +vbkmdhjzf +vbhkjzmf +mfolkbhjzv + +bcl +blc +clb + +groy +n +mq +wiebc + +bpn +pnb +pbn +bpnw +nbzp + +blgdwivs +gvilsmwbd +bwgdklisnv +busdviwlg +mwlibsgvudc + +stafhuqw +aufhqs +hsqauf +xrkfmepbsnqac + +ajlhmnzqfbiskyxvuoc +svfalqujboincmxzkhy +sxvlznqfajhyboimukc +vljuykzxnsiabqchfmo +fbszjynvolhamucikqx + +tjhcwv +wc + +jobkfqrchsxeilu +jmfiaowhpkulqrx + +janucsmrw +lnjco +qgctnjz +vgjnfc +dcionzxj + +ouhskqaiydtjz +oisamqzehwlyutx +uqytfipahsvzco +uapehtyqziso +yqatsuizefhmow + +klsdvrhmfiqyptuebxwc +usdxgerciwlvnmpyfob +vbwxyedsrmlpiacfu + +mzcf +mwc +chm + +zuipejovcklydarwxqsft +cdevzkwmrjfpoqxtuylsia +frwldqezastuocvixpjyk +xkluzcosjtfvdeapwriqy + +yk +yk +ky +kgy +ykv + +vtrikmwcoju +qtphlzbjwovrg + +pujnbx +nbupjx +ubxpjn + +nikcbsdhge +hibkgcnle +nboehtpigck +likhecnbg + +cuhjlgofs +khsocg +sbfoghzv +ydsngtwop + +swfudijxtklq +xqvnajufkihwtdsl +ixjkwdsqtful + +mvajfubtpgxwocs +pvsbofxmjwaguc +asbgcfmowxujpv +oseuibcgxfvmawjp +pmbcageuojfxswv + +dvwqskngflbpx +ibtgczowdfljmhuaye +svlgnwfrpqbd + +ftxykloisajqwzun +qytozbimwxuafeknj +lazjyixqmotnuwk +voxhyjzknuticqwa + +tfszajmeokvupiy +tmqcvyjsuf +vtyufsmgnj + +kwzrisqu +zuskiqr + +v +h +h +h +w + +g +g +g +g +mg + +wmoigknfuqlerxcpd +xmcrguoeqfnpkwild +egmlufncqdvxropiwk +wagquoxrcfptekdinml +lxgfmeirdquowkcpn From 56e70c444d088dbf603edf086e7bec6fedf2f43f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 6 Dec 2020 07:22:41 +0100 Subject: [PATCH 086/479] 2020: d06: ex1: add solution --- 2020/d06/ex1/ex1.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100755 2020/d06/ex1/ex1.py diff --git a/2020/d06/ex1/ex1.py b/2020/d06/ex1/ex1.py new file mode 100755 index 0000000..ff38b71 --- /dev/null +++ b/2020/d06/ex1/ex1.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import sys +from collections import defaultdict +from typing import DefaultDict, List, Set + + +def solve(raw: List[str]) -> int: + answers: DefaultDict[int, Set[str]] = defaultdict(set) + group = 0 + for line in raw: + if line == "": + group += 1 + continue + answers[group] |= {char for char in line} + return sum(len(answer) for answer in answers.values()) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 09be17972e0af7ec8e084d744102266023610882 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 6 Dec 2020 07:23:22 +0100 Subject: [PATCH 087/479] 2020: d06: ex2: add input --- 2020/d06/ex2/input | 2246 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2246 insertions(+) create mode 100644 2020/d06/ex2/input diff --git a/2020/d06/ex2/input b/2020/d06/ex2/input new file mode 100644 index 0000000..7315fba --- /dev/null +++ b/2020/d06/ex2/input @@ -0,0 +1,2246 @@ +lfnghcsvpyrdjtxozimb +mdtbnorpfalcijxvhsy +elmwjkfbihydxcpqtovsrun +tlhmsdjingyxcbfrvpo + +a +a +xqh + +mxdeqcinvfg +vbncrgzxqefka + +oejsdfwm +fojsmewd +ewxfsouimdj +eodafjwsm +edjwsmfo + +d +d +j + +mgxywknlt +khgwmr +wkpezgboavm +mjgkwni +mwkcg + +mqzjtgskhadecwy +nhkjeqgdtfsa + +rc +cru +hcr + +vuaeqdcnty +nltovzycbeidu + +phcqe +chep +hpce + +smjuow +jwktu +ujw + +ljphnwtmugi +giltnpuwm +mgtulpkiwn +uxltinpgwm +jmglintwpu + +slbguajo +lqwardbuo +zlqmdobau +ucalqob +lobua + +uwtcp +umtlwc + +lrcpgjwqfaybxtisoznuhe +wjpnrsxiultyabgzhcqfe + +clmfrxgbqikzpsoduvjy +uoxibjmkygrsdqczplfnv + +oncmzsf +onzmds +snzmo + +zlmegxcnavjb +bmloajdecvwzxgn +pjgzecxvsmbhnla +fngpcvhaexzlbjm + +ulhkjzxadgvc +uejbgctld + +xuindfqzvpg +ugdofws + +qrpvexjlywfmgbintuzk +wrtnibqvuflkeypxg +kretgquypbinwxfvl + +tmrdpzxvily +itorywvlxjcd +rltdvygbxic +xyliotvrdc +xrvtdilygc + +uihswfvanoyzl +owgnzcshuvaqlfiy +whrtnuoyimzlsvqfac +jiekwxbznhfvuplo + +jgbtesurivfxclapnqdmkzhyw +dcnjhsqgkzyitwfplvearubxm + +umovhtgaekjixwfcdnq +fcoamwkvjeqxhdbgitn +datcxweqzhirmjfnkogv +vwahorqcxfilmkgtndej +myhkadptsgcxfojinqewv + +oys +syo +oys +yso +oys + +fatvyeruxnilcmpd +ydacelgfmrxtvin +tgdirmynaxclqwe +jstnbxmdlcezhraiy + +fkbnpgyhs +ktnhbya +ybhan +wqconhbey + +zicrfu +dblyczk +eshjmczvn +cdzgofpx +rawzc + +hcuypzdfalvt +dfplcsyvazrqh +lfcdvzrhyabtqup +lycegwaofdkmzpnihv +ayvzdhscplf + +rvowpcnbjlfhe +hsgbdivpcjlxo + +wbiplofhkmgvr +wvmrohkbfeglpi +bvklotpghrfiwm +wltkighfbrmvpo +bgvkflitwhmpor + +dwmorjebnchvuaz +hyikgfenl +nykhxegq + +pnsactlj +knytclorg + +w +wj +w + +gushnlqjctfvwiyz +shtqjuvzcgniy +cgdusyjpntzivqh +ivuzjgcnqhwtsy +vcusgtqinyzhj + +fjnacgiw +ngijcfw +gcwnifjo +wvhsncikgtfj + +tecvxgzsjridpa +azvtdgprjesixc +mxspejvzrdcaigkt +vristcjaexpzdg +jvipeagxdtczsr + +v +f +w +w + +wrsxdmlay +yxalwfs +xlatysmwe +bgqyohvpzswnlxujcak +silxayw + +zxelswo +slwzpxo + +aizvyoqg +ealnxdyczgpsrj +hkmwbutf + +cohalxbk +suiydp + +qebdumfwsjagk +cxaokgmr + +r +x +a + +xhey +exhy +hxey + +zchi +izhc + +dh +dsh +hd + +lfjcmoauvzxqitdspbw +febzhrmowptvsqiyaudjkgc +ijausfvcdznmpqowtb +vcsfzqbjoipuwadmt + +up +rkpy +nzjdbg +twkl + +tuepkzc +opzst + +rgszfijlxneuvqcmktpa +azcjfnkuvlpegmrsq +fgjzkvusqnmlcarep +kvrcpumgsfqalezjn + +tvqiwkmdf +qfdtvowsk +tvkifsrqdw +vgdxeubfkjhqzlpwt +dvkytawfqm + +yhiogvbkxlzjwsafd +fylwkxhotbasivdjzg +cdjfgnkshmwyxvaliozb +xusvawyhzklgjoifbd +vkisfrjowaxhglydubtz + +kqws +xqysrkw +lcjsqkmw +qwsk +koqsw + +wc +cjw +wc +cw +wc + +awrshieplc +ixelpycsrvw +qebsmzklpwiuocg + +cxf +xf +najxvf +xfh + +umgylpoz +fxwcyet + +yt +t + +gbeskji +ejbsqki + +grmdbezfou +ufzbredgom + +wmtvcfhk +cyleh +prseclyhz + +cyrwzamnoxhue +hxacmyenru +ndyrashxgmecu +eilychmuraxnfbtv + +fbgwal +ablhjg +agxlb + +cvw +vcoz +nvmrc + +prvbngaqh +qbhgpvarn +palgyevfrqnhb +vgqnbarhp +rbhavqpgn + +fztoevmhwgnb +nbhfweomvg +zfmghoevwbn +vhmsfgwcbeonq +negfvwobhm + +qbx +dev +hyzl +wr + +ltnibrq +qrbnil +rlbinq +qinrbl +irnqbl + +thfng +gfhkbd +hmucga +rhdg + +fqwalrhvpyxieu +plehrstgivfx +xbcvtrpefldih +efpxrlhvdi + +kculvzfnesawmty +vkztnuycwfamlse +ecvnzlumykwatsf +zatkulemcyfsvnw +tafczlusnywekmv + +a +a +a +a + +cktun +lnrdyfk + +rexndcwvkibpflzjqymu +exivdprnjzyblfmkwc +czbknjlrfdivxypmwe +fjvgyixpedkmrwzncbl +hricxbjypenlzfdwvkom + +vqebrauop +ebopavuc +upabhveo +vobeaup + +iaxlnehuycwkrmzqsbp +bynlcreqpswzmxikhau + +nb +ikqoh +ho +qjh + +oaixhtmeqc +envpiuhkqdmjx +xhforyeqwim +hcaezwimxq + +ctubrpd +dstub + +vchgnkea +hkegyxivc +fpychegtvk + +apxkiotyjzsqufvbld +daviftqlxopsbyjku +zblyqpajvkdsixuotf +lafqdsyjuckbtoixvp + +pmlwfdcbik +xzjebqshotrnygu + +cepzjtkamvnfuloqrig +vkoiepjfnztuglqmarc +pnjrlqgmkzotiuevfca +tluscvmjrzkgaeipnfqo + +k +k +r + +ae +ea +ae +ea +ae + +ypvtzi +mtu +tjs +fjust +ufmtj + +zilgoaqmr +aqopzmuvxlwrjg +ozrmnadbqgl + +rbfm +r +rep +vfmr + +ajrsgqiodfmwuezkltv +tqsfiwvgzmeurdkajlo +sqgywzoakturjlimfdev + +wplbfyivhasrujdgzqcmxnk +tklsezcwrihvj + +vshfrae +bhnocstidq +xlhsfmza +swlxah +mpksvhy + +uelktdbswyjpaxqmnr +ruvwjsnyadhmzepb + +jepzvwaqublirdftgcmx +lwncbxgqkvdjpztiuamf +vxmfwtlaibpjgzucdq +pfidxgumvtacwblqzj +dsgivqfnptwzmbaxucjl + +gotqzew +jdfn +dub +v + +nzj +jg +g +vp +n + +clbgtr +tgrlbc +rtbclg +rtbylgac + +uyit +iuqtpc +ituj +tui + +jlsipo +hpijl +solxjip +izplej +xlpitsj + +zd +grntma +w +iz + +lkxgcpywohifnu +hyglocfnkpqwux + +fjz +hj + +fxpjdrglkntmzce +qznmtgfpljcrhd + +w +hauesfy + +goixwvdy +dxivyow +dowvyix +idxowvy +dvowxyi + +bw +y +swg +uyw +aijx + +xhkdzbts +pedonw +gqld + +neslgchypjqavwr +aclkpygqtnwiosh + +vboyhcijednm +neyvjcd +yvdjnec +ednvjcy + +pezkudgxf +zpfxgkbedu +exkzgfdpu + +oulheigbsfjn +ltnagbieju + +vmyhslndzaroiqpgxutfk +dpilskvjutayrghzon +dctniozulkhpsvgrya +srhtzkyupavdngoli + +aeybn +slcoixqtkgh +bw +rvfzp +uynjmpd + +zexkwslndgyi +encftykmx +rhbenmkoyjx +xymnrke +kyxjbnumer + +egdq +efkxg +lmnscieutozapj +wye + +nk +ny +wn +nk + +wnmubxsrvqzcyhtpjf +sjymafxtzhcnriubwv + +msub +ubvyhkm +ulmocbq +blfcuepqm + +gtsfubrozwdiapm +oqkuvhncxbzip + +vfbklexjnhziwsayqtrpm +ntrzifljyqvesamhpk +hnvmkyprultqsifazoejc +ejcvmtnipfalyrhkzqs +qtiavmhrlneydpjgkszf + +yxst +hgtwy + +ymf +yv +zpdyb + +amdhqbzjkxilowtuvgnrfpsy +fugmwydqvsihkntlxjeazbo +rsvxyzqjoadibglfthunmkw + +qzbsk +bqzsk +zsbqhk +zkbsdq +qdbkzs + +dwlij +jldiwn +jiwnl +ljwrbi +jiwl + +nmbhlqkaovrgiudte +dbnotamqvikeglhzrx +ohgnmkrztblaidvqef +tbqvahorjgniewldmk +qrtvyobigemkdlhan + +par +rpx + +rq +r +r +r +r + +nuxaoymrctdsikpeghzqwjb +lrnpzwbyiksdcjeumxga +efzlgxyvdubrsmjwpnakci + +ftm +t + +zjydrsx +syrxjdz +sjrxyzd + +rxczvljiahfwmbok +olznqgdawfjtchibvmrx + +ydlwknjzhugeamq +jzvylqmgdewhaukn +zyluqhnewjdamgk +lnuygmwdaehkqzj +jindyaeqzulwghmk + +ujcbsanxhmltdvzeg +uznjaedcmlgstbhxv + +ejxp +dypjn +lan +bwgvkrm + +v +s +s +s +s + +rdswzekavfj +jubothxgani + +jazgdw +gazjdw +gajzdw +wdjzga + +mnecwfslyp +yfntmsl +mcnfghls +xlinzojsvm + +ocgxrsmheynbvuiw +handgupyeslixmwcbvr + +yfzhmrpdkustegwoalbq +lyftdmopzrewsgbu +rwuglfsbkdtcnpqozme +etzuwbsoyprfdglm +dmwtljgrszpfeobiux + +ealrftgbzy +blgearjyz +yngdbxclrzmea +jayfrezbglh +leargyszbf + +clkedspwxzqhfojb +nsxhezwcjpkdfoqb +czowphbeskfjqxdl + +pkzoadrt +dozrtapk +dtorzpka +atdpzrko + +vrjyxhnqfg +yjhrnvqag + +owgadqkfusicxrztl +qicupjdzgkolftw + +o +q + +csbaloz +cozblas +soczalb +lczabso +mtozcbsla + +faljzbneuxympogctdi +cailgjmzqexdptbvfynu +wjpknbfhelcimtxrdyzg +gmyebdfipnxljczvt + +j +j +j +j + +getbmjnwazok +czenqpftw +nlxzweqtf +drwuzetnyl + +ywmi +sgqdt +lnhzfxpbruovja +cqe +gyk + +vp +dxesf +krp +ar +gz + +xeo +q + +myfw +qnelw +jrodw + +ndajkhfmzxslvopb +ajsckbhdpqfnlgzmvx + +imldxsptvaqyhcgbjn +ghnyicdvpqtljasxbm +lqjesvdhtbaxpmcginy +andpytcblvsixmghjq +tdvyxcnimahlsjqgbp + +vsopuwdxhtabgej +gjahsudbxtwpeov +vsawxbgedzotphju +detawvgbouxhpsj + +xriwbfaocqgztydvnelkspj +xkjfpcaqibswtdelyrgzovn +zpdexnfwalqhyjsokgbvcirt +zevfqwxcrjplgoskyitadnb +jcsvkgtwezobdnxyfqprial + +uvigr +i +i +i + +zyatdpgjrle +ezsyrdhxptav +kapdyuzreotm +qeryptdagz + +z +z +z +z +z + +sizxwqmegyflndk +fnweyjdbckugxtmpv + +vjtkzol +hwjtzmqdykosv +jtzokev +xztkvojc + +o +utxgqfenh +d +yvkj +kswvm + +uefcqyzgalm +qafcezlmguy +cumafzlgeqy + +lmfzyt +mltf +tlgfm + +ne +eu +e +zen +e + +tepckxywbnuqahilvr +cwqpuveanixogmbtlyk + +mgyu +usyz +nyu +uy + +hvnilwjcgbekmt +mljgckftviwhneq + +rdaspohl +lfxjad +amdl +dla + +ncjmux +hxzemjuoqnc + +slhdpwkc +plhkwsc +wslphnkc + +kx +kx + +klbmqja +cbpikxjoaswyhg +lakbmuj +kbja + +do +dl +qd +d + +uwbktzrfax +xfvtkl + +pvylfnsder +dnfprelvys +srlpdefnoyv +fvnesrpldy +rdfyneplsv + +cietjkmyu +gkqjcrubel +gvjouc +ajuco +nsfjpdcwuh + +zeacqhdkltxi +mtldxqcha +adqcxlhwt +whatcdxql + +gsrhkdwnyt +wvngykhtd +otvwdnhgk +dkmtnhwg + +gdq +asgqd +gkuqd +cgdaq + +amoriyvlens +nfrdvltkyes + +bgemhciuqtnpw +jqwtgbpcnhmui +zyogtixnwmhcqbp +gqtwinhbcmepu + +jn +nj + +gkqz +gvjyzmk +kagwzf + +qimgwjex +qcxjemi +xjmqige +jqxgmei +emjxqi + +bftzjip +fkjvzbcy +kzjthybdm +nogjbrezl + +lukfvrc +lkrfucv +drbfuklvc +uflckrv + +tekijdqozns +djsiekoqtn +noektqjdis +hndojsiqekt +usndjteqiokg + +cw +c +cs +wc +cn + +lxfgopvmh +ckpatzifnwxsjum +bfemqdyrpx + +xosicnwrb +wsocbr +brwcasoy + +esiz +ise +ies + +dcungxvhipzorlbwsjqkt +pvgzlihbocskdnuwqxjr +jwqvrboixdchpsklzugn + +jsizhem +zjsbhi +tjhzu + +tgldmihkjb +hbekplin +borvflqchzauxi + +eosqa +zpqgusowa +okqslrae +qofskay +olaqst + +dbulmwerfxjoiha +jdiwhoumflbxra +rxbdihmofuwalj + +gqzwfumsipboyjnl +forhywgnulpsbmiz + +ql +qml +owq + +dpbxiqjy +bxyqjpdi +yisjxpqdb + +hxcrzpjvmnkgeuo +hryatdbx +rxlhytfwds + +ljdozibqytwnfhvkxp +fqxiwhcyzbptkjlvnod +iptkxndvjzlyqwmhofb +efgvoxydhpjqiztwlbkrnus +vfzqpjblnidytkxaowh + +onewvclt +vhcteos +vecnto + +fpoisndugqmb +fqkgntpwjbmdus +elfqmcnbudgshzp +gnqpdmbfsvu +snrqdupbvgfmj + +euvtmyohfqkscjdn +fydvukotsmpnjhqec +fhqumnvydstkoejc + +zcoupardbfvns +siufbpodcnlva + +dwkfe +nfdz +ibjodf +xdyhvltgpu +dzjnmrcasq + +k +k +k +bk +ckj + +tavfsckigh +hquzcnbdorlwm +ycgh + +qplvetmdc +qdmvetcpl +pqmdcvtel +lpetvmdqc + +lhcq +qcuk + +whmnsqpkjov +wtjgu +tlcjdw + +egicls +cioegs +cesgi + +lxaifjhyrqgsem +mafexiryqdsjghl +xemjlkgfqyraish + +zwrdcmavo +zvrcadfmo +madfozrcv + +slfagzbjwotdni +mdspebtajxfiwknzlc +dqsitfarvljnbzhw +auilefztdjonwbs +tsiebdwjlnfaz + +svgnwpr +nsaiguwl +xmplcdgsn +eotjkyshbqnzgf + +bl +ly +iafxle + +wnckbplriv +ixdbelhpgmqfscvwzj +lpwivbc +byptliwvuac +vbicwoklpyu + +eskwamyvgxzqbtprculijf +eipbrxystfkgucjazwqmvl +wvplyjkrbcguzqsfteimxa +vhtrlousjbpmfzanqkwgcxyei + +p +m + +ntfspeyqrj +pqyernsftj +tnrspejfqy + +gx +x +x +x + +gizducfvmtohe +genmuitdvzkhxf +tbpyaruimeshzgwldqv +kidmjnuovehzgt +mxthzudigve + +kudjgcbhna +lcajungkd +chdankjug +cekjgpanud + +zqlucvfkmnpoighxb +ohcpgetlvzufinkqmbx +cunpqvgkziflbxhom +cgklbnvfxouqmpzih +kjimlchzgxpqvyuofbn + +uwmz +nz +zbofx +zw + +r +or +av +j +j + +tvbqc +qedctbv +tqzvbc + +t +t +ts +t +t + +qhkbwa +awubqtzx +fqbyja +mbaiqhrt + +wzcuyqanpdtsghr +zpocrshdwynaqtxvge + +gpq +qeh +cq + +jfltaouwri +ygbxsqdz +skd + +jmlh +hlmj +hjlm +jmlh +umihknslj + +ute +ltdzqf + +ygkx +mywxcrd +apyx + +xy +y +dy + +mivusqxpzyljehgkotrf +ajlizqnpegckfohdvsxrwb + +pl +lp +pl +lp + +xmnaupwtcvozrfekbdshlq +dlafzmnhvpeskwoqucb +uzydhfovwmapneqlgkbcs +cjapswblfmnzqokeuvhid +dzlaovqnmsuwkhcyfpeb + +wpb +bp +bp +bp +bp + +pusm +umpshr +musp + +xdz +z +f +ecjo +nkxz + +tjmvdf +st +trn + +hkfgarys +rghfasy + +ljyixtumsfngvdwoqzpakecrbh +kfpuvicgrsnoetabmywjzqxlhd + +az +z + +rgkf +khrgn +nrgk +gkrfoc +werzgkpa + +vkg +k +k +ku +ik + +blruxyvehtsn +thdl +mtldh +lht +thil + +rnzqadiplhbegj +qlezpgnabdrji +lnrzaqjpdigeb +rbjlnpiegqazd +jprzlegqdbnia + +kgo +okg + +rjm +kiml +cuxstqpwod +kghb + +yckovthbrigazfxq +atriygxofzkcqh + +vudbtxjpgaqfzhlkmncswyi +lgfjahksybqmncoeuwvixtrd + +dmlyrgkwfjovqasxit +ylawsjxrftdegmkqvi +stqgmxfrjvlkhaydwie +mypcdrjnkgtsxvqawlfzi + +ethrvfnyasdkb +eanwdyfcsbhr +xayerdsbhlf +ejdrshvywbaf + +hqyfnrxjzsd +buly +yukpm +likmy + +zlpditkvsawocunjqyhmrx +rdtjsunpqymlhxkvcwzoai +oaprkqhumtvlcwxdnzsyij +uxmdclkpjqrotahysizvnw +olwhpitmraqdnkxuvjsycz + +srnhuf +hrsxfwynuo +gnzsfbutcrh +krnhusf + +l +lsb +ujqtvol + +cptnhxgdkivyjlsbrwmuf +nkbshfmrxgjdoclwivy +fxibalcmhydvkjnwgsr + +txye +cjvqsulagn +kihdbf +ohpmzwr +rbtw + +tgm +mgt + +nhucrjmq + +rubajlyszwn +nlbsjzwryau +zrwuynsjbla + +flvdypkxabzm +lipzbtrmqof +ljmghurbifpzns + +bsv +wsux +vs +s +sv + +vfqsehx +xseqvhf +svxefqh + +fipwjdl +jpilwfd +whflvdipjx + +oclrqnubyhpmdks +wmkchdsqujbpxlnyo +onulmdsbyhkqp +mlubkpyhnqods +tfmesqblonudihypk + +gcwf +a +v +q +o + +xpqlzcfvtjgr +fxwprjglmasiqev +xljpgbrfqvo +fbvqrcgxpdljt + +nxpktofqglvrsjbi +wvkotsgijlbnrufdxq + +rpfew +iflep + +tdy +teyvdjo +tdy + +ix +gzkwchaqd +oysure + +hxvkjmneycuspbwroqaligf +qkhpisjmxblnwezrgoauycfvt +emcqhiufkjbrlwyngapsovx +aixrbgcfynwelsoqkpmhjuv + +ckxhmridjbfalqo +yzunwpsdlgev + +ls +lzk +sl + +kdpzmau +gzamukp +kpfua +pkau + +usmywivnpgt +biqxymnosaklrehzj + +orwcjpkbiexz +bpzikgwn +winpbkz + +wobslxnhfyjtg +vqdecolzarnm + +rgfloc +yufcor + +tgwnebxyzkchqvoulmprdijasf +zmpdjlekigtswronhubqcvfa + +fyrbd +yfbr +frby +fbkghytr + +stexkgyiqpaodnm +opecuqrdnytkxaig +oxykdtnaegpiq +xtgaydoepqikn +oyktnixegqpbad + +irgbyxhwm +iwgykrbx +yibgrwx + +dxejzvrocb +tbxhmqscrid +cjrodlgbxz +zcbxwpjrd + +l +lg +g +lg +nfi + +ab +aw + +vlbi +zegtwnc + +dgbj +dgjybl +ardgupbsqjv + +xoquygizahnwpkvds +duaoyzvgqxhkiwspn +gpvyukzaiqdnwoxsh +qpwnyzihovukasxgd + +fcepzibvulyxhsjqdanwmtrg +bijrdfxcqhplwnymsezatuv +uxbcwnrmisvqhljpzdaetfy +umwzscitfjhxyrelpvdabnq +usahyzdmtqfibxcjvlepwnr + +tpk +gzetqkypuhj +pknct +mfticpk +akiwtfsp + +qedhju +lvdqtzehyj + +vyfe +vey +yve +yve +yev + +dseopbmfcuk +msfekpuodcb + +jm +jm +mj +jm + +jfgevdqxm +mqftev +fmeqv +etfmqv + +grhalzpfsjweuyt +zteylfsaugpj +jtuzpeyflgsa +zlajntyufgkspe +fjyapletgzsu + +ixhz +n + +mqekbhiu +ikgbhmeq + +xscglkt +ctglkxr +kxlctg + +siygouxkzhetdrqcfp +eiftxuyhpkczrqdsgo +qgfryxepotiucskhdz +pfruziqyxgedkthcso +pezofhisdcxygurqkt + +kp +kqyxp + +hzbtkxlyipegra +lkrgehiyapzxtb +zhliaprgbkexty +axgyhlpekbiztr + +mh +al +hien +zxkprdvo + +xfjokhuyszwt +ujotxwsfkzyh +tfhwozsujykx + +bqudfgvjeiy +djefqvibug +yvxuiedqjgbf +xuefjqgdvib +ibveujdqgnf + +liyqzxwogcdhvjsr +nvcigxswpoedq + +zjdgxfqwhcbm +qxhjgdwmbzcvf +cxgfmzjwbdqh +qjzwphxibcmfdg + +tdflsxicwmpar +iawprsxtmcfdl +rxpafwlihsdtcm +amtwplscxrfdi + +sgjmp +sojg +gsj +sjgu + +pjtayfvqgubsdzh +rxwbhcekljnm + +fhsmgpyblcitz +zmibgvhylwf +vigmfbzylh +iyfvglwhmzb + +bprqyialnmkveohuxs +iykvuxbpshemloarqn +ivnoqlxrpyabheukms +xvqnmyhbkueslipora + +ogdijpwtxuchrv +ovjhdwxptiugcr +jxutokrfwpighcvd + +oizhtyglwbnjfuverqps +syaiuqhzeltbovrwjpgn +eohzgwjbtrqulsivnpy + +uptch +igt + +up +uhy +u +oua +hu + +owtkc +oktwc +wkcto +wcokt + +qosvjmkcixhdb +upaweznmgjt + +pcnabt +bapct +dcbaqzuvyl +jcab + +siw +iws +wsi +siw +zskiw + +b +by + +vdljnuawqg +daluqjvwgn + +vqctdhulbpj +citavlqhjkdpe +glhsjpryofnzwvcqdt + +xo +xo +xo +ox + +l +vkjflgh +ld + +oftdbe +jutioleh +ebcrtgo + +dcwx +zgcxtb +dcqt +opfucrjikea + +kjogaebchpmxzudy +yvxmabpdgznjoe + +dtfrbceshaupizxqwl +wlefqdxbarzitscpuh +lrafisdhktxpzcbwuqe +tleibrqsazhufdpcxw + +mwjahec +wcjme +kjrwcme +cemjw + +jfgonrqkezumxdsbvaci +vgsindtuyzjbomrkqf +osfbklvjiumwznhdgp + +nwmgfludzhoyb +jwmgonfzhdkiuab +huvgwsfrbdcenmotzqp +zdhgxofwbijmnu + +wahstyxvugdmolp +tdalphmxsuoygwv +glpudovmtshawxy +hwstlopuyxmagvd +lgayovuwdnxptshjm + +a +a +a +rca + +szlidbpwxq +slbzpqdwx +qzwxhrpybls + +ewhjlxfcmuidsgnbrkyoq +enmiavrkwzlobjsuyq +pisbwokteznlqjuymr + +brnec +nwcrei +bnecor +ncerb +rnkedc + +pqw +kbct +hviudfjyars +wbe +b + +xtsbynudvwjkfalre +auwkntbfeyvxsrdlj +nyewflsxkjuartdbv +adexltvsbymrwnkujf + +yima +miay +amiy +czimay + +yagqmw +mwqgya +gqwyam + +acqibtfwlnyvjumrdgspoxz +dxzbqownsgylajucitmrpfv +ztpcrulxjomvwbdgyfinas +scbwynpftarmgjduxliovz +mpgtuyzhxwcoibdrsanflvj + +bdftwqgsaimhxvn +stmaqbxhgwvfdni +abmfshgnxvqitdw +thabinfgmvdqsxwy +dtwvbasxnhiqfgm + +siomckdrlhnytjaqpzwu +cqxytvoanbulrekzwfpd +uxadwqkgptrzlycon + +stwohnvrq +kfnpxvcy + +ijlkvrdacmuhotxwbsqpegyn +gopemwhirtcbynxaskvulqj +aweqlciybkguopsjtmxrhvn +pwelrvhicybstoqkujgaxmn + +ckpdbfs +kcdfqv +foecjkqsvbh +muzckif + +zsblxdetgovunfiqwhjpkmracy +wvkxysnjdraclzgemouphbt + +qmtx +xqt + +dmieulgon +jfmyra +fsjma +xmsq +tvcm + +xklcpvzje +lpjrvaez +zpjlev +fvpjlez + +bodrkvzcmhyxulswnijt +ynilmcwzrvohtsubkdx + +tewspzja +wjtsplzfega +atzsewjp + +tu +but +atdnsu + +y +u + +qbtawmldjsy +mjqdsylbatw +tyalbmqjswd +ljsdtwbqyma + +msgytaj +vygscje +qjciogk +nhpflxzrduw + +vcmrtws +srwyc +wursckd +cpwrs +wsrc + +ielm +pilfr +mhxlcaf +gvzosdytl + +ij +avi +ylio +kaim +ijamw + +cgxwjydavlhbpior +adckqejbhysinlo +ajwczfloydthbmvi +cubojhwagryild + +jyqagilxfsk +yfasltokjgqx + +impglqcwn +ngcaydziwp +ipbgnzwcu + +lj +j +jfrb + +xncgrjkpsmwailbdeouzqht +rayuhpxqsezkdlowicfnmjgbt +ijzwpaqtdxcuhegsmlkvborn +upndtklhgeoibmzcxrswaqj + +ohsckdiej +dochisejk +dcsiojkeh + +xcbnwtzqu +oeywhzn +jgfskirml + +dsrvqfctojm +facqi +yflgqcw +cqnlfz +qefkcy + +xvwadfktl +fltkxwa +wptxjalf +mtfaxlw +awtflx + +vzxqjbrwlpysguonctmf +orynmphcqbfuzwtaxjs +mrunfcqjxoytszbpw +podxzyserwjbqutnfcm +sxqdfercbnopmyujtwz + +anzbwplo +ingwuxc +dwrketnsv + +goz +go +goa + +msgopxyt +tsopygmx +gmxyustpko +xpmtsoyg +xptgmosy + +ohj +ojf +jo + +gvm +c +nrhjkwda + +ryqudzpvg +vzugpqr + +wya +wa +bajqno +gxa +da + +eobwrtihcqfp +rhbkdep + +spnlubhavkw +obiqgzyxdfercj + +jtfq +q + +jyx +wuz + +bhqnegu +uehqngo +ehvqgu +edquhg +ucgyqdhe + +cigbdtul +agicltduv +cgytuidl +utgcdilm +ulgejtcwfxdi + +efk +fd + +yekuojwtxp +odky +ngz +tpwyd + +vo +og +o +o +ofj + +wavejohibzrk +wijeafkrvzob +ierabjvkzwoq + +bxtkfhcyigulzdp +ihjfyukgltb +nafkrhwibgyulqvm + +wljfgnvr +aowxfliqpr + +swkxmvhcriylgt +cgitkxhlvmrwy + +ilnzkweohypu +axfcdrtsmjqbv + +xolcuzgfvitedbkyr +gkldfetvpuxyorzi +fxituzlqvokersgjhyd +btkzyxiedrlfvgou +koryuemagtixfdlzv + +hsubfgecvrjna +nctvf + +pyeaxfmr +eyxprfam + +zr +uez +zou +zqdxnsakmvifj +hz + +jhbwgfrpvdx +mcnrpehvufgtb +pvzubqhfgar +ofipybhktlqrvgs + +bsfu +hu + +xk +kx +uk +k +k + +qymaugnc +ajigmczroyxb + +dxjisapbrcqnltwv +anzrjtiqxslbce +qnxgjalrtiscmyb + +rkmxv +hmrkvx + +nha +pqjeh +h +ahv +vah + +ipl +svirqdjpmx +pjimx +whpekfzgtbi + +qlshkevani +eshaknilvq + +xpi +pxio +xpjoi +pnxi +piox + +kxub +dkmxu +nka +cku +quxzmk + +exthvjmbrl +ebsamihlxrvt +utfbrexmkljhvn +hbxmelrvtj +mlerbhxtv + +ykzvcm +vfackzmy +zvmkyc + +cdnqv +vcqdn +dcsqn +dcnzq + +odv +jdokvasx +dqvo +dwplnvo +qsodv + +ud +du +du + +sfoihm +oisf +siohf +sifo +qdjkifalso + +eabz +bpza +bz +ezb +bzuyvg + +d +x +d +d +d + +muf +m + +ohtfclrqkabuvynewidxgjp +lchojyerxwianpbtfkdvqu + +h +h +vh +h + +uthpecmangsirovj +itzrvywgmaushc +cumrhqtasvgnfi +mvgtorachqiebsu + +icrlaxzefw +ceibjhywlvzdrsao +xelqaiczmufwr +ialnczmewr + +v +frwckiy + +qne +zsgn + +ysaxl +xqwlasey +xsyalb + +ntevywd +hxungtl + +snzgpbyhtlamxroec +wczfumyrjhidgsqbkavot + +sapbxcfrthquln +kqafnsuhob + +eaxhmlnuwco +qigzs +gkfjy +jrvdg + +bztomjpxycqnkse +qcotlpesajmfk +oetdksqpcmj + +pwtjdilcyx +liejpwtcdyx +ticlpwyjxd +iwldjcpytx + +aoznvbfrxy +zbfvyxroan +fybavroznx +fbavnyzrox +xobyfvrnza + +ioxynh +xinyho + +io +uyiwon +oxi +ivo +cio + +y +ny + +l +lc +gl +cl +l + +akxs +asxk +akxs + +vglhiwm +hkv +rducpj + +iszjbtaouvcdkgfylxhqnrm +cagdmhlziutfxqrkjynovsb +kmcdrvgxynzoafusjlebqtih + +kqduelpmh +uplhedkmq +dupqelkh +eflyuhwqgdkp +hqplekdu + +gwkfxo +fowxgk +foxkwg +xkfwog +fwkgxo + +xpegdzcsoyjt +zpcsgetjydxo +stoxjgfzecvdpy +typecgxjzosd + +digfewr +psxv + +pntydfukzoecihxv +vtfzihungkcdxoey + +ktaqydchpr +kcalptydhx +ydkprcaht + +qep +pqew +qvpe +qepx + +l +o +o +n + +zubsojhtqep +bujqpsytoieh +upeqthsobyj + +regblhcjn +djgecrtblnh +jhebcnlrg +brehclngj + +lprbihju +jhzoplsnk + +hgnlwjfqczu +cjyuntigwzqeh +qhwlgunfzcajv + +adjmogquh +wpsodnth + +brueif +teiuqrfb +ufrbei +fbieru + +zeaufk +ukfeza + +qk +cqkf +kq +kq +qk + +dfw +ndwft +wfd + +sdevru +fdsr +nbtmord + +vlhxnguq +qvlgun + +nkcoszpaivjqybwt +qjdzgrumbsiopkveaylcx +szypwickvjfoqbha + +xbtzcjeimsnwf +vtkicgmnhbx +xnhabvqicmtdpr + +uxt +utx +utx + +yurfmzncxwbil +vyi +yovi +iya +ksyi + +vbkmdhjzf +vbhkjzmf +mfolkbhjzv + +bcl +blc +clb + +groy +n +mq +wiebc + +bpn +pnb +pbn +bpnw +nbzp + +blgdwivs +gvilsmwbd +bwgdklisnv +busdviwlg +mwlibsgvudc + +stafhuqw +aufhqs +hsqauf +xrkfmepbsnqac + +ajlhmnzqfbiskyxvuoc +svfalqujboincmxzkhy +sxvlznqfajhyboimukc +vljuykzxnsiabqchfmo +fbszjynvolhamucikqx + +tjhcwv +wc + +jobkfqrchsxeilu +jmfiaowhpkulqrx + +janucsmrw +lnjco +qgctnjz +vgjnfc +dcionzxj + +ouhskqaiydtjz +oisamqzehwlyutx +uqytfipahsvzco +uapehtyqziso +yqatsuizefhmow + +klsdvrhmfiqyptuebxwc +usdxgerciwlvnmpyfob +vbwxyedsrmlpiacfu + +mzcf +mwc +chm + +zuipejovcklydarwxqsft +cdevzkwmrjfpoqxtuylsia +frwldqezastuocvixpjyk +xkluzcosjtfvdeapwriqy + +yk +yk +ky +kgy +ykv + +vtrikmwcoju +qtphlzbjwovrg + +pujnbx +nbupjx +ubxpjn + +nikcbsdhge +hibkgcnle +nboehtpigck +likhecnbg + +cuhjlgofs +khsocg +sbfoghzv +ydsngtwop + +swfudijxtklq +xqvnajufkihwtdsl +ixjkwdsqtful + +mvajfubtpgxwocs +pvsbofxmjwaguc +asbgcfmowxujpv +oseuibcgxfvmawjp +pmbcageuojfxswv + +dvwqskngflbpx +ibtgczowdfljmhuaye +svlgnwfrpqbd + +ftxykloisajqwzun +qytozbimwxuafeknj +lazjyixqmotnuwk +voxhyjzknuticqwa + +tfszajmeokvupiy +tmqcvyjsuf +vtyufsmgnj + +kwzrisqu +zuskiqr + +v +h +h +h +w + +g +g +g +g +mg + +wmoigknfuqlerxcpd +xmcrguoeqfnpkwild +egmlufncqdvxropiwk +wagquoxrcfptekdinml +lxgfmeirdquowkcpn From bdcd821ea543dff9702714c426194363fb2ef1ff Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 6 Dec 2020 07:23:29 +0100 Subject: [PATCH 088/479] 2020: d06: ex2: add solution --- 2020/d06/ex2/ex2.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 2020/d06/ex2/ex2.py diff --git a/2020/d06/ex2/ex2.py b/2020/d06/ex2/ex2.py new file mode 100755 index 0000000..c78283d --- /dev/null +++ b/2020/d06/ex2/ex2.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +import sys +from collections import defaultdict +from typing import DefaultDict, List, Set + + +def solve(raw: List[str]) -> int: + answers: DefaultDict[int, Set[str]] = defaultdict(set) + group = 0 + first = True + for line in raw: + if line == "": + group += 1 + first = True + continue + if not first: + answers[group] &= {char for char in line} + else: + answers[group] = {char for char in line} + first = False + return sum(len(answer) for answer in answers.values()) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From c0bd3a54d0a2ecfead8b888a471b46aa9b882250 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 7 Dec 2020 07:08:52 +0100 Subject: [PATCH 089/479] 2020: d07: ex1: add input --- 2020/d07/ex1/input | 594 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 594 insertions(+) create mode 100644 2020/d07/ex1/input diff --git a/2020/d07/ex1/input b/2020/d07/ex1/input new file mode 100644 index 0000000..ccf5d2e --- /dev/null +++ b/2020/d07/ex1/input @@ -0,0 +1,594 @@ +shiny aqua bags contain 1 dark white bag. +muted blue bags contain 1 vibrant lavender bag, 4 dotted silver bags, 2 dim indigo bags. +drab gray bags contain 5 mirrored white bags, 1 light green bag, 5 shiny lavender bags, 5 faded aqua bags. +muted indigo bags contain 4 muted chartreuse bags, 2 dotted teal bags. +drab white bags contain 2 dull fuchsia bags, 1 vibrant bronze bag. +dim lavender bags contain 4 muted tan bags. +dotted tomato bags contain 1 mirrored lime bag, 2 vibrant white bags. +clear orange bags contain 5 clear violet bags, 2 dull beige bags, 2 dark chartreuse bags. +bright lime bags contain no other bags. +striped brown bags contain 3 bright orange bags. +vibrant green bags contain 3 shiny fuchsia bags. +plaid tomato bags contain 3 faded chartreuse bags, 2 wavy salmon bags, 1 faded white bag, 3 mirrored maroon bags. +drab beige bags contain 2 shiny bronze bags, 4 pale violet bags, 3 bright tomato bags, 4 pale red bags. +posh green bags contain 2 dull lavender bags, 4 clear plum bags, 2 dark gray bags. +dull maroon bags contain 3 dull magenta bags, 1 dull tan bag, 1 faded cyan bag, 5 dull silver bags. +faded crimson bags contain 2 muted purple bags, 4 dotted olive bags, 5 drab silver bags. +wavy bronze bags contain 3 dark orange bags, 2 dark brown bags, 5 bright silver bags. +dark turquoise bags contain 5 dull plum bags. +dull lavender bags contain 4 dotted maroon bags, 3 muted brown bags, 4 drab black bags, 4 dull cyan bags. +dotted plum bags contain 1 shiny bronze bag, 3 clear brown bags, 3 muted indigo bags. +dull white bags contain 3 clear tan bags, 5 shiny gold bags, 2 drab crimson bags. +dull teal bags contain 2 bright tomato bags. +shiny crimson bags contain 3 light green bags, 5 striped brown bags, 3 faded fuchsia bags. +wavy brown bags contain 1 drab crimson bag, 2 wavy indigo bags. +dark tan bags contain 2 faded gray bags, 4 shiny salmon bags. +shiny red bags contain 4 dull chartreuse bags, 5 pale tomato bags. +bright orange bags contain no other bags. +wavy yellow bags contain 5 light indigo bags, 5 dark gray bags, 5 plaid indigo bags, 4 faded red bags. +faded bronze bags contain 4 faded cyan bags, 5 shiny beige bags, 5 muted red bags. +dull bronze bags contain 1 mirrored beige bag, 5 muted violet bags, 1 wavy lime bag. +dark lime bags contain 2 drab maroon bags, 5 bright indigo bags, 4 shiny black bags, 5 dotted turquoise bags. +drab red bags contain 5 bright red bags, 2 vibrant brown bags. +dotted salmon bags contain 3 vibrant turquoise bags, 2 dull beige bags, 3 light turquoise bags. +dull gray bags contain 3 striped green bags, 3 wavy coral bags, 1 dark gray bag, 2 light indigo bags. +faded black bags contain 4 muted fuchsia bags, 4 wavy coral bags, 1 drab tomato bag. +muted magenta bags contain 2 posh chartreuse bags, 4 pale violet bags. +light tan bags contain 2 posh turquoise bags, 3 vibrant white bags, 1 light black bag. +dark blue bags contain 3 plaid indigo bags, 2 posh black bags. +dull indigo bags contain 4 light gray bags, 3 dotted tan bags, 4 dull coral bags. +dim fuchsia bags contain 3 vibrant yellow bags, 3 mirrored cyan bags, 4 mirrored brown bags. +shiny beige bags contain 2 dull silver bags, 3 bright lime bags, 5 dull magenta bags. +light cyan bags contain 3 vibrant violet bags, 2 mirrored tomato bags, 2 vibrant coral bags, 4 mirrored silver bags. +clear turquoise bags contain 4 drab tomato bags, 3 shiny gold bags, 4 drab gold bags. +pale teal bags contain 2 wavy maroon bags, 2 dotted olive bags, 4 shiny white bags, 2 drab turquoise bags. +dark purple bags contain 1 wavy indigo bag, 3 bright black bags, 3 dotted teal bags. +bright white bags contain 5 wavy red bags, 2 mirrored cyan bags, 3 drab green bags. +mirrored aqua bags contain 1 faded violet bag, 5 dotted purple bags. +shiny lime bags contain 4 dark aqua bags. +pale bronze bags contain 1 clear crimson bag. +vibrant white bags contain 5 plaid lavender bags, 1 drab red bag, 4 vibrant brown bags. +plaid tan bags contain 5 dim crimson bags. +posh olive bags contain 3 bright red bags. +plaid brown bags contain 5 vibrant turquoise bags. +mirrored tomato bags contain 2 dotted chartreuse bags, 3 light aqua bags, 3 posh beige bags. +plaid blue bags contain 5 striped green bags, 1 plaid purple bag, 4 muted gold bags. +shiny tan bags contain 5 striped coral bags, 1 dull brown bag. +shiny gold bags contain 1 dull magenta bag, 5 dark white bags, 4 faded turquoise bags. +dull salmon bags contain 2 plaid gold bags, 2 light indigo bags. +striped tomato bags contain 2 striped tan bags, 4 light blue bags, 4 drab tan bags. +drab tomato bags contain 3 dim teal bags, 4 striped yellow bags, 3 bright red bags. +faded olive bags contain 1 drab plum bag, 1 pale aqua bag, 3 light blue bags. +dotted indigo bags contain 2 clear tomato bags. +dark white bags contain 5 light aqua bags, 2 dim teal bags, 2 muted fuchsia bags, 5 light purple bags. +dull orange bags contain 4 pale gold bags, 5 posh brown bags, 2 mirrored brown bags, 3 dark bronze bags. +bright maroon bags contain 1 mirrored yellow bag, 4 light teal bags. +bright silver bags contain 1 vibrant coral bag, 3 dim teal bags, 5 light purple bags. +muted olive bags contain 5 plaid orange bags, 1 muted magenta bag. +dull silver bags contain no other bags. +pale maroon bags contain 2 pale bronze bags. +light gray bags contain 4 vibrant yellow bags, 2 pale red bags. +drab teal bags contain 2 light crimson bags, 3 vibrant brown bags, 3 vibrant tan bags. +bright gold bags contain 1 wavy red bag, 5 wavy coral bags. +plaid chartreuse bags contain 2 dim coral bags, 4 drab silver bags, 5 dim chartreuse bags, 3 light purple bags. +clear blue bags contain 2 pale tomato bags, 4 dull gold bags, 4 dim fuchsia bags, 4 pale coral bags. +vibrant purple bags contain 5 faded orange bags. +plaid aqua bags contain 3 muted cyan bags, 2 wavy gray bags, 4 drab green bags, 4 pale beige bags. +muted lime bags contain 1 muted tan bag. +faded coral bags contain 3 drab turquoise bags, 1 shiny plum bag, 5 mirrored green bags, 5 clear white bags. +vibrant lime bags contain 5 posh coral bags. +faded green bags contain 3 pale orange bags, 5 dull turquoise bags, 1 mirrored crimson bag. +mirrored gray bags contain 5 dim indigo bags. +wavy maroon bags contain 4 mirrored bronze bags, 1 striped olive bag, 2 dull salmon bags, 3 shiny crimson bags. +dark violet bags contain 2 light purple bags. +dark green bags contain 2 dim cyan bags. +pale black bags contain 1 mirrored gold bag. +bright yellow bags contain 2 vibrant crimson bags, 3 plaid lime bags, 2 dotted gold bags. +muted teal bags contain 1 pale violet bag, 4 dull silver bags. +dim beige bags contain 5 wavy red bags. +muted purple bags contain 4 clear cyan bags. +plaid fuchsia bags contain 3 dark coral bags. +plaid bronze bags contain 5 plaid orange bags, 2 drab indigo bags. +faded indigo bags contain 1 dark chartreuse bag, 4 dull green bags, 1 mirrored magenta bag. +posh plum bags contain 3 dark chartreuse bags, 3 dotted turquoise bags, 4 dull maroon bags, 1 posh bronze bag. +pale gold bags contain 4 striped brown bags. +mirrored chartreuse bags contain 4 bright silver bags, 3 mirrored tomato bags, 4 wavy orange bags. +pale orange bags contain 2 posh fuchsia bags, 2 clear salmon bags, 2 bright green bags. +clear brown bags contain 4 light lime bags, 4 bright green bags, 5 pale yellow bags, 2 drab cyan bags. +shiny plum bags contain 5 vibrant gray bags, 3 bright blue bags, 5 dark tomato bags. +wavy white bags contain 4 plaid lime bags, 4 posh maroon bags, 5 drab lime bags, 1 vibrant crimson bag. +faded red bags contain 1 dull coral bag, 5 clear cyan bags, 4 plaid chartreuse bags, 3 plaid orange bags. +plaid red bags contain 5 pale blue bags, 4 light crimson bags, 3 faded fuchsia bags. +bright cyan bags contain 3 dark white bags, 2 light crimson bags, 1 bright aqua bag. +muted lavender bags contain 1 light green bag, 4 striped silver bags, 3 posh crimson bags. +wavy crimson bags contain 1 light purple bag, 4 bright blue bags, 2 dull coral bags, 1 wavy beige bag. +faded aqua bags contain 5 muted brown bags. +mirrored fuchsia bags contain 1 faded beige bag, 3 muted gold bags. +dark chartreuse bags contain 5 bright lime bags. +plaid green bags contain 4 mirrored tan bags, 1 mirrored tomato bag, 5 pale indigo bags, 1 mirrored plum bag. +shiny black bags contain 3 plaid chartreuse bags. +dotted purple bags contain 2 dim teal bags. +faded tan bags contain 2 bright fuchsia bags, 5 shiny fuchsia bags, 1 muted fuchsia bag, 1 mirrored brown bag. +drab brown bags contain 1 striped orange bag, 4 dotted tomato bags. +dull olive bags contain 1 striped black bag, 1 vibrant magenta bag. +mirrored plum bags contain 1 clear gold bag, 5 pale green bags. +dim tomato bags contain 4 drab gold bags, 2 shiny aqua bags. +light lavender bags contain 1 muted violet bag. +dim gray bags contain 3 light purple bags, 1 posh crimson bag, 1 faded brown bag. +muted aqua bags contain 4 dull beige bags, 4 dull red bags. +faded silver bags contain 1 mirrored cyan bag. +shiny green bags contain 5 dull maroon bags. +muted chartreuse bags contain 2 clear tan bags. +plaid plum bags contain 1 dotted lime bag, 4 clear brown bags, 4 dull red bags. +dotted silver bags contain 1 posh coral bag. +dim crimson bags contain 4 faded violet bags, 1 striped silver bag. +bright brown bags contain 1 bright coral bag, 3 posh brown bags, 4 drab tan bags. +wavy cyan bags contain 3 clear gold bags, 1 mirrored salmon bag, 3 bright fuchsia bags, 2 light bronze bags. +dull violet bags contain 5 striped white bags, 4 light blue bags, 4 dim black bags. +vibrant olive bags contain 2 vibrant coral bags. +bright coral bags contain 2 vibrant tan bags, 3 shiny indigo bags, 2 plaid indigo bags. +dim turquoise bags contain 1 pale violet bag. +striped crimson bags contain 2 faded gray bags. +clear green bags contain 3 mirrored olive bags, 3 shiny tomato bags. +faded violet bags contain 2 wavy coral bags, 2 dull tan bags, 1 dull silver bag, 1 bright orange bag. +pale chartreuse bags contain 4 shiny crimson bags, 2 clear bronze bags. +light plum bags contain 3 drab bronze bags, 1 bright bronze bag, 1 posh yellow bag. +pale tomato bags contain 1 dim teal bag, 5 drab cyan bags, 3 muted coral bags, 2 dim chartreuse bags. +plaid coral bags contain 1 striped tan bag, 3 vibrant cyan bags, 3 light beige bags, 2 dotted green bags. +bright gray bags contain 4 mirrored teal bags, 4 striped brown bags, 1 dim green bag, 4 clear cyan bags. +drab fuchsia bags contain 2 mirrored salmon bags, 4 posh orange bags, 3 faded crimson bags, 3 pale plum bags. +light tomato bags contain 2 dotted gold bags, 1 dotted bronze bag. +muted violet bags contain 2 light chartreuse bags. +drab tan bags contain 2 light green bags, 5 bright red bags, 4 shiny beige bags. +drab chartreuse bags contain 2 drab salmon bags, 2 dark brown bags, 4 clear turquoise bags. +drab violet bags contain 4 faded red bags. +posh cyan bags contain 4 bright violet bags. +posh orange bags contain 4 pale plum bags, 5 posh aqua bags. +plaid silver bags contain 1 dotted brown bag, 3 drab gold bags, 4 clear yellow bags. +mirrored silver bags contain 3 shiny beige bags, 1 drab silver bag. +faded gray bags contain no other bags. +wavy tomato bags contain 1 bright brown bag, 3 striped red bags, 2 vibrant maroon bags. +posh violet bags contain 2 dim aqua bags. +bright blue bags contain 5 light lime bags, 2 faded violet bags, 3 light aqua bags, 4 vibrant coral bags. +dark teal bags contain 5 muted fuchsia bags. +striped fuchsia bags contain 1 wavy turquoise bag, 5 wavy green bags, 4 posh gold bags. +posh maroon bags contain 2 dull red bags. +shiny purple bags contain 2 clear tan bags. +wavy lime bags contain 2 dark coral bags, 1 shiny gold bag. +wavy silver bags contain 4 dotted white bags. +shiny silver bags contain 2 plaid gold bags, 2 dim green bags, 5 plaid lime bags, 3 dull red bags. +wavy red bags contain 3 vibrant brown bags, 4 bright indigo bags. +dull chartreuse bags contain 4 dotted lime bags, 2 bright silver bags, 3 dull red bags, 4 wavy maroon bags. +vibrant silver bags contain 1 bright fuchsia bag, 3 drab lavender bags, 2 drab olive bags, 3 dotted teal bags. +striped gray bags contain 5 plaid orange bags, 1 wavy coral bag. +striped green bags contain 4 wavy coral bags, 4 shiny gold bags, 3 dark brown bags, 5 vibrant brown bags. +mirrored violet bags contain 3 dim silver bags, 1 posh tomato bag, 1 light salmon bag. +dull purple bags contain 1 light gray bag, 3 wavy yellow bags, 1 wavy salmon bag. +mirrored beige bags contain 4 dark cyan bags, 5 dull green bags. +posh lime bags contain 3 posh chartreuse bags. +vibrant tan bags contain 2 dull plum bags, 1 striped brown bag, 4 vibrant coral bags. +dotted orange bags contain 1 mirrored olive bag, 5 drab silver bags. +clear indigo bags contain 3 light lime bags, 4 dull coral bags. +pale gray bags contain 1 faded black bag, 3 dim green bags, 4 wavy lavender bags, 2 posh brown bags. +posh gold bags contain 5 dark tan bags, 2 dotted olive bags, 5 dark aqua bags. +striped chartreuse bags contain 2 dull magenta bags, 1 posh tomato bag. +mirrored bronze bags contain 2 faded fuchsia bags. +clear salmon bags contain 4 posh bronze bags, 5 clear plum bags, 5 dull blue bags. +posh purple bags contain 5 dim gray bags, 3 faded brown bags. +faded lime bags contain 5 dim turquoise bags, 3 dark indigo bags, 2 vibrant gray bags, 1 muted silver bag. +wavy beige bags contain 1 dark bronze bag, 4 dull plum bags, 4 mirrored silver bags. +clear yellow bags contain 2 vibrant teal bags. +vibrant plum bags contain 4 muted chartreuse bags, 4 posh silver bags. +striped yellow bags contain 2 dull maroon bags, 5 bright red bags, 2 posh chartreuse bags. +dark coral bags contain 3 dull tan bags. +dull magenta bags contain no other bags. +dark gold bags contain 1 dotted indigo bag, 4 shiny teal bags, 4 dotted silver bags. +dim tan bags contain 1 striped lavender bag, 1 shiny tomato bag. +muted maroon bags contain 2 dull salmon bags, 4 dim chartreuse bags, 3 bright aqua bags, 2 faded indigo bags. +vibrant tomato bags contain 2 dark silver bags, 3 plaid purple bags. +dotted lime bags contain 3 shiny crimson bags, 2 pale yellow bags. +muted fuchsia bags contain 1 dull tan bag. +bright tan bags contain 5 pale gold bags, 5 drab teal bags, 2 light blue bags. +dark crimson bags contain 4 shiny orange bags, 3 faded purple bags, 3 bright white bags. +striped tan bags contain 4 dotted turquoise bags, 4 drab lime bags, 5 dim teal bags. +posh fuchsia bags contain 2 dotted olive bags, 2 mirrored beige bags, 3 shiny bronze bags. +pale silver bags contain 4 vibrant lavender bags, 4 clear beige bags, 4 striped gold bags. +posh aqua bags contain 4 drab lime bags, 4 dull tan bags, 5 vibrant tan bags. +plaid salmon bags contain 5 dim coral bags, 2 wavy bronze bags. +mirrored orange bags contain 4 vibrant gray bags. +dim yellow bags contain 5 pale tan bags, 4 dark black bags. +dotted coral bags contain 4 dotted chartreuse bags, 2 bright red bags, 1 vibrant white bag, 1 vibrant brown bag. +muted crimson bags contain 4 striped orange bags, 5 pale yellow bags, 3 posh blue bags, 1 muted red bag. +striped lavender bags contain 3 striped brown bags. +striped maroon bags contain 2 shiny yellow bags. +vibrant blue bags contain 3 faded cyan bags, 1 shiny lime bag, 3 dark tomato bags. +pale lavender bags contain 4 plaid magenta bags, 4 striped blue bags. +dull tan bags contain 4 shiny indigo bags, 2 light purple bags, 4 faded cyan bags. +dotted beige bags contain 3 drab indigo bags. +light indigo bags contain 1 faded cyan bag, 5 bright aqua bags, 1 shiny indigo bag. +vibrant crimson bags contain 4 dotted fuchsia bags. +wavy blue bags contain 4 wavy teal bags, 1 dull blue bag. +vibrant chartreuse bags contain 4 striped orange bags. +vibrant cyan bags contain 5 wavy coral bags. +faded brown bags contain 5 faded turquoise bags. +faded magenta bags contain 1 dull indigo bag, 4 plaid aqua bags, 4 dim crimson bags. +mirrored coral bags contain 4 drab crimson bags, 2 light salmon bags, 2 clear indigo bags. +faded cyan bags contain no other bags. +dark brown bags contain 5 light purple bags. +wavy violet bags contain 3 dull coral bags, 1 bright aqua bag, 3 shiny lavender bags. +posh tomato bags contain 4 vibrant chartreuse bags, 4 mirrored teal bags. +pale crimson bags contain 1 plaid orange bag, 1 dark violet bag, 3 plaid lavender bags. +dark fuchsia bags contain 4 plaid beige bags, 2 plaid chartreuse bags. +plaid magenta bags contain 3 clear lavender bags, 5 mirrored brown bags, 5 shiny bronze bags. +striped blue bags contain 1 dull bronze bag, 1 dotted fuchsia bag, 1 light lavender bag, 1 clear turquoise bag. +dotted olive bags contain 4 dotted turquoise bags, 5 dotted bronze bags, 3 pale yellow bags, 4 pale red bags. +posh silver bags contain 3 pale violet bags, 1 plaid salmon bag, 1 posh coral bag. +dotted chartreuse bags contain 3 bright blue bags. +light coral bags contain 4 shiny fuchsia bags, 2 pale red bags, 1 muted silver bag, 2 bright cyan bags. +pale brown bags contain 5 light aqua bags. +dotted black bags contain 2 plaid purple bags, 1 mirrored aqua bag, 5 posh beige bags. +posh coral bags contain 3 dark aqua bags, 2 pale yellow bags, 5 plaid blue bags, 4 dim aqua bags. +shiny gray bags contain 1 bright gold bag, 1 muted bronze bag, 5 striped green bags, 5 shiny teal bags. +drab orange bags contain 5 plaid salmon bags, 2 vibrant beige bags. +plaid yellow bags contain 4 clear teal bags, 2 bright red bags. +striped violet bags contain 4 mirrored fuchsia bags, 4 vibrant white bags, 3 dim teal bags. +dim aqua bags contain 1 muted fuchsia bag, 1 dull tan bag. +light orange bags contain 2 bright red bags, 4 dark white bags, 1 dim chartreuse bag, 5 faded fuchsia bags. +faded salmon bags contain 5 wavy gray bags. +shiny yellow bags contain 2 vibrant plum bags, 3 dim teal bags, 1 plaid tan bag, 5 posh plum bags. +vibrant beige bags contain 2 wavy lavender bags, 4 posh chartreuse bags, 3 pale teal bags, 5 wavy lime bags. +light fuchsia bags contain 3 clear brown bags, 3 bright lavender bags. +pale magenta bags contain 4 posh silver bags. +dark maroon bags contain 3 drab turquoise bags. +faded beige bags contain 1 vibrant white bag, 4 drab red bags, 1 drab lavender bag. +bright bronze bags contain 1 pale bronze bag, 3 muted silver bags, 2 striped coral bags, 3 clear gray bags. +light silver bags contain 3 dotted lavender bags, 2 wavy lavender bags. +muted salmon bags contain 2 drab tan bags, 5 wavy tomato bags. +bright black bags contain 5 plaid tan bags. +dim chartreuse bags contain 5 muted gold bags, 5 bright blue bags, 5 faded cyan bags. +shiny white bags contain 4 bright tan bags. +bright red bags contain 3 dull silver bags. +dark aqua bags contain 2 dull red bags. +drab plum bags contain 4 muted brown bags, 5 muted plum bags. +muted yellow bags contain 5 light purple bags, 3 dotted silver bags, 3 faded turquoise bags. +light violet bags contain 1 pale red bag, 4 dim silver bags, 2 mirrored bronze bags. +pale lime bags contain 4 bright lavender bags. +pale tan bags contain 4 striped green bags, 2 dotted chartreuse bags. +dim green bags contain 1 light lime bag, 1 shiny beige bag. +mirrored gold bags contain 4 mirrored white bags. +dim silver bags contain 5 pale coral bags, 3 wavy coral bags. +dull aqua bags contain 3 posh indigo bags, 5 dotted coral bags, 1 dark salmon bag, 3 striped crimson bags. +posh yellow bags contain 1 dark bronze bag, 2 mirrored white bags, 2 light crimson bags. +mirrored magenta bags contain 1 bright violet bag, 2 drab lavender bags, 3 pale violet bags, 2 plaid salmon bags. +shiny chartreuse bags contain 2 dotted purple bags, 5 wavy red bags, 3 plaid beige bags. +light black bags contain 1 dark chartreuse bag, 3 faded tomato bags. +clear plum bags contain 5 vibrant brown bags, 3 dim coral bags, 4 mirrored brown bags, 1 faded black bag. +pale violet bags contain 2 dull tan bags. +bright fuchsia bags contain 4 dull orange bags. +dotted teal bags contain 5 bright red bags, 3 wavy red bags, 1 dull coral bag, 3 clear plum bags. +dotted blue bags contain 2 wavy beige bags, 3 muted purple bags. +muted gray bags contain 3 faded aqua bags, 1 shiny olive bag, 5 clear salmon bags, 1 vibrant violet bag. +dull beige bags contain 1 wavy lavender bag, 4 dark bronze bags, 5 dull tan bags. +drab turquoise bags contain 3 posh gray bags, 5 drab red bags. +vibrant yellow bags contain 2 shiny aqua bags, 4 light chartreuse bags. +posh brown bags contain 3 bright green bags, 5 posh lavender bags. +faded gold bags contain 4 vibrant maroon bags, 4 dotted purple bags. +dotted turquoise bags contain 5 clear plum bags, 3 muted gold bags, 4 dark violet bags. +dotted tan bags contain 5 dim aqua bags, 4 striped violet bags. +posh crimson bags contain 4 striped blue bags, 5 dull magenta bags, 2 bright coral bags. +muted white bags contain 5 dull olive bags. +vibrant teal bags contain 5 dotted turquoise bags, 1 striped tan bag, 1 drab tan bag. +dotted yellow bags contain 3 plaid turquoise bags, 2 posh yellow bags, 4 striped blue bags, 5 posh black bags. +posh magenta bags contain 5 mirrored black bags. +dotted green bags contain 4 dim crimson bags, 1 shiny lavender bag, 4 bright salmon bags, 1 plaid gray bag. +bright green bags contain 3 bright aqua bags, 3 dull maroon bags, 4 dark brown bags. +dark gray bags contain 5 muted purple bags, 2 striped blue bags, 4 faded lavender bags. +bright crimson bags contain 2 striped olive bags, 3 muted blue bags. +muted cyan bags contain 3 shiny tomato bags. +light yellow bags contain 2 striped red bags, 4 shiny crimson bags. +pale aqua bags contain 5 shiny yellow bags, 3 dark lavender bags, 3 posh white bags. +clear red bags contain 1 dotted silver bag, 1 dull teal bag, 1 faded maroon bag, 1 dotted salmon bag. +pale red bags contain 2 faded gray bags. +dotted maroon bags contain 5 posh aqua bags, 3 dull silver bags. +dull blue bags contain 4 light crimson bags, 3 light lime bags, 1 dark orange bag, 5 light indigo bags. +posh turquoise bags contain 1 muted gold bag, 5 striped lavender bags, 3 dull salmon bags, 5 vibrant chartreuse bags. +striped magenta bags contain 1 posh silver bag, 5 dark brown bags. +pale blue bags contain 2 muted gold bags, 4 vibrant brown bags, 1 light lavender bag. +vibrant violet bags contain 5 bright red bags. +faded fuchsia bags contain 2 light lime bags, 4 bright lime bags, 3 pale violet bags. +shiny coral bags contain 1 clear plum bag, 5 muted chartreuse bags, 1 muted violet bag, 5 striped yellow bags. +pale olive bags contain 4 plaid lime bags, 1 posh salmon bag. +wavy tan bags contain 3 faded gray bags. +faded chartreuse bags contain 3 dim coral bags, 1 mirrored bronze bag, 3 posh bronze bags. +mirrored brown bags contain 1 faded violet bag, 4 dull maroon bags, 5 dotted magenta bags. +clear white bags contain 5 muted magenta bags, 4 dull magenta bags, 3 pale plum bags, 4 drab indigo bags. +drab maroon bags contain 2 clear beige bags, 3 wavy beige bags, 5 faded purple bags. +striped silver bags contain 3 drab tomato bags. +faded plum bags contain 1 clear teal bag, 3 bright aqua bags. +plaid violet bags contain 2 drab violet bags, 4 muted turquoise bags, 5 muted indigo bags. +clear black bags contain 5 muted fuchsia bags, 1 muted coral bag, 2 light black bags. +vibrant maroon bags contain 1 dark lavender bag, 1 pale crimson bag, 4 bright indigo bags, 5 mirrored maroon bags. +drab indigo bags contain 2 dim coral bags, 1 drab green bag, 2 shiny lavender bags. +drab olive bags contain 2 dark aqua bags, 4 striped brown bags. +dull crimson bags contain 3 dull cyan bags. +wavy teal bags contain 4 striped orange bags, 2 drab cyan bags. +dark red bags contain 2 dull maroon bags, 4 muted plum bags, 4 dull plum bags. +striped salmon bags contain 3 bright red bags, 1 light aqua bag, 4 wavy gold bags. +mirrored tan bags contain 5 dotted olive bags, 2 dim tomato bags, 2 mirrored tomato bags, 4 clear teal bags. +striped white bags contain 2 pale coral bags, 2 shiny green bags. +shiny tomato bags contain 5 pale coral bags, 5 dull beige bags. +vibrant indigo bags contain 2 dim black bags, 4 dim blue bags, 3 dim white bags. +wavy lavender bags contain 4 faded bronze bags, 4 muted red bags, 3 light lime bags, 4 muted gold bags. +shiny turquoise bags contain 2 dull red bags, 5 faded gray bags, 1 muted turquoise bag. +shiny lavender bags contain 5 bright aqua bags. +posh tan bags contain 1 shiny yellow bag, 3 drab magenta bags. +light green bags contain 4 bright red bags, 1 vibrant coral bag. +drab black bags contain 5 faded tomato bags, 3 dotted chartreuse bags. +clear chartreuse bags contain 3 wavy bronze bags, 4 plaid purple bags, 3 dark orange bags. +dull black bags contain 1 wavy teal bag, 3 light lavender bags, 2 striped indigo bags. +wavy black bags contain 2 clear orange bags, 4 muted purple bags. +pale plum bags contain 1 bright coral bag, 1 drab tan bag, 1 plaid fuchsia bag, 1 dotted fuchsia bag. +dotted violet bags contain 3 bright black bags. +posh red bags contain 3 bright black bags. +plaid lime bags contain 5 posh beige bags, 1 dotted turquoise bag. +wavy aqua bags contain 1 dark yellow bag, 3 drab indigo bags. +dim magenta bags contain 3 dark violet bags. +drab aqua bags contain 5 posh orange bags, 1 dark silver bag, 4 plaid purple bags, 2 wavy teal bags. +dull brown bags contain 4 light lime bags. +striped orange bags contain 5 light crimson bags, 3 muted tan bags, 5 dotted coral bags, 3 plaid blue bags. +muted brown bags contain 1 posh blue bag, 4 dotted magenta bags, 3 dull coral bags. +faded blue bags contain 5 striped black bags, 1 vibrant yellow bag. +plaid indigo bags contain 3 dark brown bags, 5 light purple bags, 4 light aqua bags, 3 light green bags. +plaid turquoise bags contain 5 dotted teal bags. +light turquoise bags contain 2 dull salmon bags, 5 dotted tan bags. +dim purple bags contain 4 muted white bags, 5 drab purple bags. +pale coral bags contain 5 posh gray bags. +clear lime bags contain 3 dim magenta bags, 3 plaid tomato bags, 1 drab magenta bag, 3 shiny purple bags. +dim black bags contain 3 clear gold bags, 4 muted violet bags. +light maroon bags contain 4 muted yellow bags, 1 pale cyan bag, 2 mirrored turquoise bags, 4 dull lavender bags. +clear magenta bags contain 2 shiny magenta bags, 2 muted chartreuse bags. +striped bronze bags contain 5 clear tan bags, 1 drab lavender bag, 2 pale crimson bags. +dark salmon bags contain 1 vibrant plum bag, 5 drab tan bags, 4 drab coral bags, 4 dull tan bags. +vibrant salmon bags contain 2 muted olive bags. +dim gold bags contain 2 dim olive bags, 5 plaid olive bags, 2 posh orange bags. +wavy chartreuse bags contain 4 shiny yellow bags, 4 vibrant blue bags. +vibrant brown bags contain 3 striped brown bags, 4 muted red bags, 2 shiny indigo bags. +plaid maroon bags contain 2 muted teal bags, 2 pale yellow bags, 2 bright beige bags, 5 striped yellow bags. +dim indigo bags contain 4 dull tomato bags, 4 clear cyan bags, 2 shiny salmon bags, 1 bright aqua bag. +muted red bags contain 3 dull tan bags, 4 dull magenta bags, 1 bright aqua bag. +posh beige bags contain 5 shiny black bags, 3 dotted magenta bags, 3 drab blue bags, 2 muted coral bags. +pale fuchsia bags contain 3 dark brown bags, 5 posh gold bags. +dark bronze bags contain 1 dim green bag, 5 posh chartreuse bags. +dim coral bags contain 3 dull coral bags, 3 striped brown bags. +drab crimson bags contain 2 dark bronze bags, 4 shiny indigo bags, 3 dull tan bags. +bright indigo bags contain 3 bright blue bags. +pale yellow bags contain 5 dim aqua bags, 1 vibrant brown bag, 2 vibrant tan bags, 3 wavy lavender bags. +drab salmon bags contain 1 dotted indigo bag, 3 muted chartreuse bags, 5 dark olive bags. +muted orange bags contain 4 faded lime bags, 2 dull coral bags, 5 vibrant magenta bags, 4 dull magenta bags. +striped gold bags contain 2 dull silver bags, 5 bright lavender bags, 5 dim teal bags, 5 dark coral bags. +posh chartreuse bags contain 3 dim teal bags, 5 light aqua bags. +shiny blue bags contain 3 dull tan bags, 5 muted magenta bags. +muted silver bags contain 3 wavy blue bags, 2 dim teal bags, 5 muted bronze bags. +shiny bronze bags contain 1 light green bag, 4 vibrant magenta bags. +wavy coral bags contain no other bags. +shiny orange bags contain 2 muted purple bags. +posh teal bags contain 4 clear plum bags. +striped turquoise bags contain 3 muted indigo bags. +dim bronze bags contain 2 shiny silver bags, 1 light silver bag, 2 dim indigo bags, 4 dim tomato bags. +plaid white bags contain 4 drab turquoise bags. +wavy indigo bags contain 3 clear gold bags, 5 mirrored bronze bags. +faded teal bags contain 4 mirrored white bags. +shiny fuchsia bags contain 3 drab indigo bags. +dim red bags contain 3 clear bronze bags. +dotted brown bags contain 4 wavy maroon bags, 5 drab green bags, 3 dark purple bags. +dark tomato bags contain 3 vibrant coral bags, 5 dull coral bags, 2 drab cyan bags, 1 posh blue bag. +clear teal bags contain 3 dark white bags. +dark silver bags contain 3 dark cyan bags, 4 plaid salmon bags. +wavy fuchsia bags contain 4 bright brown bags, 4 bright aqua bags, 5 light orange bags. +light bronze bags contain 4 clear plum bags. +striped purple bags contain 1 dim indigo bag. +clear tomato bags contain 4 mirrored tomato bags, 3 muted indigo bags, 1 striped tan bag. +muted turquoise bags contain 5 faded beige bags, 4 clear crimson bags, 2 bright teal bags. +dull cyan bags contain 5 mirrored aqua bags, 2 shiny aqua bags, 3 light black bags, 4 bright coral bags. +plaid crimson bags contain 2 mirrored teal bags, 2 dull fuchsia bags. +shiny maroon bags contain 1 posh gold bag. +dim white bags contain 5 striped brown bags, 2 dull magenta bags, 5 plaid tan bags. +muted green bags contain 2 dull magenta bags, 5 clear cyan bags. +plaid teal bags contain 2 dark tan bags, 3 pale lime bags. +dotted lavender bags contain 2 posh aqua bags, 3 dull cyan bags. +light salmon bags contain 5 dark silver bags. +faded white bags contain 2 wavy maroon bags, 3 dull cyan bags. +dull tomato bags contain 2 dim aqua bags, 4 posh lavender bags, 1 faded red bag. +dark olive bags contain 5 clear bronze bags, 2 drab plum bags. +pale indigo bags contain 2 mirrored beige bags, 5 wavy turquoise bags, 4 striped green bags, 2 dotted lavender bags. +plaid purple bags contain 1 light lime bag. +clear purple bags contain 3 vibrant white bags. +dark yellow bags contain 2 pale olive bags, 4 pale cyan bags, 5 bright teal bags. +muted beige bags contain 2 posh lime bags, 5 shiny gray bags, 2 dull blue bags. +vibrant orange bags contain 5 posh crimson bags, 4 light chartreuse bags. +light magenta bags contain 2 plaid maroon bags, 1 posh beige bag, 5 pale salmon bags. +dotted crimson bags contain 5 dark chartreuse bags. +striped coral bags contain 2 dim aqua bags. +striped aqua bags contain 3 posh salmon bags, 3 dull red bags. +mirrored salmon bags contain 5 bright red bags, 2 light green bags, 3 clear black bags, 5 posh brown bags. +posh white bags contain 4 drab violet bags, 2 dotted silver bags. +posh blue bags contain 4 dull maroon bags, 3 vibrant coral bags. +dim orange bags contain 2 dull olive bags. +shiny teal bags contain 1 faded tomato bag, 4 muted violet bags. +mirrored maroon bags contain 3 dull blue bags. +dark lavender bags contain 1 drab red bag, 3 shiny indigo bags, 4 faded beige bags, 1 drab turquoise bag. +shiny olive bags contain 3 dark violet bags, 1 striped gold bag, 2 mirrored lime bags. +bright violet bags contain 2 wavy bronze bags, 3 drab olive bags, 5 mirrored olive bags, 2 wavy lavender bags. +clear olive bags contain 5 faded turquoise bags. +mirrored lavender bags contain 1 light white bag, 4 light purple bags, 3 wavy lavender bags, 2 shiny lime bags. +pale turquoise bags contain 4 dark tan bags. +shiny salmon bags contain 1 shiny gold bag, 5 drab turquoise bags. +vibrant gray bags contain 3 posh brown bags. +dark indigo bags contain 1 mirrored black bag, 5 dull beige bags, 4 shiny beige bags, 3 drab lavender bags. +light teal bags contain 5 dark olive bags, 5 vibrant chartreuse bags, 3 plaid salmon bags, 5 light yellow bags. +clear violet bags contain 3 light crimson bags. +clear tan bags contain 3 striped orange bags, 4 wavy lavender bags, 3 striped silver bags. +clear bronze bags contain 2 plaid beige bags. +clear gray bags contain 4 dotted cyan bags, 4 vibrant plum bags. +drab cyan bags contain 1 light aqua bag, 1 drab teal bag, 3 bright orange bags, 3 dark white bags. +plaid beige bags contain 3 dull green bags. +wavy gold bags contain 4 shiny olive bags, 3 bright tan bags. +clear aqua bags contain 3 posh chartreuse bags, 4 drab silver bags, 5 clear gray bags. +bright chartreuse bags contain 2 light violet bags, 3 vibrant gray bags. +plaid black bags contain 2 posh gray bags. +light beige bags contain 4 dotted olive bags, 5 dull olive bags, 1 faded orange bag. +mirrored teal bags contain 4 mirrored aqua bags. +bright magenta bags contain 1 mirrored magenta bag, 3 bright blue bags, 1 vibrant blue bag, 2 drab gold bags. +dim maroon bags contain 4 light bronze bags, 5 clear violet bags. +light lime bags contain 4 plaid indigo bags. +posh lavender bags contain 4 dark brown bags. +clear beige bags contain 4 posh silver bags, 3 dull coral bags, 2 posh gray bags. +drab bronze bags contain 4 plaid maroon bags. +mirrored purple bags contain 3 dim magenta bags. +dark magenta bags contain 4 faded maroon bags, 1 drab crimson bag, 5 dotted brown bags, 2 bright teal bags. +dim brown bags contain 3 muted olive bags, 5 drab green bags, 1 mirrored olive bag. +dark plum bags contain 2 vibrant tan bags. +bright turquoise bags contain 1 mirrored aqua bag, 3 clear plum bags. +muted black bags contain 5 faded cyan bags, 5 pale tan bags, 2 dotted chartreuse bags. +dotted gray bags contain 3 posh plum bags. +vibrant black bags contain 2 vibrant magenta bags, 5 faded cyan bags. +mirrored cyan bags contain 2 clear cyan bags, 4 light aqua bags, 5 drab blue bags, 1 drab gold bag. +wavy purple bags contain 5 striped magenta bags, 3 clear maroon bags, 1 mirrored green bag, 1 pale black bag. +drab blue bags contain 3 mirrored lime bags, 1 mirrored blue bag. +clear maroon bags contain 5 bright orange bags. +shiny cyan bags contain 2 clear gray bags, 5 pale crimson bags. +pale cyan bags contain 2 wavy turquoise bags, 5 wavy salmon bags. +plaid gold bags contain 1 clear lavender bag, 1 bright beige bag. +mirrored lime bags contain 2 dull tan bags, 3 shiny beige bags. +drab green bags contain 1 vibrant yellow bag. +dull red bags contain 5 plaid blue bags, 5 clear brown bags, 3 pale salmon bags, 2 dark orange bags. +bright beige bags contain 4 dull silver bags, 5 vibrant brown bags, 4 drab red bags, 2 pale violet bags. +clear silver bags contain 4 drab indigo bags, 2 clear salmon bags. +posh bronze bags contain 5 bright indigo bags, 5 dotted purple bags, 1 dark violet bag, 2 dark orange bags. +posh salmon bags contain 5 bright red bags, 3 striped green bags, 3 dark brown bags. +clear cyan bags contain 5 dark chartreuse bags, 1 bright indigo bag, 4 pale yellow bags, 2 vibrant coral bags. +mirrored blue bags contain 2 vibrant white bags. +mirrored yellow bags contain 5 dotted gray bags, 4 dull maroon bags, 2 striped violet bags, 5 clear tomato bags. +striped teal bags contain 2 clear black bags, 3 pale coral bags. +faded orange bags contain 2 dark bronze bags. +mirrored indigo bags contain 3 light tomato bags, 2 shiny crimson bags. +pale green bags contain 4 light chartreuse bags. +plaid cyan bags contain 4 plaid fuchsia bags, 2 shiny teal bags, 3 dotted fuchsia bags, 3 dim red bags. +muted gold bags contain 2 dull tan bags, 1 faded bronze bag, 4 dull maroon bags. +wavy green bags contain 5 pale coral bags, 1 dull blue bag, 4 drab blue bags, 1 striped tan bag. +light chartreuse bags contain 4 striped brown bags, 5 plaid purple bags, 4 drab cyan bags, 3 dull plum bags. +dotted cyan bags contain 4 shiny black bags. +light purple bags contain no other bags. +dotted aqua bags contain 4 light gray bags, 2 light purple bags, 5 mirrored lime bags. +drab gold bags contain 2 bright green bags, 5 bright indigo bags. +posh gray bags contain 5 bright orange bags, 5 bright blue bags. +striped red bags contain 4 drab green bags, 1 clear cyan bag. +dotted bronze bags contain 5 light orange bags. +muted plum bags contain 2 bright black bags, 3 dotted tomato bags, 2 vibrant brown bags. +mirrored black bags contain 3 plaid chartreuse bags, 2 shiny indigo bags, 2 shiny beige bags. +drab lavender bags contain 5 drab cyan bags, 1 muted purple bag, 1 wavy red bag, 3 drab crimson bags. +vibrant turquoise bags contain 3 shiny beige bags, 3 striped brown bags, 5 dim teal bags. +muted tan bags contain 1 plaid purple bag, 3 shiny beige bags, 1 drab gold bag. +pale beige bags contain 5 bright silver bags. +wavy olive bags contain 4 dotted turquoise bags, 4 dull silver bags, 1 bright gold bag. +dim olive bags contain 5 light lavender bags, 4 shiny tomato bags, 4 clear cyan bags. +wavy salmon bags contain 4 bright aqua bags. +dotted gold bags contain 3 shiny red bags, 3 dull fuchsia bags. +shiny violet bags contain 3 dotted tomato bags, 1 drab coral bag. +striped plum bags contain 4 drab beige bags, 3 clear tan bags, 5 light aqua bags, 1 shiny fuchsia bag. +clear lavender bags contain 2 bright aqua bags, 3 dull silver bags, 3 bright green bags, 2 bright orange bags. +faded maroon bags contain 5 dark indigo bags, 1 posh fuchsia bag. +vibrant red bags contain 4 striped fuchsia bags, 3 drab orange bags, 1 clear brown bag, 1 plaid turquoise bag. +dull coral bags contain 2 dim teal bags, 3 faded bronze bags. +pale salmon bags contain 3 dull magenta bags, 1 light crimson bag. +dotted magenta bags contain 4 dull maroon bags, 2 bright lime bags, 4 plaid indigo bags, 4 faded cyan bags. +wavy gray bags contain 4 muted gray bags, 3 shiny magenta bags, 1 posh teal bag. +light red bags contain 4 shiny chartreuse bags. +dim blue bags contain 4 vibrant orange bags. +muted bronze bags contain 5 mirrored aqua bags, 4 dim green bags. +drab lime bags contain 1 drab cyan bag, 3 pale crimson bags, 4 bright green bags, 3 drab lavender bags. +light white bags contain 5 bright green bags. +bright teal bags contain 4 shiny brown bags, 4 dark silver bags. +striped beige bags contain 2 shiny magenta bags. +wavy magenta bags contain 5 pale bronze bags, 5 pale plum bags, 3 muted silver bags. +dark orange bags contain 1 drab tomato bag, 3 striped brown bags, 1 dim teal bag, 5 bright beige bags. +striped indigo bags contain 1 vibrant gold bag, 1 shiny green bag. +clear coral bags contain 2 shiny gray bags. +faded yellow bags contain 4 faded gold bags, 2 bright turquoise bags, 5 dark silver bags, 3 wavy coral bags. +dim plum bags contain 1 clear purple bag, 4 light brown bags. +mirrored turquoise bags contain 5 wavy indigo bags, 3 dark fuchsia bags, 5 plaid white bags, 2 dim turquoise bags. +posh black bags contain 2 striped black bags, 5 dim teal bags, 3 bright silver bags, 5 posh beige bags. +dotted fuchsia bags contain 1 faded turquoise bag, 2 shiny lavender bags, 4 posh salmon bags, 1 clear olive bag. +faded lavender bags contain 2 striped yellow bags, 1 posh lavender bag. +dim lime bags contain 2 wavy gray bags, 5 clear gray bags. +vibrant bronze bags contain 3 drab tomato bags, 5 bright tan bags. +dull plum bags contain 5 bright red bags, 4 dull magenta bags. +dim teal bags contain 4 light purple bags, 4 plaid lavender bags, 1 dull magenta bag. +dull yellow bags contain 4 vibrant orange bags, 1 dark tomato bag, 5 pale tan bags. +dull green bags contain 2 bright blue bags, 5 dull red bags. +light crimson bags contain 5 dull maroon bags, 4 muted gold bags. +dark black bags contain 1 dim silver bag, 3 plaid magenta bags. +bright lavender bags contain 4 muted fuchsia bags. +drab coral bags contain 4 shiny chartreuse bags, 3 posh yellow bags, 3 wavy indigo bags. +mirrored crimson bags contain 3 posh maroon bags, 5 striped olive bags, 3 mirrored magenta bags. +muted coral bags contain 3 wavy violet bags, 1 dotted chartreuse bag, 1 shiny beige bag. +vibrant gold bags contain 2 dull orange bags, 1 clear chartreuse bag. +wavy orange bags contain 5 dark bronze bags. +mirrored white bags contain 5 clear gold bags, 3 drab tomato bags, 4 dotted bronze bags, 3 striped orange bags. +clear gold bags contain 3 drab indigo bags, 4 wavy violet bags, 2 shiny salmon bags, 4 light brown bags. +shiny magenta bags contain 5 drab silver bags, 2 muted gold bags. +dim violet bags contain 1 posh lime bag, 4 shiny orange bags, 2 posh chartreuse bags. +striped olive bags contain 4 plaid indigo bags, 5 dim chartreuse bags, 4 clear lavender bags. +plaid gray bags contain 3 shiny gold bags, 2 dull coral bags. +clear crimson bags contain 4 shiny aqua bags, 3 light crimson bags, 5 dim chartreuse bags. +drab silver bags contain 1 dim teal bag, 3 faded cyan bags, 1 shiny indigo bag. +mirrored green bags contain 5 dotted lime bags, 4 pale cyan bags. +bright aqua bags contain no other bags. +bright plum bags contain 4 dim aqua bags, 2 dull crimson bags, 1 wavy maroon bag. +vibrant lavender bags contain 1 plaid tan bag, 3 vibrant brown bags, 3 drab gold bags, 4 faded red bags. +pale white bags contain 3 bright brown bags, 4 mirrored beige bags. +plaid lavender bags contain 1 dull magenta bag, 2 dull silver bags, 1 shiny indigo bag. +bright salmon bags contain 1 striped coral bag, 4 plaid lavender bags, 1 muted red bag, 1 drab red bag. +plaid olive bags contain 5 faded turquoise bags, 4 dim green bags, 2 striped beige bags. +wavy plum bags contain 1 clear lavender bag, 2 faded brown bags. +clear fuchsia bags contain 1 muted bronze bag. +wavy turquoise bags contain 5 shiny lime bags, 1 drab olive bag, 4 dim white bags, 1 dotted gray bag. +vibrant aqua bags contain 2 faded lavender bags. +dotted white bags contain 3 muted crimson bags, 5 mirrored white bags, 1 mirrored fuchsia bag. +bright purple bags contain 2 dotted chartreuse bags, 4 posh cyan bags, 3 bright plum bags. +light aqua bags contain 1 plaid lavender bag, 3 wavy coral bags, 5 shiny indigo bags. +drab yellow bags contain 4 shiny teal bags, 2 dotted green bags, 5 vibrant silver bags, 3 dotted turquoise bags. +mirrored olive bags contain 1 dull plum bag. +light olive bags contain 1 shiny coral bag, 4 drab white bags, 3 dim turquoise bags, 4 dull gold bags. +shiny indigo bags contain no other bags. +dull gold bags contain 3 dark indigo bags. +bright tomato bags contain 5 muted blue bags. +faded purple bags contain 4 bright orange bags, 2 faded violet bags. +drab magenta bags contain 3 wavy lavender bags, 2 drab cyan bags, 2 clear beige bags, 4 bright indigo bags. +striped lime bags contain 4 light tan bags. +light gold bags contain 2 pale plum bags. +striped black bags contain 1 plaid salmon bag, 2 plaid beige bags, 4 dotted teal bags, 2 posh chartreuse bags. +faded tomato bags contain 2 striped yellow bags, 4 muted red bags. +dull fuchsia bags contain 5 dotted olive bags, 2 muted purple bags. +pale purple bags contain 4 posh silver bags, 4 wavy yellow bags. +bright olive bags contain 5 shiny fuchsia bags, 5 dull crimson bags, 5 drab red bags, 5 posh turquoise bags. +vibrant fuchsia bags contain 1 vibrant beige bag, 5 shiny magenta bags. +faded turquoise bags contain 5 light lime bags, 4 dark white bags. +plaid orange bags contain 5 vibrant coral bags, 4 light crimson bags, 4 plaid chartreuse bags, 1 dull green bag. +posh indigo bags contain 3 wavy green bags, 2 shiny orange bags, 5 faded violet bags, 2 dotted coral bags. +mirrored red bags contain 4 mirrored olive bags, 1 dark silver bag, 1 dull red bag. +dim salmon bags contain 1 striped salmon bag, 5 faded gray bags. +dim cyan bags contain 3 wavy olive bags, 5 drab purple bags, 3 mirrored bronze bags. +light blue bags contain 2 striped bronze bags, 4 dull white bags, 1 posh bronze bag. +dull turquoise bags contain 4 striped red bags, 1 light lavender bag, 5 plaid bronze bags, 1 mirrored brown bag. +vibrant coral bags contain 1 bright orange bag. +striped cyan bags contain 2 dark white bags, 4 drab red bags, 2 plaid salmon bags. +muted tomato bags contain 4 drab red bags, 3 vibrant silver bags, 4 clear fuchsia bags, 3 wavy white bags. +dotted red bags contain 1 light blue bag. +dark beige bags contain 2 posh lime bags, 3 striped black bags. +dark cyan bags contain 1 dim chartreuse bag, 2 shiny beige bags, 4 dotted magenta bags, 4 light chartreuse bags. +dull lime bags contain 3 muted chartreuse bags. +light brown bags contain 3 mirrored brown bags. +vibrant magenta bags contain 1 dim green bag. +shiny brown bags contain 5 bright brown bags, 3 faded cyan bags, 5 clear tan bags, 2 plaid maroon bags. +drab purple bags contain 1 shiny indigo bag, 4 striped yellow bags. From 6c160a535015f45aefc00d738ed909709153b2ff Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 7 Dec 2020 07:09:03 +0100 Subject: [PATCH 090/479] 2020: d07: ex1: add solution --- 2020/d07/ex1/ex1.py | 77 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100755 2020/d07/ex1/ex1.py diff --git a/2020/d07/ex1/ex1.py b/2020/d07/ex1/ex1.py new file mode 100755 index 0000000..d92977c --- /dev/null +++ b/2020/d07/ex1/ex1.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python + +import re +import sys +from collections import defaultdict +from copy import deepcopy +from dataclasses import dataclass +from typing import Dict, List, Set, Tuple + + +@dataclass(eq=True, frozen=True) # Hashable +class ColorInfo: + num: int + color: str + + +Graph = Dict[str, Set[ColorInfo]] + + +def extract_info(line: str) -> Tuple[str, Set[ColorInfo]]: + color_pattern = re.compile("(.*) contain ") + match = color_pattern.search(line) + assert match is not None + color = match.group(1).replace("bags", "bag") + + line = line[match.end() : -1] # Remove period at end of line + + if line == "no other bags": + return color, set() + + colors: Set[ColorInfo] = set() + pattern = re.compile("([0-9]+) (.*)") + for col in line.split(", "): + match = pattern.search(col) + assert match is not None + colors |= { + ColorInfo(int(match.group(1)), match.group(2).replace("bags", "bag")) + } + + return color, colors + + +def to_graph(raw: List[str]) -> Graph: + return {color: inside for color, inside in map(extract_info, raw)} + + +def reverse(graph: Graph) -> Graph: + reverse: Graph = defaultdict(set) + + for color, contained in graph.items(): + for col in contained: + reverse[col.color] |= {ColorInfo(-1, color)} + + return reverse + + +def containing(graph: Graph, col: str) -> Set[ColorInfo]: + res = deepcopy(graph[col]) + for contains in graph[col]: + res |= containing(graph, contains.color) + return res + + +def solve(raw: List[str]) -> int: + graph = to_graph(raw) + reverse_graph = reverse(graph) + + return len(containing(reverse_graph, "shiny gold bag")) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From d6d7c4cd0cf03f869eba4951ac24e165b0dbc0d4 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 7 Dec 2020 07:09:18 +0100 Subject: [PATCH 091/479] 2020: d07: ex2: add input --- 2020/d07/ex2/input | 594 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 594 insertions(+) create mode 100644 2020/d07/ex2/input diff --git a/2020/d07/ex2/input b/2020/d07/ex2/input new file mode 100644 index 0000000..ccf5d2e --- /dev/null +++ b/2020/d07/ex2/input @@ -0,0 +1,594 @@ +shiny aqua bags contain 1 dark white bag. +muted blue bags contain 1 vibrant lavender bag, 4 dotted silver bags, 2 dim indigo bags. +drab gray bags contain 5 mirrored white bags, 1 light green bag, 5 shiny lavender bags, 5 faded aqua bags. +muted indigo bags contain 4 muted chartreuse bags, 2 dotted teal bags. +drab white bags contain 2 dull fuchsia bags, 1 vibrant bronze bag. +dim lavender bags contain 4 muted tan bags. +dotted tomato bags contain 1 mirrored lime bag, 2 vibrant white bags. +clear orange bags contain 5 clear violet bags, 2 dull beige bags, 2 dark chartreuse bags. +bright lime bags contain no other bags. +striped brown bags contain 3 bright orange bags. +vibrant green bags contain 3 shiny fuchsia bags. +plaid tomato bags contain 3 faded chartreuse bags, 2 wavy salmon bags, 1 faded white bag, 3 mirrored maroon bags. +drab beige bags contain 2 shiny bronze bags, 4 pale violet bags, 3 bright tomato bags, 4 pale red bags. +posh green bags contain 2 dull lavender bags, 4 clear plum bags, 2 dark gray bags. +dull maroon bags contain 3 dull magenta bags, 1 dull tan bag, 1 faded cyan bag, 5 dull silver bags. +faded crimson bags contain 2 muted purple bags, 4 dotted olive bags, 5 drab silver bags. +wavy bronze bags contain 3 dark orange bags, 2 dark brown bags, 5 bright silver bags. +dark turquoise bags contain 5 dull plum bags. +dull lavender bags contain 4 dotted maroon bags, 3 muted brown bags, 4 drab black bags, 4 dull cyan bags. +dotted plum bags contain 1 shiny bronze bag, 3 clear brown bags, 3 muted indigo bags. +dull white bags contain 3 clear tan bags, 5 shiny gold bags, 2 drab crimson bags. +dull teal bags contain 2 bright tomato bags. +shiny crimson bags contain 3 light green bags, 5 striped brown bags, 3 faded fuchsia bags. +wavy brown bags contain 1 drab crimson bag, 2 wavy indigo bags. +dark tan bags contain 2 faded gray bags, 4 shiny salmon bags. +shiny red bags contain 4 dull chartreuse bags, 5 pale tomato bags. +bright orange bags contain no other bags. +wavy yellow bags contain 5 light indigo bags, 5 dark gray bags, 5 plaid indigo bags, 4 faded red bags. +faded bronze bags contain 4 faded cyan bags, 5 shiny beige bags, 5 muted red bags. +dull bronze bags contain 1 mirrored beige bag, 5 muted violet bags, 1 wavy lime bag. +dark lime bags contain 2 drab maroon bags, 5 bright indigo bags, 4 shiny black bags, 5 dotted turquoise bags. +drab red bags contain 5 bright red bags, 2 vibrant brown bags. +dotted salmon bags contain 3 vibrant turquoise bags, 2 dull beige bags, 3 light turquoise bags. +dull gray bags contain 3 striped green bags, 3 wavy coral bags, 1 dark gray bag, 2 light indigo bags. +faded black bags contain 4 muted fuchsia bags, 4 wavy coral bags, 1 drab tomato bag. +muted magenta bags contain 2 posh chartreuse bags, 4 pale violet bags. +light tan bags contain 2 posh turquoise bags, 3 vibrant white bags, 1 light black bag. +dark blue bags contain 3 plaid indigo bags, 2 posh black bags. +dull indigo bags contain 4 light gray bags, 3 dotted tan bags, 4 dull coral bags. +dim fuchsia bags contain 3 vibrant yellow bags, 3 mirrored cyan bags, 4 mirrored brown bags. +shiny beige bags contain 2 dull silver bags, 3 bright lime bags, 5 dull magenta bags. +light cyan bags contain 3 vibrant violet bags, 2 mirrored tomato bags, 2 vibrant coral bags, 4 mirrored silver bags. +clear turquoise bags contain 4 drab tomato bags, 3 shiny gold bags, 4 drab gold bags. +pale teal bags contain 2 wavy maroon bags, 2 dotted olive bags, 4 shiny white bags, 2 drab turquoise bags. +dark purple bags contain 1 wavy indigo bag, 3 bright black bags, 3 dotted teal bags. +bright white bags contain 5 wavy red bags, 2 mirrored cyan bags, 3 drab green bags. +mirrored aqua bags contain 1 faded violet bag, 5 dotted purple bags. +shiny lime bags contain 4 dark aqua bags. +pale bronze bags contain 1 clear crimson bag. +vibrant white bags contain 5 plaid lavender bags, 1 drab red bag, 4 vibrant brown bags. +plaid tan bags contain 5 dim crimson bags. +posh olive bags contain 3 bright red bags. +plaid brown bags contain 5 vibrant turquoise bags. +mirrored tomato bags contain 2 dotted chartreuse bags, 3 light aqua bags, 3 posh beige bags. +plaid blue bags contain 5 striped green bags, 1 plaid purple bag, 4 muted gold bags. +shiny tan bags contain 5 striped coral bags, 1 dull brown bag. +shiny gold bags contain 1 dull magenta bag, 5 dark white bags, 4 faded turquoise bags. +dull salmon bags contain 2 plaid gold bags, 2 light indigo bags. +striped tomato bags contain 2 striped tan bags, 4 light blue bags, 4 drab tan bags. +drab tomato bags contain 3 dim teal bags, 4 striped yellow bags, 3 bright red bags. +faded olive bags contain 1 drab plum bag, 1 pale aqua bag, 3 light blue bags. +dotted indigo bags contain 2 clear tomato bags. +dark white bags contain 5 light aqua bags, 2 dim teal bags, 2 muted fuchsia bags, 5 light purple bags. +dull orange bags contain 4 pale gold bags, 5 posh brown bags, 2 mirrored brown bags, 3 dark bronze bags. +bright maroon bags contain 1 mirrored yellow bag, 4 light teal bags. +bright silver bags contain 1 vibrant coral bag, 3 dim teal bags, 5 light purple bags. +muted olive bags contain 5 plaid orange bags, 1 muted magenta bag. +dull silver bags contain no other bags. +pale maroon bags contain 2 pale bronze bags. +light gray bags contain 4 vibrant yellow bags, 2 pale red bags. +drab teal bags contain 2 light crimson bags, 3 vibrant brown bags, 3 vibrant tan bags. +bright gold bags contain 1 wavy red bag, 5 wavy coral bags. +plaid chartreuse bags contain 2 dim coral bags, 4 drab silver bags, 5 dim chartreuse bags, 3 light purple bags. +clear blue bags contain 2 pale tomato bags, 4 dull gold bags, 4 dim fuchsia bags, 4 pale coral bags. +vibrant purple bags contain 5 faded orange bags. +plaid aqua bags contain 3 muted cyan bags, 2 wavy gray bags, 4 drab green bags, 4 pale beige bags. +muted lime bags contain 1 muted tan bag. +faded coral bags contain 3 drab turquoise bags, 1 shiny plum bag, 5 mirrored green bags, 5 clear white bags. +vibrant lime bags contain 5 posh coral bags. +faded green bags contain 3 pale orange bags, 5 dull turquoise bags, 1 mirrored crimson bag. +mirrored gray bags contain 5 dim indigo bags. +wavy maroon bags contain 4 mirrored bronze bags, 1 striped olive bag, 2 dull salmon bags, 3 shiny crimson bags. +dark violet bags contain 2 light purple bags. +dark green bags contain 2 dim cyan bags. +pale black bags contain 1 mirrored gold bag. +bright yellow bags contain 2 vibrant crimson bags, 3 plaid lime bags, 2 dotted gold bags. +muted teal bags contain 1 pale violet bag, 4 dull silver bags. +dim beige bags contain 5 wavy red bags. +muted purple bags contain 4 clear cyan bags. +plaid fuchsia bags contain 3 dark coral bags. +plaid bronze bags contain 5 plaid orange bags, 2 drab indigo bags. +faded indigo bags contain 1 dark chartreuse bag, 4 dull green bags, 1 mirrored magenta bag. +posh plum bags contain 3 dark chartreuse bags, 3 dotted turquoise bags, 4 dull maroon bags, 1 posh bronze bag. +pale gold bags contain 4 striped brown bags. +mirrored chartreuse bags contain 4 bright silver bags, 3 mirrored tomato bags, 4 wavy orange bags. +pale orange bags contain 2 posh fuchsia bags, 2 clear salmon bags, 2 bright green bags. +clear brown bags contain 4 light lime bags, 4 bright green bags, 5 pale yellow bags, 2 drab cyan bags. +shiny plum bags contain 5 vibrant gray bags, 3 bright blue bags, 5 dark tomato bags. +wavy white bags contain 4 plaid lime bags, 4 posh maroon bags, 5 drab lime bags, 1 vibrant crimson bag. +faded red bags contain 1 dull coral bag, 5 clear cyan bags, 4 plaid chartreuse bags, 3 plaid orange bags. +plaid red bags contain 5 pale blue bags, 4 light crimson bags, 3 faded fuchsia bags. +bright cyan bags contain 3 dark white bags, 2 light crimson bags, 1 bright aqua bag. +muted lavender bags contain 1 light green bag, 4 striped silver bags, 3 posh crimson bags. +wavy crimson bags contain 1 light purple bag, 4 bright blue bags, 2 dull coral bags, 1 wavy beige bag. +faded aqua bags contain 5 muted brown bags. +mirrored fuchsia bags contain 1 faded beige bag, 3 muted gold bags. +dark chartreuse bags contain 5 bright lime bags. +plaid green bags contain 4 mirrored tan bags, 1 mirrored tomato bag, 5 pale indigo bags, 1 mirrored plum bag. +shiny black bags contain 3 plaid chartreuse bags. +dotted purple bags contain 2 dim teal bags. +faded tan bags contain 2 bright fuchsia bags, 5 shiny fuchsia bags, 1 muted fuchsia bag, 1 mirrored brown bag. +drab brown bags contain 1 striped orange bag, 4 dotted tomato bags. +dull olive bags contain 1 striped black bag, 1 vibrant magenta bag. +mirrored plum bags contain 1 clear gold bag, 5 pale green bags. +dim tomato bags contain 4 drab gold bags, 2 shiny aqua bags. +light lavender bags contain 1 muted violet bag. +dim gray bags contain 3 light purple bags, 1 posh crimson bag, 1 faded brown bag. +muted aqua bags contain 4 dull beige bags, 4 dull red bags. +faded silver bags contain 1 mirrored cyan bag. +shiny green bags contain 5 dull maroon bags. +muted chartreuse bags contain 2 clear tan bags. +plaid plum bags contain 1 dotted lime bag, 4 clear brown bags, 4 dull red bags. +dotted silver bags contain 1 posh coral bag. +dim crimson bags contain 4 faded violet bags, 1 striped silver bag. +bright brown bags contain 1 bright coral bag, 3 posh brown bags, 4 drab tan bags. +wavy cyan bags contain 3 clear gold bags, 1 mirrored salmon bag, 3 bright fuchsia bags, 2 light bronze bags. +dull violet bags contain 5 striped white bags, 4 light blue bags, 4 dim black bags. +vibrant olive bags contain 2 vibrant coral bags. +bright coral bags contain 2 vibrant tan bags, 3 shiny indigo bags, 2 plaid indigo bags. +dim turquoise bags contain 1 pale violet bag. +striped crimson bags contain 2 faded gray bags. +clear green bags contain 3 mirrored olive bags, 3 shiny tomato bags. +faded violet bags contain 2 wavy coral bags, 2 dull tan bags, 1 dull silver bag, 1 bright orange bag. +pale chartreuse bags contain 4 shiny crimson bags, 2 clear bronze bags. +light plum bags contain 3 drab bronze bags, 1 bright bronze bag, 1 posh yellow bag. +pale tomato bags contain 1 dim teal bag, 5 drab cyan bags, 3 muted coral bags, 2 dim chartreuse bags. +plaid coral bags contain 1 striped tan bag, 3 vibrant cyan bags, 3 light beige bags, 2 dotted green bags. +bright gray bags contain 4 mirrored teal bags, 4 striped brown bags, 1 dim green bag, 4 clear cyan bags. +drab fuchsia bags contain 2 mirrored salmon bags, 4 posh orange bags, 3 faded crimson bags, 3 pale plum bags. +light tomato bags contain 2 dotted gold bags, 1 dotted bronze bag. +muted violet bags contain 2 light chartreuse bags. +drab tan bags contain 2 light green bags, 5 bright red bags, 4 shiny beige bags. +drab chartreuse bags contain 2 drab salmon bags, 2 dark brown bags, 4 clear turquoise bags. +drab violet bags contain 4 faded red bags. +posh cyan bags contain 4 bright violet bags. +posh orange bags contain 4 pale plum bags, 5 posh aqua bags. +plaid silver bags contain 1 dotted brown bag, 3 drab gold bags, 4 clear yellow bags. +mirrored silver bags contain 3 shiny beige bags, 1 drab silver bag. +faded gray bags contain no other bags. +wavy tomato bags contain 1 bright brown bag, 3 striped red bags, 2 vibrant maroon bags. +posh violet bags contain 2 dim aqua bags. +bright blue bags contain 5 light lime bags, 2 faded violet bags, 3 light aqua bags, 4 vibrant coral bags. +dark teal bags contain 5 muted fuchsia bags. +striped fuchsia bags contain 1 wavy turquoise bag, 5 wavy green bags, 4 posh gold bags. +posh maroon bags contain 2 dull red bags. +shiny purple bags contain 2 clear tan bags. +wavy lime bags contain 2 dark coral bags, 1 shiny gold bag. +wavy silver bags contain 4 dotted white bags. +shiny silver bags contain 2 plaid gold bags, 2 dim green bags, 5 plaid lime bags, 3 dull red bags. +wavy red bags contain 3 vibrant brown bags, 4 bright indigo bags. +dull chartreuse bags contain 4 dotted lime bags, 2 bright silver bags, 3 dull red bags, 4 wavy maroon bags. +vibrant silver bags contain 1 bright fuchsia bag, 3 drab lavender bags, 2 drab olive bags, 3 dotted teal bags. +striped gray bags contain 5 plaid orange bags, 1 wavy coral bag. +striped green bags contain 4 wavy coral bags, 4 shiny gold bags, 3 dark brown bags, 5 vibrant brown bags. +mirrored violet bags contain 3 dim silver bags, 1 posh tomato bag, 1 light salmon bag. +dull purple bags contain 1 light gray bag, 3 wavy yellow bags, 1 wavy salmon bag. +mirrored beige bags contain 4 dark cyan bags, 5 dull green bags. +posh lime bags contain 3 posh chartreuse bags. +vibrant tan bags contain 2 dull plum bags, 1 striped brown bag, 4 vibrant coral bags. +dotted orange bags contain 1 mirrored olive bag, 5 drab silver bags. +clear indigo bags contain 3 light lime bags, 4 dull coral bags. +pale gray bags contain 1 faded black bag, 3 dim green bags, 4 wavy lavender bags, 2 posh brown bags. +posh gold bags contain 5 dark tan bags, 2 dotted olive bags, 5 dark aqua bags. +striped chartreuse bags contain 2 dull magenta bags, 1 posh tomato bag. +mirrored bronze bags contain 2 faded fuchsia bags. +clear salmon bags contain 4 posh bronze bags, 5 clear plum bags, 5 dull blue bags. +posh purple bags contain 5 dim gray bags, 3 faded brown bags. +faded lime bags contain 5 dim turquoise bags, 3 dark indigo bags, 2 vibrant gray bags, 1 muted silver bag. +wavy beige bags contain 1 dark bronze bag, 4 dull plum bags, 4 mirrored silver bags. +clear yellow bags contain 2 vibrant teal bags. +vibrant plum bags contain 4 muted chartreuse bags, 4 posh silver bags. +striped yellow bags contain 2 dull maroon bags, 5 bright red bags, 2 posh chartreuse bags. +dark coral bags contain 3 dull tan bags. +dull magenta bags contain no other bags. +dark gold bags contain 1 dotted indigo bag, 4 shiny teal bags, 4 dotted silver bags. +dim tan bags contain 1 striped lavender bag, 1 shiny tomato bag. +muted maroon bags contain 2 dull salmon bags, 4 dim chartreuse bags, 3 bright aqua bags, 2 faded indigo bags. +vibrant tomato bags contain 2 dark silver bags, 3 plaid purple bags. +dotted lime bags contain 3 shiny crimson bags, 2 pale yellow bags. +muted fuchsia bags contain 1 dull tan bag. +bright tan bags contain 5 pale gold bags, 5 drab teal bags, 2 light blue bags. +dark crimson bags contain 4 shiny orange bags, 3 faded purple bags, 3 bright white bags. +striped tan bags contain 4 dotted turquoise bags, 4 drab lime bags, 5 dim teal bags. +posh fuchsia bags contain 2 dotted olive bags, 2 mirrored beige bags, 3 shiny bronze bags. +pale silver bags contain 4 vibrant lavender bags, 4 clear beige bags, 4 striped gold bags. +posh aqua bags contain 4 drab lime bags, 4 dull tan bags, 5 vibrant tan bags. +plaid salmon bags contain 5 dim coral bags, 2 wavy bronze bags. +mirrored orange bags contain 4 vibrant gray bags. +dim yellow bags contain 5 pale tan bags, 4 dark black bags. +dotted coral bags contain 4 dotted chartreuse bags, 2 bright red bags, 1 vibrant white bag, 1 vibrant brown bag. +muted crimson bags contain 4 striped orange bags, 5 pale yellow bags, 3 posh blue bags, 1 muted red bag. +striped lavender bags contain 3 striped brown bags. +striped maroon bags contain 2 shiny yellow bags. +vibrant blue bags contain 3 faded cyan bags, 1 shiny lime bag, 3 dark tomato bags. +pale lavender bags contain 4 plaid magenta bags, 4 striped blue bags. +dull tan bags contain 4 shiny indigo bags, 2 light purple bags, 4 faded cyan bags. +dotted beige bags contain 3 drab indigo bags. +light indigo bags contain 1 faded cyan bag, 5 bright aqua bags, 1 shiny indigo bag. +vibrant crimson bags contain 4 dotted fuchsia bags. +wavy blue bags contain 4 wavy teal bags, 1 dull blue bag. +vibrant chartreuse bags contain 4 striped orange bags. +vibrant cyan bags contain 5 wavy coral bags. +faded brown bags contain 5 faded turquoise bags. +faded magenta bags contain 1 dull indigo bag, 4 plaid aqua bags, 4 dim crimson bags. +mirrored coral bags contain 4 drab crimson bags, 2 light salmon bags, 2 clear indigo bags. +faded cyan bags contain no other bags. +dark brown bags contain 5 light purple bags. +wavy violet bags contain 3 dull coral bags, 1 bright aqua bag, 3 shiny lavender bags. +posh tomato bags contain 4 vibrant chartreuse bags, 4 mirrored teal bags. +pale crimson bags contain 1 plaid orange bag, 1 dark violet bag, 3 plaid lavender bags. +dark fuchsia bags contain 4 plaid beige bags, 2 plaid chartreuse bags. +plaid magenta bags contain 3 clear lavender bags, 5 mirrored brown bags, 5 shiny bronze bags. +striped blue bags contain 1 dull bronze bag, 1 dotted fuchsia bag, 1 light lavender bag, 1 clear turquoise bag. +dotted olive bags contain 4 dotted turquoise bags, 5 dotted bronze bags, 3 pale yellow bags, 4 pale red bags. +posh silver bags contain 3 pale violet bags, 1 plaid salmon bag, 1 posh coral bag. +dotted chartreuse bags contain 3 bright blue bags. +light coral bags contain 4 shiny fuchsia bags, 2 pale red bags, 1 muted silver bag, 2 bright cyan bags. +pale brown bags contain 5 light aqua bags. +dotted black bags contain 2 plaid purple bags, 1 mirrored aqua bag, 5 posh beige bags. +posh coral bags contain 3 dark aqua bags, 2 pale yellow bags, 5 plaid blue bags, 4 dim aqua bags. +shiny gray bags contain 1 bright gold bag, 1 muted bronze bag, 5 striped green bags, 5 shiny teal bags. +drab orange bags contain 5 plaid salmon bags, 2 vibrant beige bags. +plaid yellow bags contain 4 clear teal bags, 2 bright red bags. +striped violet bags contain 4 mirrored fuchsia bags, 4 vibrant white bags, 3 dim teal bags. +dim aqua bags contain 1 muted fuchsia bag, 1 dull tan bag. +light orange bags contain 2 bright red bags, 4 dark white bags, 1 dim chartreuse bag, 5 faded fuchsia bags. +faded salmon bags contain 5 wavy gray bags. +shiny yellow bags contain 2 vibrant plum bags, 3 dim teal bags, 1 plaid tan bag, 5 posh plum bags. +vibrant beige bags contain 2 wavy lavender bags, 4 posh chartreuse bags, 3 pale teal bags, 5 wavy lime bags. +light fuchsia bags contain 3 clear brown bags, 3 bright lavender bags. +pale magenta bags contain 4 posh silver bags. +dark maroon bags contain 3 drab turquoise bags. +faded beige bags contain 1 vibrant white bag, 4 drab red bags, 1 drab lavender bag. +bright bronze bags contain 1 pale bronze bag, 3 muted silver bags, 2 striped coral bags, 3 clear gray bags. +light silver bags contain 3 dotted lavender bags, 2 wavy lavender bags. +muted salmon bags contain 2 drab tan bags, 5 wavy tomato bags. +bright black bags contain 5 plaid tan bags. +dim chartreuse bags contain 5 muted gold bags, 5 bright blue bags, 5 faded cyan bags. +shiny white bags contain 4 bright tan bags. +bright red bags contain 3 dull silver bags. +dark aqua bags contain 2 dull red bags. +drab plum bags contain 4 muted brown bags, 5 muted plum bags. +muted yellow bags contain 5 light purple bags, 3 dotted silver bags, 3 faded turquoise bags. +light violet bags contain 1 pale red bag, 4 dim silver bags, 2 mirrored bronze bags. +pale lime bags contain 4 bright lavender bags. +pale tan bags contain 4 striped green bags, 2 dotted chartreuse bags. +dim green bags contain 1 light lime bag, 1 shiny beige bag. +mirrored gold bags contain 4 mirrored white bags. +dim silver bags contain 5 pale coral bags, 3 wavy coral bags. +dull aqua bags contain 3 posh indigo bags, 5 dotted coral bags, 1 dark salmon bag, 3 striped crimson bags. +posh yellow bags contain 1 dark bronze bag, 2 mirrored white bags, 2 light crimson bags. +mirrored magenta bags contain 1 bright violet bag, 2 drab lavender bags, 3 pale violet bags, 2 plaid salmon bags. +shiny chartreuse bags contain 2 dotted purple bags, 5 wavy red bags, 3 plaid beige bags. +light black bags contain 1 dark chartreuse bag, 3 faded tomato bags. +clear plum bags contain 5 vibrant brown bags, 3 dim coral bags, 4 mirrored brown bags, 1 faded black bag. +pale violet bags contain 2 dull tan bags. +bright fuchsia bags contain 4 dull orange bags. +dotted teal bags contain 5 bright red bags, 3 wavy red bags, 1 dull coral bag, 3 clear plum bags. +dotted blue bags contain 2 wavy beige bags, 3 muted purple bags. +muted gray bags contain 3 faded aqua bags, 1 shiny olive bag, 5 clear salmon bags, 1 vibrant violet bag. +dull beige bags contain 1 wavy lavender bag, 4 dark bronze bags, 5 dull tan bags. +drab turquoise bags contain 3 posh gray bags, 5 drab red bags. +vibrant yellow bags contain 2 shiny aqua bags, 4 light chartreuse bags. +posh brown bags contain 3 bright green bags, 5 posh lavender bags. +faded gold bags contain 4 vibrant maroon bags, 4 dotted purple bags. +dotted turquoise bags contain 5 clear plum bags, 3 muted gold bags, 4 dark violet bags. +dotted tan bags contain 5 dim aqua bags, 4 striped violet bags. +posh crimson bags contain 4 striped blue bags, 5 dull magenta bags, 2 bright coral bags. +muted white bags contain 5 dull olive bags. +vibrant teal bags contain 5 dotted turquoise bags, 1 striped tan bag, 1 drab tan bag. +dotted yellow bags contain 3 plaid turquoise bags, 2 posh yellow bags, 4 striped blue bags, 5 posh black bags. +posh magenta bags contain 5 mirrored black bags. +dotted green bags contain 4 dim crimson bags, 1 shiny lavender bag, 4 bright salmon bags, 1 plaid gray bag. +bright green bags contain 3 bright aqua bags, 3 dull maroon bags, 4 dark brown bags. +dark gray bags contain 5 muted purple bags, 2 striped blue bags, 4 faded lavender bags. +bright crimson bags contain 2 striped olive bags, 3 muted blue bags. +muted cyan bags contain 3 shiny tomato bags. +light yellow bags contain 2 striped red bags, 4 shiny crimson bags. +pale aqua bags contain 5 shiny yellow bags, 3 dark lavender bags, 3 posh white bags. +clear red bags contain 1 dotted silver bag, 1 dull teal bag, 1 faded maroon bag, 1 dotted salmon bag. +pale red bags contain 2 faded gray bags. +dotted maroon bags contain 5 posh aqua bags, 3 dull silver bags. +dull blue bags contain 4 light crimson bags, 3 light lime bags, 1 dark orange bag, 5 light indigo bags. +posh turquoise bags contain 1 muted gold bag, 5 striped lavender bags, 3 dull salmon bags, 5 vibrant chartreuse bags. +striped magenta bags contain 1 posh silver bag, 5 dark brown bags. +pale blue bags contain 2 muted gold bags, 4 vibrant brown bags, 1 light lavender bag. +vibrant violet bags contain 5 bright red bags. +faded fuchsia bags contain 2 light lime bags, 4 bright lime bags, 3 pale violet bags. +shiny coral bags contain 1 clear plum bag, 5 muted chartreuse bags, 1 muted violet bag, 5 striped yellow bags. +pale olive bags contain 4 plaid lime bags, 1 posh salmon bag. +wavy tan bags contain 3 faded gray bags. +faded chartreuse bags contain 3 dim coral bags, 1 mirrored bronze bag, 3 posh bronze bags. +mirrored brown bags contain 1 faded violet bag, 4 dull maroon bags, 5 dotted magenta bags. +clear white bags contain 5 muted magenta bags, 4 dull magenta bags, 3 pale plum bags, 4 drab indigo bags. +drab maroon bags contain 2 clear beige bags, 3 wavy beige bags, 5 faded purple bags. +striped silver bags contain 3 drab tomato bags. +faded plum bags contain 1 clear teal bag, 3 bright aqua bags. +plaid violet bags contain 2 drab violet bags, 4 muted turquoise bags, 5 muted indigo bags. +clear black bags contain 5 muted fuchsia bags, 1 muted coral bag, 2 light black bags. +vibrant maroon bags contain 1 dark lavender bag, 1 pale crimson bag, 4 bright indigo bags, 5 mirrored maroon bags. +drab indigo bags contain 2 dim coral bags, 1 drab green bag, 2 shiny lavender bags. +drab olive bags contain 2 dark aqua bags, 4 striped brown bags. +dull crimson bags contain 3 dull cyan bags. +wavy teal bags contain 4 striped orange bags, 2 drab cyan bags. +dark red bags contain 2 dull maroon bags, 4 muted plum bags, 4 dull plum bags. +striped salmon bags contain 3 bright red bags, 1 light aqua bag, 4 wavy gold bags. +mirrored tan bags contain 5 dotted olive bags, 2 dim tomato bags, 2 mirrored tomato bags, 4 clear teal bags. +striped white bags contain 2 pale coral bags, 2 shiny green bags. +shiny tomato bags contain 5 pale coral bags, 5 dull beige bags. +vibrant indigo bags contain 2 dim black bags, 4 dim blue bags, 3 dim white bags. +wavy lavender bags contain 4 faded bronze bags, 4 muted red bags, 3 light lime bags, 4 muted gold bags. +shiny turquoise bags contain 2 dull red bags, 5 faded gray bags, 1 muted turquoise bag. +shiny lavender bags contain 5 bright aqua bags. +posh tan bags contain 1 shiny yellow bag, 3 drab magenta bags. +light green bags contain 4 bright red bags, 1 vibrant coral bag. +drab black bags contain 5 faded tomato bags, 3 dotted chartreuse bags. +clear chartreuse bags contain 3 wavy bronze bags, 4 plaid purple bags, 3 dark orange bags. +dull black bags contain 1 wavy teal bag, 3 light lavender bags, 2 striped indigo bags. +wavy black bags contain 2 clear orange bags, 4 muted purple bags. +pale plum bags contain 1 bright coral bag, 1 drab tan bag, 1 plaid fuchsia bag, 1 dotted fuchsia bag. +dotted violet bags contain 3 bright black bags. +posh red bags contain 3 bright black bags. +plaid lime bags contain 5 posh beige bags, 1 dotted turquoise bag. +wavy aqua bags contain 1 dark yellow bag, 3 drab indigo bags. +dim magenta bags contain 3 dark violet bags. +drab aqua bags contain 5 posh orange bags, 1 dark silver bag, 4 plaid purple bags, 2 wavy teal bags. +dull brown bags contain 4 light lime bags. +striped orange bags contain 5 light crimson bags, 3 muted tan bags, 5 dotted coral bags, 3 plaid blue bags. +muted brown bags contain 1 posh blue bag, 4 dotted magenta bags, 3 dull coral bags. +faded blue bags contain 5 striped black bags, 1 vibrant yellow bag. +plaid indigo bags contain 3 dark brown bags, 5 light purple bags, 4 light aqua bags, 3 light green bags. +plaid turquoise bags contain 5 dotted teal bags. +light turquoise bags contain 2 dull salmon bags, 5 dotted tan bags. +dim purple bags contain 4 muted white bags, 5 drab purple bags. +pale coral bags contain 5 posh gray bags. +clear lime bags contain 3 dim magenta bags, 3 plaid tomato bags, 1 drab magenta bag, 3 shiny purple bags. +dim black bags contain 3 clear gold bags, 4 muted violet bags. +light maroon bags contain 4 muted yellow bags, 1 pale cyan bag, 2 mirrored turquoise bags, 4 dull lavender bags. +clear magenta bags contain 2 shiny magenta bags, 2 muted chartreuse bags. +striped bronze bags contain 5 clear tan bags, 1 drab lavender bag, 2 pale crimson bags. +dark salmon bags contain 1 vibrant plum bag, 5 drab tan bags, 4 drab coral bags, 4 dull tan bags. +vibrant salmon bags contain 2 muted olive bags. +dim gold bags contain 2 dim olive bags, 5 plaid olive bags, 2 posh orange bags. +wavy chartreuse bags contain 4 shiny yellow bags, 4 vibrant blue bags. +vibrant brown bags contain 3 striped brown bags, 4 muted red bags, 2 shiny indigo bags. +plaid maroon bags contain 2 muted teal bags, 2 pale yellow bags, 2 bright beige bags, 5 striped yellow bags. +dim indigo bags contain 4 dull tomato bags, 4 clear cyan bags, 2 shiny salmon bags, 1 bright aqua bag. +muted red bags contain 3 dull tan bags, 4 dull magenta bags, 1 bright aqua bag. +posh beige bags contain 5 shiny black bags, 3 dotted magenta bags, 3 drab blue bags, 2 muted coral bags. +pale fuchsia bags contain 3 dark brown bags, 5 posh gold bags. +dark bronze bags contain 1 dim green bag, 5 posh chartreuse bags. +dim coral bags contain 3 dull coral bags, 3 striped brown bags. +drab crimson bags contain 2 dark bronze bags, 4 shiny indigo bags, 3 dull tan bags. +bright indigo bags contain 3 bright blue bags. +pale yellow bags contain 5 dim aqua bags, 1 vibrant brown bag, 2 vibrant tan bags, 3 wavy lavender bags. +drab salmon bags contain 1 dotted indigo bag, 3 muted chartreuse bags, 5 dark olive bags. +muted orange bags contain 4 faded lime bags, 2 dull coral bags, 5 vibrant magenta bags, 4 dull magenta bags. +striped gold bags contain 2 dull silver bags, 5 bright lavender bags, 5 dim teal bags, 5 dark coral bags. +posh chartreuse bags contain 3 dim teal bags, 5 light aqua bags. +shiny blue bags contain 3 dull tan bags, 5 muted magenta bags. +muted silver bags contain 3 wavy blue bags, 2 dim teal bags, 5 muted bronze bags. +shiny bronze bags contain 1 light green bag, 4 vibrant magenta bags. +wavy coral bags contain no other bags. +shiny orange bags contain 2 muted purple bags. +posh teal bags contain 4 clear plum bags. +striped turquoise bags contain 3 muted indigo bags. +dim bronze bags contain 2 shiny silver bags, 1 light silver bag, 2 dim indigo bags, 4 dim tomato bags. +plaid white bags contain 4 drab turquoise bags. +wavy indigo bags contain 3 clear gold bags, 5 mirrored bronze bags. +faded teal bags contain 4 mirrored white bags. +shiny fuchsia bags contain 3 drab indigo bags. +dim red bags contain 3 clear bronze bags. +dotted brown bags contain 4 wavy maroon bags, 5 drab green bags, 3 dark purple bags. +dark tomato bags contain 3 vibrant coral bags, 5 dull coral bags, 2 drab cyan bags, 1 posh blue bag. +clear teal bags contain 3 dark white bags. +dark silver bags contain 3 dark cyan bags, 4 plaid salmon bags. +wavy fuchsia bags contain 4 bright brown bags, 4 bright aqua bags, 5 light orange bags. +light bronze bags contain 4 clear plum bags. +striped purple bags contain 1 dim indigo bag. +clear tomato bags contain 4 mirrored tomato bags, 3 muted indigo bags, 1 striped tan bag. +muted turquoise bags contain 5 faded beige bags, 4 clear crimson bags, 2 bright teal bags. +dull cyan bags contain 5 mirrored aqua bags, 2 shiny aqua bags, 3 light black bags, 4 bright coral bags. +plaid crimson bags contain 2 mirrored teal bags, 2 dull fuchsia bags. +shiny maroon bags contain 1 posh gold bag. +dim white bags contain 5 striped brown bags, 2 dull magenta bags, 5 plaid tan bags. +muted green bags contain 2 dull magenta bags, 5 clear cyan bags. +plaid teal bags contain 2 dark tan bags, 3 pale lime bags. +dotted lavender bags contain 2 posh aqua bags, 3 dull cyan bags. +light salmon bags contain 5 dark silver bags. +faded white bags contain 2 wavy maroon bags, 3 dull cyan bags. +dull tomato bags contain 2 dim aqua bags, 4 posh lavender bags, 1 faded red bag. +dark olive bags contain 5 clear bronze bags, 2 drab plum bags. +pale indigo bags contain 2 mirrored beige bags, 5 wavy turquoise bags, 4 striped green bags, 2 dotted lavender bags. +plaid purple bags contain 1 light lime bag. +clear purple bags contain 3 vibrant white bags. +dark yellow bags contain 2 pale olive bags, 4 pale cyan bags, 5 bright teal bags. +muted beige bags contain 2 posh lime bags, 5 shiny gray bags, 2 dull blue bags. +vibrant orange bags contain 5 posh crimson bags, 4 light chartreuse bags. +light magenta bags contain 2 plaid maroon bags, 1 posh beige bag, 5 pale salmon bags. +dotted crimson bags contain 5 dark chartreuse bags. +striped coral bags contain 2 dim aqua bags. +striped aqua bags contain 3 posh salmon bags, 3 dull red bags. +mirrored salmon bags contain 5 bright red bags, 2 light green bags, 3 clear black bags, 5 posh brown bags. +posh white bags contain 4 drab violet bags, 2 dotted silver bags. +posh blue bags contain 4 dull maroon bags, 3 vibrant coral bags. +dim orange bags contain 2 dull olive bags. +shiny teal bags contain 1 faded tomato bag, 4 muted violet bags. +mirrored maroon bags contain 3 dull blue bags. +dark lavender bags contain 1 drab red bag, 3 shiny indigo bags, 4 faded beige bags, 1 drab turquoise bag. +shiny olive bags contain 3 dark violet bags, 1 striped gold bag, 2 mirrored lime bags. +bright violet bags contain 2 wavy bronze bags, 3 drab olive bags, 5 mirrored olive bags, 2 wavy lavender bags. +clear olive bags contain 5 faded turquoise bags. +mirrored lavender bags contain 1 light white bag, 4 light purple bags, 3 wavy lavender bags, 2 shiny lime bags. +pale turquoise bags contain 4 dark tan bags. +shiny salmon bags contain 1 shiny gold bag, 5 drab turquoise bags. +vibrant gray bags contain 3 posh brown bags. +dark indigo bags contain 1 mirrored black bag, 5 dull beige bags, 4 shiny beige bags, 3 drab lavender bags. +light teal bags contain 5 dark olive bags, 5 vibrant chartreuse bags, 3 plaid salmon bags, 5 light yellow bags. +clear violet bags contain 3 light crimson bags. +clear tan bags contain 3 striped orange bags, 4 wavy lavender bags, 3 striped silver bags. +clear bronze bags contain 2 plaid beige bags. +clear gray bags contain 4 dotted cyan bags, 4 vibrant plum bags. +drab cyan bags contain 1 light aqua bag, 1 drab teal bag, 3 bright orange bags, 3 dark white bags. +plaid beige bags contain 3 dull green bags. +wavy gold bags contain 4 shiny olive bags, 3 bright tan bags. +clear aqua bags contain 3 posh chartreuse bags, 4 drab silver bags, 5 clear gray bags. +bright chartreuse bags contain 2 light violet bags, 3 vibrant gray bags. +plaid black bags contain 2 posh gray bags. +light beige bags contain 4 dotted olive bags, 5 dull olive bags, 1 faded orange bag. +mirrored teal bags contain 4 mirrored aqua bags. +bright magenta bags contain 1 mirrored magenta bag, 3 bright blue bags, 1 vibrant blue bag, 2 drab gold bags. +dim maroon bags contain 4 light bronze bags, 5 clear violet bags. +light lime bags contain 4 plaid indigo bags. +posh lavender bags contain 4 dark brown bags. +clear beige bags contain 4 posh silver bags, 3 dull coral bags, 2 posh gray bags. +drab bronze bags contain 4 plaid maroon bags. +mirrored purple bags contain 3 dim magenta bags. +dark magenta bags contain 4 faded maroon bags, 1 drab crimson bag, 5 dotted brown bags, 2 bright teal bags. +dim brown bags contain 3 muted olive bags, 5 drab green bags, 1 mirrored olive bag. +dark plum bags contain 2 vibrant tan bags. +bright turquoise bags contain 1 mirrored aqua bag, 3 clear plum bags. +muted black bags contain 5 faded cyan bags, 5 pale tan bags, 2 dotted chartreuse bags. +dotted gray bags contain 3 posh plum bags. +vibrant black bags contain 2 vibrant magenta bags, 5 faded cyan bags. +mirrored cyan bags contain 2 clear cyan bags, 4 light aqua bags, 5 drab blue bags, 1 drab gold bag. +wavy purple bags contain 5 striped magenta bags, 3 clear maroon bags, 1 mirrored green bag, 1 pale black bag. +drab blue bags contain 3 mirrored lime bags, 1 mirrored blue bag. +clear maroon bags contain 5 bright orange bags. +shiny cyan bags contain 2 clear gray bags, 5 pale crimson bags. +pale cyan bags contain 2 wavy turquoise bags, 5 wavy salmon bags. +plaid gold bags contain 1 clear lavender bag, 1 bright beige bag. +mirrored lime bags contain 2 dull tan bags, 3 shiny beige bags. +drab green bags contain 1 vibrant yellow bag. +dull red bags contain 5 plaid blue bags, 5 clear brown bags, 3 pale salmon bags, 2 dark orange bags. +bright beige bags contain 4 dull silver bags, 5 vibrant brown bags, 4 drab red bags, 2 pale violet bags. +clear silver bags contain 4 drab indigo bags, 2 clear salmon bags. +posh bronze bags contain 5 bright indigo bags, 5 dotted purple bags, 1 dark violet bag, 2 dark orange bags. +posh salmon bags contain 5 bright red bags, 3 striped green bags, 3 dark brown bags. +clear cyan bags contain 5 dark chartreuse bags, 1 bright indigo bag, 4 pale yellow bags, 2 vibrant coral bags. +mirrored blue bags contain 2 vibrant white bags. +mirrored yellow bags contain 5 dotted gray bags, 4 dull maroon bags, 2 striped violet bags, 5 clear tomato bags. +striped teal bags contain 2 clear black bags, 3 pale coral bags. +faded orange bags contain 2 dark bronze bags. +mirrored indigo bags contain 3 light tomato bags, 2 shiny crimson bags. +pale green bags contain 4 light chartreuse bags. +plaid cyan bags contain 4 plaid fuchsia bags, 2 shiny teal bags, 3 dotted fuchsia bags, 3 dim red bags. +muted gold bags contain 2 dull tan bags, 1 faded bronze bag, 4 dull maroon bags. +wavy green bags contain 5 pale coral bags, 1 dull blue bag, 4 drab blue bags, 1 striped tan bag. +light chartreuse bags contain 4 striped brown bags, 5 plaid purple bags, 4 drab cyan bags, 3 dull plum bags. +dotted cyan bags contain 4 shiny black bags. +light purple bags contain no other bags. +dotted aqua bags contain 4 light gray bags, 2 light purple bags, 5 mirrored lime bags. +drab gold bags contain 2 bright green bags, 5 bright indigo bags. +posh gray bags contain 5 bright orange bags, 5 bright blue bags. +striped red bags contain 4 drab green bags, 1 clear cyan bag. +dotted bronze bags contain 5 light orange bags. +muted plum bags contain 2 bright black bags, 3 dotted tomato bags, 2 vibrant brown bags. +mirrored black bags contain 3 plaid chartreuse bags, 2 shiny indigo bags, 2 shiny beige bags. +drab lavender bags contain 5 drab cyan bags, 1 muted purple bag, 1 wavy red bag, 3 drab crimson bags. +vibrant turquoise bags contain 3 shiny beige bags, 3 striped brown bags, 5 dim teal bags. +muted tan bags contain 1 plaid purple bag, 3 shiny beige bags, 1 drab gold bag. +pale beige bags contain 5 bright silver bags. +wavy olive bags contain 4 dotted turquoise bags, 4 dull silver bags, 1 bright gold bag. +dim olive bags contain 5 light lavender bags, 4 shiny tomato bags, 4 clear cyan bags. +wavy salmon bags contain 4 bright aqua bags. +dotted gold bags contain 3 shiny red bags, 3 dull fuchsia bags. +shiny violet bags contain 3 dotted tomato bags, 1 drab coral bag. +striped plum bags contain 4 drab beige bags, 3 clear tan bags, 5 light aqua bags, 1 shiny fuchsia bag. +clear lavender bags contain 2 bright aqua bags, 3 dull silver bags, 3 bright green bags, 2 bright orange bags. +faded maroon bags contain 5 dark indigo bags, 1 posh fuchsia bag. +vibrant red bags contain 4 striped fuchsia bags, 3 drab orange bags, 1 clear brown bag, 1 plaid turquoise bag. +dull coral bags contain 2 dim teal bags, 3 faded bronze bags. +pale salmon bags contain 3 dull magenta bags, 1 light crimson bag. +dotted magenta bags contain 4 dull maroon bags, 2 bright lime bags, 4 plaid indigo bags, 4 faded cyan bags. +wavy gray bags contain 4 muted gray bags, 3 shiny magenta bags, 1 posh teal bag. +light red bags contain 4 shiny chartreuse bags. +dim blue bags contain 4 vibrant orange bags. +muted bronze bags contain 5 mirrored aqua bags, 4 dim green bags. +drab lime bags contain 1 drab cyan bag, 3 pale crimson bags, 4 bright green bags, 3 drab lavender bags. +light white bags contain 5 bright green bags. +bright teal bags contain 4 shiny brown bags, 4 dark silver bags. +striped beige bags contain 2 shiny magenta bags. +wavy magenta bags contain 5 pale bronze bags, 5 pale plum bags, 3 muted silver bags. +dark orange bags contain 1 drab tomato bag, 3 striped brown bags, 1 dim teal bag, 5 bright beige bags. +striped indigo bags contain 1 vibrant gold bag, 1 shiny green bag. +clear coral bags contain 2 shiny gray bags. +faded yellow bags contain 4 faded gold bags, 2 bright turquoise bags, 5 dark silver bags, 3 wavy coral bags. +dim plum bags contain 1 clear purple bag, 4 light brown bags. +mirrored turquoise bags contain 5 wavy indigo bags, 3 dark fuchsia bags, 5 plaid white bags, 2 dim turquoise bags. +posh black bags contain 2 striped black bags, 5 dim teal bags, 3 bright silver bags, 5 posh beige bags. +dotted fuchsia bags contain 1 faded turquoise bag, 2 shiny lavender bags, 4 posh salmon bags, 1 clear olive bag. +faded lavender bags contain 2 striped yellow bags, 1 posh lavender bag. +dim lime bags contain 2 wavy gray bags, 5 clear gray bags. +vibrant bronze bags contain 3 drab tomato bags, 5 bright tan bags. +dull plum bags contain 5 bright red bags, 4 dull magenta bags. +dim teal bags contain 4 light purple bags, 4 plaid lavender bags, 1 dull magenta bag. +dull yellow bags contain 4 vibrant orange bags, 1 dark tomato bag, 5 pale tan bags. +dull green bags contain 2 bright blue bags, 5 dull red bags. +light crimson bags contain 5 dull maroon bags, 4 muted gold bags. +dark black bags contain 1 dim silver bag, 3 plaid magenta bags. +bright lavender bags contain 4 muted fuchsia bags. +drab coral bags contain 4 shiny chartreuse bags, 3 posh yellow bags, 3 wavy indigo bags. +mirrored crimson bags contain 3 posh maroon bags, 5 striped olive bags, 3 mirrored magenta bags. +muted coral bags contain 3 wavy violet bags, 1 dotted chartreuse bag, 1 shiny beige bag. +vibrant gold bags contain 2 dull orange bags, 1 clear chartreuse bag. +wavy orange bags contain 5 dark bronze bags. +mirrored white bags contain 5 clear gold bags, 3 drab tomato bags, 4 dotted bronze bags, 3 striped orange bags. +clear gold bags contain 3 drab indigo bags, 4 wavy violet bags, 2 shiny salmon bags, 4 light brown bags. +shiny magenta bags contain 5 drab silver bags, 2 muted gold bags. +dim violet bags contain 1 posh lime bag, 4 shiny orange bags, 2 posh chartreuse bags. +striped olive bags contain 4 plaid indigo bags, 5 dim chartreuse bags, 4 clear lavender bags. +plaid gray bags contain 3 shiny gold bags, 2 dull coral bags. +clear crimson bags contain 4 shiny aqua bags, 3 light crimson bags, 5 dim chartreuse bags. +drab silver bags contain 1 dim teal bag, 3 faded cyan bags, 1 shiny indigo bag. +mirrored green bags contain 5 dotted lime bags, 4 pale cyan bags. +bright aqua bags contain no other bags. +bright plum bags contain 4 dim aqua bags, 2 dull crimson bags, 1 wavy maroon bag. +vibrant lavender bags contain 1 plaid tan bag, 3 vibrant brown bags, 3 drab gold bags, 4 faded red bags. +pale white bags contain 3 bright brown bags, 4 mirrored beige bags. +plaid lavender bags contain 1 dull magenta bag, 2 dull silver bags, 1 shiny indigo bag. +bright salmon bags contain 1 striped coral bag, 4 plaid lavender bags, 1 muted red bag, 1 drab red bag. +plaid olive bags contain 5 faded turquoise bags, 4 dim green bags, 2 striped beige bags. +wavy plum bags contain 1 clear lavender bag, 2 faded brown bags. +clear fuchsia bags contain 1 muted bronze bag. +wavy turquoise bags contain 5 shiny lime bags, 1 drab olive bag, 4 dim white bags, 1 dotted gray bag. +vibrant aqua bags contain 2 faded lavender bags. +dotted white bags contain 3 muted crimson bags, 5 mirrored white bags, 1 mirrored fuchsia bag. +bright purple bags contain 2 dotted chartreuse bags, 4 posh cyan bags, 3 bright plum bags. +light aqua bags contain 1 plaid lavender bag, 3 wavy coral bags, 5 shiny indigo bags. +drab yellow bags contain 4 shiny teal bags, 2 dotted green bags, 5 vibrant silver bags, 3 dotted turquoise bags. +mirrored olive bags contain 1 dull plum bag. +light olive bags contain 1 shiny coral bag, 4 drab white bags, 3 dim turquoise bags, 4 dull gold bags. +shiny indigo bags contain no other bags. +dull gold bags contain 3 dark indigo bags. +bright tomato bags contain 5 muted blue bags. +faded purple bags contain 4 bright orange bags, 2 faded violet bags. +drab magenta bags contain 3 wavy lavender bags, 2 drab cyan bags, 2 clear beige bags, 4 bright indigo bags. +striped lime bags contain 4 light tan bags. +light gold bags contain 2 pale plum bags. +striped black bags contain 1 plaid salmon bag, 2 plaid beige bags, 4 dotted teal bags, 2 posh chartreuse bags. +faded tomato bags contain 2 striped yellow bags, 4 muted red bags. +dull fuchsia bags contain 5 dotted olive bags, 2 muted purple bags. +pale purple bags contain 4 posh silver bags, 4 wavy yellow bags. +bright olive bags contain 5 shiny fuchsia bags, 5 dull crimson bags, 5 drab red bags, 5 posh turquoise bags. +vibrant fuchsia bags contain 1 vibrant beige bag, 5 shiny magenta bags. +faded turquoise bags contain 5 light lime bags, 4 dark white bags. +plaid orange bags contain 5 vibrant coral bags, 4 light crimson bags, 4 plaid chartreuse bags, 1 dull green bag. +posh indigo bags contain 3 wavy green bags, 2 shiny orange bags, 5 faded violet bags, 2 dotted coral bags. +mirrored red bags contain 4 mirrored olive bags, 1 dark silver bag, 1 dull red bag. +dim salmon bags contain 1 striped salmon bag, 5 faded gray bags. +dim cyan bags contain 3 wavy olive bags, 5 drab purple bags, 3 mirrored bronze bags. +light blue bags contain 2 striped bronze bags, 4 dull white bags, 1 posh bronze bag. +dull turquoise bags contain 4 striped red bags, 1 light lavender bag, 5 plaid bronze bags, 1 mirrored brown bag. +vibrant coral bags contain 1 bright orange bag. +striped cyan bags contain 2 dark white bags, 4 drab red bags, 2 plaid salmon bags. +muted tomato bags contain 4 drab red bags, 3 vibrant silver bags, 4 clear fuchsia bags, 3 wavy white bags. +dotted red bags contain 1 light blue bag. +dark beige bags contain 2 posh lime bags, 3 striped black bags. +dark cyan bags contain 1 dim chartreuse bag, 2 shiny beige bags, 4 dotted magenta bags, 4 light chartreuse bags. +dull lime bags contain 3 muted chartreuse bags. +light brown bags contain 3 mirrored brown bags. +vibrant magenta bags contain 1 dim green bag. +shiny brown bags contain 5 bright brown bags, 3 faded cyan bags, 5 clear tan bags, 2 plaid maroon bags. +drab purple bags contain 1 shiny indigo bag, 4 striped yellow bags. From e6396d460624403642ef536c0010ed75190bf31f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 7 Dec 2020 07:09:28 +0100 Subject: [PATCH 092/479] 2020: d07: ex2: add solution --- 2020/d07/ex2/ex2.py | 64 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 2020/d07/ex2/ex2.py diff --git a/2020/d07/ex2/ex2.py b/2020/d07/ex2/ex2.py new file mode 100755 index 0000000..a955087 --- /dev/null +++ b/2020/d07/ex2/ex2.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python + +import re +import sys +from dataclasses import dataclass +from typing import Dict, List, Set, Tuple + + +@dataclass(eq=True, frozen=True) # Hashable +class ColorInfo: + num: int + color: str + + +Graph = Dict[str, Set[ColorInfo]] + + +def extract_info(line: str) -> Tuple[str, Set[ColorInfo]]: + color_pattern = re.compile("(.*) contain ") + match = color_pattern.search(line) + assert match is not None + color = match.group(1).replace("bags", "bag") + + line = line[match.end() : -1] # Remove period at end of line + + if line == "no other bags": + return color, set() + + colors: Set[ColorInfo] = set() + pattern = re.compile("([0-9]+) (.*)") + for col in line.split(", "): + match = pattern.search(col) + assert match is not None + colors |= { + ColorInfo(int(match.group(1)), match.group(2).replace("bags", "bag")) + } + + return color, colors + + +def to_graph(raw: List[str]) -> Graph: + return {color: inside for color, inside in map(extract_info, raw)} + + +def num_bags(graph: Graph, col: str) -> int: + return sum( + contained.num * (1 + num_bags(graph, contained.color)) + for contained in graph[col] + ) + + +def solve(raw: List[str]) -> int: + graph = to_graph(raw) + + return num_bags(graph, "shiny gold bag") + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From bc0ee515bad828229adb1845fec3340a6cb79e8d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 8 Dec 2020 08:23:25 +0100 Subject: [PATCH 093/479] 2020: d08: ex1: add input --- 2020/d08/ex1/input | 675 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 675 insertions(+) create mode 100644 2020/d08/ex1/input diff --git a/2020/d08/ex1/input b/2020/d08/ex1/input new file mode 100644 index 0000000..296e397 --- /dev/null +++ b/2020/d08/ex1/input @@ -0,0 +1,675 @@ +acc -8 +jmp +5 +acc +0 +acc +44 +acc +42 +jmp +324 +acc -17 +jmp +1 +acc -17 +jmp +51 +acc -13 +acc +4 +jmp +1 +nop +608 +jmp +274 +acc -17 +jmp +169 +acc +28 +nop +508 +jmp +1 +jmp +570 +acc +22 +acc -14 +jmp +377 +acc -13 +acc +27 +jmp +474 +acc -5 +jmp +1 +acc +12 +jmp +37 +jmp +184 +acc +36 +acc +32 +acc -8 +jmp +465 +acc -13 +acc +18 +jmp +169 +acc +20 +acc +26 +acc +23 +jmp +333 +jmp +584 +acc +9 +acc +28 +acc +28 +nop +571 +jmp +143 +acc +39 +acc +39 +acc -16 +jmp +361 +acc +48 +acc +3 +acc +15 +nop +4 +jmp +504 +acc +6 +jmp +285 +acc +26 +acc +33 +jmp +1 +acc +36 +jmp +577 +acc +36 +jmp +6 +nop +498 +acc +42 +jmp +496 +acc +10 +jmp +74 +acc +17 +acc +16 +acc +30 +jmp +254 +acc -3 +acc +16 +acc -2 +nop +106 +jmp +541 +acc -15 +jmp +579 +jmp +165 +acc +22 +acc -6 +acc +29 +acc -19 +jmp +342 +acc -19 +jmp +340 +acc +13 +acc +25 +acc +29 +jmp +269 +acc -14 +acc +27 +acc +41 +acc +49 +jmp +181 +nop +350 +jmp +1 +nop +437 +acc +34 +jmp +494 +acc +19 +acc +2 +acc +44 +jmp +558 +acc +10 +jmp +44 +nop +4 +nop -80 +nop +540 +jmp +16 +acc +28 +jmp +14 +acc +13 +nop +399 +acc +29 +nop -60 +jmp -6 +acc +41 +acc +30 +jmp +232 +acc +28 +nop +495 +acc +15 +acc +48 +jmp +157 +nop +483 +jmp -59 +acc +5 +acc +30 +acc +30 +acc +2 +jmp +349 +acc +11 +acc +27 +acc +1 +jmp +367 +acc +8 +acc +45 +acc +11 +jmp +171 +jmp -113 +acc +48 +jmp -38 +acc +12 +jmp +145 +acc +8 +nop +29 +nop +319 +jmp +154 +nop +166 +jmp +395 +nop +15 +jmp +237 +acc +22 +acc +3 +acc +42 +acc +1 +jmp +288 +jmp -63 +nop +489 +acc +33 +jmp +247 +jmp +1 +acc -8 +acc +9 +jmp +413 +acc -17 +acc +3 +acc +3 +jmp +432 +nop -17 +acc +36 +nop +198 +acc +45 +jmp +109 +nop +242 +acc +40 +acc +11 +jmp +448 +jmp +437 +acc +3 +acc +49 +acc +27 +jmp +221 +nop +158 +jmp +143 +acc +50 +jmp -70 +acc +46 +acc +8 +acc +35 +acc -3 +jmp +104 +acc +11 +acc +0 +jmp +34 +nop +132 +jmp +425 +jmp +219 +acc -12 +acc +48 +jmp +21 +jmp +434 +acc +30 +acc +1 +acc +40 +jmp +435 +jmp +132 +acc +40 +jmp +236 +jmp +179 +jmp -149 +acc +25 +acc +40 +acc -9 +acc +49 +jmp +445 +nop +399 +acc -14 +nop +374 +acc +0 +jmp +152 +acc +39 +nop +322 +acc +49 +nop +117 +jmp -19 +acc +24 +jmp +385 +acc +17 +acc +39 +acc +44 +acc -8 +jmp -58 +acc -18 +nop -76 +jmp +66 +acc +14 +jmp +427 +acc +11 +acc +47 +acc +9 +jmp +1 +acc +42 +jmp -7 +acc -16 +acc -13 +jmp +409 +acc +1 +acc +35 +acc +34 +jmp +371 +acc +24 +acc +46 +acc -4 +jmp +367 +acc +19 +acc +27 +acc -8 +acc +41 +jmp -184 +nop -185 +acc +23 +acc -8 +acc +35 +jmp -9 +acc -7 +nop -101 +nop +121 +acc +37 +jmp -72 +acc +24 +jmp +1 +nop -124 +jmp +163 +acc +37 +acc -12 +jmp +331 +acc -12 +acc +1 +jmp +232 +jmp -233 +jmp -72 +acc +28 +jmp +169 +acc +43 +acc +18 +nop +108 +jmp -184 +acc -4 +acc -10 +nop +317 +acc +48 +jmp +173 +nop +45 +jmp -73 +acc +35 +jmp +198 +acc -15 +acc +46 +acc +31 +jmp +41 +nop +169 +jmp +1 +nop -92 +nop -271 +jmp -113 +jmp +1 +nop -42 +jmp +42 +nop -283 +acc +22 +nop +200 +jmp -17 +jmp +1 +acc +49 +nop +35 +nop -185 +jmp +298 +acc +1 +jmp +1 +nop +301 +acc +19 +jmp -34 +jmp +163 +jmp +1 +acc +49 +jmp -115 +jmp -62 +acc +8 +acc +5 +acc -6 +jmp -146 +acc -4 +nop -202 +acc +47 +jmp -114 +acc +8 +jmp +57 +acc +37 +jmp +61 +jmp +267 +acc +2 +acc +28 +nop -20 +jmp -186 +acc +24 +nop +269 +acc +48 +acc +45 +jmp -22 +acc +11 +acc +36 +jmp -267 +acc +7 +nop -45 +nop -231 +jmp +32 +nop +220 +acc +19 +jmp -250 +acc +33 +jmp -169 +acc +45 +acc -13 +acc +0 +acc +44 +jmp +6 +acc +42 +jmp +84 +acc +48 +jmp -332 +jmp +213 +acc -16 +acc +31 +acc +17 +acc +3 +jmp -75 +jmp +1 +acc +11 +acc +4 +jmp -271 +acc -12 +nop +97 +nop +11 +jmp -43 +acc +30 +jmp +1 +jmp +49 +jmp -379 +nop -51 +acc +0 +acc -8 +nop -191 +jmp -346 +jmp -255 +acc +2 +acc +21 +acc -16 +nop +217 +jmp -30 +acc +31 +jmp -270 +jmp -324 +jmp +130 +acc +49 +nop +179 +jmp -37 +acc +11 +acc +15 +acc +29 +acc +17 +jmp -237 +acc +47 +acc -13 +acc +6 +jmp +169 +nop +54 +acc -12 +jmp -233 +nop +33 +acc +17 +acc +14 +acc +21 +jmp -275 +acc -8 +acc +1 +nop +229 +jmp +1 +jmp +119 +jmp -193 +nop +217 +jmp +95 +acc -2 +acc +1 +acc +41 +jmp -332 +acc +44 +nop -343 +acc +23 +jmp -165 +acc +7 +acc -12 +nop -339 +jmp +9 +nop -390 +acc -17 +acc +43 +jmp -138 +nop -247 +acc +42 +acc +0 +jmp +170 +acc +48 +jmp -139 +acc +6 +acc +13 +acc +35 +jmp -85 +nop -117 +jmp -307 +acc +25 +acc -10 +acc -14 +acc +0 +jmp -355 +jmp +102 +acc -8 +acc +47 +acc +36 +jmp +42 +acc +33 +acc +17 +acc +46 +jmp -331 +jmp +1 +acc -11 +jmp +1 +acc +27 +jmp +147 +acc -14 +nop -28 +acc +32 +jmp -482 +acc +11 +nop -390 +jmp -485 +acc -12 +acc +37 +acc +33 +acc +28 +jmp -32 +acc +42 +acc -11 +jmp -460 +acc +36 +acc +6 +acc +39 +jmp +80 +nop +123 +acc -13 +jmp -97 +acc +25 +acc +46 +acc +13 +nop -450 +jmp +84 +acc +3 +nop -260 +jmp +1 +acc +22 +jmp -510 +acc -4 +acc +17 +acc -19 +jmp -420 +acc -14 +acc +26 +acc +29 +acc +17 +jmp -458 +acc -10 +acc +23 +nop -2 +jmp -196 +acc -5 +jmp -416 +acc +49 +jmp -165 +acc +4 +acc +7 +acc +20 +nop -217 +jmp +103 +jmp +5 +acc -1 +acc +2 +jmp +1 +jmp +84 +acc -14 +jmp -518 +jmp +1 +acc +30 +acc +21 +jmp -202 +nop -18 +jmp -344 +jmp -88 +nop -472 +acc -5 +acc +13 +jmp -295 +nop -315 +acc +41 +nop -317 +jmp -299 +nop +105 +jmp -86 +acc +7 +jmp -226 +nop -277 +acc +21 +acc +13 +acc +47 +jmp -283 +acc -11 +acc -1 +jmp -408 +acc +47 +nop -553 +acc +37 +acc -11 +jmp -468 +acc +43 +nop -299 +acc +40 +acc +2 +jmp -275 +acc +24 +acc -14 +acc +13 +acc +36 +jmp -249 +acc +35 +jmp -45 +acc +47 +acc +31 +acc -19 +jmp -151 +jmp -33 +acc +6 +jmp -160 +jmp -553 +acc +25 +jmp +1 +nop -267 +jmp -430 +acc +23 +nop +63 +acc +37 +jmp -434 +nop -579 +jmp +11 +acc +25 +acc -17 +acc +22 +acc +27 +jmp +15 +jmp -546 +acc -4 +acc +41 +acc +0 +jmp -261 +acc +20 +jmp -404 +jmp -408 +acc +26 +jmp -464 +acc +34 +nop -80 +acc -12 +jmp -43 +jmp -410 +acc -13 +acc -3 +jmp -310 +nop -433 +acc -7 +acc -11 +acc +9 +jmp -29 +nop -564 +acc -5 +acc -16 +acc +36 +jmp -587 +jmp -115 +acc +24 +acc +35 +nop -638 +jmp -573 +acc +31 +acc +14 +jmp -609 +acc +25 +acc -10 +acc +18 +jmp -308 +acc +25 +acc +33 +acc +21 +acc -12 +jmp -172 +nop -37 +acc +12 +jmp -316 +acc +41 +acc +14 +jmp -415 +acc +40 +jmp -112 +jmp -613 +acc +26 +nop -151 +jmp -471 +acc +50 +acc +16 +nop -119 +acc +46 +jmp +1 From 1aa61998796394762aa8027412e9c0339949b2a3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 8 Dec 2020 08:23:38 +0100 Subject: [PATCH 094/479] 2020: d08: ex1: add solution --- 2020/d08/ex1/ex1.py | 51 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100755 2020/d08/ex1/ex1.py diff --git a/2020/d08/ex1/ex1.py b/2020/d08/ex1/ex1.py new file mode 100755 index 0000000..a2394fa --- /dev/null +++ b/2020/d08/ex1/ex1.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + + +import sys +from typing import List, Tuple + + +def run(code: List[Tuple[str, int]]) -> int: + accumulator = 0 + rip = 0 + + def acc(val: int) -> None: + nonlocal accumulator + nonlocal rip + accumulator += val + rip += 1 + + def nop(val: int) -> None: + nonlocal rip + rip += 1 + + def jmp(val: int) -> None: + nonlocal rip + rip += val + + instrs = { + "acc": acc, + "jmp": jmp, + "nop": nop, + } + seen = set() + + while rip not in seen: + seen |= {rip} + func = instrs[code[rip][0]] + func(code[rip][1]) + + return accumulator + + +def solve(raw: List[str]) -> int: + return run([(line[:3], int(line[3:])) for line in raw]) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From e07ca6ed2e91626424eaa6bab13cbcf59f41d7a9 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 8 Dec 2020 08:23:46 +0100 Subject: [PATCH 095/479] 2020: d08: ex2: add input --- 2020/d08/ex2/input | 675 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 675 insertions(+) create mode 100644 2020/d08/ex2/input diff --git a/2020/d08/ex2/input b/2020/d08/ex2/input new file mode 100644 index 0000000..296e397 --- /dev/null +++ b/2020/d08/ex2/input @@ -0,0 +1,675 @@ +acc -8 +jmp +5 +acc +0 +acc +44 +acc +42 +jmp +324 +acc -17 +jmp +1 +acc -17 +jmp +51 +acc -13 +acc +4 +jmp +1 +nop +608 +jmp +274 +acc -17 +jmp +169 +acc +28 +nop +508 +jmp +1 +jmp +570 +acc +22 +acc -14 +jmp +377 +acc -13 +acc +27 +jmp +474 +acc -5 +jmp +1 +acc +12 +jmp +37 +jmp +184 +acc +36 +acc +32 +acc -8 +jmp +465 +acc -13 +acc +18 +jmp +169 +acc +20 +acc +26 +acc +23 +jmp +333 +jmp +584 +acc +9 +acc +28 +acc +28 +nop +571 +jmp +143 +acc +39 +acc +39 +acc -16 +jmp +361 +acc +48 +acc +3 +acc +15 +nop +4 +jmp +504 +acc +6 +jmp +285 +acc +26 +acc +33 +jmp +1 +acc +36 +jmp +577 +acc +36 +jmp +6 +nop +498 +acc +42 +jmp +496 +acc +10 +jmp +74 +acc +17 +acc +16 +acc +30 +jmp +254 +acc -3 +acc +16 +acc -2 +nop +106 +jmp +541 +acc -15 +jmp +579 +jmp +165 +acc +22 +acc -6 +acc +29 +acc -19 +jmp +342 +acc -19 +jmp +340 +acc +13 +acc +25 +acc +29 +jmp +269 +acc -14 +acc +27 +acc +41 +acc +49 +jmp +181 +nop +350 +jmp +1 +nop +437 +acc +34 +jmp +494 +acc +19 +acc +2 +acc +44 +jmp +558 +acc +10 +jmp +44 +nop +4 +nop -80 +nop +540 +jmp +16 +acc +28 +jmp +14 +acc +13 +nop +399 +acc +29 +nop -60 +jmp -6 +acc +41 +acc +30 +jmp +232 +acc +28 +nop +495 +acc +15 +acc +48 +jmp +157 +nop +483 +jmp -59 +acc +5 +acc +30 +acc +30 +acc +2 +jmp +349 +acc +11 +acc +27 +acc +1 +jmp +367 +acc +8 +acc +45 +acc +11 +jmp +171 +jmp -113 +acc +48 +jmp -38 +acc +12 +jmp +145 +acc +8 +nop +29 +nop +319 +jmp +154 +nop +166 +jmp +395 +nop +15 +jmp +237 +acc +22 +acc +3 +acc +42 +acc +1 +jmp +288 +jmp -63 +nop +489 +acc +33 +jmp +247 +jmp +1 +acc -8 +acc +9 +jmp +413 +acc -17 +acc +3 +acc +3 +jmp +432 +nop -17 +acc +36 +nop +198 +acc +45 +jmp +109 +nop +242 +acc +40 +acc +11 +jmp +448 +jmp +437 +acc +3 +acc +49 +acc +27 +jmp +221 +nop +158 +jmp +143 +acc +50 +jmp -70 +acc +46 +acc +8 +acc +35 +acc -3 +jmp +104 +acc +11 +acc +0 +jmp +34 +nop +132 +jmp +425 +jmp +219 +acc -12 +acc +48 +jmp +21 +jmp +434 +acc +30 +acc +1 +acc +40 +jmp +435 +jmp +132 +acc +40 +jmp +236 +jmp +179 +jmp -149 +acc +25 +acc +40 +acc -9 +acc +49 +jmp +445 +nop +399 +acc -14 +nop +374 +acc +0 +jmp +152 +acc +39 +nop +322 +acc +49 +nop +117 +jmp -19 +acc +24 +jmp +385 +acc +17 +acc +39 +acc +44 +acc -8 +jmp -58 +acc -18 +nop -76 +jmp +66 +acc +14 +jmp +427 +acc +11 +acc +47 +acc +9 +jmp +1 +acc +42 +jmp -7 +acc -16 +acc -13 +jmp +409 +acc +1 +acc +35 +acc +34 +jmp +371 +acc +24 +acc +46 +acc -4 +jmp +367 +acc +19 +acc +27 +acc -8 +acc +41 +jmp -184 +nop -185 +acc +23 +acc -8 +acc +35 +jmp -9 +acc -7 +nop -101 +nop +121 +acc +37 +jmp -72 +acc +24 +jmp +1 +nop -124 +jmp +163 +acc +37 +acc -12 +jmp +331 +acc -12 +acc +1 +jmp +232 +jmp -233 +jmp -72 +acc +28 +jmp +169 +acc +43 +acc +18 +nop +108 +jmp -184 +acc -4 +acc -10 +nop +317 +acc +48 +jmp +173 +nop +45 +jmp -73 +acc +35 +jmp +198 +acc -15 +acc +46 +acc +31 +jmp +41 +nop +169 +jmp +1 +nop -92 +nop -271 +jmp -113 +jmp +1 +nop -42 +jmp +42 +nop -283 +acc +22 +nop +200 +jmp -17 +jmp +1 +acc +49 +nop +35 +nop -185 +jmp +298 +acc +1 +jmp +1 +nop +301 +acc +19 +jmp -34 +jmp +163 +jmp +1 +acc +49 +jmp -115 +jmp -62 +acc +8 +acc +5 +acc -6 +jmp -146 +acc -4 +nop -202 +acc +47 +jmp -114 +acc +8 +jmp +57 +acc +37 +jmp +61 +jmp +267 +acc +2 +acc +28 +nop -20 +jmp -186 +acc +24 +nop +269 +acc +48 +acc +45 +jmp -22 +acc +11 +acc +36 +jmp -267 +acc +7 +nop -45 +nop -231 +jmp +32 +nop +220 +acc +19 +jmp -250 +acc +33 +jmp -169 +acc +45 +acc -13 +acc +0 +acc +44 +jmp +6 +acc +42 +jmp +84 +acc +48 +jmp -332 +jmp +213 +acc -16 +acc +31 +acc +17 +acc +3 +jmp -75 +jmp +1 +acc +11 +acc +4 +jmp -271 +acc -12 +nop +97 +nop +11 +jmp -43 +acc +30 +jmp +1 +jmp +49 +jmp -379 +nop -51 +acc +0 +acc -8 +nop -191 +jmp -346 +jmp -255 +acc +2 +acc +21 +acc -16 +nop +217 +jmp -30 +acc +31 +jmp -270 +jmp -324 +jmp +130 +acc +49 +nop +179 +jmp -37 +acc +11 +acc +15 +acc +29 +acc +17 +jmp -237 +acc +47 +acc -13 +acc +6 +jmp +169 +nop +54 +acc -12 +jmp -233 +nop +33 +acc +17 +acc +14 +acc +21 +jmp -275 +acc -8 +acc +1 +nop +229 +jmp +1 +jmp +119 +jmp -193 +nop +217 +jmp +95 +acc -2 +acc +1 +acc +41 +jmp -332 +acc +44 +nop -343 +acc +23 +jmp -165 +acc +7 +acc -12 +nop -339 +jmp +9 +nop -390 +acc -17 +acc +43 +jmp -138 +nop -247 +acc +42 +acc +0 +jmp +170 +acc +48 +jmp -139 +acc +6 +acc +13 +acc +35 +jmp -85 +nop -117 +jmp -307 +acc +25 +acc -10 +acc -14 +acc +0 +jmp -355 +jmp +102 +acc -8 +acc +47 +acc +36 +jmp +42 +acc +33 +acc +17 +acc +46 +jmp -331 +jmp +1 +acc -11 +jmp +1 +acc +27 +jmp +147 +acc -14 +nop -28 +acc +32 +jmp -482 +acc +11 +nop -390 +jmp -485 +acc -12 +acc +37 +acc +33 +acc +28 +jmp -32 +acc +42 +acc -11 +jmp -460 +acc +36 +acc +6 +acc +39 +jmp +80 +nop +123 +acc -13 +jmp -97 +acc +25 +acc +46 +acc +13 +nop -450 +jmp +84 +acc +3 +nop -260 +jmp +1 +acc +22 +jmp -510 +acc -4 +acc +17 +acc -19 +jmp -420 +acc -14 +acc +26 +acc +29 +acc +17 +jmp -458 +acc -10 +acc +23 +nop -2 +jmp -196 +acc -5 +jmp -416 +acc +49 +jmp -165 +acc +4 +acc +7 +acc +20 +nop -217 +jmp +103 +jmp +5 +acc -1 +acc +2 +jmp +1 +jmp +84 +acc -14 +jmp -518 +jmp +1 +acc +30 +acc +21 +jmp -202 +nop -18 +jmp -344 +jmp -88 +nop -472 +acc -5 +acc +13 +jmp -295 +nop -315 +acc +41 +nop -317 +jmp -299 +nop +105 +jmp -86 +acc +7 +jmp -226 +nop -277 +acc +21 +acc +13 +acc +47 +jmp -283 +acc -11 +acc -1 +jmp -408 +acc +47 +nop -553 +acc +37 +acc -11 +jmp -468 +acc +43 +nop -299 +acc +40 +acc +2 +jmp -275 +acc +24 +acc -14 +acc +13 +acc +36 +jmp -249 +acc +35 +jmp -45 +acc +47 +acc +31 +acc -19 +jmp -151 +jmp -33 +acc +6 +jmp -160 +jmp -553 +acc +25 +jmp +1 +nop -267 +jmp -430 +acc +23 +nop +63 +acc +37 +jmp -434 +nop -579 +jmp +11 +acc +25 +acc -17 +acc +22 +acc +27 +jmp +15 +jmp -546 +acc -4 +acc +41 +acc +0 +jmp -261 +acc +20 +jmp -404 +jmp -408 +acc +26 +jmp -464 +acc +34 +nop -80 +acc -12 +jmp -43 +jmp -410 +acc -13 +acc -3 +jmp -310 +nop -433 +acc -7 +acc -11 +acc +9 +jmp -29 +nop -564 +acc -5 +acc -16 +acc +36 +jmp -587 +jmp -115 +acc +24 +acc +35 +nop -638 +jmp -573 +acc +31 +acc +14 +jmp -609 +acc +25 +acc -10 +acc +18 +jmp -308 +acc +25 +acc +33 +acc +21 +acc -12 +jmp -172 +nop -37 +acc +12 +jmp -316 +acc +41 +acc +14 +jmp -415 +acc +40 +jmp -112 +jmp -613 +acc +26 +nop -151 +jmp -471 +acc +50 +acc +16 +nop -119 +acc +46 +jmp +1 From c81bc2c5d8e81c3d27914c9fba9b4f60de676d1c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 8 Dec 2020 08:24:09 +0100 Subject: [PATCH 096/479] 2020: d08: ex2: add solution --- 2020/d08/ex2/ex2.py | 62 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 2020/d08/ex2/ex2.py diff --git a/2020/d08/ex2/ex2.py b/2020/d08/ex2/ex2.py new file mode 100755 index 0000000..bba650d --- /dev/null +++ b/2020/d08/ex2/ex2.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python + + +import sys +from copy import deepcopy +from typing import List, Tuple + + +def run(code: List[Tuple[str, int]]) -> Tuple[int, bool]: + accumulator = 0 + rip = 0 + + def acc(val: int) -> None: + nonlocal accumulator + nonlocal rip + accumulator += val + rip += 1 + + def nop(val: int) -> None: + nonlocal rip + rip += 1 + + def jmp(val: int) -> None: + nonlocal rip + rip += val + + instrs = { + "acc": acc, + "jmp": jmp, + "nop": nop, + } + seen = set() + + while rip not in seen and rip < len(code): + seen |= {rip} + func = instrs[code[rip][0]] + func(code[rip][1]) + + return accumulator, rip == len(code) + + +def solve(raw: List[str]) -> int: + code = [(line[:3], int(line[3:])) for line in raw] + lut = {"jmp": "nop", "nop": "jmp"} + for i in range(len(code)): + if code[i][0] not in lut: + continue + new_code = deepcopy(code) + new_code[i] = lut[new_code[i][0]], new_code[i][1] + val, halted = run(new_code) + if halted: + return val + assert False # Sanity check + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From e8bda4380d6330fe8bd9b72e1485d8ed76d1c1dd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 9 Dec 2020 09:10:32 +0100 Subject: [PATCH 097/479] 2020: d09: ex1: add input --- 2020/d09/ex1/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2020/d09/ex1/input diff --git a/2020/d09/ex1/input b/2020/d09/ex1/input new file mode 100644 index 0000000..ca43231 --- /dev/null +++ b/2020/d09/ex1/input @@ -0,0 +1,1000 @@ +21 +32 +15 +49 +19 +30 +50 +40 +33 +45 +11 +42 +26 +10 +12 +5 +4 +1 +27 +17 +41 +43 +14 +29 +18 +6 +24 +16 +28 +7 +8 +31 +44 +9 +13 +30 +85 +11 +22 +10 +48 +70 +15 +19 +20 +17 +21 +25 +14 +23 +18 +26 +104 +37 +16 +24 +27 +28 +29 +31 +32 +44 +30 +46 +39 +33 +35 +34 +42 +36 +38 +47 +72 +40 +41 +43 +60 +45 +48 +49 +51 +55 +73 +59 +69 +62 +63 +65 +71 +67 +68 +89 +70 +74 +78 +160 +81 +83 +136 +90 +117 +130 +99 +115 +100 +106 +118 +152 +121 +161 +219 +184 +133 +142 +145 +146 +159 +164 +155 +168 +171 +217 +381 +252 +189 +633 +205 +199 +246 +221 +224 +239 +301 +254 +459 +275 +304 +323 +287 +291 +588 +392 +319 +326 +475 +388 +711 +394 +404 +695 +429 +420 +540 +526 +445 +692 +849 +1066 +529 +562 +566 +578 +675 +1007 +970 +718 +723 +645 +865 +814 +792 +798 +823 +824 +1247 +874 +946 +971 +1398 +1597 +1174 +1140 +1241 +1091 +1128 +1211 +1689 +1738 +1363 +1437 +2995 +1368 +1443 +2263 +1770 +1926 +1951 +2145 +1698 +1820 +1845 +1917 +2062 +2219 +2574 +2826 +2911 +2302 +2339 +2491 +4109 +3066 +3175 +3934 +2805 +2811 +3141 +6079 +3468 +3543 +3518 +3665 +4122 +4219 +3737 +3762 +3979 +5967 +4558 +4641 +4793 +8418 +6424 +8328 +5557 +8101 +5616 +11065 +7477 +6279 +5952 +6609 +11250 +11072 +7762 +7859 +10745 +7499 +7716 +7741 +15863 +14138 +10510 +15027 +10593 +10350 +11173 +12231 +11895 +15239 +14041 +11568 +12888 +23068 +12561 +21995 +14108 +25772 +15215 +15240 +15358 +15457 +22581 +18066 +29971 +20860 +24783 +21523 +26922 +33563 +21918 +22741 +30672 +23463 +24129 +24456 +26783 +30455 +26669 +51494 +29323 +29348 +30573 +46129 +68710 +30815 +38926 +43601 +51266 +53434 +44989 +43441 +44264 +60020 +46374 +50132 +49410 +47592 +53452 +48585 +77935 +60163 +55992 +56017 +58671 +59921 +81839 +86518 +96875 +96255 +78407 +82367 +91363 +87705 +89253 +88430 +89815 +94396 +98717 +106537 +143847 +142705 +96177 +102037 +104577 +115938 +114663 +190573 +118592 +186944 +138328 +179068 +160774 +166837 +171620 +176958 +170072 +261297 +176135 +177683 +234505 +184211 +193113 +202714 +411463 +219240 +293621 +198214 +206614 +271414 +285429 +233255 +256920 +302803 +299102 +391327 +382749 +327611 +341692 +380397 +346207 +347755 +353818 +396923 +361894 +631428 +504669 +395827 +400928 +404828 +431469 +491835 +439869 +463534 +490175 +518684 +532357 +556022 +669303 +730504 +903777 +710360 +675366 +1088379 +693962 +701573 +1361932 +715712 +840797 +757721 +796755 +800655 +805756 +1019556 +836297 +995891 +1363265 +1551913 +1179246 +1205887 +1051041 +1257595 +1433087 +1344669 +1606411 +1369328 +1395535 +1376939 +1409674 +1417285 +1502228 +1473433 +1832188 +2302883 +1554476 +1597410 +1636952 +2182695 +2042184 +1887338 +2547804 +2588920 +3209127 +2230287 +2256928 +2446576 +2764863 +4618801 +2713997 +2746267 +4421108 +2974349 +3998594 +3524290 +2890718 +3389566 +4299112 +3939835 +3151886 +4763603 +4144266 +3819647 +4070033 +3929522 +4117625 +6363915 +5021791 +4970925 +4487215 +5160573 +5192843 +5460264 +6971533 +5604715 +5636985 +7377933 +5865067 +7221919 +7453812 +7081408 +6541452 +7091721 +7269511 +7639101 +8951313 +9935100 +10470974 +7999555 +8416737 +8604840 +9458140 +9509006 +12241981 +15638656 +15663817 +17556153 +11097249 +15146292 +14491430 +18886413 +15080963 +23096270 +16476552 +14361232 +24962404 +15269066 +14730822 +32601505 +16416292 +20658718 +16604395 +17021577 +17457695 +26366315 +18062980 +30810109 +38734926 +30932883 +25458481 +29222252 +26243541 +25588679 +28852662 +29092054 +51591601 +29442195 +30837784 +29630298 +39323636 +29999888 +32290643 +38116413 +33020687 +33437869 +33625972 +34062090 +43387892 +43046374 +62462882 +55030874 +51047160 +54680733 +51702022 +54810931 +58074914 +55096203 +71614279 +64275653 +58534249 +59072493 +59442083 +77449982 +98077248 +105858091 +87386846 +65311330 +66458556 +66646659 +67063841 +67688062 +85109250 +98198823 +160661705 +102749182 +118160578 +105727893 +106798225 +106512953 +150420580 +165765310 +212371044 +154450687 +172496096 +117606742 +125531049 +126088742 +131769886 +131957989 +132375171 +333157801 +132999392 +227120261 +133015568 +190837143 +250622310 +183308073 +263964133 +212240846 +208477075 +212526118 +223334635 +213311178 +224119695 +243137791 +329847588 +243695484 +249376628 +259088134 +249564731 +251619791 +339399920 +263727875 +264333160 +436645813 +357135263 +266014960 +442456934 +580469898 +414171778 +391785148 +395548919 +420717921 +425837296 +421788253 +435860753 +644837616 +492702522 +467257486 +486833275 +493072112 +493260215 +498941359 +501184522 +513292606 +515347666 +603733080 +748920411 +530348120 +623150223 +752684182 +657800108 +1070674912 +787334067 +805956926 +812503069 +816266840 +887975407 +847625549 +857649006 +1302681733 +954090761 +966198845 +1801716310 +979905387 +992201574 +1596545960 +1014289025 +1014477128 +1043640726 +1045695786 +2024765673 +1372070634 +1188148228 +1280950331 +1830555865 +1463757034 +1700478476 +1593290993 +1618459995 +1628769909 +1972106961 +1705274555 +1811739767 +1823847851 +1946104232 +1920289606 +2035842300 +2364272208 +3215005955 +2006490599 +2611023088 +2028766153 +3293769469 +2233844014 +2326646117 +2469098559 +2560218862 +2651905262 +2744707365 +4885749276 +3057048027 +3211750988 +3222060902 +3840505920 +3334044464 +5421320235 +5945067552 +5023490755 +3949055759 +3866393838 +7052256908 +8414166111 +4035256752 +4240334613 +9002115579 +4262610167 +12842621499 +4794062876 +11562334441 +4978551379 +5029317421 +10923618931 +5396612627 +5801755392 +6268799015 +9823380297 +6556105366 +7062566822 +12081574329 +7200438302 +8106728451 +9056673043 +7815449597 +7901650590 +9772614255 +8275591365 +8297866919 +9064574173 +8502944780 +9241161546 +9291927588 +10007868800 +19064541843 +10780306771 +12794000976 +10425930048 +13672203992 +11198368019 +15307166753 +13469237317 +19282012631 +13618672188 +14263005124 +16573458284 +15015887899 +28837156098 +15717100187 +21434121785 +16404595370 +16778536145 +19496234938 +35213335125 +27771826303 +17744106326 +34080429742 +21206236819 +24044602236 +21624298067 +32965472255 +30245662276 +23895167365 +31420483269 +24667605336 +28634560087 +27087909505 +29278893023 +29980105311 +48712207572 +30732988086 +31794424044 +32121695557 +37240341264 +51414227096 +33183131515 +48978063122 +51824536068 +38950343145 +39368404393 +45250839055 +49840796906 +103238763164 +45519465432 +127133930529 +56462029380 +48562772701 +50983076870 +69034765308 +64328250769 +71162828437 +56366802528 +77641160989 +76190684409 +67973329350 +82491180319 +63916119601 +78318747538 +70423472779 +95360262338 +87513115846 +88791140051 +84201182200 +109847716201 +140106804010 +140518935178 +96502542302 +113492794782 +94082238133 +139458238087 +177821045551 +99545849571 +107349879398 +120695053297 +120282922129 +124340131878 +126790275307 +189841059717 +131889448951 +148742220317 +134339592380 +185668626936 +154624654979 +157936588625 +171714298046 +172992322251 +326338953025 +191551061598 +190584780435 +326563265868 +347777648342 +193628087704 +201432117531 +214777291430 +453129228332 +206895728969 +219828771700 +227632801527 +240977975426 +541116244455 +258679724258 +339327000752 +266229041331 +334410847253 +283081812697 +288964247359 +312561243604 +397480509404 +329650886671 +344706620297 +363577102686 +382135842033 +476709900401 +426724500669 +395060205235 +546138737828 +400523816673 +553539219030 +455755266856 +541761536955 +434528530496 +636038180661 +468610776953 +499657699684 +524908765589 +547643971617 +555193288690 +549310854028 +572046060056 +709806313366 +723492777855 +642212130275 +874190409805 +798261663624 +708283722983 +745712944719 +907044607622 +856279083529 +980667268324 +1005066120884 +835052347169 +1421834381422 +890283797352 +903139307449 +1047301671301 +934186230180 +1403923055146 +1017921630981 +1024566465273 +1072552737206 +1096954825645 +1104504142718 +2428489520419 +1660133761256 +1418090036349 +1350495853258 +1387925074994 +1453996667702 +1506545386607 +1543336070152 +1601992028248 +1691331430698 +1738191654618 +1725336144521 +1824470027532 +2144256496946 +2278208872346 +1793423104801 +1975692044655 +1958752695453 +2006738967386 +3549806172053 +2042488096254 +2097119202479 +2460477812200 +2201458968363 +2454999995976 +2768585889607 +4185813956721 +2738420928252 +4497488092230 +2841921742696 +2960542054309 +4476612582870 +4479667840709 +7440209895018 +3562661682150 +3752175800254 +3617893132333 +6404583424846 +4635344847497 +4208197935749 +4848660710082 +3965491662839 +4001240791707 +4049227063640 +7803707089054 +6023139494350 +4298578170842 +5162001022672 +4970044857970 +5415542050285 +6807413405535 +5580342670948 +8843542783246 +6843162534403 +5802463797005 +7168739990058 +7180554814483 +8209438727456 +7528153344989 +7314837482404 +7370068932587 +7826091068082 +7966732454546 +14696893335047 +15494885799535 +8014718726479 +11777458263505 +8050467855347 +8347805234482 +9268623028812 +11467318160900 +10101041967847 +10132045880642 +10385586908255 +22338048333938 +17319090884159 +12423505205351 +12971203787063 +12645626331408 +12983018611488 +14349294804541 +14495392296887 +14684906414991 +19092295745909 +15281569936950 +15336801387133 +28319819998621 +15981451181025 +35073746926934 +16065186581826 +20438223931830 +18151509823194 +16398273089829 +18448847202329 +25394708992414 +23356790695318 +20233087848489 +24880979205142 +22809092113606 +25069131536759 +25406523816839 +25628644942896 +25616830118471 +36339809306806 +30560578878713 +28844687101428 +29180298711878 +53936650117092 +34429097133042 +58024985813306 +33785648589462 +32046637762851 +90276459423898 +32463459671655 +50495484965180 +34549782913023 +34847120292158 +36631360938318 +41805637897647 +47878223650365 +50475655353598 +43042179962095 +51989390825484 +59402478707933 +57115769299610 +51023353935310 +54461517219899 +54797128830349 +59740877590591 +59405265980141 From efe0bb2b4bde6ceb6d0a585c642eb5f2b055dcac Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 9 Dec 2020 09:10:46 +0100 Subject: [PATCH 098/479] 2020: d09: ex1: add solution --- 2020/d09/ex1/ex1.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100755 2020/d09/ex1/ex1.py diff --git a/2020/d09/ex1/ex1.py b/2020/d09/ex1/ex1.py new file mode 100755 index 0000000..318e38f --- /dev/null +++ b/2020/d09/ex1/ex1.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + + +import itertools +import sys +from typing import List + + +def find_invalid(nums: List[int]) -> int: + for i in range(25, len(nums)): + num = nums[i] + found = False + for lhs, rhs in itertools.combinations(nums[i - 25 : i], 2): + if lhs + rhs == num: + found = True + break + if not found: + return num + assert False # Sanity check + + +def solve(raw: List[str]) -> int: + return find_invalid([int(line) for line in raw]) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From ec31ee08e721ead6cc73743d815eb0519347997d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 9 Dec 2020 09:11:16 +0100 Subject: [PATCH 099/479] 2020: d09: ex2: add input --- 2020/d09/ex2/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2020/d09/ex2/input diff --git a/2020/d09/ex2/input b/2020/d09/ex2/input new file mode 100644 index 0000000..ca43231 --- /dev/null +++ b/2020/d09/ex2/input @@ -0,0 +1,1000 @@ +21 +32 +15 +49 +19 +30 +50 +40 +33 +45 +11 +42 +26 +10 +12 +5 +4 +1 +27 +17 +41 +43 +14 +29 +18 +6 +24 +16 +28 +7 +8 +31 +44 +9 +13 +30 +85 +11 +22 +10 +48 +70 +15 +19 +20 +17 +21 +25 +14 +23 +18 +26 +104 +37 +16 +24 +27 +28 +29 +31 +32 +44 +30 +46 +39 +33 +35 +34 +42 +36 +38 +47 +72 +40 +41 +43 +60 +45 +48 +49 +51 +55 +73 +59 +69 +62 +63 +65 +71 +67 +68 +89 +70 +74 +78 +160 +81 +83 +136 +90 +117 +130 +99 +115 +100 +106 +118 +152 +121 +161 +219 +184 +133 +142 +145 +146 +159 +164 +155 +168 +171 +217 +381 +252 +189 +633 +205 +199 +246 +221 +224 +239 +301 +254 +459 +275 +304 +323 +287 +291 +588 +392 +319 +326 +475 +388 +711 +394 +404 +695 +429 +420 +540 +526 +445 +692 +849 +1066 +529 +562 +566 +578 +675 +1007 +970 +718 +723 +645 +865 +814 +792 +798 +823 +824 +1247 +874 +946 +971 +1398 +1597 +1174 +1140 +1241 +1091 +1128 +1211 +1689 +1738 +1363 +1437 +2995 +1368 +1443 +2263 +1770 +1926 +1951 +2145 +1698 +1820 +1845 +1917 +2062 +2219 +2574 +2826 +2911 +2302 +2339 +2491 +4109 +3066 +3175 +3934 +2805 +2811 +3141 +6079 +3468 +3543 +3518 +3665 +4122 +4219 +3737 +3762 +3979 +5967 +4558 +4641 +4793 +8418 +6424 +8328 +5557 +8101 +5616 +11065 +7477 +6279 +5952 +6609 +11250 +11072 +7762 +7859 +10745 +7499 +7716 +7741 +15863 +14138 +10510 +15027 +10593 +10350 +11173 +12231 +11895 +15239 +14041 +11568 +12888 +23068 +12561 +21995 +14108 +25772 +15215 +15240 +15358 +15457 +22581 +18066 +29971 +20860 +24783 +21523 +26922 +33563 +21918 +22741 +30672 +23463 +24129 +24456 +26783 +30455 +26669 +51494 +29323 +29348 +30573 +46129 +68710 +30815 +38926 +43601 +51266 +53434 +44989 +43441 +44264 +60020 +46374 +50132 +49410 +47592 +53452 +48585 +77935 +60163 +55992 +56017 +58671 +59921 +81839 +86518 +96875 +96255 +78407 +82367 +91363 +87705 +89253 +88430 +89815 +94396 +98717 +106537 +143847 +142705 +96177 +102037 +104577 +115938 +114663 +190573 +118592 +186944 +138328 +179068 +160774 +166837 +171620 +176958 +170072 +261297 +176135 +177683 +234505 +184211 +193113 +202714 +411463 +219240 +293621 +198214 +206614 +271414 +285429 +233255 +256920 +302803 +299102 +391327 +382749 +327611 +341692 +380397 +346207 +347755 +353818 +396923 +361894 +631428 +504669 +395827 +400928 +404828 +431469 +491835 +439869 +463534 +490175 +518684 +532357 +556022 +669303 +730504 +903777 +710360 +675366 +1088379 +693962 +701573 +1361932 +715712 +840797 +757721 +796755 +800655 +805756 +1019556 +836297 +995891 +1363265 +1551913 +1179246 +1205887 +1051041 +1257595 +1433087 +1344669 +1606411 +1369328 +1395535 +1376939 +1409674 +1417285 +1502228 +1473433 +1832188 +2302883 +1554476 +1597410 +1636952 +2182695 +2042184 +1887338 +2547804 +2588920 +3209127 +2230287 +2256928 +2446576 +2764863 +4618801 +2713997 +2746267 +4421108 +2974349 +3998594 +3524290 +2890718 +3389566 +4299112 +3939835 +3151886 +4763603 +4144266 +3819647 +4070033 +3929522 +4117625 +6363915 +5021791 +4970925 +4487215 +5160573 +5192843 +5460264 +6971533 +5604715 +5636985 +7377933 +5865067 +7221919 +7453812 +7081408 +6541452 +7091721 +7269511 +7639101 +8951313 +9935100 +10470974 +7999555 +8416737 +8604840 +9458140 +9509006 +12241981 +15638656 +15663817 +17556153 +11097249 +15146292 +14491430 +18886413 +15080963 +23096270 +16476552 +14361232 +24962404 +15269066 +14730822 +32601505 +16416292 +20658718 +16604395 +17021577 +17457695 +26366315 +18062980 +30810109 +38734926 +30932883 +25458481 +29222252 +26243541 +25588679 +28852662 +29092054 +51591601 +29442195 +30837784 +29630298 +39323636 +29999888 +32290643 +38116413 +33020687 +33437869 +33625972 +34062090 +43387892 +43046374 +62462882 +55030874 +51047160 +54680733 +51702022 +54810931 +58074914 +55096203 +71614279 +64275653 +58534249 +59072493 +59442083 +77449982 +98077248 +105858091 +87386846 +65311330 +66458556 +66646659 +67063841 +67688062 +85109250 +98198823 +160661705 +102749182 +118160578 +105727893 +106798225 +106512953 +150420580 +165765310 +212371044 +154450687 +172496096 +117606742 +125531049 +126088742 +131769886 +131957989 +132375171 +333157801 +132999392 +227120261 +133015568 +190837143 +250622310 +183308073 +263964133 +212240846 +208477075 +212526118 +223334635 +213311178 +224119695 +243137791 +329847588 +243695484 +249376628 +259088134 +249564731 +251619791 +339399920 +263727875 +264333160 +436645813 +357135263 +266014960 +442456934 +580469898 +414171778 +391785148 +395548919 +420717921 +425837296 +421788253 +435860753 +644837616 +492702522 +467257486 +486833275 +493072112 +493260215 +498941359 +501184522 +513292606 +515347666 +603733080 +748920411 +530348120 +623150223 +752684182 +657800108 +1070674912 +787334067 +805956926 +812503069 +816266840 +887975407 +847625549 +857649006 +1302681733 +954090761 +966198845 +1801716310 +979905387 +992201574 +1596545960 +1014289025 +1014477128 +1043640726 +1045695786 +2024765673 +1372070634 +1188148228 +1280950331 +1830555865 +1463757034 +1700478476 +1593290993 +1618459995 +1628769909 +1972106961 +1705274555 +1811739767 +1823847851 +1946104232 +1920289606 +2035842300 +2364272208 +3215005955 +2006490599 +2611023088 +2028766153 +3293769469 +2233844014 +2326646117 +2469098559 +2560218862 +2651905262 +2744707365 +4885749276 +3057048027 +3211750988 +3222060902 +3840505920 +3334044464 +5421320235 +5945067552 +5023490755 +3949055759 +3866393838 +7052256908 +8414166111 +4035256752 +4240334613 +9002115579 +4262610167 +12842621499 +4794062876 +11562334441 +4978551379 +5029317421 +10923618931 +5396612627 +5801755392 +6268799015 +9823380297 +6556105366 +7062566822 +12081574329 +7200438302 +8106728451 +9056673043 +7815449597 +7901650590 +9772614255 +8275591365 +8297866919 +9064574173 +8502944780 +9241161546 +9291927588 +10007868800 +19064541843 +10780306771 +12794000976 +10425930048 +13672203992 +11198368019 +15307166753 +13469237317 +19282012631 +13618672188 +14263005124 +16573458284 +15015887899 +28837156098 +15717100187 +21434121785 +16404595370 +16778536145 +19496234938 +35213335125 +27771826303 +17744106326 +34080429742 +21206236819 +24044602236 +21624298067 +32965472255 +30245662276 +23895167365 +31420483269 +24667605336 +28634560087 +27087909505 +29278893023 +29980105311 +48712207572 +30732988086 +31794424044 +32121695557 +37240341264 +51414227096 +33183131515 +48978063122 +51824536068 +38950343145 +39368404393 +45250839055 +49840796906 +103238763164 +45519465432 +127133930529 +56462029380 +48562772701 +50983076870 +69034765308 +64328250769 +71162828437 +56366802528 +77641160989 +76190684409 +67973329350 +82491180319 +63916119601 +78318747538 +70423472779 +95360262338 +87513115846 +88791140051 +84201182200 +109847716201 +140106804010 +140518935178 +96502542302 +113492794782 +94082238133 +139458238087 +177821045551 +99545849571 +107349879398 +120695053297 +120282922129 +124340131878 +126790275307 +189841059717 +131889448951 +148742220317 +134339592380 +185668626936 +154624654979 +157936588625 +171714298046 +172992322251 +326338953025 +191551061598 +190584780435 +326563265868 +347777648342 +193628087704 +201432117531 +214777291430 +453129228332 +206895728969 +219828771700 +227632801527 +240977975426 +541116244455 +258679724258 +339327000752 +266229041331 +334410847253 +283081812697 +288964247359 +312561243604 +397480509404 +329650886671 +344706620297 +363577102686 +382135842033 +476709900401 +426724500669 +395060205235 +546138737828 +400523816673 +553539219030 +455755266856 +541761536955 +434528530496 +636038180661 +468610776953 +499657699684 +524908765589 +547643971617 +555193288690 +549310854028 +572046060056 +709806313366 +723492777855 +642212130275 +874190409805 +798261663624 +708283722983 +745712944719 +907044607622 +856279083529 +980667268324 +1005066120884 +835052347169 +1421834381422 +890283797352 +903139307449 +1047301671301 +934186230180 +1403923055146 +1017921630981 +1024566465273 +1072552737206 +1096954825645 +1104504142718 +2428489520419 +1660133761256 +1418090036349 +1350495853258 +1387925074994 +1453996667702 +1506545386607 +1543336070152 +1601992028248 +1691331430698 +1738191654618 +1725336144521 +1824470027532 +2144256496946 +2278208872346 +1793423104801 +1975692044655 +1958752695453 +2006738967386 +3549806172053 +2042488096254 +2097119202479 +2460477812200 +2201458968363 +2454999995976 +2768585889607 +4185813956721 +2738420928252 +4497488092230 +2841921742696 +2960542054309 +4476612582870 +4479667840709 +7440209895018 +3562661682150 +3752175800254 +3617893132333 +6404583424846 +4635344847497 +4208197935749 +4848660710082 +3965491662839 +4001240791707 +4049227063640 +7803707089054 +6023139494350 +4298578170842 +5162001022672 +4970044857970 +5415542050285 +6807413405535 +5580342670948 +8843542783246 +6843162534403 +5802463797005 +7168739990058 +7180554814483 +8209438727456 +7528153344989 +7314837482404 +7370068932587 +7826091068082 +7966732454546 +14696893335047 +15494885799535 +8014718726479 +11777458263505 +8050467855347 +8347805234482 +9268623028812 +11467318160900 +10101041967847 +10132045880642 +10385586908255 +22338048333938 +17319090884159 +12423505205351 +12971203787063 +12645626331408 +12983018611488 +14349294804541 +14495392296887 +14684906414991 +19092295745909 +15281569936950 +15336801387133 +28319819998621 +15981451181025 +35073746926934 +16065186581826 +20438223931830 +18151509823194 +16398273089829 +18448847202329 +25394708992414 +23356790695318 +20233087848489 +24880979205142 +22809092113606 +25069131536759 +25406523816839 +25628644942896 +25616830118471 +36339809306806 +30560578878713 +28844687101428 +29180298711878 +53936650117092 +34429097133042 +58024985813306 +33785648589462 +32046637762851 +90276459423898 +32463459671655 +50495484965180 +34549782913023 +34847120292158 +36631360938318 +41805637897647 +47878223650365 +50475655353598 +43042179962095 +51989390825484 +59402478707933 +57115769299610 +51023353935310 +54461517219899 +54797128830349 +59740877590591 +59405265980141 From b24b690a617aee191ccaea664e4a6a52d6d82c1f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 9 Dec 2020 09:11:33 +0100 Subject: [PATCH 100/479] 2020: d09: ex2: add solution --- 2020/d09/ex2/ex2.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 2020/d09/ex2/ex2.py diff --git a/2020/d09/ex2/ex2.py b/2020/d09/ex2/ex2.py new file mode 100755 index 0000000..f60e2eb --- /dev/null +++ b/2020/d09/ex2/ex2.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + + +import itertools +import sys +from typing import List + + +def find_invalid(nums: List[int]) -> int: + for i in range(25, len(nums)): + num = nums[i] + found = False + for lhs, rhs in itertools.combinations(nums[i - 25 : i], 2): + if lhs + rhs == num: + found = True + break + if not found: + return num + assert False # Sanity check + + +def find_weakness(nums: List[int], invalid: int) -> int: + for i in range(len(nums) - 2): + for j in range(i + 2, len(nums)): + if sum(nums[i:j]) == invalid: + return min(nums[i:j]) + max(nums[i:j]) + assert False # Sanity check(( + + +def solve(raw: List[str]) -> int: + nums = [int(line) for line in raw] + invalid = find_invalid(nums) + return find_weakness(nums, invalid) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From ed5cdb1a95754a3ffab061c0769ca053712d9075 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 10 Dec 2020 07:29:04 +0100 Subject: [PATCH 101/479] 2020: d10: ex1: add input --- 2020/d10/ex1/input | 101 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 2020/d10/ex1/input diff --git a/2020/d10/ex1/input b/2020/d10/ex1/input new file mode 100644 index 0000000..a97393a --- /dev/null +++ b/2020/d10/ex1/input @@ -0,0 +1,101 @@ +144 +10 +75 +3 +36 +80 +143 +59 +111 +133 +1 +112 +23 +62 +101 +137 +41 +24 +8 +121 +35 +105 +161 +69 +52 +21 +55 +29 +135 +142 +38 +108 +141 +115 +68 +7 +98 +82 +9 +72 +118 +27 +153 +140 +61 +90 +158 +102 +28 +134 +91 +2 +17 +81 +31 +15 +120 +20 +34 +56 +4 +44 +74 +14 +147 +11 +49 +128 +16 +99 +66 +47 +125 +155 +130 +37 +67 +54 +60 +48 +136 +89 +119 +154 +122 +129 +163 +73 +100 +85 +95 +30 +76 +162 +22 +79 +88 +150 +53 +63 +92 From 386c912dbea331ee6191bc8e22be7e07d36116af Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 10 Dec 2020 07:29:12 +0100 Subject: [PATCH 102/479] 2020: d10: ex1: add solution --- 2020/d10/ex1/ex1.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100755 2020/d10/ex1/ex1.py diff --git a/2020/d10/ex1/ex1.py b/2020/d10/ex1/ex1.py new file mode 100755 index 0000000..e75dd5c --- /dev/null +++ b/2020/d10/ex1/ex1.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +import sys +from collections import defaultdict +from typing import Dict, List + + +def make_chain(adapters: List[int]) -> int: + adapters = sorted(adapters) + output = 0 + device = adapters[-1] + 3 + jolts: Dict[int, int] = defaultdict(int) + for adapter in adapters: + delt = adapter - output + jolts[delt] += 1 + output = adapter + jolts[device - output] += 1 + + return jolts[1] * jolts[3] + + +def solve(raw: List[str]) -> int: + return make_chain([int(line) for line in raw]) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 1f36ec0cd1c4cb41e687bc78af16c77a1a137a68 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 10 Dec 2020 07:29:21 +0100 Subject: [PATCH 103/479] 2020: d10: ex2: add input --- 2020/d10/ex2/input | 101 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 2020/d10/ex2/input diff --git a/2020/d10/ex2/input b/2020/d10/ex2/input new file mode 100644 index 0000000..a97393a --- /dev/null +++ b/2020/d10/ex2/input @@ -0,0 +1,101 @@ +144 +10 +75 +3 +36 +80 +143 +59 +111 +133 +1 +112 +23 +62 +101 +137 +41 +24 +8 +121 +35 +105 +161 +69 +52 +21 +55 +29 +135 +142 +38 +108 +141 +115 +68 +7 +98 +82 +9 +72 +118 +27 +153 +140 +61 +90 +158 +102 +28 +134 +91 +2 +17 +81 +31 +15 +120 +20 +34 +56 +4 +44 +74 +14 +147 +11 +49 +128 +16 +99 +66 +47 +125 +155 +130 +37 +67 +54 +60 +48 +136 +89 +119 +154 +122 +129 +163 +73 +100 +85 +95 +30 +76 +162 +22 +79 +88 +150 +53 +63 +92 From 56aea0db79f7ac164aaaf05c0f8eb8711199adce Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 10 Dec 2020 07:29:28 +0100 Subject: [PATCH 104/479] 2020: d10: ex2: add solution --- 2020/d10/ex2/ex2.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 2020/d10/ex2/ex2.py diff --git a/2020/d10/ex2/ex2.py b/2020/d10/ex2/ex2.py new file mode 100755 index 0000000..6af091e --- /dev/null +++ b/2020/d10/ex2/ex2.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +import sys +from typing import Dict, List + + +def make_chain(adapters: List[int]) -> int: + adapters += [0, max(adapters) + 3] + adapters = sorted(adapters) + jolts: Dict[int, int] = {} + N = len(adapters) + + def rec(index: int) -> int: + if (res := jolts.get(index)) is not None: + return res + if index == N - 1: + return 1 + total = sum( + rec(i) + for i in range(index + 1, min(N, index + 4)) + if (adapters[i] - adapters[index]) <= 3 + ) + jolts[index] = total + return total + + return rec(0) + + +def solve(raw: List[str]) -> int: + return make_chain([int(line) for line in raw]) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From d86e1f8701864a063dcc33629f870e283b75805b Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 11 Dec 2020 08:41:03 +0100 Subject: [PATCH 105/479] 2020: d11: ex1: add input --- 2020/d11/ex1/input | 91 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 2020/d11/ex1/input diff --git a/2020/d11/ex1/input b/2020/d11/ex1/input new file mode 100644 index 0000000..6577da1 --- /dev/null +++ b/2020/d11/ex1/input @@ -0,0 +1,91 @@ +LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLL..LLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLL.LL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +...L.L......L...L..L...L..LL.....L.....L..LLLL..L.LL......LL....L..L.L..L....L.LL....LL..L..L +LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLL..LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL..LLLLLLLLLLLLLLLLL.LLLLLLLL.LLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLL +LLLL.LLLLL.LLLL.LLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +.....L.LLLL....LL..L...LLL.L.LL..LL.L........L....LL...L...L...L.LL....LL...L..L.....LL.L.... +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LL.LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LL.LLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL..LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL..LLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLLLLLLLL.LLLLL.LL.LLLLLLLLLL +...L......L....L....L......L.L.....L..L.L.L..L.L...LLL.....LLLL.L.......LL.LLL.L.LL....L..... +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.L.LLLL.LLL +LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LL.L.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLL +...LL..........L..LLLLL...L.L..........L........L.LL..L..L.LLL.L..L.L.....LL...LL....L..L.L.. +LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLL +LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL..LLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLL.LLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLL..LLLLLLL.LLLLLLLLLL +LLLLLLLLL..L.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +..LLLL.LL....LLL..L...L..L..L.......L..L...L.L...L..LL.L.L.L.L...L...L.L.L.L.L......LL...L..L +LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLL.LLLLLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLL.L.LLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLLL.LLLLLL..LLLLLL.LLL +..L...L...L...L..L....L...LL.L.L.L..LL...........LLL.L......L..L.....LL..L..LLL........L....L +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLL.LL.LLLL.LLLLLLL.L.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLL.L.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LL.L.LLLLL +..L.L.LL....L....L..L....L.L...L..L..L.L.....L..L...L.LL.....L...............L..............L +LLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LL.L.LLLL.LLL.LLLL.LLLLL.LL.LLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LL.L.LLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +L.L.....L.L.L.LL.L......LLL.....L.L.L........L....LL.......L....L.....L....LL..L...LLL......L +LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.L.LLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL..LLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLL.LLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +...L...L.....L....L.L..........L..L.L..L..L..LL.L..L.......L.......L....L....L...LLL..L..L..L +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +..LLL....L.LL....L..............LLL......LL.LLL.....LL..L.L..L........L......L...L.LL..LL..L. +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLL..LLLLLLLLLLLLLL.LLLLLLLLLL +L.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLL...LLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLLL.LLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +L...L.LL......L...LLLLLL.L.L.L...L.L..L..L.LL....L......LL..L...LLL....L...LL......L......... +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLL..LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLL.LLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL From 1425fd5c4c4506da45c876676e6f1194f741392d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 11 Dec 2020 08:41:30 +0100 Subject: [PATCH 106/479] 2020: d11: ex1: add solution --- 2020/d11/ex1/ex1.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100755 2020/d11/ex1/ex1.py diff --git a/2020/d11/ex1/ex1.py b/2020/d11/ex1/ex1.py new file mode 100755 index 0000000..d0fa0b9 --- /dev/null +++ b/2020/d11/ex1/ex1.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +import itertools +import sys +from copy import deepcopy +from typing import Iterator, List, Tuple + +Grid = List[List[str]] + + +def update(grid: Grid) -> Grid: + def neightbours(x: int, y: int) -> Iterator[Tuple[int, int]]: + for dx, dy in itertools.product(range(-1, 2), range(-1, 2)): + if dx == 0 and dy == 0: + continue + + new_x, new_y = x + dx, y + dy + if 0 <= new_x < len(grid) and 0 <= new_y < len(grid[0]): + yield new_x, new_y + + new_grid = deepcopy(grid) + + for x, y in itertools.product(range(len(grid)), range(len(grid[0]))): + num_alive = sum(grid[nx][ny] == "#" for nx, ny in neightbours(x, y)) + if num_alive == 0 and grid[x][y] == "L": + new_grid[x][y] = "#" + elif num_alive >= 4 and grid[x][y] == "#": + new_grid[x][y] = "L" + + return new_grid + + +def solve(grid: Grid) -> int: + while (new_grid := update(grid)) != grid: + grid = new_grid + return sum(sum(pos == "#" for pos in line) for line in grid) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve([[line[i] for i in range(len(line))] for line in input])) + + +if __name__ == "__main__": + main() From 26fc4a365e1fb815ecf3e256699d9518bff3fee0 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 11 Dec 2020 08:41:38 +0100 Subject: [PATCH 107/479] 2020: d11: ex2: add input --- 2020/d11/ex2/input | 91 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 2020/d11/ex2/input diff --git a/2020/d11/ex2/input b/2020/d11/ex2/input new file mode 100644 index 0000000..6577da1 --- /dev/null +++ b/2020/d11/ex2/input @@ -0,0 +1,91 @@ +LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLL..LLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLL.LL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +...L.L......L...L..L...L..LL.....L.....L..LLLL..L.LL......LL....L..L.L..L....L.LL....LL..L..L +LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLL..LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL..LLLLLLLLLLLLLLLLL.LLLLLLLL.LLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLL +LLLL.LLLLL.LLLL.LLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +.....L.LLLL....LL..L...LLL.L.LL..LL.L........L....LL...L...L...L.LL....LL...L..L.....LL.L.... +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LL.LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LL.LLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL..LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL..LLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLLLLLLLL.LLLLL.LL.LLLLLLLLLL +...L......L....L....L......L.L.....L..L.L.L..L.L...LLL.....LLLL.L.......LL.LLL.L.LL....L..... +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LL.LLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.L.LLLL.LLL +LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LL.L.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLL +...LL..........L..LLLLL...L.L..........L........L.LL..L..L.LLL.L..L.L.....LL...LL....L..L.L.. +LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLL +LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLL..LLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLL.LLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLL..LLLLLLL.LLLLLLLLLL +LLLLLLLLL..L.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +..LLLL.LL....LLL..L...L..L..L.......L..L...L.L...L..LL.L.L.L.L...L...L.L.L.L.L......LL...L..L +LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLL.LLLLLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLL.L.LLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLLL.LLLLLL..LLLLLL.LLL +..L...L...L...L..L....L...LL.L.L.L..LL...........LLL.L......L..L.....LL..L..LLL........L....L +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLL.LL.LLLL.LLLLLLL.L.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLL.L.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LL.L.LLLLL +..L.L.LL....L....L..L....L.L...L..L..L.L.....L..L...L.LL.....L...............L..............L +LLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LL.L.LLLL.LLL.LLLL.LLLLL.LL.LLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LL.L.LLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +L.L.....L.L.L.LL.L......LLL.....L.L.L........L....LL.......L....L.....L....LL..L...LLL......L +LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLL.L.LLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL..LLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLL.LLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +...L...L.....L....L.L..........L..L.L..L..L..LL.L..L.......L.......L....L....L...LLL..L..L..L +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +..LLL....L.LL....L..............LLL......LL.LLL.....LL..L.L..L........L......L...L.LL..LL..L. +LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLL..LLLLLLLLLLLLLL.LLLLLLLLLL +L.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLL...LLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLLLLLLLLLLL..LLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLL.LLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLL +LLLLLLLLLL.LLLL.LLL.LLLLL.LLLLLLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL +L...L.LL......L...LLLLLL.L.L.L...L.L..L..L.LL....L......LL..L...LLL....L...LL......L......... +LLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLLLLLL +LLLLLLLLLL.LLL..LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLL.LLLL +LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLLLL From e4a0d61ebcf8c8460cf58c503c1ce659bc34d6b8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 11 Dec 2020 08:41:47 +0100 Subject: [PATCH 108/479] 2020: d11: ex2: add solution --- 2020/d11/ex2/ex2.py | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100755 2020/d11/ex2/ex2.py diff --git a/2020/d11/ex2/ex2.py b/2020/d11/ex2/ex2.py new file mode 100755 index 0000000..ce8bad5 --- /dev/null +++ b/2020/d11/ex2/ex2.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +import itertools +import sys +from copy import deepcopy +from typing import Iterator, List, Tuple + +Grid = List[List[str]] + + +def update(grid: Grid) -> Grid: + def neightbours(x: int, y: int) -> Iterator[Tuple[int, int]]: + for dx, dy in itertools.product(range(-1, 2), range(-1, 2)): + if dx == 0 and dy == 0: + continue + + new_x, new_y = x + dx, y + dy + while 0 <= new_x < len(grid) and 0 <= new_y < len(grid[0]): + if grid[new_x][new_y] in "L#": + yield new_x, new_y + break + new_x, new_y = new_x + dx, new_y + dy + + new_grid = deepcopy(grid) + + for x, y in itertools.product(range(len(grid)), range(len(grid[0]))): + num_alive = sum(grid[nx][ny] == "#" for nx, ny in neightbours(x, y)) + if num_alive == 0 and grid[x][y] == "L": + new_grid[x][y] = "#" + elif num_alive >= 5 and grid[x][y] == "#": + new_grid[x][y] = "L" + + return new_grid + + +def solve(grid: Grid) -> int: + while (new_grid := update(grid)) != grid: + grid = new_grid + return sum(sum(pos == "#" for pos in line) for line in grid) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve([[line[i] for i in range(len(line))] for line in input])) + + +if __name__ == "__main__": + main() From 0947c9eb7779d23b8498cd245daa8be5b983948a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 12 Dec 2020 10:05:53 +0100 Subject: [PATCH 109/479] 2020: d12: ex1: add input --- 2020/d12/ex1/input | 785 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 785 insertions(+) create mode 100644 2020/d12/ex1/input diff --git a/2020/d12/ex1/input b/2020/d12/ex1/input new file mode 100644 index 0000000..33221b0 --- /dev/null +++ b/2020/d12/ex1/input @@ -0,0 +1,785 @@ +N2 +F85 +L90 +W5 +R90 +F56 +F16 +F98 +W4 +S3 +F92 +N3 +W2 +N3 +E2 +S4 +W1 +N2 +F7 +N2 +E3 +S1 +L90 +N2 +E2 +F13 +E5 +S4 +R90 +N2 +W4 +F55 +W3 +N1 +F93 +L90 +N3 +F72 +E4 +W1 +N2 +F76 +S5 +L90 +F44 +N2 +F81 +S1 +F28 +R270 +E5 +N4 +E5 +F23 +R270 +F53 +N2 +L90 +E5 +R180 +N1 +F99 +N3 +E2 +R180 +W5 +F70 +W5 +R180 +F9 +S1 +R90 +S1 +F58 +N3 +N4 +R180 +N3 +R90 +S5 +F6 +E3 +N4 +F38 +W4 +R180 +F53 +R180 +E2 +R90 +W4 +L180 +F13 +N3 +F80 +W1 +R270 +E2 +S1 +F24 +E5 +F1 +S3 +F34 +R90 +F54 +E4 +F59 +E4 +R180 +F88 +R90 +S1 +R90 +F6 +R90 +N1 +F89 +W3 +F9 +L180 +W1 +F47 +R180 +N2 +W1 +F28 +F73 +S1 +F27 +E2 +F82 +W3 +F38 +E4 +L90 +E4 +F64 +W5 +W3 +S2 +L180 +F22 +L90 +F10 +L90 +F64 +E4 +N4 +F21 +S4 +E3 +N5 +F71 +N3 +F93 +N2 +R90 +E4 +F64 +E1 +L90 +F37 +E5 +F96 +W2 +N4 +E2 +R90 +S1 +R90 +W1 +R180 +E2 +S2 +R90 +W3 +S2 +F94 +W2 +L180 +S2 +E4 +F54 +N2 +E4 +S3 +L180 +W2 +N1 +W2 +R90 +F54 +L180 +N2 +F87 +E2 +F23 +W3 +R180 +W4 +S3 +F93 +E5 +R90 +N4 +R90 +S4 +E3 +S3 +F31 +R90 +F89 +E3 +F73 +S5 +F97 +W1 +L180 +F52 +E3 +F68 +R90 +S2 +S5 +F26 +L180 +F12 +E2 +F83 +F9 +N2 +R90 +F99 +R90 +S4 +E5 +R90 +S4 +F84 +W4 +E5 +R90 +F42 +W4 +F94 +W1 +R270 +S3 +E5 +F23 +F38 +W2 +W1 +N5 +E2 +L180 +N1 +F26 +L90 +F5 +R90 +N5 +R180 +F25 +L90 +S1 +N3 +F62 +S1 +F77 +N3 +E3 +L90 +F93 +W3 +E3 +N2 +F14 +N5 +F80 +S2 +L90 +N4 +W2 +L180 +F81 +R180 +N4 +F8 +W4 +S4 +R90 +F34 +W2 +L180 +F49 +S4 +E4 +R90 +W2 +F75 +R90 +S5 +E4 +L90 +N3 +W4 +R90 +N4 +E3 +F62 +R90 +E4 +N2 +W3 +N1 +R90 +F75 +E1 +L180 +S3 +W1 +N2 +W5 +N3 +F70 +L90 +W1 +S2 +L270 +E5 +F21 +S3 +W3 +R90 +F3 +N3 +F85 +E5 +R90 +F8 +W2 +S3 +W4 +F38 +N5 +F54 +L90 +W3 +R90 +E5 +F2 +S5 +F79 +N4 +E2 +R180 +W2 +N1 +R90 +F57 +W4 +S1 +F27 +E5 +F31 +R90 +F11 +S5 +W4 +N3 +W1 +S1 +F93 +N3 +L180 +E1 +F63 +E2 +R180 +F99 +N3 +E3 +N3 +W5 +F66 +E5 +R90 +S1 +L90 +N1 +R90 +W5 +R90 +L90 +E4 +R270 +W3 +N5 +R90 +S5 +F8 +F93 +E3 +N4 +F48 +W1 +R180 +N1 +R90 +W3 +R180 +F3 +R180 +F8 +N4 +E1 +F34 +N1 +F33 +N4 +R90 +L180 +E3 +F35 +S5 +F64 +L90 +E4 +F30 +R90 +L90 +E5 +N4 +R180 +S2 +W3 +R90 +F35 +L180 +E2 +S3 +E5 +L90 +N5 +R90 +R90 +N4 +E5 +F34 +W5 +W4 +L90 +E2 +N2 +S5 +F85 +S5 +F98 +W1 +S3 +F7 +E2 +S4 +F27 +L180 +F30 +L90 +W1 +F87 +W1 +E2 +E2 +N3 +F64 +E4 +F31 +L270 +S3 +W2 +F60 +S2 +E1 +L180 +F2 +W3 +S3 +E3 +R180 +F12 +L180 +E1 +R90 +L180 +F60 +R90 +E4 +R180 +E3 +S1 +E3 +S1 +F86 +R90 +E1 +S4 +F47 +N4 +E4 +N4 +W4 +R90 +S3 +F81 +S1 +E1 +L270 +S2 +L90 +E5 +F62 +W4 +F78 +L90 +F18 +S5 +R180 +S1 +R270 +S3 +W5 +F3 +N1 +R90 +N4 +F59 +N1 +W4 +R90 +E3 +N3 +N4 +L90 +W5 +S2 +L90 +N2 +W1 +L180 +F49 +N4 +F14 +L180 +N2 +F43 +S3 +F84 +E3 +R180 +S4 +W1 +F90 +F58 +W3 +F18 +E5 +L90 +F72 +W1 +N1 +R90 +S3 +F79 +E4 +S4 +F31 +N4 +F66 +L90 +W1 +N2 +E4 +F74 +W1 +N2 +E5 +S5 +L90 +E3 +F71 +N3 +R90 +N4 +E2 +N2 +F83 +L90 +W4 +F64 +L90 +W1 +S2 +E4 +F48 +S3 +W5 +L90 +E5 +S1 +L180 +E4 +N4 +F40 +E4 +R270 +F85 +E4 +R90 +L90 +S1 +R270 +W1 +R180 +F72 +S2 +R90 +F63 +R180 +F93 +E4 +S4 +R90 +W3 +R90 +F10 +E4 +F93 +R180 +E1 +E3 +R90 +W1 +L180 +F83 +W4 +F41 +W4 +R90 +F1 +L90 +W4 +L90 +N4 +R180 +S5 +F63 +S2 +E4 +R90 +F90 +E5 +S2 +L90 +F64 +R90 +L90 +N1 +E4 +F20 +W3 +N4 +R90 +W5 +N1 +E5 +W4 +R90 +N1 +F72 +S5 +F78 +S2 +R180 +N4 +L180 +N5 +F22 +W4 +R180 +F19 +W3 +L90 +E4 +F27 +W5 +S4 +E4 +F34 +N4 +F40 +N3 +R90 +L90 +S2 +W1 +R90 +E3 +R90 +N1 +W4 +F93 +N5 +L90 +F7 +E1 +L90 +W4 +N3 +E5 +F62 +R90 +W4 +L90 +S3 +E4 +L270 +S3 +W5 +S2 +F30 +N2 +F70 +S5 +W1 +S3 +R90 +E4 +S5 +L90 +S2 +R90 +W1 +L90 +W5 +F8 +R90 +N4 +L180 +N5 +L90 +N3 +F30 +W2 +F39 +E3 +F17 +W3 +S1 +F48 +E1 +R90 +F35 +W2 +L180 +S1 +L90 +E5 +S1 +R90 +E2 +S5 +W2 +N1 +E3 +F100 +S2 +E4 +L90 +W5 +R90 +F81 +S4 +R90 +F80 From 139f3db14fb3029a3e670765c53126386f943574 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 12 Dec 2020 10:06:00 +0100 Subject: [PATCH 110/479] 2020: d12: ex1: add solution --- 2020/d12/ex1/ex1.py | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100755 2020/d12/ex1/ex1.py diff --git a/2020/d12/ex1/ex1.py b/2020/d12/ex1/ex1.py new file mode 100755 index 0000000..6d74574 --- /dev/null +++ b/2020/d12/ex1/ex1.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +import sys +from typing import List, Tuple + +Positiom = Tuple[str, int, int] +Instruction = Tuple[str, int] + +ORIENTATIONS = ["N", "W", "S", "E"] +MOVES = { + "N": (1, 0), + "W": (0, -1), + "S": (-1, 0), + "E": (0, 1), +} + + +def move_ship(pos: Positiom, instr: Instruction) -> Positiom: + if instr[0] == "L": + assert instr[1] % 90 == 0 # Sanity check + delt = instr[1] // 90 + orientation = ORIENTATIONS[ + (ORIENTATIONS.index(pos[0]) + delt) % len(ORIENTATIONS) + ] + return (orientation, *pos[1:]) + elif instr[0] == "R": + assert instr[1] % 90 == 0 # Sanity check + delt = instr[1] // 90 + orientation = ORIENTATIONS[ORIENTATIONS.index(pos[0]) - delt] + return (orientation, *pos[1:]) + else: + dx, dy = MOVES[pos[0] if instr[0] == "F" else instr[0]] + x, y = pos[1], pos[2] + x += dx * instr[1] + y += dy * instr[1] + return (pos[0], x, y) + + +def solve(raw: List[str]) -> int: + instructions = [(i[0], int(i[1:])) for i in raw] + ship = ("E", 0, 0) + for i in instructions: + ship = move_ship(ship, i) + return abs(ship[1]) + abs(ship[2]) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 0edcccdd02b966309744eddd7238e1434c0532e0 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 12 Dec 2020 10:06:13 +0100 Subject: [PATCH 111/479] 2020: d12: ex2: add input --- 2020/d12/ex2/input | 785 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 785 insertions(+) create mode 100644 2020/d12/ex2/input diff --git a/2020/d12/ex2/input b/2020/d12/ex2/input new file mode 100644 index 0000000..33221b0 --- /dev/null +++ b/2020/d12/ex2/input @@ -0,0 +1,785 @@ +N2 +F85 +L90 +W5 +R90 +F56 +F16 +F98 +W4 +S3 +F92 +N3 +W2 +N3 +E2 +S4 +W1 +N2 +F7 +N2 +E3 +S1 +L90 +N2 +E2 +F13 +E5 +S4 +R90 +N2 +W4 +F55 +W3 +N1 +F93 +L90 +N3 +F72 +E4 +W1 +N2 +F76 +S5 +L90 +F44 +N2 +F81 +S1 +F28 +R270 +E5 +N4 +E5 +F23 +R270 +F53 +N2 +L90 +E5 +R180 +N1 +F99 +N3 +E2 +R180 +W5 +F70 +W5 +R180 +F9 +S1 +R90 +S1 +F58 +N3 +N4 +R180 +N3 +R90 +S5 +F6 +E3 +N4 +F38 +W4 +R180 +F53 +R180 +E2 +R90 +W4 +L180 +F13 +N3 +F80 +W1 +R270 +E2 +S1 +F24 +E5 +F1 +S3 +F34 +R90 +F54 +E4 +F59 +E4 +R180 +F88 +R90 +S1 +R90 +F6 +R90 +N1 +F89 +W3 +F9 +L180 +W1 +F47 +R180 +N2 +W1 +F28 +F73 +S1 +F27 +E2 +F82 +W3 +F38 +E4 +L90 +E4 +F64 +W5 +W3 +S2 +L180 +F22 +L90 +F10 +L90 +F64 +E4 +N4 +F21 +S4 +E3 +N5 +F71 +N3 +F93 +N2 +R90 +E4 +F64 +E1 +L90 +F37 +E5 +F96 +W2 +N4 +E2 +R90 +S1 +R90 +W1 +R180 +E2 +S2 +R90 +W3 +S2 +F94 +W2 +L180 +S2 +E4 +F54 +N2 +E4 +S3 +L180 +W2 +N1 +W2 +R90 +F54 +L180 +N2 +F87 +E2 +F23 +W3 +R180 +W4 +S3 +F93 +E5 +R90 +N4 +R90 +S4 +E3 +S3 +F31 +R90 +F89 +E3 +F73 +S5 +F97 +W1 +L180 +F52 +E3 +F68 +R90 +S2 +S5 +F26 +L180 +F12 +E2 +F83 +F9 +N2 +R90 +F99 +R90 +S4 +E5 +R90 +S4 +F84 +W4 +E5 +R90 +F42 +W4 +F94 +W1 +R270 +S3 +E5 +F23 +F38 +W2 +W1 +N5 +E2 +L180 +N1 +F26 +L90 +F5 +R90 +N5 +R180 +F25 +L90 +S1 +N3 +F62 +S1 +F77 +N3 +E3 +L90 +F93 +W3 +E3 +N2 +F14 +N5 +F80 +S2 +L90 +N4 +W2 +L180 +F81 +R180 +N4 +F8 +W4 +S4 +R90 +F34 +W2 +L180 +F49 +S4 +E4 +R90 +W2 +F75 +R90 +S5 +E4 +L90 +N3 +W4 +R90 +N4 +E3 +F62 +R90 +E4 +N2 +W3 +N1 +R90 +F75 +E1 +L180 +S3 +W1 +N2 +W5 +N3 +F70 +L90 +W1 +S2 +L270 +E5 +F21 +S3 +W3 +R90 +F3 +N3 +F85 +E5 +R90 +F8 +W2 +S3 +W4 +F38 +N5 +F54 +L90 +W3 +R90 +E5 +F2 +S5 +F79 +N4 +E2 +R180 +W2 +N1 +R90 +F57 +W4 +S1 +F27 +E5 +F31 +R90 +F11 +S5 +W4 +N3 +W1 +S1 +F93 +N3 +L180 +E1 +F63 +E2 +R180 +F99 +N3 +E3 +N3 +W5 +F66 +E5 +R90 +S1 +L90 +N1 +R90 +W5 +R90 +L90 +E4 +R270 +W3 +N5 +R90 +S5 +F8 +F93 +E3 +N4 +F48 +W1 +R180 +N1 +R90 +W3 +R180 +F3 +R180 +F8 +N4 +E1 +F34 +N1 +F33 +N4 +R90 +L180 +E3 +F35 +S5 +F64 +L90 +E4 +F30 +R90 +L90 +E5 +N4 +R180 +S2 +W3 +R90 +F35 +L180 +E2 +S3 +E5 +L90 +N5 +R90 +R90 +N4 +E5 +F34 +W5 +W4 +L90 +E2 +N2 +S5 +F85 +S5 +F98 +W1 +S3 +F7 +E2 +S4 +F27 +L180 +F30 +L90 +W1 +F87 +W1 +E2 +E2 +N3 +F64 +E4 +F31 +L270 +S3 +W2 +F60 +S2 +E1 +L180 +F2 +W3 +S3 +E3 +R180 +F12 +L180 +E1 +R90 +L180 +F60 +R90 +E4 +R180 +E3 +S1 +E3 +S1 +F86 +R90 +E1 +S4 +F47 +N4 +E4 +N4 +W4 +R90 +S3 +F81 +S1 +E1 +L270 +S2 +L90 +E5 +F62 +W4 +F78 +L90 +F18 +S5 +R180 +S1 +R270 +S3 +W5 +F3 +N1 +R90 +N4 +F59 +N1 +W4 +R90 +E3 +N3 +N4 +L90 +W5 +S2 +L90 +N2 +W1 +L180 +F49 +N4 +F14 +L180 +N2 +F43 +S3 +F84 +E3 +R180 +S4 +W1 +F90 +F58 +W3 +F18 +E5 +L90 +F72 +W1 +N1 +R90 +S3 +F79 +E4 +S4 +F31 +N4 +F66 +L90 +W1 +N2 +E4 +F74 +W1 +N2 +E5 +S5 +L90 +E3 +F71 +N3 +R90 +N4 +E2 +N2 +F83 +L90 +W4 +F64 +L90 +W1 +S2 +E4 +F48 +S3 +W5 +L90 +E5 +S1 +L180 +E4 +N4 +F40 +E4 +R270 +F85 +E4 +R90 +L90 +S1 +R270 +W1 +R180 +F72 +S2 +R90 +F63 +R180 +F93 +E4 +S4 +R90 +W3 +R90 +F10 +E4 +F93 +R180 +E1 +E3 +R90 +W1 +L180 +F83 +W4 +F41 +W4 +R90 +F1 +L90 +W4 +L90 +N4 +R180 +S5 +F63 +S2 +E4 +R90 +F90 +E5 +S2 +L90 +F64 +R90 +L90 +N1 +E4 +F20 +W3 +N4 +R90 +W5 +N1 +E5 +W4 +R90 +N1 +F72 +S5 +F78 +S2 +R180 +N4 +L180 +N5 +F22 +W4 +R180 +F19 +W3 +L90 +E4 +F27 +W5 +S4 +E4 +F34 +N4 +F40 +N3 +R90 +L90 +S2 +W1 +R90 +E3 +R90 +N1 +W4 +F93 +N5 +L90 +F7 +E1 +L90 +W4 +N3 +E5 +F62 +R90 +W4 +L90 +S3 +E4 +L270 +S3 +W5 +S2 +F30 +N2 +F70 +S5 +W1 +S3 +R90 +E4 +S5 +L90 +S2 +R90 +W1 +L90 +W5 +F8 +R90 +N4 +L180 +N5 +L90 +N3 +F30 +W2 +F39 +E3 +F17 +W3 +S1 +F48 +E1 +R90 +F35 +W2 +L180 +S1 +L90 +E5 +S1 +R90 +E2 +S5 +W2 +N1 +E3 +F100 +S2 +E4 +L90 +W5 +R90 +F81 +S4 +R90 +F80 From 2c31559722eed2a25d15b909fabae63a7e3cf3d7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 12 Dec 2020 10:06:19 +0100 Subject: [PATCH 112/479] 2020: d12: ex2: add solution --- 2020/d12/ex2/ex2.py | 69 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100755 2020/d12/ex2/ex2.py diff --git a/2020/d12/ex2/ex2.py b/2020/d12/ex2/ex2.py new file mode 100755 index 0000000..90d5f87 --- /dev/null +++ b/2020/d12/ex2/ex2.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +import sys +from dataclasses import dataclass +from typing import List, Tuple + +Instruction = Tuple[str, int] +Position = Tuple[int, int] + + +@dataclass +class Ship: + pos: Position + rel_waypoint: Position + + +ORIENTATIONS = ["N", "W", "S", "E"] +MOVES = { + "N": (1, 0), + "W": (0, -1), + "S": (-1, 0), + "E": (0, 1), +} + + +def move_ship(pos: Ship, instr: Instruction) -> Ship: + if instr[0] == "L": + assert instr[1] % 90 == 0 + turns = instr[1] // 90 + x, y = pos.rel_waypoint + for __ in range(turns): + x, y = y, -x + return Ship(pos.pos, (x, y)) + elif instr[0] == "R": + assert instr[1] % 90 == 0 + turns = instr[1] // 90 + x, y = pos.rel_waypoint + for __ in range(turns): + x, y = -y, x + return Ship(pos.pos, (x, y)) + elif instr[0] == "F": + dx, dy = pos.rel_waypoint + x, y = pos.pos + x += dx * instr[1] + y += dy * instr[1] + return Ship((x, y), pos.rel_waypoint) + else: + dx, dy = MOVES[instr[0]] + x, y = pos.rel_waypoint + x += dx * instr[1] + y += dy * instr[1] + return Ship(pos.pos, (x, y)) + + +def solve(raw: List[str]) -> int: + instructions = [(i[0], int(i[1:])) for i in raw] + ship = Ship((0, 0), (1, 10)) + for i in instructions: + ship = move_ship(ship, i) + return sum(abs(c) for c in ship.pos) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From c2d2c1469665167f39fe8b42077b763f57b2f6ca Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 13 Dec 2020 07:38:28 +0100 Subject: [PATCH 113/479] 2020: d13: ex1: add input --- 2020/d13/ex1/input | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 2020/d13/ex1/input diff --git a/2020/d13/ex1/input b/2020/d13/ex1/input new file mode 100644 index 0000000..d644142 --- /dev/null +++ b/2020/d13/ex1/input @@ -0,0 +1,2 @@ +1002462 +37,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,x,601,x,x,x,x,x,x,x,x,x,x,x,19,x,x,x,x,17,x,x,x,x,x,23,x,x,x,x,x,29,x,443,x,x,x,x,x,x,x,x,x,x,x,x,13 From a34941dbd92cdf3d319cb8f7c66e3d72801cf3b7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 13 Dec 2020 07:38:51 +0100 Subject: [PATCH 114/479] 2020: d13: ex1: add solution --- 2020/d13/ex1/ex1.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 2020/d13/ex1/ex1.py diff --git a/2020/d13/ex1/ex1.py b/2020/d13/ex1/ex1.py new file mode 100755 index 0000000..fadaefb --- /dev/null +++ b/2020/d13/ex1/ex1.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +import itertools +import math +import sys +from typing import List, Tuple + + +def find_first_factor(earliest: int, timings: List[int]) -> Tuple[int, int]: + timings = sorted(timings) + for t in itertools.count(earliest): + for n in timings: + if t % n == 0: + return t - earliest, n + + assert False # Make Mypy happy + + +def solve(raw: List[str]) -> int: + return math.prod( + find_first_factor(int(raw[0]), [int(i) for i in raw[1].split(",") if i != "x"]) + ) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From eccc4f35838226f7888e765e0fb507d0c91fdb00 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 13 Dec 2020 07:38:58 +0100 Subject: [PATCH 115/479] 2020: d13: ex2: add input --- 2020/d13/ex2/input | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 2020/d13/ex2/input diff --git a/2020/d13/ex2/input b/2020/d13/ex2/input new file mode 100644 index 0000000..d644142 --- /dev/null +++ b/2020/d13/ex2/input @@ -0,0 +1,2 @@ +1002462 +37,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,x,41,x,x,x,x,x,x,x,x,x,601,x,x,x,x,x,x,x,x,x,x,x,19,x,x,x,x,17,x,x,x,x,x,23,x,x,x,x,x,29,x,443,x,x,x,x,x,x,x,x,x,x,x,x,13 From 81780a4b728970d34d04818fd0ddb9266abb0914 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 13 Dec 2020 07:39:21 +0100 Subject: [PATCH 116/479] 2020: d13: ex2: add solution --- 2020/d13/ex2/ex2.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100755 2020/d13/ex2/ex2.py diff --git a/2020/d13/ex2/ex2.py b/2020/d13/ex2/ex2.py new file mode 100755 index 0000000..bd76c7d --- /dev/null +++ b/2020/d13/ex2/ex2.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +import math +import sys +from typing import Dict, List + + +def run_contest(timings: List[int]) -> int: + # https://rosettacode.org/wiki/Chinese_remainder_theorem#Python_3.6 + def mul_inv(a: int, b: int) -> int: + b0 = b + x0, x1 = 0, 1 + if b == 1: + return 1 + while a > 1: + q = a // b + a, b = b, a % b + x0, x1 = x1 - q * x0, x0 + if x1 < 0: + x1 += b0 + return x1 + + def chinese_remainder(residue_mapping: Dict[int, int]) -> int: + res = 0 + prod = math.prod(residue_mapping) + for n_i, a_i in residue_mapping.items(): + p = prod // n_i + res += a_i * mul_inv(p, n_i) * p + return res % prod + + residues = {t: -i for (i, t) in enumerate(timings) if t > 0} + return chinese_remainder(residues) + + +def solve(raw: List[str]) -> int: + return run_contest([int(i) if i != "x" else -1 for i in raw[1].split(",")]) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 1c07b0c59ed7f509a929a0c9de025c19bb39deea Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 14 Dec 2020 09:53:17 +0100 Subject: [PATCH 117/479] 2020: d14: ex1: add input --- 2020/d14/ex1/input | 575 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 575 insertions(+) create mode 100644 2020/d14/ex1/input diff --git a/2020/d14/ex1/input b/2020/d14/ex1/input new file mode 100644 index 0000000..f1571c4 --- /dev/null +++ b/2020/d14/ex1/input @@ -0,0 +1,575 @@ +mask = 110100X1X01011X01X0X000111X00XX1010X +mem[29267] = 4155 +mem[6177] = 494929 +mem[47500] = 15063410 +mask = 11110X000010XX10X11X00X11010X0X00101 +mem[10164] = 73599 +mem[61707] = 15191 +mem[53825] = 69618638 +mem[15953] = 10067309 +mem[39889] = 10761258 +mask = 11XXX0XX001X01101111X001000X01X10000 +mem[6917] = 2088 +mem[10383] = 52991144 +mem[14304] = 84876 +mem[6464] = 14167 +mask = X11X0X00001010101XX101100X011X000XX1 +mem[58256] = 51753803 +mem[2919] = 21619 +mask = 111100X00010101011X1XXXXX01X000001X1 +mem[13063] = 6587 +mem[28673] = 3893 +mem[53317] = 236744 +mem[64240] = 29367045 +mask = XX11101X0011X01X1111X001X1X000101110 +mem[59497] = 6945823 +mem[44552] = 193130494 +mem[15034] = 10641 +mem[25467] = 17061678 +mask = X11110X11X11X000110110010110011X0001 +mem[22485] = 90244 +mem[38996] = 221133 +mem[15034] = 12927587 +mem[4425] = 31960477 +mem[18544] = 51522085 +mask = 111100100010X0101XX1110100000XXX0001 +mem[53765] = 1528530 +mem[18576] = 68702 +mem[6484] = 170802 +mem[62813] = 857 +mask = 1X1101010X1X111X110101X1010100010010 +mem[34688] = 36117345 +mem[12832] = 14851833 +mem[12097] = 43 +mem[63931] = 875829 +mask = 10XXX01100101010X1X111010000101101X1 +mem[33582] = 28611764 +mem[53969] = 2641 +mem[53107] = 99965 +mem[40648] = 1834153 +mem[55768] = 974 +mem[52274] = 7634 +mask = 111010X10010111X1111X0XXX00110110001 +mem[43784] = 12232 +mem[23109] = 11403 +mem[18521] = 145694 +mem[12479] = 621 +mask = XX000011001000101111XX101X1X10101X11 +mem[22233] = 30348 +mem[7554] = 346199 +mem[1904] = 12735 +mem[23360] = 73797 +mem[22803] = 62630115 +mask = 1110X0X0X010X01011X10110001X00XX0110 +mem[17347] = 310008019 +mem[39889] = 8179468 +mem[57304] = 861379 +mem[2513] = 10343 +mask = 1111X00100101X1X110101111111010000XX +mem[49939] = 39353857 +mem[48794] = 4266 +mem[16061] = 2768 +mem[7728] = 103608 +mem[17473] = 8980 +mask = 1001XXX10X0X11X0010100001100X0110101 +mem[21497] = 412878 +mem[49939] = 429971 +mem[3405] = 20518 +mem[6160] = 51622 +mem[43784] = 179922643 +mask = 101100X1001X10XX1101X00XX0101000100X +mem[52378] = 1530 +mem[11326] = 121760772 +mem[58232] = 164870285 +mem[21604] = 17658898 +mem[56257] = 373 +mem[37783] = 7760640 +mem[3927] = 427054839 +mask = 1111XXX10010X11X110101011X10XX10000X +mem[18153] = 234818 +mem[56755] = 531 +mem[50940] = 4428 +mem[14849] = 2185318 +mask = 10110001X0101010X101010X10000X110001 +mem[53880] = 33275 +mem[61621] = 40021 +mem[10319] = 9468 +mem[34607] = 1186 +mem[43043] = 51628146 +mem[14912] = 2626679 +mem[4627] = 377 +mask = 111X0X00XXX01110011X10001X1110010101 +mem[39892] = 6297 +mem[13182] = 4721 +mem[41736] = 497649 +mem[40923] = 905 +mask = 1X1X00110010011X1110X0001X10011XXX00 +mem[27118] = 898 +mem[59800] = 499005720 +mask = 11X00101001011100X01X01XX100XX010110 +mem[56505] = 23945612 +mem[13987] = 14200131 +mem[30557] = 10396 +mask = 1110000100X1X01X011111X001101011010X +mem[22942] = 642242 +mem[43083] = 787 +mem[55307] = 818610470 +mem[13145] = 35815 +mask = 00101X01001010X011111101X1001X010101 +mem[34] = 928 +mem[45041] = 12613 +mem[20825] = 18260 +mem[33068] = 34949 +mem[51299] = 1228577 +mask = X11X0001101X001X11010001110X00X01X11 +mem[5587] = 3120 +mem[49934] = 166656215 +mem[12068] = 15929077 +mem[51471] = 225039 +mem[35781] = 703735 +mem[2227] = 788305092 +mem[30564] = 4758296 +mask = 1111X1X000100X10X10010011XX011010110 +mem[44917] = 195410918 +mem[33352] = 480672 +mem[18755] = 6376 +mask = X1X1010000100010XXX0XXX011X011010000 +mem[48717] = 6124 +mem[6213] = 13466626 +mem[33804] = 41450 +mem[42319] = 1001042 +mem[32039] = 22800 +mem[37805] = 3719 +mem[21650] = 5310058 +mask = 1X110X0X00101X10110100111X10000X00X1 +mem[64021] = 527213 +mem[54049] = 2076239 +mem[23361] = 10197597 +mem[29280] = 28451017 +mem[3136] = 46819 +mem[21711] = 62402971 +mask = 1X01000100X01110X101000101000XX10X01 +mem[20911] = 1251 +mem[3136] = 84 +mem[27425] = 174128253 +mem[20825] = 20910 +mem[36929] = 13761934 +mem[44528] = 983 +mask = 1111X000001X001X11111XX1X00X0110000X +mem[516] = 6216446 +mem[33582] = 140720 +mem[11248] = 208955105 +mem[42641] = 4364 +mask = 101X1X10101X10001XXX0001111100011X11 +mem[38531] = 39598 +mem[46500] = 52608117 +mem[43473] = 96876 +mem[14304] = 59167889 +mem[53240] = 15525 +mask = X001100X00X01110111X1101010X00101111 +mem[14918] = 2357 +mem[6160] = 1208519 +mem[34729] = 1611506 +mem[51158] = 2346 +mask = 111X00100000101011010111001110XXX1X0 +mem[28673] = 331536 +mem[43917] = 324 +mem[45633] = 398602 +mem[49398] = 1861 +mem[1376] = 625904 +mask = 01101X00001010100101100X101X10X00011 +mem[28094] = 8805622 +mem[30532] = 3723 +mem[4708] = 14406 +mem[9094] = 50623 +mem[61707] = 73798 +mem[4885] = 224 +mask = 11X1000X001011X011010X01010XX10X0001 +mem[7236] = 865782 +mem[15953] = 487381549 +mask = XX1011000010X11X010X11111100X11100XX +mem[18078] = 16242735 +mem[5995] = 18850 +mem[9604] = 839527 +mem[47055] = 216488 +mem[4059] = 554189 +mem[12823] = 346 +mask = 111100010010111X1X01X1110001X001X000 +mem[936] = 6429561 +mem[40513] = 1695095 +mem[60924] = 252 +mem[55142] = 557439 +mask = 10111010X010X0X01XX1100111010X1X1X00 +mem[38842] = 738 +mem[30409] = 10094059 +mem[303] = 98943 +mem[8017] = 251227 +mask = X1X0X00100100010X101001100110001X100 +mem[57304] = 1975648 +mem[56257] = 1580 +mem[45571] = 14800 +mask = 0XX00011001000X0X1111X11101X101X1000 +mem[43189] = 4422 +mem[40391] = 167654070 +mask = 1110X01100100X10111XX01X1000XX01100X +mem[33804] = 1018 +mem[29496] = 93900747 +mem[9245] = 138506 +mem[62151] = 674748 +mem[4762] = 434956 +mem[37596] = 103373 +mem[27932] = 5730935 +mask = 0111X0000010101X111X01001010101110X0 +mem[36174] = 5162986 +mem[33114] = 3116668 +mem[64325] = 3171 +mem[6917] = 5566099 +mem[30076] = 176956 +mem[14847] = 60238674 +mask = 1110100X00100010XXX1X110000000001X01 +mem[2546] = 7549354 +mem[22803] = 386154 +mem[28386] = 86719 +mask = 11110100X00011X011X10X0011011010X100 +mem[52611] = 131 +mem[47628] = 266 +mem[22198] = 764 +mem[4444] = 406 +mem[20006] = 3520555 +mask = 10111X101010X000100110011100X01X1010 +mem[15300] = 345854040 +mem[49359] = 38235897 +mem[38614] = 54370972 +mem[18472] = 94915 +mem[36746] = 697 +mask = 11111011X011101X111X10100100000X0111 +mem[29295] = 943139945 +mem[9245] = 1505677 +mem[14391] = 3398 +mask = 1001X1X1X1001X10010100001X01XX11X101 +mem[14613] = 15025 +mem[58121] = 1912 +mem[300] = 37310097 +mask = X011001X001010XX11X1100X00XXX0011110 +mem[17438] = 69372377 +mem[39932] = 850 +mem[53370] = 7579742 +mem[49975] = 2831104 +mem[37777] = 2859 +mem[49238] = 508 +mem[57733] = 3881 +mask = 11110010001010X011X1X1X11XX00XX101X0 +mem[29112] = 64162 +mem[9687] = 10115647 +mem[8456] = 404111433 +mem[23461] = 21916957 +mem[49272] = 29938 +mem[20911] = 3016 +mem[45508] = 27114 +mask = X11010X000101X10X1X10X1XXX0110000111 +mem[17094] = 1379888 +mem[19615] = 633 +mem[43148] = 125580 +mem[12097] = 33116239 +mem[34723] = 9358 +mask = X111X010010X101011110X00011111000101 +mem[63053] = 691425156 +mem[24475] = 286162 +mem[54863] = 76914 +mem[58008] = 1422 +mem[24141] = 657 +mem[34729] = 49841 +mask = 1110XXXXX0X011100X0101X1010X10001100 +mem[14613] = 4510 +mem[47926] = 39745 +mem[8475] = 327407289 +mem[22599] = 699202 +mem[53880] = 822 +mem[56755] = 1267566 +mask = 1X1110X1101X100011X110X01X0001110XX1 +mem[8272] = 301 +mem[65364] = 3792396 +mem[38614] = 591 +mem[10929] = 4608 +mem[30304] = 2186 +mask = 1110000110X0001011010011110000X0X01X +mem[12247] = 1533938 +mem[24376] = 12421 +mem[16168] = 17660 +mask = 001000000010101X11X101X00001X00XX0X0 +mem[606] = 2029 +mem[55307] = 598939 +mem[26724] = 59403185 +mask = 11X10XX000X01X101X01010110000X00000X +mem[4022] = 39755 +mem[39281] = 801343 +mem[46388] = 161 +mem[21585] = 11357692 +mem[45828] = 28056 +mask = 11111X11101111001101XX11X1010X00X11X +mem[47755] = 3034 +mem[42293] = 208825 +mem[29700] = 38238 +mem[22485] = 1319489 +mask = 110100X0001X101X11010011100X000X0101 +mem[3549] = 18335450 +mem[58890] = 2676627 +mem[58022] = 17558 +mem[54581] = 2533100 +mem[10929] = 280423870 +mem[63555] = 2319 +mem[2546] = 926 +mask = 1110X011001XXX101111X1110001X110X001 +mem[23536] = 4353 +mem[59601] = 798347 +mem[20671] = 389086 +mask = 111100X000101010110101001XX1XX11X110 +mem[1922] = 27551122 +mem[19645] = 370473454 +mem[32150] = 214932 +mem[22144] = 2339 +mask = 111000100110X01X1101101XX01111010X00 +mem[35424] = 110774 +mem[57733] = 531999 +mem[45139] = 30278097 +mem[21648] = 16240 +mask = 1010X00100X00010111101001X0X00X10010 +mem[58367] = 71950736 +mem[855] = 21617593 +mem[27425] = 1287663 +mem[45595] = 1472271 +mem[37043] = 1635315 +mask = 111X00X1001X110011010010X0001100000X +mem[7355] = 208029905 +mem[52551] = 6755 +mem[49542] = 11911 +mem[44588] = 377151 +mem[64240] = 61021 +mem[8017] = 3572 +mask = 0X101000001011X011X101X0000X0000X011 +mem[47482] = 1568110 +mem[28053] = 707 +mem[60195] = 1645 +mask = 11110000001X101011X1101010110X00011X +mem[27869] = 17384703 +mem[17643] = 2734129 +mem[12802] = 3774302 +mem[64154] = 916 +mask = X111X00X0010110011010X01111001010XX1 +mem[64313] = 102372 +mem[1522] = 15753175 +mem[40584] = 728098 +mem[4315] = 227246865 +mem[55272] = 7469 +mem[15889] = 7541958 +mem[2464] = 371279 +mask = XX01X011X01011101101X00XX10X00110100 +mem[5157] = 275 +mem[12864] = 4756 +mem[31054] = 1960 +mem[52498] = 2797835 +mem[62151] = 4302055 +mask = 0X1X00X000101X1X1111010X000101X00110 +mem[10919] = 612216 +mem[15357] = 629148 +mem[52500] = 9503 +mem[17094] = 7855156 +mem[6652] = 34492510 +mem[10426] = 726153 +mask = 010X00110010001X1111101XXX01X0X00101 +mem[12974] = 9133 +mem[14108] = 3766 +mem[24429] = 1803969 +mem[55142] = 36626772 +mem[34019] = 473252 +mem[33604] = 206855588 +mask = XX1010X10010X01011X11X0011X01011XX11 +mem[60027] = 841211 +mem[21538] = 91609915 +mem[6123] = 97596 +mem[50346] = 1087 +mem[40221] = 644 +mem[8944] = 551344 +mask = 111000X0001XX0100111111001100X00000X +mem[35547] = 950205 +mem[3312] = 880 +mem[48780] = 112556701 +mem[4531] = 126242 +mem[39889] = 1541 +mem[24463] = 9010512 +mask = 11XX101X1X101X001X0111X101000X1X0001 +mem[64081] = 140604 +mem[59066] = 420736 +mem[48653] = 54226 +mem[32039] = 128940 +mem[35847] = 5 +mask = 1001XX01X000111011X1X101000X0X0X1011 +mem[58689] = 43170762 +mem[12832] = 298144839 +mem[1474] = 132921 +mem[48057] = 37242 +mem[50871] = 3602555 +mem[56611] = 31214078 +mask = 101X000100X011X01101XX10011X0XX1X011 +mem[7317] = 2861082 +mem[59424] = 214468 +mask = 10X110111011101010110X10111001100XX1 +mem[19313] = 2195784 +mem[38614] = 1263318 +mem[26637] = 54905795 +mem[8165] = 209848 +mem[2919] = 173 +mem[928] = 7285 +mask = 1011101XX011XX1X10111000011010X11111 +mem[55792] = 11794686 +mem[48675] = 377 +mem[6484] = 857 +mem[60951] = 523305753 +mem[40488] = 713 +mem[61858] = 12068 +mask = 1110X1XX0010111X01011111X000X0X1011X +mem[65124] = 178147455 +mem[15914] = 3503977 +mem[35424] = 232628 +mask = 11X0XXX100100010X1X101001XX100110001 +mem[14344] = 2670 +mem[20825] = 27980258 +mem[2792] = 447228346 +mem[29177] = 822367210 +mem[30651] = 1658444 +mem[14099] = 389 +mask = 110001X1X010X110X101X011X100X1X10110 +mem[54275] = 15249248 +mem[3293] = 9475932 +mem[8835] = 864371828 +mem[45269] = 3632 +mem[19645] = 580157 +mask = 101X101XX01X10X01X1110X0110X1011011X +mem[40765] = 53494316 +mem[35543] = 11261002 +mem[13933] = 768 +mem[38594] = 464498 +mem[64240] = 22406 +mask = 110100010X10111011X100X1010001X1X1X0 +mem[20911] = 225 +mem[12748] = 621 +mem[29907] = 363502 +mem[14613] = 3957288 +mem[64313] = 389459 +mem[21648] = 2008398 +mask = 111X101X00X0X010X1110110X00011X1X011 +mem[33134] = 1049991943 +mem[25205] = 4126902 +mask = 1X10101001101X1011X100X00X1X1101X100 +mem[18755] = 713 +mem[38650] = 119518 +mem[33804] = 3211485 +mem[14609] = 10752655 +mem[59822] = 234204205 +mask = 1X1XX0111X1X11001101100X110100X0X010 +mem[44041] = 255408886 +mem[62469] = 22090167 +mem[12247] = 1760642 +mask = 1110101000001X101X11010010XX110001XX +mem[30389] = 29125 +mem[10833] = 1979 +mask = 11111010111X1X001001111X1X1000010001 +mem[20949] = 90971 +mem[16774] = 9470584 +mem[56713] = 73907316 +mem[9264] = 36226 +mem[60287] = 571 +mem[25303] = 16376 +mask = X1010X0XX01000X0001000X0X0010000X110 +mem[59573] = 60076 +mem[14516] = 1634251 +mem[36459] = 843815961 +mem[3293] = 265 +mask = 01010100001X00101100X0X0111X11001101 +mem[28480] = 437785448 +mem[29724] = 28414900 +mem[22867] = 14233982 +mem[45019] = 1644931 +mask = 111XX0100XX0101011X1011X001X11X101X0 +mem[28545] = 461 +mem[14609] = 3934 +mem[50765] = 103069037 +mem[12832] = 1926345 +mem[36929] = 1633120 +mem[33372] = 23156328 +mask = X11X000000XX11X011X1XX0110000X000001 +mem[12748] = 2069634 +mem[35456] = 8101313 +mem[21508] = 243298359 +mask = X1X01001011X001001010110101100X10011 +mem[27953] = 3450 +mem[22680] = 50713870 +mem[55768] = 182841527 +mem[29021] = 70952 +mem[59553] = 38886 +mem[45283] = 84846018 +mem[29849] = 66463 +mask = 100XX1111X0011100X01000X010000000101 +mem[53280] = 2165 +mem[551] = 556704 +mem[3512] = 16238 +mem[2868] = 27158838 +mem[23659] = 245809 +mask = 1110X001X010X0101X01110100000X10111X +mem[36789] = 51664764 +mem[33348] = 1689925 +mem[19745] = 849985 +mem[7335] = 3678 +mem[25634] = 2206 +mem[13782] = 1985 +mask = 11110000X0100110XX11X0110100X0110001 +mem[18372] = 193162 +mem[5878] = 7411977 +mem[30564] = 89127 +mem[45210] = 64823202 +mem[22016] = 3987667 +mem[7092] = 370183817 +mem[64313] = 2487681 +mask = 10X0000100100X101X1X1101110000X0X011 +mem[6160] = 9833 +mem[26168] = 120117155 +mem[13319] = 18180 +mask = 1X01X001X0X01X1011110001100X0110X100 +mem[29267] = 385 +mem[13597] = 535380132 +mem[58085] = 3408333 +mem[46178] = 246464 +mem[64848] = 140510 +mem[19733] = 322520311 +mask = 1101101110XX1000X001101110000000X1X0 +mem[56355] = 894 +mem[13795] = 13763 +mem[38247] = 1412147 +mem[46043] = 10668 +mem[9370] = 8326048 +mem[27470] = 524 +mask = 111010010X1000100X01X1XX10XX0XX10000 +mem[45269] = 129135 +mem[33483] = 11595926 +mem[9827] = 18572496 +mem[27939] = 32963714 +mem[48103] = 89693846 +mask = X11XX111001001101101010101000X000101 +mem[12666] = 61469 +mem[40505] = 14463 +mem[49277] = 118992 +mem[16161] = 105 +mem[23321] = 183700 +mem[48653] = 930591910 +mask = 111X00100X0X1010110100001X011X1X00X0 +mem[59706] = 227615179 +mem[21221] = 1424545 +mem[54816] = 37682162 +mem[57789] = 91718 +mem[25191] = 3615219 +mem[10390] = 240 +mask = 1110X0XX001XX010X1110110001011010X01 +mem[60974] = 5579328 +mem[61131] = 337545 +mem[16774] = 2030 +mem[6637] = 5249 From 1f2d646838eb03b08e4efd152529f658003bce2d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 14 Dec 2020 09:53:24 +0100 Subject: [PATCH 118/479] 2020: d14: ex1: add solution --- 2020/d14/ex1/ex1.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100755 2020/d14/ex1/ex1.py diff --git a/2020/d14/ex1/ex1.py b/2020/d14/ex1/ex1.py new file mode 100755 index 0000000..a58c8f0 --- /dev/null +++ b/2020/d14/ex1/ex1.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python +import re +import sys +from dataclasses import dataclass +from typing import Dict, List + + +@dataclass +class Mask: + ones: int + zeros: int + + +Memory = Dict[int, int] + + +def solve(raw: List[str]) -> int: + mask = Mask( + 0, + (2 << 36) - 1, + ) + mem_pattern = re.compile("mem\\[([0-9]+)\\] = ([0-9]+)") + mask_pattern = re.compile("mask = ([01X]+)") + mem: Memory = {} + for instr in raw: + if (mem_match := mem_pattern.match(instr)) is not None: + addr, val = int(mem_match.group(1)), int(mem_match.group(2)) + val |= mask.ones + val &= mask.zeros + mem[addr] = val + elif (mask_match := mask_pattern.match(instr)) is not None: + ones = int(mask_match.group(1).replace("X", "0"), 2) + zeros = int(mask_match.group(1).replace("X", "1"), 2) + mask = Mask(ones, zeros) + return sum(mem.values()) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From fc7ea5bc2bb4fcb2a8458b639ce027ecdc12def7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 14 Dec 2020 09:53:39 +0100 Subject: [PATCH 119/479] 2020: d15: ex2: add input --- 2020/d14/ex2/input | 575 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 575 insertions(+) create mode 100644 2020/d14/ex2/input diff --git a/2020/d14/ex2/input b/2020/d14/ex2/input new file mode 100644 index 0000000..f1571c4 --- /dev/null +++ b/2020/d14/ex2/input @@ -0,0 +1,575 @@ +mask = 110100X1X01011X01X0X000111X00XX1010X +mem[29267] = 4155 +mem[6177] = 494929 +mem[47500] = 15063410 +mask = 11110X000010XX10X11X00X11010X0X00101 +mem[10164] = 73599 +mem[61707] = 15191 +mem[53825] = 69618638 +mem[15953] = 10067309 +mem[39889] = 10761258 +mask = 11XXX0XX001X01101111X001000X01X10000 +mem[6917] = 2088 +mem[10383] = 52991144 +mem[14304] = 84876 +mem[6464] = 14167 +mask = X11X0X00001010101XX101100X011X000XX1 +mem[58256] = 51753803 +mem[2919] = 21619 +mask = 111100X00010101011X1XXXXX01X000001X1 +mem[13063] = 6587 +mem[28673] = 3893 +mem[53317] = 236744 +mem[64240] = 29367045 +mask = XX11101X0011X01X1111X001X1X000101110 +mem[59497] = 6945823 +mem[44552] = 193130494 +mem[15034] = 10641 +mem[25467] = 17061678 +mask = X11110X11X11X000110110010110011X0001 +mem[22485] = 90244 +mem[38996] = 221133 +mem[15034] = 12927587 +mem[4425] = 31960477 +mem[18544] = 51522085 +mask = 111100100010X0101XX1110100000XXX0001 +mem[53765] = 1528530 +mem[18576] = 68702 +mem[6484] = 170802 +mem[62813] = 857 +mask = 1X1101010X1X111X110101X1010100010010 +mem[34688] = 36117345 +mem[12832] = 14851833 +mem[12097] = 43 +mem[63931] = 875829 +mask = 10XXX01100101010X1X111010000101101X1 +mem[33582] = 28611764 +mem[53969] = 2641 +mem[53107] = 99965 +mem[40648] = 1834153 +mem[55768] = 974 +mem[52274] = 7634 +mask = 111010X10010111X1111X0XXX00110110001 +mem[43784] = 12232 +mem[23109] = 11403 +mem[18521] = 145694 +mem[12479] = 621 +mask = XX000011001000101111XX101X1X10101X11 +mem[22233] = 30348 +mem[7554] = 346199 +mem[1904] = 12735 +mem[23360] = 73797 +mem[22803] = 62630115 +mask = 1110X0X0X010X01011X10110001X00XX0110 +mem[17347] = 310008019 +mem[39889] = 8179468 +mem[57304] = 861379 +mem[2513] = 10343 +mask = 1111X00100101X1X110101111111010000XX +mem[49939] = 39353857 +mem[48794] = 4266 +mem[16061] = 2768 +mem[7728] = 103608 +mem[17473] = 8980 +mask = 1001XXX10X0X11X0010100001100X0110101 +mem[21497] = 412878 +mem[49939] = 429971 +mem[3405] = 20518 +mem[6160] = 51622 +mem[43784] = 179922643 +mask = 101100X1001X10XX1101X00XX0101000100X +mem[52378] = 1530 +mem[11326] = 121760772 +mem[58232] = 164870285 +mem[21604] = 17658898 +mem[56257] = 373 +mem[37783] = 7760640 +mem[3927] = 427054839 +mask = 1111XXX10010X11X110101011X10XX10000X +mem[18153] = 234818 +mem[56755] = 531 +mem[50940] = 4428 +mem[14849] = 2185318 +mask = 10110001X0101010X101010X10000X110001 +mem[53880] = 33275 +mem[61621] = 40021 +mem[10319] = 9468 +mem[34607] = 1186 +mem[43043] = 51628146 +mem[14912] = 2626679 +mem[4627] = 377 +mask = 111X0X00XXX01110011X10001X1110010101 +mem[39892] = 6297 +mem[13182] = 4721 +mem[41736] = 497649 +mem[40923] = 905 +mask = 1X1X00110010011X1110X0001X10011XXX00 +mem[27118] = 898 +mem[59800] = 499005720 +mask = 11X00101001011100X01X01XX100XX010110 +mem[56505] = 23945612 +mem[13987] = 14200131 +mem[30557] = 10396 +mask = 1110000100X1X01X011111X001101011010X +mem[22942] = 642242 +mem[43083] = 787 +mem[55307] = 818610470 +mem[13145] = 35815 +mask = 00101X01001010X011111101X1001X010101 +mem[34] = 928 +mem[45041] = 12613 +mem[20825] = 18260 +mem[33068] = 34949 +mem[51299] = 1228577 +mask = X11X0001101X001X11010001110X00X01X11 +mem[5587] = 3120 +mem[49934] = 166656215 +mem[12068] = 15929077 +mem[51471] = 225039 +mem[35781] = 703735 +mem[2227] = 788305092 +mem[30564] = 4758296 +mask = 1111X1X000100X10X10010011XX011010110 +mem[44917] = 195410918 +mem[33352] = 480672 +mem[18755] = 6376 +mask = X1X1010000100010XXX0XXX011X011010000 +mem[48717] = 6124 +mem[6213] = 13466626 +mem[33804] = 41450 +mem[42319] = 1001042 +mem[32039] = 22800 +mem[37805] = 3719 +mem[21650] = 5310058 +mask = 1X110X0X00101X10110100111X10000X00X1 +mem[64021] = 527213 +mem[54049] = 2076239 +mem[23361] = 10197597 +mem[29280] = 28451017 +mem[3136] = 46819 +mem[21711] = 62402971 +mask = 1X01000100X01110X101000101000XX10X01 +mem[20911] = 1251 +mem[3136] = 84 +mem[27425] = 174128253 +mem[20825] = 20910 +mem[36929] = 13761934 +mem[44528] = 983 +mask = 1111X000001X001X11111XX1X00X0110000X +mem[516] = 6216446 +mem[33582] = 140720 +mem[11248] = 208955105 +mem[42641] = 4364 +mask = 101X1X10101X10001XXX0001111100011X11 +mem[38531] = 39598 +mem[46500] = 52608117 +mem[43473] = 96876 +mem[14304] = 59167889 +mem[53240] = 15525 +mask = X001100X00X01110111X1101010X00101111 +mem[14918] = 2357 +mem[6160] = 1208519 +mem[34729] = 1611506 +mem[51158] = 2346 +mask = 111X00100000101011010111001110XXX1X0 +mem[28673] = 331536 +mem[43917] = 324 +mem[45633] = 398602 +mem[49398] = 1861 +mem[1376] = 625904 +mask = 01101X00001010100101100X101X10X00011 +mem[28094] = 8805622 +mem[30532] = 3723 +mem[4708] = 14406 +mem[9094] = 50623 +mem[61707] = 73798 +mem[4885] = 224 +mask = 11X1000X001011X011010X01010XX10X0001 +mem[7236] = 865782 +mem[15953] = 487381549 +mask = XX1011000010X11X010X11111100X11100XX +mem[18078] = 16242735 +mem[5995] = 18850 +mem[9604] = 839527 +mem[47055] = 216488 +mem[4059] = 554189 +mem[12823] = 346 +mask = 111100010010111X1X01X1110001X001X000 +mem[936] = 6429561 +mem[40513] = 1695095 +mem[60924] = 252 +mem[55142] = 557439 +mask = 10111010X010X0X01XX1100111010X1X1X00 +mem[38842] = 738 +mem[30409] = 10094059 +mem[303] = 98943 +mem[8017] = 251227 +mask = X1X0X00100100010X101001100110001X100 +mem[57304] = 1975648 +mem[56257] = 1580 +mem[45571] = 14800 +mask = 0XX00011001000X0X1111X11101X101X1000 +mem[43189] = 4422 +mem[40391] = 167654070 +mask = 1110X01100100X10111XX01X1000XX01100X +mem[33804] = 1018 +mem[29496] = 93900747 +mem[9245] = 138506 +mem[62151] = 674748 +mem[4762] = 434956 +mem[37596] = 103373 +mem[27932] = 5730935 +mask = 0111X0000010101X111X01001010101110X0 +mem[36174] = 5162986 +mem[33114] = 3116668 +mem[64325] = 3171 +mem[6917] = 5566099 +mem[30076] = 176956 +mem[14847] = 60238674 +mask = 1110100X00100010XXX1X110000000001X01 +mem[2546] = 7549354 +mem[22803] = 386154 +mem[28386] = 86719 +mask = 11110100X00011X011X10X0011011010X100 +mem[52611] = 131 +mem[47628] = 266 +mem[22198] = 764 +mem[4444] = 406 +mem[20006] = 3520555 +mask = 10111X101010X000100110011100X01X1010 +mem[15300] = 345854040 +mem[49359] = 38235897 +mem[38614] = 54370972 +mem[18472] = 94915 +mem[36746] = 697 +mask = 11111011X011101X111X10100100000X0111 +mem[29295] = 943139945 +mem[9245] = 1505677 +mem[14391] = 3398 +mask = 1001X1X1X1001X10010100001X01XX11X101 +mem[14613] = 15025 +mem[58121] = 1912 +mem[300] = 37310097 +mask = X011001X001010XX11X1100X00XXX0011110 +mem[17438] = 69372377 +mem[39932] = 850 +mem[53370] = 7579742 +mem[49975] = 2831104 +mem[37777] = 2859 +mem[49238] = 508 +mem[57733] = 3881 +mask = 11110010001010X011X1X1X11XX00XX101X0 +mem[29112] = 64162 +mem[9687] = 10115647 +mem[8456] = 404111433 +mem[23461] = 21916957 +mem[49272] = 29938 +mem[20911] = 3016 +mem[45508] = 27114 +mask = X11010X000101X10X1X10X1XXX0110000111 +mem[17094] = 1379888 +mem[19615] = 633 +mem[43148] = 125580 +mem[12097] = 33116239 +mem[34723] = 9358 +mask = X111X010010X101011110X00011111000101 +mem[63053] = 691425156 +mem[24475] = 286162 +mem[54863] = 76914 +mem[58008] = 1422 +mem[24141] = 657 +mem[34729] = 49841 +mask = 1110XXXXX0X011100X0101X1010X10001100 +mem[14613] = 4510 +mem[47926] = 39745 +mem[8475] = 327407289 +mem[22599] = 699202 +mem[53880] = 822 +mem[56755] = 1267566 +mask = 1X1110X1101X100011X110X01X0001110XX1 +mem[8272] = 301 +mem[65364] = 3792396 +mem[38614] = 591 +mem[10929] = 4608 +mem[30304] = 2186 +mask = 1110000110X0001011010011110000X0X01X +mem[12247] = 1533938 +mem[24376] = 12421 +mem[16168] = 17660 +mask = 001000000010101X11X101X00001X00XX0X0 +mem[606] = 2029 +mem[55307] = 598939 +mem[26724] = 59403185 +mask = 11X10XX000X01X101X01010110000X00000X +mem[4022] = 39755 +mem[39281] = 801343 +mem[46388] = 161 +mem[21585] = 11357692 +mem[45828] = 28056 +mask = 11111X11101111001101XX11X1010X00X11X +mem[47755] = 3034 +mem[42293] = 208825 +mem[29700] = 38238 +mem[22485] = 1319489 +mask = 110100X0001X101X11010011100X000X0101 +mem[3549] = 18335450 +mem[58890] = 2676627 +mem[58022] = 17558 +mem[54581] = 2533100 +mem[10929] = 280423870 +mem[63555] = 2319 +mem[2546] = 926 +mask = 1110X011001XXX101111X1110001X110X001 +mem[23536] = 4353 +mem[59601] = 798347 +mem[20671] = 389086 +mask = 111100X000101010110101001XX1XX11X110 +mem[1922] = 27551122 +mem[19645] = 370473454 +mem[32150] = 214932 +mem[22144] = 2339 +mask = 111000100110X01X1101101XX01111010X00 +mem[35424] = 110774 +mem[57733] = 531999 +mem[45139] = 30278097 +mem[21648] = 16240 +mask = 1010X00100X00010111101001X0X00X10010 +mem[58367] = 71950736 +mem[855] = 21617593 +mem[27425] = 1287663 +mem[45595] = 1472271 +mem[37043] = 1635315 +mask = 111X00X1001X110011010010X0001100000X +mem[7355] = 208029905 +mem[52551] = 6755 +mem[49542] = 11911 +mem[44588] = 377151 +mem[64240] = 61021 +mem[8017] = 3572 +mask = 0X101000001011X011X101X0000X0000X011 +mem[47482] = 1568110 +mem[28053] = 707 +mem[60195] = 1645 +mask = 11110000001X101011X1101010110X00011X +mem[27869] = 17384703 +mem[17643] = 2734129 +mem[12802] = 3774302 +mem[64154] = 916 +mask = X111X00X0010110011010X01111001010XX1 +mem[64313] = 102372 +mem[1522] = 15753175 +mem[40584] = 728098 +mem[4315] = 227246865 +mem[55272] = 7469 +mem[15889] = 7541958 +mem[2464] = 371279 +mask = XX01X011X01011101101X00XX10X00110100 +mem[5157] = 275 +mem[12864] = 4756 +mem[31054] = 1960 +mem[52498] = 2797835 +mem[62151] = 4302055 +mask = 0X1X00X000101X1X1111010X000101X00110 +mem[10919] = 612216 +mem[15357] = 629148 +mem[52500] = 9503 +mem[17094] = 7855156 +mem[6652] = 34492510 +mem[10426] = 726153 +mask = 010X00110010001X1111101XXX01X0X00101 +mem[12974] = 9133 +mem[14108] = 3766 +mem[24429] = 1803969 +mem[55142] = 36626772 +mem[34019] = 473252 +mem[33604] = 206855588 +mask = XX1010X10010X01011X11X0011X01011XX11 +mem[60027] = 841211 +mem[21538] = 91609915 +mem[6123] = 97596 +mem[50346] = 1087 +mem[40221] = 644 +mem[8944] = 551344 +mask = 111000X0001XX0100111111001100X00000X +mem[35547] = 950205 +mem[3312] = 880 +mem[48780] = 112556701 +mem[4531] = 126242 +mem[39889] = 1541 +mem[24463] = 9010512 +mask = 11XX101X1X101X001X0111X101000X1X0001 +mem[64081] = 140604 +mem[59066] = 420736 +mem[48653] = 54226 +mem[32039] = 128940 +mem[35847] = 5 +mask = 1001XX01X000111011X1X101000X0X0X1011 +mem[58689] = 43170762 +mem[12832] = 298144839 +mem[1474] = 132921 +mem[48057] = 37242 +mem[50871] = 3602555 +mem[56611] = 31214078 +mask = 101X000100X011X01101XX10011X0XX1X011 +mem[7317] = 2861082 +mem[59424] = 214468 +mask = 10X110111011101010110X10111001100XX1 +mem[19313] = 2195784 +mem[38614] = 1263318 +mem[26637] = 54905795 +mem[8165] = 209848 +mem[2919] = 173 +mem[928] = 7285 +mask = 1011101XX011XX1X10111000011010X11111 +mem[55792] = 11794686 +mem[48675] = 377 +mem[6484] = 857 +mem[60951] = 523305753 +mem[40488] = 713 +mem[61858] = 12068 +mask = 1110X1XX0010111X01011111X000X0X1011X +mem[65124] = 178147455 +mem[15914] = 3503977 +mem[35424] = 232628 +mask = 11X0XXX100100010X1X101001XX100110001 +mem[14344] = 2670 +mem[20825] = 27980258 +mem[2792] = 447228346 +mem[29177] = 822367210 +mem[30651] = 1658444 +mem[14099] = 389 +mask = 110001X1X010X110X101X011X100X1X10110 +mem[54275] = 15249248 +mem[3293] = 9475932 +mem[8835] = 864371828 +mem[45269] = 3632 +mem[19645] = 580157 +mask = 101X101XX01X10X01X1110X0110X1011011X +mem[40765] = 53494316 +mem[35543] = 11261002 +mem[13933] = 768 +mem[38594] = 464498 +mem[64240] = 22406 +mask = 110100010X10111011X100X1010001X1X1X0 +mem[20911] = 225 +mem[12748] = 621 +mem[29907] = 363502 +mem[14613] = 3957288 +mem[64313] = 389459 +mem[21648] = 2008398 +mask = 111X101X00X0X010X1110110X00011X1X011 +mem[33134] = 1049991943 +mem[25205] = 4126902 +mask = 1X10101001101X1011X100X00X1X1101X100 +mem[18755] = 713 +mem[38650] = 119518 +mem[33804] = 3211485 +mem[14609] = 10752655 +mem[59822] = 234204205 +mask = 1X1XX0111X1X11001101100X110100X0X010 +mem[44041] = 255408886 +mem[62469] = 22090167 +mem[12247] = 1760642 +mask = 1110101000001X101X11010010XX110001XX +mem[30389] = 29125 +mem[10833] = 1979 +mask = 11111010111X1X001001111X1X1000010001 +mem[20949] = 90971 +mem[16774] = 9470584 +mem[56713] = 73907316 +mem[9264] = 36226 +mem[60287] = 571 +mem[25303] = 16376 +mask = X1010X0XX01000X0001000X0X0010000X110 +mem[59573] = 60076 +mem[14516] = 1634251 +mem[36459] = 843815961 +mem[3293] = 265 +mask = 01010100001X00101100X0X0111X11001101 +mem[28480] = 437785448 +mem[29724] = 28414900 +mem[22867] = 14233982 +mem[45019] = 1644931 +mask = 111XX0100XX0101011X1011X001X11X101X0 +mem[28545] = 461 +mem[14609] = 3934 +mem[50765] = 103069037 +mem[12832] = 1926345 +mem[36929] = 1633120 +mem[33372] = 23156328 +mask = X11X000000XX11X011X1XX0110000X000001 +mem[12748] = 2069634 +mem[35456] = 8101313 +mem[21508] = 243298359 +mask = X1X01001011X001001010110101100X10011 +mem[27953] = 3450 +mem[22680] = 50713870 +mem[55768] = 182841527 +mem[29021] = 70952 +mem[59553] = 38886 +mem[45283] = 84846018 +mem[29849] = 66463 +mask = 100XX1111X0011100X01000X010000000101 +mem[53280] = 2165 +mem[551] = 556704 +mem[3512] = 16238 +mem[2868] = 27158838 +mem[23659] = 245809 +mask = 1110X001X010X0101X01110100000X10111X +mem[36789] = 51664764 +mem[33348] = 1689925 +mem[19745] = 849985 +mem[7335] = 3678 +mem[25634] = 2206 +mem[13782] = 1985 +mask = 11110000X0100110XX11X0110100X0110001 +mem[18372] = 193162 +mem[5878] = 7411977 +mem[30564] = 89127 +mem[45210] = 64823202 +mem[22016] = 3987667 +mem[7092] = 370183817 +mem[64313] = 2487681 +mask = 10X0000100100X101X1X1101110000X0X011 +mem[6160] = 9833 +mem[26168] = 120117155 +mem[13319] = 18180 +mask = 1X01X001X0X01X1011110001100X0110X100 +mem[29267] = 385 +mem[13597] = 535380132 +mem[58085] = 3408333 +mem[46178] = 246464 +mem[64848] = 140510 +mem[19733] = 322520311 +mask = 1101101110XX1000X001101110000000X1X0 +mem[56355] = 894 +mem[13795] = 13763 +mem[38247] = 1412147 +mem[46043] = 10668 +mem[9370] = 8326048 +mem[27470] = 524 +mask = 111010010X1000100X01X1XX10XX0XX10000 +mem[45269] = 129135 +mem[33483] = 11595926 +mem[9827] = 18572496 +mem[27939] = 32963714 +mem[48103] = 89693846 +mask = X11XX111001001101101010101000X000101 +mem[12666] = 61469 +mem[40505] = 14463 +mem[49277] = 118992 +mem[16161] = 105 +mem[23321] = 183700 +mem[48653] = 930591910 +mask = 111X00100X0X1010110100001X011X1X00X0 +mem[59706] = 227615179 +mem[21221] = 1424545 +mem[54816] = 37682162 +mem[57789] = 91718 +mem[25191] = 3615219 +mem[10390] = 240 +mask = 1110X0XX001XX010X1110110001011010X01 +mem[60974] = 5579328 +mem[61131] = 337545 +mem[16774] = 2030 +mem[6637] = 5249 From 9d60496ca59717af6934dd7d4a68ab7138f4cf50 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 14 Dec 2020 09:53:44 +0100 Subject: [PATCH 120/479] 2020: d15: ex2: add solution --- 2020/d14/ex2/ex2.py | 56 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100755 2020/d14/ex2/ex2.py diff --git a/2020/d14/ex2/ex2.py b/2020/d14/ex2/ex2.py new file mode 100755 index 0000000..55c254c --- /dev/null +++ b/2020/d14/ex2/ex2.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python +import itertools +import re +import sys +from dataclasses import dataclass +from typing import Dict, Iterator, List + + +@dataclass +class Mask: + ones: int + zeros: int + + +Memory = Dict[int, int] + + +def gen_floats(xs: int) -> Iterator[int]: + x_positions = [i for i in range(36) if (1 << i) & xs] + + return ( + sum(1 << x_positions[i] for i, v in enumerate(val) if v == 1) + for val in itertools.product([0, 1], repeat=len(x_positions)) + ) + + +def solve(raw: List[str]) -> int: + mask = Mask( + 0, + (2 << 36) - 1, + ) + mem_pattern = re.compile("mem\\[([0-9]+)\\] = ([0-9]+)") + mask_pattern = re.compile("mask = ([01X]+)") + mem: Memory = {} + for instr in raw: + if (mem_match := mem_pattern.match(instr)) is not None: + addr, val = int(mem_match.group(1)), int(mem_match.group(2)) + addr |= mask.ones + xs = ~mask.ones & mask.zeros + addr &= ~xs # Put floating bits to 0 + for x in gen_floats(xs): + mem[addr | x] = val + elif (mask_match := mask_pattern.match(instr)) is not None: + ones = int(mask_match.group(1).replace("X", "0"), 2) + zeros = int(mask_match.group(1).replace("X", "1"), 2) + mask = Mask(ones, zeros) + return sum(mem.values()) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 7177c0f2b267081b92112e2365f4e3858210534d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 15 Dec 2020 11:15:59 +0100 Subject: [PATCH 121/479] 2020: d15: ex1: add input --- 2020/d15/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2020/d15/ex1/input diff --git a/2020/d15/ex1/input b/2020/d15/ex1/input new file mode 100644 index 0000000..f4a49fb --- /dev/null +++ b/2020/d15/ex1/input @@ -0,0 +1 @@ +0,13,1,16,6,17 From a84e93e8a0030e2e3546fe3056491438d30def82 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 15 Dec 2020 11:16:05 +0100 Subject: [PATCH 122/479] 2020: d15: ex1: add solution --- 2020/d15/ex1/ex1.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100755 2020/d15/ex1/ex1.py diff --git a/2020/d15/ex1/ex1.py b/2020/d15/ex1/ex1.py new file mode 100755 index 0000000..a6cd437 --- /dev/null +++ b/2020/d15/ex1/ex1.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +import itertools +import sys +from collections import defaultdict +from typing import Dict, Iterator, List + + +def nth(iterable: Iterator[int], n: int) -> int: + return next(itertools.islice(iterable, n, None)) + + +def spoken(spoken: List[int]) -> Iterator[int]: + turn = 0 + turns: Dict[int, List[int]] = defaultdict(list) + for last in spoken: + turn += 1 + turns[last].append(turn) + yield last + while True: + if len(last_turn := turns[last]) < 2: + last = 0 + else: + last = last_turn[-1] - last_turn[-2] + turn += 1 + turns[last].append(turn) + yield last + + +def solve(nums: List[int]) -> int: + return nth(spoken(nums), 2020 - 1) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + assert len(input) == 1 + print(solve([int(i) for i in input[0].split(",")])) + + +if __name__ == "__main__": + main() From 61b0b760196567d64ddb8e474d9bf5b964dc6e95 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 15 Dec 2020 11:16:20 +0100 Subject: [PATCH 123/479] 2020: d15: ex2: add input --- 2020/d15/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2020/d15/ex2/input diff --git a/2020/d15/ex2/input b/2020/d15/ex2/input new file mode 100644 index 0000000..f4a49fb --- /dev/null +++ b/2020/d15/ex2/input @@ -0,0 +1 @@ +0,13,1,16,6,17 From 2c67bb79bdfe81e5f442d5067089ce32c34563d9 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 15 Dec 2020 11:16:26 +0100 Subject: [PATCH 124/479] 2020: d15: ex2: add solution --- 2020/d15/ex2/ex2.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100755 2020/d15/ex2/ex2.py diff --git a/2020/d15/ex2/ex2.py b/2020/d15/ex2/ex2.py new file mode 100755 index 0000000..4d9077e --- /dev/null +++ b/2020/d15/ex2/ex2.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python +import itertools +import sys +from collections import defaultdict +from typing import Dict, Iterator, List + + +def nth(iterable: Iterator[int], n: int) -> int: + return next(itertools.islice(iterable, n, None)) + + +def spoken(spoken: List[int]) -> Iterator[int]: + turn = 0 + turns: Dict[int, List[int]] = defaultdict(list) + for last in spoken: + turn += 1 + turns[last].append(turn) + yield last + while True: + if len(last_turn := turns[last]) < 2: + last = 0 + else: + last = last_turn[-1] - last_turn[-2] + turn += 1 + turns[last].append(turn) + yield last + + +def solve(nums: List[int]) -> int: + return nth(spoken(nums), 30000000 - 1) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + assert len(input) == 1 + print(solve([int(i) for i in input[0].split(",")])) + + +if __name__ == "__main__": + main() From e59c6d4d1ba04a87bc7dc0832ca2995752d4eb8d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 16 Dec 2020 10:10:42 +0100 Subject: [PATCH 125/479] 2020: d16: ex1: add input --- 2020/d16/ex1/input | 264 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 2020/d16/ex1/input diff --git a/2020/d16/ex1/input b/2020/d16/ex1/input new file mode 100644 index 0000000..4123288 --- /dev/null +++ b/2020/d16/ex1/input @@ -0,0 +1,264 @@ +departure location: 44-709 or 728-964 +departure station: 42-259 or 269-974 +departure platform: 39-690 or 701-954 +departure track: 49-909 or 924-965 +departure date: 48-759 or 779-957 +departure time: 38-115 or 121-965 +arrival location: 32-808 or 818-949 +arrival station: 45-418 or 439-949 +arrival platform: 35-877 or 894-962 +arrival track: 26-866 or 872-958 +class: 32-727 or 736-969 +duration: 35-446 or 460-968 +price: 26-545 or 571-961 +route: 35-207 or 223-960 +row: 43-156 or 165-955 +seat: 26-172 or 181-966 +train: 49-582 or 606-952 +type: 36-279 or 303-968 +wagon: 26-657 or 672-959 +zone: 36-621 or 637-963 + +your ticket: +83,127,131,137,113,73,139,101,67,53,107,103,59,149,109,61,79,71,97,89 + +nearby tickets: +539,619,928,309,835,99,521,478,54,340,849,859,376,357,524,841,221,935,806,147 +231,827,907,526,238,542,181,853,303,143,116,701,206,140,927,203,443,753,151,258 +445,679,816,617,82,102,197,100,239,490,488,78,707,349,689,335,847,183,144,314 +476,833,232,489,937,256,87,409,223,364,978,939,398,331,153,945,513,237,934,272 +492,927,578,788,808,529,739,20,201,688,405,877,228,168,361,521,400,398,618,520 +332,694,481,571,523,516,395,122,844,358,232,132,315,486,899,154,269,201,831,50 +907,706,927,126,133,97,217,334,745,751,580,862,526,845,680,125,96,445,863,322 +498,753,844,670,150,657,853,150,377,487,152,369,500,241,360,204,142,236,948,91 +578,675,491,230,332,464,258,858,508,330,492,780,494,234,839,645,160,795,896,687 +814,875,617,185,490,490,501,940,224,751,609,844,442,525,640,609,336,251,532,685 +684,196,757,841,580,576,18,319,150,249,676,337,155,115,652,638,475,398,789,379 +445,490,199,140,88,694,184,247,307,386,198,85,905,860,484,244,532,224,681,251 +172,936,701,440,779,941,639,351,238,70,787,91,259,340,58,541,815,399,238,202 +715,369,504,226,138,866,783,231,580,147,82,335,533,144,530,462,836,751,473,801 +932,459,242,947,653,150,618,683,198,608,88,342,948,497,675,53,681,544,315,615 +422,244,791,929,799,128,374,473,148,931,381,822,318,853,147,367,531,412,242,470 +464,899,490,846,381,326,271,948,396,318,653,981,310,822,502,895,78,935,78,461 +231,339,79,530,680,461,863,521,839,517,379,108,395,613,644,751,823,212,206,151 +526,507,403,354,931,859,787,728,247,781,643,203,847,326,506,79,65,332,91,783 +571,182,753,841,338,746,254,307,896,648,726,89,314,706,943,464,444,481,465,928 +184,513,335,941,303,198,537,571,409,337,497,621,350,617,98,897,850,679,794,260 +235,255,393,310,188,65,943,543,94,374,500,482,122,992,656,523,704,742,331,792 +315,152,320,983,493,166,754,376,619,480,149,929,330,80,529,131,150,57,251,842 +54,77,540,141,61,205,273,214,745,145,166,131,93,525,500,521,223,52,237,404 +300,616,784,250,852,354,327,944,675,859,673,941,789,829,234,104,842,85,742,98 +110,244,95,93,529,162,82,309,142,680,65,410,531,758,511,790,333,352,926,397 +496,518,828,896,52,828,805,62,470,121,853,831,346,654,684,196,535,15,251,381 +231,444,530,616,795,620,78,460,947,748,757,78,706,336,82,317,186,256,216,196 +520,838,365,445,928,855,418,943,195,689,176,638,151,59,82,495,58,681,737,545 +172,755,782,71,514,336,383,470,168,70,168,199,307,102,793,250,739,174,368,279 +897,734,446,184,254,785,499,949,903,405,401,679,356,753,354,351,842,443,207,203 +60,577,746,229,105,475,640,877,848,477,545,525,793,752,313,315,318,983,537,249 +474,833,611,169,61,800,759,228,321,833,303,673,513,862,76,122,803,520,67,667 +504,919,413,521,514,251,785,170,656,759,510,537,579,462,794,756,687,479,864,507 +949,774,866,805,357,442,183,874,934,195,511,742,756,683,396,407,637,348,866,344 +687,305,781,780,821,586,945,94,87,230,353,376,849,379,510,368,709,489,113,191 +275,356,277,655,529,493,541,141,132,804,620,171,382,443,483,978,737,536,532,904 +357,369,142,383,802,782,722,391,905,684,226,413,379,74,792,618,351,939,580,578 +368,394,514,461,445,933,677,324,318,250,863,266,855,703,781,142,460,74,753,947 +935,852,127,241,309,825,481,206,642,81,375,862,330,21,496,60,677,238,532,138 +258,680,336,136,640,193,372,100,227,856,495,103,92,341,356,703,568,147,311,514 +412,673,398,244,397,313,378,780,107,905,318,208,172,374,464,690,379,686,538,638 +660,321,894,681,515,539,486,403,469,91,675,186,386,839,197,639,411,873,69,837 +845,413,996,87,314,674,362,258,783,412,341,529,519,654,526,757,899,617,909,492 +127,749,682,785,735,418,112,834,934,381,613,107,748,474,84,72,514,355,942,701 +541,100,75,155,645,410,612,519,976,656,854,140,61,140,401,827,466,798,385,192 +332,126,836,373,545,313,379,69,345,751,348,750,746,643,763,519,943,508,679,274 +642,521,55,479,54,615,323,247,736,80,979,489,97,238,759,579,363,826,91,929 +227,497,467,249,808,441,906,361,815,523,206,352,383,521,798,84,360,74,680,100 +96,486,465,382,796,198,500,717,462,617,245,247,649,941,946,750,408,845,637,311 +379,168,181,100,507,798,928,784,174,128,830,480,113,311,379,474,361,613,909,325 +130,144,649,305,273,637,112,353,528,786,944,866,931,269,381,271,153,902,552,129 +520,908,58,249,842,831,756,253,21,238,645,607,902,200,439,100,112,324,374,672 +614,173,149,316,132,309,484,270,249,104,542,524,350,357,244,331,507,405,793,345 +943,140,784,620,818,558,780,53,894,673,500,370,109,539,372,376,505,785,909,782 +900,187,113,464,991,534,368,181,463,841,747,362,945,640,153,227,241,944,833,743 +863,838,340,366,230,500,643,103,772,127,88,754,611,496,791,444,440,903,75,467 +649,828,617,466,188,502,315,352,866,758,919,247,835,574,750,409,468,247,359,202 +371,846,121,755,474,472,176,325,153,97,949,201,65,171,908,500,277,937,90,388 +929,392,539,469,843,440,947,893,347,312,128,63,754,685,947,227,679,470,945,303 +731,77,872,620,88,616,104,681,204,312,115,688,386,195,676,506,87,707,519,149 +278,365,780,785,874,251,114,321,499,898,729,101,637,684,167,797,826,930,615,51 +319,924,819,856,202,71,102,55,838,81,231,150,656,840,354,679,744,475,344,814 +926,657,378,507,927,389,680,238,185,319,475,897,132,936,685,540,16,331,508,613 +681,897,228,303,835,356,523,403,314,709,382,272,370,109,470,479,923,443,896,782 +677,239,501,233,180,928,351,101,373,151,321,347,445,198,112,679,828,751,680,96 +840,497,237,318,490,848,248,351,413,850,945,662,460,945,439,929,126,199,330,320 +647,489,508,105,648,253,270,807,201,110,537,12,336,369,581,609,190,535,676,489 +534,668,686,442,938,394,798,755,190,412,505,375,101,752,490,405,875,573,417,677 +231,461,260,138,611,824,333,331,406,351,229,97,756,926,678,849,488,758,230,121 +82,347,442,172,652,898,687,491,392,539,538,389,257,505,334,325,840,89,918,138 +517,352,192,701,848,617,804,704,344,785,58,839,351,140,394,242,144,342,179,142 +166,140,226,442,183,499,166,272,839,795,908,165,901,703,262,91,358,127,872,834 +788,157,156,675,876,376,473,404,709,752,373,780,324,146,169,819,807,337,514,204 +190,511,822,204,495,948,123,117,932,509,148,706,66,110,861,674,637,545,486,855 +119,227,439,442,808,378,929,949,313,142,359,789,503,442,908,310,315,474,395,935 +367,210,531,480,142,245,833,172,320,137,468,800,827,930,199,318,904,642,516,865 +538,198,113,62,362,528,787,668,936,657,184,345,895,236,385,829,522,253,758,352 +315,708,796,639,162,690,688,750,366,171,509,476,708,782,637,368,934,125,73,248 +617,156,576,737,521,755,932,266,939,203,690,578,853,98,414,50,759,440,819,331 +593,232,442,468,578,949,383,129,800,152,77,386,935,819,925,470,305,396,308,874 +102,361,319,187,226,942,493,272,247,68,475,364,398,141,821,900,56,480,814,307 +650,796,98,92,687,646,128,140,168,813,203,825,851,80,136,473,581,150,865,806 +263,520,275,378,406,113,59,194,759,128,522,183,498,167,185,702,652,606,133,578 +707,331,737,748,820,759,257,742,856,500,318,814,507,898,244,153,470,319,532,110 +488,382,380,145,126,807,359,343,606,82,750,194,607,981,409,151,860,862,339,900 +873,620,230,924,345,750,62,387,802,113,97,930,63,416,750,76,657,507,260,325 +111,749,114,785,477,572,248,687,500,64,925,931,132,783,795,491,998,248,754,56 +115,83,245,512,638,327,108,451,826,757,675,521,342,350,102,462,348,841,874,798 +941,822,582,948,500,645,393,757,214,362,103,132,181,515,227,828,827,406,375,232 +647,362,660,738,497,366,803,505,335,105,75,153,313,759,501,241,62,149,748,926 +123,146,613,390,742,638,907,515,334,686,411,854,933,469,174,126,169,395,842,351 +830,315,59,573,843,656,523,533,528,403,259,141,523,333,876,355,880,680,134,942 +234,22,808,145,529,374,142,572,344,409,607,930,858,825,804,223,534,505,466,539 +684,688,940,524,357,684,844,673,381,794,895,516,308,582,380,487,731,241,797,685 +196,112,331,528,533,396,489,579,266,496,77,440,650,165,399,469,475,507,364,56 +354,139,945,330,742,894,782,989,87,231,54,358,51,681,350,652,936,745,134,936 +804,439,935,234,944,849,186,173,254,690,326,102,149,926,115,792,829,167,508,746 +388,684,243,814,80,350,637,335,442,146,474,825,477,686,578,331,269,378,472,828 +826,863,520,70,279,522,801,579,500,237,696,534,242,259,932,540,182,544,72,701 +886,227,369,89,612,147,488,152,511,646,104,853,352,94,741,223,858,150,383,680 +792,51,440,64,838,116,195,674,70,902,829,779,682,404,808,860,619,466,807,836 +652,499,177,830,104,674,377,128,787,123,153,782,230,237,526,478,273,523,92,85 +418,364,405,327,502,538,539,278,372,508,245,306,325,488,548,674,97,135,944,906 +409,996,83,929,461,485,829,384,171,844,933,755,780,860,491,331,473,541,874,142 +390,92,141,310,747,142,653,498,203,829,946,393,142,251,360,22,804,385,240,167 +874,255,324,340,562,529,366,190,100,480,109,171,947,491,188,154,680,404,275,486 +945,947,61,110,500,920,875,248,352,56,475,949,876,686,745,443,171,821,348,645 +705,498,139,798,369,418,666,124,227,578,530,376,607,122,613,87,101,50,930,129 +475,235,549,581,610,820,206,96,901,802,128,818,413,542,151,362,401,474,76,331 +506,608,462,708,980,838,582,803,56,503,83,258,384,925,171,874,152,823,170,89 +517,606,475,644,105,195,846,445,323,619,498,183,310,79,493,155,90,533,259,218 +63,619,373,850,902,90,153,542,269,330,94,357,797,203,909,201,776,615,606,340 +501,342,74,394,94,212,401,475,877,72,519,128,148,640,859,68,525,54,358,904 +875,821,377,781,823,781,398,619,945,130,930,750,802,752,704,439,1,645,337,309 +533,830,474,829,98,613,896,744,512,126,248,511,113,250,66,515,585,128,877,259 +201,858,793,791,828,471,859,581,899,76,836,738,259,155,816,360,474,414,277,835 +5,324,784,71,677,617,745,808,184,56,478,682,578,310,390,330,656,872,305,684 +508,686,519,385,245,759,766,136,898,128,332,205,276,58,60,252,906,167,737,169 +799,650,674,67,181,243,155,254,785,208,934,197,835,350,76,865,516,248,837,503 +361,90,874,251,310,733,155,60,69,276,325,370,330,149,62,397,519,704,823,345 +186,256,497,252,75,880,516,278,172,381,61,357,358,115,858,202,512,375,836,247 +465,324,828,443,518,708,781,895,122,334,161,759,517,356,616,399,65,796,127,236 +792,170,109,461,141,928,758,201,101,114,739,153,108,675,938,512,177,330,580,943 +92,407,385,278,92,723,333,757,936,373,90,788,388,505,738,609,826,321,153,858 +350,780,492,311,414,306,702,252,257,782,837,823,137,166,988,648,186,781,613,789 +83,341,408,537,607,483,948,122,349,757,144,81,945,757,758,474,370,651,947,567 +110,689,77,706,383,353,395,187,399,402,186,223,816,373,112,530,908,327,531,851 +492,137,785,209,610,392,791,411,523,198,377,386,225,236,344,837,491,781,393,579 +233,172,271,138,875,789,512,81,63,406,479,232,122,704,895,946,448,136,684,949 +351,238,909,505,96,523,192,444,491,259,313,345,100,530,116,257,532,646,103,675 +642,149,898,346,487,470,896,358,493,674,275,461,503,572,443,787,839,905,499,117 +306,947,308,523,334,467,127,782,389,835,448,862,895,482,614,278,252,402,641,336 +232,368,805,944,138,86,143,499,644,60,320,942,89,533,489,71,782,927,327,17 +141,672,108,175,844,378,843,647,223,372,140,109,705,785,407,843,795,400,182,310 +253,684,377,93,409,606,688,23,476,51,709,828,860,736,156,75,483,169,441,92 +519,312,95,899,115,949,818,308,119,611,206,372,643,524,63,757,89,538,783,801 +577,872,902,510,51,239,278,541,576,235,780,475,758,321,350,575,117,324,83,410 +932,796,508,832,894,392,314,90,58,13,478,440,942,818,145,271,736,475,181,937 +113,737,758,182,145,454,332,66,52,488,545,129,500,126,509,703,306,137,534,618 +928,900,799,575,417,254,903,373,803,803,263,313,365,100,894,250,842,799,929,128 +69,705,638,72,321,814,610,397,926,902,67,499,122,508,74,744,825,746,183,410 +926,316,324,483,348,356,544,945,865,538,380,508,76,758,506,380,326,640,118,824 +832,340,786,225,704,206,508,535,843,347,326,120,620,473,650,247,100,238,309,337 +677,581,526,334,677,705,266,60,367,485,646,88,252,104,752,509,908,486,684,377 +55,861,490,521,265,182,339,876,575,242,782,153,673,495,256,534,360,346,233,361 +446,126,228,876,991,351,271,499,239,831,618,708,935,256,704,904,129,131,227,850 +219,642,394,413,129,276,843,701,619,349,242,247,608,320,824,864,894,536,701,255 +544,642,256,128,379,279,307,523,256,75,410,536,357,785,806,790,663,826,642,392 +311,337,896,352,315,538,786,271,370,54,129,89,946,837,71,519,715,818,76,270 +871,638,385,795,238,63,645,226,388,337,128,270,679,839,846,516,314,607,616,475 +94,794,188,392,490,73,144,908,504,139,182,573,844,391,947,333,528,549,782,384 +758,517,808,637,347,836,105,610,643,852,55,719,581,646,74,362,396,410,141,337 +949,749,745,848,187,51,350,497,165,543,929,321,245,945,272,121,396,810,198,108 +407,54,341,519,926,801,73,397,606,524,385,470,413,346,670,80,279,360,901,392 +794,139,837,745,834,380,701,312,463,705,151,313,682,168,866,1,703,500,476,202 +544,892,621,354,924,134,736,793,338,872,346,80,823,675,121,97,801,464,508,58 +370,538,474,641,171,189,342,381,94,145,999,384,383,400,645,866,513,140,618,97 +230,621,616,240,675,414,933,22,362,828,618,926,486,393,895,88,110,230,528,940 +483,852,446,339,512,684,582,200,896,862,979,353,319,610,145,374,581,446,750,252 +157,648,683,439,460,224,357,135,279,69,899,154,75,515,321,349,115,657,156,189 +414,794,652,930,397,440,655,306,484,512,342,861,344,902,100,860,513,976,66,388 +405,932,488,444,745,870,528,446,657,188,863,689,475,56,708,476,325,757,336,638 +456,783,396,84,237,107,443,645,106,652,304,337,110,477,134,899,145,410,709,544 +334,865,677,708,642,660,343,83,945,855,899,529,704,877,675,199,639,342,337,848 +490,855,851,784,119,652,489,416,349,538,705,439,736,537,751,312,152,273,307,95 +696,125,500,754,90,516,681,533,902,226,97,377,57,322,312,191,384,794,109,196 +195,50,197,253,339,992,502,168,402,107,757,137,247,62,275,855,245,231,645,86 +638,316,191,524,699,821,898,205,102,98,375,279,376,97,82,582,233,386,347,242 +177,369,248,754,803,270,927,382,305,532,854,854,614,355,746,356,484,253,388,406 +844,896,376,832,385,757,755,930,376,509,353,569,255,442,166,312,498,894,394,738 +362,591,803,532,678,527,517,852,345,440,832,948,403,673,96,228,861,909,840,412 +484,817,196,102,476,352,232,742,359,367,609,82,207,201,520,521,233,940,384,480 +906,329,207,67,510,71,98,920,857,384,77,247,571,388,121,387,147,241,894,478 +390,530,97,924,187,681,120,69,151,226,239,750,945,399,389,613,334,897,463,223 +345,276,484,617,229,102,580,989,155,683,639,485,545,89,348,800,940,257,137,98 +68,711,59,69,646,496,410,352,94,519,947,896,465,67,76,830,481,411,95,255 +704,535,780,309,314,64,63,904,509,93,408,225,189,372,503,139,146,512,4,621 +277,406,273,709,461,324,923,377,645,747,56,327,820,576,60,502,487,191,754,876 +364,325,755,509,677,385,235,349,945,480,641,858,142,905,933,214,306,806,97,827 +4,187,466,402,929,944,125,256,705,199,130,849,741,136,234,944,650,274,682,781 +318,340,499,237,348,396,682,62,131,574,708,380,278,866,927,85,267,877,830,371 +776,196,576,749,353,362,934,315,476,538,272,510,396,575,93,574,498,185,741,256 +50,909,410,647,920,305,655,184,233,361,391,908,258,779,530,708,655,793,92,651 +677,226,140,709,312,201,443,91,657,899,111,502,464,62,365,374,195,330,670,833 +555,346,608,401,256,128,318,418,353,56,187,743,231,87,133,909,113,363,319,939 +204,313,485,190,620,390,820,369,737,323,197,121,488,460,655,812,529,617,185,902 +749,678,375,242,514,752,325,709,736,532,143,776,269,656,510,486,865,484,305,905 +942,247,779,305,361,707,817,270,323,833,440,105,242,687,201,875,334,411,132,863 +484,653,224,511,322,387,229,309,470,64,186,362,202,482,277,660,645,342,320,501 +608,465,234,143,369,740,363,164,928,805,189,315,154,828,147,346,690,846,621,524 +825,78,355,520,840,768,58,410,304,581,464,279,572,145,521,534,908,872,755,148 +71,901,640,395,718,200,860,854,834,908,371,832,277,904,441,378,780,756,927,130 +489,79,794,258,54,790,792,82,246,80,513,821,97,350,846,144,572,277,695,190 +139,571,742,381,506,515,679,649,822,853,532,908,23,516,132,474,132,73,857,251 +61,805,355,524,851,894,691,81,905,924,898,473,652,749,460,948,512,185,414,519 +505,752,239,508,817,188,345,906,198,525,340,355,688,516,247,517,476,847,542,169 +649,646,898,462,539,472,396,310,148,832,303,187,362,848,402,646,853,661,477,91 +612,383,369,231,229,939,351,106,820,313,401,175,654,644,342,334,235,367,675,853 +794,120,754,469,399,383,613,579,360,87,418,414,390,828,864,606,345,860,309,200 +746,539,316,14,800,274,641,507,335,410,745,872,947,131,227,656,900,535,802,460 +945,836,325,610,376,939,616,235,311,408,322,102,743,442,697,141,825,321,534,861 +252,203,78,611,824,653,348,700,946,508,864,338,98,78,611,319,439,344,791,232 +508,943,13,933,83,193,149,647,786,385,739,477,707,199,486,746,169,155,466,315 +472,782,945,275,53,618,340,377,390,545,849,753,375,355,468,704,856,480,157,305 +338,507,476,303,271,541,135,528,790,53,565,505,249,387,678,747,860,509,466,844 +140,246,64,309,196,94,834,193,136,97,471,827,251,170,713,757,738,344,460,388 +847,290,440,313,534,754,481,822,754,740,316,469,538,790,793,864,325,196,575,796 +645,672,342,193,646,305,781,189,139,979,316,900,749,324,478,525,753,934,256,73 +613,324,781,581,56,335,524,812,74,142,229,748,873,378,895,529,316,755,147,342 +95,106,310,303,345,490,736,145,544,614,127,193,93,333,15,56,463,532,861,947 +366,460,388,806,540,444,96,58,442,577,620,741,685,836,209,785,53,933,787,576 +522,322,739,572,618,938,686,444,756,254,482,196,333,360,799,101,639,572,768,356 +127,856,860,943,658,87,115,108,862,619,675,384,581,70,526,789,403,369,938,139 +475,256,471,91,840,71,183,938,316,255,582,522,840,501,145,677,700,839,866,655 +744,262,389,538,839,844,194,907,228,181,478,941,418,948,329,418,329,379,643,127 +237,85,72,150,574,619,678,82,658,71,411,674,273,527,856,791,834,327,87,756 +390,500,270,354,74,701,567,497,611,779,146,741,328,383,877,309,90,749,279,237 +379,155,70,508,530,171,906,257,376,535,778,152,439,129,235,80,803,859,743,522 +527,690,385,491,249,780,618,57,798,365,409,223,924,537,903,498,874,137,720,580 +536,875,477,246,114,167,55,803,609,525,670,834,244,67,54,704,753,757,127,829 +653,942,643,938,214,751,80,749,749,513,645,838,866,538,145,60,275,674,673,346 +914,113,304,639,310,783,851,825,685,309,69,351,875,155,152,238,353,575,78,638 +822,334,935,793,146,492,861,767,529,753,277,758,843,321,468,491,340,679,83,226 +444,870,341,653,852,89,651,941,309,258,645,841,606,364,649,873,138,529,259,800 +898,683,464,783,897,607,99,183,483,395,219,932,706,847,737,128,754,409,259,409 +608,564,144,86,523,941,226,519,97,925,333,67,383,501,226,581,106,805,481,614 +171,55,392,79,501,925,189,196,366,269,996,833,531,371,110,785,354,201,759,352 +374,60,400,272,54,74,353,522,494,785,811,277,69,201,744,399,341,929,940,66 +190,805,131,494,806,260,753,576,131,531,896,384,607,354,791,194,149,644,904,500 +68,498,742,747,57,792,9,256,508,942,354,614,110,339,325,851,826,64,64,143 +443,92,847,250,516,827,247,562,71,794,224,751,498,484,279,202,513,244,641,542 +379,487,709,324,906,204,613,207,553,904,319,792,805,368,168,617,840,442,488,205 +249,876,640,471,542,801,744,245,127,206,808,978,823,925,513,873,347,69,931,442 +818,353,391,512,102,175,402,362,94,247,682,257,493,441,73,397,123,839,575,738 +135,59,606,183,743,255,528,171,387,513,473,577,66,899,139,65,410,757,371,178 +100,315,606,894,345,131,199,472,123,931,646,993,493,615,611,154,182,418,106,835 +227,580,210,650,201,225,374,675,362,366,269,402,127,399,808,409,504,688,205,506 +83,862,749,940,760,446,483,468,223,103,378,740,379,132,753,131,329,169,197,136 From 773150f2817ca8b44dc7553250e6768d5a1f6b9e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 16 Dec 2020 10:10:50 +0100 Subject: [PATCH 126/479] 2020: d16: ex1: add solution --- 2020/d16/ex1/ex1.py | 59 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 2020/d16/ex1/ex1.py diff --git a/2020/d16/ex1/ex1.py b/2020/d16/ex1/ex1.py new file mode 100755 index 0000000..91f2665 --- /dev/null +++ b/2020/d16/ex1/ex1.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python +import sys +from typing import Dict, List, Set, Tuple + +Ranges = Dict[str, Set[int]] +Ticket = List[int] + + +def parse(raw: List[str]) -> Tuple[Ranges, List[Ticket]]: + def extract_field_info(line: str) -> Tuple[str, Set[int]]: + field, rest = line.split(":") + ranges: Set[int] = set() + for r in rest.strip().split(" or "): + lhs, rhs = r.split("-") + ranges |= set(range(int(lhs), int(rhs) + 1)) + return field, ranges + + def parse_tickets(line: str) -> Ticket: + return [int(i) for i in line.split(",")] + + ranges: Ranges = {} + tickets: List[Ticket] = [] + + should_parse_tickets = False + for line in raw: + if line == "": + should_parse_tickets = True + continue + if "ticket" in line: + continue + if should_parse_tickets: + tickets.append(parse_tickets(line)) + else: + field, field_ranges = extract_field_info(line) + ranges[field] = field_ranges + + return ranges, tickets + + +def solve(raw: List[str]) -> int: + ranges, tickets = parse(raw) + sum = 0 + + for ticket in tickets[1:]: + for val in ticket: + if any(val in r for r in ranges.values()): + continue + sum += val + + return sum + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 275234df8d129457a17d464d69ba0425dfd70352 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 16 Dec 2020 10:10:59 +0100 Subject: [PATCH 127/479] 2020: d16: ex2: add input --- 2020/d16/ex2/input | 264 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 264 insertions(+) create mode 100644 2020/d16/ex2/input diff --git a/2020/d16/ex2/input b/2020/d16/ex2/input new file mode 100644 index 0000000..4123288 --- /dev/null +++ b/2020/d16/ex2/input @@ -0,0 +1,264 @@ +departure location: 44-709 or 728-964 +departure station: 42-259 or 269-974 +departure platform: 39-690 or 701-954 +departure track: 49-909 or 924-965 +departure date: 48-759 or 779-957 +departure time: 38-115 or 121-965 +arrival location: 32-808 or 818-949 +arrival station: 45-418 or 439-949 +arrival platform: 35-877 or 894-962 +arrival track: 26-866 or 872-958 +class: 32-727 or 736-969 +duration: 35-446 or 460-968 +price: 26-545 or 571-961 +route: 35-207 or 223-960 +row: 43-156 or 165-955 +seat: 26-172 or 181-966 +train: 49-582 or 606-952 +type: 36-279 or 303-968 +wagon: 26-657 or 672-959 +zone: 36-621 or 637-963 + +your ticket: +83,127,131,137,113,73,139,101,67,53,107,103,59,149,109,61,79,71,97,89 + +nearby tickets: +539,619,928,309,835,99,521,478,54,340,849,859,376,357,524,841,221,935,806,147 +231,827,907,526,238,542,181,853,303,143,116,701,206,140,927,203,443,753,151,258 +445,679,816,617,82,102,197,100,239,490,488,78,707,349,689,335,847,183,144,314 +476,833,232,489,937,256,87,409,223,364,978,939,398,331,153,945,513,237,934,272 +492,927,578,788,808,529,739,20,201,688,405,877,228,168,361,521,400,398,618,520 +332,694,481,571,523,516,395,122,844,358,232,132,315,486,899,154,269,201,831,50 +907,706,927,126,133,97,217,334,745,751,580,862,526,845,680,125,96,445,863,322 +498,753,844,670,150,657,853,150,377,487,152,369,500,241,360,204,142,236,948,91 +578,675,491,230,332,464,258,858,508,330,492,780,494,234,839,645,160,795,896,687 +814,875,617,185,490,490,501,940,224,751,609,844,442,525,640,609,336,251,532,685 +684,196,757,841,580,576,18,319,150,249,676,337,155,115,652,638,475,398,789,379 +445,490,199,140,88,694,184,247,307,386,198,85,905,860,484,244,532,224,681,251 +172,936,701,440,779,941,639,351,238,70,787,91,259,340,58,541,815,399,238,202 +715,369,504,226,138,866,783,231,580,147,82,335,533,144,530,462,836,751,473,801 +932,459,242,947,653,150,618,683,198,608,88,342,948,497,675,53,681,544,315,615 +422,244,791,929,799,128,374,473,148,931,381,822,318,853,147,367,531,412,242,470 +464,899,490,846,381,326,271,948,396,318,653,981,310,822,502,895,78,935,78,461 +231,339,79,530,680,461,863,521,839,517,379,108,395,613,644,751,823,212,206,151 +526,507,403,354,931,859,787,728,247,781,643,203,847,326,506,79,65,332,91,783 +571,182,753,841,338,746,254,307,896,648,726,89,314,706,943,464,444,481,465,928 +184,513,335,941,303,198,537,571,409,337,497,621,350,617,98,897,850,679,794,260 +235,255,393,310,188,65,943,543,94,374,500,482,122,992,656,523,704,742,331,792 +315,152,320,983,493,166,754,376,619,480,149,929,330,80,529,131,150,57,251,842 +54,77,540,141,61,205,273,214,745,145,166,131,93,525,500,521,223,52,237,404 +300,616,784,250,852,354,327,944,675,859,673,941,789,829,234,104,842,85,742,98 +110,244,95,93,529,162,82,309,142,680,65,410,531,758,511,790,333,352,926,397 +496,518,828,896,52,828,805,62,470,121,853,831,346,654,684,196,535,15,251,381 +231,444,530,616,795,620,78,460,947,748,757,78,706,336,82,317,186,256,216,196 +520,838,365,445,928,855,418,943,195,689,176,638,151,59,82,495,58,681,737,545 +172,755,782,71,514,336,383,470,168,70,168,199,307,102,793,250,739,174,368,279 +897,734,446,184,254,785,499,949,903,405,401,679,356,753,354,351,842,443,207,203 +60,577,746,229,105,475,640,877,848,477,545,525,793,752,313,315,318,983,537,249 +474,833,611,169,61,800,759,228,321,833,303,673,513,862,76,122,803,520,67,667 +504,919,413,521,514,251,785,170,656,759,510,537,579,462,794,756,687,479,864,507 +949,774,866,805,357,442,183,874,934,195,511,742,756,683,396,407,637,348,866,344 +687,305,781,780,821,586,945,94,87,230,353,376,849,379,510,368,709,489,113,191 +275,356,277,655,529,493,541,141,132,804,620,171,382,443,483,978,737,536,532,904 +357,369,142,383,802,782,722,391,905,684,226,413,379,74,792,618,351,939,580,578 +368,394,514,461,445,933,677,324,318,250,863,266,855,703,781,142,460,74,753,947 +935,852,127,241,309,825,481,206,642,81,375,862,330,21,496,60,677,238,532,138 +258,680,336,136,640,193,372,100,227,856,495,103,92,341,356,703,568,147,311,514 +412,673,398,244,397,313,378,780,107,905,318,208,172,374,464,690,379,686,538,638 +660,321,894,681,515,539,486,403,469,91,675,186,386,839,197,639,411,873,69,837 +845,413,996,87,314,674,362,258,783,412,341,529,519,654,526,757,899,617,909,492 +127,749,682,785,735,418,112,834,934,381,613,107,748,474,84,72,514,355,942,701 +541,100,75,155,645,410,612,519,976,656,854,140,61,140,401,827,466,798,385,192 +332,126,836,373,545,313,379,69,345,751,348,750,746,643,763,519,943,508,679,274 +642,521,55,479,54,615,323,247,736,80,979,489,97,238,759,579,363,826,91,929 +227,497,467,249,808,441,906,361,815,523,206,352,383,521,798,84,360,74,680,100 +96,486,465,382,796,198,500,717,462,617,245,247,649,941,946,750,408,845,637,311 +379,168,181,100,507,798,928,784,174,128,830,480,113,311,379,474,361,613,909,325 +130,144,649,305,273,637,112,353,528,786,944,866,931,269,381,271,153,902,552,129 +520,908,58,249,842,831,756,253,21,238,645,607,902,200,439,100,112,324,374,672 +614,173,149,316,132,309,484,270,249,104,542,524,350,357,244,331,507,405,793,345 +943,140,784,620,818,558,780,53,894,673,500,370,109,539,372,376,505,785,909,782 +900,187,113,464,991,534,368,181,463,841,747,362,945,640,153,227,241,944,833,743 +863,838,340,366,230,500,643,103,772,127,88,754,611,496,791,444,440,903,75,467 +649,828,617,466,188,502,315,352,866,758,919,247,835,574,750,409,468,247,359,202 +371,846,121,755,474,472,176,325,153,97,949,201,65,171,908,500,277,937,90,388 +929,392,539,469,843,440,947,893,347,312,128,63,754,685,947,227,679,470,945,303 +731,77,872,620,88,616,104,681,204,312,115,688,386,195,676,506,87,707,519,149 +278,365,780,785,874,251,114,321,499,898,729,101,637,684,167,797,826,930,615,51 +319,924,819,856,202,71,102,55,838,81,231,150,656,840,354,679,744,475,344,814 +926,657,378,507,927,389,680,238,185,319,475,897,132,936,685,540,16,331,508,613 +681,897,228,303,835,356,523,403,314,709,382,272,370,109,470,479,923,443,896,782 +677,239,501,233,180,928,351,101,373,151,321,347,445,198,112,679,828,751,680,96 +840,497,237,318,490,848,248,351,413,850,945,662,460,945,439,929,126,199,330,320 +647,489,508,105,648,253,270,807,201,110,537,12,336,369,581,609,190,535,676,489 +534,668,686,442,938,394,798,755,190,412,505,375,101,752,490,405,875,573,417,677 +231,461,260,138,611,824,333,331,406,351,229,97,756,926,678,849,488,758,230,121 +82,347,442,172,652,898,687,491,392,539,538,389,257,505,334,325,840,89,918,138 +517,352,192,701,848,617,804,704,344,785,58,839,351,140,394,242,144,342,179,142 +166,140,226,442,183,499,166,272,839,795,908,165,901,703,262,91,358,127,872,834 +788,157,156,675,876,376,473,404,709,752,373,780,324,146,169,819,807,337,514,204 +190,511,822,204,495,948,123,117,932,509,148,706,66,110,861,674,637,545,486,855 +119,227,439,442,808,378,929,949,313,142,359,789,503,442,908,310,315,474,395,935 +367,210,531,480,142,245,833,172,320,137,468,800,827,930,199,318,904,642,516,865 +538,198,113,62,362,528,787,668,936,657,184,345,895,236,385,829,522,253,758,352 +315,708,796,639,162,690,688,750,366,171,509,476,708,782,637,368,934,125,73,248 +617,156,576,737,521,755,932,266,939,203,690,578,853,98,414,50,759,440,819,331 +593,232,442,468,578,949,383,129,800,152,77,386,935,819,925,470,305,396,308,874 +102,361,319,187,226,942,493,272,247,68,475,364,398,141,821,900,56,480,814,307 +650,796,98,92,687,646,128,140,168,813,203,825,851,80,136,473,581,150,865,806 +263,520,275,378,406,113,59,194,759,128,522,183,498,167,185,702,652,606,133,578 +707,331,737,748,820,759,257,742,856,500,318,814,507,898,244,153,470,319,532,110 +488,382,380,145,126,807,359,343,606,82,750,194,607,981,409,151,860,862,339,900 +873,620,230,924,345,750,62,387,802,113,97,930,63,416,750,76,657,507,260,325 +111,749,114,785,477,572,248,687,500,64,925,931,132,783,795,491,998,248,754,56 +115,83,245,512,638,327,108,451,826,757,675,521,342,350,102,462,348,841,874,798 +941,822,582,948,500,645,393,757,214,362,103,132,181,515,227,828,827,406,375,232 +647,362,660,738,497,366,803,505,335,105,75,153,313,759,501,241,62,149,748,926 +123,146,613,390,742,638,907,515,334,686,411,854,933,469,174,126,169,395,842,351 +830,315,59,573,843,656,523,533,528,403,259,141,523,333,876,355,880,680,134,942 +234,22,808,145,529,374,142,572,344,409,607,930,858,825,804,223,534,505,466,539 +684,688,940,524,357,684,844,673,381,794,895,516,308,582,380,487,731,241,797,685 +196,112,331,528,533,396,489,579,266,496,77,440,650,165,399,469,475,507,364,56 +354,139,945,330,742,894,782,989,87,231,54,358,51,681,350,652,936,745,134,936 +804,439,935,234,944,849,186,173,254,690,326,102,149,926,115,792,829,167,508,746 +388,684,243,814,80,350,637,335,442,146,474,825,477,686,578,331,269,378,472,828 +826,863,520,70,279,522,801,579,500,237,696,534,242,259,932,540,182,544,72,701 +886,227,369,89,612,147,488,152,511,646,104,853,352,94,741,223,858,150,383,680 +792,51,440,64,838,116,195,674,70,902,829,779,682,404,808,860,619,466,807,836 +652,499,177,830,104,674,377,128,787,123,153,782,230,237,526,478,273,523,92,85 +418,364,405,327,502,538,539,278,372,508,245,306,325,488,548,674,97,135,944,906 +409,996,83,929,461,485,829,384,171,844,933,755,780,860,491,331,473,541,874,142 +390,92,141,310,747,142,653,498,203,829,946,393,142,251,360,22,804,385,240,167 +874,255,324,340,562,529,366,190,100,480,109,171,947,491,188,154,680,404,275,486 +945,947,61,110,500,920,875,248,352,56,475,949,876,686,745,443,171,821,348,645 +705,498,139,798,369,418,666,124,227,578,530,376,607,122,613,87,101,50,930,129 +475,235,549,581,610,820,206,96,901,802,128,818,413,542,151,362,401,474,76,331 +506,608,462,708,980,838,582,803,56,503,83,258,384,925,171,874,152,823,170,89 +517,606,475,644,105,195,846,445,323,619,498,183,310,79,493,155,90,533,259,218 +63,619,373,850,902,90,153,542,269,330,94,357,797,203,909,201,776,615,606,340 +501,342,74,394,94,212,401,475,877,72,519,128,148,640,859,68,525,54,358,904 +875,821,377,781,823,781,398,619,945,130,930,750,802,752,704,439,1,645,337,309 +533,830,474,829,98,613,896,744,512,126,248,511,113,250,66,515,585,128,877,259 +201,858,793,791,828,471,859,581,899,76,836,738,259,155,816,360,474,414,277,835 +5,324,784,71,677,617,745,808,184,56,478,682,578,310,390,330,656,872,305,684 +508,686,519,385,245,759,766,136,898,128,332,205,276,58,60,252,906,167,737,169 +799,650,674,67,181,243,155,254,785,208,934,197,835,350,76,865,516,248,837,503 +361,90,874,251,310,733,155,60,69,276,325,370,330,149,62,397,519,704,823,345 +186,256,497,252,75,880,516,278,172,381,61,357,358,115,858,202,512,375,836,247 +465,324,828,443,518,708,781,895,122,334,161,759,517,356,616,399,65,796,127,236 +792,170,109,461,141,928,758,201,101,114,739,153,108,675,938,512,177,330,580,943 +92,407,385,278,92,723,333,757,936,373,90,788,388,505,738,609,826,321,153,858 +350,780,492,311,414,306,702,252,257,782,837,823,137,166,988,648,186,781,613,789 +83,341,408,537,607,483,948,122,349,757,144,81,945,757,758,474,370,651,947,567 +110,689,77,706,383,353,395,187,399,402,186,223,816,373,112,530,908,327,531,851 +492,137,785,209,610,392,791,411,523,198,377,386,225,236,344,837,491,781,393,579 +233,172,271,138,875,789,512,81,63,406,479,232,122,704,895,946,448,136,684,949 +351,238,909,505,96,523,192,444,491,259,313,345,100,530,116,257,532,646,103,675 +642,149,898,346,487,470,896,358,493,674,275,461,503,572,443,787,839,905,499,117 +306,947,308,523,334,467,127,782,389,835,448,862,895,482,614,278,252,402,641,336 +232,368,805,944,138,86,143,499,644,60,320,942,89,533,489,71,782,927,327,17 +141,672,108,175,844,378,843,647,223,372,140,109,705,785,407,843,795,400,182,310 +253,684,377,93,409,606,688,23,476,51,709,828,860,736,156,75,483,169,441,92 +519,312,95,899,115,949,818,308,119,611,206,372,643,524,63,757,89,538,783,801 +577,872,902,510,51,239,278,541,576,235,780,475,758,321,350,575,117,324,83,410 +932,796,508,832,894,392,314,90,58,13,478,440,942,818,145,271,736,475,181,937 +113,737,758,182,145,454,332,66,52,488,545,129,500,126,509,703,306,137,534,618 +928,900,799,575,417,254,903,373,803,803,263,313,365,100,894,250,842,799,929,128 +69,705,638,72,321,814,610,397,926,902,67,499,122,508,74,744,825,746,183,410 +926,316,324,483,348,356,544,945,865,538,380,508,76,758,506,380,326,640,118,824 +832,340,786,225,704,206,508,535,843,347,326,120,620,473,650,247,100,238,309,337 +677,581,526,334,677,705,266,60,367,485,646,88,252,104,752,509,908,486,684,377 +55,861,490,521,265,182,339,876,575,242,782,153,673,495,256,534,360,346,233,361 +446,126,228,876,991,351,271,499,239,831,618,708,935,256,704,904,129,131,227,850 +219,642,394,413,129,276,843,701,619,349,242,247,608,320,824,864,894,536,701,255 +544,642,256,128,379,279,307,523,256,75,410,536,357,785,806,790,663,826,642,392 +311,337,896,352,315,538,786,271,370,54,129,89,946,837,71,519,715,818,76,270 +871,638,385,795,238,63,645,226,388,337,128,270,679,839,846,516,314,607,616,475 +94,794,188,392,490,73,144,908,504,139,182,573,844,391,947,333,528,549,782,384 +758,517,808,637,347,836,105,610,643,852,55,719,581,646,74,362,396,410,141,337 +949,749,745,848,187,51,350,497,165,543,929,321,245,945,272,121,396,810,198,108 +407,54,341,519,926,801,73,397,606,524,385,470,413,346,670,80,279,360,901,392 +794,139,837,745,834,380,701,312,463,705,151,313,682,168,866,1,703,500,476,202 +544,892,621,354,924,134,736,793,338,872,346,80,823,675,121,97,801,464,508,58 +370,538,474,641,171,189,342,381,94,145,999,384,383,400,645,866,513,140,618,97 +230,621,616,240,675,414,933,22,362,828,618,926,486,393,895,88,110,230,528,940 +483,852,446,339,512,684,582,200,896,862,979,353,319,610,145,374,581,446,750,252 +157,648,683,439,460,224,357,135,279,69,899,154,75,515,321,349,115,657,156,189 +414,794,652,930,397,440,655,306,484,512,342,861,344,902,100,860,513,976,66,388 +405,932,488,444,745,870,528,446,657,188,863,689,475,56,708,476,325,757,336,638 +456,783,396,84,237,107,443,645,106,652,304,337,110,477,134,899,145,410,709,544 +334,865,677,708,642,660,343,83,945,855,899,529,704,877,675,199,639,342,337,848 +490,855,851,784,119,652,489,416,349,538,705,439,736,537,751,312,152,273,307,95 +696,125,500,754,90,516,681,533,902,226,97,377,57,322,312,191,384,794,109,196 +195,50,197,253,339,992,502,168,402,107,757,137,247,62,275,855,245,231,645,86 +638,316,191,524,699,821,898,205,102,98,375,279,376,97,82,582,233,386,347,242 +177,369,248,754,803,270,927,382,305,532,854,854,614,355,746,356,484,253,388,406 +844,896,376,832,385,757,755,930,376,509,353,569,255,442,166,312,498,894,394,738 +362,591,803,532,678,527,517,852,345,440,832,948,403,673,96,228,861,909,840,412 +484,817,196,102,476,352,232,742,359,367,609,82,207,201,520,521,233,940,384,480 +906,329,207,67,510,71,98,920,857,384,77,247,571,388,121,387,147,241,894,478 +390,530,97,924,187,681,120,69,151,226,239,750,945,399,389,613,334,897,463,223 +345,276,484,617,229,102,580,989,155,683,639,485,545,89,348,800,940,257,137,98 +68,711,59,69,646,496,410,352,94,519,947,896,465,67,76,830,481,411,95,255 +704,535,780,309,314,64,63,904,509,93,408,225,189,372,503,139,146,512,4,621 +277,406,273,709,461,324,923,377,645,747,56,327,820,576,60,502,487,191,754,876 +364,325,755,509,677,385,235,349,945,480,641,858,142,905,933,214,306,806,97,827 +4,187,466,402,929,944,125,256,705,199,130,849,741,136,234,944,650,274,682,781 +318,340,499,237,348,396,682,62,131,574,708,380,278,866,927,85,267,877,830,371 +776,196,576,749,353,362,934,315,476,538,272,510,396,575,93,574,498,185,741,256 +50,909,410,647,920,305,655,184,233,361,391,908,258,779,530,708,655,793,92,651 +677,226,140,709,312,201,443,91,657,899,111,502,464,62,365,374,195,330,670,833 +555,346,608,401,256,128,318,418,353,56,187,743,231,87,133,909,113,363,319,939 +204,313,485,190,620,390,820,369,737,323,197,121,488,460,655,812,529,617,185,902 +749,678,375,242,514,752,325,709,736,532,143,776,269,656,510,486,865,484,305,905 +942,247,779,305,361,707,817,270,323,833,440,105,242,687,201,875,334,411,132,863 +484,653,224,511,322,387,229,309,470,64,186,362,202,482,277,660,645,342,320,501 +608,465,234,143,369,740,363,164,928,805,189,315,154,828,147,346,690,846,621,524 +825,78,355,520,840,768,58,410,304,581,464,279,572,145,521,534,908,872,755,148 +71,901,640,395,718,200,860,854,834,908,371,832,277,904,441,378,780,756,927,130 +489,79,794,258,54,790,792,82,246,80,513,821,97,350,846,144,572,277,695,190 +139,571,742,381,506,515,679,649,822,853,532,908,23,516,132,474,132,73,857,251 +61,805,355,524,851,894,691,81,905,924,898,473,652,749,460,948,512,185,414,519 +505,752,239,508,817,188,345,906,198,525,340,355,688,516,247,517,476,847,542,169 +649,646,898,462,539,472,396,310,148,832,303,187,362,848,402,646,853,661,477,91 +612,383,369,231,229,939,351,106,820,313,401,175,654,644,342,334,235,367,675,853 +794,120,754,469,399,383,613,579,360,87,418,414,390,828,864,606,345,860,309,200 +746,539,316,14,800,274,641,507,335,410,745,872,947,131,227,656,900,535,802,460 +945,836,325,610,376,939,616,235,311,408,322,102,743,442,697,141,825,321,534,861 +252,203,78,611,824,653,348,700,946,508,864,338,98,78,611,319,439,344,791,232 +508,943,13,933,83,193,149,647,786,385,739,477,707,199,486,746,169,155,466,315 +472,782,945,275,53,618,340,377,390,545,849,753,375,355,468,704,856,480,157,305 +338,507,476,303,271,541,135,528,790,53,565,505,249,387,678,747,860,509,466,844 +140,246,64,309,196,94,834,193,136,97,471,827,251,170,713,757,738,344,460,388 +847,290,440,313,534,754,481,822,754,740,316,469,538,790,793,864,325,196,575,796 +645,672,342,193,646,305,781,189,139,979,316,900,749,324,478,525,753,934,256,73 +613,324,781,581,56,335,524,812,74,142,229,748,873,378,895,529,316,755,147,342 +95,106,310,303,345,490,736,145,544,614,127,193,93,333,15,56,463,532,861,947 +366,460,388,806,540,444,96,58,442,577,620,741,685,836,209,785,53,933,787,576 +522,322,739,572,618,938,686,444,756,254,482,196,333,360,799,101,639,572,768,356 +127,856,860,943,658,87,115,108,862,619,675,384,581,70,526,789,403,369,938,139 +475,256,471,91,840,71,183,938,316,255,582,522,840,501,145,677,700,839,866,655 +744,262,389,538,839,844,194,907,228,181,478,941,418,948,329,418,329,379,643,127 +237,85,72,150,574,619,678,82,658,71,411,674,273,527,856,791,834,327,87,756 +390,500,270,354,74,701,567,497,611,779,146,741,328,383,877,309,90,749,279,237 +379,155,70,508,530,171,906,257,376,535,778,152,439,129,235,80,803,859,743,522 +527,690,385,491,249,780,618,57,798,365,409,223,924,537,903,498,874,137,720,580 +536,875,477,246,114,167,55,803,609,525,670,834,244,67,54,704,753,757,127,829 +653,942,643,938,214,751,80,749,749,513,645,838,866,538,145,60,275,674,673,346 +914,113,304,639,310,783,851,825,685,309,69,351,875,155,152,238,353,575,78,638 +822,334,935,793,146,492,861,767,529,753,277,758,843,321,468,491,340,679,83,226 +444,870,341,653,852,89,651,941,309,258,645,841,606,364,649,873,138,529,259,800 +898,683,464,783,897,607,99,183,483,395,219,932,706,847,737,128,754,409,259,409 +608,564,144,86,523,941,226,519,97,925,333,67,383,501,226,581,106,805,481,614 +171,55,392,79,501,925,189,196,366,269,996,833,531,371,110,785,354,201,759,352 +374,60,400,272,54,74,353,522,494,785,811,277,69,201,744,399,341,929,940,66 +190,805,131,494,806,260,753,576,131,531,896,384,607,354,791,194,149,644,904,500 +68,498,742,747,57,792,9,256,508,942,354,614,110,339,325,851,826,64,64,143 +443,92,847,250,516,827,247,562,71,794,224,751,498,484,279,202,513,244,641,542 +379,487,709,324,906,204,613,207,553,904,319,792,805,368,168,617,840,442,488,205 +249,876,640,471,542,801,744,245,127,206,808,978,823,925,513,873,347,69,931,442 +818,353,391,512,102,175,402,362,94,247,682,257,493,441,73,397,123,839,575,738 +135,59,606,183,743,255,528,171,387,513,473,577,66,899,139,65,410,757,371,178 +100,315,606,894,345,131,199,472,123,931,646,993,493,615,611,154,182,418,106,835 +227,580,210,650,201,225,374,675,362,366,269,402,127,399,808,409,504,688,205,506 +83,862,749,940,760,446,483,468,223,103,378,740,379,132,753,131,329,169,197,136 From 85ed83d9a8422d9a52481aaa8fcbe0271030cab2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 16 Dec 2020 10:11:06 +0100 Subject: [PATCH 128/479] 2020: d16: ex2: add solution --- 2020/d16/ex2/ex2.py | 106 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100755 2020/d16/ex2/ex2.py diff --git a/2020/d16/ex2/ex2.py b/2020/d16/ex2/ex2.py new file mode 100755 index 0000000..61423f4 --- /dev/null +++ b/2020/d16/ex2/ex2.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python +import math +import sys +from typing import Dict, List, Set, Tuple + +Ranges = Dict[str, Set[int]] +Ticket = List[int] + + +def parse(raw: List[str]) -> Tuple[Ranges, List[Ticket]]: + def extract_field_info(line: str) -> Tuple[str, Set[int]]: + field, rest = line.split(":") + ranges: Set[int] = set() + for r in rest.strip().split(" or "): + lhs, rhs = r.split("-") + ranges |= set(range(int(lhs), int(rhs) + 1)) + return field, ranges + + def parse_tickets(line: str) -> Ticket: + return [int(i) for i in line.split(",")] + + ranges: Ranges = {} + tickets: List[Ticket] = [] + + should_parse_tickets = False + for line in raw: + if line == "": + should_parse_tickets = True + continue + if "ticket" in line: + continue + if should_parse_tickets: + tickets.append(parse_tickets(line)) + else: + field, field_ranges = extract_field_info(line) + ranges[field] = field_ranges + + return ranges, tickets + + +def verify_mapping(possibilites: Dict[int, Set[str]]) -> None: + for pos in possibilites.values(): + assert len(pos) == 1 + + +def cross_eliminate(possibilites: Dict[int, Set[str]]) -> None: + while True: + eliminated = False + for pos in possibilites: + if len(possibilites[pos]) != 1: + continue + for other_pos in possibilites: + if other_pos == pos: + continue + if len(possibilites[other_pos] & possibilites[pos]) == 0: + continue + eliminated = True + possibilites[other_pos] = possibilites[other_pos] - (possibilites[pos]) + if not eliminated: + break + + +def match_ranges(ranges: Ranges, tickets: List[Ticket]) -> Dict[int, str]: + possibilites: Dict[int, Set[str]] = { + i: set(ranges.keys()) for i in range(len(ranges)) + } + + def whittle_down() -> None: + for t in tickets[1:]: + for i, val in enumerate(t): + for field, valid in ranges.items(): + if val in valid: + continue + possibilites[i].remove(field) + + whittle_down() + cross_eliminate(possibilites) + verify_mapping(possibilites) + + return {i: pos.pop() for i, pos in possibilites.items()} + + +def solve(raw: List[str]) -> int: + ranges, tickets = parse(raw) + + def valid(t: Ticket) -> bool: + for val in t: + if not any(val in r for r in ranges.values()): + return False + return True + + tickets = [t for i, t in enumerate(tickets) if i == 0 or valid(t)] + + mapping = match_ranges(ranges, tickets) + return math.prod( + tickets[0][i] for i, field in mapping.items() if "departure" in field + ) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 69f0ba61c0e5f52f91a2c49f454a1b581a410a8c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 17 Dec 2020 08:55:29 +0100 Subject: [PATCH 129/479] 2020: d17: ex1: add input --- 2020/d17/ex1/input | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 2020/d17/ex1/input diff --git a/2020/d17/ex1/input b/2020/d17/ex1/input new file mode 100644 index 0000000..e6c20d5 --- /dev/null +++ b/2020/d17/ex1/input @@ -0,0 +1,8 @@ +######.# +#.###.#. +###..... +#.####.. +##.#.### +.######. +###.#### +######.# From 2eb9429f693d76f59c71f781e04b1af8bd2ff593 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 17 Dec 2020 08:55:37 +0100 Subject: [PATCH 130/479] 2020: d17: ex1: add solution --- 2020/d17/ex1/ex1.py | 66 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100755 2020/d17/ex1/ex1.py diff --git a/2020/d17/ex1/ex1.py b/2020/d17/ex1/ex1.py new file mode 100755 index 0000000..dd9efee --- /dev/null +++ b/2020/d17/ex1/ex1.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import Iterator, Set, Tuple + +Point = Tuple[int, int, int] +Grid = Set[Point] + + +def update(grid: Grid) -> Grid: + def neightbours(p: Point) -> Iterator[Point]: + for dx, dy, dz in itertools.product(range(-1, 2), repeat=3): + if dx == 0 and dy == 0 and dz == 0: + continue + yield p[0] + dx, p[1] + dy, p[2] + dz + + def count_neighbours(p: Point) -> int: + return sum(n in grid for n in neightbours(p)) + + new_grid: Grid = set() + seen: Set[Point] = set() + for p in grid: + for n in itertools.chain(neightbours(p), [p]): + if n in seen: + continue + seen |= {n} + active = n in grid + num_neighbours = count_neighbours(n) + + if active and num_neighbours in [2, 3]: + new_grid |= {n} + elif active: + continue + elif num_neighbours == 3: + new_grid |= {n} + else: + continue + + return new_grid + + +def solve(grid: Grid) -> int: + + for __ in range(6): + grid = update(grid) + + return len(grid) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print( + solve( + { + (i, j, 0) + for i, line in enumerate(input) + for j, x in enumerate(line) + if x == "#" + } + ) + ) + + +if __name__ == "__main__": + main() From 8f8d4e6b850f6769d33c66ff8e4adbf0b1c08ede Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 17 Dec 2020 08:55:44 +0100 Subject: [PATCH 131/479] 2020: d17: ex2: add input --- 2020/d17/ex2/input | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 2020/d17/ex2/input diff --git a/2020/d17/ex2/input b/2020/d17/ex2/input new file mode 100644 index 0000000..e6c20d5 --- /dev/null +++ b/2020/d17/ex2/input @@ -0,0 +1,8 @@ +######.# +#.###.#. +###..... +#.####.. +##.#.### +.######. +###.#### +######.# From ed3fa75fb90c0359371de72a6d5dfa40121887d1 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 17 Dec 2020 08:55:51 +0100 Subject: [PATCH 132/479] 2020: d17: ex2: add solution --- 2020/d17/ex2/ex2.py | 66 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100755 2020/d17/ex2/ex2.py diff --git a/2020/d17/ex2/ex2.py b/2020/d17/ex2/ex2.py new file mode 100755 index 0000000..8589288 --- /dev/null +++ b/2020/d17/ex2/ex2.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import Iterator, Set, Tuple + +Point = Tuple[int, int, int, int] +Grid = Set[Point] + + +def update(grid: Grid) -> Grid: + def neightbours(p: Point) -> Iterator[Point]: + for dx, dy, dz, dw in itertools.product(range(-1, 2), repeat=4): + if dx == 0 and dy == 0 and dz == 0 and dw == 0: + continue + yield p[0] + dx, p[1] + dy, p[2] + dz, p[3] + dw + + def count_neighbours(p: Point) -> int: + return sum(n in grid for n in neightbours(p)) + + new_grid: Grid = set() + seen: Set[Point] = set() + for p in grid: + for n in itertools.chain(neightbours(p), [p]): + if n in seen: + continue + seen |= {n} + active = n in grid + num_neighbours = count_neighbours(n) + + if active and num_neighbours in [2, 3]: + new_grid |= {n} + elif active: + continue + elif num_neighbours == 3: + new_grid |= {n} + else: + continue + + return new_grid + + +def solve(grid: Grid) -> int: + + for __ in range(6): + grid = update(grid) + + return len(grid) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print( + solve( + { + (i, j, 0, 0) + for i, line in enumerate(input) + for j, x in enumerate(line) + if x == "#" + } + ) + ) + + +if __name__ == "__main__": + main() From c2a38319af1bef716611397b1ae8ec8d147db9cd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 18 Dec 2020 10:09:45 +0100 Subject: [PATCH 133/479] 2020: d18: ex1: add input --- 2020/d18/ex1/input | 377 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 377 insertions(+) create mode 100644 2020/d18/ex1/input diff --git a/2020/d18/ex1/input b/2020/d18/ex1/input new file mode 100644 index 0000000..41690ab --- /dev/null +++ b/2020/d18/ex1/input @@ -0,0 +1,377 @@ +(5 * 7 * 5) * 6 * 5 + 7 + 6 * 4 +(2 + 3 + (2 + 8) * 3 + (7 + 4)) * 3 + 7 +2 + 4 * (2 + 2 * (9 + 2 + 6 + 3 + 6) + 4) +4 * 3 +9 + (8 * 5 * 5 * 4 * (3 * 5) * 2) + 4 + 4 +5 + 5 + 2 * 4 + 4 +7 + 9 * 2 + 2 * 3 +5 + 8 + 5 * (6 * 8 * (9 * 2 + 2 + 7 + 4 + 2) + 4 * 6) * 5 +8 * 7 * 4 * 5 + 3 +(9 * 9 + 9 * 7 * 4) + 9 + 5 * (5 + (8 * 8) * (2 * 8) * (5 + 3 + 5 * 5 + 4 + 2)) + 2 +(4 + 7 + 2) + 9 * 3 + 7 * ((8 * 7) + 5 * (9 * 9) * 8 + (8 * 2)) * 9 +8 * 2 * (2 + 5 + (5 * 4 * 2 + 7 + 3 * 4)) + ((4 + 9) + (4 * 8) + (6 * 8 + 6) + (4 * 3 * 9) + 5) * 7 +7 + 2 + 8 * 2 * (2 * (6 * 2 * 4 * 5) * (4 * 4) + 2 + 3 + 2) + 6 +8 * ((6 + 8 * 3 * 9) + 9 + 8) +7 + ((6 + 3 + 7 + 6 * 7) + 6 * 6) +5 * (7 * 5 + 4 + 7 * 4 * 4) * (7 + 6 * 4 + 4 + (3 + 3 * 7 + 2 + 8)) * 8 +((3 * 7 * 3 * 9) * 2 + (5 * 2 * 6 * 6 * 5 + 6)) * 4 + 6 * 4 + 7 +2 + (7 + 5 + 9 + 9) * 4 +(9 + 6 + 5 * 5 * 5 + 5) * 9 * 2 + (6 * (8 + 4 * 9) * 5 + 7) * 9 * 5 +9 + 2 + (5 * 6 + 7) + 4 + 7 +9 * (2 * 9 * 4 * 4 + 6 * 6) * 8 * 3 * (4 + 7 + 8 * 3 + 4 + 9) * 9 +2 + 4 + 6 * 6 * (3 * 3 + 6 * 4 * 8) * (5 + (9 * 2)) +9 + (6 + 8) + 7 * (8 * (7 + 6 * 4) + 7) * ((6 * 7) + 8 + 2) * 8 +((6 * 3 * 2 + 8 + 4) * 6 + (7 * 7 * 7 + 3)) * (2 * 5 + 2 * 3) + ((2 + 8 * 5 + 4) + 6 + 6 * (3 + 8 * 9)) * 5 * 4 + 2 +(4 + (3 + 9 * 9 + 9 + 2 * 3) + 6 * 2 * 3) + (7 * 7 * 8 + 6 * 5) * 7 + 8 + (7 + 7 + 4) +9 + (5 + 5 * 4 * 4 * 3 * 8) * 6 + 5 + 4 +8 * 2 + 9 + 7 + 6 * (3 * 6 * 7 * 6 * 8) +(7 + 6 * 3 * 3) * 8 + (8 * 2 * 5 + 8 + 2) + 4 +5 + 9 * 5 + 5 * 6 + (7 * 8 * 8 + (2 + 9 * 4)) +((7 * 4 + 2 + 6 + 3) * 4) + 7 + 7 +(7 * 8 + 8 + 3) * 3 * (9 * 5 * 3 * 9) * 5 +6 + (8 + 8 * 7 + 7) + (5 + 7 * 4 * 4 * 5) * 5 * 2 * (5 * 4 * 5) +2 * (5 * (8 + 5 + 8)) * 5 * ((6 + 9 + 6 + 8 + 9) * 4 + 8 + 7 + (5 * 7 * 2 * 3)) +8 + 9 * 7 + ((6 * 4 + 3 * 9 + 9) * (3 + 8 * 5 * 4 + 5 + 5) * 2 + (2 * 2 * 3 * 9)) +2 * 9 + 4 * (2 * (7 + 8 * 2 * 9 + 2 * 6) * 3 * (6 + 3 * 7 * 7 + 4)) +5 * 3 + (8 * 6 + 7 * 8 + (8 + 3)) * 7 + 3 * 2 +((2 * 7 + 7) * 9 * 8 * 7) * 6 * (6 + 2) * 9 +7 * 6 * (3 * (5 * 7 + 5 * 4) * (4 + 6 + 3) + (6 * 7)) * 3 * 8 +(3 * 6) + 7 * 2 * 6 + 7 * 3 +6 * 3 * ((4 + 8 * 7 + 2) * 3) +6 + 9 + (3 * 9 * 5 * 8) * 7 + 8 +8 + 6 + 2 * 2 + ((7 + 4 * 9) + 8 * 4) +6 * 3 * 5 + 7 + 5 +((4 + 5 * 2) + 6 * 7 * 7 * 6) * (7 + 8 * 4 + 9) +(8 * 5 + 8) * (5 + 4 * (5 * 7 * 4 * 8 + 4 * 4) * 9) + (2 * 2 + (8 + 3) * 4) + (4 * 4) +6 * (5 * 4 + (5 + 8 * 7)) * 2 +(2 * 2 * 9 + 9 + 8) * (6 * 6 + 8 * (5 * 4) * (3 + 8) + 2) + 5 + 2 +2 * (3 + (5 + 4 * 4 * 2 + 8) + 8 * 2 + 8 + 5) +3 + 9 * (7 + (2 * 5 * 5 * 4 * 9) * (8 * 3) + 5) * 2 +(2 * (2 * 4 * 7 + 7 + 4)) * 8 * 6 * 7 +(4 * (5 * 2 * 3 * 7) * 5 + (2 * 9) + 6) + (6 + 8 * (4 * 6 * 4) + 2 * 6 * 2) + 6 * 5 + 5 +5 + (7 + 3 + 6 + 9 + 5 + (3 + 9 * 8 + 8 + 7)) * 9 * 9 +3 + 2 + (4 * 6 + (2 * 8 + 6 * 7) + 6) * 9 * 9 +(3 + 2 * (8 + 9 + 8) * 5) * 3 * 3 * ((3 + 9 * 7) + (9 * 8 + 6 * 9 * 9 * 3) * 5 * 7 + 4) + 5 * 4 +7 * 6 + 8 + 2 * (5 + 3 * 5 * 5 * 7 + 8) + 9 +7 + 6 * 6 + (5 + 6) * (8 * 3 + 2 + 9) +6 * (7 + (3 + 8 * 9 + 4 + 7) + 6 * (2 + 8 + 3) * 5) + 9 * (5 + 5 * 2) + 8 + 3 +(6 + 6 * 9 * 3) * 6 * 3 + (5 * 4) +6 * 9 * 8 +7 * 4 * (8 + 7 + 7) * 4 * 7 + 4 +5 + 8 * 5 * 7 + 7 + 5 +2 * ((9 * 3 * 7 + 6 * 6) + (5 * 3 * 2 * 8)) * (8 * 3 + 2 * 6) * 6 * 5 +9 + 5 + 6 * 5 + (9 * 4 * (8 + 2) * 6 + 4 * (2 + 3 + 2 * 2)) + 4 +6 * 4 + (2 + 4 + (6 * 9 * 3 * 8 * 6 + 8)) * 4 + 5 +9 + (3 * 5 * 4 * 9 + 6) * 7 +9 + (8 * 2) * (3 * 7 + (7 * 2) * 8) + 5 * (7 + 9 * 7 + 3) +(5 + 3 + 4 + 8 * 3 * (6 * 5 * 9 * 3)) + 2 * 4 +4 + ((2 * 9 * 2 + 5) * 6 * 5) * (5 + 2) + 7 * 5 + 5 +8 * 3 * (9 * 3 + 5 * (5 * 4 * 3)) +8 * ((3 + 8 + 5) + 6 + 9) + 7 + 4 * 5 +(9 + 9 + 7) + (7 * 2) * (7 * 3 + (5 + 2 * 3) * 9 * 3) + ((2 * 6 + 2 + 7 + 8 * 2) * (2 + 3) + 4) +(9 + 8 * 9 * (7 + 7) + 5 * 7) + 9 + 2 +3 + (8 * 5 + 9) + 2 + 8 + 8 +5 + 2 + (5 * 8 * 3 * 7 * (3 * 7 + 6) * 4) * 3 +((7 * 9 + 3 + 2) * (9 + 9 + 7) + 4 * 4) * 7 +(7 * (3 * 8 + 3) + 4 + 6 * (4 * 7 + 9)) + ((4 * 6 * 6 * 9) * (6 + 3 + 2 * 8 + 5 * 7) + 3 + 2 * 2 + 3) * 2 + (6 + 4 * (6 + 7)) +7 * (6 * 7 + 6) + 2 +4 * (3 * 4) + 9 + 8 + (4 + 5 + 9 * (7 + 9 + 5) + 7 + 2) +7 + 2 * 5 + (4 + (8 + 3 * 3 + 6) * 5 * 7) + 6 + 3 +(4 + (9 + 8 * 7 * 7) * 3 * 6) * 7 + 9 * 7 + 5 +2 + 4 +(2 * (8 + 3 + 8 * 2 + 7 + 3) + 7 + 7 + 6) * 3 * 7 * 7 * 2 +9 + 6 + 2 + (5 + 5 + 2 * 3) + 9 +3 * (6 * 8 + 2 * 8 + 7 * (3 + 3 * 4 + 2 + 7)) * (4 + 4 + 6 * 2 * 4 + 4) * 8 +5 + (5 + 8) + (2 + (7 * 9 * 2 + 8) + 6) + 9 + 3 +9 + 5 + (8 * 4 * 3 + 4) + (6 * 3 * 9) * 3 +(5 * 7 * (7 * 7 * 6) * (8 + 2) + 8 * 7) * 3 + 7 +8 * (6 + 6 * 4 + 9 + 4) * 3 * 6 * 8 + 6 +5 * 5 + 2 * (5 * 2 * 9 + (6 + 7)) * 7 +(5 * 6 * 5 * 3) * 2 + (8 + 6 + 9 * 7 + (2 * 3 + 3 * 8 + 5 + 2)) +8 + 7 * ((6 + 4 + 4 + 8 + 7) + 2 * 5 + 3 * 9 + 6) * (3 * 5 * 5 * 9 * 4) * 3 + ((3 + 4 + 2 * 3 * 2 + 2) + 7) +(8 + (9 * 6 * 3) * (9 + 8 + 3) + 4) * 5 +4 + (4 + 2 + 7 + 9 * 3 * 7) + 9 * (5 + (9 + 9 + 7 + 8 + 8) * 7 + (2 + 2 * 9 + 3)) + 3 +4 + 5 + 5 * (6 * 6 + 3) +(7 * 7 + 6 * 7 * (4 * 2 + 9 + 7)) + 8 +(4 * 7 + 9 * 6) * 6 * 4 + 8 * (6 + 7 * 9) * 2 +7 + (8 + 9) * 6 * 3 + 4 +8 * (7 * (7 * 3 + 3) + 3 * 5 * 9 * 2) * 6 * ((2 + 4 * 5 * 2 + 5 + 3) + 4 + (4 * 2) * 2 * (9 + 5 + 3 + 7) * 5) + (5 + 5 + 3 + (6 + 6 * 2 * 8 + 6)) +6 * 6 +8 + 5 + 5 + (8 + (3 * 5) + 5 * 3) * 2 + 5 +((4 * 7 * 3) * 7 + 2 * (6 + 2) * 8) * 8 +(6 + 3 * 5 * 5 * 6 + 2) * 3 * 7 * 6 +6 + (9 * (4 * 8 * 5 * 3 + 6 * 9) * 4 * (8 + 3 + 3 * 4) * 6 + 4) + 4 * 2 + 9 +((5 + 4 + 6) + 7 * 8 + 7) + 8 + 9 * 8 + 3 +(4 + 2 + 5 + 4 * 7 * 9) * (7 + (2 * 9) * 8) + 3 + 5 +(3 * 6 + 8 * 8 + 2) * 6 + 4 + (7 + 2 + 6 + 2 * 7) +8 + (2 * 9 + (3 + 4 + 3) + 2) +5 + 2 * (5 * 9 * (6 * 8 * 3 + 6) * 8 * 5 + (5 * 4)) + 9 +6 + ((8 * 3 + 5 + 9 * 9) * 3 + 6 * 9) * (5 + (5 * 4 * 8 + 5) * 4 * (3 * 2 + 7 * 7 * 4) + 2 * 2) +9 + 4 * (2 * (6 + 9 + 6 * 8 + 7)) * 9 * 2 +4 + 8 + (8 + 5 * 8 + 7) +8 * (2 + 4 + 5 + 7 * 6) * (4 + 9 * 4 + 7 * 2 * 7) * 6 + 9 + 4 +8 + 3 * 8 * (2 * 5 + 5 + (5 * 2 * 6 + 3) + 6) * 9 +((4 + 5 * 7) * 9 * 8 * 2 + 6) + 9 + 7 +((4 + 3 * 6 * 3 * 4 * 7) + 3 * 5 * 4) + 9 * (8 + 7 * 2 * (2 + 8) + 9 * (2 * 8)) * 5 * 5 * 8 +2 + (5 + 6) * 4 + (9 + 5 * 5 * 7 * 5 + 2) +6 + 6 * (6 * 3 * (2 + 3 + 4 * 3 * 7) * 3 * (4 * 9) * 5) * 9 +7 * 2 * (9 + 8 + 3 * 9 * 4) + 8 +(9 * 8 * 2 + 7 * 2 * 8) * 4 + 9 + (3 + (3 + 3 * 5 + 2) + 9 * 4 * (5 * 3 + 2)) * 6 +7 * 2 * 9 + ((5 * 5 * 8 * 4 + 3 + 7) + 8 + 2 + 3 + 6) * 5 * (8 + (5 + 6 + 7 + 6 + 8 * 6) * 6) +5 + 6 * ((3 * 7 * 2 + 6 * 9) * 6 + 2 * (8 * 5 * 5 + 9 + 8)) * 6 + 4 * 7 +7 + 7 + 9 * 6 * 4 + 3 +4 + (3 * 8 + 8 + 2) * 8 * (9 + 3 + 7) * (4 + 7 + 2 + 5) +9 * 2 + 5 + 6 * 6 + (3 + 9 * 6) +(6 + 3) + 5 + (4 * 6 + 8) * 6 +9 * (6 + 6 * 7 + 6) * 7 * 3 * 5 + 4 +(7 + 8 + 8 * 2 + 5) + 7 + 2 +(5 * 4 + 8) + 9 + (3 + (8 + 2 * 5 * 7) * 9 + 3) * 7 +(2 * 3 + (7 * 4) + 8 * (6 + 4 + 7 * 4 + 5 + 4)) * 7 * 9 * 8 + (3 + 6 + 6 + 9 + 2) +2 * 2 * (3 * (5 + 4 * 4 + 9 + 7) + 5 * 8 * (7 + 2 * 2)) +2 * 5 * 8 + 6 + (2 + 3 * (7 + 4 + 4)) * 6 +3 + 3 + 2 + 8 + (4 + 9 * (5 + 7 * 3 * 8 + 4)) +(6 * 8) * 5 + 5 * 8 +2 * 3 * 9 * (3 * 7 + 6 + 9) + 2 + 6 +5 * 8 * (2 * 3 * 7 + 3) * 7 +2 + (5 * 5 * 8 * 7 + (3 * 9) * (3 + 8 + 3)) * 5 + (6 * 2 * 9 + 3 + (4 + 4 * 7 + 6 * 6 + 8) + 9) + 5 + 9 +(3 * 5 + 7 + 5 + 5 * 7) * (2 + 4 * 4) + 5 * 6 + 9 +4 + 4 + ((9 * 3 + 5 + 4 * 7) + 6 * 6 * 2 + 9 * 2) * 9 * 9 +7 * (4 + 7 + (5 + 5 * 8 + 8 * 3 * 3) + 7 * 7 + 7) +2 + 9 + 2 +((9 * 8 + 4 * 3 + 6 + 6) + (4 * 2) + 2 * 9 + 4) + 6 + 7 + (3 + 8 * 9 * 8) + 2 * 2 +(3 + 6 * (9 * 6) * (2 + 6 + 7 * 4) * 7 * 3) * 9 + 8 +4 + 7 * (2 * 2 + 6) * (2 + 4 + 6 * 5 + 6) +(8 * 7 * 4 + 7 * 5 + 7) + 6 * 2 +2 * 2 + 3 * (4 + (3 + 9 * 3)) * 4 +6 + 5 * 5 + 9 + ((7 + 6 + 2) + (2 * 6 * 2 * 5) * 7 * 4 * 3 * (6 * 4)) + 9 +3 + 2 * ((9 + 2 + 2 + 6 * 9 + 4) + 5) * 8 * 9 +(8 + 4) + 2 + (2 * 2 + 8 * (5 * 6 + 6 * 4 + 9) + 8) + 2 * 8 + 2 +2 * 5 * 7 * 6 * (8 * (2 * 7 * 4 + 6) + 3 + 9 * (8 * 3 + 2) * 8) +4 + 3 + 4 + (6 + (6 + 4 + 7) + 4 + 7) * 6 +8 + 5 + (9 * 6 * 6 + (3 * 9 + 3 + 6 + 9)) +((3 + 6) + 6 * 3 + 3) * 2 + (9 * (8 * 7) + (2 * 9 * 6) * 6 + 2) * 8 + 2 +((7 * 4 + 7 * 4 + 2 + 7) * 3 * (7 * 8 * 4 + 8 + 4 + 4)) * 6 +6 * 4 * (8 + 5 + 2) +(8 + 5) * 2 + 4 + 6 + 3 +((4 * 5 + 7 * 2 * 8 + 9) + 4) + 7 + 3 * 8 +2 + 2 * 3 + 7 * (3 * 6 + 9 + 5 * 7 * 5) +8 * (9 * 8 * 7 + 9 * 6 + 9) + 9 +5 * (4 * 3) * 6 +5 * 6 * 8 * (2 * (4 + 5) * 4) + 3 +4 + 8 * (2 + 6 * 8 * 7 + 9 * 3) + 5 +2 * 3 * 7 * (2 * (7 + 7 + 8) + 8 * 7 + 6 + 2) * 7 + ((4 * 2 * 3) + 9 * 7) +9 + 6 * 6 + (3 + 4 * 3 + 9 + 5 + 3) * 4 +(2 * (4 + 3) * 9) * (2 + 9 * (6 + 6 + 3 * 5 + 2 + 4) * (2 + 5 + 4 + 7) + 2 + (4 + 4 * 8 * 7 * 7)) + (3 * 7 * (3 + 3 + 3 + 2) * (6 * 3 * 8)) * 4 + 4 +(4 + 7) + (3 * (5 * 3 + 5 + 9) * 9 * 3 * 9) +9 + 7 * ((2 + 2 * 8 + 7 + 6 * 5) + (6 * 7) * (3 + 6 + 8 * 5) * (8 * 8) * (3 + 3 * 7 + 4 + 7)) +9 + 9 * (3 * (6 + 7 * 9 * 7 + 3)) + 3 + 6 + 9 +2 + ((3 + 7 * 8 + 9) + (8 + 8 * 9)) + 6 + 7 * 8 +4 * (6 + 8 * 8 + 4 * (3 * 2)) +(5 + 5 * 3 * 3 + 3) * 7 + 7 + 3 +2 * (2 + 6 + 4 * (3 + 4 + 7 * 8 * 9 + 9)) * 9 * 7 +(4 + 6 + 7 + 4) * 7 * ((4 + 9) + 8 + 5 * 7) +8 * 6 + 6 + 7 +(5 + 3 * 2 + (4 * 4 + 5 * 4) + 3) + 7 + 8 + 8 + 7 * 3 +4 + (7 * 5 + 6 * 7 + (2 * 7 * 8) * 3) +7 * ((3 * 3 + 2) + (8 + 6)) * 4 + (7 * 7) * 8 * 7 +((5 * 8) * 6 + 8) * 5 * 7 +3 * 3 + 5 + ((2 * 4 + 3 + 8 + 8) + 2 + (7 * 9 * 6) * 6 * 6) +7 + 7 + 5 + 4 * ((5 + 8 * 8) + (2 * 2 * 2 * 6)) * 6 +(4 + 6 + 7) + 2 + 3 +(8 + 8 + 2 + (4 + 6 * 4 + 9 + 9 + 4) * 6 * 4) + 9 * 4 + (9 * 7 + 5 * (3 * 9 + 4 + 7) + 7 * 4) +8 + (8 + 5) * (8 * (3 + 3 + 5 + 9)) +8 + (4 + (7 + 8 + 4 + 9 + 4) * 7 + (5 * 9 + 2 * 6 + 6) + 4 * (7 + 2)) +(3 * 7 + 8 + 6 * 3) + 5 * 5 + 7 * (9 + 5 + 7 * 8) +(9 + 7 + 2 + 2) + 4 * 4 * 9 +2 + (4 + 4 + (8 * 9 * 2 * 7 * 2) * 8 * 5) * 5 + (4 + (3 + 2) * (3 * 2 * 9 + 9 * 8 + 5) + 2 * (3 * 4 * 7 * 5 * 6 + 7) * 5) +(2 * 6 * 9 * 7) + (4 * (4 + 3) + 9) * 9 +4 * 3 + 5 + (6 * 6 * 3 * 9 * 7) * 7 * 4 +8 * 6 * (2 * 6 * 2 * 7 * (6 + 4)) * 4 + 5 +4 * 9 + 7 * 6 * ((9 + 7 * 5 * 5) + 7 * 9) +3 + (8 + (5 * 2 + 8 * 7 + 6 + 3) + (7 + 9 * 2 + 3) * 6 * 7) +4 * 7 * 4 * (4 * 5 + (7 + 6 * 7 + 8)) + 4 +(8 + 5 * 3) + ((8 * 7 + 6 * 5 + 8 + 9) * 5 + 2 + 7 + 8 * (5 + 7 + 4 + 4)) + 3 * 9 +6 * (7 + 2) + 4 + 7 * 2 * 5 +(2 * 9 * 9 * (3 * 4)) * 7 * 4 + 2 + 4 +(8 + (9 * 2 * 8) + (5 * 9 * 5) + (5 * 6 * 3 + 8 * 2 + 6) * 5 * 5) * 6 + 8 + 3 * 3 * 2 +2 * 5 * 7 * 4 +(2 * 8) * (2 + (4 + 2 * 5 + 2) * (2 + 7 + 6) + 5 + 5 + 7) * 4 + 8 * 7 +(8 * 5 + 4) * 5 +(9 * 6 + 8 * (3 * 8) + 5) + (8 * (3 * 9 + 7 * 3) + 9 + 2 + (4 + 5 * 7 + 6 * 9)) * 6 * 8 +5 * 4 + 3 +(8 + 7 * 9 + 5 * 5) + 9 + 3 * (6 + 6 + 5) +(3 * 7 + 2 * 4 + 4) + 8 * 6 + 3 * 5 +((4 + 8 + 8 * 7) + 9 * 7 + 8 + (8 + 3 + 2) * 3) * 2 + (6 * 7) + 8 +(7 + (3 * 5 * 7 * 6) * 7 + (8 * 3 + 9 + 8 * 9 + 8) + 8) + 9 +((6 * 7 * 7 + 4) * 8 + 6 + 4 + 9) + 7 + 4 + 2 + 5 + 5 +4 * (2 * 2) + 2 + 3 * 3 + (4 + 2 + 2) +((4 * 8 + 8 + 9 + 3 + 3) * 9 * 9 + 7 * (6 * 5 * 3 + 3 + 3)) + (9 * 5 * 2) + (2 + 7 + 6) * 3 * 6 +(4 * 5 * (8 * 7 + 8 + 4 + 3 * 9) * 3 + 7 * (3 + 4 + 3)) + 3 + 6 * ((6 + 2 * 8) * 9) + 2 + 4 +7 * 3 + 8 + (8 + 2 * 9 * 2 * (7 + 4 + 7 + 7 * 7 * 8)) * ((4 * 6 + 7 + 4 + 6) + 5 + 3 + 6 * 6 * (6 + 2 * 9 + 6 * 7 + 3)) * 5 +(7 * 8 + 2 * (5 * 7) + 7 * 4) * 8 + 2 * 3 +4 + (8 * 3 + 9 * 9 * 3) + 7 + 7 + (3 * 4) +(4 * (5 + 9)) * 9 + 5 + 7 +6 * 2 * 9 + 4 + 6 * 2 +(7 + 3) * ((3 * 7) + 8 + (8 + 6 * 2 * 8 * 6 + 2)) * (7 + 9) +9 * 4 * 3 + 7 * 6 + (3 + 8) +4 * ((2 * 6 + 3 * 4) + 3 * 4) * 7 + 8 +(8 + 7 * (4 * 8) * 6) + 7 + 4 * 4 * ((8 * 9 * 7 * 9 + 7 + 3) + 6 + 8) +5 * (9 + 3 * 4 * (2 * 9 * 4 * 2 + 3) * 8) +4 * 9 * 8 * 7 + (6 * 9) +(4 + 4 + 3 + 5) + 9 * 4 +9 + (4 + 7 + 6 + 4 * (8 * 9 * 7 * 3 * 2 * 6)) + 3 * 6 +5 + 6 + (6 * 5) + 8 + 7 +(9 + 4 * 8 * (8 * 7 * 2 + 4) * (5 * 4 + 9)) + 6 + 5 +5 * 2 + 9 + ((3 + 2 * 9 + 3) * 5 * 9 + 2 + 3) * 8 + 5 +(6 + 8 + (3 + 8 + 4 * 4) + 6 * 9 * 3) * 7 + 3 + (5 * 9 + 2 + 7 + 6 * 8) + 5 + (3 + 2 + 2 + (3 + 4 + 2)) +9 * 3 + 7 + 6 * 7 + 3 +(2 * 4 * 3 * 7 + 5) + 6 + (2 + 7 + 4 + 3 * 4) + ((7 * 2 + 7 + 6 * 8) + 6 * 2 * 5) +((2 * 4) + 3 + 6 + 6 * (7 * 4 * 6 * 5)) * 3 * 6 + (9 * 5 + 8) +(4 * 3 * 4 * 4) + 5 + 8 + ((8 + 6 + 8 * 9 + 7 * 5) * (6 * 2 * 3 * 6 * 8) * 3) + 8 +(3 * 8 * (8 + 4 * 2 * 9)) + 4 +3 + 7 * 7 + 3 + 9 +((4 * 7 * 2) * 2) + 2 + 9 * 3 * (9 * 3 + (8 * 5 * 9 * 9) * 6) +9 * 6 * 4 + 5 + (6 + 5 * 4 * (8 + 9)) +2 * (2 * (6 + 2 * 2 + 9 + 6) + (8 + 8 + 7) + (6 + 8 + 7)) * 2 + 5 +5 * 8 * 2 + (7 * 7) + 7 + 6 +6 + (5 * 9 * 7) * 3 * 7 +3 + 9 * (4 + (5 * 8 + 4 + 4 + 5)) +4 * 7 * (8 * 2 + (3 * 8 + 9 + 2 + 6 + 6)) +(9 + 3) * 6 * 9 * 2 * 8 + (7 * 8) +(8 * 2 + (5 * 8 + 6 * 9 * 8 * 3)) + 9 * ((9 + 6 + 3) * 6 * 4 * 4 * 5) + 8 +3 + 3 * (3 * 6 + 8 + (8 * 7) + 5) + 7 +5 * 3 * 2 * 3 * (4 + 9 + 8 * 9) +(8 * (9 + 5 * 8) + (6 * 8) + 2 + (8 + 3 + 4 * 5 * 3) + 4) * (4 * 4 * 9 + 9 * 6) + 6 + 3 +2 + (5 + 8 * (5 + 4 * 7 * 4) + 4 * 7 + 5) +5 + ((6 * 9 + 5 + 5) + 2 * (4 + 4 + 2 * 6 + 3 + 9)) * ((3 * 5 * 2 * 8 * 5) + 2 * (4 + 9 + 5 * 9 * 8) + (2 + 6 * 6 * 5 + 3 + 9)) * (2 + 9 * 9) + 2 * 6 +5 + 2 * ((7 + 4) * 3 * 6) + 7 +4 + 3 * 6 * 8 +(8 + 7) * 5 + (2 + 5 + 3 + 4 * (3 + 7) + 3) +(2 * 2 * 7) + 2 * ((4 * 5 * 2) * 5 + 9 * (7 * 4 + 2 * 2 * 9) * 9) + 9 +3 + 6 * (7 * 7 * 2) + 6 +6 + (2 * 7) * 4 * ((3 * 2 * 4) + 3) + (7 + 2 * 7 * (5 * 2 * 3 * 3 + 8) + 7 + 7) * 8 +(5 * 3 + (8 * 8 * 5 + 3 + 2) + 6) * 5 * ((5 + 2) * (9 * 7 * 2 * 3 * 6) * 6 * (9 * 5 * 5 + 3 + 9) + (9 + 3 * 5)) +9 * 4 * 7 * 3 + (5 + 2 * 6 + 9) + (2 * 4) +(4 * (9 + 3 * 7 + 7 * 5) + 2) + 6 * 4 +8 + 5 * 6 * 2 * 2 + (8 * 4 + 6 * 9 + 2 * 5) +4 + (9 * 4) * 5 + (2 * 8 * 7) +7 * (3 + (4 * 3 + 8 * 3 * 3) * 5 * 4) +9 + 7 + (3 * 3 * (7 * 4) + (9 * 4 + 3 * 6 + 6 * 7) + 9) * 2 + 5 +8 + 6 * 9 * 4 +8 + 3 * (9 + (3 * 7 + 3 + 9 + 3) * 9) * 4 + 8 +4 + ((6 * 4 + 4 * 2 * 6 * 5) + 2 * 2) + (4 + 5 + 8 * 5 * 5) * 3 * 5 * 7 +(9 + 8 + 6 * 5 * 5) * 4 + (8 * 3 * 5) * (9 + (3 + 9 + 5 * 3 * 6 + 6) * 7 + (8 * 8 + 8) * 2 + 4) +(8 * 6 * 2 + 5) * 9 + 6 * 2 * 5 +2 * 5 * 3 + 7 + 6 * 6 +(3 * (4 * 9 + 6 * 2) * 8 + 8) + 7 * 5 + 9 + 2 * 2 +8 + (8 * 4 + 6 * (7 * 7 + 3 * 4 * 7 + 2)) +3 + (7 * (4 * 8 * 8 + 3 * 9) + 2 * 9) + 6 +8 * (6 * 9) * 7 + (9 + 2 * 9 * 7) * (3 + 7) +((6 + 7 + 4 + 8) * 5 * 7 + 3 + (8 * 2 * 5 + 9)) + 5 * 2 * 9 * 4 +3 * (7 * 7 + 6) * 3 * (5 * (7 * 2 + 6 * 9 + 9) + 3 + 6 * 9 * (2 * 3 * 6 * 9)) * 6 * 5 +(2 * (9 + 4 + 4 + 5 + 5) * (6 * 7 * 4 * 9) * (9 + 4 + 8 * 4) * 3) * (9 + 3 + 3 * 3 * 4 * 2) * 5 + 2 + 5 + 3 +(7 * 8) + (8 * (3 * 8 + 4)) + 3 * 7 * 7 * 6 +2 * 6 * (6 * 3 * (2 + 8 * 5 * 3 + 3 + 4)) * 5 + (9 + 9 + 2 + 3 * 3) +5 + 7 + 4 * 2 +4 * 3 + 7 + 9 + (5 * 2 + (5 * 6) + 3 + 4) + 6 +8 * 4 * (9 + 3 + (7 * 8 + 7 * 6 + 4 * 3)) * (6 + 9 + 9 * (3 * 7 * 9 + 2 + 2 + 2) * 6 + 4) + 8 +(5 + 9 + (8 + 7 + 6) + 8) + 6 + 2 +2 * (9 + 3 + 4 + (5 + 5 + 2 * 2 + 3 + 8) + 9) * 6 * 7 * 2 +5 * (6 * 7 + 2) * 9 + 7 + 4 + 3 +9 + ((4 * 4 + 3 + 8 * 6 * 7) * (8 * 4 + 9 * 4 + 8) + 6 + (9 * 3 + 5 + 7 + 9 + 3)) +6 * (3 + 8 * (5 * 7 + 5 + 8)) * 5 * 4 + 8 * 3 +7 * (3 * (7 * 4 * 8) + 4 + 3 * (2 * 3)) * 4 + (7 + 6) * 9 +(3 + (5 + 4 + 3 * 3 * 2 + 9) + 7 + 2) + 6 +3 * (5 + (3 + 3 + 4 * 5 * 8 * 9) + 9) +4 * (6 + 4) + (8 * 4 * (8 + 8 * 7 * 8 * 4) * 8) * 7 +(9 * (4 * 5 + 9 * 6 * 7 + 4) + 4 * 3) * 5 + 7 + 7 + 9 +5 * (7 * 8 * 8) + 4 + 9 + (4 * (3 * 5 * 6 * 7) + 4 * 8 * 4 * 3) + 2 +4 * 6 + 8 * ((3 + 4 * 3) + 6 + 3 + 2 * 5) +6 * (2 + 4 * (7 * 4 * 4 + 4 + 6) * 4) + ((9 + 7 * 6 * 7) * 8) * 7 * 3 * 9 +3 + (3 + 2 * 7 * 6) * (5 * 2 + 2 * 2) * 2 * (5 * 2 + 3) + 8 +6 * 2 * (8 * 9) +7 * 4 + 9 * (9 * 2) +(2 * 6) + (6 + 7 + 5 + 8 + 4) +6 + (9 * 5 * 6 + 5 + 6 * 6) +(5 + 9) + 2 + (5 * 7) +7 * 7 + 4 + (4 * 3) * 8 * (4 * (3 * 3 + 6)) +7 * (8 + 5 + (3 + 7)) * (4 + 4 + 8 + (7 * 7 * 6 + 9)) + 6 * 8 + 8 +4 + (8 + (5 + 2 * 7 + 6 * 7 * 6) + 5 * 9) +8 + (6 + 3 * 7 * 8 + 8 * 7) + 8 + 5 + 8 * 9 +7 * (7 * (3 + 3) * 6 + 9 * 7 + (2 + 3 + 6 * 8 * 6)) + 3 * (7 * 9) +(5 * (4 + 6) * 4 * 8 + 6 * 3) + 6 + 2 + (8 * 5 + 9 * 3 + (5 + 7 * 5 + 7) + 3) +(2 * 7 + 3) + 9 * 8 * 7 +(4 * 3 + 9 * 5 + 4 + 4) * 9 + (3 * 9 * 7 * 4) * (3 + 5 * 4 + 6 + 5) + ((7 + 6 * 7 * 4 + 5) + 2 * 7 + 8) + 8 +(7 * 4 * 4 + 7) + (6 * 9 * 7) + 5 + (3 + 5 * 9 * 4 * 9 * 2) + 4 * 7 +(4 + 2 * 2 * 8 + 5 * 3) + 4 * 5 * 3 * (4 * (2 * 3 + 2 * 8 + 2) + 4 * 9 * (6 + 3 * 7 * 3) * 5) + (7 * 8 * 9 + 3 * 9 * 4) +8 + (3 + 3 + 2) +6 * (3 * 6 * (3 + 5 + 8 + 5 + 5)) +(9 + 7 * 9 + (3 * 4 * 2 * 2 * 7) + 5 + 9) + 7 + (9 * (8 * 9) * 9) + 3 +(9 * 6 * 8 * 2) + (6 + (9 * 5 + 6 * 5 + 5 + 5) * (6 + 7 * 8 * 4 + 4 + 6) + 9) + 9 * 7 * 4 +4 + (3 * (3 + 4)) * 8 + 4 + 2 +((9 * 2 * 5 * 3 + 9 + 3) * (7 * 6 * 9 * 8 * 2) * 8 + 4) * 6 + 8 * 6 + 9 + (4 * 3 + 2 * 9) +(8 + 5 + (6 * 7 * 2 * 4 * 8)) * (9 + 8 + (4 + 8 * 2 + 8 * 4) * 9 * 8 * 9) + 7 + 9 + 7 +(5 + 2 + 3 * 5) * ((9 * 8) * 8 * 2 * 6 + (9 * 4 * 7)) + (5 + 3 * (5 + 7 + 6 * 4 + 8 + 5)) + (7 + 6 * 2 + 2 * 6 * 7) + 2 +7 * 2 + 7 + 8 + (9 * 9 + 8 * 6 + 7 * 7) * (7 + 3 + 5 * 4) +5 * (5 + 2 + 6) * 2 + (7 * 5 + 4 + (8 * 9 + 8 * 9 + 8) + 3) +4 + (3 + (4 * 4) + 8 + 8 * 9 + 7) * (4 * 4 * 2) + 8 * 5 +6 + 4 + ((5 + 7) + (8 + 9 * 3 + 5 * 9)) + (4 + 8 + 7 * 6) * 5 +3 + ((6 + 2 + 6) * 9 + 8 + (5 + 5) * 6 * (8 + 6 + 7 + 7 + 9 * 9)) + 9 +8 * 8 +(3 + 7) * 2 + 2 +2 * ((4 * 9 + 9 + 5 * 7 * 9) + 8 * 3 + 7 * 7) + ((3 * 4 + 4 + 6 * 9 + 8) * (7 * 2 * 9 + 8 + 5) * 9 * (9 * 3 * 3) + 6) +(4 + 6 * 5 * 7 * 7 + 6) + 9 + 8 + 8 * 3 * 8 +7 * 6 * (3 + 5 + 6 + 4 + 5 + (2 + 2 + 7)) + 6 + 3 * (4 * (3 + 4) * 9 + 3 * (7 * 4 + 3 + 6)) +9 * 5 * 7 + (5 + 2 * 4 * 4 + 9 + 6) +(6 + 2 * 8 * 6 + (5 + 9) + 3) * 5 + 6 + 4 +6 + 8 + 5 +6 + (8 + (6 * 3 * 5) + 4 + 5 * (5 * 6 * 2) + 8) + 3 + 9 * 8 + 6 +3 + (2 + 9 + 2 * (8 + 2 * 3 * 6 * 9) * 2) * 4 +7 + 4 + (8 + 7 * (3 * 2 * 7 + 2 + 3 * 8)) + 9 * ((5 + 5) + 2) +2 + (2 * 5 + 5 + 9 + 4) * 2 + 8 + 8 +(2 + 4) + ((9 + 4) * 3 + 7 * 6) + 9 * 6 +(9 * (7 + 5 + 8 + 8) + 8 + 5) + ((5 + 9 + 4 * 7 * 5) * 4 + 6 + 9 * 9) +4 + 8 + ((6 + 2 + 2 * 6 * 2) + 7) * 7 + (3 + 8 + 4 + 2) +((4 * 2 * 9 + 5 * 9) * 7) * 9 * (7 * 8 * 6 + 8 * 6 * 8) +(4 * (8 * 5 * 5)) + 5 + 6 * 2 + (2 + 9 + 7 + 6) * 5 +(6 + 2) + 5 +2 * (3 * 4) * 4 + 6 +2 * 8 * (6 * (7 * 4 * 9) + (2 + 2) * 2 * (6 * 2 + 9)) * (7 * (2 * 5 + 3 * 8 * 4) * (3 + 7) + 6 + 2 * 5) +3 * 7 + (4 * 3 + 5 + 9 + 2) +6 * 5 * 3 + 3 * 7 * ((3 * 4 * 3 + 8 + 6) * 4) +(6 * 6 + 4 + 5 * 5) * 7 +((6 + 8 + 4 + 5 + 9) * 3 + 4 * 5 + 4) * 5 + 9 + 9 * 9 +(9 + 4 * 5 * 5 + (3 * 3 + 5)) * 5 * 4 * 9 + (4 + 5 * 9) +2 + (9 + 5) +8 * (8 + 3 * 9 + 7) +(9 + (4 + 2 * 4 * 6 + 7 * 2)) + 5 * (5 * (3 * 7 + 3 * 8 * 8 * 8) * 9) +3 * ((4 + 3 * 8 + 5) * 9) * (6 * 5 + (2 + 5 + 4 + 3 + 8 + 2)) +6 + (3 * 3 * 5 + 9 * 8 + 8) * 7 + 9 +(5 * 8) * 2 * ((3 * 5 + 6 * 9 * 3 * 8) + 8 + 4 + 2 + 2) +(6 + 4 * 6 * 6) * (3 * 6) * 8 +((7 * 8 + 6 * 8 + 2) + 5 * 6) + 5 * 7 * 6 + 6 +4 + 8 * 9 * (2 * 5 * 8 + 9 * (5 * 8 + 9 * 4 + 6 + 4)) + 2 +9 * (7 * 7 * 7 * 8 * 5) + 8 + 4 +4 * 9 +(9 * (7 * 7 * 7 * 9)) + 6 * 7 + 4 * 8 +7 + (5 * 9 + (9 + 8 + 5)) + 4 * 7 + 8 * 5 +6 * 2 + (7 * 9) * 6 +(5 * 4) * (4 + 8) +9 * 4 + 6 * 5 * 6 + ((8 + 9 + 8) * 8 + 6 + (4 * 2 * 2 + 3 * 6)) +7 + (7 * 2 * 4 + 2 * 5 * 4) * 7 * (9 * 4 * 2 * 7 + 9) + 8 +(6 + 2) + (5 * 8 + 8 + 4) +(8 + (8 + 8 + 3) * 6 + (6 * 9 * 4 + 7) + 2) + 8 * 8 + 4 + ((7 + 4 + 5 + 8 + 9) + 6 + 7 + 9 + 6) + 3 +((7 + 6 + 3) * 4 + 2 + 5 + 8) * 4 * 2 * 2 +((4 + 6 + 3 + 2 + 2) + 3 * (7 * 6 + 9 * 5 + 6 * 4) * 3) * 3 * (5 + 4 + 3 * 9) * (9 + 3 + 2 + 5 * 7 + 5) + (4 * 2 + 6) + 4 +4 + 4 + ((2 * 4 + 9 * 8 * 5 + 8) * 9 * 9 * 6 + 9) + (6 + (5 + 9)) +3 + 8 * (3 + 8 * (3 * 7 * 4 * 2) + (6 * 9 * 8)) +2 + 5 + ((5 + 4) * (2 + 4) * 9 + 6) + 5 * 9 +7 + 7 + 6 +8 + (7 + 8 + 7 + 7 * (8 + 8 + 9 * 2 + 8 + 2) + (3 * 6 + 3 * 2)) +4 * 9 + (4 * (7 + 7 + 7 + 8 + 5 + 2) + 4 * 6 + 2 + 6) +(4 * 9 * 7 + 8 + 3 + 9) + 8 + (5 * 9 + 9 + 3 + 3 + 4) * 9 * 8 +(5 + 5 * 6) * (6 + 8 + 7) + (5 + 2 + 5 * 5 * (3 + 7 + 6 * 9)) + 9 +4 * 2 + (4 + 5 + (3 + 5 + 9) + 7 + 7 + 4) + 3 + (6 * (2 + 2 + 8 * 8) + (8 + 9 * 7 + 7 + 6 * 9) + (3 * 9 * 3 * 5 + 5) * 5) * 3 +7 + 2 + (4 * 3) * 7 + (2 * 3 + 7 * 9) +5 * 9 * 2 * (5 * 2) + 5 +4 + 4 * 6 + (2 + 5 + 6 + 8 * 7) From b438c7f822760d04db28a0da2c57e6f8922dbd99 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 18 Dec 2020 10:09:52 +0100 Subject: [PATCH 134/479] 2020: d18: ex1: add solution --- 2020/d18/ex1/ex1.py | 72 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100755 2020/d18/ex1/ex1.py diff --git a/2020/d18/ex1/ex1.py b/2020/d18/ex1/ex1.py new file mode 100755 index 0000000..a7bd7bd --- /dev/null +++ b/2020/d18/ex1/ex1.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python + +import sys +from typing import Callable, Dict, List + +""" +E : G [ (+|*) G ]* + +G : '(' E ')' | CONSTANT +""" + + +def parse_g(expr: List[str]) -> int: + top = expr.pop(0) + if top == "(": + ans = parse_e(expr) + assert expr.pop(0) == ")" + return ans + return int(top) + + +def parse_e(expr: List[str]) -> int: + ops: Dict[str, Callable[[int, int], int]] = { + "*": lambda lhs, rhs: lhs * rhs, + "+": lambda lhs, rhs: lhs + rhs, + } + lhs = parse_g(expr) + while len(expr) and expr[0] in ["+", "*"]: + op = expr.pop(0) + rhs = parse_g(expr) + lhs = ops[op](lhs, rhs) + return lhs + + +def parse_infix(input: List[str]) -> int: + """ + Parses the given string in infix notation. + """ + ans = parse_e(input) + assert len(input) == 0 + return ans + + +def tokenize(expr: str) -> List[str]: + res = [] + + def split_tok(tok: str) -> None: + if "(" not in tok and ")" not in tok: + res.append(tok) + if "(" in tok: + res.append("(") + split_tok(tok[1:]) + if ")" in tok: + split_tok(tok[:-1]) + res.append(")") + + for tok in expr.split(): + split_tok(tok) + return res + + +def solve(raw: List[str]) -> int: + return sum(parse_infix(tokenize(expr)) for expr in raw) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 8dd7c465de3b3e5aef0f9ec45b1a1c3be85fee8f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 18 Dec 2020 10:10:02 +0100 Subject: [PATCH 135/479] 2020: d18: ex2: add input --- 2020/d18/ex2/input | 377 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 377 insertions(+) create mode 100644 2020/d18/ex2/input diff --git a/2020/d18/ex2/input b/2020/d18/ex2/input new file mode 100644 index 0000000..41690ab --- /dev/null +++ b/2020/d18/ex2/input @@ -0,0 +1,377 @@ +(5 * 7 * 5) * 6 * 5 + 7 + 6 * 4 +(2 + 3 + (2 + 8) * 3 + (7 + 4)) * 3 + 7 +2 + 4 * (2 + 2 * (9 + 2 + 6 + 3 + 6) + 4) +4 * 3 +9 + (8 * 5 * 5 * 4 * (3 * 5) * 2) + 4 + 4 +5 + 5 + 2 * 4 + 4 +7 + 9 * 2 + 2 * 3 +5 + 8 + 5 * (6 * 8 * (9 * 2 + 2 + 7 + 4 + 2) + 4 * 6) * 5 +8 * 7 * 4 * 5 + 3 +(9 * 9 + 9 * 7 * 4) + 9 + 5 * (5 + (8 * 8) * (2 * 8) * (5 + 3 + 5 * 5 + 4 + 2)) + 2 +(4 + 7 + 2) + 9 * 3 + 7 * ((8 * 7) + 5 * (9 * 9) * 8 + (8 * 2)) * 9 +8 * 2 * (2 + 5 + (5 * 4 * 2 + 7 + 3 * 4)) + ((4 + 9) + (4 * 8) + (6 * 8 + 6) + (4 * 3 * 9) + 5) * 7 +7 + 2 + 8 * 2 * (2 * (6 * 2 * 4 * 5) * (4 * 4) + 2 + 3 + 2) + 6 +8 * ((6 + 8 * 3 * 9) + 9 + 8) +7 + ((6 + 3 + 7 + 6 * 7) + 6 * 6) +5 * (7 * 5 + 4 + 7 * 4 * 4) * (7 + 6 * 4 + 4 + (3 + 3 * 7 + 2 + 8)) * 8 +((3 * 7 * 3 * 9) * 2 + (5 * 2 * 6 * 6 * 5 + 6)) * 4 + 6 * 4 + 7 +2 + (7 + 5 + 9 + 9) * 4 +(9 + 6 + 5 * 5 * 5 + 5) * 9 * 2 + (6 * (8 + 4 * 9) * 5 + 7) * 9 * 5 +9 + 2 + (5 * 6 + 7) + 4 + 7 +9 * (2 * 9 * 4 * 4 + 6 * 6) * 8 * 3 * (4 + 7 + 8 * 3 + 4 + 9) * 9 +2 + 4 + 6 * 6 * (3 * 3 + 6 * 4 * 8) * (5 + (9 * 2)) +9 + (6 + 8) + 7 * (8 * (7 + 6 * 4) + 7) * ((6 * 7) + 8 + 2) * 8 +((6 * 3 * 2 + 8 + 4) * 6 + (7 * 7 * 7 + 3)) * (2 * 5 + 2 * 3) + ((2 + 8 * 5 + 4) + 6 + 6 * (3 + 8 * 9)) * 5 * 4 + 2 +(4 + (3 + 9 * 9 + 9 + 2 * 3) + 6 * 2 * 3) + (7 * 7 * 8 + 6 * 5) * 7 + 8 + (7 + 7 + 4) +9 + (5 + 5 * 4 * 4 * 3 * 8) * 6 + 5 + 4 +8 * 2 + 9 + 7 + 6 * (3 * 6 * 7 * 6 * 8) +(7 + 6 * 3 * 3) * 8 + (8 * 2 * 5 + 8 + 2) + 4 +5 + 9 * 5 + 5 * 6 + (7 * 8 * 8 + (2 + 9 * 4)) +((7 * 4 + 2 + 6 + 3) * 4) + 7 + 7 +(7 * 8 + 8 + 3) * 3 * (9 * 5 * 3 * 9) * 5 +6 + (8 + 8 * 7 + 7) + (5 + 7 * 4 * 4 * 5) * 5 * 2 * (5 * 4 * 5) +2 * (5 * (8 + 5 + 8)) * 5 * ((6 + 9 + 6 + 8 + 9) * 4 + 8 + 7 + (5 * 7 * 2 * 3)) +8 + 9 * 7 + ((6 * 4 + 3 * 9 + 9) * (3 + 8 * 5 * 4 + 5 + 5) * 2 + (2 * 2 * 3 * 9)) +2 * 9 + 4 * (2 * (7 + 8 * 2 * 9 + 2 * 6) * 3 * (6 + 3 * 7 * 7 + 4)) +5 * 3 + (8 * 6 + 7 * 8 + (8 + 3)) * 7 + 3 * 2 +((2 * 7 + 7) * 9 * 8 * 7) * 6 * (6 + 2) * 9 +7 * 6 * (3 * (5 * 7 + 5 * 4) * (4 + 6 + 3) + (6 * 7)) * 3 * 8 +(3 * 6) + 7 * 2 * 6 + 7 * 3 +6 * 3 * ((4 + 8 * 7 + 2) * 3) +6 + 9 + (3 * 9 * 5 * 8) * 7 + 8 +8 + 6 + 2 * 2 + ((7 + 4 * 9) + 8 * 4) +6 * 3 * 5 + 7 + 5 +((4 + 5 * 2) + 6 * 7 * 7 * 6) * (7 + 8 * 4 + 9) +(8 * 5 + 8) * (5 + 4 * (5 * 7 * 4 * 8 + 4 * 4) * 9) + (2 * 2 + (8 + 3) * 4) + (4 * 4) +6 * (5 * 4 + (5 + 8 * 7)) * 2 +(2 * 2 * 9 + 9 + 8) * (6 * 6 + 8 * (5 * 4) * (3 + 8) + 2) + 5 + 2 +2 * (3 + (5 + 4 * 4 * 2 + 8) + 8 * 2 + 8 + 5) +3 + 9 * (7 + (2 * 5 * 5 * 4 * 9) * (8 * 3) + 5) * 2 +(2 * (2 * 4 * 7 + 7 + 4)) * 8 * 6 * 7 +(4 * (5 * 2 * 3 * 7) * 5 + (2 * 9) + 6) + (6 + 8 * (4 * 6 * 4) + 2 * 6 * 2) + 6 * 5 + 5 +5 + (7 + 3 + 6 + 9 + 5 + (3 + 9 * 8 + 8 + 7)) * 9 * 9 +3 + 2 + (4 * 6 + (2 * 8 + 6 * 7) + 6) * 9 * 9 +(3 + 2 * (8 + 9 + 8) * 5) * 3 * 3 * ((3 + 9 * 7) + (9 * 8 + 6 * 9 * 9 * 3) * 5 * 7 + 4) + 5 * 4 +7 * 6 + 8 + 2 * (5 + 3 * 5 * 5 * 7 + 8) + 9 +7 + 6 * 6 + (5 + 6) * (8 * 3 + 2 + 9) +6 * (7 + (3 + 8 * 9 + 4 + 7) + 6 * (2 + 8 + 3) * 5) + 9 * (5 + 5 * 2) + 8 + 3 +(6 + 6 * 9 * 3) * 6 * 3 + (5 * 4) +6 * 9 * 8 +7 * 4 * (8 + 7 + 7) * 4 * 7 + 4 +5 + 8 * 5 * 7 + 7 + 5 +2 * ((9 * 3 * 7 + 6 * 6) + (5 * 3 * 2 * 8)) * (8 * 3 + 2 * 6) * 6 * 5 +9 + 5 + 6 * 5 + (9 * 4 * (8 + 2) * 6 + 4 * (2 + 3 + 2 * 2)) + 4 +6 * 4 + (2 + 4 + (6 * 9 * 3 * 8 * 6 + 8)) * 4 + 5 +9 + (3 * 5 * 4 * 9 + 6) * 7 +9 + (8 * 2) * (3 * 7 + (7 * 2) * 8) + 5 * (7 + 9 * 7 + 3) +(5 + 3 + 4 + 8 * 3 * (6 * 5 * 9 * 3)) + 2 * 4 +4 + ((2 * 9 * 2 + 5) * 6 * 5) * (5 + 2) + 7 * 5 + 5 +8 * 3 * (9 * 3 + 5 * (5 * 4 * 3)) +8 * ((3 + 8 + 5) + 6 + 9) + 7 + 4 * 5 +(9 + 9 + 7) + (7 * 2) * (7 * 3 + (5 + 2 * 3) * 9 * 3) + ((2 * 6 + 2 + 7 + 8 * 2) * (2 + 3) + 4) +(9 + 8 * 9 * (7 + 7) + 5 * 7) + 9 + 2 +3 + (8 * 5 + 9) + 2 + 8 + 8 +5 + 2 + (5 * 8 * 3 * 7 * (3 * 7 + 6) * 4) * 3 +((7 * 9 + 3 + 2) * (9 + 9 + 7) + 4 * 4) * 7 +(7 * (3 * 8 + 3) + 4 + 6 * (4 * 7 + 9)) + ((4 * 6 * 6 * 9) * (6 + 3 + 2 * 8 + 5 * 7) + 3 + 2 * 2 + 3) * 2 + (6 + 4 * (6 + 7)) +7 * (6 * 7 + 6) + 2 +4 * (3 * 4) + 9 + 8 + (4 + 5 + 9 * (7 + 9 + 5) + 7 + 2) +7 + 2 * 5 + (4 + (8 + 3 * 3 + 6) * 5 * 7) + 6 + 3 +(4 + (9 + 8 * 7 * 7) * 3 * 6) * 7 + 9 * 7 + 5 +2 + 4 +(2 * (8 + 3 + 8 * 2 + 7 + 3) + 7 + 7 + 6) * 3 * 7 * 7 * 2 +9 + 6 + 2 + (5 + 5 + 2 * 3) + 9 +3 * (6 * 8 + 2 * 8 + 7 * (3 + 3 * 4 + 2 + 7)) * (4 + 4 + 6 * 2 * 4 + 4) * 8 +5 + (5 + 8) + (2 + (7 * 9 * 2 + 8) + 6) + 9 + 3 +9 + 5 + (8 * 4 * 3 + 4) + (6 * 3 * 9) * 3 +(5 * 7 * (7 * 7 * 6) * (8 + 2) + 8 * 7) * 3 + 7 +8 * (6 + 6 * 4 + 9 + 4) * 3 * 6 * 8 + 6 +5 * 5 + 2 * (5 * 2 * 9 + (6 + 7)) * 7 +(5 * 6 * 5 * 3) * 2 + (8 + 6 + 9 * 7 + (2 * 3 + 3 * 8 + 5 + 2)) +8 + 7 * ((6 + 4 + 4 + 8 + 7) + 2 * 5 + 3 * 9 + 6) * (3 * 5 * 5 * 9 * 4) * 3 + ((3 + 4 + 2 * 3 * 2 + 2) + 7) +(8 + (9 * 6 * 3) * (9 + 8 + 3) + 4) * 5 +4 + (4 + 2 + 7 + 9 * 3 * 7) + 9 * (5 + (9 + 9 + 7 + 8 + 8) * 7 + (2 + 2 * 9 + 3)) + 3 +4 + 5 + 5 * (6 * 6 + 3) +(7 * 7 + 6 * 7 * (4 * 2 + 9 + 7)) + 8 +(4 * 7 + 9 * 6) * 6 * 4 + 8 * (6 + 7 * 9) * 2 +7 + (8 + 9) * 6 * 3 + 4 +8 * (7 * (7 * 3 + 3) + 3 * 5 * 9 * 2) * 6 * ((2 + 4 * 5 * 2 + 5 + 3) + 4 + (4 * 2) * 2 * (9 + 5 + 3 + 7) * 5) + (5 + 5 + 3 + (6 + 6 * 2 * 8 + 6)) +6 * 6 +8 + 5 + 5 + (8 + (3 * 5) + 5 * 3) * 2 + 5 +((4 * 7 * 3) * 7 + 2 * (6 + 2) * 8) * 8 +(6 + 3 * 5 * 5 * 6 + 2) * 3 * 7 * 6 +6 + (9 * (4 * 8 * 5 * 3 + 6 * 9) * 4 * (8 + 3 + 3 * 4) * 6 + 4) + 4 * 2 + 9 +((5 + 4 + 6) + 7 * 8 + 7) + 8 + 9 * 8 + 3 +(4 + 2 + 5 + 4 * 7 * 9) * (7 + (2 * 9) * 8) + 3 + 5 +(3 * 6 + 8 * 8 + 2) * 6 + 4 + (7 + 2 + 6 + 2 * 7) +8 + (2 * 9 + (3 + 4 + 3) + 2) +5 + 2 * (5 * 9 * (6 * 8 * 3 + 6) * 8 * 5 + (5 * 4)) + 9 +6 + ((8 * 3 + 5 + 9 * 9) * 3 + 6 * 9) * (5 + (5 * 4 * 8 + 5) * 4 * (3 * 2 + 7 * 7 * 4) + 2 * 2) +9 + 4 * (2 * (6 + 9 + 6 * 8 + 7)) * 9 * 2 +4 + 8 + (8 + 5 * 8 + 7) +8 * (2 + 4 + 5 + 7 * 6) * (4 + 9 * 4 + 7 * 2 * 7) * 6 + 9 + 4 +8 + 3 * 8 * (2 * 5 + 5 + (5 * 2 * 6 + 3) + 6) * 9 +((4 + 5 * 7) * 9 * 8 * 2 + 6) + 9 + 7 +((4 + 3 * 6 * 3 * 4 * 7) + 3 * 5 * 4) + 9 * (8 + 7 * 2 * (2 + 8) + 9 * (2 * 8)) * 5 * 5 * 8 +2 + (5 + 6) * 4 + (9 + 5 * 5 * 7 * 5 + 2) +6 + 6 * (6 * 3 * (2 + 3 + 4 * 3 * 7) * 3 * (4 * 9) * 5) * 9 +7 * 2 * (9 + 8 + 3 * 9 * 4) + 8 +(9 * 8 * 2 + 7 * 2 * 8) * 4 + 9 + (3 + (3 + 3 * 5 + 2) + 9 * 4 * (5 * 3 + 2)) * 6 +7 * 2 * 9 + ((5 * 5 * 8 * 4 + 3 + 7) + 8 + 2 + 3 + 6) * 5 * (8 + (5 + 6 + 7 + 6 + 8 * 6) * 6) +5 + 6 * ((3 * 7 * 2 + 6 * 9) * 6 + 2 * (8 * 5 * 5 + 9 + 8)) * 6 + 4 * 7 +7 + 7 + 9 * 6 * 4 + 3 +4 + (3 * 8 + 8 + 2) * 8 * (9 + 3 + 7) * (4 + 7 + 2 + 5) +9 * 2 + 5 + 6 * 6 + (3 + 9 * 6) +(6 + 3) + 5 + (4 * 6 + 8) * 6 +9 * (6 + 6 * 7 + 6) * 7 * 3 * 5 + 4 +(7 + 8 + 8 * 2 + 5) + 7 + 2 +(5 * 4 + 8) + 9 + (3 + (8 + 2 * 5 * 7) * 9 + 3) * 7 +(2 * 3 + (7 * 4) + 8 * (6 + 4 + 7 * 4 + 5 + 4)) * 7 * 9 * 8 + (3 + 6 + 6 + 9 + 2) +2 * 2 * (3 * (5 + 4 * 4 + 9 + 7) + 5 * 8 * (7 + 2 * 2)) +2 * 5 * 8 + 6 + (2 + 3 * (7 + 4 + 4)) * 6 +3 + 3 + 2 + 8 + (4 + 9 * (5 + 7 * 3 * 8 + 4)) +(6 * 8) * 5 + 5 * 8 +2 * 3 * 9 * (3 * 7 + 6 + 9) + 2 + 6 +5 * 8 * (2 * 3 * 7 + 3) * 7 +2 + (5 * 5 * 8 * 7 + (3 * 9) * (3 + 8 + 3)) * 5 + (6 * 2 * 9 + 3 + (4 + 4 * 7 + 6 * 6 + 8) + 9) + 5 + 9 +(3 * 5 + 7 + 5 + 5 * 7) * (2 + 4 * 4) + 5 * 6 + 9 +4 + 4 + ((9 * 3 + 5 + 4 * 7) + 6 * 6 * 2 + 9 * 2) * 9 * 9 +7 * (4 + 7 + (5 + 5 * 8 + 8 * 3 * 3) + 7 * 7 + 7) +2 + 9 + 2 +((9 * 8 + 4 * 3 + 6 + 6) + (4 * 2) + 2 * 9 + 4) + 6 + 7 + (3 + 8 * 9 * 8) + 2 * 2 +(3 + 6 * (9 * 6) * (2 + 6 + 7 * 4) * 7 * 3) * 9 + 8 +4 + 7 * (2 * 2 + 6) * (2 + 4 + 6 * 5 + 6) +(8 * 7 * 4 + 7 * 5 + 7) + 6 * 2 +2 * 2 + 3 * (4 + (3 + 9 * 3)) * 4 +6 + 5 * 5 + 9 + ((7 + 6 + 2) + (2 * 6 * 2 * 5) * 7 * 4 * 3 * (6 * 4)) + 9 +3 + 2 * ((9 + 2 + 2 + 6 * 9 + 4) + 5) * 8 * 9 +(8 + 4) + 2 + (2 * 2 + 8 * (5 * 6 + 6 * 4 + 9) + 8) + 2 * 8 + 2 +2 * 5 * 7 * 6 * (8 * (2 * 7 * 4 + 6) + 3 + 9 * (8 * 3 + 2) * 8) +4 + 3 + 4 + (6 + (6 + 4 + 7) + 4 + 7) * 6 +8 + 5 + (9 * 6 * 6 + (3 * 9 + 3 + 6 + 9)) +((3 + 6) + 6 * 3 + 3) * 2 + (9 * (8 * 7) + (2 * 9 * 6) * 6 + 2) * 8 + 2 +((7 * 4 + 7 * 4 + 2 + 7) * 3 * (7 * 8 * 4 + 8 + 4 + 4)) * 6 +6 * 4 * (8 + 5 + 2) +(8 + 5) * 2 + 4 + 6 + 3 +((4 * 5 + 7 * 2 * 8 + 9) + 4) + 7 + 3 * 8 +2 + 2 * 3 + 7 * (3 * 6 + 9 + 5 * 7 * 5) +8 * (9 * 8 * 7 + 9 * 6 + 9) + 9 +5 * (4 * 3) * 6 +5 * 6 * 8 * (2 * (4 + 5) * 4) + 3 +4 + 8 * (2 + 6 * 8 * 7 + 9 * 3) + 5 +2 * 3 * 7 * (2 * (7 + 7 + 8) + 8 * 7 + 6 + 2) * 7 + ((4 * 2 * 3) + 9 * 7) +9 + 6 * 6 + (3 + 4 * 3 + 9 + 5 + 3) * 4 +(2 * (4 + 3) * 9) * (2 + 9 * (6 + 6 + 3 * 5 + 2 + 4) * (2 + 5 + 4 + 7) + 2 + (4 + 4 * 8 * 7 * 7)) + (3 * 7 * (3 + 3 + 3 + 2) * (6 * 3 * 8)) * 4 + 4 +(4 + 7) + (3 * (5 * 3 + 5 + 9) * 9 * 3 * 9) +9 + 7 * ((2 + 2 * 8 + 7 + 6 * 5) + (6 * 7) * (3 + 6 + 8 * 5) * (8 * 8) * (3 + 3 * 7 + 4 + 7)) +9 + 9 * (3 * (6 + 7 * 9 * 7 + 3)) + 3 + 6 + 9 +2 + ((3 + 7 * 8 + 9) + (8 + 8 * 9)) + 6 + 7 * 8 +4 * (6 + 8 * 8 + 4 * (3 * 2)) +(5 + 5 * 3 * 3 + 3) * 7 + 7 + 3 +2 * (2 + 6 + 4 * (3 + 4 + 7 * 8 * 9 + 9)) * 9 * 7 +(4 + 6 + 7 + 4) * 7 * ((4 + 9) + 8 + 5 * 7) +8 * 6 + 6 + 7 +(5 + 3 * 2 + (4 * 4 + 5 * 4) + 3) + 7 + 8 + 8 + 7 * 3 +4 + (7 * 5 + 6 * 7 + (2 * 7 * 8) * 3) +7 * ((3 * 3 + 2) + (8 + 6)) * 4 + (7 * 7) * 8 * 7 +((5 * 8) * 6 + 8) * 5 * 7 +3 * 3 + 5 + ((2 * 4 + 3 + 8 + 8) + 2 + (7 * 9 * 6) * 6 * 6) +7 + 7 + 5 + 4 * ((5 + 8 * 8) + (2 * 2 * 2 * 6)) * 6 +(4 + 6 + 7) + 2 + 3 +(8 + 8 + 2 + (4 + 6 * 4 + 9 + 9 + 4) * 6 * 4) + 9 * 4 + (9 * 7 + 5 * (3 * 9 + 4 + 7) + 7 * 4) +8 + (8 + 5) * (8 * (3 + 3 + 5 + 9)) +8 + (4 + (7 + 8 + 4 + 9 + 4) * 7 + (5 * 9 + 2 * 6 + 6) + 4 * (7 + 2)) +(3 * 7 + 8 + 6 * 3) + 5 * 5 + 7 * (9 + 5 + 7 * 8) +(9 + 7 + 2 + 2) + 4 * 4 * 9 +2 + (4 + 4 + (8 * 9 * 2 * 7 * 2) * 8 * 5) * 5 + (4 + (3 + 2) * (3 * 2 * 9 + 9 * 8 + 5) + 2 * (3 * 4 * 7 * 5 * 6 + 7) * 5) +(2 * 6 * 9 * 7) + (4 * (4 + 3) + 9) * 9 +4 * 3 + 5 + (6 * 6 * 3 * 9 * 7) * 7 * 4 +8 * 6 * (2 * 6 * 2 * 7 * (6 + 4)) * 4 + 5 +4 * 9 + 7 * 6 * ((9 + 7 * 5 * 5) + 7 * 9) +3 + (8 + (5 * 2 + 8 * 7 + 6 + 3) + (7 + 9 * 2 + 3) * 6 * 7) +4 * 7 * 4 * (4 * 5 + (7 + 6 * 7 + 8)) + 4 +(8 + 5 * 3) + ((8 * 7 + 6 * 5 + 8 + 9) * 5 + 2 + 7 + 8 * (5 + 7 + 4 + 4)) + 3 * 9 +6 * (7 + 2) + 4 + 7 * 2 * 5 +(2 * 9 * 9 * (3 * 4)) * 7 * 4 + 2 + 4 +(8 + (9 * 2 * 8) + (5 * 9 * 5) + (5 * 6 * 3 + 8 * 2 + 6) * 5 * 5) * 6 + 8 + 3 * 3 * 2 +2 * 5 * 7 * 4 +(2 * 8) * (2 + (4 + 2 * 5 + 2) * (2 + 7 + 6) + 5 + 5 + 7) * 4 + 8 * 7 +(8 * 5 + 4) * 5 +(9 * 6 + 8 * (3 * 8) + 5) + (8 * (3 * 9 + 7 * 3) + 9 + 2 + (4 + 5 * 7 + 6 * 9)) * 6 * 8 +5 * 4 + 3 +(8 + 7 * 9 + 5 * 5) + 9 + 3 * (6 + 6 + 5) +(3 * 7 + 2 * 4 + 4) + 8 * 6 + 3 * 5 +((4 + 8 + 8 * 7) + 9 * 7 + 8 + (8 + 3 + 2) * 3) * 2 + (6 * 7) + 8 +(7 + (3 * 5 * 7 * 6) * 7 + (8 * 3 + 9 + 8 * 9 + 8) + 8) + 9 +((6 * 7 * 7 + 4) * 8 + 6 + 4 + 9) + 7 + 4 + 2 + 5 + 5 +4 * (2 * 2) + 2 + 3 * 3 + (4 + 2 + 2) +((4 * 8 + 8 + 9 + 3 + 3) * 9 * 9 + 7 * (6 * 5 * 3 + 3 + 3)) + (9 * 5 * 2) + (2 + 7 + 6) * 3 * 6 +(4 * 5 * (8 * 7 + 8 + 4 + 3 * 9) * 3 + 7 * (3 + 4 + 3)) + 3 + 6 * ((6 + 2 * 8) * 9) + 2 + 4 +7 * 3 + 8 + (8 + 2 * 9 * 2 * (7 + 4 + 7 + 7 * 7 * 8)) * ((4 * 6 + 7 + 4 + 6) + 5 + 3 + 6 * 6 * (6 + 2 * 9 + 6 * 7 + 3)) * 5 +(7 * 8 + 2 * (5 * 7) + 7 * 4) * 8 + 2 * 3 +4 + (8 * 3 + 9 * 9 * 3) + 7 + 7 + (3 * 4) +(4 * (5 + 9)) * 9 + 5 + 7 +6 * 2 * 9 + 4 + 6 * 2 +(7 + 3) * ((3 * 7) + 8 + (8 + 6 * 2 * 8 * 6 + 2)) * (7 + 9) +9 * 4 * 3 + 7 * 6 + (3 + 8) +4 * ((2 * 6 + 3 * 4) + 3 * 4) * 7 + 8 +(8 + 7 * (4 * 8) * 6) + 7 + 4 * 4 * ((8 * 9 * 7 * 9 + 7 + 3) + 6 + 8) +5 * (9 + 3 * 4 * (2 * 9 * 4 * 2 + 3) * 8) +4 * 9 * 8 * 7 + (6 * 9) +(4 + 4 + 3 + 5) + 9 * 4 +9 + (4 + 7 + 6 + 4 * (8 * 9 * 7 * 3 * 2 * 6)) + 3 * 6 +5 + 6 + (6 * 5) + 8 + 7 +(9 + 4 * 8 * (8 * 7 * 2 + 4) * (5 * 4 + 9)) + 6 + 5 +5 * 2 + 9 + ((3 + 2 * 9 + 3) * 5 * 9 + 2 + 3) * 8 + 5 +(6 + 8 + (3 + 8 + 4 * 4) + 6 * 9 * 3) * 7 + 3 + (5 * 9 + 2 + 7 + 6 * 8) + 5 + (3 + 2 + 2 + (3 + 4 + 2)) +9 * 3 + 7 + 6 * 7 + 3 +(2 * 4 * 3 * 7 + 5) + 6 + (2 + 7 + 4 + 3 * 4) + ((7 * 2 + 7 + 6 * 8) + 6 * 2 * 5) +((2 * 4) + 3 + 6 + 6 * (7 * 4 * 6 * 5)) * 3 * 6 + (9 * 5 + 8) +(4 * 3 * 4 * 4) + 5 + 8 + ((8 + 6 + 8 * 9 + 7 * 5) * (6 * 2 * 3 * 6 * 8) * 3) + 8 +(3 * 8 * (8 + 4 * 2 * 9)) + 4 +3 + 7 * 7 + 3 + 9 +((4 * 7 * 2) * 2) + 2 + 9 * 3 * (9 * 3 + (8 * 5 * 9 * 9) * 6) +9 * 6 * 4 + 5 + (6 + 5 * 4 * (8 + 9)) +2 * (2 * (6 + 2 * 2 + 9 + 6) + (8 + 8 + 7) + (6 + 8 + 7)) * 2 + 5 +5 * 8 * 2 + (7 * 7) + 7 + 6 +6 + (5 * 9 * 7) * 3 * 7 +3 + 9 * (4 + (5 * 8 + 4 + 4 + 5)) +4 * 7 * (8 * 2 + (3 * 8 + 9 + 2 + 6 + 6)) +(9 + 3) * 6 * 9 * 2 * 8 + (7 * 8) +(8 * 2 + (5 * 8 + 6 * 9 * 8 * 3)) + 9 * ((9 + 6 + 3) * 6 * 4 * 4 * 5) + 8 +3 + 3 * (3 * 6 + 8 + (8 * 7) + 5) + 7 +5 * 3 * 2 * 3 * (4 + 9 + 8 * 9) +(8 * (9 + 5 * 8) + (6 * 8) + 2 + (8 + 3 + 4 * 5 * 3) + 4) * (4 * 4 * 9 + 9 * 6) + 6 + 3 +2 + (5 + 8 * (5 + 4 * 7 * 4) + 4 * 7 + 5) +5 + ((6 * 9 + 5 + 5) + 2 * (4 + 4 + 2 * 6 + 3 + 9)) * ((3 * 5 * 2 * 8 * 5) + 2 * (4 + 9 + 5 * 9 * 8) + (2 + 6 * 6 * 5 + 3 + 9)) * (2 + 9 * 9) + 2 * 6 +5 + 2 * ((7 + 4) * 3 * 6) + 7 +4 + 3 * 6 * 8 +(8 + 7) * 5 + (2 + 5 + 3 + 4 * (3 + 7) + 3) +(2 * 2 * 7) + 2 * ((4 * 5 * 2) * 5 + 9 * (7 * 4 + 2 * 2 * 9) * 9) + 9 +3 + 6 * (7 * 7 * 2) + 6 +6 + (2 * 7) * 4 * ((3 * 2 * 4) + 3) + (7 + 2 * 7 * (5 * 2 * 3 * 3 + 8) + 7 + 7) * 8 +(5 * 3 + (8 * 8 * 5 + 3 + 2) + 6) * 5 * ((5 + 2) * (9 * 7 * 2 * 3 * 6) * 6 * (9 * 5 * 5 + 3 + 9) + (9 + 3 * 5)) +9 * 4 * 7 * 3 + (5 + 2 * 6 + 9) + (2 * 4) +(4 * (9 + 3 * 7 + 7 * 5) + 2) + 6 * 4 +8 + 5 * 6 * 2 * 2 + (8 * 4 + 6 * 9 + 2 * 5) +4 + (9 * 4) * 5 + (2 * 8 * 7) +7 * (3 + (4 * 3 + 8 * 3 * 3) * 5 * 4) +9 + 7 + (3 * 3 * (7 * 4) + (9 * 4 + 3 * 6 + 6 * 7) + 9) * 2 + 5 +8 + 6 * 9 * 4 +8 + 3 * (9 + (3 * 7 + 3 + 9 + 3) * 9) * 4 + 8 +4 + ((6 * 4 + 4 * 2 * 6 * 5) + 2 * 2) + (4 + 5 + 8 * 5 * 5) * 3 * 5 * 7 +(9 + 8 + 6 * 5 * 5) * 4 + (8 * 3 * 5) * (9 + (3 + 9 + 5 * 3 * 6 + 6) * 7 + (8 * 8 + 8) * 2 + 4) +(8 * 6 * 2 + 5) * 9 + 6 * 2 * 5 +2 * 5 * 3 + 7 + 6 * 6 +(3 * (4 * 9 + 6 * 2) * 8 + 8) + 7 * 5 + 9 + 2 * 2 +8 + (8 * 4 + 6 * (7 * 7 + 3 * 4 * 7 + 2)) +3 + (7 * (4 * 8 * 8 + 3 * 9) + 2 * 9) + 6 +8 * (6 * 9) * 7 + (9 + 2 * 9 * 7) * (3 + 7) +((6 + 7 + 4 + 8) * 5 * 7 + 3 + (8 * 2 * 5 + 9)) + 5 * 2 * 9 * 4 +3 * (7 * 7 + 6) * 3 * (5 * (7 * 2 + 6 * 9 + 9) + 3 + 6 * 9 * (2 * 3 * 6 * 9)) * 6 * 5 +(2 * (9 + 4 + 4 + 5 + 5) * (6 * 7 * 4 * 9) * (9 + 4 + 8 * 4) * 3) * (9 + 3 + 3 * 3 * 4 * 2) * 5 + 2 + 5 + 3 +(7 * 8) + (8 * (3 * 8 + 4)) + 3 * 7 * 7 * 6 +2 * 6 * (6 * 3 * (2 + 8 * 5 * 3 + 3 + 4)) * 5 + (9 + 9 + 2 + 3 * 3) +5 + 7 + 4 * 2 +4 * 3 + 7 + 9 + (5 * 2 + (5 * 6) + 3 + 4) + 6 +8 * 4 * (9 + 3 + (7 * 8 + 7 * 6 + 4 * 3)) * (6 + 9 + 9 * (3 * 7 * 9 + 2 + 2 + 2) * 6 + 4) + 8 +(5 + 9 + (8 + 7 + 6) + 8) + 6 + 2 +2 * (9 + 3 + 4 + (5 + 5 + 2 * 2 + 3 + 8) + 9) * 6 * 7 * 2 +5 * (6 * 7 + 2) * 9 + 7 + 4 + 3 +9 + ((4 * 4 + 3 + 8 * 6 * 7) * (8 * 4 + 9 * 4 + 8) + 6 + (9 * 3 + 5 + 7 + 9 + 3)) +6 * (3 + 8 * (5 * 7 + 5 + 8)) * 5 * 4 + 8 * 3 +7 * (3 * (7 * 4 * 8) + 4 + 3 * (2 * 3)) * 4 + (7 + 6) * 9 +(3 + (5 + 4 + 3 * 3 * 2 + 9) + 7 + 2) + 6 +3 * (5 + (3 + 3 + 4 * 5 * 8 * 9) + 9) +4 * (6 + 4) + (8 * 4 * (8 + 8 * 7 * 8 * 4) * 8) * 7 +(9 * (4 * 5 + 9 * 6 * 7 + 4) + 4 * 3) * 5 + 7 + 7 + 9 +5 * (7 * 8 * 8) + 4 + 9 + (4 * (3 * 5 * 6 * 7) + 4 * 8 * 4 * 3) + 2 +4 * 6 + 8 * ((3 + 4 * 3) + 6 + 3 + 2 * 5) +6 * (2 + 4 * (7 * 4 * 4 + 4 + 6) * 4) + ((9 + 7 * 6 * 7) * 8) * 7 * 3 * 9 +3 + (3 + 2 * 7 * 6) * (5 * 2 + 2 * 2) * 2 * (5 * 2 + 3) + 8 +6 * 2 * (8 * 9) +7 * 4 + 9 * (9 * 2) +(2 * 6) + (6 + 7 + 5 + 8 + 4) +6 + (9 * 5 * 6 + 5 + 6 * 6) +(5 + 9) + 2 + (5 * 7) +7 * 7 + 4 + (4 * 3) * 8 * (4 * (3 * 3 + 6)) +7 * (8 + 5 + (3 + 7)) * (4 + 4 + 8 + (7 * 7 * 6 + 9)) + 6 * 8 + 8 +4 + (8 + (5 + 2 * 7 + 6 * 7 * 6) + 5 * 9) +8 + (6 + 3 * 7 * 8 + 8 * 7) + 8 + 5 + 8 * 9 +7 * (7 * (3 + 3) * 6 + 9 * 7 + (2 + 3 + 6 * 8 * 6)) + 3 * (7 * 9) +(5 * (4 + 6) * 4 * 8 + 6 * 3) + 6 + 2 + (8 * 5 + 9 * 3 + (5 + 7 * 5 + 7) + 3) +(2 * 7 + 3) + 9 * 8 * 7 +(4 * 3 + 9 * 5 + 4 + 4) * 9 + (3 * 9 * 7 * 4) * (3 + 5 * 4 + 6 + 5) + ((7 + 6 * 7 * 4 + 5) + 2 * 7 + 8) + 8 +(7 * 4 * 4 + 7) + (6 * 9 * 7) + 5 + (3 + 5 * 9 * 4 * 9 * 2) + 4 * 7 +(4 + 2 * 2 * 8 + 5 * 3) + 4 * 5 * 3 * (4 * (2 * 3 + 2 * 8 + 2) + 4 * 9 * (6 + 3 * 7 * 3) * 5) + (7 * 8 * 9 + 3 * 9 * 4) +8 + (3 + 3 + 2) +6 * (3 * 6 * (3 + 5 + 8 + 5 + 5)) +(9 + 7 * 9 + (3 * 4 * 2 * 2 * 7) + 5 + 9) + 7 + (9 * (8 * 9) * 9) + 3 +(9 * 6 * 8 * 2) + (6 + (9 * 5 + 6 * 5 + 5 + 5) * (6 + 7 * 8 * 4 + 4 + 6) + 9) + 9 * 7 * 4 +4 + (3 * (3 + 4)) * 8 + 4 + 2 +((9 * 2 * 5 * 3 + 9 + 3) * (7 * 6 * 9 * 8 * 2) * 8 + 4) * 6 + 8 * 6 + 9 + (4 * 3 + 2 * 9) +(8 + 5 + (6 * 7 * 2 * 4 * 8)) * (9 + 8 + (4 + 8 * 2 + 8 * 4) * 9 * 8 * 9) + 7 + 9 + 7 +(5 + 2 + 3 * 5) * ((9 * 8) * 8 * 2 * 6 + (9 * 4 * 7)) + (5 + 3 * (5 + 7 + 6 * 4 + 8 + 5)) + (7 + 6 * 2 + 2 * 6 * 7) + 2 +7 * 2 + 7 + 8 + (9 * 9 + 8 * 6 + 7 * 7) * (7 + 3 + 5 * 4) +5 * (5 + 2 + 6) * 2 + (7 * 5 + 4 + (8 * 9 + 8 * 9 + 8) + 3) +4 + (3 + (4 * 4) + 8 + 8 * 9 + 7) * (4 * 4 * 2) + 8 * 5 +6 + 4 + ((5 + 7) + (8 + 9 * 3 + 5 * 9)) + (4 + 8 + 7 * 6) * 5 +3 + ((6 + 2 + 6) * 9 + 8 + (5 + 5) * 6 * (8 + 6 + 7 + 7 + 9 * 9)) + 9 +8 * 8 +(3 + 7) * 2 + 2 +2 * ((4 * 9 + 9 + 5 * 7 * 9) + 8 * 3 + 7 * 7) + ((3 * 4 + 4 + 6 * 9 + 8) * (7 * 2 * 9 + 8 + 5) * 9 * (9 * 3 * 3) + 6) +(4 + 6 * 5 * 7 * 7 + 6) + 9 + 8 + 8 * 3 * 8 +7 * 6 * (3 + 5 + 6 + 4 + 5 + (2 + 2 + 7)) + 6 + 3 * (4 * (3 + 4) * 9 + 3 * (7 * 4 + 3 + 6)) +9 * 5 * 7 + (5 + 2 * 4 * 4 + 9 + 6) +(6 + 2 * 8 * 6 + (5 + 9) + 3) * 5 + 6 + 4 +6 + 8 + 5 +6 + (8 + (6 * 3 * 5) + 4 + 5 * (5 * 6 * 2) + 8) + 3 + 9 * 8 + 6 +3 + (2 + 9 + 2 * (8 + 2 * 3 * 6 * 9) * 2) * 4 +7 + 4 + (8 + 7 * (3 * 2 * 7 + 2 + 3 * 8)) + 9 * ((5 + 5) + 2) +2 + (2 * 5 + 5 + 9 + 4) * 2 + 8 + 8 +(2 + 4) + ((9 + 4) * 3 + 7 * 6) + 9 * 6 +(9 * (7 + 5 + 8 + 8) + 8 + 5) + ((5 + 9 + 4 * 7 * 5) * 4 + 6 + 9 * 9) +4 + 8 + ((6 + 2 + 2 * 6 * 2) + 7) * 7 + (3 + 8 + 4 + 2) +((4 * 2 * 9 + 5 * 9) * 7) * 9 * (7 * 8 * 6 + 8 * 6 * 8) +(4 * (8 * 5 * 5)) + 5 + 6 * 2 + (2 + 9 + 7 + 6) * 5 +(6 + 2) + 5 +2 * (3 * 4) * 4 + 6 +2 * 8 * (6 * (7 * 4 * 9) + (2 + 2) * 2 * (6 * 2 + 9)) * (7 * (2 * 5 + 3 * 8 * 4) * (3 + 7) + 6 + 2 * 5) +3 * 7 + (4 * 3 + 5 + 9 + 2) +6 * 5 * 3 + 3 * 7 * ((3 * 4 * 3 + 8 + 6) * 4) +(6 * 6 + 4 + 5 * 5) * 7 +((6 + 8 + 4 + 5 + 9) * 3 + 4 * 5 + 4) * 5 + 9 + 9 * 9 +(9 + 4 * 5 * 5 + (3 * 3 + 5)) * 5 * 4 * 9 + (4 + 5 * 9) +2 + (9 + 5) +8 * (8 + 3 * 9 + 7) +(9 + (4 + 2 * 4 * 6 + 7 * 2)) + 5 * (5 * (3 * 7 + 3 * 8 * 8 * 8) * 9) +3 * ((4 + 3 * 8 + 5) * 9) * (6 * 5 + (2 + 5 + 4 + 3 + 8 + 2)) +6 + (3 * 3 * 5 + 9 * 8 + 8) * 7 + 9 +(5 * 8) * 2 * ((3 * 5 + 6 * 9 * 3 * 8) + 8 + 4 + 2 + 2) +(6 + 4 * 6 * 6) * (3 * 6) * 8 +((7 * 8 + 6 * 8 + 2) + 5 * 6) + 5 * 7 * 6 + 6 +4 + 8 * 9 * (2 * 5 * 8 + 9 * (5 * 8 + 9 * 4 + 6 + 4)) + 2 +9 * (7 * 7 * 7 * 8 * 5) + 8 + 4 +4 * 9 +(9 * (7 * 7 * 7 * 9)) + 6 * 7 + 4 * 8 +7 + (5 * 9 + (9 + 8 + 5)) + 4 * 7 + 8 * 5 +6 * 2 + (7 * 9) * 6 +(5 * 4) * (4 + 8) +9 * 4 + 6 * 5 * 6 + ((8 + 9 + 8) * 8 + 6 + (4 * 2 * 2 + 3 * 6)) +7 + (7 * 2 * 4 + 2 * 5 * 4) * 7 * (9 * 4 * 2 * 7 + 9) + 8 +(6 + 2) + (5 * 8 + 8 + 4) +(8 + (8 + 8 + 3) * 6 + (6 * 9 * 4 + 7) + 2) + 8 * 8 + 4 + ((7 + 4 + 5 + 8 + 9) + 6 + 7 + 9 + 6) + 3 +((7 + 6 + 3) * 4 + 2 + 5 + 8) * 4 * 2 * 2 +((4 + 6 + 3 + 2 + 2) + 3 * (7 * 6 + 9 * 5 + 6 * 4) * 3) * 3 * (5 + 4 + 3 * 9) * (9 + 3 + 2 + 5 * 7 + 5) + (4 * 2 + 6) + 4 +4 + 4 + ((2 * 4 + 9 * 8 * 5 + 8) * 9 * 9 * 6 + 9) + (6 + (5 + 9)) +3 + 8 * (3 + 8 * (3 * 7 * 4 * 2) + (6 * 9 * 8)) +2 + 5 + ((5 + 4) * (2 + 4) * 9 + 6) + 5 * 9 +7 + 7 + 6 +8 + (7 + 8 + 7 + 7 * (8 + 8 + 9 * 2 + 8 + 2) + (3 * 6 + 3 * 2)) +4 * 9 + (4 * (7 + 7 + 7 + 8 + 5 + 2) + 4 * 6 + 2 + 6) +(4 * 9 * 7 + 8 + 3 + 9) + 8 + (5 * 9 + 9 + 3 + 3 + 4) * 9 * 8 +(5 + 5 * 6) * (6 + 8 + 7) + (5 + 2 + 5 * 5 * (3 + 7 + 6 * 9)) + 9 +4 * 2 + (4 + 5 + (3 + 5 + 9) + 7 + 7 + 4) + 3 + (6 * (2 + 2 + 8 * 8) + (8 + 9 * 7 + 7 + 6 * 9) + (3 * 9 * 3 * 5 + 5) * 5) * 3 +7 + 2 + (4 * 3) * 7 + (2 * 3 + 7 * 9) +5 * 9 * 2 * (5 * 2) + 5 +4 + 4 * 6 + (2 + 5 + 6 + 8 * 7) From 874ab7acad1c3f88d3117ae2713ea66d758289a1 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 18 Dec 2020 10:10:08 +0100 Subject: [PATCH 136/479] 2020: d18: ex2: add solution --- 2020/d18/ex2/ex2.py | 79 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 2020/d18/ex2/ex2.py diff --git a/2020/d18/ex2/ex2.py b/2020/d18/ex2/ex2.py new file mode 100755 index 0000000..a83161c --- /dev/null +++ b/2020/d18/ex2/ex2.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python + +import sys +from typing import List + +""" +E : T [ * T ]* + +T : G [ + G ]* + +G : '(' E ')' | CONSTANT +""" + + +def parse_g(expr: List[str]) -> int: + top = expr.pop(0) + if top == "(": + ans = parse_e(expr) + assert expr.pop(0) == ")" + return ans + return int(top) + + +def parse_t(expr: List[str]) -> int: + lhs = parse_g(expr) + while len(expr) and expr[0] == "+": + expr.pop(0) + rhs = parse_g(expr) + lhs += rhs + return lhs + + +def parse_e(expr: List[str]) -> int: + lhs = parse_t(expr) + while len(expr) and expr[0] == "*": + expr.pop(0) + rhs = parse_t(expr) + lhs *= rhs + return lhs + + +def parse_infix(input: List[str]) -> int: + """ + Parses the given string in infix notation. + """ + ans = parse_e(input) + assert len(input) == 0 + return ans + + +def tokenize(expr: str) -> List[str]: + res = [] + + def split_tok(tok: str) -> None: + if "(" not in tok and ")" not in tok: + res.append(tok) + if "(" in tok: + res.append("(") + split_tok(tok[1:]) + if ")" in tok: + split_tok(tok[:-1]) + res.append(")") + + for tok in expr.split(): + split_tok(tok) + return res + + +def solve(raw: List[str]) -> int: + return sum(parse_infix(tokenize(expr)) for expr in raw) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 3b049944e2b15285267c9ba9b316fb6e3f87de14 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 19 Dec 2020 11:00:25 +0100 Subject: [PATCH 137/479] 2020: d19: ex1: add input --- 2020/d19/ex1/input | 561 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 561 insertions(+) create mode 100644 2020/d19/ex1/input diff --git a/2020/d19/ex1/input b/2020/d19/ex1/input new file mode 100644 index 0000000..6242e89 --- /dev/null +++ b/2020/d19/ex1/input @@ -0,0 +1,561 @@ +102: 100 47 | 76 84 +23: 60 47 | 73 84 +132: 17 47 | 81 84 +108: 55 100 +18: 116 47 | 26 84 +103: 84 115 | 47 81 +65: 84 113 | 47 50 +128: 107 47 | 125 84 +14: 84 100 | 47 107 +118: 47 17 | 84 57 +2: 47 100 | 84 40 +28: 63 84 | 74 47 +22: 102 84 | 123 47 +123: 84 74 +19: 3 47 | 13 84 +24: 74 47 | 81 84 +115: 55 55 +90: 92 47 | 44 84 +48: 84 94 | 47 96 +109: 17 84 | 100 47 +92: 84 75 | 47 108 +66: 38 47 | 125 84 +83: 66 47 | 108 84 +31: 121 84 | 77 47 +29: 47 61 | 84 111 +45: 47 47 | 47 84 +59: 47 49 | 84 43 +37: 47 30 | 84 95 +36: 107 84 | 125 47 +82: 74 84 | 38 47 +61: 84 10 | 47 110 +79: 47 28 | 84 109 +33: 101 47 | 133 84 +12: 45 47 | 63 84 +91: 122 84 | 93 47 +122: 65 47 | 52 84 +21: 57 84 | 115 47 +8: 42 +67: 102 47 | 64 84 +39: 113 84 | 81 47 +41: 84 124 | 47 10 +50: 47 47 | 84 84 +17: 47 84 | 84 84 +120: 98 84 | 78 47 +113: 55 47 | 47 84 +20: 84 128 | 47 104 +7: 84 1 | 47 20 +51: 84 113 | 47 81 +56: 84 83 | 47 69 +131: 84 127 | 47 97 +0: 8 11 +5: 47 63 | 84 125 +94: 15 84 | 127 47 +121: 99 47 | 27 84 +119: 47 115 | 84 57 +129: 47 80 | 84 131 +15: 47 100 | 84 45 +35: 84 50 | 47 76 +95: 47 115 | 84 107 +68: 127 84 | 51 47 +124: 84 107 +75: 50 55 +57: 47 84 | 84 55 +13: 47 33 | 84 129 +53: 106 47 | 59 84 +106: 16 84 | 118 47 +89: 84 125 | 47 45 +104: 45 84 | 76 47 +99: 47 56 | 84 7 +78: 84 74 | 47 81 +64: 17 47 | 115 84 +32: 50 84 | 40 47 +1: 47 24 | 84 72 +47: "a" +80: 114 47 | 109 84 +88: 47 119 | 84 132 +105: 47 125 | 84 100 +6: 68 84 | 67 47 +110: 76 84 | 63 47 +38: 84 84 | 84 47 +49: 47 63 | 84 76 +26: 55 107 +81: 47 84 +74: 84 47 +96: 84 89 | 47 117 +77: 47 86 | 84 71 +135: 32 84 | 2 47 +133: 47 15 | 84 128 +42: 19 84 | 62 47 +30: 47 100 | 84 74 +27: 6 47 | 91 84 +63: 84 55 | 47 47 +62: 84 87 | 47 23 +76: 84 84 +4: 84 135 | 47 54 +60: 41 47 | 37 84 +100: 47 47 | 84 47 +85: 47 112 | 84 18 +116: 125 84 | 63 47 +134: 57 47 | 115 84 +34: 52 47 | 25 84 +40: 47 47 +111: 58 84 | 126 47 +3: 29 47 | 130 84 +114: 17 84 | 107 47 +52: 47 45 | 84 74 +10: 47 100 | 84 81 +98: 47 76 | 84 100 +112: 84 82 | 47 103 +72: 40 47 | 45 84 +126: 50 84 | 113 47 +107: 84 47 | 47 84 +11: 42 31 +55: 84 | 47 +54: 12 84 | 5 47 +130: 34 47 | 70 84 +84: "b" +127: 81 47 | 17 84 +87: 84 53 | 47 9 +101: 105 84 | 14 47 +9: 88 84 | 120 47 +73: 47 79 | 84 22 +97: 74 84 | 50 47 +117: 74 47 +70: 47 134 | 84 46 +58: 47 50 | 84 115 +125: 47 47 | 55 84 +46: 47 81 | 84 17 +86: 84 90 | 47 85 +25: 38 84 | 63 47 +69: 39 47 | 78 84 +43: 47 100 | 84 125 +93: 84 66 | 47 35 +44: 47 21 | 84 36 +16: 57 47 | 107 84 +71: 48 84 | 4 47 + +babaaabbbababababbbbabbaabbaabaa +babaaaabaaaaababbbbaaaaa +abbabaabbaaabababaabbbbabbbbbaabbbbabababaaaabbbbababbbb +bbbabababbabbbabbbabbbbb +babaabbbababbbabaabaaaaa +abbabaabbaababbabababbbababbbabbabbabbbabbaabbbb +aaaaabaabbbbbaabbbbbbbbbbaaabbaaabbaabab +baababbabbbabbaaaaaababbaabbababbbabbbbb +aaabaaaabbabbbabbabaabbbabaabbbbaaaaabaaaabaabaaababaabbabbaaaabbbbaabbabbabaaaaaaaabaab +ababaaabababbbababaaabab +bbbbabbbbbaabaaaaaabbbbbbabbbabaabbaaababbbaaaaababaabaabaabababbabbbabbabaaabbaaabbaaaa +babaabaaababaaabaaaababa +aabaaabbaabbbabbabaabaab +bbbaabaaaabaaabbbaaabbbabbbaaabb +aaaaaaabaaababbbbbbbbbbbbaaabaabbaaabbab +bbabbabbaaaaabababaababa +babbababbbabbaababaababbaaaaabaaabbbabba +bbbbbbbababbaaaaabaaabbaabbaaaab +bbbbbaaabbbbbaaaaaabaaaabbbaaabb +babbababaababbbbbbbaaabb +abaabbaabbababaabbababba +abaaabbaaabaabbbabababba +babaaaabaaaababbabbbbaaa +bbbbbbbabaababbaaaaababbabbaabbabbbaabaababaabbbbbbaabab +aaabbabbbaabababbaabaaba +bbbababbabaabbabbbabaaaa +baabbabababaaaabbbbbbaab +bbabbbbabaababbabbbaabab +abaabbabbbabbabbabbbabba +bbbbbbbaaababaaabbaabbbabbaaabbbbabababb +aabbaaabbabbabaaaabbabaababbbaababaabababaaabbaa +aaabaababbbabbbbaaababbbbaaabbbb +aaaaaaaaaaabaaaababbabbb +bbbabbbbaabaababaabbabab +baaabaabbaaaabbbbaaaaaaa +bbbbbbbaabbabbaabaabaaaa +aaaaabaabbabbaaaaaaaaabb +aabaaabbaabbabaaabbabaabbaababaaabbbaaaaababbaabaaabbaaabbaaabaa +bababbbaaabaababbbababaabbaabaabbaaaabbabbaabababbbabbbababbabbb +abbbaababbaabaaaaababbbaaaabbbaa +aababbbaaaabaabbbbabaaaa +aaaaabbaaabaaabbbababaaa +bbbababaaabaaaabbabbabaabbababababababbbabbaaaaabbababbabbbbabbbabbbaabb +bbbabababbbabababababbbb +bbaaababbbabbbbaabbbbbaa +bbababaabaaaabbaabbbbaaa +bbbbabbababbbbaabbaaaababbababbaabaaabababbabbabbbbbbaababbbbabbbbaaaaabbbaabbba +abbabbabbbbbbaabaaaaabababaaaaabaaabbaaaabababba +bbbabaabaababaaabaabbaaa +bbababbbbaaababaaaabbabbaaabbbaa +aabbbbababaabbaabababbaa +aaabbabbbaabbbabbbbbbbbabaaaabbaaabababaabaaabab +aaaaaaababbabbabbabaaaaa +aababaaaaaababbbabbabbabaaababbbbbabbababababaaaabbabbbb +babaabbbbaaabaaabbbabbab +bbbbabbbbaabbbabbbaabbbaabbbbbaabbbbaaabbbbaabbbbaababbaaaabaaaabbabbabbabbaabbb +aaabbbabbaaabaabbaaaaabaabababab +abbababbabbbbbabbaabbbabaaababbbbbbbabaababbbbbabababbbb +bbaabbbaaaaababaaabaaaabbbbbbaabbaaaabbaabaaabaabaaaabbabbabbbaabbaaaaaa +abbabbaaaabaaaabbbbbbaabbabaababbbbabbba +bbaaaabaabbababbbbaabbaa +aabbaabaabbaaabbaaabaaaaaaababbabababbaa +baaaabbaaaaaabbbbabbababbaabbbbabbabbabbaabbaabb +babbaaaabbaabaaabbbbaaaabbbabbaaaaaaaabb +aaaaababaaabbabbababbabb +abbabaaaaaabaababbabaaab +aaabaababbaabbbaababbabb +babbabaabaababbabbabaabb +abbabbaabbabbbabababaaaa +bbabbbaaaababaaaaaabbbaa +bbbbbbbaaaaaabbabbbaabaaaaabbaaa +bbbaabaababaaabbaababbabaababaabbbababba +bbaaabbaabaabbbbbbbaababbbaabaabaaabaababaaaaabbbaaabaababaaaaabaabbbbaabaabbbaa +baabbababbaaaaababaabbabaabbbaabaabbaabbabbbaaababbaaaab +bbabaaaaaaaabababaabbababbaabbbbabbbaaababbaababaabaaaaaaaabaabb +baaaaaabbaababbaababaaaa +bbbabbbbbbaabaabbaaabbab +babbbabababaaaabaabbaaabbbabaabababbbaaabaababbbbbaababbbabbbabb +aabaaababababababaabbbababbababbbabbaabb +bbaabaaabbaabababbaababaabbabbba +bbbabaaaababaabbaabbabbbbabbaabaabbabaabbaabaabaabbaabbabaaabaaa +abbaaabbbbbbbbbbaaabbaab +baabbbbbaabbaabbaabbababbaabaaba +baaaabaaabbbbaabaabbabbbbaababbb +abbbbbbaabbbbbbbbbbbbaaaaaaabaaa +abbbbbbbbbabbbaabbbaaabaaabababa +aababbbaabbabaabbabaaaba +bbabbaabbabbabaaababbbba +aaabbbabbaabaabbbbbabbbbaaaaabbbbabbbabababbbaaa +aaabaabbaabaababaabababb +bbababaaabbbaabaabbababa +baabbbaaaaababababaabbaababbabbb +babbbaabbaaaabbaababbabb +bbababbbababbbaabbabbbabaabababaaabaaaaa +babbbbbbbbabbbababbbbaab +abaabbbbbabbbbbbaaabbaba +bbabbbaabbbbbaaabbbaaaaa +abbbbbbbbaabbbaaabbbbbbabaaaabaaaaaabbbb +aabaaabababbbbbbaaabbaab +bbbabababbbbbbabbbbbaabaabababbaaabbbbbb +aababbbaaaaaaaaaabbaaaaa +ababaababaababbbabbbbabaaabbabaaabbabbaabbaaaaaababaabba +aabbaaabaabbbaabaabaabbbaaabaaab +aabbaaabaaaaabaaaaabbbabaaabaaaababaaaaaabbbbbaaaababbaa +babbbaabaabaaabababbabaababbbaabbabaabbaabababbababaaaaa +aabbbbabababbbaaaaabaabbbaabbabaaaabababaabaaaabaaaababaabbbabbaabaaabbb +bbbbbbababbbabaababbabaabababababaababbabbbbbbbabbaaabbb +bbabababaaababbabbababba +abbbbbbabbbbbbaaabbbaabbbbabaabaaaaaaabb +aaaaabbbbaaaabbabbbabbab +aabbaaabbbbaaaabbabababbbabbaabbbbababbbbaaabbbababaabbbaabaaaaababbbaaa +ababbbabbbabbbaaababbbbbaabbabbaababbaaa +abbabbababbababbbbbbabbb +aabbaabaabbabbabbaabbaab +baabbbaaabbababbabbaaaba +baaabbbaaabbbabbbaaaaaaa +bbaaababaaaaabaabaaaabba +aabaaabbbbabbaabaaababaabbbbaabb +bbbbabbaaaabbabbaabbabab +aabaaaabbaaaaabababbabba +bababbbabaabaabbaaaabaab +ababaaabbbaabaabbbaabaaababaabbbabaabbaaaabbbaaabbbaabab +aababaaabbbbaaaaaaabbbbb +abaabbaabbbbbaaaaaaabaaa +babbbabababbaaaabaaaabab +abbbbbabbabbaaaababbaabb +bbaaaaabbbbababaaaaabaab +bbaababaaaabaabbabaabaab +bbababbaabbbbabbbaaaaabbabababba +bbabbaabbbbbabbaabababbbaabbbbbabaabbaaabbbabbbabaabbaab +abbabbaabbaaaaabbbabbbaabbbabaaabbaaabbbaaabaaab +aaababbababbabaabaabbbababbabbabbbaababaabbbabbaabaababa +baabbaabbbabbababbaaaaaabaaabbab +aabbabaabbbbbbbbbaabaaababaaaaaa +abbaabbabaaaaabaabbbabaabaaabaabaabaabbbaabaabaaaabaaaaa +baaaabbabaababbababbbababababbbb +bbabbaabbaaabbbabaaabaababbbbbbabbaaabaa +baabbbbaabbbbbbabaabbaab +baaaabbaabbababbaababbababaaaabbbbbbbabababaaaba +baabbbbbaabaabbbbbabbaaaabbaabbaabbbbbabbbbbbaba +babaabbbbbaabaaaabaababbabbbbabbbbbaaaaa +baabbababbaababaabbbaaab +bbaaaabbbaaaaaabbbabababbaabbabbbaaabbaaababaabb +abbbbbbaaababaaababbaaba +baabbabababababaaaaaababbababbbabaabbbaaabaaabab +aaaaababaabaabababbbbbbbabbbaaba +bababaaabbbaabbabaaaaabb +aabbaababbabbbbabbbaaaab +bbbbbbbbaabbbabbbabbbbba +aabaababbaabaabbbbaaaaababaaaaabbaaaaaaa +aaaaaaaaaaaaabababbbbbbabbbaabab +bbbaabaaababbbaaaabaaababbababbbabaaabbaabaaaaaa +ababbabbbbbbaabbaaabbaaabbaaabbaaaabbbba +baabababbbbbabaaababbbaabbaaababbbbaaaababbabbbb +bbaabbbaabaaabaaababaabb +bbabbbaaabbaabbbaaaabbaa +bbbabaabaaaaabaaaababaaaabaaabaaaaaaabbaabbaabbabbbbbaba +baaaabbaabbbaabaabbabbaabbbaaabaaabbbbbaaaaabaab +bbabbabbbbbbbaabbbababbbbbaabaaaaaabbaaa +abbbbbbbabaaabbbabbaaaabaaabababaabaabababbbaaaaabaaaababbababbabbbbabbb +baabbabaababbbaabbababba +bbaabbbaaaabbbbaaabaabaa +baabbabaabbbbbabaaaaabaababbbbaaabaaaaaa +baaabaaabbbababbababaaabaababbaa +aaababbabbaaaaabbaabababbbabaaba +aabbbaabaabbaaababbbaabb +bbbbbbbbbaabababaabaabaa +ababbaaaaabbbbbaaaabbaabbaaabaaabaabbaabbabbbababbbbabbabaaaaaababaaaaba +baaaaabaaaaaababaabbaaaa +aaaaaaaabbabababaaaabbaa +aababaaaababbbaabbbaaaaa +aaaaaaabbbaaabababbbaaab +aaababaaaabbbbababbaaaab +aaababaabaaaabbaabbaabab +bbaabaaaaaabaabbbabaaabbababaaba +ababaaabbaaaabbabbaabaaaabbababbaababaaababaabbbbabbabbb +aaaaaaabaaababbbbbaaaabbbbabaaaabaaabbabbaabbbab +abbabaaaabaaabbabbabbaaaababbbbbbbbaaaaa +abaaaaababbbbbababbbbaba +abaabaaaaabbbbaaaaaabaab +babababaaababaaaabaababa +bbbaaaaabbbbbbaaaabbaabb +aababaaaaaaaabaaabbbbaab +ababaaabababbbaaaaaabbab +baabbbabbbaabbbaabbbaabb +baabbbbaabbbaababbababba +bbbbabaaaaaababbbaababaa +aaaaabbabbbaabbaabaabbbaaabababababbbbba +baabaaabbbaabaabababaabb +aaabaaaaabbabbaabaabaaaa +aaabaabaabbabbabbabaabab +babaabbbbaabbbbbabaaabbabbaabaaabbababbababbbaaaababaabb +baaabaaababbabababbaaabbbaabaaabbaabaaaa +baaabaabbbababbbabbbbbabbabbaaab +abbabaaaaabbbbbababbaaaaaaaaababbabaababaabbbbbb +abbbbbbaabbbbaaababaabaaabbbbabbabbbbababbababbababaaaabbbaaaaba +aaabaabbabbbabaaabbaaaaa +bbbbaaabbbbabaaabaaabbbb +babbbaabbaabbbbbaaaabaaa +aaaaabaabaabaaabaabbaababbaababb +baababbbababbabbbbbbbaabaaaaabbababbbbbabaaaababbbbbbbbbbbaaaaabbabaaaabbababbab +baabaabababaababaaabbaaa +aababbabababaaababbabaaabbababbaabaababa +bbabbbabbabbbaababababba +abbaabbbaababaaaabbbabab +aaababbbabaabbbbbbbbabbb +aabbbbabbaaabaaaabbbaabb +abbbbbaabbbaabababaabaabababbaba +aaababaabbbbaaaababaaabbbaabbabbaaaabbaaababbaaa +bbaaaabaabbabaaaaabbaaabbbbabbab +aaabbababbbbababbbbbaaaababaaaaaababbaababaababbaababbbaaabbaaba +abbaabbbbabaabbbababbaab +baabbbbbbbaaabbbbababbbbbbaaaaaaabbbbbaaabaababa +aabbbbabbbbababbbabaaabbbabbbbbbbaaaabab +baabbbaabbabbbbababbbbaa +babbbbbbabbbbbbbaaabaabbbbbbbbbabbaaabaa +bbbabaaabbbbbaaaaaabbaab +abbbbbababaaabbaaababbbabbaaaaabaaaaabaabaaaaabb +bbabababaabbbaabaaabbbbabaaabbab +aaabbbbabbbbaaabbbbabbbbbbbbabbbaabababb +baaaabbaabbababbbabaaaaa +baababaabbaaaaabbababaabbbababbbababbbbabbabbaabbaaaabbabbaaabbbbbabbabbabbbabab +aaaaaaaaaabbbbababbbbabb +abbaaabbbaaaaaabbababaab +abaabbbbbaabbabaaaabababaabbababaaabbaab +aaaaabaabaababbaabbbbaba +bbbbbaaabbabababbaabbabaabaaaabaaabababb +aaaaabbaabbabaaaabbabbbabbbaaabbbaabaaaabbaaaaaa +aaabaaaaaaaaabbaaabaaabbbaabbbabaaaaabbbbabaaaaa +abaababbaababbbbaaabaaaabbbbbbbaabbaabaa +abaaabaabbbbbbabaabbbabbababaaba +bbabbaaabbaaaaababaaabbaaabbbabbbbbbabbaaabbabba +aaaaaaabbaababababaabbaababbaaaabaaabbab +bbbbbaaaaaababbbbaabbaab +abbaabbbbbaaaabbbbbbaaaabaabbabbaabbbaabbbaabbab +aaaabbbababaababbbbaababaababbaabbbabaababbbaabbbbaabbbaababbbaa +abbabbaaabbbaababbabaaab +aaaaaaababbaaabbbbaababb +baaabbaabaaabbaaabbbabba +babbbaabbbabbaabaabbaabaaabababa +aaaababbabababbbababaaabbbabaababbaababaaaabaabaabbabaaabbbaabaa +aaaaaaabaabbabaaabbabbaaaababbbbabbabaaabaaabaabaaaabbbaaabbbaaa +abbbbbbbbbbbabbabbbbaabb +baaabbbaabaababbaaabbaba +bbbbbbabbabbbabbaabaababbbbaabab +aaaaababbbbbabbbababbaabbbbbbabbaabbbbbbbbaaaaaa +ababaabbbababbbbbbbaaaabaabbbaaa +aaaababbbbbbabbabbaabbaa +aaabaababbbababbbabbabbb +bbababaaabaaabbaaabbaaaa +aaaaababbbaabbaaaaaaaabaabbbababbbbaabab +aabbaabbbabaabaabaaaaaaaabaababbbabbbbbaababbabbababaabaaabbbabbaabaabbaaabbbbba +bbbbaaaabbabababbbaaaaaa +abaaaaabaaaaaaabaabbaaabaaababaaaabaaaaa +babbbaabababaaabababbaab +baaaaaababababbbbaabababbbbbbaabbabaaaabaaaaaabaaababbaa +aabaaabbaababbabbabaabbbaababbabaabbbbaa +ababbbbbabbbaabababbaaba +bbababababbbaaaaabaabbabaaabbabb +bbaabaabaabbbaabbaaaaaabaabbabbbabbbbaab +baabaabbaababbbabbbbbaba +aaaaabababaaaaababababba +abababababbbabbbbababaaa +ababbbaabbabbbbabbbbbbaaabbbbabaabbabbba +babaaaaaaaabbaaabbbaabab +abaaababaaaabaaabaaaaaaabbabbbaaaababababaaaababaaaababbbbabaabbaabbbbba +aaababbbbaaaabbbaaaaaaabbbbabbbaaabbbbaa +babababaaaaababbabaabaab +bbaabbbababbabababaabaababbbbabaabbaaaaababbbbab +abababbbaabbbbababbbaaaaaaabaaab +aabaabaaaaaababaabbaaaabaabaaaaaaaababaa +aabbbaabbbbbabaababbabba +abbbaabaaaaaaaaababbbabbbbaaaababbbbbababbbaaaaa +aaabbbabbbbababbbbaabaabbaaaabab +aabbaababbabbbabbbbbbaba +abbaabbabbbbaaaaabaaaabbbaaababb +aaabababbbbbaaaabbbababb +abbbbbbbaaabaababbababababaabbbaabaabaaa +bbbabababaabbababaabbbbabaababaa +bbbabbabaaaabaaaaabbaaababababababababaaaaaabbbbaaaaabaabbaababb +aabaaabaaaaaaaababbabbbb +aabbabaabaabbabbaaabbbbaaabaabaa +bbaaaabbbbbabaaabababbbaaabaaababababaab +bbbbbbbaaabbbbbaaaaabbab +babaabbbbaaabaaabbbababbbbbaabaaabbbbaba +bbaaaabbbbbbaaaaabababaaaaabbaaabbbaabba +bbabbbababaabbbbaabaaabaaaabbaaa +baabaabbabaababbbbaabaabbaabbabbabbbbababbaaabbb +babbbabaabbbaababababbab +aabaaabbabaaaaabbbaaaabbaaabbaba +aaaaabaaabaabbbbaabbbbbb +aaaabbbabbababaabaabbbaabbbbbababababababbbaaabbaaabbabaaababbba +abaaaabbabbbbbabbbabbbababbaababbbaaabba +abababbbbaabbbbbbabbbbbbabbbbbabaaaababbababaabb +abaaabbabbababbbabaababbbaabbbbababbbaabbbaabbaa +babbbbbbbaabababbbababaaabbabbaabaabbabbaabbbaaa +aaababbababaaaabbbbaaaaa +babaaabbaabbbbbaaaaababa +aaabaaaaaabbaababaabbabababbaaaabbaabbaa +abaabbabbbaababaabbbaabababbabaabbaaaababbababaaabbbabbb +bbbbababbbaabaabbabaaabbaababbaaabaaabbb +baabbbabaaaaaaabbaabbaab +bbbaaabaaaababbbababaabbbbbbbaabbbbababb +babbaaaababbabbaabababbbababbbabaaababaa +aaabababaabbabaabbbabaaababbbbab +bbbbababbbabbbababbababbbaababaababaabba +bbbababababbbbbbabbbaaaaabaabbba +aabaaabbabbbbbaaabaababaabaaabab +bbabbabaabaaaaaababbbbaa +abaabaabaaaaabaabbbbbabababbabbbaabaabaa +bbabbbaababbbabbaabbaaabbabbabaabaaabaaababaabaabbbabbababbbbabbbabbabbabbaabbbb +aaaaabaababbababababbbbbaababbabbbabababbbbbabbb +abaaabbabbabbbaaaabababb +abbbbbababaaaaabbabaaaaa +bbbabbabaaabbaabbaaaabaababbaaab +bbbbbbbbabaabbaaaabbbaaa +baaabbbaaababbbbabbbabbbabaabaabaababaab +aaaababbbbaabbbaaaaababbbabbabba +bbabbbaaababaaabbbbbbbbabbaabaababbabbba +aaabababbabbbabaaabbabaaaaabbaba +aabaabbbbaabbbabaaabbbbabbbbabbb +bbbbbbabababaaababaabbbbaabbaaaabababbbb +abaaaabbaaabaabbbbaaababaaabbaabaabbbbbb +baabbababbbaaabaababbbba +baaabbbabababbbaabbaabab +babababaaaabaaaabbbbabbb +babbababaaabbbbabbbaabaabaabbbbbaaabbbab +baabbaabbababbababbaaaaa +bbababbbaaaaaaaabaabbbbaaaaabaaa +abbbaabbbbbbbbaabbabbbabbbbbabaaababaaab +bbaabbbababaabbbbabaaaba +baaababababaabbbbbabbaba +abababbbaababbbbabbabaabbaabbbaaabbbaabaabbbbaaa +bbaaaaaaaaabababbaabababaababbbbbbbbabaaaaabbabbbbbbbbaabaaaaabbbababbaaaaababaa +baaaaabaaaaaaaaaabbabbba +baabbbbaabaabbabbaaabbbb +abbabbabaabbabaaaabbabab +abaabbbbbaaaaababbabaaba +bbbbbaaabbaabbbaabaaabbaabaaaaabbaabababaabbabbbbabbaabb +babbbabaabaaabbaabbbbbaa +bbabbaabbabbabaabbaaaabaaaabbaab +aaaababaaabaaaaabbabbabaababaabaaabbabbb +abbaaabbbbababaabaaaabaa +baabbbbabaabaabbbaabbaab +baababbabbbabaabaaabaabbbaaabaaabbbbbaba +bbbababbaabbbabbbbbbbbaa +bbbbbbabbbabbabbabbaabbbaaabaaab +bbbababbababaaababaaabbabaababbb +baabaabbaabbabaabbbaaaab +bbaaaababbabababaaabaaaaaaabaabaabbbbaba +bbabbaaabbbbbaaabbbaabab +ababaaababbabababbaababb +aabaaaababbabbabbabbbbaa +aaaabaaabbaabbabababaaaaabbbabbb +abbbabaabbabbbaaaabaaababbabbabbbbaabaababaaabbb +bbaaaabbaabbaaabaaaaaaabaaabbbbaaabbaabaaababaaabbaaabaa +babbbabbaaabababbbabaaab +abbabbabbaabbababbabbbbaaaaabbbabbababba +abbaababbbaabbababbbabbaaabbbbbaaaabababaabababbbbaabbbaabbabaabbbbbabbaabaaaaab +babbbabaababbbabbbbabbba +baaabaabaaaaaaabbabaabba +baabaabbbaabaaabbbabbaaabaaaaaabbbbbaabb +bbababbbabaaaabbbababaaa +baababbaaaabbbbaabbababbaabbaabaabaabbbabbabaaab +bbbbbbaaabbbababbaababbbbaaabbaabbaababb +bbabbaaabaabbbaababbaabb +ababbbababbbbbbbababbabb +babababababaaaaaaaaababababbaaabbabaabab +abaaabaaabbaabbbbabbaaba +aaaababbbabbbbbbbbbaabba +babbbabaaababaaabaaababb +ababbbabbbabbabbbbababaaaaabbbaa +aaaaabbbaabbaababbbbbbbbbaaaabbbaaaaabaabbbbaabaaababbaabababbabbabbabbb +abbabaabbbabbbaaaaabaaaabbbbbaaa +bbbbabbaaabaabbbaabababb +bbbabbaabbbaabaaabaaabaabaaaaaabaabbbbaa +bbbababbbabaaaabaaabbaba +abbababbabaababbbaabbabaaaabaabbaaaabaaabbabbbbbababababbbbaabba +aaabaaaaaababbbaabbaabab +abaabbaabaaabababaaabbbababbbbab +aaaaabbbbbababbbbabaaaaa +aabaaabaaababaaaabaabaaa +aabaabababbbaaaabaabbaaa +babaabaababaabbbbbababbbaaababbaabbabaabbabbbbabbaabaaba +aabaaabaaaabaaaabbaabbbb +bbbbaabaabaaabaaaababbbabaabbaab +bbabababbbabbbbaabbbbaab +baabababbaabbbbbbaaabbbabbbabbbbbabaabbababbaaabaabababa +abbbabbbabbabbabbaaaabaabbbbbaaaabaabababaababaaaaabababaababbba +baabbabbbaabbbbaabaabbabaababbaa +abaababbaaaaabbbaabbbaabaaababbbbbaaababaaaaababbabbaabb +bbbabbbbababababaaabaaabbaabbabaabbabbbbaababaaaabbbabbbbbbabbbbaaaaababbaaaaaaa +aababbabaabababaaababbabbaaaaaaabbbbbbaabbaaabbbbbbaabbb +ababbbabaaabaababbbaaabb +abbbbbbaabbbbbbbbbababba +bbabbbbabbabbbaaabbabaababbbaaaaaabbaaaa +bbaabaababbbbbbbabaabaab +aaaaabbabbbbabbabaabbbbbbabbabaaababbabbaabbaaaa +abbaabbabbbbbbbbabababba +abababbbabbababbabbabbaabbbbaabb +baaabaaaaaaaabbabaaababb +abaabbbbbabaaaabbaaaabaa +bbaabaaabbaabaaaabbbbbaa +baabaaabbbbbbbbabbababaaabbaaaab +bbaaabababbaaabbaabaaabbaabaabbabaaaabaa +aababbbbbbabbabbbbabbbbaaabababb +abbbabaabbaaaaabaaabbaaa +abbbaaaabaaabaaaaaaaaaaabbaabbab +aaabaaaabbbbbbbaabbababbbabbbabaabbabbaabbbbaaaabbbaabbb +aabbaaabbbabbabbbbbaabaaaaaaaabaabbbaabb +babbbbbbaabbabaabaaaabab +aaaaabbbaaaaabbaaababbbaabababab +baabaabbbbbbbbbabbaabaaababaabab +aababbbbaaaabbaababaaaaabaabbbabbbababaaaabaaabbaaaabaabababbbabbabaabbabaabaaaa +aababaaaabbbababbbaabaabbbbababbbbaaabababababba +bbbbbbabbabbababaaaaabaabaabbbaabbaaabababbaaaab +abbaabbbaabbbbabbbabbaba +bbaababaabaabbbbbabababb +aabaabbbbbbbbbbababbababbbbbababbabbaaab +bbabbaabaabbaabababaaaabbabbaaaaabaaabab +babbaaaabbabbabbabbaabab +bbbababbabbababbbabbaabb +aaababbabaaaaaababbbabba +babaabaabaaababaaabaaabaaaabbabb From f39187ba8a2a8147797cf20166ac23bc16b36f46 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 19 Dec 2020 11:00:31 +0100 Subject: [PATCH 138/479] 2020: d19: ex1: add solution --- 2020/d19/ex1/ex1.py | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100755 2020/d19/ex1/ex1.py diff --git a/2020/d19/ex1/ex1.py b/2020/d19/ex1/ex1.py new file mode 100755 index 0000000..2741dfd --- /dev/null +++ b/2020/d19/ex1/ex1.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +import itertools +import re +import sys +from typing import Dict, List + + +def parse_rule(raw_rules: List[str]) -> str: + parsed: Dict[int, str] = {} + rules = {int(num): rule.strip() for num, rule in (i.split(":") for i in raw_rules)} + + for n, r in rules.items(): + if '"' not in r: + continue + parsed[n] = r.replace('"', "") + + while 0 not in parsed: + for num in parsed: + if num not in rules: + continue + rules.pop(num) + + for num, r in rules.items(): + nums = list(reversed(sorted(map(int, re.findall("(\\d+)", r))))) + if all(n in parsed for n in nums): + for n in nums: + r = re.sub(str(n), parsed[n], r) # Bigger numbers replaced first + r = r.replace(" ", "") + parsed[num] = "(" + r + ")" + return parsed[0] + + +def solve(raw: List[str]) -> int: + pattern = re.compile(parse_rule(list(itertools.takewhile(len, raw)))) + + return sum( + pattern.fullmatch(line) is not None for line in itertools.dropwhile(len, raw) + ) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 1d4ec885a43a08d382cf89bce15c92c40bfc9b65 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 19 Dec 2020 11:00:51 +0100 Subject: [PATCH 139/479] 2020: d19: ex2: add input --- 2020/d19/ex2/input | 561 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 561 insertions(+) create mode 100644 2020/d19/ex2/input diff --git a/2020/d19/ex2/input b/2020/d19/ex2/input new file mode 100644 index 0000000..6242e89 --- /dev/null +++ b/2020/d19/ex2/input @@ -0,0 +1,561 @@ +102: 100 47 | 76 84 +23: 60 47 | 73 84 +132: 17 47 | 81 84 +108: 55 100 +18: 116 47 | 26 84 +103: 84 115 | 47 81 +65: 84 113 | 47 50 +128: 107 47 | 125 84 +14: 84 100 | 47 107 +118: 47 17 | 84 57 +2: 47 100 | 84 40 +28: 63 84 | 74 47 +22: 102 84 | 123 47 +123: 84 74 +19: 3 47 | 13 84 +24: 74 47 | 81 84 +115: 55 55 +90: 92 47 | 44 84 +48: 84 94 | 47 96 +109: 17 84 | 100 47 +92: 84 75 | 47 108 +66: 38 47 | 125 84 +83: 66 47 | 108 84 +31: 121 84 | 77 47 +29: 47 61 | 84 111 +45: 47 47 | 47 84 +59: 47 49 | 84 43 +37: 47 30 | 84 95 +36: 107 84 | 125 47 +82: 74 84 | 38 47 +61: 84 10 | 47 110 +79: 47 28 | 84 109 +33: 101 47 | 133 84 +12: 45 47 | 63 84 +91: 122 84 | 93 47 +122: 65 47 | 52 84 +21: 57 84 | 115 47 +8: 42 +67: 102 47 | 64 84 +39: 113 84 | 81 47 +41: 84 124 | 47 10 +50: 47 47 | 84 84 +17: 47 84 | 84 84 +120: 98 84 | 78 47 +113: 55 47 | 47 84 +20: 84 128 | 47 104 +7: 84 1 | 47 20 +51: 84 113 | 47 81 +56: 84 83 | 47 69 +131: 84 127 | 47 97 +0: 8 11 +5: 47 63 | 84 125 +94: 15 84 | 127 47 +121: 99 47 | 27 84 +119: 47 115 | 84 57 +129: 47 80 | 84 131 +15: 47 100 | 84 45 +35: 84 50 | 47 76 +95: 47 115 | 84 107 +68: 127 84 | 51 47 +124: 84 107 +75: 50 55 +57: 47 84 | 84 55 +13: 47 33 | 84 129 +53: 106 47 | 59 84 +106: 16 84 | 118 47 +89: 84 125 | 47 45 +104: 45 84 | 76 47 +99: 47 56 | 84 7 +78: 84 74 | 47 81 +64: 17 47 | 115 84 +32: 50 84 | 40 47 +1: 47 24 | 84 72 +47: "a" +80: 114 47 | 109 84 +88: 47 119 | 84 132 +105: 47 125 | 84 100 +6: 68 84 | 67 47 +110: 76 84 | 63 47 +38: 84 84 | 84 47 +49: 47 63 | 84 76 +26: 55 107 +81: 47 84 +74: 84 47 +96: 84 89 | 47 117 +77: 47 86 | 84 71 +135: 32 84 | 2 47 +133: 47 15 | 84 128 +42: 19 84 | 62 47 +30: 47 100 | 84 74 +27: 6 47 | 91 84 +63: 84 55 | 47 47 +62: 84 87 | 47 23 +76: 84 84 +4: 84 135 | 47 54 +60: 41 47 | 37 84 +100: 47 47 | 84 47 +85: 47 112 | 84 18 +116: 125 84 | 63 47 +134: 57 47 | 115 84 +34: 52 47 | 25 84 +40: 47 47 +111: 58 84 | 126 47 +3: 29 47 | 130 84 +114: 17 84 | 107 47 +52: 47 45 | 84 74 +10: 47 100 | 84 81 +98: 47 76 | 84 100 +112: 84 82 | 47 103 +72: 40 47 | 45 84 +126: 50 84 | 113 47 +107: 84 47 | 47 84 +11: 42 31 +55: 84 | 47 +54: 12 84 | 5 47 +130: 34 47 | 70 84 +84: "b" +127: 81 47 | 17 84 +87: 84 53 | 47 9 +101: 105 84 | 14 47 +9: 88 84 | 120 47 +73: 47 79 | 84 22 +97: 74 84 | 50 47 +117: 74 47 +70: 47 134 | 84 46 +58: 47 50 | 84 115 +125: 47 47 | 55 84 +46: 47 81 | 84 17 +86: 84 90 | 47 85 +25: 38 84 | 63 47 +69: 39 47 | 78 84 +43: 47 100 | 84 125 +93: 84 66 | 47 35 +44: 47 21 | 84 36 +16: 57 47 | 107 84 +71: 48 84 | 4 47 + +babaaabbbababababbbbabbaabbaabaa +babaaaabaaaaababbbbaaaaa +abbabaabbaaabababaabbbbabbbbbaabbbbabababaaaabbbbababbbb +bbbabababbabbbabbbabbbbb +babaabbbababbbabaabaaaaa +abbabaabbaababbabababbbababbbabbabbabbbabbaabbbb +aaaaabaabbbbbaabbbbbbbbbbaaabbaaabbaabab +baababbabbbabbaaaaaababbaabbababbbabbbbb +aaabaaaabbabbbabbabaabbbabaabbbbaaaaabaaaabaabaaababaabbabbaaaabbbbaabbabbabaaaaaaaabaab +ababaaabababbbababaaabab +bbbbabbbbbaabaaaaaabbbbbbabbbabaabbaaababbbaaaaababaabaabaabababbabbbabbabaaabbaaabbaaaa +babaabaaababaaabaaaababa +aabaaabbaabbbabbabaabaab +bbbaabaaaabaaabbbaaabbbabbbaaabb +aaaaaaabaaababbbbbbbbbbbbaaabaabbaaabbab +bbabbabbaaaaabababaababa +babbababbbabbaababaababbaaaaabaaabbbabba +bbbbbbbababbaaaaabaaabbaabbaaaab +bbbbbaaabbbbbaaaaaabaaaabbbaaabb +babbababaababbbbbbbaaabb +abaabbaabbababaabbababba +abaaabbaaabaabbbabababba +babaaaabaaaababbabbbbaaa +bbbbbbbabaababbaaaaababbabbaabbabbbaabaababaabbbbbbaabab +aaabbabbbaabababbaabaaba +bbbababbabaabbabbbabaaaa +baabbabababaaaabbbbbbaab +bbabbbbabaababbabbbaabab +abaabbabbbabbabbabbbabba +bbbbbbbaaababaaabbaabbbabbaaabbbbabababb +aabbaaabbabbabaaaabbabaababbbaababaabababaaabbaa +aaabaababbbabbbbaaababbbbaaabbbb +aaaaaaaaaaabaaaababbabbb +bbbabbbbaabaababaabbabab +baaabaabbaaaabbbbaaaaaaa +bbbbbbbaabbabbaabaabaaaa +aaaaabaabbabbaaaaaaaaabb +aabaaabbaabbabaaabbabaabbaababaaabbbaaaaababbaabaaabbaaabbaaabaa +bababbbaaabaababbbababaabbaabaabbaaaabbabbaabababbbabbbababbabbb +abbbaababbaabaaaaababbbaaaabbbaa +aababbbaaaabaabbbbabaaaa +aaaaabbaaabaaabbbababaaa +bbbababaaabaaaabbabbabaabbababababababbbabbaaaaabbababbabbbbabbbabbbaabb +bbbabababbbabababababbbb +bbaaababbbabbbbaabbbbbaa +bbababaabaaaabbaabbbbaaa +bbbbabbababbbbaabbaaaababbababbaabaaabababbabbabbbbbbaababbbbabbbbaaaaabbbaabbba +abbabbabbbbbbaabaaaaabababaaaaabaaabbaaaabababba +bbbabaabaababaaabaabbaaa +bbababbbbaaababaaaabbabbaaabbbaa +aabbbbababaabbaabababbaa +aaabbabbbaabbbabbbbbbbbabaaaabbaaabababaabaaabab +aaaaaaababbabbabbabaaaaa +aababaaaaaababbbabbabbabaaababbbbbabbababababaaaabbabbbb +babaabbbbaaabaaabbbabbab +bbbbabbbbaabbbabbbaabbbaabbbbbaabbbbaaabbbbaabbbbaababbaaaabaaaabbabbabbabbaabbb +aaabbbabbaaabaabbaaaaabaabababab +abbababbabbbbbabbaabbbabaaababbbbbbbabaababbbbbabababbbb +bbaabbbaaaaababaaabaaaabbbbbbaabbaaaabbaabaaabaabaaaabbabbabbbaabbaaaaaa +abbabbaaaabaaaabbbbbbaabbabaababbbbabbba +bbaaaabaabbababbbbaabbaa +aabbaabaabbaaabbaaabaaaaaaababbabababbaa +baaaabbaaaaaabbbbabbababbaabbbbabbabbabbaabbaabb +babbaaaabbaabaaabbbbaaaabbbabbaaaaaaaabb +aaaaababaaabbabbababbabb +abbabaaaaaabaababbabaaab +aaabaababbaabbbaababbabb +babbabaabaababbabbabaabb +abbabbaabbabbbabababaaaa +bbabbbaaaababaaaaaabbbaa +bbbbbbbaaaaaabbabbbaabaaaaabbaaa +bbbaabaababaaabbaababbabaababaabbbababba +bbaaabbaabaabbbbbbbaababbbaabaabaaabaababaaaaabbbaaabaababaaaaabaabbbbaabaabbbaa +baabbababbaaaaababaabbabaabbbaabaabbaabbabbbaaababbaaaab +bbabaaaaaaaabababaabbababbaabbbbabbbaaababbaababaabaaaaaaaabaabb +baaaaaabbaababbaababaaaa +bbbabbbbbbaabaabbaaabbab +babbbabababaaaabaabbaaabbbabaabababbbaaabaababbbbbaababbbabbbabb +aabaaababababababaabbbababbababbbabbaabb +bbaabaaabbaabababbaababaabbabbba +bbbabaaaababaabbaabbabbbbabbaabaabbabaabbaabaabaabbaabbabaaabaaa +abbaaabbbbbbbbbbaaabbaab +baabbbbbaabbaabbaabbababbaabaaba +baaaabaaabbbbaabaabbabbbbaababbb +abbbbbbaabbbbbbbbbbbbaaaaaaabaaa +abbbbbbbbbabbbaabbbaaabaaabababa +aababbbaabbabaabbabaaaba +bbabbaabbabbabaaababbbba +aaabbbabbaabaabbbbbabbbbaaaaabbbbabbbabababbbaaa +aaabaabbaabaababaabababb +bbababaaabbbaabaabbababa +baabbbaaaaababababaabbaababbabbb +babbbaabbaaaabbaababbabb +bbababbbababbbaabbabbbabaabababaaabaaaaa +babbbbbbbbabbbababbbbaab +abaabbbbbabbbbbbaaabbaba +bbabbbaabbbbbaaabbbaaaaa +abbbbbbbbaabbbaaabbbbbbabaaaabaaaaaabbbb +aabaaabababbbbbbaaabbaab +bbbabababbbbbbabbbbbaabaabababbaaabbbbbb +aababbbaaaaaaaaaabbaaaaa +ababaababaababbbabbbbabaaabbabaaabbabbaabbaaaaaababaabba +aabbaaabaabbbaabaabaabbbaaabaaab +aabbaaabaaaaabaaaaabbbabaaabaaaababaaaaaabbbbbaaaababbaa +babbbaabaabaaabababbabaababbbaabbabaabbaabababbababaaaaa +aabbbbabababbbaaaaabaabbbaabbabaaaabababaabaaaabaaaababaabbbabbaabaaabbb +bbbbbbababbbabaababbabaabababababaababbabbbbbbbabbaaabbb +bbabababaaababbabbababba +abbbbbbabbbbbbaaabbbaabbbbabaabaaaaaaabb +aaaaabbbbaaaabbabbbabbab +aabbaaabbbbaaaabbabababbbabbaabbbbababbbbaaabbbababaabbbaabaaaaababbbaaa +ababbbabbbabbbaaababbbbbaabbabbaababbaaa +abbabbababbababbbbbbabbb +aabbaabaabbabbabbaabbaab +baabbbaaabbababbabbaaaba +baaabbbaaabbbabbbaaaaaaa +bbaaababaaaaabaabaaaabba +aabaaabbbbabbaabaaababaabbbbaabb +bbbbabbaaaabbabbaabbabab +aabaaaabbaaaaabababbabba +bababbbabaabaabbaaaabaab +ababaaabbbaabaabbbaabaaababaabbbabaabbaaaabbbaaabbbaabab +aababaaabbbbaaaaaaabbbbb +abaabbaabbbbbaaaaaaabaaa +babbbabababbaaaabaaaabab +abbbbbabbabbaaaababbaabb +bbaaaaabbbbababaaaaabaab +bbaababaaaabaabbabaabaab +bbababbaabbbbabbbaaaaabbabababba +bbabbaabbbbbabbaabababbbaabbbbbabaabbaaabbbabbbabaabbaab +abbabbaabbaaaaabbbabbbaabbbabaaabbaaabbbaaabaaab +aaababbababbabaabaabbbababbabbabbbaababaabbbabbaabaababa +baabbaabbbabbababbaaaaaabaaabbab +aabbabaabbbbbbbbbaabaaababaaaaaa +abbaabbabaaaaabaabbbabaabaaabaabaabaabbbaabaabaaaabaaaaa +baaaabbabaababbababbbababababbbb +bbabbaabbaaabbbabaaabaababbbbbbabbaaabaa +baabbbbaabbbbbbabaabbaab +baaaabbaabbababbaababbababaaaabbbbbbbabababaaaba +baabbbbbaabaabbbbbabbaaaabbaabbaabbbbbabbbbbbaba +babaabbbbbaabaaaabaababbabbbbabbbbbaaaaa +baabbababbaababaabbbaaab +bbaaaabbbaaaaaabbbabababbaabbabbbaaabbaaababaabb +abbbbbbaaababaaababbaaba +baabbabababababaaaaaababbababbbabaabbbaaabaaabab +aaaaababaabaabababbbbbbbabbbaaba +bababaaabbbaabbabaaaaabb +aabbaababbabbbbabbbaaaab +bbbbbbbbaabbbabbbabbbbba +aabaababbaabaabbbbaaaaababaaaaabbaaaaaaa +aaaaaaaaaaaaabababbbbbbabbbaabab +bbbaabaaababbbaaaabaaababbababbbabaaabbaabaaaaaa +ababbabbbbbbaabbaaabbaaabbaaabbaaaabbbba +baabababbbbbabaaababbbaabbaaababbbbaaaababbabbbb +bbaabbbaabaaabaaababaabb +bbabbbaaabbaabbbaaaabbaa +bbbabaabaaaaabaaaababaaaabaaabaaaaaaabbaabbaabbabbbbbaba +baaaabbaabbbaabaabbabbaabbbaaabaaabbbbbaaaaabaab +bbabbabbbbbbbaabbbababbbbbaabaaaaaabbaaa +abbbbbbbabaaabbbabbaaaabaaabababaabaabababbbaaaaabaaaababbababbabbbbabbb +baabbabaababbbaabbababba +bbaabbbaaaabbbbaaabaabaa +baabbabaabbbbbabaaaaabaababbbbaaabaaaaaa +baaabaaabbbababbababaaabaababbaa +aaababbabbaaaaabbaabababbbabaaba +aabbbaabaabbaaababbbaabb +bbbbbbbbbaabababaabaabaa +ababbaaaaabbbbbaaaabbaabbaaabaaabaabbaabbabbbababbbbabbabaaaaaababaaaaba +baaaaabaaaaaababaabbaaaa +aaaaaaaabbabababaaaabbaa +aababaaaababbbaabbbaaaaa +aaaaaaabbbaaabababbbaaab +aaababaaaabbbbababbaaaab +aaababaabaaaabbaabbaabab +bbaabaaaaaabaabbbabaaabbababaaba +ababaaabbaaaabbabbaabaaaabbababbaababaaababaabbbbabbabbb +aaaaaaabaaababbbbbaaaabbbbabaaaabaaabbabbaabbbab +abbabaaaabaaabbabbabbaaaababbbbbbbbaaaaa +abaaaaababbbbbababbbbaba +abaabaaaaabbbbaaaaaabaab +babababaaababaaaabaababa +bbbaaaaabbbbbbaaaabbaabb +aababaaaaaaaabaaabbbbaab +ababaaabababbbaaaaaabbab +baabbbabbbaabbbaabbbaabb +baabbbbaabbbaababbababba +bbbbabaaaaaababbbaababaa +aaaaabbabbbaabbaabaabbbaaabababababbbbba +baabaaabbbaabaabababaabb +aaabaaaaabbabbaabaabaaaa +aaabaabaabbabbabbabaabab +babaabbbbaabbbbbabaaabbabbaabaaabbababbababbbaaaababaabb +baaabaaababbabababbaaabbbaabaaabbaabaaaa +baaabaabbbababbbabbbbbabbabbaaab +abbabaaaaabbbbbababbaaaaaaaaababbabaababaabbbbbb +abbbbbbaabbbbaaababaabaaabbbbabbabbbbababbababbababaaaabbbaaaaba +aaabaabbabbbabaaabbaaaaa +bbbbaaabbbbabaaabaaabbbb +babbbaabbaabbbbbaaaabaaa +aaaaabaabaabaaabaabbaababbaababb +baababbbababbabbbbbbbaabaaaaabbababbbbbabaaaababbbbbbbbbbbaaaaabbabaaaabbababbab +baabaabababaababaaabbaaa +aababbabababaaababbabaaabbababbaabaababa +bbabbbabbabbbaababababba +abbaabbbaababaaaabbbabab +aaababbbabaabbbbbbbbabbb +aabbbbabbaaabaaaabbbaabb +abbbbbaabbbaabababaabaabababbaba +aaababaabbbbaaaababaaabbbaabbabbaaaabbaaababbaaa +bbaaaabaabbabaaaaabbaaabbbbabbab +aaabbababbbbababbbbbaaaababaaaaaababbaababaababbaababbbaaabbaaba +abbaabbbbabaabbbababbaab +baabbbbbbbaaabbbbababbbbbbaaaaaaabbbbbaaabaababa +aabbbbabbbbababbbabaaabbbabbbbbbbaaaabab +baabbbaabbabbbbababbbbaa +babbbbbbabbbbbbbaaabaabbbbbbbbbabbaaabaa +bbbabaaabbbbbaaaaaabbaab +abbbbbababaaabbaaababbbabbaaaaabaaaaabaabaaaaabb +bbabababaabbbaabaaabbbbabaaabbab +aaabbbbabbbbaaabbbbabbbbbbbbabbbaabababb +baaaabbaabbababbbabaaaaa +baababaabbaaaaabbababaabbbababbbababbbbabbabbaabbaaaabbabbaaabbbbbabbabbabbbabab +aaaaaaaaaabbbbababbbbabb +abbaaabbbaaaaaabbababaab +abaabbbbbaabbabaaaabababaabbababaaabbaab +aaaaabaabaababbaabbbbaba +bbbbbaaabbabababbaabbabaabaaaabaaabababb +aaaaabbaabbabaaaabbabbbabbbaaabbbaabaaaabbaaaaaa +aaabaaaaaaaaabbaaabaaabbbaabbbabaaaaabbbbabaaaaa +abaababbaababbbbaaabaaaabbbbbbbaabbaabaa +abaaabaabbbbbbabaabbbabbababaaba +bbabbaaabbaaaaababaaabbaaabbbabbbbbbabbaaabbabba +aaaaaaabbaababababaabbaababbaaaabaaabbab +bbbbbaaaaaababbbbaabbaab +abbaabbbbbaaaabbbbbbaaaabaabbabbaabbbaabbbaabbab +aaaabbbababaababbbbaababaababbaabbbabaababbbaabbbbaabbbaababbbaa +abbabbaaabbbaababbabaaab +aaaaaaababbaaabbbbaababb +baaabbaabaaabbaaabbbabba +babbbaabbbabbaabaabbaabaaabababa +aaaababbabababbbababaaabbbabaababbaababaaaabaabaabbabaaabbbaabaa +aaaaaaabaabbabaaabbabbaaaababbbbabbabaaabaaabaabaaaabbbaaabbbaaa +abbbbbbbbbbbabbabbbbaabb +baaabbbaabaababbaaabbaba +bbbbbbabbabbbabbaabaababbbbaabab +aaaaababbbbbabbbababbaabbbbbbabbaabbbbbbbbaaaaaa +ababaabbbababbbbbbbaaaabaabbbaaa +aaaababbbbbbabbabbaabbaa +aaabaababbbababbbabbabbb +bbababaaabaaabbaaabbaaaa +aaaaababbbaabbaaaaaaaabaabbbababbbbaabab +aabbaabbbabaabaabaaaaaaaabaababbbabbbbbaababbabbababaabaaabbbabbaabaabbaaabbbbba +bbbbaaaabbabababbbaaaaaa +abaaaaabaaaaaaabaabbaaabaaababaaaabaaaaa +babbbaabababaaabababbaab +baaaaaababababbbbaabababbbbbbaabbabaaaabaaaaaabaaababbaa +aabaaabbaababbabbabaabbbaababbabaabbbbaa +ababbbbbabbbaabababbaaba +bbababababbbaaaaabaabbabaaabbabb +bbaabaabaabbbaabbaaaaaabaabbabbbabbbbaab +baabaabbaababbbabbbbbaba +aaaaabababaaaaababababba +abababababbbabbbbababaaa +ababbbaabbabbbbabbbbbbaaabbbbabaabbabbba +babaaaaaaaabbaaabbbaabab +abaaababaaaabaaabaaaaaaabbabbbaaaababababaaaababaaaababbbbabaabbaabbbbba +aaababbbbaaaabbbaaaaaaabbbbabbbaaabbbbaa +babababaaaaababbabaabaab +bbaabbbababbabababaabaababbbbabaabbaaaaababbbbab +abababbbaabbbbababbbaaaaaaabaaab +aabaabaaaaaababaabbaaaabaabaaaaaaaababaa +aabbbaabbbbbabaababbabba +abbbaabaaaaaaaaababbbabbbbaaaababbbbbababbbaaaaa +aaabbbabbbbababbbbaabaabbaaaabab +aabbaababbabbbabbbbbbaba +abbaabbabbbbaaaaabaaaabbbaaababb +aaabababbbbbaaaabbbababb +abbbbbbbaaabaababbababababaabbbaabaabaaa +bbbabababaabbababaabbbbabaababaa +bbbabbabaaaabaaaaabbaaababababababababaaaaaabbbbaaaaabaabbaababb +aabaaabaaaaaaaababbabbbb +aabbabaabaabbabbaaabbbbaaabaabaa +bbaaaabbbbbabaaabababbbaaabaaababababaab +bbbbbbbaaabbbbbaaaaabbab +babaabbbbaaabaaabbbababbbbbaabaaabbbbaba +bbaaaabbbbbbaaaaabababaaaaabbaaabbbaabba +bbabbbababaabbbbaabaaabaaaabbaaa +baabaabbabaababbbbaabaabbaabbabbabbbbababbaaabbb +babbbabaabbbaababababbab +aabaaabbabaaaaabbbaaaabbaaabbaba +aaaaabaaabaabbbbaabbbbbb +aaaabbbabbababaabaabbbaabbbbbababababababbbaaabbaaabbabaaababbba +abaaaabbabbbbbabbbabbbababbaababbbaaabba +abababbbbaabbbbbbabbbbbbabbbbbabaaaababbababaabb +abaaabbabbababbbabaababbbaabbbbababbbaabbbaabbaa +babbbbbbbaabababbbababaaabbabbaabaabbabbaabbbaaa +aaababbababaaaabbbbaaaaa +babaaabbaabbbbbaaaaababa +aaabaaaaaabbaababaabbabababbaaaabbaabbaa +abaabbabbbaababaabbbaabababbabaabbaaaababbababaaabbbabbb +bbbbababbbaabaabbabaaabbaababbaaabaaabbb +baabbbabaaaaaaabbaabbaab +bbbaaabaaaababbbababaabbbbbbbaabbbbababb +babbaaaababbabbaabababbbababbbabaaababaa +aaabababaabbabaabbbabaaababbbbab +bbbbababbbabbbababbababbbaababaababaabba +bbbababababbbbbbabbbaaaaabaabbba +aabaaabbabbbbbaaabaababaabaaabab +bbabbabaabaaaaaababbbbaa +abaabaabaaaaabaabbbbbabababbabbbaabaabaa +bbabbbaababbbabbaabbaaabbabbabaabaaabaaababaabaabbbabbababbbbabbbabbabbabbaabbbb +aaaaabaababbababababbbbbaababbabbbabababbbbbabbb +abaaabbabbabbbaaaabababb +abbbbbababaaaaabbabaaaaa +bbbabbabaaabbaabbaaaabaababbaaab +bbbbbbbbabaabbaaaabbbaaa +baaabbbaaababbbbabbbabbbabaabaabaababaab +aaaababbbbaabbbaaaaababbbabbabba +bbabbbaaababaaabbbbbbbbabbaabaababbabbba +aaabababbabbbabaaabbabaaaaabbaba +aabaabbbbaabbbabaaabbbbabbbbabbb +bbbbbbabababaaababaabbbbaabbaaaabababbbb +abaaaabbaaabaabbbbaaababaaabbaabaabbbbbb +baabbababbbaaabaababbbba +baaabbbabababbbaabbaabab +babababaaaabaaaabbbbabbb +babbababaaabbbbabbbaabaabaabbbbbaaabbbab +baabbaabbababbababbaaaaa +bbababbbaaaaaaaabaabbbbaaaaabaaa +abbbaabbbbbbbbaabbabbbabbbbbabaaababaaab +bbaabbbababaabbbbabaaaba +baaababababaabbbbbabbaba +abababbbaababbbbabbabaabbaabbbaaabbbaabaabbbbaaa +bbaaaaaaaaabababbaabababaababbbbbbbbabaaaaabbabbbbbbbbaabaaaaabbbababbaaaaababaa +baaaaabaaaaaaaaaabbabbba +baabbbbaabaabbabbaaabbbb +abbabbabaabbabaaaabbabab +abaabbbbbaaaaababbabaaba +bbbbbaaabbaabbbaabaaabbaabaaaaabbaabababaabbabbbbabbaabb +babbbabaabaaabbaabbbbbaa +bbabbaabbabbabaabbaaaabaaaabbaab +aaaababaaabaaaaabbabbabaababaabaaabbabbb +abbaaabbbbababaabaaaabaa +baabbbbabaabaabbbaabbaab +baababbabbbabaabaaabaabbbaaabaaabbbbbaba +bbbababbaabbbabbbbbbbbaa +bbbbbbabbbabbabbabbaabbbaaabaaab +bbbababbababaaababaaabbabaababbb +baabaabbaabbabaabbbaaaab +bbaaaababbabababaaabaaaaaaabaabaabbbbaba +bbabbaaabbbbbaaabbbaabab +ababaaababbabababbaababb +aabaaaababbabbabbabbbbaa +aaaabaaabbaabbabababaaaaabbbabbb +abbbabaabbabbbaaaabaaababbabbabbbbaabaababaaabbb +bbaaaabbaabbaaabaaaaaaabaaabbbbaaabbaabaaababaaabbaaabaa +babbbabbaaabababbbabaaab +abbabbabbaabbababbabbbbaaaaabbbabbababba +abbaababbbaabbababbbabbaaabbbbbaaaabababaabababbbbaabbbaabbabaabbbbbabbaabaaaaab +babbbabaababbbabbbbabbba +baaabaabaaaaaaabbabaabba +baabaabbbaabaaabbbabbaaabaaaaaabbbbbaabb +bbababbbabaaaabbbababaaa +baababbaaaabbbbaabbababbaabbaabaabaabbbabbabaaab +bbbbbbaaabbbababbaababbbbaaabbaabbaababb +bbabbaaabaabbbaababbaabb +ababbbababbbbbbbababbabb +babababababaaaaaaaaababababbaaabbabaabab +abaaabaaabbaabbbbabbaaba +aaaababbbabbbbbbbbbaabba +babbbabaaababaaabaaababb +ababbbabbbabbabbbbababaaaaabbbaa +aaaaabbbaabbaababbbbbbbbbaaaabbbaaaaabaabbbbaabaaababbaabababbabbabbabbb +abbabaabbbabbbaaaaabaaaabbbbbaaa +bbbbabbaaabaabbbaabababb +bbbabbaabbbaabaaabaaabaabaaaaaabaabbbbaa +bbbababbbabaaaabaaabbaba +abbababbabaababbbaabbabaaaabaabbaaaabaaabbabbbbbababababbbbaabba +aaabaaaaaababbbaabbaabab +abaabbaabaaabababaaabbbababbbbab +aaaaabbbbbababbbbabaaaaa +aabaaabaaababaaaabaabaaa +aabaabababbbaaaabaabbaaa +babaabaababaabbbbbababbbaaababbaabbabaabbabbbbabbaabaaba +aabaaabaaaabaaaabbaabbbb +bbbbaabaabaaabaaaababbbabaabbaab +bbabababbbabbbbaabbbbaab +baabababbaabbbbbbaaabbbabbbabbbbbabaabbababbaaabaabababa +abbbabbbabbabbabbaaaabaabbbbbaaaabaabababaababaaaaabababaababbba +baabbabbbaabbbbaabaabbabaababbaa +abaababbaaaaabbbaabbbaabaaababbbbbaaababaaaaababbabbaabb +bbbabbbbababababaaabaaabbaabbabaabbabbbbaababaaaabbbabbbbbbabbbbaaaaababbaaaaaaa +aababbabaabababaaababbabbaaaaaaabbbbbbaabbaaabbbbbbaabbb +ababbbabaaabaababbbaaabb +abbbbbbaabbbbbbbbbababba +bbabbbbabbabbbaaabbabaababbbaaaaaabbaaaa +bbaabaababbbbbbbabaabaab +aaaaabbabbbbabbabaabbbbbbabbabaaababbabbaabbaaaa +abbaabbabbbbbbbbabababba +abababbbabbababbabbabbaabbbbaabb +baaabaaaaaaaabbabaaababb +abaabbbbbabaaaabbaaaabaa +bbaabaaabbaabaaaabbbbbaa +baabaaabbbbbbbbabbababaaabbaaaab +bbaaabababbaaabbaabaaabbaabaabbabaaaabaa +aababbbbbbabbabbbbabbbbaaabababb +abbbabaabbaaaaabaaabbaaa +abbbaaaabaaabaaaaaaaaaaabbaabbab +aaabaaaabbbbbbbaabbababbbabbbabaabbabbaabbbbaaaabbbaabbb +aabbaaabbbabbabbbbbaabaaaaaaaabaabbbaabb +babbbbbbaabbabaabaaaabab +aaaaabbbaaaaabbaaababbbaabababab +baabaabbbbbbbbbabbaabaaababaabab +aababbbbaaaabbaababaaaaabaabbbabbbababaaaabaaabbaaaabaabababbbabbabaabbabaabaaaa +aababaaaabbbababbbaabaabbbbababbbbaaabababababba +bbbbbbabbabbababaaaaabaabaabbbaabbaaabababbaaaab +abbaabbbaabbbbabbbabbaba +bbaababaabaabbbbbabababb +aabaabbbbbbbbbbababbababbbbbababbabbaaab +bbabbaabaabbaabababaaaabbabbaaaaabaaabab +babbaaaabbabbabbabbaabab +bbbababbabbababbbabbaabb +aaababbabaaaaaababbbabba +babaabaabaaababaaabaaabaaaabbabb From 49a934f8f6ba0c54f0f6423fe0420d66edd560d6 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 19 Dec 2020 11:00:56 +0100 Subject: [PATCH 140/479] 2020: d19: ex2: add solution --- 2020/d19/ex2/ex2.py | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100755 2020/d19/ex2/ex2.py diff --git a/2020/d19/ex2/ex2.py b/2020/d19/ex2/ex2.py new file mode 100755 index 0000000..b036fa8 --- /dev/null +++ b/2020/d19/ex2/ex2.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +import itertools +import re +import sys +from typing import Dict, List + + +def parse_rule(raw_rules: List[str]) -> str: + parsed: Dict[int, str] = {} + rules = {int(num): rule.strip() for num, rule in (i.split(":") for i in raw_rules)} + + for n, r in rules.items(): + if '"' not in r: + continue + parsed[n] = r.replace('"', "") + + while 0 not in parsed: + for num in parsed: + if num not in rules: + continue + rules.pop(num) + + for num, r in rules.items(): + nums = list(reversed(sorted(map(int, re.findall("(\\d+)", r))))) + if all(n in parsed for n in nums): + for n in nums: + r = re.sub(str(n), parsed[n], r) # Bigger numbers replaced first + r = r.replace(" ", "{x}" if num == 11 else "") + if num == 11: + r = "(" + r + "{x})" + r = "(" + r + ")" + if num == 8: + r = "(" + r + "+)" + parsed[num] = r + return parsed[0] + + +def solve(raw: List[str]) -> int: + pattern = parse_rule(list(itertools.takewhile(len, raw))) + + def matches(repeats: int) -> int: + pat = re.compile(pattern.replace("x", str(repeats))) + return sum( + pat.fullmatch(line) is not None for line in itertools.dropwhile(len, raw) + ) + + return sum(itertools.takewhile(bool, map(matches, itertools.count(1)))) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 10e84ed48fd7f72316f8bc5e54f77de93f5d9dee Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 20 Dec 2020 14:26:25 +0100 Subject: [PATCH 141/479] 2020: d20: ex1: add input --- 2020/d20/ex1/input | 1728 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1728 insertions(+) create mode 100644 2020/d20/ex1/input diff --git a/2020/d20/ex1/input b/2020/d20/ex1/input new file mode 100644 index 0000000..3d3540f --- /dev/null +++ b/2020/d20/ex1/input @@ -0,0 +1,1728 @@ +Tile 1913: +##..#....# +.#.#.#.### +#...##.##. +.....#.#.# +.#......## +.........# +#...###..# +.#..#..... +.##...#..# +#.#...#... + +Tile 2579: +##...####. +##..#....# +...#...#.# +#.....###. +##..#...## +#....#..#. +.#.....### +.##...#... +#......... +...##..... + +Tile 1531: +.......### +.#....#### +.#.#.#...# +....#..#.# +.#.#.##..# +.#.#.#...# +#.##...### +##..#..... +#...#..... +##.##.#..# + +Tile 1493: +#.##.#.#.. +#.#..#.##. +..#.....#. +#.#.#....# +....#....# +...#####.. +#####.#.#. +#.##..##.. +..#.....## +.##..#.### + +Tile 3109: +########.# +......#.## +#....#...# +##.#.##... +....#.#... +#####...## +....#....# +..##...### +.......#.# +#.##.#.... + +Tile 3343: +###......# +#..#.#..## +...#....#. +#......... +..#.....## +.....##### +.....####. +##.......# +..#....... +#.......## + +Tile 2609: +####..#.## +#.#..#.... +....###..# +###..#..#. +#.#......# +##..#..#.. +#....#..#. +#......### +#..#....## +.#..#.###. + +Tile 1823: +###..#.... +..###...#. +..#.###... +...#.....# +#....#.#.# +.#..#.#..# +#..##.#..# +...##..... +....#.#.#. +###.##...# + +Tile 3391: +....#...#. +.#.#....#. +#......#.. +#..#....#. +#.##...#.# +...##.#### +....##..#. +##.#.#..## +.....#..## +#.#.#..#.# + +Tile 2753: +....###..# +.#..##.#.# +...#...... +..#.###.## +...#..##.. +....#..... +#......#.. +#........# +......#..# +#..#.#...# + +Tile 3989: +.#.###.#.. +#......##. +.##......# +.......### +###....### +##........ +##....#.#. +...#.#..#. +........#. +###..#..#. + +Tile 1877: +...###...# +#.#..##... +.##.###.#. +#.#....#.. +#..#.#.##. +#.......## +####..#.#. +##.#....## +.##....... +.#..##..## + +Tile 2729: +#...####.# +...#.....# +.###...... +...#..#..# +...#.#.#.# +.#.....##. +..#.....## +........#. +###....... +#..##...## + +Tile 1031: +##.#..#### +#.##.#.... +..#....... +#......### +.##.###.## +#...#...#. +#..##..... +#..#.#.#.. +....###... +....#.###. + +Tile 3803: +#..#..##.. +...##..#.. +...#.#.... +#.....#..# +#........# +.#..#.#.## +..#..#.#.. +#..#.#.#.. +..##..#.#. +#####.###. + +Tile 3541: +.##.#..#.. +.##..#...# +.#.#..#... +...#..##.# +..#.....#. +..##...... +.##......# +##.......# +.#..#.##.# +###.#.##.# + +Tile 3821: +.#.#.#.... +..#..##... +#.##...... +..#...#.## +#.####..#. +##.##.#... +..#..#.... +....#....# +...###.#.# +.#..#.#.## + +Tile 3853: +#####..#.# +.....#..## +#...#.##.# +.##....#.# +#.#......# +###...#.#. +##....#.## +#.#.#.#..# +....###... +##.#.#.... + +Tile 1249: +###...#### +..#....#.. +##.##....# +.........# +#......... +.##.#.##.. +...#...##. +.......... +##...#.#.. +##.####..# + +Tile 3673: +...##..#.# +.#..#..#.# +###......# +#.....###. +..#.#..... +#.#..#.### +.#.##.##.. +.##....#.. +.#...##..# +#.###..#.# + +Tile 3163: +##.#.##### +.##....#.. +####...... +#..#.#..## +.#.#..##.# +##.....#.# +.......#.. +#...#..... +..#..#.... +###.#...#. + +Tile 1759: +###.#...## +...#..#... +###..###.. +.#.#...#.# +.##...#... +..###....# +#.#.....#. +......###. +..#.####.# +##..##..#. + +Tile 1831: +.#...#...# +...#.#..## +#...#.#... +#...##.#.. +.#.#.#..#. +......##.# +.........# +#....##.#. +......#..# +#..#...##. + +Tile 2179: +.###.....# +..######.# +....#....# +...#....#. +#.##..#... +#..#....## +.#..#.#..# +..#.#....# +#.#.#..... +###.##...# + +Tile 2713: +..###.#..# +#.#.....#. +#....#.#.. +#...##.... +##...#.#.# +###..###.# +.##..#..## +.#...##.#. +#.#....... +#...#..... + +Tile 1889: +....#....# +......#.#. +##.###...# +.#..##...# +##.##.#..# +...#...##. +#....#...# +.......#.. +.#...#..## +.#.####.## + +Tile 1999: +##....##.# +#..#.##.## +..#...#... +#.....#... +......#... +#.....#..# +.#.##..#.# +..#..##..# +#...#..#.. +###..##..# + +Tile 2039: +.#....#### +.##..#.... +.#.......# +#........# +#.......#. +.#..#..... +#.##...... +##....#..# +.........# +#.#......# + +Tile 2969: +...#####.. +..#.#...## +##.....#.. +##.....### +#...#..### +#..#....## +#..##...## +.........# +#...##...# +.#......## + +Tile 2153: +.##..###.. +#.#..#..## +.#####.... +#.#..#.### +#.....#.## +####..#.#. +.......... +.#......#. +...##...#. +.#....#### + +Tile 2837: +..###..... +###.#.###. +.#....#... +##.....### +##.##..### +..#..##.## +.#....##.. +#..##.##.. +#..#...... +#..##...#. + +Tile 1619: +##..###.## +##....#### +.#..##.#.. +##.#...#.. +#..##.##.. +...#.#.#.# +.....#.##. +..##..#..# +#..#..#..# +......#.#. + +Tile 3943: +.#.##.#.#. +.......#.# +.........# +...#..#..# +...#....## +#.#.##.... +##.......# +.#..#.##.# +...##.#..# +#.##....#. + +Tile 3389: +#...#.##.. +#.##..#... +#.#.#..... +##...#...# +##.....#.. +.#..###..# +..###..... +#.##..#.## +####....## +##.#.##### + +Tile 3631: +##.###.### +#...#..... +..#....... +#....#.### +#......... +#.#....... +....##...# +........#. +#....#.... +.....#.#.. + +Tile 2081: +##..##.#.. +.##......# +........## +#.......## +......##.# +#....#.... +.#.#...##. +....##..#. +#.#..##### +...#####.. + +Tile 1579: +##........ +.....#...# +#......#.. +#..#.#...# +...#..#... +#.##....## +...#...... +.#...#..#. +..#....#.# +.##...#... + +Tile 3019: +.##..####. +...#....## +...##.#.#. +#....#.... +.........# +##..#..#.# +...#.#...# +.#.##.#.## +##..#..... +#..#..###. + +Tile 2089: +##.##.#... +..#.##...# +##...#.... +#........# +#..#.....# +..######.# +.......#.. +...#..##.. +#.#....#.. +...#.##### + +Tile 2297: +#.#.###... +#.##...... +#..#..#... +......#..# +#....#...# +###.#..##. +#....##.## +.......#.# +.........# +.###.#.#.. + +Tile 1373: +#..#.####. +........#. +....#....# +.##..#...# +.#.....#.# +#.....#... +#..#..#..# +.##...##.# +##.......# +.##..#.#.. + +Tile 1259: +...#..##.# +....#.#..# +#..#.##.## +##..##.... +#..#.#..## +#.#...#... +..#......# +...###.#.# +.......... +.###..##.. + +Tile 2411: +.###..#.#. +.#..#..#.. +#.....#..# +.#.....#.. +##..#...#. +.#........ +#...##.... +#.#..##... +.....#.#.# +....#.##.. + +Tile 3359: +.##..##.## +..#.#..#.# +#.......#. +.#..###..# +.#.....#.. +#......... +...#.....# +.##....#.. +.........# +.#.##..#.. + +Tile 2437: +.#.....#.. +#.#....... +....##.#.. +##.###.##. +##.#....#. +#...#....# +##..##..## +...#..#..# +....##.#.# +.##.#.#... + +Tile 1367: +....#####. +..#.#....# +##......#. +..##...##. +..##..##.# +..##.##..# +#.#......# +##...#...# +.....#.#.. +##.###.### + +Tile 3533: +##..####.. +##..#....# +...#.....# +#.##..#### +###..##... +....###..# +..#.....## +.##.#..#.. +....#.##.. +##.#.##.## + +Tile 1451: +.####.#... +..##.#.#.. +...#.#.... +.........# +....#...## +##...##... +..#...#... +#...#.#### +...#.#.### +#######... + +Tile 3457: +#.##.###.# +#..#.#.... +###.#....# +.#....#.## +.......##. +#...####.# +#.#####..# +#.#..#..#. +#.#....... +.#.##..... + +Tile 2657: +..#####..# +......###. +#.....#..# +.#..###..# +...#.##... +#.....#..# +#....##### +....#..#.. +#.#.###..# +.#..##.#.. + +Tile 2347: +#.##.#.### +#...#....# +.......... +#.#.#..... +#....#.... +#..#...### +#.##...#.. +#.....#..# +#.#.###.#. +#...###.## + +Tile 3923: +#.####...# +###...#.## +......#..# +..#..#..## +#....#.#.# +.........# +.....#.#.# +#..####..# +....##.#.. +#..#...#.. + +Tile 2593: +####...#.. +#...####.# +#......##. +..#..#.... +#..#.....# +...#...... +....#..... +#.#...##.# +.......#.# +#.#####.#. + +Tile 1103: +..##...#.# +..#.....#. +#....#...# +...##....# +#.#.....## +.#.#.#.#.. +#....##### +.#.#.##### +.........# +.##...#.#. + +Tile 2671: +.##.##.#.# +...#.#.... +##....#... +#......#.. +.#....#.## +........## +..#...###. +###...#... +....#.#..# +.#######.# + +Tile 3907: +###....#.. +..##.....# +.......... +##...#..## +##..#..##. +##..##..#. +#.#.....## +..###..#.# +#..#..#..# +#.#....... + +Tile 1327: +.#..#..#.# +.###.###.. +..#..#.... +.#...#.#.. +#.##.....# +#..#.#..#. +###...#... +##..#..#.# +......#... +#.#...###. + +Tile 1163: +..#.#...#. +####.#.#.. +.##.....## +#...#..... +.....####. +#...#..### +...#.##.#. +##..#..#.. +.....#.#.# +.###...#.# + +Tile 2683: +.......#.. +.#.#.##..# +##..#...## +...#...... +##.##...#. +...#.#.### +.#.##..... +#..#....#. +.###..#... +.#.#.....# + +Tile 3881: +#.#.#..##. +##.#...### +##......## +#......... +#..#...... +...#.#...# +.#..##.... +.....##.#. +##...#.... +###.....#. + +Tile 2711: +#...#.#.## +#..##..... +...#...... +#.#.#....# +#...#.#... +...#...... +.#.#...... +..#....#.# +#.##..#... +#.#.#..... + +Tile 3491: +.###..#.## +.....#.... +.##..#..## +##.##..#.# +.###....## +..##..#..# +..#......# +..#..#...# +#...#.#..# +.......##. + +Tile 2339: +###.#####. +.#....#... +##.#.....# +#......... +#......... +..##..##.# +.###...... +#...##.... +##........ +#.....#..# + +Tile 1543: +..##...#.. +.....#..## +....##.... +.........# +.#..#.#..# +.......... +.........# +#.#.#..... +##.#.#.... +#.#.###..# + +Tile 2371: +#..#.##### +##.#..###. +#.#...##.. +#...###.## +#...#..#.# +##.....### +.#.......# +.....#.#.. +..#.#.#### +.###..##.. + +Tile 2971: +..###.#... +#......... +##.#...### +....###... +###......# +..###....# +##.#.....# +.#.....#.. +#.....#### +..##.##.#. + +Tile 2203: +#.###.#.## +.#...##.#. +#.#.....#. +..#.#....# +##..#....# +##..#..... +#..#..#... +##........ +..#..#.#.. +##....#..# + +Tile 2113: +###...##.# +......#... +.....##.#. +....####.# +##..#..#.. +#...#...## +.......#.# +......#..# +#.##.#..## +....##.#.. + +Tile 1321: +.#..#..#.. +##...#...# +.......... +.####..#.# +##.#.#.#.# +#..#.#.... +#..#.....# +.#.......# +....###.#. +##.#.##.## + +Tile 1667: +.#####...# +##....#..# +#..#.#.... +..##..#... +#..##...## +...#...... +..#..#...# +.....#...# +#..#...#.# +##..#.##.. + +Tile 3001: +.#.####### +...#.#...# +..##...#.# +#......... +....#..... +#.....##.# +.....####. +#......... +...#.##.## +##.##..### + +Tile 1789: +..###.#..# +...##...#. +........#. +####...#.# +#..#..#... +##.##..##. +....#..... +#.#.#..... +#.#..#...# +######.#.. + +Tile 3677: +.#...#.### +#..##...## +#..#...#.# +##........ +..#....### +.......... +##..#.##.# +.#........ +......##.. +.##.##...# + +Tile 2693: +#.#.###.#. +#.#..#..#. +.#....#... +#..#...#.# +.#.##..##. +.##......# +...#.....# +##...#.### +.#.#.....# +########.. + +Tile 2141: +#####..... +#......... +#...#....# +....#..... +.......#.. +##..#.#..# +#....#..#. +..#....#.. +.....##.#. +##..#.#.#. + +Tile 3847: +#...###### +#..#.##..# +..#...##.# +##..#.#..# +##..#..#.# +##.##....# +#........# +#....#.#.. +#......... +#......#.. + +Tile 2333: +#.#..##.#. +####.....# +###..#...# +.........# +...##.#..# +###....... +..##...#.# +...###...# +.###.#...# +##..#.##.. + +Tile 2129: +#..###.### +....#....# +#.#.#..#.# +....#....# +#...#.#..# +..##.##... +#.##....#. +#...#.#... +.#..##...# +...###.##. + +Tile 1283: +.#..#.###. +###.#.##.# +#..#..#.#. +.....#...# +.#.#.#.... +#...#..#.# +.#.#..#.## +.#..##..#. +#....##.#. +.#..#...#. + +Tile 2851: +.##.#..... +###......# +.#........ +....#.#..# +.#..#..#.. +.##....#.. +.##...#.## +#.###.##.# +##........ +.#.#.#.#.# + +Tile 2311: +#..##....# +.#......#. +....#...## +....#...#. +.#...#...# +#...#....# +.....#.#.# +.....##..# +##..##.### +##..###.#. + +Tile 3217: +#.##....## +#.......#. +#.#....#.# +..##.###.. +....##...# +#......... +...#.#...# +..##....## +..#......# +##.###..## + +Tile 2833: +####..#..# +#...##.#.# +........## +..##..#... +.......#.. +......#... +###..#..#. +.##..#...# +##.#....#. +.####..... + +Tile 3593: +#..#####.. +.##.#....# +...#..#..# +##.#...##. +#######... +...#..#... +#.##..#.#. +#........# +#...##..## +........## + +Tile 3299: +...#.#..#. +#.#......# +##......## +.#..#..#.. +#.#####... +#...#....# +#.#....... +..#....#.# +.#........ +#.#.#.##.. + +Tile 2719: +...#..#.#. +#..#.###.. +......#.## +....#.#..# +#.#......# +....#..... +##..#.#... +...##..... +###.#....# +..####..## + +Tile 2161: +..#.##..## +#........# +...#.#...# +...###.... +......#..# +..##.##.#. +.#....#.## +#...#####. +#....#...# +.#....#... + +Tile 3643: +...#...##. +##......## +....#.###. +.#.#..#### +..#.#...## +.##.#.#.#. +#.#..#..#. +#..#.#..#. +.#........ +.#.###.... + +Tile 3767: +.##.#....# +#...#...## +.#...##..# +.#.#...... +..#..#..## +#..#.#.##. +#.....#.## +....##...# +.....#.##. +..#..###.. + +Tile 2377: +.#####.#.# +..#.....## +#...#...#. +##....##.. +....#..#.. +#.##..#..# +.#...#.##. +...##...#. +#....#.... +..#.#..### + +Tile 2441: +....#.###. +.#..#....# +.#.###.... +#...#..... +#.#.##.... +....##.... +....##...# +...#..##.. +#...###.## +.##.#.#.#. + +Tile 2273: +...#..#.#. +#..#...### +..#....#.. +...###.#.. +.........# +..##.#..## +###.#....# +#..#.....# +....#...#. +.##..##### + +Tile 1231: +....#####. +#.....#.#. +..#....#.# +.###..##.# +#..#....## +#..#.#.#.. +..#.###... +##........ +..#.....## +##.##..#.# + +Tile 2879: +#####.###. +#..#..#..# +...#..#..# +#......... +.#.#.#...# +...#..#..# +#.#..#.### +#.....#### +.......#.# +..##.##### + +Tile 2473: +.##.###..# +....##.#.# +#..#..#..# +..#.#.#... +#..##..... +.##....#.. +....##..## +...#.....# +....#..... +.#####.#.. + +Tile 3329: +#.#..###.. +......###. +.###..##.. +...#.##... +#..#.#.### +#.###..##. +##..##...# +..#####..# +.#...#.... +#.##.#..#. + +Tile 1489: +....#....# +#.##.....# +..#......# +..#...#..# +.#....#..# +#..##...#. +..####.##. +.#..##..## +..#.....#. +##.#.##..# + +Tile 3259: +..####.### +##.##..#.# +.#..#..### +#.#....... +.....#.#.. +##...#.#.. +.....#...# +.#....#... +..#.#....# +######.... + +Tile 1123: +....#.#.#. +...##..... +...##....# +#.##....## +..#...#..# +.#..#..... +.#......## +.........# +.....#...# +.##.###... + +Tile 1381: +.###..#.## +#..##..#.. +#.....#..# +#..#..#..# +#....#.#.# +.......#.# +#...#.#..# +##..###..# +..#..##... +..##.#..#. + +Tile 2903: +#.###.###. +#..###..#. +##.......# +.#....#... +#..#..##.# +...#...#.# +#.#...##.# +......#..# +##.#..#..# +##.#..##.# + +Tile 1049: +#....#.### +####.....# +#.##....#. +.#....##.. +.##..#..## +#.#.#..#.# +.##...#..# +...#..#.## +.....#..## +..#.#.###. + +Tile 3137: +...#.#.#.# +#.#....#.. +..###...#. +..#..##..# +.#.#.##.#. +#.#..##..# +#.....#... +##...##.## +#.#...#... +.##.#..... + +Tile 2131: +.#......## +...#...##. +.#.#.#.#.# +.......... +...#....#. +#.#.#..#.# +..#.#....# +....##.... +....##..#. +##.##..#.. + +Tile 3733: +.#.#....## +.#..#....# +..###.#..# +.....#...# +...#.....# +###..#.... +#...#.#### +......#... +..#..#.... +.#####.#.. + +Tile 1973: +.#.#.##... +#.....#..# +#......#.. +...#...#.# +..#..#...# +####.#.... +....#..#.# +.#.....#.# +....#..#.# +..#..#.#.. + +Tile 3889: +#.##.#...# +#....##..# +.###..#.## +..#...###. +#....##... +#.##...... +#.#..#..#. +...#.#...# +........## +##.#..#.#. + +Tile 1129: +#...###### +#...#.##.# +###.....#. +#.#..#..#. +.#....#... +..#...#..# +#....#.### +......#.#. +#.#..##.## +.###..#..# + +Tile 1549: +.#..##.#.. +#.#....### +...#..#... +##....#... +..##...#.# +#.#....### +..#.##.##. +.....#...# +#.##.....# +#..#.##... + +Tile 2213: +#...#.#.## +#........# +...##...## +.#..##.#.# +#..##....# +...##...## +##........ +....#....# +...#.#.#.# +..#.###..# + +Tile 1597: +..###..#.. +#......#.. +.......#.# +#.#....### +#.###..#.# +##.#.##... +#.##.#..## +.#.#..##.. +.##..#...# +##...##### + +Tile 1777: +#..#....#. +.........# +..#.....#. +..#......# +.##....#.. +#...#...#. +.#..#..... +#.....#..# +.#..##...# +#.#...#... + +Tile 2503: +#..###.#.. +.#..##.#.. +....##.... +..#..#.... +#....#.#.. +#.#....#.# +...#.#.... +..##.#.... +#.#.#....# +#.######.. + +Tile 3499: +.####...## +.#.##..#.. +#........# +..#......# +##..#...#. +#...##.... +#......#.. +.#.#....## +...#..#... +.##.#...#. + +Tile 1811: +#.###...## +..##...#.. +..#.#..### +##.#....#. +.#...#.... +##.......# +#....#...# +...##.##.. +...#.....# +.####..#.. + +Tile 3793: +###.####.. +##...###.# +...#.###.. +#....#.... +.....#.... +...#.....# +###.####.. +#.##.##.## +......#... +#.#.###... + +Tile 2341: +.##..#.### +.#........ +..####..#. +.#..####.# +#....#...# +......##.# +#.....#... +.......... +#..###.... +####.##### + +Tile 3613: +..#.#.#.#. +#....###.. +#......#.. +#.#...#.## +#..#.....# +##.#.#.#.. +...####..# +##...###.# +#.#.#....# +#..####... + +Tile 3701: +..##.####. +#.##...### +.###.#.... +#..#.....# +##........ +###..#.### +..#...#.#. +.##...#..# +##.......# +###.#...## + +Tile 1483: +#####..##. +....#..#.# +...#####.# +#.##...#.. +........#. +........## +##..##.### +.###....## +...###..#. +...#.#..#. + +Tile 3571: +#.#.##.##. +#......##. +#...#.#... +.#.#....#. +#.#....#.. +#.#...#... +##.....#.# +##.#.#...# +#....#...# +#.#..#..## + +Tile 2521: +##.##..#.# +......#..# +.#.#.#.##. +#........# +.#.##....# +.#....#.#. +##......#. +#....#.... +.#..#...#. +.#..#..### + +Tile 3413: +.##.##..#. +#...#..#.. +##....#..# +.......... +#..#...#.. +##..#....# +....#.#... +#.....#... +......#.## +..##.##.#. + +Tile 1933: +#..#....## +#...#..### +.#......## +......#..# +.......... +##.##..### +.......### +...#...### +.#....#..# +#.#..#.#.# + +Tile 1021: +.#..##.#.# +##....#... +.#........ +.#.#....## +.#......## +##........ +.....#..#. +#....#.#.# +#......... +..#.#.##.# + +Tile 3323: +...###.#.. +.#..####.. +....#..... +#.....##.# +###......# +..######## +.#....##.# +....##.##. +#..##....# +#.##.#..#. + +Tile 1607: +....####.. +##.#...#.# +.......#.# +#......... +..#..####. +..#..#.##. +.###.#...# +##...#.... +#.######.. +##.#.#.### + +Tile 1481: +.###...#.. +.#......## +.....#...# +...#...##. +#.###.##.. +#......### +#......... +###...###. +.#....##.. +#....###.# + +Tile 1879: +###.##.... +#.#.....## +#.#..#.#.# +.#...#..## +......#### +#.###..... +......###. +#..#.#..## +..#......# +.#..#..... + +Tile 2927: +###..##.#. +#..#....#. +##..#..... +#.#...#### +#......... +..###...## +#.####...# +#.##.##..# +...#...... +#....#.##. + +Tile 1867: +..#..####. +##.##..#.# +.##......# +###..#.... +..#......# +#..##..#.# +#......... +...#..#..# +#......#.. +.#....#.#. + +Tile 2647: +#####.##.# +...#...#.. +#.......## +...#..#..# +..#.###... +...##..... +..#......# +.##....... +#...#..... +##...##.#. + +Tile 2207: +#.#####.#. +#..#.#..## +...##....# +..#..#.#.# +#...###..# +.##.#...## +#..##..### +#......... +###.#..#.# +.#....##.# + +Tile 1223: +###.....#. +#.....#.## +##.##.#... +#...##...# +#....#.... +..#.##.... +##....##.. +..#..#.... +.#.##..#.. +###.#.#### + +Tile 1931: +##.#...### +#...##.... +#..#....#. +..##..#... +#...#..... +.........# +###.##.... +...##.#..# +.#.#.....# +..#..##.## + +Tile 3917: +.##.#..#.. +.......##. +#.##....## +...#....## +###....#.# +.##.#...## +###....... +##.....#.. +....###.## +....#...#. + +Tile 1663: +#.#.....## +.#.##.#..# +....#...#. +#...##...# +#..#...... +.#..#.#..# +..#..#..## +...#...... +#...##.... +.##.###### + +Tile 3373: +#..###.### +##...#.#.. +#..#..#..# +.#....##.# +..###..##. +...#.#...# +#.....#..# +##..#..... +.#..#.#... +.#...###.# + +Tile 1319: +.#.#.#.#.# +.....#..## +..#.#.#.#. +.#.##...#. +..##...... +...#...... +.#........ +#..#.....# +#..##....# +.#.##.#..# + +Tile 2687: +#...###.#. +##.#...##. +#...#...## +#..##....# +......#.#. +.###.#.#.. +##...#..## +......#..# +.......... +#.....##.# + +Tile 2003: +.######... +.##...###. +....#..... +#.###.#.#. +......#..# +..##.#.#.# +#.##..#.#. +####.#.... +#...#.#.## +......##.# + +Tile 1453: +###.#.#### +...###..#. +.#..#..### +..#......# +#.#..#..## +..#..#.#.. +#.#...#.#. +..##..#.#. +#..###.... +..#..#..## + +Tile 1871: +..#..##### +##..#....# +##.......# +#..#..#..# +#.....#.#. +#..###.... +.......... +.#........ +.#.##.##.# +#.#..#.### + +Tile 3709: +.##.#.##.. +.#..##...# +.##....... +..##.#.... +.........# +....#..... +###.#.##.. +.#####.... +#####.#... +..#..##### + From 87376fc0ee0e844cb11f744514f58949a6fa3f21 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 20 Dec 2020 14:26:48 +0100 Subject: [PATCH 142/479] 2020: d20: ex1: add solution --- 2020/d20/ex1/ex1.py | 128 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100755 2020/d20/ex1/ex1.py diff --git a/2020/d20/ex1/ex1.py b/2020/d20/ex1/ex1.py new file mode 100755 index 0000000..f8171f8 --- /dev/null +++ b/2020/d20/ex1/ex1.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python + +import functools +import itertools +import math +import sys +from collections import defaultdict +from copy import deepcopy +from typing import Dict, Iterator, List, Set, Tuple + +Tile = List[List[str]] +Tiles = Dict[int, Tile] + + +def parse(raw: str) -> Tiles: + def parse_tile(raw: List[str]) -> Tile: + return [[line[i] for i in range(len(line))] for line in raw] + + res = {} + for lines in map(lambda s: s.splitlines(), raw.split("\n\n")): + if len(lines) == 0: + continue + nums = int(lines[0][5:-1]) + res[nums] = parse_tile(lines[1:]) + return res + + +def rotations(tile: Tile) -> Iterator[Tile]: + yield tile + for __ in range(3): + prev = deepcopy(tile) + for i in range(len(tile)): + for j in range(len(tile[i])): + prev[i][j] = tile[len(tile) - j - 1][i] + tile = prev + yield tile + + +def flips(tile: Tile) -> Iterator[Tile]: + yield tile + yield tile[::-1] + yield [line[::-1] for line in tile] + yield [line[::-1] for line in tile[::-1]] + + +def transforms(tile: Tile) -> List[Tile]: + # Can't use a set with lists... + res: List[Tile] = functools.reduce( + lambda l, it: l + [it] if not any(it == other for other in l) else l, + itertools.chain.from_iterable(map(rotations, flips(tile))), + [], + ) + return res + + +def borders(tile: Tile) -> Iterator[str]: + # They should match on same axis (i.e: go clockwise and counter-clockwise) + return map( + lambda s: "".join(s), + [ + tile[0], + [line[-1] for line in tile], + tile[-1], + [line[0] for line in tile], + ], + ) + + +Transforms = Dict[int, List[Tile]] +Tiling = List[List[Tuple[int, int]]] # Which tile, and which transform + + +def build_tiling(tiles: Tiles) -> Tuple[Transforms, Tiling]: + transform_mapping = {num: transforms(tile) for num, tile in tiles.items()} + trans_borders: Dict[int, Dict[int, List[str]]] = defaultdict(dict) + for num, trans in transform_mapping.items(): + for i, t in enumerate(trans): + trans_borders[num][i] = list(borders(t)) + length = math.isqrt(len(tiles)) + tiling = [[(-1, -1)] * length for __ in range(length)] + + def rec(x: int = 0, y: int = 0, used: Set[int] = set()) -> bool: + if x == length: + return True + for num, borders in trans_borders.items(): + if num in used: + continue + used |= {num} + + for trans, border in borders.items(): + top, __, __, left = border + if y > 0: + nid, ntrans = tiling[x][y - 1] + __, right, __, __ = trans_borders[nid][ntrans] + if left != right: + continue + if x > 0: + nid, ntrans = tiling[x - 1][y] + __, __, bottom, __ = trans_borders[nid][ntrans] + if top != bottom: + continue + tiling[x][y] = num, trans + + next_x, next_y = (x, y + 1) if y < (length - 1) else (x + 1, 0) + if rec(next_x, next_y, used): + return True + + used -= {num} + + tiling[x][y] = (-1, -1) + return False + + assert rec() + return transform_mapping, tiling + + +def solve(tiles: Tiles) -> int: + transforms, tiling = build_tiling(tiles) + return tiling[0][0][0] * tiling[0][-1][0] * tiling[-1][0][0] * tiling[-1][-1][0] + + +def main() -> None: + input = parse(sys.stdin.read()) + print(solve(input)) + + +if __name__ == "__main__": + main() From a550355ebe4626970a0288836742280b353c3d4e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 20 Dec 2020 14:26:57 +0100 Subject: [PATCH 143/479] 2020: d20: ex2: add input --- 2020/d20/ex2/input | 1728 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1728 insertions(+) create mode 100644 2020/d20/ex2/input diff --git a/2020/d20/ex2/input b/2020/d20/ex2/input new file mode 100644 index 0000000..3d3540f --- /dev/null +++ b/2020/d20/ex2/input @@ -0,0 +1,1728 @@ +Tile 1913: +##..#....# +.#.#.#.### +#...##.##. +.....#.#.# +.#......## +.........# +#...###..# +.#..#..... +.##...#..# +#.#...#... + +Tile 2579: +##...####. +##..#....# +...#...#.# +#.....###. +##..#...## +#....#..#. +.#.....### +.##...#... +#......... +...##..... + +Tile 1531: +.......### +.#....#### +.#.#.#...# +....#..#.# +.#.#.##..# +.#.#.#...# +#.##...### +##..#..... +#...#..... +##.##.#..# + +Tile 1493: +#.##.#.#.. +#.#..#.##. +..#.....#. +#.#.#....# +....#....# +...#####.. +#####.#.#. +#.##..##.. +..#.....## +.##..#.### + +Tile 3109: +########.# +......#.## +#....#...# +##.#.##... +....#.#... +#####...## +....#....# +..##...### +.......#.# +#.##.#.... + +Tile 3343: +###......# +#..#.#..## +...#....#. +#......... +..#.....## +.....##### +.....####. +##.......# +..#....... +#.......## + +Tile 2609: +####..#.## +#.#..#.... +....###..# +###..#..#. +#.#......# +##..#..#.. +#....#..#. +#......### +#..#....## +.#..#.###. + +Tile 1823: +###..#.... +..###...#. +..#.###... +...#.....# +#....#.#.# +.#..#.#..# +#..##.#..# +...##..... +....#.#.#. +###.##...# + +Tile 3391: +....#...#. +.#.#....#. +#......#.. +#..#....#. +#.##...#.# +...##.#### +....##..#. +##.#.#..## +.....#..## +#.#.#..#.# + +Tile 2753: +....###..# +.#..##.#.# +...#...... +..#.###.## +...#..##.. +....#..... +#......#.. +#........# +......#..# +#..#.#...# + +Tile 3989: +.#.###.#.. +#......##. +.##......# +.......### +###....### +##........ +##....#.#. +...#.#..#. +........#. +###..#..#. + +Tile 1877: +...###...# +#.#..##... +.##.###.#. +#.#....#.. +#..#.#.##. +#.......## +####..#.#. +##.#....## +.##....... +.#..##..## + +Tile 2729: +#...####.# +...#.....# +.###...... +...#..#..# +...#.#.#.# +.#.....##. +..#.....## +........#. +###....... +#..##...## + +Tile 1031: +##.#..#### +#.##.#.... +..#....... +#......### +.##.###.## +#...#...#. +#..##..... +#..#.#.#.. +....###... +....#.###. + +Tile 3803: +#..#..##.. +...##..#.. +...#.#.... +#.....#..# +#........# +.#..#.#.## +..#..#.#.. +#..#.#.#.. +..##..#.#. +#####.###. + +Tile 3541: +.##.#..#.. +.##..#...# +.#.#..#... +...#..##.# +..#.....#. +..##...... +.##......# +##.......# +.#..#.##.# +###.#.##.# + +Tile 3821: +.#.#.#.... +..#..##... +#.##...... +..#...#.## +#.####..#. +##.##.#... +..#..#.... +....#....# +...###.#.# +.#..#.#.## + +Tile 3853: +#####..#.# +.....#..## +#...#.##.# +.##....#.# +#.#......# +###...#.#. +##....#.## +#.#.#.#..# +....###... +##.#.#.... + +Tile 1249: +###...#### +..#....#.. +##.##....# +.........# +#......... +.##.#.##.. +...#...##. +.......... +##...#.#.. +##.####..# + +Tile 3673: +...##..#.# +.#..#..#.# +###......# +#.....###. +..#.#..... +#.#..#.### +.#.##.##.. +.##....#.. +.#...##..# +#.###..#.# + +Tile 3163: +##.#.##### +.##....#.. +####...... +#..#.#..## +.#.#..##.# +##.....#.# +.......#.. +#...#..... +..#..#.... +###.#...#. + +Tile 1759: +###.#...## +...#..#... +###..###.. +.#.#...#.# +.##...#... +..###....# +#.#.....#. +......###. +..#.####.# +##..##..#. + +Tile 1831: +.#...#...# +...#.#..## +#...#.#... +#...##.#.. +.#.#.#..#. +......##.# +.........# +#....##.#. +......#..# +#..#...##. + +Tile 2179: +.###.....# +..######.# +....#....# +...#....#. +#.##..#... +#..#....## +.#..#.#..# +..#.#....# +#.#.#..... +###.##...# + +Tile 2713: +..###.#..# +#.#.....#. +#....#.#.. +#...##.... +##...#.#.# +###..###.# +.##..#..## +.#...##.#. +#.#....... +#...#..... + +Tile 1889: +....#....# +......#.#. +##.###...# +.#..##...# +##.##.#..# +...#...##. +#....#...# +.......#.. +.#...#..## +.#.####.## + +Tile 1999: +##....##.# +#..#.##.## +..#...#... +#.....#... +......#... +#.....#..# +.#.##..#.# +..#..##..# +#...#..#.. +###..##..# + +Tile 2039: +.#....#### +.##..#.... +.#.......# +#........# +#.......#. +.#..#..... +#.##...... +##....#..# +.........# +#.#......# + +Tile 2969: +...#####.. +..#.#...## +##.....#.. +##.....### +#...#..### +#..#....## +#..##...## +.........# +#...##...# +.#......## + +Tile 2153: +.##..###.. +#.#..#..## +.#####.... +#.#..#.### +#.....#.## +####..#.#. +.......... +.#......#. +...##...#. +.#....#### + +Tile 2837: +..###..... +###.#.###. +.#....#... +##.....### +##.##..### +..#..##.## +.#....##.. +#..##.##.. +#..#...... +#..##...#. + +Tile 1619: +##..###.## +##....#### +.#..##.#.. +##.#...#.. +#..##.##.. +...#.#.#.# +.....#.##. +..##..#..# +#..#..#..# +......#.#. + +Tile 3943: +.#.##.#.#. +.......#.# +.........# +...#..#..# +...#....## +#.#.##.... +##.......# +.#..#.##.# +...##.#..# +#.##....#. + +Tile 3389: +#...#.##.. +#.##..#... +#.#.#..... +##...#...# +##.....#.. +.#..###..# +..###..... +#.##..#.## +####....## +##.#.##### + +Tile 3631: +##.###.### +#...#..... +..#....... +#....#.### +#......... +#.#....... +....##...# +........#. +#....#.... +.....#.#.. + +Tile 2081: +##..##.#.. +.##......# +........## +#.......## +......##.# +#....#.... +.#.#...##. +....##..#. +#.#..##### +...#####.. + +Tile 1579: +##........ +.....#...# +#......#.. +#..#.#...# +...#..#... +#.##....## +...#...... +.#...#..#. +..#....#.# +.##...#... + +Tile 3019: +.##..####. +...#....## +...##.#.#. +#....#.... +.........# +##..#..#.# +...#.#...# +.#.##.#.## +##..#..... +#..#..###. + +Tile 2089: +##.##.#... +..#.##...# +##...#.... +#........# +#..#.....# +..######.# +.......#.. +...#..##.. +#.#....#.. +...#.##### + +Tile 2297: +#.#.###... +#.##...... +#..#..#... +......#..# +#....#...# +###.#..##. +#....##.## +.......#.# +.........# +.###.#.#.. + +Tile 1373: +#..#.####. +........#. +....#....# +.##..#...# +.#.....#.# +#.....#... +#..#..#..# +.##...##.# +##.......# +.##..#.#.. + +Tile 1259: +...#..##.# +....#.#..# +#..#.##.## +##..##.... +#..#.#..## +#.#...#... +..#......# +...###.#.# +.......... +.###..##.. + +Tile 2411: +.###..#.#. +.#..#..#.. +#.....#..# +.#.....#.. +##..#...#. +.#........ +#...##.... +#.#..##... +.....#.#.# +....#.##.. + +Tile 3359: +.##..##.## +..#.#..#.# +#.......#. +.#..###..# +.#.....#.. +#......... +...#.....# +.##....#.. +.........# +.#.##..#.. + +Tile 2437: +.#.....#.. +#.#....... +....##.#.. +##.###.##. +##.#....#. +#...#....# +##..##..## +...#..#..# +....##.#.# +.##.#.#... + +Tile 1367: +....#####. +..#.#....# +##......#. +..##...##. +..##..##.# +..##.##..# +#.#......# +##...#...# +.....#.#.. +##.###.### + +Tile 3533: +##..####.. +##..#....# +...#.....# +#.##..#### +###..##... +....###..# +..#.....## +.##.#..#.. +....#.##.. +##.#.##.## + +Tile 1451: +.####.#... +..##.#.#.. +...#.#.... +.........# +....#...## +##...##... +..#...#... +#...#.#### +...#.#.### +#######... + +Tile 3457: +#.##.###.# +#..#.#.... +###.#....# +.#....#.## +.......##. +#...####.# +#.#####..# +#.#..#..#. +#.#....... +.#.##..... + +Tile 2657: +..#####..# +......###. +#.....#..# +.#..###..# +...#.##... +#.....#..# +#....##### +....#..#.. +#.#.###..# +.#..##.#.. + +Tile 2347: +#.##.#.### +#...#....# +.......... +#.#.#..... +#....#.... +#..#...### +#.##...#.. +#.....#..# +#.#.###.#. +#...###.## + +Tile 3923: +#.####...# +###...#.## +......#..# +..#..#..## +#....#.#.# +.........# +.....#.#.# +#..####..# +....##.#.. +#..#...#.. + +Tile 2593: +####...#.. +#...####.# +#......##. +..#..#.... +#..#.....# +...#...... +....#..... +#.#...##.# +.......#.# +#.#####.#. + +Tile 1103: +..##...#.# +..#.....#. +#....#...# +...##....# +#.#.....## +.#.#.#.#.. +#....##### +.#.#.##### +.........# +.##...#.#. + +Tile 2671: +.##.##.#.# +...#.#.... +##....#... +#......#.. +.#....#.## +........## +..#...###. +###...#... +....#.#..# +.#######.# + +Tile 3907: +###....#.. +..##.....# +.......... +##...#..## +##..#..##. +##..##..#. +#.#.....## +..###..#.# +#..#..#..# +#.#....... + +Tile 1327: +.#..#..#.# +.###.###.. +..#..#.... +.#...#.#.. +#.##.....# +#..#.#..#. +###...#... +##..#..#.# +......#... +#.#...###. + +Tile 1163: +..#.#...#. +####.#.#.. +.##.....## +#...#..... +.....####. +#...#..### +...#.##.#. +##..#..#.. +.....#.#.# +.###...#.# + +Tile 2683: +.......#.. +.#.#.##..# +##..#...## +...#...... +##.##...#. +...#.#.### +.#.##..... +#..#....#. +.###..#... +.#.#.....# + +Tile 3881: +#.#.#..##. +##.#...### +##......## +#......... +#..#...... +...#.#...# +.#..##.... +.....##.#. +##...#.... +###.....#. + +Tile 2711: +#...#.#.## +#..##..... +...#...... +#.#.#....# +#...#.#... +...#...... +.#.#...... +..#....#.# +#.##..#... +#.#.#..... + +Tile 3491: +.###..#.## +.....#.... +.##..#..## +##.##..#.# +.###....## +..##..#..# +..#......# +..#..#...# +#...#.#..# +.......##. + +Tile 2339: +###.#####. +.#....#... +##.#.....# +#......... +#......... +..##..##.# +.###...... +#...##.... +##........ +#.....#..# + +Tile 1543: +..##...#.. +.....#..## +....##.... +.........# +.#..#.#..# +.......... +.........# +#.#.#..... +##.#.#.... +#.#.###..# + +Tile 2371: +#..#.##### +##.#..###. +#.#...##.. +#...###.## +#...#..#.# +##.....### +.#.......# +.....#.#.. +..#.#.#### +.###..##.. + +Tile 2971: +..###.#... +#......... +##.#...### +....###... +###......# +..###....# +##.#.....# +.#.....#.. +#.....#### +..##.##.#. + +Tile 2203: +#.###.#.## +.#...##.#. +#.#.....#. +..#.#....# +##..#....# +##..#..... +#..#..#... +##........ +..#..#.#.. +##....#..# + +Tile 2113: +###...##.# +......#... +.....##.#. +....####.# +##..#..#.. +#...#...## +.......#.# +......#..# +#.##.#..## +....##.#.. + +Tile 1321: +.#..#..#.. +##...#...# +.......... +.####..#.# +##.#.#.#.# +#..#.#.... +#..#.....# +.#.......# +....###.#. +##.#.##.## + +Tile 1667: +.#####...# +##....#..# +#..#.#.... +..##..#... +#..##...## +...#...... +..#..#...# +.....#...# +#..#...#.# +##..#.##.. + +Tile 3001: +.#.####### +...#.#...# +..##...#.# +#......... +....#..... +#.....##.# +.....####. +#......... +...#.##.## +##.##..### + +Tile 1789: +..###.#..# +...##...#. +........#. +####...#.# +#..#..#... +##.##..##. +....#..... +#.#.#..... +#.#..#...# +######.#.. + +Tile 3677: +.#...#.### +#..##...## +#..#...#.# +##........ +..#....### +.......... +##..#.##.# +.#........ +......##.. +.##.##...# + +Tile 2693: +#.#.###.#. +#.#..#..#. +.#....#... +#..#...#.# +.#.##..##. +.##......# +...#.....# +##...#.### +.#.#.....# +########.. + +Tile 2141: +#####..... +#......... +#...#....# +....#..... +.......#.. +##..#.#..# +#....#..#. +..#....#.. +.....##.#. +##..#.#.#. + +Tile 3847: +#...###### +#..#.##..# +..#...##.# +##..#.#..# +##..#..#.# +##.##....# +#........# +#....#.#.. +#......... +#......#.. + +Tile 2333: +#.#..##.#. +####.....# +###..#...# +.........# +...##.#..# +###....... +..##...#.# +...###...# +.###.#...# +##..#.##.. + +Tile 2129: +#..###.### +....#....# +#.#.#..#.# +....#....# +#...#.#..# +..##.##... +#.##....#. +#...#.#... +.#..##...# +...###.##. + +Tile 1283: +.#..#.###. +###.#.##.# +#..#..#.#. +.....#...# +.#.#.#.... +#...#..#.# +.#.#..#.## +.#..##..#. +#....##.#. +.#..#...#. + +Tile 2851: +.##.#..... +###......# +.#........ +....#.#..# +.#..#..#.. +.##....#.. +.##...#.## +#.###.##.# +##........ +.#.#.#.#.# + +Tile 2311: +#..##....# +.#......#. +....#...## +....#...#. +.#...#...# +#...#....# +.....#.#.# +.....##..# +##..##.### +##..###.#. + +Tile 3217: +#.##....## +#.......#. +#.#....#.# +..##.###.. +....##...# +#......... +...#.#...# +..##....## +..#......# +##.###..## + +Tile 2833: +####..#..# +#...##.#.# +........## +..##..#... +.......#.. +......#... +###..#..#. +.##..#...# +##.#....#. +.####..... + +Tile 3593: +#..#####.. +.##.#....# +...#..#..# +##.#...##. +#######... +...#..#... +#.##..#.#. +#........# +#...##..## +........## + +Tile 3299: +...#.#..#. +#.#......# +##......## +.#..#..#.. +#.#####... +#...#....# +#.#....... +..#....#.# +.#........ +#.#.#.##.. + +Tile 2719: +...#..#.#. +#..#.###.. +......#.## +....#.#..# +#.#......# +....#..... +##..#.#... +...##..... +###.#....# +..####..## + +Tile 2161: +..#.##..## +#........# +...#.#...# +...###.... +......#..# +..##.##.#. +.#....#.## +#...#####. +#....#...# +.#....#... + +Tile 3643: +...#...##. +##......## +....#.###. +.#.#..#### +..#.#...## +.##.#.#.#. +#.#..#..#. +#..#.#..#. +.#........ +.#.###.... + +Tile 3767: +.##.#....# +#...#...## +.#...##..# +.#.#...... +..#..#..## +#..#.#.##. +#.....#.## +....##...# +.....#.##. +..#..###.. + +Tile 2377: +.#####.#.# +..#.....## +#...#...#. +##....##.. +....#..#.. +#.##..#..# +.#...#.##. +...##...#. +#....#.... +..#.#..### + +Tile 2441: +....#.###. +.#..#....# +.#.###.... +#...#..... +#.#.##.... +....##.... +....##...# +...#..##.. +#...###.## +.##.#.#.#. + +Tile 2273: +...#..#.#. +#..#...### +..#....#.. +...###.#.. +.........# +..##.#..## +###.#....# +#..#.....# +....#...#. +.##..##### + +Tile 1231: +....#####. +#.....#.#. +..#....#.# +.###..##.# +#..#....## +#..#.#.#.. +..#.###... +##........ +..#.....## +##.##..#.# + +Tile 2879: +#####.###. +#..#..#..# +...#..#..# +#......... +.#.#.#...# +...#..#..# +#.#..#.### +#.....#### +.......#.# +..##.##### + +Tile 2473: +.##.###..# +....##.#.# +#..#..#..# +..#.#.#... +#..##..... +.##....#.. +....##..## +...#.....# +....#..... +.#####.#.. + +Tile 3329: +#.#..###.. +......###. +.###..##.. +...#.##... +#..#.#.### +#.###..##. +##..##...# +..#####..# +.#...#.... +#.##.#..#. + +Tile 1489: +....#....# +#.##.....# +..#......# +..#...#..# +.#....#..# +#..##...#. +..####.##. +.#..##..## +..#.....#. +##.#.##..# + +Tile 3259: +..####.### +##.##..#.# +.#..#..### +#.#....... +.....#.#.. +##...#.#.. +.....#...# +.#....#... +..#.#....# +######.... + +Tile 1123: +....#.#.#. +...##..... +...##....# +#.##....## +..#...#..# +.#..#..... +.#......## +.........# +.....#...# +.##.###... + +Tile 1381: +.###..#.## +#..##..#.. +#.....#..# +#..#..#..# +#....#.#.# +.......#.# +#...#.#..# +##..###..# +..#..##... +..##.#..#. + +Tile 2903: +#.###.###. +#..###..#. +##.......# +.#....#... +#..#..##.# +...#...#.# +#.#...##.# +......#..# +##.#..#..# +##.#..##.# + +Tile 1049: +#....#.### +####.....# +#.##....#. +.#....##.. +.##..#..## +#.#.#..#.# +.##...#..# +...#..#.## +.....#..## +..#.#.###. + +Tile 3137: +...#.#.#.# +#.#....#.. +..###...#. +..#..##..# +.#.#.##.#. +#.#..##..# +#.....#... +##...##.## +#.#...#... +.##.#..... + +Tile 2131: +.#......## +...#...##. +.#.#.#.#.# +.......... +...#....#. +#.#.#..#.# +..#.#....# +....##.... +....##..#. +##.##..#.. + +Tile 3733: +.#.#....## +.#..#....# +..###.#..# +.....#...# +...#.....# +###..#.... +#...#.#### +......#... +..#..#.... +.#####.#.. + +Tile 1973: +.#.#.##... +#.....#..# +#......#.. +...#...#.# +..#..#...# +####.#.... +....#..#.# +.#.....#.# +....#..#.# +..#..#.#.. + +Tile 3889: +#.##.#...# +#....##..# +.###..#.## +..#...###. +#....##... +#.##...... +#.#..#..#. +...#.#...# +........## +##.#..#.#. + +Tile 1129: +#...###### +#...#.##.# +###.....#. +#.#..#..#. +.#....#... +..#...#..# +#....#.### +......#.#. +#.#..##.## +.###..#..# + +Tile 1549: +.#..##.#.. +#.#....### +...#..#... +##....#... +..##...#.# +#.#....### +..#.##.##. +.....#...# +#.##.....# +#..#.##... + +Tile 2213: +#...#.#.## +#........# +...##...## +.#..##.#.# +#..##....# +...##...## +##........ +....#....# +...#.#.#.# +..#.###..# + +Tile 1597: +..###..#.. +#......#.. +.......#.# +#.#....### +#.###..#.# +##.#.##... +#.##.#..## +.#.#..##.. +.##..#...# +##...##### + +Tile 1777: +#..#....#. +.........# +..#.....#. +..#......# +.##....#.. +#...#...#. +.#..#..... +#.....#..# +.#..##...# +#.#...#... + +Tile 2503: +#..###.#.. +.#..##.#.. +....##.... +..#..#.... +#....#.#.. +#.#....#.# +...#.#.... +..##.#.... +#.#.#....# +#.######.. + +Tile 3499: +.####...## +.#.##..#.. +#........# +..#......# +##..#...#. +#...##.... +#......#.. +.#.#....## +...#..#... +.##.#...#. + +Tile 1811: +#.###...## +..##...#.. +..#.#..### +##.#....#. +.#...#.... +##.......# +#....#...# +...##.##.. +...#.....# +.####..#.. + +Tile 3793: +###.####.. +##...###.# +...#.###.. +#....#.... +.....#.... +...#.....# +###.####.. +#.##.##.## +......#... +#.#.###... + +Tile 2341: +.##..#.### +.#........ +..####..#. +.#..####.# +#....#...# +......##.# +#.....#... +.......... +#..###.... +####.##### + +Tile 3613: +..#.#.#.#. +#....###.. +#......#.. +#.#...#.## +#..#.....# +##.#.#.#.. +...####..# +##...###.# +#.#.#....# +#..####... + +Tile 3701: +..##.####. +#.##...### +.###.#.... +#..#.....# +##........ +###..#.### +..#...#.#. +.##...#..# +##.......# +###.#...## + +Tile 1483: +#####..##. +....#..#.# +...#####.# +#.##...#.. +........#. +........## +##..##.### +.###....## +...###..#. +...#.#..#. + +Tile 3571: +#.#.##.##. +#......##. +#...#.#... +.#.#....#. +#.#....#.. +#.#...#... +##.....#.# +##.#.#...# +#....#...# +#.#..#..## + +Tile 2521: +##.##..#.# +......#..# +.#.#.#.##. +#........# +.#.##....# +.#....#.#. +##......#. +#....#.... +.#..#...#. +.#..#..### + +Tile 3413: +.##.##..#. +#...#..#.. +##....#..# +.......... +#..#...#.. +##..#....# +....#.#... +#.....#... +......#.## +..##.##.#. + +Tile 1933: +#..#....## +#...#..### +.#......## +......#..# +.......... +##.##..### +.......### +...#...### +.#....#..# +#.#..#.#.# + +Tile 1021: +.#..##.#.# +##....#... +.#........ +.#.#....## +.#......## +##........ +.....#..#. +#....#.#.# +#......... +..#.#.##.# + +Tile 3323: +...###.#.. +.#..####.. +....#..... +#.....##.# +###......# +..######## +.#....##.# +....##.##. +#..##....# +#.##.#..#. + +Tile 1607: +....####.. +##.#...#.# +.......#.# +#......... +..#..####. +..#..#.##. +.###.#...# +##...#.... +#.######.. +##.#.#.### + +Tile 1481: +.###...#.. +.#......## +.....#...# +...#...##. +#.###.##.. +#......### +#......... +###...###. +.#....##.. +#....###.# + +Tile 1879: +###.##.... +#.#.....## +#.#..#.#.# +.#...#..## +......#### +#.###..... +......###. +#..#.#..## +..#......# +.#..#..... + +Tile 2927: +###..##.#. +#..#....#. +##..#..... +#.#...#### +#......... +..###...## +#.####...# +#.##.##..# +...#...... +#....#.##. + +Tile 1867: +..#..####. +##.##..#.# +.##......# +###..#.... +..#......# +#..##..#.# +#......... +...#..#..# +#......#.. +.#....#.#. + +Tile 2647: +#####.##.# +...#...#.. +#.......## +...#..#..# +..#.###... +...##..... +..#......# +.##....... +#...#..... +##...##.#. + +Tile 2207: +#.#####.#. +#..#.#..## +...##....# +..#..#.#.# +#...###..# +.##.#...## +#..##..### +#......... +###.#..#.# +.#....##.# + +Tile 1223: +###.....#. +#.....#.## +##.##.#... +#...##...# +#....#.... +..#.##.... +##....##.. +..#..#.... +.#.##..#.. +###.#.#### + +Tile 1931: +##.#...### +#...##.... +#..#....#. +..##..#... +#...#..... +.........# +###.##.... +...##.#..# +.#.#.....# +..#..##.## + +Tile 3917: +.##.#..#.. +.......##. +#.##....## +...#....## +###....#.# +.##.#...## +###....... +##.....#.. +....###.## +....#...#. + +Tile 1663: +#.#.....## +.#.##.#..# +....#...#. +#...##...# +#..#...... +.#..#.#..# +..#..#..## +...#...... +#...##.... +.##.###### + +Tile 3373: +#..###.### +##...#.#.. +#..#..#..# +.#....##.# +..###..##. +...#.#...# +#.....#..# +##..#..... +.#..#.#... +.#...###.# + +Tile 1319: +.#.#.#.#.# +.....#..## +..#.#.#.#. +.#.##...#. +..##...... +...#...... +.#........ +#..#.....# +#..##....# +.#.##.#..# + +Tile 2687: +#...###.#. +##.#...##. +#...#...## +#..##....# +......#.#. +.###.#.#.. +##...#..## +......#..# +.......... +#.....##.# + +Tile 2003: +.######... +.##...###. +....#..... +#.###.#.#. +......#..# +..##.#.#.# +#.##..#.#. +####.#.... +#...#.#.## +......##.# + +Tile 1453: +###.#.#### +...###..#. +.#..#..### +..#......# +#.#..#..## +..#..#.#.. +#.#...#.#. +..##..#.#. +#..###.... +..#..#..## + +Tile 1871: +..#..##### +##..#....# +##.......# +#..#..#..# +#.....#.#. +#..###.... +.......... +.#........ +.#.##.##.# +#.#..#.### + +Tile 3709: +.##.#.##.. +.#..##...# +.##....... +..##.#.... +.........# +....#..... +###.#.##.. +.#####.... +#####.#... +..#..##### + From 9eb34faac03123d6073a9051ae0e758aa02630d9 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 20 Dec 2020 14:27:02 +0100 Subject: [PATCH 144/479] 2020: d20: ex2: add solution --- 2020/d20/ex2/ex2.py | 184 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100755 2020/d20/ex2/ex2.py diff --git a/2020/d20/ex2/ex2.py b/2020/d20/ex2/ex2.py new file mode 100755 index 0000000..c9e06a7 --- /dev/null +++ b/2020/d20/ex2/ex2.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python + +import functools +import itertools +import math +import sys +from collections import defaultdict +from typing import Dict, Iterator, List, Set, Tuple + +Tile = List[List[str]] +Tiles = Dict[int, Tile] + + +def parse(raw: str) -> Tiles: + def parse_tile(raw: List[str]) -> Tile: + return [[line[i] for i in range(len(line))] for line in raw] + + res = {} + for lines in map(lambda s: s.splitlines(), raw.split("\n\n")): + if len(lines) == 0: + continue + nums = int(lines[0][5:-1]) + res[nums] = parse_tile(lines[1:]) + return res + + +def rotations(tile: Tile) -> Iterator[Tile]: + yield tile + for __ in range(3): + tile = [ + [tile[j][i] for j in range(len(tile))] + for i in range(len(tile[0]) - 1, -1, -1) + ] + yield tile + + +def flips(tile: Tile) -> Iterator[Tile]: + yield tile + yield tile[::-1] + yield [line[::-1] for line in tile] + yield [line[::-1] for line in tile[::-1]] + + +def transforms(tile: Tile) -> List[Tile]: + # Can't use a set with lists... + res: List[Tile] = functools.reduce( + lambda l, it: l + [it] if not any(it == other for other in l) else l, + itertools.chain.from_iterable(map(rotations, flips(tile))), + [], + ) + return res + + +def borders(tile: Tile) -> Iterator[str]: + # They should match on same axis (i.e: go clockwise and counter-clockwise) + return map( + lambda s: "".join(s), + [ + tile[0], + [line[-1] for line in tile], + tile[-1], + [line[0] for line in tile], + ], + ) + + +Transforms = Dict[int, List[Tile]] +Tiling = List[List[Tuple[int, int]]] # Which tile, and which transform + + +def build_tiling(tiles: Tiles) -> Tuple[Transforms, Tiling]: + transform_mapping = {num: transforms(tile) for num, tile in tiles.items()} + trans_borders: Dict[int, Dict[int, List[str]]] = defaultdict(dict) + for num, trans in transform_mapping.items(): + for i, t in enumerate(trans): + trans_borders[num][i] = list(borders(t)) + length = math.isqrt(len(tiles)) + tiling = [[(-1, -1)] * length for __ in range(length)] + + def rec(x: int = 0, y: int = 0, used: Set[int] = set()) -> bool: + if x == length: + return True + for num, borders in trans_borders.items(): + if num in used: + continue + used |= {num} + + for trans, border in borders.items(): + top, __, __, left = border + if y > 0: + nid, ntrans = tiling[x][y - 1] + __, right, __, __ = trans_borders[nid][ntrans] + if left != right: + continue + if x > 0: + nid, ntrans = tiling[x - 1][y] + __, __, bottom, __ = trans_borders[nid][ntrans] + if top != bottom: + continue + tiling[x][y] = num, trans + + next_x, next_y = (x, y + 1) if y < (length - 1) else (x + 1, 0) + if rec(next_x, next_y, used): + return True + + used -= {num} + + tiling[x][y] = (-1, -1) + return False + + assert rec() + return transform_mapping, tiling + + +def trim(trans: Transforms, tiling: Tiling) -> Tile: + def trim_tile(tile: Tile) -> Tile: + return [line[1:-1] for line in tile[1:-1]] + + def tiling_to_tile(tiling: List[List[Tile]]) -> Tile: + res: Tile = [] + for i in range(len(tiling) * len(tiling[0][0])): + res.append([]) + tile_line_idx = i % len(tiling[0][0]) + for j in range(len(tiling[0]) * len(tiling[0][0][0])): + tile = tiling[i // len(tiling[0][0])][j // len(tiling[0][0][0])] + tile_row_idx = j % len(tiling[0][0][0]) + res[-1].append(tile[tile_line_idx][tile_row_idx]) + return res + + tiles = [[trim_tile(trans[num][id]) for num, id in line] for line in tiling] + return tiling_to_tile(tiles) + + +def find_monster(image: Tile, monster: Tile) -> Iterator[Tuple[int, int]]: + def monster_at(x: int, y: int) -> bool: + for i in range(len(monster)): + for j in range(len(monster[0])): + if monster[i][j] == " ": + continue + if image[x + i][y + j] != "#": + return False + return True + + # Returns upper left corner if found + for i in range(len(image) - len(monster)): + for j in range(len(image[0]) - len(monster[0])): + if monster_at(i, j): + yield i, j + + +def remove_monster(image: Tile, monster: Tile, x: int, y: int) -> None: + for i in range(len(monster)): + for j in range(len(monster[0])): + if monster[i][j] == " ": + continue + image[x + i][y + j] = " " + + +def solve(tiles: Tiles) -> int: + image = trim(*build_tiling(tiles)) + monster = [ + [char for char in line] + for line in ( + " # ", + "# ## ## ###", + " # # # # # # ", + ) + ] + monsters = transforms(monster) + + for monster in monsters: + for coords in find_monster(image, monster): + remove_monster(image, monster, *coords) + + return sum(sum(char == "#" for char in line) for line in image) + + +def main() -> None: + input = parse(sys.stdin.read()) + print(solve(input)) + + +if __name__ == "__main__": + main() From 2302d6e0ae98c153857dd9075aa1d597f21b7415 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 21 Dec 2020 12:04:10 +0100 Subject: [PATCH 145/479] 2020: d21: ex1: add input --- 2020/d21/ex1/input | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 2020/d21/ex1/input diff --git a/2020/d21/ex1/input b/2020/d21/ex1/input new file mode 100644 index 0000000..3860abd --- /dev/null +++ b/2020/d21/ex1/input @@ -0,0 +1,40 @@ +zdmhtpg mlcvjc kgdvd htxvfq lxgxp kqxz pfhfb fnkdvt ccn vhbjp hqhnh xcljh ndnlm shc ncrn nrdtprm skrxt qrdpc dcvtrq gdmv nxcrg hhxch mv dscm qzln zjlz qkbm dmjzc fjqv jqlp zcxthb sdclrlb bbtn jrspd lqbcg gdljd mvtkk zbhp hcc ntbqk lvft glj fsr hnh nvnx dvjrrkv fdqp lctltv hjn mknsj gtsslgk (contains sesame, shellfish, dairy) +gtdb nxcrg fzl gtsslgk sgdlhb fzckq mknsj kscd dgdn svzfl mlcvjc ntbqk ctkjrt gdmv tkvddn rzhktt zgcf jfm gzhlbn kphbtmkx mgbv pkrdz fsr drj lqgn tgkgj ndnlm zczht tlv qkbm ccn hhxch lgjsd dvjrrkv qfgbx rqxfdd hrtd ktsnt jmt kgfld mxm knfx kshg nhlxntg zdmhtpg qpp mv ssk tgxvz brjcp skrxt xjksh fsxf tpdc crjddsgj hcrsbr bgc jqlp dmjzc hxgdp xcljh xjqkbq hnh bsgnsc gqkf bzlnnv jjmmn gbmv zdqd zbhp (contains dairy) +hxgdp nkgzzg tgxvz tgkgj hqhnh fdjrml gnnzj fsxj zbhp rqxfdd ndnlm fsr nrgn hhxch gnq sgqrvd sm qjktms jjmmn xcljh qzln jqlp nxcrg bsgnsc jxftql lxgxp kgfld jmt ntbqk kvqq fnkdvt gppfld flg kscd jjdgtt nvnx vhbjp nhlxntg zkhpc bgjcg tpdc jkgf tnvtm rnln mgbv nrdtprm cntfq brhmkh rnsqjkq mv dvjrrkv crjddsgj mxm nqbjlf pkrdz xvzlpx dmjzc brjcp hcrsbr nkcl skrxt zfqhnt rglsgs pfhfb nsnzxsc ncrn fzckq rzhktt dcvtrq zgcf qgl (contains soy, wheat, sesame) +sgqrvd dvjrrkv qszr brhmkh znzx tkvddn mgbv kgpbh gtdb gdmv zjkt zdqd mhqxk cntfq hrtd sgdlhb lxgxp zbhp bgjs hxgdp rfcl lvft qgl ndvnj glj ptcnh xjqkbq zkhpc bgc rnln xntpsg xvzlpx zfqhnt xxbnf ntbqk tgkxxjm ncksb flg nrgn kqxz hkdls gqkf fjqv qpp krhmfb fdjrml tmlm tpdc rpqss qzln ckzg xcljh jdcbc kgfld ndnlm kvhbj svzfl jfm nrlbfc tkxxdnh fsr qjn lqbcg sdclrlb nxcrg gnq vchxzh rzhktt tvgcv (contains shellfish) +pfhfb rpqss bzlnnv vchxzh ctkjrt hjn ckzg hpsrqbl nzxs zcxthb jmt lqbcg ndvnj qbvxrbs dvjrrkv jvgbct zjkt ndnlm nrgn mxm xcljh rzhktt fnkdvt hcc knfx tgkxxjm hqhnh bhghks kgfld tkqp qgl tkvddn gzhlbn rglsgs jjdgtt kvqq gfq zmnflgt fsr qjktms ssk jdcbc kshg dgdn jfm gzthtlg mkmcq tpdc nxcrg mgbv xjqkbq qkbm qpp rnln zbhp chjqncr sm jxftql xjksh tnvtm gbmv tgxvz zczht tkxxdnh kssncfd ptcnh bdfmncs mvtkk rfcl zkhpc qjn xxbnf gdmv fzl lxgxp mhqxk (contains soy, dairy) +xjqkbq xvzlpx nqbjlf qbvxrbs gtsslgk bqjqf sdclrlb ccn qpp nsnzxsc zmnflgt pkrdz ndnlm bsgnsc zgcf zbhp tgkgj jfm lvft nrgn xcljh shc bpvmb ltjt jjdgtt dvjrrkv ckzg mgbv sm hxgdp fsxf nhlxntg kqxz kvqq gzthtlg pfhfb htxvfq nvnx jxftql lgjsd sgqrvd skrxt cntfq glj bgjs mxm bbxsn rpgrk tmlm fsr rqxfdd bgjcg qkbm fdqp hpsrqbl gppfld vchxzh svjp qjktms rnsqjkq nxcrg mv tgxvz krhmfb nxcsxc zcxthb hcrsbr qjn tnvtm qrdpc lvtj qfgbx fjqv rpqss nkgzzg (contains fish, wheat, sesame) +jdcbc prgj rnln zdqd zbhp cntfq mgbv gfq dgdn sm gdmv hkdls hnvhqczc ltjt ckzg skkt tkvddn lsll ndnlm flg nxcrg kgpbh zjlz dvjrrkv zgcf mhqxk gnq qgl ccn hcc hvrrhc bgc rpqss gqkf hqhnh nxbn bsgnsc lqgn gzthtlg xcljh jxftql nrdtprm bdfmncs bhghks kgfld zczht hrtd lqbcg rqxfdd bbtn dmjzc fsr mkmcq zkhpc (contains sesame) +nqbjlf dcvtrq cntfq sdclrlb kvhbj skkt jvgbct xjqkbq knfx lsll zdmhtpg hnh fnkdvt gtdb tgxvz xjksh gzthtlg bhghks qpp zgcf ptcnh mvtkk pfhfb jjmmn ktsnt kpzbxfp tgkgj glj rfcl fsr fsxf lqgn gppfld ssk mlcvjc mhqxk kqxz kshg jjdgtt tvgcv xcljh qszr prgj gfzjc jmt qrdpc hhxch bgc mgbv zbhp kssncfd nhlxntg hkdls bgjs gfq nxcrg hcc fdqp lpm jrspd bsdc nrgn dscm bzlnnv bpvmb qjn nkgzzg rglsgs fjqv xvzlpx xxbnf qjktms xcsxh lqbcg bdfmncs qbvxrbs nkcl skrxt hxgdp ndnlm vhbjp nxcsxc flg nxbn kgpbh (contains soy, wheat, peanuts) +zjlz jdcbc nkcl rpqss gqkf lsll flg zbhp ltjt jmt fzckq rnln mknsj ccn qkbm chjqncr lfgh bsdc bzlnnv bbtn fsr skrxt kvhbj hpsrqbl kgdvd lpm dvjrrkv ptcnh tnvtm sgdlhb rfcl gtdb tvgcv rpgrk mkmcq hvrrhc qjktms bsgnsc zsggkm pvnr shc zcxthb lhcm bqjqf fzl rnsqjkq lqgn brhmkh jkgf mv xntpsg mgbv fdjrml dgdn mhqxk ktsnt xcljh qfgbx tkvddn xjksh lqbcg pkrdz brjcp bbxsn (contains fish, peanuts) +xjcvt kgfld gbmv fsxj bqjqf qgl rnln hcrsbr nxbn zcxthb zfqhnt skrxt tgkxxjm dscm hkdls dvjrrkv lvtj gdljd zmnflgt pkrdz xcljh bsgnsc zjkt zkhpc xxbnf tpdc znzx tgkgj qszr bbxsn qfgbx rzhktt rfcl xcsxh ctkjrt bgjs mhqxk mgbv qrdpc ktsnt jjmmn fmcnhq tkxxdnh jrspd qkbm qpp qbvxrbs kshg prgjph skkt mvtkk ncksb hpsrqbl kphbtmkx dgdn ncrn fnkdvt dcvtrq mv nrdtprm kvqq zdqd gzhlbn drj vchxzh fsr nrlbfc zsggkm tlv bgc sgqrvd lctltv mlcvjc lsll hnnmrxh lfgh bgjcg ntbqk htxvfq rnsqjkq hrtd bhghks gtsslgk dftg lqbcg jqlp zbhp qjn bdfmncs (contains peanuts, sesame) +zkhpc lpm fdqp kpzbxfp hkdls mlcvjc bgjs qckqc ndnlm skrxt zdmhtpg dgdn nkgzzg qjn tvgcv brjcp bsdc kshg kgdvd xcljh crjddsgj jvgbct glj xjksh xvzlpx shc mxm gzhlbn ctkjrt ckzg fsr rnsqjkq mgbv rpgrk zdqd rnln gdljd dcvtrq fjqv fmcnhq svzfl fdjrml hrtd dmjzc nxcsxc sgdlhb mhqxk jdcbc qzln dscm zbhp bbxsn fnkdvt kgpbh zjkt tgkxxjm lhcm ptcnh skkt jqlp mv nrdtprm gtdb htxvfq cntfq tnvtm lqbcg (contains soy, nuts) +ntbqk ccn pkrdz krhmfb hkdls kgpbh bhghks bqjqf hpsrqbl bpvmb fzckq nhlxntg pfhfb xcljh bzlnnv nkgzzg cntfq zbhp jqlp ndnlm tlv qbvxrbs nrdtprm gdmv ssk mgbv gdljd dvjrrkv bsgnsc tpdc rnsqjkq znzx flg fsr zlfm zjkt nvnx glj knfx lqbcg hjn (contains wheat, sesame) +qjn sgdlhb rnsqjkq gdljd dvjrrkv nkcl jxftql kssncfd jvgbct kgfld bgc nxcsxc ndnlm nrdtprm kpzbxfp fsxf gnq vhbjp nvnx hvrrhc tgxvz nsnzxsc tvgcv xvzlpx prgjph kqxz fsr hnnmrxh lqbcg hkdls glj ctkjrt zdmhtpg qszr nhlxntg gqkf tlv hxgdp nrgn ndvnj qckqc xntpsg ltjt rnln zbhp gdmv xxbnf hhxch fnkdvt knfx xcljh kgdvd bdfmncs gfq lpm mkmcq skrxt hnvhqczc krhmfb dftg gtsslgk gzthtlg flg zgcf zkhpc brhmkh pvpfn ssk dgdn bsdc jdcbc (contains fish, sesame, dairy) +bpvmb jvgbct nrgn zbhp dvjrrkv bqjqf mkmcq xcljh fsxf mknsj kssncfd lqbcg skrxt tvgcv xbdhth tkvddn nrdtprm mhqxk chjqncr ndnlm lctltv hnnmrxh rpgrk ccn rnln jdcbc gdljd dmjzc svjp lsll bdfmncs rnsqjkq qgl prgjph hqhnh xjqkbq jjmmn hcrsbr xcsxh drj cntfq fsr bsgnsc rfcl pvnr flg tgkxxjm zczht shc (contains soy, shellfish, sesame) +mlcvjc prgj xntpsg pfhfb gtsslgk nrgn kvqq lhcm fmcnhq qgl nrdtprm hcrsbr tgkxxjm lctltv fnkdvt hjn tvgcv prgjph zjlz rpqss bzlnnv zbhp dftg mkmcq tnvtm rqxfdd mknsj fsr xjqkbq pkrdz dscm gdljd nxcrg sm svjp ndnlm zlfm bgjcg rglsgs lvft mhqxk kpzbxfp lpm rnsqjkq ccn skrxt gqkf mxm gzthtlg dmjzc flg tkqp bgjs qpp bsgnsc cntfq skkt gtdb lqbcg xcljh gnnzj hqhnh jjdgtt gfzjc zgcf brhmkh sgqrvd dvjrrkv (contains shellfish, sesame) +dvjrrkv ccn lqbcg lctltv jvgbct tkqp hxgdp lhcm zsggkm bgc qjktms zjkt nvnx nxcsxc kqxz skrxt bhghks gzthtlg chjqncr htxvfq mv rnsqjkq sgdlhb crjddsgj rglsgs nrgn ndvnj ltjt hhxch xcljh hrtd fmcnhq nkgzzg dscm ncrn zbhp mgbv prgj pfhfb tgkgj hpsrqbl kscd lxgxp bbxsn gdmv tgkxxjm glj nzxs tpdc fsr tmlm lgjsd bsgnsc qjn rqxfdd hqhnh cntfq (contains fish) +hpsrqbl brjcp qpp shc tgkxxjm bbtn xcljh gbmv znzx jkgf zcxthb jjmmn zczht bgc lvtj drj rzhktt tkxxdnh tlv dcvtrq nsnzxsc hkdls tvgcv dvjrrkv qkbm knfx zjkt mhqxk bpvmb ckzg bgjs gfzjc bhghks gtdb nzxs gnnzj sm jjdgtt zjlz rnln xjqkbq ctkjrt xvzlpx xntpsg htxvfq tmlm zdqd lqbcg fsr ndnlm rfcl kgdvd skrxt mgbv hhxch mknsj hxgdp fjqv ssk qszr hqhnh xcsxh chjqncr dmjzc crjddsgj prgjph dscm sgdlhb hjn cntfq bsgnsc qjn nvnx sdclrlb jqlp ncksb (contains sesame) +fnkdvt nxcrg sgdlhb kshg glj jvgbct tlv lgjsd qbvxrbs tgkxxjm xcsxh jfm fdjrml mgbv kvqq xbdhth fsr rpgrk qkbm hjn rfcl dftg tkxxdnh mhqxk nsnzxsc zgcf dvjrrkv fzckq prgjph lqbcg skrxt bgc hpsrqbl lsll tmlm bgjcg gtdb nvnx qszr lxgxp zbhp hcc tgxvz xjqkbq nxbn fdqp zdqd xxbnf fsxf ltjt ptcnh xcljh tkqp tkvddn nrlbfc jqlp jrspd (contains fish, peanuts) +nzxs ckzg nrlbfc nsnzxsc xbdhth pvpfn tvgcv tmlm mvtkk ncksb mhqxk ltjt zbhp fjqv rfcl tkqp lpm gzthtlg hkdls hcrsbr qckqc bhghks qgl kvhbj nkcl jmt lhcm bgjcg flg nqbjlf kvqq kqxz xcljh nrgn pvnr bzlnnv lqgn gnnzj bdfmncs ccn lvtj xjcvt dvjrrkv jjmmn qrdpc ntbqk sgqrvd kscd hcc cntfq gnq tgkgj jxftql jrspd fzl fsr lqbcg qkbm mgbv brjcp bgjs gtdb drj qjktms bqjqf hxgdp skkt prgj kssncfd xntpsg hhxch fsxf hqhnh qpp nxcsxc jvgbct qjn lfgh ndnlm mknsj zjkt mlcvjc lgjsd (contains shellfish) +qgl rnsqjkq hnnmrxh lsll nkcl fsr qjktms ndnlm krhmfb rpgrk xcljh jfm lfgh xntpsg skkt gdmv dvjrrkv zbhp kphbtmkx lhcm vhbjp mgbv zsggkm fsxf ccn nrgn nrdtprm bpvmb znzx bbtn dgdn bhghks zjkt svzfl jjmmn tlv bsgnsc bgc qkbm skrxt bgjcg fdqp ltjt rfcl bgjs rnln gtsslgk zjlz (contains wheat) +nhlxntg hqhnh qfgbx kssncfd zkhpc bdfmncs zcxthb drj sgqrvd lqgn rqxfdd hvrrhc prgj tgkgj nrdtprm skrxt jxftql fsr xcljh qpp shc zbhp qjktms zsggkm ccn chjqncr znzx pkrdz prgjph ntbqk ndnlm nrgn kgdvd tkxxdnh tpdc dvjrrkv qzln knfx nkgzzg rnsqjkq kpzbxfp bbtn tkqp mgbv rzhktt lhcm rglsgs fdqp fmcnhq gzthtlg nvnx ssk bhghks kvhbj hhxch tlv fnkdvt htxvfq zfqhnt xvzlpx lpm qszr hnnmrxh hcrsbr jqlp nsnzxsc (contains dairy, peanuts, wheat) +gfzjc hhxch rzhktt gtdb ssk zbhp zfqhnt jkgf tkqp dvjrrkv kgpbh mknsj bsdc lgjsd mgbv zcxthb hrtd nqbjlf mlcvjc hxgdp tgxvz gqkf fmcnhq tpdc lxgxp hcrsbr znzx zlfm fjqv kvqq nhlxntg zjlz brjcp zkhpc skrxt nrlbfc jdcbc qfgbx svzfl fzckq kgfld prgj gzhlbn lhcm qkbm fsxj hqhnh kscd vhbjp fsr lsll qbvxrbs gfq tnvtm lqbcg nkcl ndnlm sgqrvd xjqkbq (contains wheat, shellfish, fish) +gdmv bbxsn kvqq hnvhqczc lqbcg xjqkbq jvgbct mlcvjc gfq jrspd lxgxp jkgf tkvddn bsgnsc lqgn xcljh fsxf qjktms dscm mgbv fsr ndvnj nrdtprm jjmmn xvzlpx nkgzzg rnln nxcsxc zjkt sdclrlb nhlxntg kphbtmkx gnq zbhp fzckq zlfm hvrrhc zsggkm xcsxh ntbqk skkt jdcbc bgc bsdc prgj shc nzxs bpvmb hcc ncrn xjcvt nrlbfc jqlp ktsnt nvnx gnnzj tkqp nxbn ndnlm sgdlhb bqjqf kqxz qzln zjlz tkxxdnh bdfmncs kpzbxfp hrtd fzl skrxt sgqrvd zdmhtpg dftg fnkdvt lgjsd mv (contains nuts, fish) +nxcrg jqlp xcljh nkcl qjn rpgrk xbdhth vhbjp kqxz zfqhnt nrdtprm ltjt tkxxdnh rqxfdd fdqp bsdc gzhlbn bpvmb ndnlm bbtn skrxt jdcbc fmcnhq pkrdz zsggkm rzhktt ccn gbmv ncrn rglsgs dmjzc sgdlhb prgjph lpm zcxthb dftg qjktms pvnr hnnmrxh kssncfd bdfmncs bhghks lhcm lgjsd ssk bgc fsr gfzjc rnsqjkq zbhp lqbcg krhmfb mkmcq zlfm brhmkh xntpsg hnh bsgnsc dvjrrkv tvgcv sm fdjrml prgj hhxch tpdc fsxf nkgzzg nzxs gnq tmlm (contains dairy) +nrlbfc nxcsxc jvgbct dvjrrkv prgjph gqkf ndnlm lhcm mvtkk xcsxh gtsslgk mgbv kgpbh zbhp qbvxrbs kshg gfq ktsnt bbxsn hjn jfm jxftql jmt xbdhth xcljh zmnflgt kgfld nrgn fnkdvt fdqp skrxt svzfl bgjcg sgqrvd ssk svjp sgdlhb vchxzh kgdvd dgdn xntpsg tpdc zjlz zgcf rnsqjkq zlfm chjqncr tmlm dftg tgxvz jkgf lpm hcc qjn tkxxdnh lqbcg kscd lctltv pvnr ntbqk lsll qszr mv hvrrhc fjqv (contains wheat) +vhbjp fsxj jxftql tkxxdnh nzxs fnkdvt fmcnhq lgjsd chjqncr xcljh brjcp hrtd kssncfd ssk mgbv xvzlpx bgjs rpgrk kgfld gbmv ndvnj ccn rnsqjkq xjksh ncrn brhmkh lxgxp qzln zdmhtpg tkvddn lsll nrgn pvpfn lqgn nxbn lvtj dvjrrkv dscm bsdc hqhnh mxm fsr nrdtprm skrxt nhlxntg tpdc mkmcq bqjqf lhcm hxgdp jkgf hkdls fsxf jmt fzl kshg xjcvt lqbcg jdcbc flg rnln ktsnt zbhp gqkf kphbtmkx rglsgs (contains wheat, sesame, dairy) +fmcnhq prgjph jdcbc gtsslgk xcljh fsr zdqd hnh bzlnnv krhmfb mknsj nrdtprm kgpbh lpm tnvtm zbhp fzckq xcsxh lvft hqhnh hcrsbr jfm bsgnsc qfgbx mgbv lsll qjn hrtd tkvddn sdclrlb dscm lxgxp jjdgtt kqxz zjlz tlv xjksh fdqp ptcnh rglsgs dvjrrkv flg ntbqk bsdc xjqkbq gdljd jmt zjkt gdmv fjqv nxcrg zczht bbxsn nkgzzg zmnflgt skrxt ndnlm brhmkh glj zfqhnt tkxxdnh gqkf (contains peanuts, shellfish) +svzfl bdfmncs mlcvjc xjksh fsr shc ssk mknsj tkqp znzx hqhnh zdqd jjmmn svjp ndnlm lctltv tkvddn bzlnnv jrspd kssncfd zjlz pvpfn fdjrml tgkgj nrgn nvnx bqjqf hpsrqbl hnh rnln zjkt fdqp zlfm xjcvt gbmv tkxxdnh kgdvd mgbv dftg jdcbc fnkdvt tvgcv pkrdz zkhpc lqbcg jmt kvhbj nxcrg nsnzxsc gzhlbn zbhp gdljd skrxt skkt mv qjktms dvjrrkv (contains shellfish) +zjlz gzthtlg vchxzh zfqhnt dftg bdfmncs ndnlm dvjrrkv vhbjp shc znzx fdqp fsr svjp nrdtprm tgkxxjm zbhp nxcsxc ndvnj jjdgtt qjktms mhqxk skrxt rglsgs pvpfn xvzlpx jfm prgjph mlcvjc fmcnhq gppfld tvgcv qszr pvnr bsdc bqjqf jxftql hpsrqbl qjn zkhpc qzln crjddsgj lsll bgjcg fdjrml tgxvz ssk lpm brhmkh zczht zcxthb jrspd ltjt lxgxp lqbcg xcljh dgdn gdljd rfcl rqxfdd tpdc (contains nuts, sesame, dairy) +qjn nrgn pvpfn bsgnsc xxbnf jvgbct pfhfb lqbcg zsggkm xbdhth lvtj xcljh tlv lsll lqgn nrlbfc qckqc hrtd shc sgdlhb zcxthb ssk bdfmncs hkdls tnvtm nxbn jfm hnnmrxh dvjrrkv skrxt jdcbc ndvnj jjdgtt jjmmn gtdb hjn tmlm gdljd ndnlm nhlxntg hnh kpzbxfp bgjs fsr jqlp qjktms zczht rnsqjkq zbhp vhbjp brjcp (contains wheat) +hqhnh fsr zbhp nrgn zlfm ndvnj nkgzzg kgdvd ssk qckqc sdclrlb ptcnh bpvmb brhmkh dvjrrkv rpqss fnkdvt lfgh gdljd tvgcv nxcsxc dmjzc fmcnhq qzln sgdlhb qjn zmnflgt vchxzh tkvddn xcljh dgdn bgjs hhxch pfhfb lqbcg kscd lhcm nrlbfc pkrdz htxvfq skrxt znzx ntbqk hkdls ktsnt bzlnnv rnsqjkq ndnlm sgqrvd tlv hcc zjlz gzthtlg jkgf svzfl tkxxdnh pvpfn nxbn ccn gzhlbn rqxfdd qfgbx rnln bqjqf qrdpc kgfld hnvhqczc gnq knfx tmlm nvnx zdqd zsggkm hjn jqlp gqkf bgjcg fdjrml (contains shellfish, dairy, sesame) +dmjzc qgl jjmmn mgbv qjktms qszr zlfm kgfld qkbm xjksh hnvhqczc xjcvt fsxj hjn fjqv rglsgs zbhp ccn kshg bsdc pvnr bgjcg nvnx hnnmrxh cntfq rpgrk gqkf shc nxbn qrdpc jrspd ktsnt brjcp dvjrrkv tgkxxjm jkgf kgpbh kgdvd zfqhnt lfgh ncksb nrdtprm vchxzh fsxf zdqd kphbtmkx skrxt flg gtsslgk zgcf tvgcv dftg lpm nxcrg dgdn xcljh qfgbx nzxs gbmv sgdlhb gdmv jdcbc fsr zjlz ctkjrt xntpsg hcc tkqp ptcnh gdljd rfcl znzx hpsrqbl xjqkbq jfm lqbcg nqbjlf mlcvjc tgkgj xbdhth zkhpc kscd nkgzzg svzfl sm jvgbct htxvfq rnsqjkq hnh mkmcq (contains wheat, sesame) +rnsqjkq zsggkm jqlp zdmhtpg bpvmb svjp pkrdz fsxf tkxxdnh zczht dcvtrq ndnlm cntfq jfm nkgzzg rqxfdd nrlbfc bzlnnv mkmcq fjqv tpdc hnh gtdb nxbn bbxsn mgbv pvpfn ncrn qfgbx sgqrvd knfx xjcvt brhmkh tvgcv gqkf prgjph qgl nvnx hqhnh dvjrrkv lfgh mknsj qzln jxftql kscd gtsslgk kpzbxfp hjn xcsxh gnq dmjzc xjksh tgkxxjm gzthtlg rzhktt zjlz kphbtmkx fsr fdqp sm bbtn lqbcg crjddsgj shc zbhp rglsgs nkcl hxgdp rfcl kgfld qrdpc skrxt gdljd znzx drj mlcvjc (contains shellfish, nuts, dairy) +svzfl fsxj jjmmn chjqncr lqbcg mxm zkhpc rqxfdd gnq kshg zczht gdljd ndvnj fzl rfcl dftg qbvxrbs qfgbx ndnlm mlcvjc mgbv bgjcg bpvmb vhbjp htxvfq lpm nrdtprm hnvhqczc gppfld brjcp jkgf rnsqjkq fzckq rglsgs dmjzc skrxt nsnzxsc kssncfd xcljh zbhp tgkgj kphbtmkx dgdn fsr knfx zdqd jqlp zfqhnt svjp (contains dairy) +nrlbfc bgc hhxch lsll qfgbx bsdc hqhnh tnvtm gnnzj gtdb dmjzc fsr lqbcg hrtd kvqq lgjsd jjmmn xjksh ncksb jvgbct vchxzh ndnlm htxvfq zkhpc fsxj ctkjrt lxgxp gdljd mgbv sdclrlb hnh kscd gzhlbn zdqd flg ncrn ckzg vhbjp mv jfm ptcnh gbmv sm kphbtmkx hcrsbr rpqss skrxt kgpbh kssncfd lvft bgjcg zczht bgjs nrdtprm xcljh bpvmb qckqc nzxs kqxz gdmv bzlnnv ndvnj jxftql hkdls jkgf xjqkbq hnvhqczc lfgh prgj mlcvjc pfhfb zbhp dgdn qrdpc nvnx prgjph bdfmncs nxcsxc tmlm jqlp tkqp sgdlhb fnkdvt qjn fzckq bsgnsc qbvxrbs (contains shellfish, peanuts, dairy) +bzlnnv zcxthb ndnlm jrspd lctltv mvtkk zjkt hqhnh fjqv gppfld zbhp sgdlhb knfx qfgbx hkdls jqlp pkrdz jxftql kvqq zkhpc gbmv fdjrml sgqrvd fmcnhq dcvtrq hnnmrxh tpdc kscd skrxt bsdc qzln xcljh lqbcg pvnr rpqss qckqc shc rnsqjkq dvjrrkv qrdpc znzx mgbv ssk gtsslgk bgjcg kqxz pvpfn hnvhqczc ptcnh bpvmb bbxsn hrtd hvrrhc gnq bgjs nxbn nxcsxc tkvddn qgl ndvnj (contains shellfish, nuts, wheat) +tgkgj kgpbh brhmkh bbxsn rnln mgbv bpvmb pvpfn rqxfdd hrtd kpzbxfp gtdb bbtn dgdn gfzjc kshg ltjt flg nrgn qrdpc chjqncr jrspd nrdtprm crjddsgj bdfmncs bhghks ncksb hkdls zlfm dvjrrkv gtsslgk sgqrvd sgdlhb xntpsg zbhp dcvtrq lxgxp gfq kphbtmkx lqbcg bqjqf qjn zkhpc xbdhth qzln bgjcg jkgf ncrn nxbn znzx nxcsxc brjcp nqbjlf zdmhtpg tgxvz fsr nrlbfc prgjph gppfld qkbm xcljh rzhktt ndvnj ndnlm fjqv hvrrhc (contains peanuts, dairy, soy) +tpdc nkcl nqbjlf ncksb crjddsgj prgj htxvfq gtdb bzlnnv nvnx hkdls fzl dvjrrkv sdclrlb tkqp xcsxh bqjqf hrtd dscm pfhfb svjp rqxfdd hvrrhc nrdtprm mgbv xjqkbq zkhpc zczht rfcl fsr rnsqjkq zbhp nhlxntg ndnlm jqlp bsdc hjn ntbqk gtsslgk brjcp rzhktt tlv tgkxxjm knfx ssk xjksh nxcrg dmjzc kgpbh nrgn lvtj svzfl shc mlcvjc lgjsd gbmv kvqq mhqxk nxcsxc gzhlbn tmlm zcxthb zfqhnt qpp xcljh lctltv hcc kscd fjqv mxm qrdpc zdmhtpg kvhbj skrxt qszr ptcnh xvzlpx zgcf dcvtrq bbtn zlfm jjdgtt jxftql fdqp xntpsg (contains fish, shellfish, sesame) +fsr dvjrrkv ckzg zjlz cntfq hcc nqbjlf svzfl ssk vchxzh nkcl zbhp mgbv hcrsbr fsxj xcsxh ccn rpgrk bhghks qckqc ptcnh gdljd hxgdp qkbm mvtkk rnsqjkq rnln prgjph gppfld dftg mlcvjc gtsslgk bgjcg bgc jdcbc zczht lctltv gfzjc svjp xvzlpx sdclrlb skrxt qfgbx nxcrg dcvtrq shc sgqrvd tgkgj kphbtmkx fzckq bqjqf crjddsgj nhlxntg jqlp gzthtlg zgcf ctkjrt zmnflgt bbtn drj ndnlm rpqss lvft xcljh (contains shellfish) +pkrdz ndvnj znzx xjksh zbhp hrtd kscd kgdvd ctkjrt zsggkm fzl zjkt zdmhtpg xcsxh tkqp lqbcg kssncfd bbxsn bzlnnv mgbv kgpbh krhmfb nsnzxsc ssk prgjph fmcnhq lfgh bgjcg fsr bbtn brjcp kqxz nxcrg skrxt rfcl kvqq brhmkh qbvxrbs hpsrqbl lgjsd kphbtmkx nzxs ndnlm bsgnsc mv xvzlpx ncksb nrgn rpqss tmlm nkcl dvjrrkv tnvtm lpm xbdhth sgqrvd lxgxp ktsnt mkmcq nhlxntg (contains fish, shellfish, nuts) From 6551796830b459ae749193966def75bfd17694a9 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 21 Dec 2020 12:04:18 +0100 Subject: [PATCH 146/479] 2020: d21: ex1: add solution --- 2020/d21/ex1/ex1.py | 64 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 2020/d21/ex1/ex1.py diff --git a/2020/d21/ex1/ex1.py b/2020/d21/ex1/ex1.py new file mode 100755 index 0000000..f305249 --- /dev/null +++ b/2020/d21/ex1/ex1.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python + +import functools +import re +import sys +from collections import defaultdict +from copy import deepcopy +from typing import Dict, List, Set, Tuple + + +def parse(raw: List[str]) -> Tuple[List[Set[str]], List[Set[str]]]: + def parse_ingredients(line: str) -> Set[str]: + pos = line.find(" (contains ") + if pos != -1: + line = line[:pos] + return set(line.split()) + + def parse_allergens(line: str) -> Set[str]: + pos = line.find("(contains ") + if pos == -1: + return set() + return set(re.findall("([^ ]+)[,\\)]", line)) + + ingredients = [] + allergens = [] + + for line in raw: + ingredients.append(parse_ingredients(line)) + allergens.append(parse_allergens(line)) + + return ingredients, allergens + + +def find_allergens( + ingredients: List[Set[str]], allergens: List[Set[str]] +) -> Dict[str, Set[str]]: + all_ingredients = functools.reduce(lambda lhs, rhs: lhs | rhs, ingredients) + possibilities: Dict[str, Set[str]] = defaultdict(lambda: deepcopy(all_ingredients)) + + for ing, all in zip(ingredients, allergens): + for allergen in all: + possibilities[allergen] &= set(ing) + + return dict(possibilities) + + +def solve(raw: List[str]) -> int: + ingredients, allergens = parse(raw) + possibilities = functools.reduce( + lambda lhs, rhs: lhs | rhs, find_allergens(ingredients, allergens).values() + ) + + return sum( + bool(ingredient not in possibilities) for i in ingredients for ingredient in i + ) + + +def main() -> None: + input = [line.strip() for line in sys.stdin] + print(solve(input)) + + +if __name__ == "__main__": + main() From d412cac96433c183dcd1ba3384196bc7278a97b8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 21 Dec 2020 12:04:25 +0100 Subject: [PATCH 147/479] 2020: d21: ex2: add input --- 2020/d21/ex2/input | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 2020/d21/ex2/input diff --git a/2020/d21/ex2/input b/2020/d21/ex2/input new file mode 100644 index 0000000..3860abd --- /dev/null +++ b/2020/d21/ex2/input @@ -0,0 +1,40 @@ +zdmhtpg mlcvjc kgdvd htxvfq lxgxp kqxz pfhfb fnkdvt ccn vhbjp hqhnh xcljh ndnlm shc ncrn nrdtprm skrxt qrdpc dcvtrq gdmv nxcrg hhxch mv dscm qzln zjlz qkbm dmjzc fjqv jqlp zcxthb sdclrlb bbtn jrspd lqbcg gdljd mvtkk zbhp hcc ntbqk lvft glj fsr hnh nvnx dvjrrkv fdqp lctltv hjn mknsj gtsslgk (contains sesame, shellfish, dairy) +gtdb nxcrg fzl gtsslgk sgdlhb fzckq mknsj kscd dgdn svzfl mlcvjc ntbqk ctkjrt gdmv tkvddn rzhktt zgcf jfm gzhlbn kphbtmkx mgbv pkrdz fsr drj lqgn tgkgj ndnlm zczht tlv qkbm ccn hhxch lgjsd dvjrrkv qfgbx rqxfdd hrtd ktsnt jmt kgfld mxm knfx kshg nhlxntg zdmhtpg qpp mv ssk tgxvz brjcp skrxt xjksh fsxf tpdc crjddsgj hcrsbr bgc jqlp dmjzc hxgdp xcljh xjqkbq hnh bsgnsc gqkf bzlnnv jjmmn gbmv zdqd zbhp (contains dairy) +hxgdp nkgzzg tgxvz tgkgj hqhnh fdjrml gnnzj fsxj zbhp rqxfdd ndnlm fsr nrgn hhxch gnq sgqrvd sm qjktms jjmmn xcljh qzln jqlp nxcrg bsgnsc jxftql lxgxp kgfld jmt ntbqk kvqq fnkdvt gppfld flg kscd jjdgtt nvnx vhbjp nhlxntg zkhpc bgjcg tpdc jkgf tnvtm rnln mgbv nrdtprm cntfq brhmkh rnsqjkq mv dvjrrkv crjddsgj mxm nqbjlf pkrdz xvzlpx dmjzc brjcp hcrsbr nkcl skrxt zfqhnt rglsgs pfhfb nsnzxsc ncrn fzckq rzhktt dcvtrq zgcf qgl (contains soy, wheat, sesame) +sgqrvd dvjrrkv qszr brhmkh znzx tkvddn mgbv kgpbh gtdb gdmv zjkt zdqd mhqxk cntfq hrtd sgdlhb lxgxp zbhp bgjs hxgdp rfcl lvft qgl ndvnj glj ptcnh xjqkbq zkhpc bgc rnln xntpsg xvzlpx zfqhnt xxbnf ntbqk tgkxxjm ncksb flg nrgn kqxz hkdls gqkf fjqv qpp krhmfb fdjrml tmlm tpdc rpqss qzln ckzg xcljh jdcbc kgfld ndnlm kvhbj svzfl jfm nrlbfc tkxxdnh fsr qjn lqbcg sdclrlb nxcrg gnq vchxzh rzhktt tvgcv (contains shellfish) +pfhfb rpqss bzlnnv vchxzh ctkjrt hjn ckzg hpsrqbl nzxs zcxthb jmt lqbcg ndvnj qbvxrbs dvjrrkv jvgbct zjkt ndnlm nrgn mxm xcljh rzhktt fnkdvt hcc knfx tgkxxjm hqhnh bhghks kgfld tkqp qgl tkvddn gzhlbn rglsgs jjdgtt kvqq gfq zmnflgt fsr qjktms ssk jdcbc kshg dgdn jfm gzthtlg mkmcq tpdc nxcrg mgbv xjqkbq qkbm qpp rnln zbhp chjqncr sm jxftql xjksh tnvtm gbmv tgxvz zczht tkxxdnh kssncfd ptcnh bdfmncs mvtkk rfcl zkhpc qjn xxbnf gdmv fzl lxgxp mhqxk (contains soy, dairy) +xjqkbq xvzlpx nqbjlf qbvxrbs gtsslgk bqjqf sdclrlb ccn qpp nsnzxsc zmnflgt pkrdz ndnlm bsgnsc zgcf zbhp tgkgj jfm lvft nrgn xcljh shc bpvmb ltjt jjdgtt dvjrrkv ckzg mgbv sm hxgdp fsxf nhlxntg kqxz kvqq gzthtlg pfhfb htxvfq nvnx jxftql lgjsd sgqrvd skrxt cntfq glj bgjs mxm bbxsn rpgrk tmlm fsr rqxfdd bgjcg qkbm fdqp hpsrqbl gppfld vchxzh svjp qjktms rnsqjkq nxcrg mv tgxvz krhmfb nxcsxc zcxthb hcrsbr qjn tnvtm qrdpc lvtj qfgbx fjqv rpqss nkgzzg (contains fish, wheat, sesame) +jdcbc prgj rnln zdqd zbhp cntfq mgbv gfq dgdn sm gdmv hkdls hnvhqczc ltjt ckzg skkt tkvddn lsll ndnlm flg nxcrg kgpbh zjlz dvjrrkv zgcf mhqxk gnq qgl ccn hcc hvrrhc bgc rpqss gqkf hqhnh nxbn bsgnsc lqgn gzthtlg xcljh jxftql nrdtprm bdfmncs bhghks kgfld zczht hrtd lqbcg rqxfdd bbtn dmjzc fsr mkmcq zkhpc (contains sesame) +nqbjlf dcvtrq cntfq sdclrlb kvhbj skkt jvgbct xjqkbq knfx lsll zdmhtpg hnh fnkdvt gtdb tgxvz xjksh gzthtlg bhghks qpp zgcf ptcnh mvtkk pfhfb jjmmn ktsnt kpzbxfp tgkgj glj rfcl fsr fsxf lqgn gppfld ssk mlcvjc mhqxk kqxz kshg jjdgtt tvgcv xcljh qszr prgj gfzjc jmt qrdpc hhxch bgc mgbv zbhp kssncfd nhlxntg hkdls bgjs gfq nxcrg hcc fdqp lpm jrspd bsdc nrgn dscm bzlnnv bpvmb qjn nkgzzg rglsgs fjqv xvzlpx xxbnf qjktms xcsxh lqbcg bdfmncs qbvxrbs nkcl skrxt hxgdp ndnlm vhbjp nxcsxc flg nxbn kgpbh (contains soy, wheat, peanuts) +zjlz jdcbc nkcl rpqss gqkf lsll flg zbhp ltjt jmt fzckq rnln mknsj ccn qkbm chjqncr lfgh bsdc bzlnnv bbtn fsr skrxt kvhbj hpsrqbl kgdvd lpm dvjrrkv ptcnh tnvtm sgdlhb rfcl gtdb tvgcv rpgrk mkmcq hvrrhc qjktms bsgnsc zsggkm pvnr shc zcxthb lhcm bqjqf fzl rnsqjkq lqgn brhmkh jkgf mv xntpsg mgbv fdjrml dgdn mhqxk ktsnt xcljh qfgbx tkvddn xjksh lqbcg pkrdz brjcp bbxsn (contains fish, peanuts) +xjcvt kgfld gbmv fsxj bqjqf qgl rnln hcrsbr nxbn zcxthb zfqhnt skrxt tgkxxjm dscm hkdls dvjrrkv lvtj gdljd zmnflgt pkrdz xcljh bsgnsc zjkt zkhpc xxbnf tpdc znzx tgkgj qszr bbxsn qfgbx rzhktt rfcl xcsxh ctkjrt bgjs mhqxk mgbv qrdpc ktsnt jjmmn fmcnhq tkxxdnh jrspd qkbm qpp qbvxrbs kshg prgjph skkt mvtkk ncksb hpsrqbl kphbtmkx dgdn ncrn fnkdvt dcvtrq mv nrdtprm kvqq zdqd gzhlbn drj vchxzh fsr nrlbfc zsggkm tlv bgc sgqrvd lctltv mlcvjc lsll hnnmrxh lfgh bgjcg ntbqk htxvfq rnsqjkq hrtd bhghks gtsslgk dftg lqbcg jqlp zbhp qjn bdfmncs (contains peanuts, sesame) +zkhpc lpm fdqp kpzbxfp hkdls mlcvjc bgjs qckqc ndnlm skrxt zdmhtpg dgdn nkgzzg qjn tvgcv brjcp bsdc kshg kgdvd xcljh crjddsgj jvgbct glj xjksh xvzlpx shc mxm gzhlbn ctkjrt ckzg fsr rnsqjkq mgbv rpgrk zdqd rnln gdljd dcvtrq fjqv fmcnhq svzfl fdjrml hrtd dmjzc nxcsxc sgdlhb mhqxk jdcbc qzln dscm zbhp bbxsn fnkdvt kgpbh zjkt tgkxxjm lhcm ptcnh skkt jqlp mv nrdtprm gtdb htxvfq cntfq tnvtm lqbcg (contains soy, nuts) +ntbqk ccn pkrdz krhmfb hkdls kgpbh bhghks bqjqf hpsrqbl bpvmb fzckq nhlxntg pfhfb xcljh bzlnnv nkgzzg cntfq zbhp jqlp ndnlm tlv qbvxrbs nrdtprm gdmv ssk mgbv gdljd dvjrrkv bsgnsc tpdc rnsqjkq znzx flg fsr zlfm zjkt nvnx glj knfx lqbcg hjn (contains wheat, sesame) +qjn sgdlhb rnsqjkq gdljd dvjrrkv nkcl jxftql kssncfd jvgbct kgfld bgc nxcsxc ndnlm nrdtprm kpzbxfp fsxf gnq vhbjp nvnx hvrrhc tgxvz nsnzxsc tvgcv xvzlpx prgjph kqxz fsr hnnmrxh lqbcg hkdls glj ctkjrt zdmhtpg qszr nhlxntg gqkf tlv hxgdp nrgn ndvnj qckqc xntpsg ltjt rnln zbhp gdmv xxbnf hhxch fnkdvt knfx xcljh kgdvd bdfmncs gfq lpm mkmcq skrxt hnvhqczc krhmfb dftg gtsslgk gzthtlg flg zgcf zkhpc brhmkh pvpfn ssk dgdn bsdc jdcbc (contains fish, sesame, dairy) +bpvmb jvgbct nrgn zbhp dvjrrkv bqjqf mkmcq xcljh fsxf mknsj kssncfd lqbcg skrxt tvgcv xbdhth tkvddn nrdtprm mhqxk chjqncr ndnlm lctltv hnnmrxh rpgrk ccn rnln jdcbc gdljd dmjzc svjp lsll bdfmncs rnsqjkq qgl prgjph hqhnh xjqkbq jjmmn hcrsbr xcsxh drj cntfq fsr bsgnsc rfcl pvnr flg tgkxxjm zczht shc (contains soy, shellfish, sesame) +mlcvjc prgj xntpsg pfhfb gtsslgk nrgn kvqq lhcm fmcnhq qgl nrdtprm hcrsbr tgkxxjm lctltv fnkdvt hjn tvgcv prgjph zjlz rpqss bzlnnv zbhp dftg mkmcq tnvtm rqxfdd mknsj fsr xjqkbq pkrdz dscm gdljd nxcrg sm svjp ndnlm zlfm bgjcg rglsgs lvft mhqxk kpzbxfp lpm rnsqjkq ccn skrxt gqkf mxm gzthtlg dmjzc flg tkqp bgjs qpp bsgnsc cntfq skkt gtdb lqbcg xcljh gnnzj hqhnh jjdgtt gfzjc zgcf brhmkh sgqrvd dvjrrkv (contains shellfish, sesame) +dvjrrkv ccn lqbcg lctltv jvgbct tkqp hxgdp lhcm zsggkm bgc qjktms zjkt nvnx nxcsxc kqxz skrxt bhghks gzthtlg chjqncr htxvfq mv rnsqjkq sgdlhb crjddsgj rglsgs nrgn ndvnj ltjt hhxch xcljh hrtd fmcnhq nkgzzg dscm ncrn zbhp mgbv prgj pfhfb tgkgj hpsrqbl kscd lxgxp bbxsn gdmv tgkxxjm glj nzxs tpdc fsr tmlm lgjsd bsgnsc qjn rqxfdd hqhnh cntfq (contains fish) +hpsrqbl brjcp qpp shc tgkxxjm bbtn xcljh gbmv znzx jkgf zcxthb jjmmn zczht bgc lvtj drj rzhktt tkxxdnh tlv dcvtrq nsnzxsc hkdls tvgcv dvjrrkv qkbm knfx zjkt mhqxk bpvmb ckzg bgjs gfzjc bhghks gtdb nzxs gnnzj sm jjdgtt zjlz rnln xjqkbq ctkjrt xvzlpx xntpsg htxvfq tmlm zdqd lqbcg fsr ndnlm rfcl kgdvd skrxt mgbv hhxch mknsj hxgdp fjqv ssk qszr hqhnh xcsxh chjqncr dmjzc crjddsgj prgjph dscm sgdlhb hjn cntfq bsgnsc qjn nvnx sdclrlb jqlp ncksb (contains sesame) +fnkdvt nxcrg sgdlhb kshg glj jvgbct tlv lgjsd qbvxrbs tgkxxjm xcsxh jfm fdjrml mgbv kvqq xbdhth fsr rpgrk qkbm hjn rfcl dftg tkxxdnh mhqxk nsnzxsc zgcf dvjrrkv fzckq prgjph lqbcg skrxt bgc hpsrqbl lsll tmlm bgjcg gtdb nvnx qszr lxgxp zbhp hcc tgxvz xjqkbq nxbn fdqp zdqd xxbnf fsxf ltjt ptcnh xcljh tkqp tkvddn nrlbfc jqlp jrspd (contains fish, peanuts) +nzxs ckzg nrlbfc nsnzxsc xbdhth pvpfn tvgcv tmlm mvtkk ncksb mhqxk ltjt zbhp fjqv rfcl tkqp lpm gzthtlg hkdls hcrsbr qckqc bhghks qgl kvhbj nkcl jmt lhcm bgjcg flg nqbjlf kvqq kqxz xcljh nrgn pvnr bzlnnv lqgn gnnzj bdfmncs ccn lvtj xjcvt dvjrrkv jjmmn qrdpc ntbqk sgqrvd kscd hcc cntfq gnq tgkgj jxftql jrspd fzl fsr lqbcg qkbm mgbv brjcp bgjs gtdb drj qjktms bqjqf hxgdp skkt prgj kssncfd xntpsg hhxch fsxf hqhnh qpp nxcsxc jvgbct qjn lfgh ndnlm mknsj zjkt mlcvjc lgjsd (contains shellfish) +qgl rnsqjkq hnnmrxh lsll nkcl fsr qjktms ndnlm krhmfb rpgrk xcljh jfm lfgh xntpsg skkt gdmv dvjrrkv zbhp kphbtmkx lhcm vhbjp mgbv zsggkm fsxf ccn nrgn nrdtprm bpvmb znzx bbtn dgdn bhghks zjkt svzfl jjmmn tlv bsgnsc bgc qkbm skrxt bgjcg fdqp ltjt rfcl bgjs rnln gtsslgk zjlz (contains wheat) +nhlxntg hqhnh qfgbx kssncfd zkhpc bdfmncs zcxthb drj sgqrvd lqgn rqxfdd hvrrhc prgj tgkgj nrdtprm skrxt jxftql fsr xcljh qpp shc zbhp qjktms zsggkm ccn chjqncr znzx pkrdz prgjph ntbqk ndnlm nrgn kgdvd tkxxdnh tpdc dvjrrkv qzln knfx nkgzzg rnsqjkq kpzbxfp bbtn tkqp mgbv rzhktt lhcm rglsgs fdqp fmcnhq gzthtlg nvnx ssk bhghks kvhbj hhxch tlv fnkdvt htxvfq zfqhnt xvzlpx lpm qszr hnnmrxh hcrsbr jqlp nsnzxsc (contains dairy, peanuts, wheat) +gfzjc hhxch rzhktt gtdb ssk zbhp zfqhnt jkgf tkqp dvjrrkv kgpbh mknsj bsdc lgjsd mgbv zcxthb hrtd nqbjlf mlcvjc hxgdp tgxvz gqkf fmcnhq tpdc lxgxp hcrsbr znzx zlfm fjqv kvqq nhlxntg zjlz brjcp zkhpc skrxt nrlbfc jdcbc qfgbx svzfl fzckq kgfld prgj gzhlbn lhcm qkbm fsxj hqhnh kscd vhbjp fsr lsll qbvxrbs gfq tnvtm lqbcg nkcl ndnlm sgqrvd xjqkbq (contains wheat, shellfish, fish) +gdmv bbxsn kvqq hnvhqczc lqbcg xjqkbq jvgbct mlcvjc gfq jrspd lxgxp jkgf tkvddn bsgnsc lqgn xcljh fsxf qjktms dscm mgbv fsr ndvnj nrdtprm jjmmn xvzlpx nkgzzg rnln nxcsxc zjkt sdclrlb nhlxntg kphbtmkx gnq zbhp fzckq zlfm hvrrhc zsggkm xcsxh ntbqk skkt jdcbc bgc bsdc prgj shc nzxs bpvmb hcc ncrn xjcvt nrlbfc jqlp ktsnt nvnx gnnzj tkqp nxbn ndnlm sgdlhb bqjqf kqxz qzln zjlz tkxxdnh bdfmncs kpzbxfp hrtd fzl skrxt sgqrvd zdmhtpg dftg fnkdvt lgjsd mv (contains nuts, fish) +nxcrg jqlp xcljh nkcl qjn rpgrk xbdhth vhbjp kqxz zfqhnt nrdtprm ltjt tkxxdnh rqxfdd fdqp bsdc gzhlbn bpvmb ndnlm bbtn skrxt jdcbc fmcnhq pkrdz zsggkm rzhktt ccn gbmv ncrn rglsgs dmjzc sgdlhb prgjph lpm zcxthb dftg qjktms pvnr hnnmrxh kssncfd bdfmncs bhghks lhcm lgjsd ssk bgc fsr gfzjc rnsqjkq zbhp lqbcg krhmfb mkmcq zlfm brhmkh xntpsg hnh bsgnsc dvjrrkv tvgcv sm fdjrml prgj hhxch tpdc fsxf nkgzzg nzxs gnq tmlm (contains dairy) +nrlbfc nxcsxc jvgbct dvjrrkv prgjph gqkf ndnlm lhcm mvtkk xcsxh gtsslgk mgbv kgpbh zbhp qbvxrbs kshg gfq ktsnt bbxsn hjn jfm jxftql jmt xbdhth xcljh zmnflgt kgfld nrgn fnkdvt fdqp skrxt svzfl bgjcg sgqrvd ssk svjp sgdlhb vchxzh kgdvd dgdn xntpsg tpdc zjlz zgcf rnsqjkq zlfm chjqncr tmlm dftg tgxvz jkgf lpm hcc qjn tkxxdnh lqbcg kscd lctltv pvnr ntbqk lsll qszr mv hvrrhc fjqv (contains wheat) +vhbjp fsxj jxftql tkxxdnh nzxs fnkdvt fmcnhq lgjsd chjqncr xcljh brjcp hrtd kssncfd ssk mgbv xvzlpx bgjs rpgrk kgfld gbmv ndvnj ccn rnsqjkq xjksh ncrn brhmkh lxgxp qzln zdmhtpg tkvddn lsll nrgn pvpfn lqgn nxbn lvtj dvjrrkv dscm bsdc hqhnh mxm fsr nrdtprm skrxt nhlxntg tpdc mkmcq bqjqf lhcm hxgdp jkgf hkdls fsxf jmt fzl kshg xjcvt lqbcg jdcbc flg rnln ktsnt zbhp gqkf kphbtmkx rglsgs (contains wheat, sesame, dairy) +fmcnhq prgjph jdcbc gtsslgk xcljh fsr zdqd hnh bzlnnv krhmfb mknsj nrdtprm kgpbh lpm tnvtm zbhp fzckq xcsxh lvft hqhnh hcrsbr jfm bsgnsc qfgbx mgbv lsll qjn hrtd tkvddn sdclrlb dscm lxgxp jjdgtt kqxz zjlz tlv xjksh fdqp ptcnh rglsgs dvjrrkv flg ntbqk bsdc xjqkbq gdljd jmt zjkt gdmv fjqv nxcrg zczht bbxsn nkgzzg zmnflgt skrxt ndnlm brhmkh glj zfqhnt tkxxdnh gqkf (contains peanuts, shellfish) +svzfl bdfmncs mlcvjc xjksh fsr shc ssk mknsj tkqp znzx hqhnh zdqd jjmmn svjp ndnlm lctltv tkvddn bzlnnv jrspd kssncfd zjlz pvpfn fdjrml tgkgj nrgn nvnx bqjqf hpsrqbl hnh rnln zjkt fdqp zlfm xjcvt gbmv tkxxdnh kgdvd mgbv dftg jdcbc fnkdvt tvgcv pkrdz zkhpc lqbcg jmt kvhbj nxcrg nsnzxsc gzhlbn zbhp gdljd skrxt skkt mv qjktms dvjrrkv (contains shellfish) +zjlz gzthtlg vchxzh zfqhnt dftg bdfmncs ndnlm dvjrrkv vhbjp shc znzx fdqp fsr svjp nrdtprm tgkxxjm zbhp nxcsxc ndvnj jjdgtt qjktms mhqxk skrxt rglsgs pvpfn xvzlpx jfm prgjph mlcvjc fmcnhq gppfld tvgcv qszr pvnr bsdc bqjqf jxftql hpsrqbl qjn zkhpc qzln crjddsgj lsll bgjcg fdjrml tgxvz ssk lpm brhmkh zczht zcxthb jrspd ltjt lxgxp lqbcg xcljh dgdn gdljd rfcl rqxfdd tpdc (contains nuts, sesame, dairy) +qjn nrgn pvpfn bsgnsc xxbnf jvgbct pfhfb lqbcg zsggkm xbdhth lvtj xcljh tlv lsll lqgn nrlbfc qckqc hrtd shc sgdlhb zcxthb ssk bdfmncs hkdls tnvtm nxbn jfm hnnmrxh dvjrrkv skrxt jdcbc ndvnj jjdgtt jjmmn gtdb hjn tmlm gdljd ndnlm nhlxntg hnh kpzbxfp bgjs fsr jqlp qjktms zczht rnsqjkq zbhp vhbjp brjcp (contains wheat) +hqhnh fsr zbhp nrgn zlfm ndvnj nkgzzg kgdvd ssk qckqc sdclrlb ptcnh bpvmb brhmkh dvjrrkv rpqss fnkdvt lfgh gdljd tvgcv nxcsxc dmjzc fmcnhq qzln sgdlhb qjn zmnflgt vchxzh tkvddn xcljh dgdn bgjs hhxch pfhfb lqbcg kscd lhcm nrlbfc pkrdz htxvfq skrxt znzx ntbqk hkdls ktsnt bzlnnv rnsqjkq ndnlm sgqrvd tlv hcc zjlz gzthtlg jkgf svzfl tkxxdnh pvpfn nxbn ccn gzhlbn rqxfdd qfgbx rnln bqjqf qrdpc kgfld hnvhqczc gnq knfx tmlm nvnx zdqd zsggkm hjn jqlp gqkf bgjcg fdjrml (contains shellfish, dairy, sesame) +dmjzc qgl jjmmn mgbv qjktms qszr zlfm kgfld qkbm xjksh hnvhqczc xjcvt fsxj hjn fjqv rglsgs zbhp ccn kshg bsdc pvnr bgjcg nvnx hnnmrxh cntfq rpgrk gqkf shc nxbn qrdpc jrspd ktsnt brjcp dvjrrkv tgkxxjm jkgf kgpbh kgdvd zfqhnt lfgh ncksb nrdtprm vchxzh fsxf zdqd kphbtmkx skrxt flg gtsslgk zgcf tvgcv dftg lpm nxcrg dgdn xcljh qfgbx nzxs gbmv sgdlhb gdmv jdcbc fsr zjlz ctkjrt xntpsg hcc tkqp ptcnh gdljd rfcl znzx hpsrqbl xjqkbq jfm lqbcg nqbjlf mlcvjc tgkgj xbdhth zkhpc kscd nkgzzg svzfl sm jvgbct htxvfq rnsqjkq hnh mkmcq (contains wheat, sesame) +rnsqjkq zsggkm jqlp zdmhtpg bpvmb svjp pkrdz fsxf tkxxdnh zczht dcvtrq ndnlm cntfq jfm nkgzzg rqxfdd nrlbfc bzlnnv mkmcq fjqv tpdc hnh gtdb nxbn bbxsn mgbv pvpfn ncrn qfgbx sgqrvd knfx xjcvt brhmkh tvgcv gqkf prgjph qgl nvnx hqhnh dvjrrkv lfgh mknsj qzln jxftql kscd gtsslgk kpzbxfp hjn xcsxh gnq dmjzc xjksh tgkxxjm gzthtlg rzhktt zjlz kphbtmkx fsr fdqp sm bbtn lqbcg crjddsgj shc zbhp rglsgs nkcl hxgdp rfcl kgfld qrdpc skrxt gdljd znzx drj mlcvjc (contains shellfish, nuts, dairy) +svzfl fsxj jjmmn chjqncr lqbcg mxm zkhpc rqxfdd gnq kshg zczht gdljd ndvnj fzl rfcl dftg qbvxrbs qfgbx ndnlm mlcvjc mgbv bgjcg bpvmb vhbjp htxvfq lpm nrdtprm hnvhqczc gppfld brjcp jkgf rnsqjkq fzckq rglsgs dmjzc skrxt nsnzxsc kssncfd xcljh zbhp tgkgj kphbtmkx dgdn fsr knfx zdqd jqlp zfqhnt svjp (contains dairy) +nrlbfc bgc hhxch lsll qfgbx bsdc hqhnh tnvtm gnnzj gtdb dmjzc fsr lqbcg hrtd kvqq lgjsd jjmmn xjksh ncksb jvgbct vchxzh ndnlm htxvfq zkhpc fsxj ctkjrt lxgxp gdljd mgbv sdclrlb hnh kscd gzhlbn zdqd flg ncrn ckzg vhbjp mv jfm ptcnh gbmv sm kphbtmkx hcrsbr rpqss skrxt kgpbh kssncfd lvft bgjcg zczht bgjs nrdtprm xcljh bpvmb qckqc nzxs kqxz gdmv bzlnnv ndvnj jxftql hkdls jkgf xjqkbq hnvhqczc lfgh prgj mlcvjc pfhfb zbhp dgdn qrdpc nvnx prgjph bdfmncs nxcsxc tmlm jqlp tkqp sgdlhb fnkdvt qjn fzckq bsgnsc qbvxrbs (contains shellfish, peanuts, dairy) +bzlnnv zcxthb ndnlm jrspd lctltv mvtkk zjkt hqhnh fjqv gppfld zbhp sgdlhb knfx qfgbx hkdls jqlp pkrdz jxftql kvqq zkhpc gbmv fdjrml sgqrvd fmcnhq dcvtrq hnnmrxh tpdc kscd skrxt bsdc qzln xcljh lqbcg pvnr rpqss qckqc shc rnsqjkq dvjrrkv qrdpc znzx mgbv ssk gtsslgk bgjcg kqxz pvpfn hnvhqczc ptcnh bpvmb bbxsn hrtd hvrrhc gnq bgjs nxbn nxcsxc tkvddn qgl ndvnj (contains shellfish, nuts, wheat) +tgkgj kgpbh brhmkh bbxsn rnln mgbv bpvmb pvpfn rqxfdd hrtd kpzbxfp gtdb bbtn dgdn gfzjc kshg ltjt flg nrgn qrdpc chjqncr jrspd nrdtprm crjddsgj bdfmncs bhghks ncksb hkdls zlfm dvjrrkv gtsslgk sgqrvd sgdlhb xntpsg zbhp dcvtrq lxgxp gfq kphbtmkx lqbcg bqjqf qjn zkhpc xbdhth qzln bgjcg jkgf ncrn nxbn znzx nxcsxc brjcp nqbjlf zdmhtpg tgxvz fsr nrlbfc prgjph gppfld qkbm xcljh rzhktt ndvnj ndnlm fjqv hvrrhc (contains peanuts, dairy, soy) +tpdc nkcl nqbjlf ncksb crjddsgj prgj htxvfq gtdb bzlnnv nvnx hkdls fzl dvjrrkv sdclrlb tkqp xcsxh bqjqf hrtd dscm pfhfb svjp rqxfdd hvrrhc nrdtprm mgbv xjqkbq zkhpc zczht rfcl fsr rnsqjkq zbhp nhlxntg ndnlm jqlp bsdc hjn ntbqk gtsslgk brjcp rzhktt tlv tgkxxjm knfx ssk xjksh nxcrg dmjzc kgpbh nrgn lvtj svzfl shc mlcvjc lgjsd gbmv kvqq mhqxk nxcsxc gzhlbn tmlm zcxthb zfqhnt qpp xcljh lctltv hcc kscd fjqv mxm qrdpc zdmhtpg kvhbj skrxt qszr ptcnh xvzlpx zgcf dcvtrq bbtn zlfm jjdgtt jxftql fdqp xntpsg (contains fish, shellfish, sesame) +fsr dvjrrkv ckzg zjlz cntfq hcc nqbjlf svzfl ssk vchxzh nkcl zbhp mgbv hcrsbr fsxj xcsxh ccn rpgrk bhghks qckqc ptcnh gdljd hxgdp qkbm mvtkk rnsqjkq rnln prgjph gppfld dftg mlcvjc gtsslgk bgjcg bgc jdcbc zczht lctltv gfzjc svjp xvzlpx sdclrlb skrxt qfgbx nxcrg dcvtrq shc sgqrvd tgkgj kphbtmkx fzckq bqjqf crjddsgj nhlxntg jqlp gzthtlg zgcf ctkjrt zmnflgt bbtn drj ndnlm rpqss lvft xcljh (contains shellfish) +pkrdz ndvnj znzx xjksh zbhp hrtd kscd kgdvd ctkjrt zsggkm fzl zjkt zdmhtpg xcsxh tkqp lqbcg kssncfd bbxsn bzlnnv mgbv kgpbh krhmfb nsnzxsc ssk prgjph fmcnhq lfgh bgjcg fsr bbtn brjcp kqxz nxcrg skrxt rfcl kvqq brhmkh qbvxrbs hpsrqbl lgjsd kphbtmkx nzxs ndnlm bsgnsc mv xvzlpx ncksb nrgn rpqss tmlm nkcl dvjrrkv tnvtm lpm xbdhth sgqrvd lxgxp ktsnt mkmcq nhlxntg (contains fish, shellfish, nuts) From 9f0f9be2d1ce80ee69c4adcfbc210e772259eedc Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 21 Dec 2020 12:04:32 +0100 Subject: [PATCH 148/479] 2020: d21: ex2: add solution --- 2020/d21/ex2/ex2.py | 81 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 2020/d21/ex2/ex2.py diff --git a/2020/d21/ex2/ex2.py b/2020/d21/ex2/ex2.py new file mode 100755 index 0000000..4856636 --- /dev/null +++ b/2020/d21/ex2/ex2.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python + +import functools +import re +import sys +from collections import defaultdict +from copy import deepcopy +from typing import Dict, List, Set, Tuple + + +def parse(raw: List[str]) -> Tuple[List[Set[str]], List[Set[str]]]: + def parse_ingredients(line: str) -> Set[str]: + pos = line.find(" (contains ") + if pos != -1: + line = line[:pos] + return set(line.split()) + + def parse_allergens(line: str) -> Set[str]: + pos = line.find("(contains ") + if pos == -1: + return set() + return set(re.findall("([^ ]+)[,\\)]", line)) + + ingredients = [] + allergens = [] + + for line in raw: + ingredients.append(parse_ingredients(line)) + allergens.append(parse_allergens(line)) + + return ingredients, allergens + + +def find_allergens( + ingredients: List[Set[str]], allergens: List[Set[str]] +) -> Dict[str, Set[str]]: + all_ingredients = functools.reduce(lambda lhs, rhs: lhs | rhs, ingredients) + possibilities: Dict[str, Set[str]] = defaultdict(lambda: deepcopy(all_ingredients)) + + for ing, all in zip(ingredients, allergens): + for allergen in all: + possibilities[allergen] &= set(ing) + + return dict(possibilities) + + +def cross_eliminate(possibilities: Dict[str, Set[str]]) -> None: + while True: + eliminated = False + for pos in possibilities: + if len(possibilities[pos]) != 1: + continue + for other_pos in possibilities: + if other_pos == pos: + continue + if len(possibilities[other_pos] & possibilities[pos]) == 0: + continue + eliminated = True + possibilities[other_pos] -= possibilities[pos] + if not eliminated: + break + + +def solve(raw: List[str]) -> str: + ingredients, allergens = parse(raw) + possibilities = find_allergens(ingredients, allergens) + cross_eliminate(possibilities) + matches = [ + (ingredient.pop(), allergen) for allergen, ingredient in possibilities.items() + ] + matches.sort(key=lambda tup: tup[1]) + return ",".join(ingredient for ingredient, __ in matches) + + +def main() -> None: + input = [line.strip() for line in sys.stdin] + print(solve(input)) + + +if __name__ == "__main__": + main() From 56fe76bbaf814746381d3833a30174f714bc1a8f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 22 Dec 2020 13:58:53 +0100 Subject: [PATCH 149/479] 2020: d22: ex1: add input --- 2020/d22/ex1/input | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 2020/d22/ex1/input diff --git a/2020/d22/ex1/input b/2020/d22/ex1/input new file mode 100644 index 0000000..4aed5fe --- /dev/null +++ b/2020/d22/ex1/input @@ -0,0 +1,53 @@ +Player 1: +31 +24 +5 +33 +7 +12 +30 +22 +48 +14 +16 +26 +18 +45 +4 +42 +25 +20 +46 +21 +40 +38 +34 +17 +50 + +Player 2: +1 +3 +41 +8 +37 +35 +28 +39 +43 +29 +10 +27 +11 +36 +49 +32 +2 +23 +19 +9 +13 +15 +47 +6 +44 From 21fd56d96d6431c6433b8046be3e5f3bb80b0052 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 22 Dec 2020 13:59:01 +0100 Subject: [PATCH 150/479] 2020: d22: ex1: add solution --- 2020/d22/ex1/ex1.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100755 2020/d22/ex1/ex1.py diff --git a/2020/d22/ex1/ex1.py b/2020/d22/ex1/ex1.py new file mode 100755 index 0000000..968e4ae --- /dev/null +++ b/2020/d22/ex1/ex1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import deque +from typing import Deque, List, Tuple + +Deck = Deque[int] + + +def parse_decks(raw: List[str]) -> Tuple[Deck, Deck]: + deck_1 = deque(int(n) for n in itertools.takewhile(len, raw[1:])) + deck_2 = deque( + int(n) for n in itertools.islice(itertools.dropwhile(len, raw[1:]), 2, None) + ) + return deck_1, deck_2 + + +def play(deck_1: Deck, deck_2: Deck) -> Tuple[int, Deck]: + while len(deck_1) and len(deck_2): + left, right = deck_1.popleft(), deck_2.popleft() + if left > right: + deck_1.extend((left, right)) + else: + deck_2.extend((right, left)) + return (1, deck_1) if len(deck_1) else (2, deck_2) + + +def solve(raw: List[str]) -> int: + __, deck = play(*parse_decks(raw)) + + score = sum((i) * val for i, val in enumerate(reversed(deck), 1)) + + return score + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From b49e09cf9ffd7fc930b440ab2605ab38da3f488d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 22 Dec 2020 13:59:09 +0100 Subject: [PATCH 151/479] 2020: d22: ex2: add input --- 2020/d22/ex2/input | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 2020/d22/ex2/input diff --git a/2020/d22/ex2/input b/2020/d22/ex2/input new file mode 100644 index 0000000..4aed5fe --- /dev/null +++ b/2020/d22/ex2/input @@ -0,0 +1,53 @@ +Player 1: +31 +24 +5 +33 +7 +12 +30 +22 +48 +14 +16 +26 +18 +45 +4 +42 +25 +20 +46 +21 +40 +38 +34 +17 +50 + +Player 2: +1 +3 +41 +8 +37 +35 +28 +39 +43 +29 +10 +27 +11 +36 +49 +32 +2 +23 +19 +9 +13 +15 +47 +6 +44 From 9be680152762390661c2b6e1d0c9c9fed0282328 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 22 Dec 2020 13:59:13 +0100 Subject: [PATCH 152/479] 2020: d22: ex2: add solution --- 2020/d22/ex2/ex2.py | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100755 2020/d22/ex2/ex2.py diff --git a/2020/d22/ex2/ex2.py b/2020/d22/ex2/ex2.py new file mode 100755 index 0000000..7b3ee6b --- /dev/null +++ b/2020/d22/ex2/ex2.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import deque +from typing import Deque, List, Set, Tuple + +Deck = Deque[int] + + +def parse_decks(raw: List[str]) -> Tuple[Deck, Deck]: + deck_1 = deque(int(n) for n in itertools.takewhile(len, raw[1:])) + deck_2 = deque( + int(n) for n in itertools.islice(itertools.dropwhile(len, raw[1:]), 2, None) + ) + return deck_1, deck_2 + + +def play(deck_1: Deck, deck_2: Deck) -> Tuple[int, Deck]: + prev: Set[Tuple[Tuple[int, ...], Tuple[int, ...]]] = set() + + while len(deck_1) and len(deck_2): + state = (tuple(deck_1), tuple(deck_2)) + if state in prev: + return 1, deck_1 + prev |= {state} + + left, right = deck_1.popleft(), deck_2.popleft() + + if left <= len(deck_1) and right <= len(deck_2): + winner, __ = play(deque(list(deck_1)[:left]), deque(list(deck_2)[:right])) + if winner == 1: + deck_1.extend((left, right)) + else: + deck_2.extend((right, left)) + elif left > right: + deck_1.extend((left, right)) + else: + deck_2.extend((right, left)) + return (1, deck_1) if len(deck_1) else (2, deck_2) + + +def solve(raw: List[str]) -> int: + __, deck = play(*parse_decks(raw)) + + score = sum((i) * val for i, val in enumerate(reversed(deck), 1)) + + return score + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From b7e3101d3ae0a7e5811a97ca7cdce1b1874b79b4 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 23 Dec 2020 13:10:59 +0100 Subject: [PATCH 153/479] 2020: d23: ex1: add input --- 2020/d23/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2020/d23/ex1/input diff --git a/2020/d23/ex1/input b/2020/d23/ex1/input new file mode 100644 index 0000000..aea0f77 --- /dev/null +++ b/2020/d23/ex1/input @@ -0,0 +1 @@ +598162734 From e9c449ee0914c2d7fe036a0cf4dee59510915af8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 23 Dec 2020 13:11:04 +0100 Subject: [PATCH 154/479] 2020: d23: ex1: add solution --- 2020/d23/ex1/ex1.py | 58 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100755 2020/d23/ex1/ex1.py diff --git a/2020/d23/ex1/ex1.py b/2020/d23/ex1/ex1.py new file mode 100755 index 0000000..2d7ff20 --- /dev/null +++ b/2020/d23/ex1/ex1.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List + + +def solve(circle: List[int]) -> int: + def to_links(circle: List[int]) -> List[int]: + links = [-1 for __ in range(len(circle) + 1)] + cyclic = itertools.cycle(circle) + next(cyclic) # Advance it by one + for prev, cur in zip(circle, cyclic): + links[prev] = cur + return links + + def step(links: List[int], current: int) -> int: + cup0 = links[current] + cup1 = links[cup0] + cup2 = links[cup1] + + links[current] = links[cup2] # Remove 3-tuple from the linked-list + + # Find destination + dest = (current - 1) if current > 1 else (len(links) - 1) + while dest in (cup0, cup1, cup2): + dest = (dest - 1) if dest > 1 else (len(links) - 1) + + # Update our links + links[cup2], links[dest] = links[dest], cup0 + + return links[current] # What's the next value in the cycle ? + + def to_answer(links: List[int]) -> int: + next = links[1] + res = 0 + while next != 1: + res = res * 10 + next + next = links[next] + return res + + current = circle[0] + links = to_links(circle) + + for __ in range(100): + current = step(links, current) + + return to_answer(links) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + assert len(input) == 1 + print(solve([int(c) for c in input[0]])) + + +if __name__ == "__main__": + main() From d0e1d5b42799a3da923e1836b8e84b548a89042a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 23 Dec 2020 13:11:11 +0100 Subject: [PATCH 155/479] 2020: d23: ex2: add input --- 2020/d23/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2020/d23/ex2/input diff --git a/2020/d23/ex2/input b/2020/d23/ex2/input new file mode 100644 index 0000000..aea0f77 --- /dev/null +++ b/2020/d23/ex2/input @@ -0,0 +1 @@ +598162734 From c4b6536598ab295faa656ef9fa203cbabc8ee02e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 23 Dec 2020 13:11:17 +0100 Subject: [PATCH 156/479] 2020: d23: ex2: add solution --- 2020/d23/ex2/ex2.py | 55 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100755 2020/d23/ex2/ex2.py diff --git a/2020/d23/ex2/ex2.py b/2020/d23/ex2/ex2.py new file mode 100755 index 0000000..8993dcb --- /dev/null +++ b/2020/d23/ex2/ex2.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List + + +def solve(circle: List[int]) -> int: + def to_links(circle: List[int]) -> List[int]: + links = [-1 for __ in range(len(circle) + 1)] + cyclic = itertools.cycle(circle) + next(cyclic) # Advance it by one + for prev, cur in zip(circle, cyclic): + links[prev] = cur + return links + + def step(links: List[int], current: int) -> int: + cup0 = links[current] + cup1 = links[cup0] + cup2 = links[cup1] + + links[current] = links[cup2] # Remove 3-tuple from the linked-list + + # Find destination + dest = (current - 1) if current > 1 else (len(links) - 1) + while dest in (cup0, cup1, cup2): + dest = (dest - 1) if dest > 1 else (len(links) - 1) + + # Update our links + links[cup2], links[dest] = links[dest], cup0 + + return links[current] # What's the next value in the cycle ? + + def to_answer(links: List[int]) -> int: + next = links[1] + return next * links[next] + + current = circle[0] + circle += [i + 1 for i in range(max(circle), 1000000)] + links = to_links(circle) + + for __ in range(10000000): + current = step(links, current) + + return to_answer(links) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + assert len(input) == 1 + print(solve([int(c) for c in input[0]])) + + +if __name__ == "__main__": + main() From cbdbc365633fb130875f72713980c5a1b8c73f54 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 24 Dec 2020 13:26:28 +0100 Subject: [PATCH 157/479] 2020: d24: ex1: add input --- 2020/d24/ex1/input | 471 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 471 insertions(+) create mode 100644 2020/d24/ex1/input diff --git a/2020/d24/ex1/input b/2020/d24/ex1/input new file mode 100644 index 0000000..9b35a80 --- /dev/null +++ b/2020/d24/ex1/input @@ -0,0 +1,471 @@ +swswswswneswswwwswnewswswweswnwsww +nwwewenenwnenwnwnwnwneswnwswnwnwswswnw +seneswwwswwnenwnenwswswswswsewseeww +esenesenesesesewseseswnesesweesesesese +seseseeseenesewseenwsesewswwsesenwse +eswenewnenenewneneneneenenenenwnene +nwseeseseeseseseseewseesenwseeesese +nwnwswswswweneseswwswwneswswswswswsw +senenenwnenewneneneseswneeeenenenew +eswnwnesenwnwnenwnwnwnwwnwsenwwswswenw +wswneswswseesewswseswswswnenesenenwswswne +seswseswneswswswwnwswwswseneswswswswsee +neseseswnwesesesesewswsesenesenesesesw +wwswwwsweswwwww +seswwnwneenwswneenwewneneneseenee +eswseenweswewseneeeeseeswnwnwse +swsweswswswnweswswneswwswnwswwwswswswsw +nwwnwnwnwnwnwnwnwwswwnweneswwenwnw +sewswwwwwwwweswwwwneswwnwswnw +nwneeneeneneseneseneneneneneneswnenwnene +swnenenweeneeeseswweneenenenenene +nwnwnwsenwewsesenwenwwwswwnwnesenw +swnwswswswswswsewseswnewneseswswswneesw +wwweswwswwsewswswwwwnwwesewwne +swswsweneswswswenwswnewnwswwneswseswswe +nwnesewwnwwnwwwsew +enwwwnenwnewwwwswwseeswewe +neswseswswsenwseswnwseswse +senwseneneneneneeseneswnenenenenwnenwnw +swseneswwseenwsenwneneswnewnenewene +ewwwwwwwewwwnwswwwwwwwne +eswswenwsenwnwsenenw +nwneseewseswwsewswnwnwnwwwwnewww +nwwwwwwwwewnwwswnew +neeeseeesewseeeeeeeewe +wweswnenwwnewnwnwwwewsewnwwsew +swwswwwswwewwswswnwsweswnwwwww +eseswneenwneenweseenweeseeeenw +neneswneneneneneneneneneswnenwnwnw +nwnwwnwewwswwnwwwnwsewnwwenwnw +seswswswnwswwwwswwswneswwseswnw +nwseswenwwneneneseswneenwnenenwnenwnenw +nwnenenenesewwnenwnwnesenwnwnwnwnenwnwnw +wseeeneseeeseseesesenwseseswsesese +sweseswnwseseseswseswseseseswswswse +ewwwswswsenwewnewwwenwwwnwww +nwwsewnwnwnwneswwnwesewnwwnwnwnwnwne +nenwnwnwnenenwnenwnwswswnwneenenwnwnwne +esenwneswsesesweeeeweseseeseseswnw +swswswswwsesweseswswswsw +swsweneswwseswswswwswsenewswwswseswnene +nenenewnwnenenwenwnesenwneseswnwnwnwne +nenenenewneeseneneswneneneswsenenenwne +nenenwnenwswwnweesenwsenwnwnwseswnwnwnw +seseeenwsenwswsesenwseeseeseeseswese +swneeseseneswswnwswnwwwwswswnee +seeseseseneseseswsewseenenwwneseswse +wswseseenwwswnewenwswswwwnewwsw +nenewswnwnenwnwneeneswseeneswnenwnenesene +nwswsenweweseeneseesesesesesesesee +seneswswwesenenwswseswnwseseseseseswne +wwnwwweswnwnwwweneseewnwsesenw +swswneneneneenewnesenewweenweswne +eseneseneseenenewwswseweenweenenene +nwwnwwnwsenwnwnwnwwnwwnww +swweswsewewwwwwwwwwwnewne +swswnewseseseesenewseesesesesesenwese +swswnenwnenwnwnwnwnenenenwnwwnenwseene +wnwwwwnwnwwnwwnwnwwwnwnwsenwe +nwseswwwnenwwwwesewwwwwwwnenwnw +nwswswnwswwswwnenenwnwnwnwnewnenw +seswswswnwswswswswswswswswswswswsw +neneseeneswnwnenwnwsenwnenenewne +wwwwwnenwnwnweswwnwsewwwesese +swwswswwwwseswswenwnewswwswweswnw +swwswseswswseeswswswewswswnwswswese +nwnwewsenenwnesewwwwswnwnenwswsee +seseseenwwswseneneseswswnwnewswnwsenwse +wwswwnwwwwsewwwenewnwswnwwwe +swwwwswwswwswneseswswswwnewswwse +nenenwneeswnenesweneneneeneneswsewesw +seswswswseswswswswsweenwswswwseswwsw +swswswsewneseesenwseseswseswswswnwsesw +nwwnewnwnwswnwnwswnwsenwwnwenwnenww +wswwnwwwswwwwswe +eewneeeeneeswsee +wseneseeseewseseseswsewse +wwswnwnwwnewnwsewenenwswwewswwne +seneesesesesewswswwnwseswswseseswseswsw +ewnweeeseneseeseseeneseswwwee +wwwwswwsewwwwewwwwwswnwwne +swsewswswswseswseseeswsenwseswswswsenw +nenenenenesenenenenenenewenewneswsene +newnewewwnwnwnwsewwswnwwwwesww +neseeeneneeewnee +wsenwwnwenwnwwnwnwnwwnwnwwnw +nweswenwseseswwseeenwseenwswsesewsw +wwwswwwwsewwwwwwwwne +nenwnwnwnenwnwnwnenwwnwnwnwnwnwe +eeeeeweneeseeeesweeeeew +seneseeeeewewnweseeseseseeseese +swenenenenwesweewneeeneneeeeeee +wnenwseswnwwwsenwnwwnwnwwnwwnwnwnwnw +sewwwswnwwnwwwswwnewwewwwsw +swwwwswswwswswwwswnew +esweeneeswenwnweesweneeeeswee +eenweeseneeeeeeeeeseeenenwsw +nwneswweeneseswnwswnweeesesesenwe +neneneeswnwnwnwnenenwnenene +wseewseeseseneswsenwsenewsesweseswswse +eseswneneseneenenewswwnwnenenesenenenw +seswsesesweseswseswseswwsw +nwnenenenenwnenenwsenenwwsenewnenenene +eneneneneswnenenenenenenenwneneneswnwnw +neneeneneenwnenenesweneneewsweneene +swnwnwneswnwnwseenwnwnenwenewnwnwnwwnw +swswwnwwswnwwseswewswneseneswewneswe +neswswnewwswswwwswwsewww +nwneeenwswnwsenwnwnwnwnenwswnwnwsenwnw +neeswnwnwwnwseswesweneswnw +swnenwenwnwnwnwsesenwswnwnwnwnwnwnwnwnw +swseswswnenwwwwseswwwwsw +seswneseswseswswswsewesenwsenesewsesw +eseeneswseenwewseewneeeene +swnenenenenenenewwneneswnenenesenesenw +swnenwnenwnwenenenwnenenwnwnene +eswneenwwnwwwneewneneneswneseswee +neseneseneewneeeweewnwneeseee +nesenenenenwnwnenwswnwnenwnenenwnw +seswsesesenwseeeeseseeesesewseenw +eneswsewneeswnenweswneeswnewwswseene +eeseseseswneswseseeeeeeeeewne +wwwseswnenwwnwnwenenwnw +sesenesweeeeeweeeweeenwwe +wsewnwwsewwewwnew +esesenwnwwwneswwswsenwnwnwseswneswwew +nenwwnwnwnwswwenwwwenwwwnwnwwnw +seeeneeneeseeswnenenwsweweewee +swswswwswswswswwswswwswneswswsw +nweseneweseeswwnwwswswnw +wnwsweswseswswswswseswne +swnenenwneenenenenenenenenenenenene +swswswswswseswswwswswswwnwwenwnwseswesw +wswwswswwswswsweswewswwswnwnesw +neneeewneneeswnewneneeseseswewnw +seseswseeesenwsesweseneseeseeesese +nenenenwnesewneswneneseneenewnene +neneneneneneswwneneneneneesenenenenene +swswswnwswnwswsweeswswseswswswswswswnw +sweeseseneeeseeswnewnwnwwewsee +neswsenwnewwnwwwwwwswweseenenww +nwwwwnwwwsewnwwswnewwwnewww +nwswsweswswneswseswswswswwneseswwnesww +wsewwnwwwwswnewwwwsewswwwsw +nwwwwwsenewneewwseenewwsesw +nwnenwwnwwnwwnenenwnenwenesenwenwne +nwnenwnwsewnenwsenwnenenwnwnenenenwnene +wswswwwenwswenesewwnenwe +wseswneeswneseenwnwsenwswewwweswesw +swnwseseeeeewseswnwseneseswsenwsesene +sweneswnwnwswsweneswnwswneswneswsweswsw +eeeswnwswneeneenewswnewneneeee +senwwnenwenwnwwsenwnwnwnenw +esesenweseeeeseseeesesese +seeeeseneseseeeswseeeeseewsene +wneswwwwswswwwewwnesesenwwwse +wnwnwwwsenwnwswnwnwnenewnwnwwnwwnw +senewsesesesesesesesesesesese +eenweswneeenee +nwnenwwnwnwnwnwwwseenwnwnwwnwnwnwswnw +esweneseeneeneeneneneneneswnenewnee +nwwwwswwewnwnwww +neneeneewneeneneneswnwnesenenenenwnesene +wneswsesenewswwwwwwwnwswwwseww +wesenesewswsenwswneswswseswneesesese +sesesenwswsewnwsenwswseswesenenwseeseew +wwnwswwneswwweswwwwwwwswww +nenenwnesewwswswewsenwswnewwswew +wwwnwwwnenwwwwwnwswnwnw +nenwswneneneenenenenwnenwnwnwnenwnw +swenwswewswswswewnwwswnewswseswne +swsenweeseswenwseseswsenwsesewseswswse +eeeweswnwnenenweeswneeeseneeee +swwswneseswnwseneswnewswweseswnwww +swswswswnenwswswseswseswswswneswwseswsw +enwsewsweeseseseneweeseswesenwese +nesenweneneneneneswnwnwnenwnenwnenwnene +seswseeenwsesenweseseseseseneseeseeswse +senenwsewnwnwnenwewnwswwneswnwnwsweenw +neeewnenweseseseeswnesweneneewwse +eeenwswswseneweseneenweneneneew +swswneneswnenenenwnenwnenenenwnwnwwnwe +swsweswwswswswwnwwwweswswswwswnw +wewwewwwwnwswswwwwswwswsww +swwnwwswnweseswnwswseweenewwww +neswswswseswswseswswswseswwswswswsesenw +eneeneneneewneneneeneneenesew +nwnwnwnwnwnwnwsenwenenenwnwnwnwwnwnwswne +weneswnwsenewseseswseeseene +eseseweneenwnweseeseseneneweswswe +swswswswseswswsenwnwseswseeswswsweswnw +sweswwsweswswwswswsweswswwnwswnwenw +eeeseseeenwsewswesesewsenwsenesw +seneswseseseseneseseseweesesesw +ewnwnwwnenwwnwwnenwwnwsewwnwswww +senweeswseswneweesesesesewnwnwsee +wseseseseseseeneseese +neswneswewnwswwwwwwwswwwseewnwse +sewwsesesewnwswswswseeneeesesewse +sweswwneseneswswswswnwswnesene +eesweeenenweeneeeswenwneeeene +eseseeneweeseeeeneenwneeenwne +neneneneneswneenenwnewneneneneswnenenenee +nwnesewwswswseswnwwneswswwswwsesesw +eeneeswesenwewenwneneeeseenwesw +nenwneneneneswnenenenwnwnenw +wwseewnewwneenwwnwswsewseenwse +wsenwwnwwswwwwwswnweewnenwsee +nweseswseseseeeseeseeseeesenwsese +neneswseesewesenenenwneswwswnewswswsenw +wwneseenwwsenwnwnwneswswewnwswwnwne +eneneeneneeneesw +nwnenenwenwnwseeenwwswnwnenwnenewnw +swsweswswsewewswswnwnwwsewwe +swseneswswswswswswsesewswswseseswswnesw +eseseesenwsenwseseeeweesesweeene +neswnwsewsweseswseseswsesesenwnwneseseswse +eeneeeseeseenwneeneeeeeewne +nenwswewnwsweneswwenwswneseseneenew +weeswwwwnenwswnwsenewnwswwnwnwenw +wwnewswswswwnwseswwwswswwwnwsew +newsenwwneswwnwwnwswseeswseswsenwww +swswwsweneswwwnwnee +nwswswswswswswswswnwnwswenwseswswseeswsw +nwnwnwnewswwswnwnwnenwsenweenwnwnwnese +nwenwseseseswswswswswswenwseswnwewswswse +swneswwewsenwnwnweeenenweeseese +nwwwwwswnwesenwwnee +nwnwwwwnwwnwnwsenw +nwseseseswswneseswswnwseseswsweswsweswsw +enweswnweswnweneeeneneneeeswee +sesenwseswnwswswnenesesesesweseseesesw +swseswsewnwnwwneswswswseswswneseswwsw +nenwnenwnwnwnwnesenwnwnwnwswnene +swwenweesenesweesenweseeeeee +swnewsesenwswesweeneneesewnw +swneweswsenwnenesese +nwnweseeseseseswseewseseenenwsee +neswswneseeeeenenwwneeenenwneseneene +swswswsesesesenwsesesenwseswsesese +nwswnwenwnwnwnwnwnwnwnwnwnwsenwnw +eeneesweeeeeeseswnweeneneewe +eeenweseseeeswnwwnwnenwswnewsenenw +neswswswswseseesweswsenwsesenwnwswswsesew +eseeeseenweseeeeseese +swwwswwswwswwsewwswswnwsww +swswwsenwswwswswswswwwswew +eeeseeeseswewneeswneee +sweseswswenwnwwswswnwnenwwseewwwsee +wwnwwwwnwnwwwwewwenewnwswww +sewneswnwseeneswwwnewnwenewseswwnw +seswswswswwswswswnwsweswswswswseswswe +seswswswswswnwneswnwswswsesesenese +eenweseeeseeeeneneeeweseesw +swnwseswswnweneswenwnewenenwnwswnenese +wweenewnwsewnwwnwnenwswseweesw +wwseneeneneneneseenwwswsewwesee +wwsenewwswswwwswwwwswsw +nwwswwwnwwwnenwnwwnwnenwwswwnesw +eneseeweseesesesweewnwenwwswe +eneneeeweneeseeeenesenenenwne +neeneeeeesweseweeeeeewee +swsewnesenweenwenwnwneseseswnwnenene +sewseswseseswseseseswswesenwneswsesese +nwwwnewsewswswwnwseewwwsenewne +enwneseeeeswswneeenwnweeewwsw +wnwswswswswswsweswsw +nenenenwnesenwnenwnwswwswnene +swseseseseenwesenwsesewseesewnwseenw +eswenwsweeeenwneswseeeenwwnee +sweeswswwswswnwwnwswseseeswsesw +nweenwswsesenwneswnweeeeseseswswsenw +wnewseenwnwswneseeeeswnenwneene +nwsewnwnwnenwnwnwswenwnwnwnwwnwnwnwse +swswswswswswswnwswswswswseeswnwseswswsw +senwseswseeseneseewnwnweeseesesesesese +eeseeeenweeeneeeeneeeew +seswsenwswseesesenwswsesweswneseswsesese +nwwnenwnwwwnwwwsenwwnwnwsewnwnewsew +swneswswswswnwwswswswseswswsweswseenw +swwnenwnwneneenenenwnenwnenenenwnwne +ewneswsenwnwenenenwswseeesewnwsww +wswswenwwnenwnwseeswwnweswswnweeswse +nwnwnwsewnwnwnwenwswwsewnwenwnwwnw +neneswneneneneneneeneenenwnenewnwneenesw +eeeseseeweeeeenee +nwnwnwswsenenwenwnwnwnwswnwnwsenwnwsweene +wwsewwwwswwnewwnewwswwswwsw +nesesewwneseneseweeenwsweenwswwse +eeenweesweeewweeeeneeeee +eseswnwwsenwswneswsesweseneeneneswwwsw +wnwnwnwnwewnwnwseenwwnww +enwsenwseseeneseeseseseeswnwseesesee +neneseseseeswswwseswnesesewswnwnwwee +neenwnwnwnenwsenwnwnwsenwnenenwnwneneswnwnw +senewnwnenweeewnenwnenenwswnwnenwswnwne +seseswseswsesesesesenesewseesesesesew +nenenenwwnwneeneenwswnwnenwnwnenewnee +wwwwwseswneewnewneswnwewswsenw +nwnenwnwnwnwenwnwnenenwnwsenwnwwwnwne +wswwsenewnenenesewneneseseseewnewsw +nwnwsenwnwnwnenwnwnwnwnwnwnwnw +nwswswnwnenenwenenewneeeneswswnenwwnene +sesenwnwenwnwwnwnwnwnwnwnwnwsenwneswsenw +nwneneneswnenwnwnwnenenwnenwsenwnene +seneswneewswnenwwneeeeneeneneewe +seswswswswswneswswswswwweswwswnwswwne +swnenwnwwnenwnwnwsenenwweesenenenew +swsewwnenwnwwwwsenwwwewnwwsenew +eeeeeneeneeweneeeneenwnewswene +nwnwnwnwwnwwwwnwwwwnewnwwswneswe +swwnwsweneseswwswnewswswnwswseswnwseswe +swswswswswswswswswswseswswswswneewnwww +senwnenwsenenewnwnwwsenenwnwnwnwenenw +wswnwenwenewnwwwwwnwnwwswwwsw +swseseswswseswseneswwseneseswwseswsesese +eeeswsenewenweseeeeseeeenesw +enwnenwneswwewnwsewnwnenenwnwse +nwnenwnenwenwnwnenwnwnwswnwnwnwneneswnw +sweswseswswnwswswswswswswseenwswsewsw +wnwnwewnweenwnwewnwwsenwweswnw +senenwnwwnwnwnwwnwwwnwnwnwnwnwnwnwsesw +nwnwnwneswnwnwenwnwnewnwneenwnwnwswne +seesenewnwneswnenenenenenenenesewnene +seswwswnenwnwseseswseswswswseseweneesw +swwswenwwnwnwwewwwnwwnwnwwe +nwnwnenenwnwsenenwnwsenwnwswnwnwnwnwnw +wewsesenwswnewnwnwwnw +nesenenewneesenenweneweneeneeneeswne +senwwsenwswswnwneesewwnwneenwwnwswe +nwnwenwnwnwswnwnwnwnwnwswnwnwwenwnwnwnw +nwnwnwswnwnwneewnesenwnwnwnewnenwnenwnwe +wseseenwswseneseseneeeseeeeesenw +nenewwsewwenenwwsewswwnwwswww +nwwwnwwnesewewwwwswwewwseww +eeswseneswwsenwesesweswwsenwnwnwnese +wnwwswwewwwwwwwsenwnwwnwwsenw +nwnwnwnwnwneseneenwnenwwneenenwnwwnw +nwnwsewswnesenenwenweneseeneswwnenwwne +nwseeneneneneeneneneneneswwwwewswse +nwnenwnenenenwwswneneswnwneneneeenenwne +swswswsweswnwwswswswsweswneswswswswsw +seswseseswseswseswswnwseswswswseneswew +senwwwweswnwneswenwwswnwnwnenwwse +swswswswsewseswsewsesesesweneswsesesw +enenewneneneeeewneneseeneeneseene +nwnwnwnwnwwsenwnwsenwnwsenwnwwnwnenwnwnesw +nenenenwswnwneneneneneneneenwsenenenenw +nwnenwnwnwnwnwenwnwnwswneswnwnwnwnwnwsenw +neenenwseswnwseswswnwwnenwnwnenenenwswsew +sewnenwnenwenesenwwnwsenenwwne +wswnwwswwnwnwnwnenewnwnw +senwswneeswswswswwwswswswwsweswwsw +esewswneeeeneeewneneneneseenenwnene +nenwnwwneswnwswnwnenwswnwnwsenenwnenwnwnw +wswswnwswswwswnwswwsweweswswswsw +swswenewweswwwsweewwseswwnwnw +swwwseswswwsenesweesweenwnewsese +eseeseneseewsweneeeeseeeeee +wwnwwnwnwnwwswsewnwnwnwnwewwwnw +nwneswnwswnenwenwnwnenwnwwsenwnwnwnwne +eeeeeeneneneeweeeese +seseswseswneneseseswsenwseseseswseswsesee +wswwseswswswswswewwswnwnewsww +esenwwwseswwwnewwewnewwwww +seeeeeneeseeesenweseesewnwesese +eswwewwwwnwwwwwsewwwewnwsw +seeseeseesenwnwseeswsweswseseseesesenw +eeseeweeeseeeeeeeee +seeeseewswsenwseenwseeseneneswese +nwnwnwwneneneneewnwenenenenwsenwswnw +wsesweswnewswneswsenesewswnwseswnesene +seswseseseswseseseseswnwswswseswsesenwe +newnenesewneneneeneneseneeneneneesw +swswswswwsweswswwwwswsenweswnwwne +enwwwnwswswswwsew +nwnwnwneswnenwnwnwnenenwe +nenwneneseswnenwnenwneswneswwswneseee +eneneneeneswswneneenwswenwwneseenenw +seseswnwsenwsewswnewnwwneewneswswnew +eneneenenenenenenenenewnenenenesw +neswneswwneneewseneneeewnwnenenwne +swnwnewneeseswnweneswnwsenwnwwsewe +swwenenwswwnwsweseswswsw +senenwnenenenewnwnewnwenwnwneeneswnee +wnewneswswswwneseswww +sewwweswsewseswswswswnewseeneesw +wnwnwwsewwnwneseewwwnwsenwwww +swswswwswwswewwswswswseeswswnwswsw +seswneswsewswswswseseeswsw +nwwwnwsenwwseseneewwnwnwwwwnw +swswswswnwswwswsewne +sewneswswwweseneneeswnwnwswewswswe +nenwenwenwnwwnwnenwnenenenwnwneswnenw +eeneseseseseenwseswnewsesenwwew +nenwnesenenwwnenenenwnenenwneene +swseeseseseswsenewseseeswswnwswwswnwnwne +nwnenwnenwwnewswswseenwnwnwnw +seseswseswwsweswswswsenwswsenenwswswseswsw +nwwwsewwwwwnenwnwwwwwnwsenwsew +nenwnenwnenenenwnenwnenenesewneswnenenw +neenwnenesenwnenwnwneenwseswnwwwnwne +nenwnwnesenwnwenwnwsenwnwnwnwnwnwnwnww +swwwwwswwneswwwwsewwswwswenw +nwswswwswnwseseenww +nenwsesewneeswnwnenesenesenenewnwneee +swnewweneswseswswswswswswswswneswswswnwsw +eneseneeswwnwwnwnwsesewswenwnwsewnw +nweswnenenesenwneneneneswenenenenenenwnw +swnwnweneseenwewnweeswsenwswswnwese +esenwsweenwseeseeeeeesesweeese +wwwwwwwwwwwnesewww +swseswsesesenwseswswse +seseseswseesewseswseseseswswsese +wseeswswneseseswnwnwswswswnewwwwsw +wnwenwnwswnwnwswnwewewwnwnewnwnwse +enenwnwwwnwwwsenenwswnwseneseswnenw +eeeeswseseeeeseeeenwswnweeese +nwneswswswseswswwswswseeswswswwseswswsw +swseswnwswseswneswswswswswswsweswswsww +swswswswnwswswswsenweseseswseneseswswne +eswwnweseesesewnwsesesenwseseneesesese +enwseewnesweeenenwneseeswneeswenwe +wswwswswwseewswwnwwwseswnwswenw +nwnwnwwnwnwnwswnwnwnwe +swsenwnenwnwnwnwwe +nwseeseneeeeseeeeeeeswneseswe +neeeeewnenewnesesw +nwsewesenwnwnenenwnwsewwseneenwswnwnw +nwsewwnenenenesenwnwsenwsewnesenenwse +swsenenenwseseseswswsenwweeswsenwwsesw +wewswswwswwwwnenweswwsw +sewwwwneswnewwswwwwwwwnewwww +nenwnesenwenenwnenesenenwswswenewwnenene +eneeneeseeewneeneee +seswnwwwnenwewewnwenwwnwnwsesew +swseenewnesenwwsenwwseswnese +senwwwwewsenwwnwnwnwnwswnwnenwwswnwne +nwseseseneswsenenesesenewnesesenwswwseswe +sesewnwnwnweeswnwnwwnwnwwnwnenwnwnese +nwneneneenenwneswnwnwneneneneswnenenene +wweseseswswneswsesweseswseseswsewswe +esweseeeseswnwsenwseenwsenweesew +neswseeweeesweseeseesesenwseee +nwwnwnwswesewneenwsesewwwnwnwnww +nesewneseneeneneeeeenenewnenenenenenw +eswswswwswswwwwswnwswswwwswswsene +eeneneeneenenenwnenenewneeeeewsw +swseswneswswseseswswneseneswsesesese +weweseneneesweswswnenwenwnwwseswse +nenewnweesenenwneneneneeseneeneenenese +enenwwnwnwnwnwnewnwnwwswwwnwnwwnwse +seeseswseseeenwsesenesenwseseeeese +neenwwnesenwneneneswsenenenwnwsenwnwwne +swwwswswswnwwewswnewwnewwwswswsw +seswsesesesesewsesesenewneneseesesese +neswswnwswswswseswwnesewswnwse +wseseswnwsenwswswswseseeeswnewseeswsw +seseewenwseseseesesew +seneswseswnweneseswnwwnwsenenwsenwsesww +wwseneswswwswwneseswswswswwseswswwne From f5c1b03ddd79af35f1dfa7c163226518a7b1abf5 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 24 Dec 2020 13:26:37 +0100 Subject: [PATCH 158/479] 2020: d24: ex1: add solution --- 2020/d24/ex1/ex1.py | 49 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100755 2020/d24/ex1/ex1.py diff --git a/2020/d24/ex1/ex1.py b/2020/d24/ex1/ex1.py new file mode 100755 index 0000000..8c6d8ac --- /dev/null +++ b/2020/d24/ex1/ex1.py @@ -0,0 +1,49 @@ +#!/usr/bin/env python + +import sys +from collections import defaultdict +from typing import Dict, List, Tuple + +Offset = Tuple[int, int] + +DELTAS = { + "nw": (0, -1), + "ne": (1, -1), + "e": (1, 0), + "se": (0, 1), + "sw": (-1, 1), + "w": (-1, 0), +} + + +def to_offset(path: str) -> Offset: + offset = 0, 0 + i = 0 + while i < len(path): + direction = path[i] + i += 1 + if direction in ["s", "n"]: + direction += path[i] + i += 1 + x, y = offset + dx, dy = DELTAS[direction] + offset = x + dx, y + dy + return offset + + +def solve(raw: List[str]) -> int: + blacks: Dict[Offset, bool] = defaultdict(bool) + + for offset in map(to_offset, raw): + blacks[offset] = not blacks[offset] + + return sum(blacks.values()) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From c9f0b0b1ba2a51398a34a962709055cb35b5a0da Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 24 Dec 2020 13:26:45 +0100 Subject: [PATCH 159/479] 2020: d24: ex2: add input --- 2020/d24/ex2/input | 471 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 471 insertions(+) create mode 100644 2020/d24/ex2/input diff --git a/2020/d24/ex2/input b/2020/d24/ex2/input new file mode 100644 index 0000000..9b35a80 --- /dev/null +++ b/2020/d24/ex2/input @@ -0,0 +1,471 @@ +swswswswneswswwwswnewswswweswnwsww +nwwewenenwnenwnwnwnwneswnwswnwnwswswnw +seneswwwswwnenwnenwswswswswsewseeww +esenesenesesesewseseswnesesweesesesese +seseseeseenesewseenwsesewswwsesenwse +eswenewnenenewneneneneenenenenwnene +nwseeseseeseseseseewseesenwseeesese +nwnwswswswweneseswwswwneswswswswswsw +senenenwnenewneneneseswneeeenenenew +eswnwnesenwnwnenwnwnwnwwnwsenwwswswenw +wswneswswseesewswseswswswnenesenenwswswne +seswseswneswswswwnwswwswseneswswswswsee +neseseswnwesesesesewswsesenesenesesesw +wwswwwsweswwwww +seswwnwneenwswneenwewneneneseenee +eswseenweswewseneeeeseeswnwnwse +swsweswswswnweswswneswwswnwswwwswswswsw +nwwnwnwnwnwnwnwnwwswwnweneswwenwnw +sewswwwwwwwweswwwwneswwnwswnw +nwneeneeneneseneseneneneneneneswnenwnene +swnenenweeneeeseswweneenenenenene +nwnwnwsenwewsesenwenwwwswwnwnesenw +swnwswswswswswsewseswnewneseswswswneesw +wwweswwswwsewswswwwwnwwesewwne +swswsweneswswswenwswnewnwswwneswseswswe +nwnesewwnwwnwwwsew +enwwwnenwnewwwwswwseeswewe +neswseswswsenwseswnwseswse +senwseneneneneneeseneswnenenenenwnenwnw +swseneswwseenwsenwneneswnewnenewene +ewwwwwwwewwwnwswwwwwwwne +eswswenwsenwnwsenenw +nwneseewseswwsewswnwnwnwwwwnewww +nwwwwwwwwewnwwswnew +neeeseeesewseeeeeeeewe +wweswnenwwnewnwnwwwewsewnwwsew +swwswwwswwewwswswnwsweswnwwwww +eseswneenwneenweseenweeseeeenw +neneswneneneneneneneneneswnenwnwnw +nwnwwnwewwswwnwwwnwsewnwwenwnw +seswswswnwswwwwswwswneswwseswnw +nwseswenwwneneneseswneenwnenenwnenwnenw +nwnenenenesewwnenwnwnesenwnwnwnwnenwnwnw +wseeeneseeeseseesesenwseseswsesese +sweseswnwseseseswseswseseseswswswse +ewwwswswsenwewnewwwenwwwnwww +nwwsewnwnwnwneswwnwesewnwwnwnwnwnwne +nenwnwnwnenenwnenwnwswswnwneenenwnwnwne +esenwneswsesesweeeeweseseeseseswnw +swswswswwsesweseswswswsw +swsweneswwseswswswwswsenewswwswseswnene +nenenewnwnenenwenwnesenwneseswnwnwnwne +nenenenewneeseneneswneneneswsenenenwne +nenenwnenwswwnweesenwsenwnwnwseswnwnwnw +seseeenwsenwswsesenwseeseeseeseswese +swneeseseneswswnwswnwwwwswswnee +seeseseseneseseswsewseenenwwneseswse +wswseseenwwswnewenwswswwwnewwsw +nenewswnwnenwnwneeneswseeneswnenwnenesene +nwswsenweweseeneseesesesesesesesee +seneswswwesenenwswseswnwseseseseseswne +wwnwwweswnwnwwweneseewnwsesenw +swswneneneneenewnesenewweenweswne +eseneseneseenenewwswseweenweenenene +nwwnwwnwsenwnwnwnwwnwwnww +swweswsewewwwwwwwwwwnewne +swswnewseseseesenewseesesesesesenwese +swswnenwnenwnwnwnwnenenenwnwwnenwseene +wnwwwwnwnwwnwwnwnwwwnwnwsenwe +nwseswwwnenwwwwesewwwwwwwnenwnw +nwswswnwswwswwnenenwnwnwnwnewnenw +seswswswnwswswswswswswswswswswswsw +neneseeneswnwnenwnwsenwnenenewne +wwwwwnenwnwnweswwnwsewwwesese +swwswswwwwseswswenwnewswwswweswnw +swwswseswswseeswswswewswswnwswswese +nwnwewsenenwnesewwwwswnwnenwswsee +seseseenwwswseneneseswswnwnewswnwsenwse +wwswwnwwwwsewwwenewnwswnwwwe +swwwwswwswwswneseswswswwnewswwse +nenenwneeswnenesweneneneeneneswsewesw +seswswswseswswswswsweenwswswwseswwsw +swswswsewneseesenwseseswseswswswnwsesw +nwwnewnwnwswnwnwswnwsenwwnwenwnenww +wswwnwwwswwwwswe +eewneeeeneeswsee +wseneseeseewseseseswsewse +wwswnwnwwnewnwsewenenwswwewswwne +seneesesesesewswswwnwseswswseseswseswsw +ewnweeeseneseeseseeneseswwwee +wwwwswwsewwwwewwwwwswnwwne +swsewswswswseswseseeswsenwseswswswsenw +nenenenenesenenenenenenewenewneswsene +newnewewwnwnwnwsewwswnwwwwesww +neseeeneneeewnee +wsenwwnwenwnwwnwnwnwwnwnwwnw +nweswenwseseswwseeenwseenwswsesewsw +wwwswwwwsewwwwwwwwne +nenwnwnwnenwnwnwnenwwnwnwnwnwnwe +eeeeeweneeseeeesweeeeew +seneseeeeewewnweseeseseseeseese +swenenenenwesweewneeeneneeeeeee +wnenwseswnwwwsenwnwwnwnwwnwwnwnwnwnw +sewwwswnwwnwwwswwnewwewwwsw +swwwwswswwswswwwswnew +esweeneeswenwnweesweneeeeswee +eenweeseneeeeeeeeeseeenenwsw +nwneswweeneseswnwswnweeesesesenwe +neneneeswnwnwnwnenenwnenene +wseewseeseseneswsenwsenewsesweseswswse +eseswneneseneenenewswwnwnenenesenenenw +seswsesesweseswseswseswwsw +nwnenenenenwnenenwsenenwwsenewnenenene +eneneneneswnenenenenenenenwneneneswnwnw +neneeneneenwnenenesweneneewsweneene +swnwnwneswnwnwseenwnwnenwenewnwnwnwwnw +swswwnwwswnwwseswewswneseneswewneswe +neswswnewwswswwwswwsewww +nwneeenwswnwsenwnwnwnwnenwswnwnwsenwnw +neeswnwnwwnwseswesweneswnw +swnenwenwnwnwnwsesenwswnwnwnwnwnwnwnwnw +swseswswnenwwwwseswwwwsw +seswneseswseswswswsewesenwsenesewsesw +eseeneswseenwewseewneeeene +swnenenenenenenewwneneswnenenesenesenw +swnenwnenwnwenenenwnenenwnwnene +eswneenwwnwwwneewneneneswneseswee +neseneseneewneeeweewnwneeseee +nesenenenenwnwnenwswnwnenwnenenwnw +seswsesesenwseeeeseseeesesewseenw +eneswsewneeswnenweswneeswnewwswseene +eeseseseswneswseseeeeeeeeewne +wwwseswnenwwnwnwenenwnw +sesenesweeeeeweeeweeenwwe +wsewnwwsewwewwnew +esesenwnwwwneswwswsenwnwnwseswneswwew +nenwwnwnwnwswwenwwwenwwwnwnwwnw +seeeneeneeseeswnenenwsweweewee +swswswwswswswswwswswwswneswswsw +nweseneweseeswwnwwswswnw +wnwsweswseswswswswseswne +swnenenwneenenenenenenenenenenenene +swswswswswseswswwswswswwnwwenwnwseswesw +wswwswswwswswsweswewswwswnwnesw +neneeewneneeswnewneneeseseswewnw +seseswseeesenwsesweseneseeseeesese +nenenenwnesewneswneneseneenewnene +neneneneneneswwneneneneneesenenenenene +swswswnwswnwswsweeswswseswswswswswswnw +sweeseseneeeseeswnewnwnwwewsee +neswsenwnewwnwwwwwwswweseenenww +nwwwwnwwwsewnwwswnewwwnewww +nwswsweswswneswseswswswswwneseswwnesww +wsewwnwwwwswnewwwwsewswwwsw +nwwwwwsenewneewwseenewwsesw +nwnenwwnwwnwwnenenwnenwenesenwenwne +nwnenwnwsewnenwsenwnenenwnwnenenenwnene +wswswwwenwswenesewwnenwe +wseswneeswneseenwnwsenwswewwweswesw +swnwseseeeeewseswnwseneseswsenwsesene +sweneswnwnwswsweneswnwswneswneswsweswsw +eeeswnwswneeneenewswnewneneeee +senwwnenwenwnwwsenwnwnwnenw +esesenweseeeeseseeesesese +seeeeseneseseeeswseeeeseewsene +wneswwwwswswwwewwnesesenwwwse +wnwnwwwsenwnwswnwnwnenewnwnwwnwwnw +senewsesesesesesesesesesesese +eenweswneeenee +nwnenwwnwnwnwnwwwseenwnwnwwnwnwnwswnw +esweneseeneeneeneneneneneswnenewnee +nwwwwswwewnwnwww +neneeneewneeneneneswnwnesenenenenwnesene +wneswsesenewswwwwwwwnwswwwseww +wesenesewswsenwswneswswseswneesesese +sesesenwswsewnwsenwswseswesenenwseeseew +wwnwswwneswwweswwwwwwwswww +nenenwnesewwswswewsenwswnewwswew +wwwnwwwnenwwwwwnwswnwnw +nenwswneneneenenenenwnenwnwnwnenwnw +swenwswewswswswewnwwswnewswseswne +swsenweeseswenwseseswsenwsesewseswswse +eeeweswnwnenenweeswneeeseneeee +swwswneseswnwseneswnewswweseswnwww +swswswswnenwswswseswseswswswneswwseswsw +enwsewsweeseseseneweeseswesenwese +nesenweneneneneneswnwnwnenwnenwnenwnene +seswseeenwsesenweseseseseseneseeseeswse +senenwsewnwnwnenwewnwswwneswnwnwsweenw +neeewnenweseseseeswnesweneneewwse +eeenwswswseneweseneenweneneneew +swswneneswnenenenwnenwnenenenwnwnwwnwe +swsweswwswswswwnwwwweswswswwswnw +wewwewwwwnwswswwwwswwswsww +swwnwwswnweseswnwswseweenewwww +neswswswseswswseswswswseswwswswswsesenw +eneeneneneewneneneeneneenesew +nwnwnwnwnwnwnwsenwenenenwnwnwnwwnwnwswne +weneswnwsenewseseswseeseene +eseseweneenwnweseeseseneneweswswe +swswswswseswswsenwnwseswseeswswsweswnw +sweswwsweswswwswswsweswswwnwswnwenw +eeeseseeenwsewswesesewsenwsenesw +seneswseseseseneseseseweesesesw +ewnwnwwnenwwnwwnenwwnwsewwnwswww +senweeswseswneweesesesesewnwnwsee +wseseseseseseeneseese +neswneswewnwswwwwwwwswwwseewnwse +sewwsesesewnwswswswseeneeesesewse +sweswwneseneswswswswnwswnesene +eesweeenenweeneeeswenwneeeene +eseseeneweeseeeeneenwneeenwne +neneneneneswneenenwnewneneneneswnenenenee +nwnesewwswswseswnwwneswswwswwsesesw +eeneeswesenwewenwneneeeseenwesw +nenwneneneneswnenenenwnwnenw +wwseewnewwneenwwnwswsewseenwse +wsenwwnwwswwwwwswnweewnenwsee +nweseswseseseeeseeseeseeesenwsese +neneswseesewesenenenwneswwswnewswswsenw +wwneseenwwsenwnwnwneswswewnwswwnwne +eneneeneneeneesw +nwnenenwenwnwseeenwwswnwnenwnenewnw +swsweswswsewewswswnwnwwsewwe +swseneswswswswswswsesewswswseseswswnesw +eseseesenwsenwseseeeweesesweeene +neswnwsewsweseswseseswsesesenwnwneseseswse +eeneeeseeseenwneeneeeeeewne +nenwswewnwsweneswwenwswneseseneenew +weeswwwwnenwswnwsenewnwswwnwnwenw +wwnewswswswwnwseswwwswswwwnwsew +newsenwwneswwnwwnwswseeswseswsenwww +swswwsweneswwwnwnee +nwswswswswswswswswnwnwswenwseswswseeswsw +nwnwnwnewswwswnwnwnenwsenweenwnwnwnese +nwenwseseseswswswswswswenwseswnwewswswse +swneswwewsenwnwnweeenenweeseese +nwwwwwswnwesenwwnee +nwnwwwwnwwnwnwsenw +nwseseseswswneseswswnwseseswsweswsweswsw +enweswnweswnweneeeneneneeeswee +sesenwseswnwswswnenesesesesweseseesesw +swseswsewnwnwwneswswswseswswneseswwsw +nenwnenwnwnwnwnesenwnwnwnwswnene +swwenweesenesweesenweseeeeee +swnewsesenwswesweeneneesewnw +swneweswsenwnenesese +nwnweseeseseseswseewseseenenwsee +neswswneseeeeenenwwneeenenwneseneene +swswswsesesesenwsesesenwseswsesese +nwswnwenwnwnwnwnwnwnwnwnwnwsenwnw +eeneesweeeeeeseswnweeneneewe +eeenweseseeeswnwwnwnenwswnewsenenw +neswswswswseseesweswsenwsesenwnwswswsesew +eseeeseenweseeeeseese +swwwswwswwswwsewwswswnwsww +swswwsenwswwswswswswwwswew +eeeseeeseswewneeswneee +sweseswswenwnwwswswnwnenwwseewwwsee +wwnwwwwnwnwwwwewwenewnwswww +sewneswnwseeneswwwnewnwenewseswwnw +seswswswswwswswswnwsweswswswswseswswe +seswswswswswnwneswnwswswsesesenese +eenweseeeseeeeneneeeweseesw +swnwseswswnweneswenwnewenenwnwswnenese +wweenewnwsewnwwnwnenwswseweesw +wwseneeneneneneseenwwswsewwesee +wwsenewwswswwwswwwwswsw +nwwswwwnwwwnenwnwwnwnenwwswwnesw +eneseeweseesesesweewnwenwwswe +eneneeeweneeseeeenesenenenwne +neeneeeeesweseweeeeeewee +swsewnesenweenwenwnwneseseswnwnenene +sewseswseseswseseseswswesenwneswsesese +nwwwnewsewswswwnwseewwwsenewne +enwneseeeeswswneeenwnweeewwsw +wnwswswswswswsweswsw +nenenenwnesenwnenwnwswwswnene +swseseseseenwesenwsesewseesewnwseenw +eswenwsweeeenwneswseeeenwwnee +sweeswswwswswnwwnwswseseeswsesw +nweenwswsesenwneswnweeeeseseswswsenw +wnewseenwnwswneseeeeswnenwneene +nwsewnwnwnenwnwnwswenwnwnwnwwnwnwnwse +swswswswswswswnwswswswswseeswnwseswswsw +senwseswseeseneseewnwnweeseesesesesese +eeseeeenweeeneeeeneeeew +seswsenwswseesesenwswsesweswneseswsesese +nwwnenwnwwwnwwwsenwwnwnwsewnwnewsew +swneswswswswnwwswswswseswswsweswseenw +swwnenwnwneneenenenwnenwnenenenwnwne +ewneswsenwnwenenenwswseeesewnwsww +wswswenwwnenwnwseeswwnweswswnweeswse +nwnwnwsewnwnwnwenwswwsewnwenwnwwnw +neneswneneneneneneeneenenwnenewnwneenesw +eeeseseeweeeeenee +nwnwnwswsenenwenwnwnwnwswnwnwsenwnwsweene +wwsewwwwswwnewwnewwswwswwsw +nesesewwneseneseweeenwsweenwswwse +eeenweesweeewweeeeneeeee +eseswnwwsenwswneswsesweseneeneneswwwsw +wnwnwnwnwewnwnwseenwwnww +enwsenwseseeneseeseseseeswnwseesesee +neneseseseeswswwseswnesesewswnwnwwee +neenwnwnwnenwsenwnwnwsenwnenenwnwneneswnwnw +senewnwnenweeewnenwnenenwswnwnenwswnwne +seseswseswsesesesesenesewseesesesesew +nenenenwwnwneeneenwswnwnenwnwnenewnee +wwwwwseswneewnewneswnwewswsenw +nwnenwnwnwnwenwnwnenenwnwsenwnwwwnwne +wswwsenewnenenesewneneseseseewnewsw +nwnwsenwnwnwnenwnwnwnwnwnwnwnw +nwswswnwnenenwenenewneeeneswswnenwwnene +sesenwnwenwnwwnwnwnwnwnwnwnwsenwneswsenw +nwneneneswnenwnwnwnenenwnenwsenwnene +seneswneewswnenwwneeeeneeneneewe +seswswswswswneswswswswwweswwswnwswwne +swnenwnwwnenwnwnwsenenwweesenenenew +swsewwnenwnwwwwsenwwwewnwwsenew +eeeeeneeneeweneeeneenwnewswene +nwnwnwnwwnwwwwnwwwwnewnwwswneswe +swwnwsweneseswwswnewswswnwswseswnwseswe +swswswswswswswswswswseswswswswneewnwww +senwnenwsenenewnwnwwsenenwnwnwnwenenw +wswnwenwenewnwwwwwnwnwwswwwsw +swseseswswseswseneswwseneseswwseswsesese +eeeswsenewenweseeeeseeeenesw +enwnenwneswwewnwsewnwnenenwnwse +nwnenwnenwenwnwnenwnwnwswnwnwnwneneswnw +sweswseswswnwswswswswswswseenwswsewsw +wnwnwewnweenwnwewnwwsenwweswnw +senenwnwwnwnwnwwnwwwnwnwnwnwnwnwnwsesw +nwnwnwneswnwnwenwnwnewnwneenwnwnwswne +seesenewnwneswnenenenenenenenesewnene +seswwswnenwnwseseswseswswswseseweneesw +swwswenwwnwnwwewwwnwwnwnwwe +nwnwnenenwnwsenenwnwsenwnwswnwnwnwnwnw +wewsesenwswnewnwnwwnw +nesenenewneesenenweneweneeneeneeswne +senwwsenwswswnwneesewwnwneenwwnwswe +nwnwenwnwnwswnwnwnwnwnwswnwnwwenwnwnwnw +nwnwnwswnwnwneewnesenwnwnwnewnenwnenwnwe +wseseenwswseneseseneeeseeeeesenw +nenewwsewwenenwwsewswwnwwswww +nwwwnwwnesewewwwwswwewwseww +eeswseneswwsenwesesweswwsenwnwnwnese +wnwwswwewwwwwwwsenwnwwnwwsenw +nwnwnwnwnwneseneenwnenwwneenenwnwwnw +nwnwsewswnesenenwenweneseeneswwnenwwne +nwseeneneneneeneneneneneswwwwewswse +nwnenwnenenenwwswneneswnwneneneeenenwne +swswswsweswnwwswswswsweswneswswswswsw +seswseseswseswseswswnwseswswswseneswew +senwwwweswnwneswenwwswnwnwnenwwse +swswswswsewseswsewsesesesweneswsesesw +enenewneneneeeewneneseeneeneseene +nwnwnwnwnwwsenwnwsenwnwsenwnwwnwnenwnwnesw +nenenenwswnwneneneneneneneenwsenenenenw +nwnenwnwnwnwnwenwnwnwswneswnwnwnwnwnwsenw +neenenwseswnwseswswnwwnenwnwnenenenwswsew +sewnenwnenwenesenwwnwsenenwwne +wswnwwswwnwnwnwnenewnwnw +senwswneeswswswswwwswswswwsweswwsw +esewswneeeeneeewneneneneseenenwnene +nenwnwwneswnwswnwnenwswnwnwsenenwnenwnwnw +wswswnwswswwswnwswwsweweswswswsw +swswenewweswwwsweewwseswwnwnw +swwwseswswwsenesweesweenwnewsese +eseeseneseewsweneeeeseeeeee +wwnwwnwnwnwwswsewnwnwnwnwewwwnw +nwneswnwswnenwenwnwnenwnwwsenwnwnwnwne +eeeeeeneneneeweeeese +seseswseswneneseseswsenwseseseswseswsesee +wswwseswswswswswewwswnwnewsww +esenwwwseswwwnewwewnewwwww +seeeeeneeseeesenweseesewnwesese +eswwewwwwnwwwwwsewwwewnwsw +seeseeseesenwnwseeswsweswseseseesesenw +eeseeweeeseeeeeeeee +seeeseewswsenwseenwseeseneneswese +nwnwnwwneneneneewnwenenenenwsenwswnw +wsesweswnewswneswsenesewswnwseswnesene +seswseseseswseseseseswnwswswseswsesenwe +newnenesewneneneeneneseneeneneneesw +swswswswwsweswswwwwswsenweswnwwne +enwwwnwswswswwsew +nwnwnwneswnenwnwnwnenenwe +nenwneneseswnenwnenwneswneswwswneseee +eneneneeneswswneneenwswenwwneseenenw +seseswnwsenwsewswnewnwwneewneswswnew +eneneenenenenenenenenewnenenenesw +neswneswwneneewseneneeewnwnenenwne +swnwnewneeseswnweneswnwsenwnwwsewe +swwenenwswwnwsweseswswsw +senenwnenenenewnwnewnwenwnwneeneswnee +wnewneswswswwneseswww +sewwweswsewseswswswswnewseeneesw +wnwnwwsewwnwneseewwwnwsenwwww +swswswwswwswewwswswswseeswswnwswsw +seswneswsewswswswseseeswsw +nwwwnwsenwwseseneewwnwnwwwwnw +swswswswnwswwswsewne +sewneswswwweseneneeswnwnwswewswswe +nenwenwenwnwwnwnenwnenenenwnwneswnenw +eeneseseseseenwseswnewsesenwwew +nenwnesenenwwnenenenwnenenwneene +swseeseseseswsenewseseeswswnwswwswnwnwne +nwnenwnenwwnewswswseenwnwnwnw +seseswseswwsweswswswsenwswsenenwswswseswsw +nwwwsewwwwwnenwnwwwwwnwsenwsew +nenwnenwnenenenwnenwnenenesewneswnenenw +neenwnenesenwnenwnwneenwseswnwwwnwne +nenwnwnesenwnwenwnwsenwnwnwnwnwnwnwnww +swwwwwswwneswwwwsewwswwswenw +nwswswwswnwseseenww +nenwsesewneeswnwnenesenesenenewnwneee +swnewweneswseswswswswswswswswneswswswnwsw +eneseneeswwnwwnwnwsesewswenwnwsewnw +nweswnenenesenwneneneneswenenenenenenwnw +swnwnweneseenwewnweeswsenwswswnwese +esenwsweenwseeseeeeeesesweeese +wwwwwwwwwwwnesewww +swseswsesesenwseswswse +seseseswseesewseswseseseswswsese +wseeswswneseseswnwnwswswswnewwwwsw +wnwenwnwswnwnwswnwewewwnwnewnwnwse +enenwnwwwnwwwsenenwswnwseneseswnenw +eeeeswseseeeeseeeenwswnweeese +nwneswswswseswswwswswseeswswswwseswswsw +swseswnwswseswneswswswswswswsweswswsww +swswswswnwswswswsenweseseswseneseswswne +eswwnweseesesewnwsesesenwseseneesesese +enwseewnesweeenenwneseeswneeswenwe +wswwswswwseewswwnwwwseswnwswenw +nwnwnwwnwnwnwswnwnwnwe +swsenwnenwnwnwnwwe +nwseeseneeeeseeeeeeeswneseswe +neeeeewnenewnesesw +nwsewesenwnwnenenwnwsewwseneenwswnwnw +nwsewwnenenenesenwnwsenwsewnesenenwse +swsenenenwseseseswswsenwweeswsenwwsesw +wewswswwswwwwnenweswwsw +sewwwwneswnewwswwwwwwwnewwww +nenwnesenwenenwnenesenenwswswenewwnenene +eneeneeseeewneeneee +seswnwwwnenwewewnwenwwnwnwsesew +swseenewnesenwwsenwwseswnese +senwwwwewsenwwnwnwnwnwswnwnenwwswnwne +nwseseseneswsenenesesenewnesesenwswwseswe +sesewnwnwnweeswnwnwwnwnwwnwnenwnwnese +nwneneneenenwneswnwnwneneneneswnenenene +wweseseswswneswsesweseswseseswsewswe +esweseeeseswnwsenwseenwsenweesew +neswseeweeesweseeseesesenwseee +nwwnwnwswesewneenwsesewwwnwnwnww +nesewneseneeneneeeeenenewnenenenenenw +eswswswwswswwwwswnwswswwwswswsene +eeneneeneenenenwnenenewneeeeewsw +swseswneswswseseswswneseneswsesesese +weweseneneesweswswnenwenwnwwseswse +nenewnweesenenwneneneneeseneeneenenese +enenwwnwnwnwnwnewnwnwwswwwnwnwwnwse +seeseswseseeenwsesenesenwseseeeese +neenwwnesenwneneneswsenenenwnwsenwnwwne +swwwswswswnwwewswnewwnewwwswswsw +seswsesesesesewsesesenewneneseesesese +neswswnwswswswseswwnesewswnwse +wseseswnwsenwswswswseseeeswnewseeswsw +seseewenwseseseesesew +seneswseswnweneseswnwwnwsenenwsenwsesww +wwseneswswwswwneseswswswswwseswswwne From 856efa526ef261dc165843e9b080a3a4af4996bf Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 24 Dec 2020 13:26:52 +0100 Subject: [PATCH 160/479] 2020: d24: ex2: add solution --- 2020/d24/ex2/ex2.py | 75 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 2020/d24/ex2/ex2.py diff --git a/2020/d24/ex2/ex2.py b/2020/d24/ex2/ex2.py new file mode 100755 index 0000000..ef749f9 --- /dev/null +++ b/2020/d24/ex2/ex2.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import defaultdict +from typing import Dict, Iterator, List, Tuple + +Offset = Tuple[int, int] +Grid = Dict[Offset, bool] + +DELTAS = { + "nw": (0, -1), + "ne": (1, -1), + "e": (1, 0), + "se": (0, 1), + "sw": (-1, 1), + "w": (-1, 0), +} + + +def to_offset(path: str) -> Offset: + offset = 0, 0 + i = 0 + while i < len(path): + direction = path[i] + i += 1 + if direction in ["s", "n"]: + direction += path[i] + i += 1 + x, y = offset + dx, dy = DELTAS[direction] + offset = x + dx, y + dy + return offset + + +def neighbours(tile: Offset) -> Iterator[Offset]: + x, y = tile + for dx, dy in DELTAS.values(): + yield x + dx, y + dy + + +def step(blacks: Grid) -> Grid: + to_visit = set(itertools.chain.from_iterable(neighbours(tile) for tile in blacks)) + to_visit |= {tile for tile in blacks} + res: Grid = defaultdict(bool) + + for tile in to_visit: + num_neighbours = sum(blacks[n] for n in neighbours(tile)) + if blacks[tile]: + res[tile] = num_neighbours in (1, 2) + else: + res[tile] = num_neighbours == 2 + + return res + + +def solve(raw: List[str]) -> int: + blacks: Grid = defaultdict(bool) + + for offset in map(to_offset, raw): + blacks[offset] = not blacks[offset] + + for __ in range(100): + blacks = step(blacks) + + return sum(blacks.values()) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 40cf84e0816f364f674dd3f696d6c221a58e65f2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 25 Dec 2020 11:39:33 +0100 Subject: [PATCH 161/479] 2020: d25: ex1: add input --- 2020/d25/ex1/input | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 2020/d25/ex1/input diff --git a/2020/d25/ex1/input b/2020/d25/ex1/input new file mode 100644 index 0000000..fe514d8 --- /dev/null +++ b/2020/d25/ex1/input @@ -0,0 +1,2 @@ +8987316 +14681524 From 68a8ae07fa4894908f74a5e1db34ddb0398c9f17 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 25 Dec 2020 11:39:46 +0100 Subject: [PATCH 162/479] 2020: d25: ex1: add solution --- 2020/d25/ex1/ex1.py | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100755 2020/d25/ex1/ex1.py diff --git a/2020/d25/ex1/ex1.py b/2020/d25/ex1/ex1.py new file mode 100755 index 0000000..6e346d5 --- /dev/null +++ b/2020/d25/ex1/ex1.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List + + +def step(value: int, subject: int) -> int: + value *= subject + value %= 20201227 + return value + + +def solve(raw: List[int]) -> int: + value = 1 + + for rounds in itertools.count(1): + value = step(value, 7) + if value == raw[0]: + break + + key = 1 + for __ in range(rounds): + key = step(key, raw[1]) + + return key + + +def main() -> None: + input = [int(line) for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 079e7358dea189570778f6fe8350968e7298c7ad Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 25 Dec 2020 11:40:36 +0100 Subject: [PATCH 163/479] 2020: d25: ex2: add input --- 2020/d25/ex2/input | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 2020/d25/ex2/input diff --git a/2020/d25/ex2/input b/2020/d25/ex2/input new file mode 100644 index 0000000..fe514d8 --- /dev/null +++ b/2020/d25/ex2/input @@ -0,0 +1,2 @@ +8987316 +14681524 From e69a4511898aa0ac535d903f77d7a21cf196fbfc Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 25 Dec 2020 11:40:47 +0100 Subject: [PATCH 164/479] 2020: d25: ex2: add solution --- 2020/d25/ex2/ex2.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 2020/d25/ex2/ex2.py diff --git a/2020/d25/ex2/ex2.py b/2020/d25/ex2/ex2.py new file mode 100755 index 0000000..918e0ec --- /dev/null +++ b/2020/d25/ex2/ex2.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python + + +def main() -> None: + print("There is no part two...") + + +if __name__ == "__main__": + main() From 0547c87c24db9beae0fac14eefabe5011b3f545c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 1 Dec 2021 10:41:02 +0100 Subject: [PATCH 165/479] nix: add flake --- flake.lock | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..b743e83 --- /dev/null +++ b/flake.lock @@ -0,0 +1,69 @@ +{ + "nodes": { + "futils": { + "locked": { + "lastModified": 1638122382, + "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", + "type": "github" + }, + "original": { + "owner": "numtide", + "ref": "master", + "repo": "flake-utils", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1638286143, + "narHash": "sha256-A+rgjbIpz3uPRKHPXwdmouVcVn5pZqLnaZHymjkraG4=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "29d1f6e1f625d246dcf84a78ef97b4da3cafc6ea", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-utils": [ + "futils" + ], + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1637745948, + "narHash": "sha256-DmQG1bZk24eS+BAHwnHPyYIadMLKbq0d1b//iapYIPU=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "c3b4f94350b0e59c2546fa85890cc70d03616b9c", + "type": "github" + }, + "original": { + "owner": "cachix", + "ref": "master", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "futils": "futils", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..614040f --- /dev/null +++ b/flake.nix @@ -0,0 +1,65 @@ +{ + description = "My Advent of Code solutions"; + + inputs = { + futils = { + type = "github"; + owner = "numtide"; + repo = "flake-utils"; + ref = "master"; + }; + + nixpkgs = { + type = "github"; + owner = "NixOS"; + repo = "nixpkgs"; + ref = "nixos-unstable"; + }; + + pre-commit-hooks = { + type = "github"; + owner = "cachix"; + repo = "pre-commit-hooks.nix"; + ref = "master"; + inputs = { + flake-utils.follows = "futils"; + nixpkgs.follows = "nixpkgs"; + }; + }; + }; + + outputs = { self, futils, nixpkgs, pre-commit-hooks }: + futils.lib.eachDefaultSystem (system: + let + pkgs = import nixpkgs { inherit system; }; + in + { + checks = { + pre-commit = pre-commit-hooks.lib.${system}.run { + src = self; + + hooks = { + black = { + enable = true; + }; + + isort = { + enable = true; + }; + + nixpkgs-fmt = { + enable = true; + }; + }; + }; + }; + + devShell = pkgs.mkShell { + buildInputs = with pkgs; [ + python3 + ]; + + inherit (self.checks.${system}.pre-commit) shellHook; + }; + }); +} From 75b16e08b19b3d973f700e8ec606389a5fe65ecf Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 6 Dec 2021 13:57:27 +0100 Subject: [PATCH 166/479] isort: use 'black' compatible style --- .isort.cfg | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .isort.cfg diff --git a/.isort.cfg b/.isort.cfg new file mode 100644 index 0000000..b9fb3f3 --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,2 @@ +[settings] +profile=black From 9159553e6beff50a51542eef12693b745165adcb Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 1 Dec 2021 10:41:10 +0100 Subject: [PATCH 167/479] nix: add direnv integration --- .envrc | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .envrc diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..c23bb91 --- /dev/null +++ b/.envrc @@ -0,0 +1,7 @@ +use_flake() { + watch_file flake.nix + watch_file flake.lock + eval "$(nix print-dev-env)" +} + +use flake From 87a8b8a3d348bdc12e67809f910148dcc78ea57a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 1 Dec 2021 10:42:41 +0100 Subject: [PATCH 168/479] git: ignore generated files --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..709b317 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# Generated by Nix +/.pre-commit-config.yaml From dcd66ec6f41f8591afc36cbd78d1aaffcc3ab16e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 1 Dec 2021 10:43:12 +0100 Subject: [PATCH 169/479] 2021: d01: ex1: add input --- 2021/d01/ex1/input | 2000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2000 insertions(+) create mode 100644 2021/d01/ex1/input diff --git a/2021/d01/ex1/input b/2021/d01/ex1/input new file mode 100644 index 0000000..1a551ed --- /dev/null +++ b/2021/d01/ex1/input @@ -0,0 +1,2000 @@ +176 +184 +188 +142 +151 +156 +157 +167 +166 +178 +182 +191 +190 +191 +192 +196 +197 +201 +204 +207 +212 +213 +231 +232 +234 +232 +239 +268 +279 +280 +282 +278 +283 +284 +283 +296 +302 +320 +321 +332 +334 +332 +335 +340 +347 +348 +352 +342 +334 +333 +332 +357 +365 +366 +386 +394 +391 +387 +388 +389 +391 +394 +381 +392 +394 +397 +407 +428 +441 +444 +447 +448 +449 +450 +449 +453 +467 +476 +472 +486 +512 +517 +519 +530 +533 +537 +538 +552 +554 +550 +575 +583 +585 +597 +598 +600 +601 +602 +606 +607 +609 +611 +603 +604 +597 +598 +599 +606 +612 +615 +626 +621 +623 +624 +627 +630 +642 +641 +644 +642 +645 +648 +640 +636 +640 +660 +669 +676 +688 +689 +712 +716 +711 +715 +698 +705 +729 +730 +731 +714 +720 +710 +723 +727 +730 +738 +739 +743 +753 +755 +763 +765 +761 +758 +759 +780 +803 +788 +789 +810 +827 +837 +849 +843 +853 +852 +853 +865 +866 +876 +878 +871 +874 +878 +884 +888 +892 +887 +893 +894 +905 +906 +887 +912 +905 +898 +901 +879 +882 +897 +920 +918 +911 +916 +922 +931 +933 +931 +936 +943 +945 +955 +956 +951 +957 +953 +960 +965 +973 +994 +1012 +1016 +1022 +1025 +1028 +1031 +1032 +1037 +1038 +1031 +1035 +1053 +1057 +1074 +1075 +1081 +1080 +1060 +1063 +1053 +1055 +1053 +1062 +1063 +1060 +1062 +1065 +1066 +1063 +1064 +1074 +1073 +1081 +1095 +1089 +1106 +1111 +1097 +1098 +1101 +1107 +1111 +1113 +1125 +1118 +1133 +1142 +1141 +1144 +1145 +1153 +1165 +1167 +1174 +1178 +1158 +1165 +1174 +1175 +1191 +1194 +1192 +1189 +1190 +1193 +1194 +1196 +1214 +1238 +1246 +1272 +1273 +1287 +1288 +1296 +1298 +1299 +1315 +1320 +1324 +1326 +1341 +1342 +1341 +1368 +1375 +1386 +1387 +1388 +1399 +1397 +1398 +1408 +1407 +1409 +1410 +1422 +1419 +1423 +1419 +1415 +1416 +1446 +1468 +1479 +1484 +1488 +1489 +1491 +1495 +1504 +1505 +1504 +1520 +1540 +1547 +1541 +1548 +1539 +1541 +1548 +1544 +1545 +1547 +1532 +1552 +1566 +1570 +1571 +1569 +1571 +1572 +1543 +1544 +1546 +1547 +1576 +1574 +1592 +1597 +1600 +1608 +1609 +1623 +1631 +1647 +1640 +1657 +1660 +1677 +1674 +1669 +1670 +1654 +1667 +1680 +1696 +1698 +1699 +1700 +1706 +1696 +1697 +1699 +1698 +1699 +1711 +1715 +1689 +1690 +1701 +1705 +1739 +1741 +1745 +1737 +1729 +1749 +1751 +1758 +1759 +1756 +1758 +1772 +1773 +1783 +1807 +1806 +1813 +1827 +1831 +1832 +1835 +1840 +1857 +1866 +1872 +1875 +1874 +1879 +1890 +1883 +1905 +1908 +1922 +1946 +1936 +1939 +1941 +1945 +1950 +1951 +1956 +1950 +1951 +1952 +1957 +1958 +1969 +1972 +2004 +2013 +2026 +2028 +2034 +2043 +2048 +2064 +2074 +2068 +2081 +2063 +2064 +2065 +2069 +2047 +2046 +2033 +2035 +2034 +2035 +2037 +2038 +2033 +2038 +2039 +2046 +2047 +2048 +2043 +2083 +2086 +2093 +2107 +2108 +2091 +2105 +2113 +2109 +2106 +2116 +2119 +2126 +2127 +2132 +2135 +2147 +2148 +2143 +2150 +2151 +2153 +2166 +2171 +2173 +2175 +2178 +2180 +2192 +2227 +2231 +2253 +2255 +2256 +2257 +2258 +2259 +2269 +2277 +2279 +2282 +2308 +2309 +2333 +2340 +2346 +2354 +2355 +2371 +2372 +2375 +2393 +2394 +2400 +2404 +2400 +2402 +2393 +2388 +2403 +2402 +2422 +2424 +2417 +2416 +2421 +2422 +2431 +2428 +2409 +2405 +2415 +2411 +2413 +2415 +2419 +2423 +2431 +2432 +2450 +2460 +2466 +2458 +2461 +2462 +2463 +2471 +2476 +2489 +2490 +2491 +2492 +2490 +2491 +2495 +2511 +2514 +2516 +2514 +2516 +2519 +2525 +2527 +2501 +2503 +2506 +2513 +2537 +2543 +2547 +2554 +2570 +2580 +2601 +2611 +2609 +2611 +2617 +2620 +2623 +2615 +2619 +2633 +2648 +2649 +2662 +2670 +2671 +2675 +2707 +2708 +2717 +2718 +2719 +2739 +2742 +2737 +2738 +2739 +2759 +2771 +2783 +2784 +2800 +2805 +2820 +2815 +2836 +2837 +2839 +2867 +2869 +2868 +2874 +2881 +2883 +2909 +2903 +2904 +2909 +2912 +2914 +2920 +2921 +2923 +2928 +2929 +2930 +2909 +2915 +2927 +2928 +2930 +2923 +2921 +2918 +2911 +2915 +2920 +2929 +2930 +2940 +2942 +2951 +2969 +2980 +2985 +2989 +2983 +2986 +2994 +3002 +3017 +3027 +3042 +3048 +3050 +3048 +3049 +3073 +3080 +3082 +3071 +3094 +3124 +3132 +3133 +3137 +3138 +3142 +3161 +3176 +3188 +3185 +3189 +3193 +3194 +3195 +3196 +3200 +3211 +3212 +3215 +3223 +3224 +3230 +3234 +3227 +3231 +3218 +3213 +3218 +3239 +3225 +3216 +3224 +3226 +3229 +3230 +3231 +3212 +3225 +3234 +3237 +3236 +3237 +3243 +3252 +3257 +3261 +3260 +3263 +3265 +3266 +3272 +3279 +3280 +3285 +3284 +3290 +3291 +3290 +3307 +3312 +3342 +3344 +3343 +3344 +3343 +3342 +3343 +3340 +3344 +3348 +3349 +3337 +3346 +3357 +3361 +3369 +3370 +3383 +3375 +3371 +3375 +3397 +3401 +3407 +3408 +3409 +3391 +3394 +3393 +3396 +3399 +3404 +3407 +3409 +3411 +3412 +3415 +3433 +3437 +3449 +3446 +3447 +3448 +3444 +3445 +3441 +3456 +3479 +3488 +3487 +3491 +3496 +3485 +3498 +3500 +3533 +3537 +3544 +3545 +3544 +3553 +3559 +3567 +3590 +3577 +3586 +3584 +3594 +3595 +3594 +3603 +3617 +3619 +3624 +3652 +3627 +3622 +3647 +3648 +3650 +3667 +3668 +3664 +3672 +3678 +3688 +3689 +3696 +3704 +3690 +3691 +3692 +3683 +3685 +3684 +3689 +3693 +3694 +3693 +3696 +3704 +3717 +3722 +3718 +3690 +3691 +3687 +3688 +3685 +3687 +3688 +3701 +3698 +3699 +3700 +3702 +3708 +3704 +3711 +3714 +3719 +3730 +3731 +3730 +3751 +3757 +3760 +3766 +3767 +3764 +3761 +3742 +3771 +3789 +3810 +3807 +3787 +3792 +3791 +3792 +3797 +3802 +3801 +3809 +3817 +3850 +3851 +3853 +3860 +3861 +3866 +3862 +3853 +3857 +3861 +3868 +3869 +3870 +3879 +3893 +3894 +3903 +3912 +3944 +3955 +3956 +3960 +3986 +3969 +3970 +3974 +3976 +4006 +4008 +4013 +4038 +4043 +4056 +4071 +4076 +4097 +4098 +4099 +4109 +4111 +4112 +4118 +4126 +4128 +4129 +4125 +4124 +4126 +4127 +4130 +4150 +4153 +4168 +4187 +4186 +4171 +4166 +4172 +4182 +4201 +4226 +4227 +4251 +4250 +4263 +4294 +4317 +4318 +4332 +4330 +4308 +4309 +4310 +4313 +4329 +4331 +4349 +4350 +4348 +4345 +4347 +4342 +4340 +4342 +4359 +4371 +4387 +4412 +4411 +4412 +4415 +4422 +4423 +4427 +4455 +4456 +4460 +4471 +4485 +4491 +4492 +4491 +4492 +4521 +4527 +4532 +4539 +4552 +4537 +4551 +4562 +4566 +4581 +4588 +4590 +4591 +4590 +4595 +4596 +4597 +4598 +4618 +4617 +4618 +4621 +4622 +4628 +4632 +4628 +4644 +4629 +4643 +4635 +4639 +4640 +4645 +4647 +4639 +4641 +4642 +4645 +4657 +4645 +4650 +4655 +4671 +4674 +4675 +4670 +4671 +4702 +4715 +4714 +4722 +4723 +4727 +4737 +4733 +4761 +4762 +4763 +4766 +4772 +4773 +4774 +4775 +4778 +4779 +4786 +4787 +4788 +4792 +4796 +4797 +4795 +4796 +4816 +4807 +4839 +4841 +4842 +4843 +4860 +4862 +4839 +4842 +4843 +4844 +4846 +4848 +4846 +4844 +4847 +4849 +4855 +4859 +4852 +4855 +4864 +4865 +4889 +4892 +4891 +4893 +4890 +4891 +4892 +4914 +4913 +4912 +4915 +4918 +4920 +4924 +4927 +4922 +4914 +4913 +4912 +4920 +4913 +4915 +4917 +4919 +4922 +4930 +4924 +4918 +4930 +4937 +4932 +4933 +4938 +4942 +4943 +4944 +4945 +4962 +4965 +4967 +4948 +4937 +4938 +4943 +4950 +4934 +4945 +4946 +4962 +4964 +4977 +4988 +5005 +5025 +5024 +5049 +5055 +5060 +5050 +5051 +5049 +5050 +5049 +5053 +5063 +5086 +5121 +5138 +5150 +5155 +5154 +5165 +5176 +5154 +5155 +5163 +5154 +5190 +5193 +5192 +5194 +5192 +5194 +5203 +5219 +5223 +5237 +5250 +5251 +5250 +5254 +5257 +5242 +5245 +5244 +5250 +5253 +5262 +5251 +5276 +5277 +5273 +5275 +5274 +5283 +5290 +5303 +5309 +5315 +5317 +5321 +5318 +5325 +5324 +5325 +5332 +5353 +5355 +5331 +5332 +5351 +5374 +5377 +5379 +5370 +5383 +5377 +5381 +5388 +5389 +5424 +5425 +5431 +5432 +5433 +5400 +5411 +5415 +5428 +5429 +5416 +5419 +5446 +5455 +5462 +5463 +5466 +5479 +5480 +5489 +5490 +5491 +5495 +5516 +5506 +5507 +5508 +5511 +5509 +5522 +5521 +5525 +5533 +5556 +5558 +5555 +5559 +5561 +5552 +5553 +5565 +5566 +5579 +5584 +5585 +5582 +5583 +5595 +5596 +5618 +5620 +5621 +5622 +5631 +5633 +5634 +5635 +5637 +5638 +5637 +5638 +5647 +5646 +5684 +5683 +5685 +5687 +5690 +5697 +5691 +5692 +5689 +5692 +5695 +5705 +5707 +5729 +5730 +5717 +5726 +5727 +5734 +5730 +5737 +5735 +5736 +5755 +5752 +5764 +5762 +5761 +5765 +5774 +5775 +5776 +5753 +5754 +5763 +5769 +5768 +5773 +5772 +5779 +5776 +5793 +5802 +5815 +5819 +5816 +5811 +5812 +5814 +5812 +5815 +5813 +5827 +5800 +5802 +5801 +5802 +5805 +5809 +5817 +5826 +5832 +5833 +5836 +5838 +5840 +5853 +5859 +5870 +5873 +5879 +5891 +5898 +5907 +5902 +5905 +5910 +5914 +5918 +5913 +5914 +5913 +5914 +5935 +5954 +5963 +5964 +5973 +5977 +5978 +5988 +5980 +5981 +5984 +5986 +5985 +5987 +5995 +6002 +6003 +6001 +6007 +6009 +6012 +6019 +6022 +6023 +6022 +6023 +6024 +6025 +6027 +6028 +6030 +6032 +6050 +6041 +6042 +6041 +6043 +6044 +6079 +6086 +6077 +6088 +6098 +6100 +6101 +6103 +6105 +6106 +6114 +6118 +6119 +6121 +6130 +6138 +6139 +6135 +6146 +6147 +6150 +6162 +6163 +6180 +6188 +6190 +6196 +6192 +6195 +6205 +6203 +6204 +6206 +6207 +6203 +6204 +6205 +6211 +6210 +6214 +6230 +6233 +6234 +6248 +6239 +6249 +6263 +6265 +6273 +6275 +6274 +6278 +6272 +6286 +6288 +6292 +6271 +6276 +6285 +6286 +6287 +6291 +6300 +6307 +6312 +6313 +6314 +6316 +6317 +6331 +6332 +6334 +6332 +6331 +6344 +6339 +6350 +6354 +6356 +6358 +6361 +6370 +6374 +6377 +6363 +6364 +6367 +6360 +6356 +6358 +6361 +6362 +6364 +6386 +6393 +6415 +6419 +6421 +6418 +6424 +6426 +6433 +6442 +6444 +6436 +6440 +6442 +6441 +6444 +6450 +6432 +6451 +6467 +6472 +6476 +6469 +6470 +6468 +6480 +6503 +6505 +6506 +6493 +6495 +6496 +6504 +6509 +6500 +6491 +6503 +6524 +6542 +6556 +6557 +6566 +6577 +6573 +6579 +6586 +6587 +6595 +6606 +6612 +6615 +6633 +6635 +6636 +6634 +6624 +6626 +6627 +6641 +6644 +6654 +6657 +6656 +6655 +6658 +6660 +6665 +6664 +6665 +6685 +6676 +6677 +6679 +6682 +6712 +6717 +6724 +6733 +6735 +6742 +6747 +6771 +6772 +6788 +6802 +6814 +6815 +6814 +6820 +6819 +6823 +6822 +6826 +6835 +6840 +6842 +6847 +6843 +6823 +6829 +6824 +6823 +6825 +6826 +6825 +6829 +6830 +6831 +6847 +6876 +6878 +6879 +6880 +6881 +6888 +6909 +6912 +6913 +6911 +6920 +6923 +6927 +6941 +6951 +6946 +6948 +6954 +6957 +6956 +6958 +6964 +6966 +6971 +6972 +6985 +6987 +6988 +6989 +6997 +6998 +6986 +6988 +6987 +6994 +7000 +7004 +7009 +7020 +7025 +7035 +7045 +7047 +7062 +7065 +7066 +7052 +7053 +7052 +7046 +7050 +7053 +7054 +7057 +7047 +7050 +7036 +7043 +7034 +7016 +7040 +7039 +7040 +7042 +7029 +7037 +7052 +7056 +7057 +7058 +7062 +7063 +7051 +7053 +7056 +7057 +7058 +7059 +7061 +7082 +7081 +7089 +7090 +7086 +7090 +7094 +7095 +7100 +7101 +7076 +7079 +7085 +7089 +7093 +7109 +7110 +7104 +7093 +7100 +7111 +7109 +7104 +7116 +7117 +7115 +7111 +7124 +7125 +7124 +7125 +7120 +7118 +7119 +7112 +7114 +7115 +7141 +7140 +7141 +7168 +7158 +7189 +7195 +7196 +7193 +7221 +7225 +7227 +7228 +7229 +7239 +7242 +7243 +7252 +7260 +7276 +7278 +7277 +7295 +7298 +7313 +7296 +7297 +7319 +7342 +7343 +7347 +7359 +7343 +7344 +7348 +7361 +7365 +7366 +7368 +7377 +7378 +7375 +7376 +7368 +7388 +7385 +7400 +7401 +7402 +7404 +7413 +7411 +7414 +7415 +7417 +7422 +7421 +7419 +7428 +7437 +7436 +7437 +7440 +7442 +7440 +7442 +7463 +7478 +7488 +7506 +7510 +7518 +7531 +7537 +7534 +7533 +7523 +7522 +7538 +7528 +7530 +7533 +7535 +7530 +7546 +7547 +7548 +7545 +7546 +7541 +7553 +7554 +7555 +7556 +7564 +7568 +7589 +7590 +7609 +7619 +7624 +7627 +7629 +7630 +7651 +7664 +7658 +7656 +7667 +7670 +7678 +7682 +7683 +7694 +7695 +7696 +7704 +7706 +7716 +7723 +7722 +7725 +7730 +7728 +7729 +7723 +7738 +7717 +7711 +7727 +7705 +7716 +7713 +7703 +7710 +7712 +7713 +7714 +7715 +7718 +7721 +7735 +7739 +7722 +7726 +7727 +7737 +7743 +7744 +7724 +7723 +7724 +7726 +7754 +7760 +7758 +7769 +7768 +7769 +7775 +7776 +7777 +7785 +7822 +7823 +7822 +7824 +7826 +7849 +7854 +7860 +7836 +7839 +7838 +7839 +7859 +7861 +7862 +7863 +7873 +7863 +7885 +7887 +7889 +7882 +7881 +7882 +7883 +7888 +7890 +7902 +7907 +7908 +7942 +7947 +7946 +7948 +7949 +7952 +7953 +7952 +7954 +7937 +7933 +7928 +7932 +7933 +7938 +7939 +7941 +7943 +7944 +7946 +7940 +7941 +7940 +7935 +7938 +7939 +7938 +7965 +7986 +8006 +7999 +8000 +8016 +8027 +8026 +8027 +8030 +8031 +8032 +8033 +8035 +8036 +8038 +8041 +8054 +8059 +8060 +8055 +8053 +8058 +8067 +8071 +8081 +8082 +8083 +8099 +8121 +8102 +8101 +8093 +8106 +8113 +8114 +8117 +8121 +8146 +8158 +8144 +8146 +8150 +8173 +8199 +8198 +8202 +8207 +8196 +8200 +8202 +8219 +8225 +8238 +8241 +8242 +8276 +8283 +8285 +8290 +8291 +8292 +8293 +8294 +8297 +8298 +8310 +8311 +8315 +8317 +8321 +8304 +8303 +8304 +8299 +8306 +8317 +8320 +8341 From 74e43afa728fd17364eb68c5e6eff70608810a12 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 1 Dec 2021 10:43:29 +0100 Subject: [PATCH 170/479] 2021: d01: ex1: add solution --- 2021/d01/ex1/ex1.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100755 2021/d01/ex1/ex1.py diff --git a/2021/d01/ex1/ex1.py b/2021/d01/ex1/ex1.py new file mode 100755 index 0000000..3853ce4 --- /dev/null +++ b/2021/d01/ex1/ex1.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +import sys +from typing import List + + +def solve(input: List[int]) -> int: + return sum(prev < cur for (prev, cur) in zip(input, input[1:])) + + +def main() -> None: + input = [int(line) for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 05afd2ea641f30d0fea512744a1d0996f213af73 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 1 Dec 2021 10:43:43 +0100 Subject: [PATCH 171/479] 2021: d01: ex2: add input --- 2021/d01/ex2/input | 2000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2000 insertions(+) create mode 100644 2021/d01/ex2/input diff --git a/2021/d01/ex2/input b/2021/d01/ex2/input new file mode 100644 index 0000000..1a551ed --- /dev/null +++ b/2021/d01/ex2/input @@ -0,0 +1,2000 @@ +176 +184 +188 +142 +151 +156 +157 +167 +166 +178 +182 +191 +190 +191 +192 +196 +197 +201 +204 +207 +212 +213 +231 +232 +234 +232 +239 +268 +279 +280 +282 +278 +283 +284 +283 +296 +302 +320 +321 +332 +334 +332 +335 +340 +347 +348 +352 +342 +334 +333 +332 +357 +365 +366 +386 +394 +391 +387 +388 +389 +391 +394 +381 +392 +394 +397 +407 +428 +441 +444 +447 +448 +449 +450 +449 +453 +467 +476 +472 +486 +512 +517 +519 +530 +533 +537 +538 +552 +554 +550 +575 +583 +585 +597 +598 +600 +601 +602 +606 +607 +609 +611 +603 +604 +597 +598 +599 +606 +612 +615 +626 +621 +623 +624 +627 +630 +642 +641 +644 +642 +645 +648 +640 +636 +640 +660 +669 +676 +688 +689 +712 +716 +711 +715 +698 +705 +729 +730 +731 +714 +720 +710 +723 +727 +730 +738 +739 +743 +753 +755 +763 +765 +761 +758 +759 +780 +803 +788 +789 +810 +827 +837 +849 +843 +853 +852 +853 +865 +866 +876 +878 +871 +874 +878 +884 +888 +892 +887 +893 +894 +905 +906 +887 +912 +905 +898 +901 +879 +882 +897 +920 +918 +911 +916 +922 +931 +933 +931 +936 +943 +945 +955 +956 +951 +957 +953 +960 +965 +973 +994 +1012 +1016 +1022 +1025 +1028 +1031 +1032 +1037 +1038 +1031 +1035 +1053 +1057 +1074 +1075 +1081 +1080 +1060 +1063 +1053 +1055 +1053 +1062 +1063 +1060 +1062 +1065 +1066 +1063 +1064 +1074 +1073 +1081 +1095 +1089 +1106 +1111 +1097 +1098 +1101 +1107 +1111 +1113 +1125 +1118 +1133 +1142 +1141 +1144 +1145 +1153 +1165 +1167 +1174 +1178 +1158 +1165 +1174 +1175 +1191 +1194 +1192 +1189 +1190 +1193 +1194 +1196 +1214 +1238 +1246 +1272 +1273 +1287 +1288 +1296 +1298 +1299 +1315 +1320 +1324 +1326 +1341 +1342 +1341 +1368 +1375 +1386 +1387 +1388 +1399 +1397 +1398 +1408 +1407 +1409 +1410 +1422 +1419 +1423 +1419 +1415 +1416 +1446 +1468 +1479 +1484 +1488 +1489 +1491 +1495 +1504 +1505 +1504 +1520 +1540 +1547 +1541 +1548 +1539 +1541 +1548 +1544 +1545 +1547 +1532 +1552 +1566 +1570 +1571 +1569 +1571 +1572 +1543 +1544 +1546 +1547 +1576 +1574 +1592 +1597 +1600 +1608 +1609 +1623 +1631 +1647 +1640 +1657 +1660 +1677 +1674 +1669 +1670 +1654 +1667 +1680 +1696 +1698 +1699 +1700 +1706 +1696 +1697 +1699 +1698 +1699 +1711 +1715 +1689 +1690 +1701 +1705 +1739 +1741 +1745 +1737 +1729 +1749 +1751 +1758 +1759 +1756 +1758 +1772 +1773 +1783 +1807 +1806 +1813 +1827 +1831 +1832 +1835 +1840 +1857 +1866 +1872 +1875 +1874 +1879 +1890 +1883 +1905 +1908 +1922 +1946 +1936 +1939 +1941 +1945 +1950 +1951 +1956 +1950 +1951 +1952 +1957 +1958 +1969 +1972 +2004 +2013 +2026 +2028 +2034 +2043 +2048 +2064 +2074 +2068 +2081 +2063 +2064 +2065 +2069 +2047 +2046 +2033 +2035 +2034 +2035 +2037 +2038 +2033 +2038 +2039 +2046 +2047 +2048 +2043 +2083 +2086 +2093 +2107 +2108 +2091 +2105 +2113 +2109 +2106 +2116 +2119 +2126 +2127 +2132 +2135 +2147 +2148 +2143 +2150 +2151 +2153 +2166 +2171 +2173 +2175 +2178 +2180 +2192 +2227 +2231 +2253 +2255 +2256 +2257 +2258 +2259 +2269 +2277 +2279 +2282 +2308 +2309 +2333 +2340 +2346 +2354 +2355 +2371 +2372 +2375 +2393 +2394 +2400 +2404 +2400 +2402 +2393 +2388 +2403 +2402 +2422 +2424 +2417 +2416 +2421 +2422 +2431 +2428 +2409 +2405 +2415 +2411 +2413 +2415 +2419 +2423 +2431 +2432 +2450 +2460 +2466 +2458 +2461 +2462 +2463 +2471 +2476 +2489 +2490 +2491 +2492 +2490 +2491 +2495 +2511 +2514 +2516 +2514 +2516 +2519 +2525 +2527 +2501 +2503 +2506 +2513 +2537 +2543 +2547 +2554 +2570 +2580 +2601 +2611 +2609 +2611 +2617 +2620 +2623 +2615 +2619 +2633 +2648 +2649 +2662 +2670 +2671 +2675 +2707 +2708 +2717 +2718 +2719 +2739 +2742 +2737 +2738 +2739 +2759 +2771 +2783 +2784 +2800 +2805 +2820 +2815 +2836 +2837 +2839 +2867 +2869 +2868 +2874 +2881 +2883 +2909 +2903 +2904 +2909 +2912 +2914 +2920 +2921 +2923 +2928 +2929 +2930 +2909 +2915 +2927 +2928 +2930 +2923 +2921 +2918 +2911 +2915 +2920 +2929 +2930 +2940 +2942 +2951 +2969 +2980 +2985 +2989 +2983 +2986 +2994 +3002 +3017 +3027 +3042 +3048 +3050 +3048 +3049 +3073 +3080 +3082 +3071 +3094 +3124 +3132 +3133 +3137 +3138 +3142 +3161 +3176 +3188 +3185 +3189 +3193 +3194 +3195 +3196 +3200 +3211 +3212 +3215 +3223 +3224 +3230 +3234 +3227 +3231 +3218 +3213 +3218 +3239 +3225 +3216 +3224 +3226 +3229 +3230 +3231 +3212 +3225 +3234 +3237 +3236 +3237 +3243 +3252 +3257 +3261 +3260 +3263 +3265 +3266 +3272 +3279 +3280 +3285 +3284 +3290 +3291 +3290 +3307 +3312 +3342 +3344 +3343 +3344 +3343 +3342 +3343 +3340 +3344 +3348 +3349 +3337 +3346 +3357 +3361 +3369 +3370 +3383 +3375 +3371 +3375 +3397 +3401 +3407 +3408 +3409 +3391 +3394 +3393 +3396 +3399 +3404 +3407 +3409 +3411 +3412 +3415 +3433 +3437 +3449 +3446 +3447 +3448 +3444 +3445 +3441 +3456 +3479 +3488 +3487 +3491 +3496 +3485 +3498 +3500 +3533 +3537 +3544 +3545 +3544 +3553 +3559 +3567 +3590 +3577 +3586 +3584 +3594 +3595 +3594 +3603 +3617 +3619 +3624 +3652 +3627 +3622 +3647 +3648 +3650 +3667 +3668 +3664 +3672 +3678 +3688 +3689 +3696 +3704 +3690 +3691 +3692 +3683 +3685 +3684 +3689 +3693 +3694 +3693 +3696 +3704 +3717 +3722 +3718 +3690 +3691 +3687 +3688 +3685 +3687 +3688 +3701 +3698 +3699 +3700 +3702 +3708 +3704 +3711 +3714 +3719 +3730 +3731 +3730 +3751 +3757 +3760 +3766 +3767 +3764 +3761 +3742 +3771 +3789 +3810 +3807 +3787 +3792 +3791 +3792 +3797 +3802 +3801 +3809 +3817 +3850 +3851 +3853 +3860 +3861 +3866 +3862 +3853 +3857 +3861 +3868 +3869 +3870 +3879 +3893 +3894 +3903 +3912 +3944 +3955 +3956 +3960 +3986 +3969 +3970 +3974 +3976 +4006 +4008 +4013 +4038 +4043 +4056 +4071 +4076 +4097 +4098 +4099 +4109 +4111 +4112 +4118 +4126 +4128 +4129 +4125 +4124 +4126 +4127 +4130 +4150 +4153 +4168 +4187 +4186 +4171 +4166 +4172 +4182 +4201 +4226 +4227 +4251 +4250 +4263 +4294 +4317 +4318 +4332 +4330 +4308 +4309 +4310 +4313 +4329 +4331 +4349 +4350 +4348 +4345 +4347 +4342 +4340 +4342 +4359 +4371 +4387 +4412 +4411 +4412 +4415 +4422 +4423 +4427 +4455 +4456 +4460 +4471 +4485 +4491 +4492 +4491 +4492 +4521 +4527 +4532 +4539 +4552 +4537 +4551 +4562 +4566 +4581 +4588 +4590 +4591 +4590 +4595 +4596 +4597 +4598 +4618 +4617 +4618 +4621 +4622 +4628 +4632 +4628 +4644 +4629 +4643 +4635 +4639 +4640 +4645 +4647 +4639 +4641 +4642 +4645 +4657 +4645 +4650 +4655 +4671 +4674 +4675 +4670 +4671 +4702 +4715 +4714 +4722 +4723 +4727 +4737 +4733 +4761 +4762 +4763 +4766 +4772 +4773 +4774 +4775 +4778 +4779 +4786 +4787 +4788 +4792 +4796 +4797 +4795 +4796 +4816 +4807 +4839 +4841 +4842 +4843 +4860 +4862 +4839 +4842 +4843 +4844 +4846 +4848 +4846 +4844 +4847 +4849 +4855 +4859 +4852 +4855 +4864 +4865 +4889 +4892 +4891 +4893 +4890 +4891 +4892 +4914 +4913 +4912 +4915 +4918 +4920 +4924 +4927 +4922 +4914 +4913 +4912 +4920 +4913 +4915 +4917 +4919 +4922 +4930 +4924 +4918 +4930 +4937 +4932 +4933 +4938 +4942 +4943 +4944 +4945 +4962 +4965 +4967 +4948 +4937 +4938 +4943 +4950 +4934 +4945 +4946 +4962 +4964 +4977 +4988 +5005 +5025 +5024 +5049 +5055 +5060 +5050 +5051 +5049 +5050 +5049 +5053 +5063 +5086 +5121 +5138 +5150 +5155 +5154 +5165 +5176 +5154 +5155 +5163 +5154 +5190 +5193 +5192 +5194 +5192 +5194 +5203 +5219 +5223 +5237 +5250 +5251 +5250 +5254 +5257 +5242 +5245 +5244 +5250 +5253 +5262 +5251 +5276 +5277 +5273 +5275 +5274 +5283 +5290 +5303 +5309 +5315 +5317 +5321 +5318 +5325 +5324 +5325 +5332 +5353 +5355 +5331 +5332 +5351 +5374 +5377 +5379 +5370 +5383 +5377 +5381 +5388 +5389 +5424 +5425 +5431 +5432 +5433 +5400 +5411 +5415 +5428 +5429 +5416 +5419 +5446 +5455 +5462 +5463 +5466 +5479 +5480 +5489 +5490 +5491 +5495 +5516 +5506 +5507 +5508 +5511 +5509 +5522 +5521 +5525 +5533 +5556 +5558 +5555 +5559 +5561 +5552 +5553 +5565 +5566 +5579 +5584 +5585 +5582 +5583 +5595 +5596 +5618 +5620 +5621 +5622 +5631 +5633 +5634 +5635 +5637 +5638 +5637 +5638 +5647 +5646 +5684 +5683 +5685 +5687 +5690 +5697 +5691 +5692 +5689 +5692 +5695 +5705 +5707 +5729 +5730 +5717 +5726 +5727 +5734 +5730 +5737 +5735 +5736 +5755 +5752 +5764 +5762 +5761 +5765 +5774 +5775 +5776 +5753 +5754 +5763 +5769 +5768 +5773 +5772 +5779 +5776 +5793 +5802 +5815 +5819 +5816 +5811 +5812 +5814 +5812 +5815 +5813 +5827 +5800 +5802 +5801 +5802 +5805 +5809 +5817 +5826 +5832 +5833 +5836 +5838 +5840 +5853 +5859 +5870 +5873 +5879 +5891 +5898 +5907 +5902 +5905 +5910 +5914 +5918 +5913 +5914 +5913 +5914 +5935 +5954 +5963 +5964 +5973 +5977 +5978 +5988 +5980 +5981 +5984 +5986 +5985 +5987 +5995 +6002 +6003 +6001 +6007 +6009 +6012 +6019 +6022 +6023 +6022 +6023 +6024 +6025 +6027 +6028 +6030 +6032 +6050 +6041 +6042 +6041 +6043 +6044 +6079 +6086 +6077 +6088 +6098 +6100 +6101 +6103 +6105 +6106 +6114 +6118 +6119 +6121 +6130 +6138 +6139 +6135 +6146 +6147 +6150 +6162 +6163 +6180 +6188 +6190 +6196 +6192 +6195 +6205 +6203 +6204 +6206 +6207 +6203 +6204 +6205 +6211 +6210 +6214 +6230 +6233 +6234 +6248 +6239 +6249 +6263 +6265 +6273 +6275 +6274 +6278 +6272 +6286 +6288 +6292 +6271 +6276 +6285 +6286 +6287 +6291 +6300 +6307 +6312 +6313 +6314 +6316 +6317 +6331 +6332 +6334 +6332 +6331 +6344 +6339 +6350 +6354 +6356 +6358 +6361 +6370 +6374 +6377 +6363 +6364 +6367 +6360 +6356 +6358 +6361 +6362 +6364 +6386 +6393 +6415 +6419 +6421 +6418 +6424 +6426 +6433 +6442 +6444 +6436 +6440 +6442 +6441 +6444 +6450 +6432 +6451 +6467 +6472 +6476 +6469 +6470 +6468 +6480 +6503 +6505 +6506 +6493 +6495 +6496 +6504 +6509 +6500 +6491 +6503 +6524 +6542 +6556 +6557 +6566 +6577 +6573 +6579 +6586 +6587 +6595 +6606 +6612 +6615 +6633 +6635 +6636 +6634 +6624 +6626 +6627 +6641 +6644 +6654 +6657 +6656 +6655 +6658 +6660 +6665 +6664 +6665 +6685 +6676 +6677 +6679 +6682 +6712 +6717 +6724 +6733 +6735 +6742 +6747 +6771 +6772 +6788 +6802 +6814 +6815 +6814 +6820 +6819 +6823 +6822 +6826 +6835 +6840 +6842 +6847 +6843 +6823 +6829 +6824 +6823 +6825 +6826 +6825 +6829 +6830 +6831 +6847 +6876 +6878 +6879 +6880 +6881 +6888 +6909 +6912 +6913 +6911 +6920 +6923 +6927 +6941 +6951 +6946 +6948 +6954 +6957 +6956 +6958 +6964 +6966 +6971 +6972 +6985 +6987 +6988 +6989 +6997 +6998 +6986 +6988 +6987 +6994 +7000 +7004 +7009 +7020 +7025 +7035 +7045 +7047 +7062 +7065 +7066 +7052 +7053 +7052 +7046 +7050 +7053 +7054 +7057 +7047 +7050 +7036 +7043 +7034 +7016 +7040 +7039 +7040 +7042 +7029 +7037 +7052 +7056 +7057 +7058 +7062 +7063 +7051 +7053 +7056 +7057 +7058 +7059 +7061 +7082 +7081 +7089 +7090 +7086 +7090 +7094 +7095 +7100 +7101 +7076 +7079 +7085 +7089 +7093 +7109 +7110 +7104 +7093 +7100 +7111 +7109 +7104 +7116 +7117 +7115 +7111 +7124 +7125 +7124 +7125 +7120 +7118 +7119 +7112 +7114 +7115 +7141 +7140 +7141 +7168 +7158 +7189 +7195 +7196 +7193 +7221 +7225 +7227 +7228 +7229 +7239 +7242 +7243 +7252 +7260 +7276 +7278 +7277 +7295 +7298 +7313 +7296 +7297 +7319 +7342 +7343 +7347 +7359 +7343 +7344 +7348 +7361 +7365 +7366 +7368 +7377 +7378 +7375 +7376 +7368 +7388 +7385 +7400 +7401 +7402 +7404 +7413 +7411 +7414 +7415 +7417 +7422 +7421 +7419 +7428 +7437 +7436 +7437 +7440 +7442 +7440 +7442 +7463 +7478 +7488 +7506 +7510 +7518 +7531 +7537 +7534 +7533 +7523 +7522 +7538 +7528 +7530 +7533 +7535 +7530 +7546 +7547 +7548 +7545 +7546 +7541 +7553 +7554 +7555 +7556 +7564 +7568 +7589 +7590 +7609 +7619 +7624 +7627 +7629 +7630 +7651 +7664 +7658 +7656 +7667 +7670 +7678 +7682 +7683 +7694 +7695 +7696 +7704 +7706 +7716 +7723 +7722 +7725 +7730 +7728 +7729 +7723 +7738 +7717 +7711 +7727 +7705 +7716 +7713 +7703 +7710 +7712 +7713 +7714 +7715 +7718 +7721 +7735 +7739 +7722 +7726 +7727 +7737 +7743 +7744 +7724 +7723 +7724 +7726 +7754 +7760 +7758 +7769 +7768 +7769 +7775 +7776 +7777 +7785 +7822 +7823 +7822 +7824 +7826 +7849 +7854 +7860 +7836 +7839 +7838 +7839 +7859 +7861 +7862 +7863 +7873 +7863 +7885 +7887 +7889 +7882 +7881 +7882 +7883 +7888 +7890 +7902 +7907 +7908 +7942 +7947 +7946 +7948 +7949 +7952 +7953 +7952 +7954 +7937 +7933 +7928 +7932 +7933 +7938 +7939 +7941 +7943 +7944 +7946 +7940 +7941 +7940 +7935 +7938 +7939 +7938 +7965 +7986 +8006 +7999 +8000 +8016 +8027 +8026 +8027 +8030 +8031 +8032 +8033 +8035 +8036 +8038 +8041 +8054 +8059 +8060 +8055 +8053 +8058 +8067 +8071 +8081 +8082 +8083 +8099 +8121 +8102 +8101 +8093 +8106 +8113 +8114 +8117 +8121 +8146 +8158 +8144 +8146 +8150 +8173 +8199 +8198 +8202 +8207 +8196 +8200 +8202 +8219 +8225 +8238 +8241 +8242 +8276 +8283 +8285 +8290 +8291 +8292 +8293 +8294 +8297 +8298 +8310 +8311 +8315 +8317 +8321 +8304 +8303 +8304 +8299 +8306 +8317 +8320 +8341 From 2646a1609d6b8eaff48c34ea9d0fdfbdcaf7b0e6 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 1 Dec 2021 10:43:55 +0100 Subject: [PATCH 172/479] 2021: d01: ex2: add solution --- 2021/d01/ex2/ex2.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100755 2021/d01/ex2/ex2.py diff --git a/2021/d01/ex2/ex2.py b/2021/d01/ex2/ex2.py new file mode 100755 index 0000000..7895e2b --- /dev/null +++ b/2021/d01/ex2/ex2.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python + +import collections +import itertools +import sys +from typing import List + + +def sliding_window(iterable, n): + it = iter(iterable) + window = collections.deque(itertools.islice(it, n), maxlen=n) + if len(window) == n: + yield tuple(window) + for x in it: + window.append(x) + yield tuple(window) + + +def solve(input: List[int]) -> int: + windowed = [sum(window) for window in sliding_window(input, 3)] + return sum(prev < cur for (prev, cur) in zip(windowed, windowed[1:])) + + +def main() -> None: + input = [int(line) for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From ec1558efe2cb55363c2c6833a5ac573533c78281 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 2 Dec 2021 10:10:18 +0100 Subject: [PATCH 173/479] 2021: d02: ex1: add input --- 2021/d02/ex1/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2021/d02/ex1/input 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 From 82b8354edc5f06f4657dc79ffb11ce0d9d923087 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 2 Dec 2021 10:10:29 +0100 Subject: [PATCH 174/479] 2021: d02: ex1: add solution --- 2021/d02/ex1/ex1.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 2021/d02/ex1/ex1.py diff --git a/2021/d02/ex1/ex1.py b/2021/d02/ex1/ex1.py new file mode 100755 index 0000000..f891b43 --- /dev/null +++ b/2021/d02/ex1/ex1.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +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() From fe0d20ad0388a4f7155bbc417beadee6c587a286 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 2 Dec 2021 10:10:35 +0100 Subject: [PATCH 175/479] 2021: d02: ex2: add input --- 2021/d02/ex2/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2021/d02/ex2/input 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 From 94b43da45ced35c781f82f43adbac0a863c7b13a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 2 Dec 2021 10:10:45 +0100 Subject: [PATCH 176/479] 2021: d02: ex2: add solution --- 2021/d02/ex2/ex2.py | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100755 2021/d02/ex2/ex2.py diff --git a/2021/d02/ex2/ex2.py b/2021/d02/ex2/ex2.py new file mode 100755 index 0000000..8843639 --- /dev/null +++ b/2021/d02/ex2/ex2.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python + +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() From 94788946a3aca1a1c42b7e4d2e20e26ac7745f05 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 3 Dec 2021 08:48:14 +0100 Subject: [PATCH 177/479] 2021: d03: ex1: add input --- 2021/d03/ex1/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2021/d03/ex1/input 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 From 95ae7df24e61095e2bb29941e5a7d61bec2b2552 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 3 Dec 2021 08:48:21 +0100 Subject: [PATCH 178/479] 2021: d03: ex1: add solution --- 2021/d03/ex1/ex1.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100755 2021/d03/ex1/ex1.py diff --git a/2021/d03/ex1/ex1.py b/2021/d03/ex1/ex1.py new file mode 100755 index 0000000..7519004 --- /dev/null +++ b/2021/d03/ex1/ex1.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +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() From ef8d402a3df8009be6413b46383d9896c2f9eca9 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 3 Dec 2021 08:48:30 +0100 Subject: [PATCH 179/479] 2021: d03: ex2: add input --- 2021/d03/ex2/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2021/d03/ex2/input 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 From d1122ab56132316738c34e043342f74f36fb9916 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 3 Dec 2021 08:49:05 +0100 Subject: [PATCH 180/479] 2021: d03: ex2: add solution --- 2021/d03/ex2/ex2.py | 67 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100755 2021/d03/ex2/ex2.py diff --git a/2021/d03/ex2/ex2.py b/2021/d03/ex2/ex2.py new file mode 100755 index 0000000..acf0ff2 --- /dev/null +++ b/2021/d03/ex2/ex2.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +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() From 9624c49a35cd5df9b3132befc660b8220d1a5208 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 4 Dec 2021 07:09:21 +0100 Subject: [PATCH 181/479] 2021: d04: ex1: add input --- 2021/d04/ex1/input | 601 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 601 insertions(+) create mode 100644 2021/d04/ex1/input 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 From 1d6113366156045fd138fad881538ed5f9ffed41 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 4 Dec 2021 07:10:26 +0100 Subject: [PATCH 182/479] 2021: d04: ex1: add solution --- 2021/d04/ex1/ex1.py | 59 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100755 2021/d04/ex1/ex1.py 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() From 2c11ec686686a4c489861198d7d9e136ca6dd02c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 4 Dec 2021 07:10:48 +0100 Subject: [PATCH 183/479] 2021: d04: ex2: add input --- 2021/d04/ex2/input | 601 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 601 insertions(+) create mode 100644 2021/d04/ex2/input 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 From 003071a57b6aee97fc39b39e7a2cb2edf8c442f0 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 4 Dec 2021 07:11:00 +0100 Subject: [PATCH 184/479] 2021: d04: ex2: add solution --- 2021/d04/ex2/ex2.py | 69 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100755 2021/d04/ex2/ex2.py 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() From 9f8ab70690dfa5949c8f0d9a819d24daa3f168f8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 5 Dec 2021 11:37:25 +0100 Subject: [PATCH 185/479] 2021: d05: ex1: add input --- 2021/d05/ex1/input | 500 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 500 insertions(+) create mode 100644 2021/d05/ex1/input 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 From 09ea24444209fe3bd6d74b4d28972b83e6ead79d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 5 Dec 2021 11:37:49 +0100 Subject: [PATCH 186/479] 2021: d05: ex1: add solution --- 2021/d05/ex1/ex1.py | 63 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100755 2021/d05/ex1/ex1.py diff --git a/2021/d05/ex1/ex1.py b/2021/d05/ex1/ex1.py new file mode 100755 index 0000000..2031251 --- /dev/null +++ b/2021/d05/ex1/ex1.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from typing import Iterable, List, NamedTuple, Tuple + + +class Point(NamedTuple): + 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 Point(p1.x, y) + return + + if p1.y == p2.y: + for x in inclusive_range_any_order(p1.x, p2.x): + yield Point(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() From a3d1c6b0a981c528eff2f122abd7023959b717f2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 5 Dec 2021 11:38:02 +0100 Subject: [PATCH 187/479] 2021: d05: ex2: add input --- 2021/d05/ex2/input | 500 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 500 insertions(+) create mode 100644 2021/d05/ex2/input 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 From 245e9dc9989a04e33d7837e8b01d11cbf8603a4c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 5 Dec 2021 11:38:19 +0100 Subject: [PATCH 188/479] 2021: d05: ex2: add solution --- 2021/d05/ex2/ex2.py | 58 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100755 2021/d05/ex2/ex2.py diff --git a/2021/d05/ex2/ex2.py b/2021/d05/ex2/ex2.py new file mode 100755 index 0000000..a023b80 --- /dev/null +++ b/2021/d05/ex2/ex2.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from typing import Iterable, List, NamedTuple, Tuple + + +class Point(NamedTuple): + 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 map(Point._make, 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() From 660748c6ab969ba3f82ad958e3cb2153bc6bd9f7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 6 Dec 2021 12:29:22 +0100 Subject: [PATCH 189/479] 2021: d06: ex1: add input --- 2021/d06/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2021/d06/ex1/input 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 From fb40ea0517a6df2219894102ce6846fd3f71b467 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 6 Dec 2021 12:29:44 +0100 Subject: [PATCH 190/479] 2021: d06: ex1: add solution --- 2021/d06/ex1/ex1.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100755 2021/d06/ex1/ex1.py diff --git a/2021/d06/ex1/ex1.py b/2021/d06/ex1/ex1.py new file mode 100755 index 0000000..65abb44 --- /dev/null +++ b/2021/d06/ex1/ex1.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from typing import Iterator, List, TypeVar + +T = TypeVar("T") + + +def nth(iterable: Iterator[T], n: int) -> T: + 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() From b00e4768fc9a54eccff22fdb02d878dbf8da4609 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 6 Dec 2021 12:29:55 +0100 Subject: [PATCH 191/479] 2021: d06: ex2: add input --- 2021/d06/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2021/d06/ex2/input 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 From 8cb61c6323d63a5e43ea017060eae6547c0b4b83 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 6 Dec 2021 12:30:06 +0100 Subject: [PATCH 192/479] 2021: d06: ex2: add solution --- 2021/d06/ex2/ex2.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100755 2021/d06/ex2/ex2.py diff --git a/2021/d06/ex2/ex2.py b/2021/d06/ex2/ex2.py new file mode 100755 index 0000000..bb40805 --- /dev/null +++ b/2021/d06/ex2/ex2.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from typing import Iterator, List, TypeVar + +T = TypeVar("T") + + +def nth(iterable: Iterator[T], n: int) -> T: + 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() From 6cc0dc453b37288a03306e45560877e559136f96 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 7 Dec 2021 10:33:03 +0100 Subject: [PATCH 193/479] 2021: d07: ex1: add input --- 2021/d07/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2021/d07/ex1/input diff --git a/2021/d07/ex1/input b/2021/d07/ex1/input new file mode 100644 index 0000000..4b58ac9 --- /dev/null +++ b/2021/d07/ex1/input @@ -0,0 +1 @@ +1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,1133,1029,1446,1005,596,277,439,544,201,317,237,33,252,774,482,291,57,1434,153,134,385,993,677,1189,99,1082,351,80,1563,195,581,693,5,633,184,552,11,606,462,48,134,1451,850,221,336,661,276,156,932,23,98,76,327,212,489,230,819,998,1037,1561,206,159,757,207,1203,224,1459,294,39,1108,96,89,1664,353,41,83,942,771,362,193,900,676,851,277,558,368,1054,316,143,464,85,896,558,52,669,163,696,140,340,542,817,783,1436,786,81,21,669,184,430,312,1500,797,698,611,314,145,125,391,785,867,488,144,9,967,560,245,116,96,1769,314,533,25,0,1375,1307,1273,1178,332,59,26,234,487,480,615,313,629,28,707,96,637,30,350,1286,900,777,115,56,79,809,1101,13,150,741,940,20,403,384,479,622,108,325,276,609,654,535,539,62,187,414,535,140,222,845,357,55,17,8,1430,853,759,331,673,202,482,1280,714,911,409,429,604,278,478,301,408,590,329,1482,110,423,488,7,628,66,196,399,86,241,1058,501,1284,594,710,799,34,60,668,457,0,1209,20,50,1134,288,415,399,86,540,1356,285,1541,172,3,634,1387,146,669,195,403,601,758,160,970,760,43,213,68,805,50,350,292,78,252,54,1021,882,241,808,601,892,878,1401,48,191,74,1429,94,520,505,679,1133,120,485,183,362,684,520,1366,301,123,290,1248,140,44,230,572,57,1101,217,906,1012,668,85,230,32,100,472,275,78,91,19,61,732,518,189,85,1531,1255,134,489,637,792,42,36,392,603,976,651,127,486,340,534,185,890,346,906,1295,319,321,597,252,183,554,124,44,426,131,408,582,429,645,1227,574,14,1828,359,184,1830,10,288,194,949,1578,492,502,149,609,77,92,320,233,1026,123,26,188,1123,4,665,1793,331,858,481,197,424,133,933,338,7,163,1269,665,19,1,538,126,895,1751,345,895,203,175,66,305,1479,239,718,386,8,1148,203,636,1211,635,149,489,1156,1828,61,328,331,287,262,8,3,522,1427,931,1103,199,329,930,779,124,446,391,903,696,1764,16,595,522,143,296,19,872,29,546,566,256,63,1195,862,516,267,452,1287,11,547,760,77,117,988,185,293,421,118,767,70,169,456,600,755,740,1799,97,507,1165,265,1126,376,1250,408,22,674,774,361,54,558,1021,529,29,871,527,474,218,47,309,61,188,1365,725,267,235,359,1004,1771,765,8,17,103,89,967,65,302,759,1688,882,709,1469,123,548,834,355,646,404,76,257,101,627,2,66,1328,137,42,23,127,110,632,683,1163,843,1119,16,497,1756,347,958,981,57,185,204,1403,530,536,104,68,1152,95,320,959,144,281,350,622,717,112,631,150,19,938,296,1272,825,37,192,350,847,306,824,1042,320,480,857,589,137,687,93,21,1601,547,550,491,161,49,124,292,396,34,24,95,932,56,968,197,109,1300,1326,605,357,412,14,179,450,991,173,120,1402,478,77,933,88,96,49,95,596,1885,841,441,659,309,418,87,134,34,815,759,631,209,728,7,232,1304,698,140,304,1448,101,1,239,1321,362,1367,1411,279,111,633,1347,110,18,710,443,1676,64,531,386,64,518,619,893,140,301,426,1451,261,1083,115,61,943,60,891,217,475,48,436,586,31,287,196,430,357,78,161,1533,745,198,715,8,307,225,604,263,992,371,749,700,1573,573,546,480,425,47,88,66,799,388,60,736,111,81,856,29,695,141,4,271,143,939,423,3,1260,265,24,903,292,23,80,196,1245,399,123,3,532,283,366,1175,187,15,450,487,117,1041,669,59,579,159,461,598,915,666,1231,999,253,185,1016,135,1317,253,111,1261,833,26,851,120,11,63,718,682,233,76,0,50,1678,777,286,279,90,47,158,71,35,475,245,550,4,942,1816,1646,102,175,343,12,446,12,623,44,157,10,555,1173,651,361,745,1870,97,237,1628,90,233,126,1596,1146,746,383,209,55,209,318,904,144,90,21,86,4,970,262,8,210,249,871,1216,1003,172,405,821,225,2,143,915,129,598,397,583,1400,315,113,33,75,426,2,611,293,196,419,125,176,496,4,607,1425,27,48,172,972,626,227,184,1257,514,209,524,22,58,927,4,931,3,6,104,716,961,17,4,154,249,558,203,180,180,1194,935,263,535,380,1439,274,1566,873,1763,2,89,636,407,667,438,966,757,245,730,328,915,167,245,126,52,652,938,1183,320,1298,10,844,36,263,382,37,142 From fa4ea4511a3547b68948abf404d8e56f9d8cb80d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 7 Dec 2021 10:33:36 +0100 Subject: [PATCH 194/479] 2021: d07: ex1: add solution --- 2021/d07/ex1/ex1.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100755 2021/d07/ex1/ex1.py diff --git a/2021/d07/ex1/ex1.py b/2021/d07/ex1/ex1.py new file mode 100755 index 0000000..2b8a8a9 --- /dev/null +++ b/2021/d07/ex1/ex1.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +import sys +from typing import List + + +def solve(input: List[str]) -> int: + nums = sorted(int(n) for n in input[0].split(",")) + median = nums[len(nums) // 2] + + return sum(abs(n - median) for n in nums) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 5eda15460b9011f0b5f777c85716517b35a8420a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 7 Dec 2021 10:33:47 +0100 Subject: [PATCH 195/479] 2021: d07: ex2: add input --- 2021/d07/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2021/d07/ex2/input diff --git a/2021/d07/ex2/input b/2021/d07/ex2/input new file mode 100644 index 0000000..4b58ac9 --- /dev/null +++ b/2021/d07/ex2/input @@ -0,0 +1 @@ +1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,1133,1029,1446,1005,596,277,439,544,201,317,237,33,252,774,482,291,57,1434,153,134,385,993,677,1189,99,1082,351,80,1563,195,581,693,5,633,184,552,11,606,462,48,134,1451,850,221,336,661,276,156,932,23,98,76,327,212,489,230,819,998,1037,1561,206,159,757,207,1203,224,1459,294,39,1108,96,89,1664,353,41,83,942,771,362,193,900,676,851,277,558,368,1054,316,143,464,85,896,558,52,669,163,696,140,340,542,817,783,1436,786,81,21,669,184,430,312,1500,797,698,611,314,145,125,391,785,867,488,144,9,967,560,245,116,96,1769,314,533,25,0,1375,1307,1273,1178,332,59,26,234,487,480,615,313,629,28,707,96,637,30,350,1286,900,777,115,56,79,809,1101,13,150,741,940,20,403,384,479,622,108,325,276,609,654,535,539,62,187,414,535,140,222,845,357,55,17,8,1430,853,759,331,673,202,482,1280,714,911,409,429,604,278,478,301,408,590,329,1482,110,423,488,7,628,66,196,399,86,241,1058,501,1284,594,710,799,34,60,668,457,0,1209,20,50,1134,288,415,399,86,540,1356,285,1541,172,3,634,1387,146,669,195,403,601,758,160,970,760,43,213,68,805,50,350,292,78,252,54,1021,882,241,808,601,892,878,1401,48,191,74,1429,94,520,505,679,1133,120,485,183,362,684,520,1366,301,123,290,1248,140,44,230,572,57,1101,217,906,1012,668,85,230,32,100,472,275,78,91,19,61,732,518,189,85,1531,1255,134,489,637,792,42,36,392,603,976,651,127,486,340,534,185,890,346,906,1295,319,321,597,252,183,554,124,44,426,131,408,582,429,645,1227,574,14,1828,359,184,1830,10,288,194,949,1578,492,502,149,609,77,92,320,233,1026,123,26,188,1123,4,665,1793,331,858,481,197,424,133,933,338,7,163,1269,665,19,1,538,126,895,1751,345,895,203,175,66,305,1479,239,718,386,8,1148,203,636,1211,635,149,489,1156,1828,61,328,331,287,262,8,3,522,1427,931,1103,199,329,930,779,124,446,391,903,696,1764,16,595,522,143,296,19,872,29,546,566,256,63,1195,862,516,267,452,1287,11,547,760,77,117,988,185,293,421,118,767,70,169,456,600,755,740,1799,97,507,1165,265,1126,376,1250,408,22,674,774,361,54,558,1021,529,29,871,527,474,218,47,309,61,188,1365,725,267,235,359,1004,1771,765,8,17,103,89,967,65,302,759,1688,882,709,1469,123,548,834,355,646,404,76,257,101,627,2,66,1328,137,42,23,127,110,632,683,1163,843,1119,16,497,1756,347,958,981,57,185,204,1403,530,536,104,68,1152,95,320,959,144,281,350,622,717,112,631,150,19,938,296,1272,825,37,192,350,847,306,824,1042,320,480,857,589,137,687,93,21,1601,547,550,491,161,49,124,292,396,34,24,95,932,56,968,197,109,1300,1326,605,357,412,14,179,450,991,173,120,1402,478,77,933,88,96,49,95,596,1885,841,441,659,309,418,87,134,34,815,759,631,209,728,7,232,1304,698,140,304,1448,101,1,239,1321,362,1367,1411,279,111,633,1347,110,18,710,443,1676,64,531,386,64,518,619,893,140,301,426,1451,261,1083,115,61,943,60,891,217,475,48,436,586,31,287,196,430,357,78,161,1533,745,198,715,8,307,225,604,263,992,371,749,700,1573,573,546,480,425,47,88,66,799,388,60,736,111,81,856,29,695,141,4,271,143,939,423,3,1260,265,24,903,292,23,80,196,1245,399,123,3,532,283,366,1175,187,15,450,487,117,1041,669,59,579,159,461,598,915,666,1231,999,253,185,1016,135,1317,253,111,1261,833,26,851,120,11,63,718,682,233,76,0,50,1678,777,286,279,90,47,158,71,35,475,245,550,4,942,1816,1646,102,175,343,12,446,12,623,44,157,10,555,1173,651,361,745,1870,97,237,1628,90,233,126,1596,1146,746,383,209,55,209,318,904,144,90,21,86,4,970,262,8,210,249,871,1216,1003,172,405,821,225,2,143,915,129,598,397,583,1400,315,113,33,75,426,2,611,293,196,419,125,176,496,4,607,1425,27,48,172,972,626,227,184,1257,514,209,524,22,58,927,4,931,3,6,104,716,961,17,4,154,249,558,203,180,180,1194,935,263,535,380,1439,274,1566,873,1763,2,89,636,407,667,438,966,757,245,730,328,915,167,245,126,52,652,938,1183,320,1298,10,844,36,263,382,37,142 From 7e63d778f4a8fe9402a9c12c41bf842e27e9726b Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 7 Dec 2021 10:34:10 +0100 Subject: [PATCH 196/479] 2021: d07: ex2: add solution --- 2021/d07/ex2/ex2.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100755 2021/d07/ex2/ex2.py diff --git a/2021/d07/ex2/ex2.py b/2021/d07/ex2/ex2.py new file mode 100755 index 0000000..8eec5ef --- /dev/null +++ b/2021/d07/ex2/ex2.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +import sys +from math import ceil, floor +from typing import List + + +def solve(input: List[str]) -> int: + def fuel(dist: int) -> int: + return dist * (dist + 1) // 2 + + nums = list(int(n) for n in input[0].split(",")) + mean = sum(nums) / len(nums) + + upper = sum(fuel(abs(n - ceil(mean))) for n in nums) + lower = sum(fuel(abs(n - floor(mean))) for n in nums) + + return min(upper, lower) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 2ec356e556c471ac540717df95648c5dd9aa5ae8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 8 Dec 2021 10:56:50 +0100 Subject: [PATCH 197/479] 2021: d08: ex1: add input --- 2021/d08/ex1/input | 200 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 2021/d08/ex1/input diff --git a/2021/d08/ex1/input b/2021/d08/ex1/input new file mode 100644 index 0000000..a5bf9d9 --- /dev/null +++ b/2021/d08/ex1/input @@ -0,0 +1,200 @@ +badc bd dbeaf cfdbge dfb cfbdea efbag edcfgab dcafe degfca | eacfd acdfbe cbdegf fcbaedg +cd fdbac egcfab gbadcfe cfgdeb cbadfe deca cdf dfabg abefc | dcf cfbad gbafced fcd +cg agecfb cbg eabgfdc egdc fdgba bafecd cbdfe bfcdeg cfgdb | efdcb adcfeb fbdcg gbc +bfceg gfadb dbcfgea bgaef efad abe bcdgfa ea fbdgea agecbd | eadf ceadbg abfge fecdbga +gdcafe eacb adc gbfda afdceb edgbcf badfc ecgbafd ac fdbce | ebfcd cefdab bdfgeca egbdacf +aefbgd fbdc fbecg egdcb edcbag bf gcefa fbedcg bagfced fbg | afgce cfbd bdcf geafdbc +ebgacd edacg gcdeaf cabfg dbc bd cdbgaef ebad fecgbd acbgd | dgbac db caegbdf gcbfa +defbga gead ge efagcb gdafbc cegbdfa egf bfdce bgdef dgabf | gef eg bfcdag ge +bae adcgfbe cdfeag ab dcgeb bfdage agecb cagfe abcf bfcaeg | bae aeb agfceb afceg +ae adefcb gaceb gadceb edag efadcgb badgc cfgbe cadbfg cea | ceabgd fbeacdg aged aged +aegbdc dbegfac gcbaf df febd egdafc deabg gdf gdfeab adfbg | bcdegaf dfeb bcegad df +aegcdfb becdaf gdecf ag fag dcfgba badg fcbad cdgaf acefgb | abcdf cefdab ga ga +gbcfad cefadg cegad aefdb gedacb gcfe fc cfbgead cfade caf | degac egcf geacfbd afc +bcfad afcdbe fd ecfba cfd afde cfeabg gcbfed dacbg fdgabec | cafbged edfa fcd dabgc +afdc adbfe bgecfad ecagdb dbcafe dfe fd agbfe bdace gdbfec | fadbe efbdgc fadbe edcba +bdface geba ecbdag acegd afcdg ge eadbc bfecgda edg fgbdce | eg abge fadgceb abge +fagbde fcegbd gec efcdg fdgbe ebfcag gc adcfe cgdb cagbdfe | defcg cbgdfea gcbd ecfgd +acfbg debgf gfcdba edcbfa fbdag fgbeca cfbagde gadc da bda | dacg acbgf cedfgab caefdgb +ca dfegca edcbgf gfcde aedbg gfdeacb dcbfea facg dgcea ace | fedcg fdagec cea ac +acdf gcfde debcga ecbgaf cf ebgdf bagfdce cedag cef gedafc | dgcbea fc dcgeaf cdaeg +ebagf cabgfed ed cbgad afcbge afdbge edg eagbd cedgfb aefd | fcgdbe de cgbeaf ed +fbcdeag cafbd fgcbea fdgacb daecfb cg gca defga gbdc fdcga | abfcged agc acfgd cbfaeg +dacfe ed ebdcag gcadfe dfbcaeg dce dfeg fbcadg bfeca acdfg | fcbdga gcbade aegdcf fbcgda +cfdegb cbef fgdec gdfbca gdecbfa egfdca bc gbc cbegd aedgb | befc bc abegd ebcdfga +agcefdb fdbg bf bdafe gdebaf eafdg acdbe gcebaf bef edcfga | bf fdbg efdab gefda +gcb bdcgef dcbfg bg edbg facegb cbedf edgafbc dfgca edacbf | gb cdebfa deagfcb bg +eafbg gfad afegbd caefbg befdgc ebagd gd bdg cfbdage acdeb | gd geafb cabed dbg +bcedfg dc dgc aedfbcg acgbed bgfead gedbf bfdcg cedf facbg | gabfed cdebag dafegb cd +fa adbceg afecd cafdbge eacgfb daegcf aef bcdfe fdga daceg | acedf afe fae afdg +cdfaeg agcfb bcdgea dcafeb cef fabec ef dfgcbae defb eabcd | gdabce fdeb ebdf ecf +cdefg ceafg gebfd cdg dc efbcdg cdgbea cfedbga cbfd fdagbe | fbcd afdgbe fabedg dcfb +cdafgb egdb fecgabd cbfdg fcbedg feb acefg begcf be dacebf | be be ebfdca abgfcd +eafgcd facegb acb cdbfaeg fagec dgcabe baefd cgbf cb afecb | bcafeg fcgb gfdeac eagcf +ecgdfb deb edfgab eb faedcg agfed bfaed dbacf gbae efgdcba | fabde eb ecdgfb eabg +aefbg bdegfa gacdb gefc fbc fc bfdcae gefbac cbfag dbgefac | ecfg fc cfge efgcdab +gcfbed gcbae dcaef cbegad bdag bgeacf adefgcb deg adgec gd | agcbde bgad gdbfec gcfabe +dfacb egbcda dac agdcfb fecab adecfgb bgadf cd fgeabd cgfd | gabfdec acd dc dc +bfecg dcgeab af gadf aedbg caefdbg bgfade bafeg abf eabdcf | ebcfg gafd ebacfd fgbdace +ge fdeab gcebfda fadcg fgead abcdef eag ebdgfa acgbef dgeb | cdagf cfdgbae fdeab eag +dba dgfceb fbcegad bagde bcdeag bcedg bdafce agfbe ad cgad | bdcafe agdc ebdcg cdga +edfg fedac fbegcad acgfe fabcd ead bgefac de daecgf bcaged | bafcd ade bacefg fdbac +gdecbf edabc ef fcgead fcadg bdcfga fec ceadf dgaefbc agfe | faedgc ef gabfcd fe +deafg eb egbaf cadegf fcdeab degb bcgaf bfe bfcdega gefdba | abgfe eb gfdaeb efdcga +fabcd beadf efabgc fc cafdgb gcfd adfcgeb abgdce cfb dgcba | dcgf bdcgaef gdcf cfdg +ebac acedf ceadfb cfe dbcgaf ec efcgdab degaf abfcd edgbcf | ce edgaf dgbceaf fce +ecbag fg gacdfe edafgcb cgefa eacdfb deafc bdagcf gcf dgef | fged gedf cefdga cabge +dgebc bcg cg gdeabf cgfeba gdfc gefbdc adbec bdefg fgcdbae | begdf cfgd eadbc gbfde +aefdb ecgb dgaeb agdbce ega fgdacb bcadg cbdeafg ge edacfg | age fcbdaeg gea bcfegda +cdeabg fcgda bdagc acfb dfa af cdeabfg efdgab fbcgda decgf | bcagd cfba gedfc af +ceadb caebgfd bdfaeg cbgaf ge ega gadcbf gfce ebgcfa gebca | aecdb febgcad bgcaf fadcgbe +daegb gfdae ceagfd bgfade feagcb fbgd bg cbagdfe ebdac ebg | gefbacd dbgf geb adgbfe +ecadfg acdfb aefgc ecbfdag dce cfbega fcdae edga gbecdf ed | fcdba ced egfcba dega +defgbc cgdea efag fdbcgae acbdf gcdaeb fe dfcega efc defca | fage fec dcafeg ecagfdb +bg dbcafg gdafecb dgfcae defcg gebd cefgb bgfecd fbaec fbg | gbf dfgec bedg cfdgae +ebgda ebd adce cdgaeb edfcgb bcagd agdcebf ed agbef gcbfda | efagb gbefa dbcfgae eadc +ebcfdg dbe de cdabgf fgdab dgae aecbf abfgced edbaf eagdfb | bface cdafebg gadcefb fedab +agc dabcge agbcd cabe dbagf cfgeadb gecafd gbcdfe ac gbced | cbegd beac dgbce ac +fdagb bdeacf fga eagd gcfdb gecafb ga feabd abfgde dcbfega | bdafe abgcfe gbecfad abdgefc +fbecd dbaef bdgc debafgc daecgf ebfcgd ebc abegfc bc gfced | fadecbg cb cdgeaf bfade +fagbe aebfgcd gef bgadf cbagfd deafbg cfdeag ge begd beafc | bcfadeg edbgaf fcgaed ge +gabfc gabde fbdga bfegca agfbcd df cdfagbe dcfg caefbd dbf | decfagb bdf gfcd fd +bdafeg gf gbadf gefb cgefda daecbfg bacfed cdagb fdg fdaeb | daegcf eagdfb adgcb bagfed +dafegb efdac bda fgedbac egfcdb bgfa fbaed bgdef debagc ba | ba bgcead bad ab +cfged cbegdf cb ecgdb adefbcg fdcabg cdb cdagef efbc gedab | bc gdebcf gecdb bagdcf +fbegcd gcedba eba acegf dbfa efbgd ebfadg ab fgceadb bgfea | fgbae gbedcf degfb agdebc +ceadf fdacbe ef edgafb dfe bgaedc cadfg bcef cfebgad ecabd | cafde fabedc debac eacfd +cd dgafe cbgfae decfg cfebg cfd gdbc febgdc fbegacd fceadb | dc beagfc aebcfg gcfeabd +adcefbg caefgb bafd dface bdcfe cegbd fbe gdfcae dceabf fb | efb ebcgd gbdcaef fb +fbdg gebac degbfc gd dfeagbc decfb gcd dafgce faecbd bdgec | gfdcae gfdb dg afgdce +fb fgedca fbe gfcde gcbfde dbceaf bgeca eafbdcg dgfb fbegc | fbe cbdegf bfe gedfc +acfbe fcbaged bgdcf cabgfd ag cagd fcbga bcfegd gfa eadbfg | afgcb gbdecf efdbcg fag +fbegc dgca dfc fagbedc bfadcg dc ebdfca fadbg cgbfd gfdbae | dabefg egdbaf gaebdf dc +cdbgf bdfaeg ca fgcab dgacfbe feac facgbe ebgcad bca gfbea | dafbeg cab cdagbe debfga +gfbe ebcfag bcedaf be egfac fegdca gebca eab cbgad gfacdbe | dabcgef bcagfed gcfea bea +bdefacg fbgedc efdagb beg geabf eg dafbce dage gfabc eabdf | gead gcafb ecfdab egfbdac +gd gfecbd dacefb dgbf cdegf acfge agbfced becdf aedbgc gdc | gdcef cgbead gd gefacbd +cgbfea cafed dbgefac gacb bc afbge fdabge efbac bcfgde cbe | gbac fcdbge agcb aecgdfb +abgefc cfeba gcdba fgdcea gf fcbgaed eadfcb gbfe fga bacgf | efcba fabecd dgcbfae eagcfd +gcdbfe fdec gcfdb bdfeg de efgba cbgdafe afgcbd cgdbea ged | cedgbf fced agfcdeb cgfbed +dbacfge cafdb gbcfea aegc afbec ea bae bgcedf befgc edgafb | dfgeabc bfgcde faceb fbecag +bfcgad bfegd fg dcgeb egaf bfedcag efabdc dfegba gfb abefd | gf abdgcf dcbfag fgb +degab dgebac bfdeacg cadeb fbdeac bag debgf cgda abgecf ga | dceba fdbeg edbac dbacfge +abdef gcbead bgce cgdab deg dgcbfa aedbg fbacdge eadcfg ge | cgfdba gcafde agfcedb fdacbge +defabg cabdg gcfed cabe gbeacd fgadbc eb geb aedcfgb bdgce | eb dbegc dfecg dbecag +egdabcf edcgb bcedgf cgb bgfe fcgabd bg acgfed cbaed dfegc | cgb gbc egcfad degbc +fe agebdc gfbead fcdea abecgfd bafcde beacd cbef def cgfad | dabgfe fde adfcg bfgead +ba fcabed bad dgacf dfgecab dcgba gdecb bdgcfa abgf caegfd | gdecb dgcfba gcdafe afbedgc +bdgef cdbgfa acbed gedcfb efdgba cg abcgedf cgb cgdbe cfeg | edabc ebdca edbcg ecgf +edfba bcfgead cbged defbcg ag gfadce gcaebd edabg cabg dga | fedagc bcag bdegc gaebfdc +edab fed egcfb ecgbfad fegbd fagdcb degcaf afgebd gabdf ed | def gdefb fgedb edcagf +fc ebfgda ebcfd cabed gcadbf baecfdg cgfe fdc egdfb gdecbf | defbg aecbfdg cadbegf adgfbe +bgdfc fgc fdegb dgecfb fcabd egbafdc gc dgce gabefc gedbfa | fbdgce gc dbfegca cg +bgedc ged gdfcea dcefb cdabg bgfe defbgc bdecaf dcgbfae ge | badefc gbfe cbegd fdagbce +cdefga cgdafeb cbe becdg gdefc cfbg cfdbeg cb febdac edgba | edbgcf abecfd ebgfcd fgbc +de aegcf agedcb afegbdc edbf fbdga facgdb gdaef dbaegf dea | cdabgf ead afgbcd edbf +cfagde eagfbc cbegf cg fcaegdb ebgfd gcf dafebc efabc acbg | bacfe fgc gcf cg +gadfce fbcaeg bdag eba bedcgfa dcfbe ab ebdgca ceagd ecabd | eabdc badec cdaeg dagb +aedb ebcagf fdeac be bdgfc eafbdc abcfegd aefgcd feb ecdfb | fecbd adeb be bfe +dg fgdecb dfecb fdcgeba gedcb gceab fdge cgd cgdbfa baedcf | ecbgd cagfdeb dcbfeg gd +fgcead bfdcag gecdf dfeacb dce aged gcbfe dcfgeab ed fgcda | cfegd de gcafd gefdc +dbec eafbdg dafegc eac gbacf decagb bcgae bdgea gbcefad ce | becag edgab cbadgfe edbc +gefcab agbdc febd bcegd de ecbfg afgdce ebafgdc dfebgc egd | de gdecfba edbf cdegb +abdcefg fbdega dcfag bd fegba badgec fgadb edbf fgaceb bdg | acdfg fagbce adcfg abgfd +ag agdb bfeag fbgdace bcfeda dgafeb egafdc begfc dfeba eag | ecbfg agbd dabg bfeacd +dagc dae fdaec edcafg fbadeg cgefa abcgef ad dfecb fdgcbae | eda eagcbf agfec debfc +ead beafd dfagb faceb bfedca facegd aefcbg cbed ed gfcbaed | abgdf eda agbfce ead +afdgb eabcgf dfgbe fecdgba dagceb gfa cafgdb af cdfa abdcg | abdfg dceagb decfagb fagcedb +dbcfga cb acb gcbafde fcbg egbfda dceaf gbfda dcfba cdbgae | fcadgb cdefgba agbfd cgfb +gceb fcgba cefdba caebfdg egfadb eagfcb cb beafg acb gfacd | abcedf bca gfcda bcge +eabdc caebf ad dgabcef fcaedg cfegba deacbf dabf dca begdc | dbgce dbfa fgebadc acedb +fbgce ec gcea dafcgeb fgbed fec adgbcf abcfeg fcbga cfbade | cbdfag ebgfc fgcbe agbfdc +afcg afebcg becgf fgadeb bdgaefc fa afe acedb abecf gdfebc | fgecb eacdfgb ceabf cgfa +fb gadeb aegdfb abgfe fab dfgb adfecbg bcaegd ebdafc cafeg | becdfga bf fbadec bgfd +ab dgafe fdaeb adb agcedf ecbfd agfb caedgb bdfage egfabdc | fedbc dfecag afdcge becfd +bgedf dgecfb fae gbaec fa cedafg dcabfge gedfab gafbe fbda | fcgdea geadcfb efbdg fa +cgfaed fdebg fcgabd fcegb bd dfaeg gfbeda fgdceba edba dgb | db ebcgf fgcbe edgfa +fgc egcafb dcgb fagdb bedafgc cdbgaf fedac cg gacfd dfbage | febgad cgfaeb fadbg gc +fdaebcg deabgc bfdeg dfcaeg efcgd cdaf cfbeag fcg cf cgeda | bgefcad bgdfe dafc ebagfc +egcfad dbecf cbgf fbe aecbd bcfdge dfbgea aebgdcf ecfdg fb | cgfb gecfd gefacdb fbcg +cdb adcf gbcdae bdceaf dfaeb cdfeb febgc fgedba cd cgdafeb | eadfb fcgeb cbedga bdacge +gd dacg gbdafc gfbdc bdegaf fbgca cbgdefa cbafge edfcb dfg | gbcafd dgac dgcafb cbfgae +cbf dafeb fbceag bc egbdfc edbgafc fbced ecdfg cdgb gdafec | bcf dbfea ebagcf gadfcbe +dcebgf eagfc aebfcd edcbg baefgdc fd cdefg dgaebc fde bfgd | ebagfcd acgefdb fagec gbdaec +afgdc bagec bdfg fb ecgdbfa fab dfecga bcgadf dcafbe bgafc | afgced fb dcafg feabcd +gef febag ebagc egcfbd fg cafg abfde abcfge afcgebd ebcgda | egf gaebf dfeba gadbce +ag cdeafg gdbfce daceb acgf efgbda adg cegda gaedbfc efcgd | debac eadbc bgaecdf cgbaedf +acefdbg debgac ecdgf ead facebg eafgb ad fedbga bfda eafgd | adbf eagfd eabcfgd ecagfb +cd bafegc fgcaed fcaeg dgc fdcag agdbf fedc gbadce egdabcf | fedbcga bgafd fcde cfed +decg egf ecgbfa degfa edbagfc dgcabf cdfag eg fcaedg faebd | gcadef efadg egf eg +feacbg cgfadbe efb efbga dfagb eb aefgc bgec cgedaf dcebfa | eb be be fbe +begc eacfdb dfacg agcfe ce eagbf eac eafdgb aefbcg dfgaecb | ce ce ce gbce +dfeagb dgaeb dbagefc gbcfae degf decba cbgdfa bgfda eg gae | ge agfdcbe bdace fdeg +cgdab cegdbf cfbad bg aegb caedfg eacgbfd dgb dgaec gdbaec | gbea eacgd gb cgaebd +ag ecdgbaf edcba eagcd aeg gcfa dfcgae egcdf gfdeba fcgbde | fgeadb dacge fdagceb egafbd +fdbgec bge fdacbe bfdga edfgb cbgaed gefc cefdb ge baegdfc | ebfgd gbe begdf eg +cedafb gdab fgced cabdf fgbaecd dcbgf gb bgc gabfdc ebfgca | bcadgf cbfda cdgfab agdb +fdcbg bgface ecdabf ad fgcbaed gcefad dac efgac cfagd daeg | dcfabge edga ad gcfea +bce gaecdb aefc bedfgca acbfge aebgf fbceg defgba dgfcb ce | ceaf ce bfgce ce +gefadc gefadb agd ebfcdag dbeg dfagb abfed gafcb dg adbcef | fbgad bged gd cfebda +dcfge egdbf adcgf bafecgd ecd gdfeac bdecaf ec cfgdab cage | acge dacgf facdg cgea +bagdec gecdfba gdabe deb eabc be acdgfe afgdb deagc gdecfb | aebgd cgdea adbge eabc +gebca bedgaf ac gcbeaf bcagedf bafge egcfda bedgc cabf cea | ecbdg efcgab ebagc bgadfec +edacbg gcfad efdabg bc cgfdbae bdc cfedab efbc beadf fadbc | dbc fcbe fbedacg cabfd +adfgce acgfb bgfadc dgbca fc gfc fgacdbe fagbe bcdf ebagcd | cbagdfe gfc fgbac cgbaed +gdbfec bea acdb ba bcged edabgc gcfaebd afebcg gedba gdeaf | ba fgcebd efgda gadfecb +gd gcda bgd gafbcde bdcfag bcgdf cedfb bgefda eacfbg cfbga | fgcab fdgcba bgacf bfedga +fgcadeb abdgc gce bagec fcbea ge aebcgd gead cedfgb bagdfc | gbdace baefc fdcagb cdgab +fbca aedfcg eagcbd fadbec bdgef fec cf bgcfade dbcef cbade | fgedb bgefadc fc cf +dbgfa feca gfbced cf abfgce fcb cafbg eabgc acdbge edafcbg | abgdf dbcgef geabfc fcb +dbaf fag bdfgea ecbgfa dgbfe fa edacg agcfdbe cefdbg fdgea | fgbaed cdegbf dacfbge gdcfbe +abc acefbd gacedbf gbcde dgabf ca fgcedb cega dgbca cgeadb | ca bcged abgfd bca +ceabgd cgfeb ea aedf gcbdfa cadbf acdfeb abfec eac dgcefba | cgdbafe cea adfe aec +dbcfgae agebc ebgd cebdfa ebacdg deagc be fdecga gbacf bce | deagcb agecdf caefdg cegad +dcaeg gea gdaf befgac cefgd facbdeg dcgbfe ga dagfec adecb | gadf gaedc age cabedgf +bead dagfbe gda bagfec ad egfba ecgfad fdcgb ecfabdg dfgab | agefdc dga bgfea dafcgbe +abcgd gecbfda cegd badfge bcaed fcaeb ed adcgfb gcabed edb | acefb acbgde deb ed +cgefdab dgbcfe gbe beca be fdecga bgcafe bfgda abgfe fgace | bfgda eb gbe bdgaf +age cefbadg bcfea cdagbe begca ag gedfca cbfdeg ebcgd dbga | efbac ega fecab dgba +cgedf fc defbgc cdf fceb dgebf bafgdce eadbgf ecgad gcfadb | cf deabgfc efgdbc fgbcda +bdgeacf bagdef gb becg bcfage cafbg bga fdbac caefdg eafcg | bcedafg cbeg bg gb +dfceb gcdab ecbad gfbdea eab gcbeda bgcdeaf ea abfgdc cgea | baedc egca dgacbe cedfb +gdaeb dgfbc cefg fe cfbgaed gdfeb fadcbg defgcb abcdfe dfe | gdcfba eagdb fe cfeg +abfcedg afgcde acgfd ae bdecga efbcd dea fdgabc feacd gfae | afdcge gaef aefgcd geacfd +beadfg cfdgb fdb agfcbde db abcgfd ecdgf cbagf bafgce bdca | efgcd dcefg cdgfe bd +fagbe fedbcag afbgcd agdfbe age adgcbe ea fead egbcf abgdf | gae cbegf afgdb ea +badfcg fagdc gaf fedcgba dagb acefd dbgcf cgfdbe ag gbecfa | ag bagd bdfgca fbadgc +cfebg gc fcbea dcbafe gbc gcedafb cegdba cagf fbgde baecgf | cg agcf befgc bgc +fegb ecdaf ecb gacefdb eb gdacbf cdegba abgfc afceb acegfb | ebafgcd afdgceb ebc be +adgb cgbae bg abecdg gcefa ecbad dbgfec gbe cbfdega baecfd | badg badg dbag aegbc +ab bfa gbedcaf adbgfe bfecg acefb fgdcae bcad fceda ebafdc | gebdaf edcfag ab ba +ceadbg cd gfdeca ebgfd gdfec dce fegbca ecfag fadc gdeabfc | gfaec gface fdac ecadgf +fbagd egdafb bdg adcefg gbfac daegbcf eadgf bd bfde dgceab | dbfe bd agfde agdef +ebg bgdfe acebdg dcfage abfdge agefd dgbcf eb bdfegac afbe | cdfbg aefb dcagef edfga +bfcd efc bfdcge gbdec bagfe agdceb cf dacgbef bfgec eadgfc | cfe dcbf cgebdf dbecag +cda cefdbg fgeca fdgbeca acgdf bdcgf da deafcb fbgcad bdga | afgbcd cfega gbfcda gdebcf +dcaf cagfb gdacb bgdfca fgaecb ebdag cd fdgcbae dbc bcfegd | cfdegb dc abcgd cbfedag +gabedc dgfab ecdfbg adegf afbc dbagc bacedgf bf fdb fdcbag | cfedgb dgcfab gbfcead dcbga +bcagde efd bgfcd fdecb aefb fe dcfbae gacfebd caebd afecgd | ebcdf afeb ef befa +abfc gcdaef agecdfb cb gacedb cgb gcbdf bdgfac gedfb gcdaf | gfceda bc bdfgaec bdgef +geabc gcebad cgbeaf begdcf gfabe fe bfgda gfe afce ebcfagd | febgac fcea fbcged baecgd +aedfb gbfe acbgde fe fcedgba aef fcadge bacdf fegdab ebdga | fcgdeba afdeb ef fae +gbcfd adfgcb gba dgcbafe agbfde ag cfag fecdbg gbdac edcab | fgcbd bgcad agb bdefga +agfde efgcba gaefc bdcfeg cfe bafc bgcedaf egbac agcedb cf | gebacf ecgafb gfceab cefag +febdc begcd ecgbdf dbacfe bdfagc adgec gbd gb afbdceg gefb | dbg gacbfd egcdfb gfebcd +decfbg dagfb afcgbd gdcfb cbaedf caefgdb da gdca gafeb abd | adbgcef dgafb abd cfbgeda +begcfd bgeaf dcfaeb cadfeg gcdb cadbgfe cg ecfbd cfbge cgf | cg gfc gdcb gcf +ecagdf dfcebg fgbea bg cbeadgf egb ebcafg edfab gbca fegac | bafeg aebfd gcab fbecdag +dgacf abfecg fcgadeb cgd gdbace cgbfa egfda dbfc cdbfga dc | cfbd gabdce dbgcaf egfda +afedcgb afge bfead gf gdfbe fgabed dgcbe dfceab dgf fabgdc | feag cdabef bgdacf gfea +adebgc de bfgacde beafdg egabc egcabf deg cead cbdeg dcgfb | ed eabdgf eadc dbafge +fcdbgae gbacf ebgdfc bcadeg bdgea fagdbe gce aecgb acde ce | cge ecg cabeg efdcgba +aefgcb fedagcb cefbdg ef dcbeg bacdge fegd edbfc fabdc cef | ecbgfd gdef bacdeg bcdeg +geadc gecfad gfcadb eg agdcf bgafce gdef acdbe gea dabegcf | ecfbag gebcaf baecd dfeg +cdeba bd aegcd bfadec ecfab bafd agbfce bfdcge bdc cgebdfa | abcfe agdce db adecg +fbadg faedgc bgdac bcegd bcadge agc gdefcb cbae gdfbace ca | defgcb ceagbd bdgca afedcg +acgfd cbdage agcbd dfa edcfg fa dbcfeag fabc dbaefg gdbcfa | af gedabfc af ebgdfac +dafgbc dfegc dc cgfae cgeafd cdf cagefb ceda bfged fdegcba | aecd cade deac fbged +cbegda dgfeb gefcb aefbgc fdgceb agdfe dgb bd fdbc bdgfaec | dcgbeaf db gfbed efdag +aefbd cdbeagf gd fdgc fgcdab afbcg bdg egfabc bfgad aebgcd | gdfc gadcfeb cfgd fgacb +eb gcbaed aeb fgdecba begd eagdc cadfb eabdc cfgade gacfeb | egdca dcbea bdfcgea be From 77741100e64187ca1f32e1bf2a2b1deeedf166c8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 8 Dec 2021 10:57:12 +0100 Subject: [PATCH 198/479] 2021: d08: ex1: add solution --- 2021/d08/ex1/ex1.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100755 2021/d08/ex1/ex1.py diff --git a/2021/d08/ex1/ex1.py b/2021/d08/ex1/ex1.py new file mode 100755 index 0000000..efab1fd --- /dev/null +++ b/2021/d08/ex1/ex1.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +import itertools +import sys +from dataclasses import dataclass +from typing import List, Set + + +@dataclass +class Entry: + signals: List[Set[str]] + outputs: List[Set[str]] + + +def solve(input: List[str]) -> int: + def parse_entry(input: str) -> Entry: + signals, outputs = input.split(" | ") + return Entry( + [set(s) for s in signals.split()], [set(o) for o in outputs.split()] + ) + + entries = [parse_entry(line) for line in input] + + return sum( + itertools.chain.from_iterable( + map(lambda __: 1, filter(lambda d: len(d) in (2, 3, 4, 7), entry.outputs)) + for entry in entries + ) + ) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 7c89ca949905023b4575bdbc4bc107454bd78956 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 8 Dec 2021 10:57:23 +0100 Subject: [PATCH 199/479] 2021: d08: ex2: add input --- 2021/d08/ex2/input | 200 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 2021/d08/ex2/input diff --git a/2021/d08/ex2/input b/2021/d08/ex2/input new file mode 100644 index 0000000..a5bf9d9 --- /dev/null +++ b/2021/d08/ex2/input @@ -0,0 +1,200 @@ +badc bd dbeaf cfdbge dfb cfbdea efbag edcfgab dcafe degfca | eacfd acdfbe cbdegf fcbaedg +cd fdbac egcfab gbadcfe cfgdeb cbadfe deca cdf dfabg abefc | dcf cfbad gbafced fcd +cg agecfb cbg eabgfdc egdc fdgba bafecd cbdfe bfcdeg cfgdb | efdcb adcfeb fbdcg gbc +bfceg gfadb dbcfgea bgaef efad abe bcdgfa ea fbdgea agecbd | eadf ceadbg abfge fecdbga +gdcafe eacb adc gbfda afdceb edgbcf badfc ecgbafd ac fdbce | ebfcd cefdab bdfgeca egbdacf +aefbgd fbdc fbecg egdcb edcbag bf gcefa fbedcg bagfced fbg | afgce cfbd bdcf geafdbc +ebgacd edacg gcdeaf cabfg dbc bd cdbgaef ebad fecgbd acbgd | dgbac db caegbdf gcbfa +defbga gead ge efagcb gdafbc cegbdfa egf bfdce bgdef dgabf | gef eg bfcdag ge +bae adcgfbe cdfeag ab dcgeb bfdage agecb cagfe abcf bfcaeg | bae aeb agfceb afceg +ae adefcb gaceb gadceb edag efadcgb badgc cfgbe cadbfg cea | ceabgd fbeacdg aged aged +aegbdc dbegfac gcbaf df febd egdafc deabg gdf gdfeab adfbg | bcdegaf dfeb bcegad df +aegcdfb becdaf gdecf ag fag dcfgba badg fcbad cdgaf acefgb | abcdf cefdab ga ga +gbcfad cefadg cegad aefdb gedacb gcfe fc cfbgead cfade caf | degac egcf geacfbd afc +bcfad afcdbe fd ecfba cfd afde cfeabg gcbfed dacbg fdgabec | cafbged edfa fcd dabgc +afdc adbfe bgecfad ecagdb dbcafe dfe fd agbfe bdace gdbfec | fadbe efbdgc fadbe edcba +bdface geba ecbdag acegd afcdg ge eadbc bfecgda edg fgbdce | eg abge fadgceb abge +fagbde fcegbd gec efcdg fdgbe ebfcag gc adcfe cgdb cagbdfe | defcg cbgdfea gcbd ecfgd +acfbg debgf gfcdba edcbfa fbdag fgbeca cfbagde gadc da bda | dacg acbgf cedfgab caefdgb +ca dfegca edcbgf gfcde aedbg gfdeacb dcbfea facg dgcea ace | fedcg fdagec cea ac +acdf gcfde debcga ecbgaf cf ebgdf bagfdce cedag cef gedafc | dgcbea fc dcgeaf cdaeg +ebagf cabgfed ed cbgad afcbge afdbge edg eagbd cedgfb aefd | fcgdbe de cgbeaf ed +fbcdeag cafbd fgcbea fdgacb daecfb cg gca defga gbdc fdcga | abfcged agc acfgd cbfaeg +dacfe ed ebdcag gcadfe dfbcaeg dce dfeg fbcadg bfeca acdfg | fcbdga gcbade aegdcf fbcgda +cfdegb cbef fgdec gdfbca gdecbfa egfdca bc gbc cbegd aedgb | befc bc abegd ebcdfga +agcefdb fdbg bf bdafe gdebaf eafdg acdbe gcebaf bef edcfga | bf fdbg efdab gefda +gcb bdcgef dcbfg bg edbg facegb cbedf edgafbc dfgca edacbf | gb cdebfa deagfcb bg +eafbg gfad afegbd caefbg befdgc ebagd gd bdg cfbdage acdeb | gd geafb cabed dbg +bcedfg dc dgc aedfbcg acgbed bgfead gedbf bfdcg cedf facbg | gabfed cdebag dafegb cd +fa adbceg afecd cafdbge eacgfb daegcf aef bcdfe fdga daceg | acedf afe fae afdg +cdfaeg agcfb bcdgea dcafeb cef fabec ef dfgcbae defb eabcd | gdabce fdeb ebdf ecf +cdefg ceafg gebfd cdg dc efbcdg cdgbea cfedbga cbfd fdagbe | fbcd afdgbe fabedg dcfb +cdafgb egdb fecgabd cbfdg fcbedg feb acefg begcf be dacebf | be be ebfdca abgfcd +eafgcd facegb acb cdbfaeg fagec dgcabe baefd cgbf cb afecb | bcafeg fcgb gfdeac eagcf +ecgdfb deb edfgab eb faedcg agfed bfaed dbacf gbae efgdcba | fabde eb ecdgfb eabg +aefbg bdegfa gacdb gefc fbc fc bfdcae gefbac cbfag dbgefac | ecfg fc cfge efgcdab +gcfbed gcbae dcaef cbegad bdag bgeacf adefgcb deg adgec gd | agcbde bgad gdbfec gcfabe +dfacb egbcda dac agdcfb fecab adecfgb bgadf cd fgeabd cgfd | gabfdec acd dc dc +bfecg dcgeab af gadf aedbg caefdbg bgfade bafeg abf eabdcf | ebcfg gafd ebacfd fgbdace +ge fdeab gcebfda fadcg fgead abcdef eag ebdgfa acgbef dgeb | cdagf cfdgbae fdeab eag +dba dgfceb fbcegad bagde bcdeag bcedg bdafce agfbe ad cgad | bdcafe agdc ebdcg cdga +edfg fedac fbegcad acgfe fabcd ead bgefac de daecgf bcaged | bafcd ade bacefg fdbac +gdecbf edabc ef fcgead fcadg bdcfga fec ceadf dgaefbc agfe | faedgc ef gabfcd fe +deafg eb egbaf cadegf fcdeab degb bcgaf bfe bfcdega gefdba | abgfe eb gfdaeb efdcga +fabcd beadf efabgc fc cafdgb gcfd adfcgeb abgdce cfb dgcba | dcgf bdcgaef gdcf cfdg +ebac acedf ceadfb cfe dbcgaf ec efcgdab degaf abfcd edgbcf | ce edgaf dgbceaf fce +ecbag fg gacdfe edafgcb cgefa eacdfb deafc bdagcf gcf dgef | fged gedf cefdga cabge +dgebc bcg cg gdeabf cgfeba gdfc gefbdc adbec bdefg fgcdbae | begdf cfgd eadbc gbfde +aefdb ecgb dgaeb agdbce ega fgdacb bcadg cbdeafg ge edacfg | age fcbdaeg gea bcfegda +cdeabg fcgda bdagc acfb dfa af cdeabfg efdgab fbcgda decgf | bcagd cfba gedfc af +ceadb caebgfd bdfaeg cbgaf ge ega gadcbf gfce ebgcfa gebca | aecdb febgcad bgcaf fadcgbe +daegb gfdae ceagfd bgfade feagcb fbgd bg cbagdfe ebdac ebg | gefbacd dbgf geb adgbfe +ecadfg acdfb aefgc ecbfdag dce cfbega fcdae edga gbecdf ed | fcdba ced egfcba dega +defgbc cgdea efag fdbcgae acbdf gcdaeb fe dfcega efc defca | fage fec dcafeg ecagfdb +bg dbcafg gdafecb dgfcae defcg gebd cefgb bgfecd fbaec fbg | gbf dfgec bedg cfdgae +ebgda ebd adce cdgaeb edfcgb bcagd agdcebf ed agbef gcbfda | efagb gbefa dbcfgae eadc +ebcfdg dbe de cdabgf fgdab dgae aecbf abfgced edbaf eagdfb | bface cdafebg gadcefb fedab +agc dabcge agbcd cabe dbagf cfgeadb gecafd gbcdfe ac gbced | cbegd beac dgbce ac +fdagb bdeacf fga eagd gcfdb gecafb ga feabd abfgde dcbfega | bdafe abgcfe gbecfad abdgefc +fbecd dbaef bdgc debafgc daecgf ebfcgd ebc abegfc bc gfced | fadecbg cb cdgeaf bfade +fagbe aebfgcd gef bgadf cbagfd deafbg cfdeag ge begd beafc | bcfadeg edbgaf fcgaed ge +gabfc gabde fbdga bfegca agfbcd df cdfagbe dcfg caefbd dbf | decfagb bdf gfcd fd +bdafeg gf gbadf gefb cgefda daecbfg bacfed cdagb fdg fdaeb | daegcf eagdfb adgcb bagfed +dafegb efdac bda fgedbac egfcdb bgfa fbaed bgdef debagc ba | ba bgcead bad ab +cfged cbegdf cb ecgdb adefbcg fdcabg cdb cdagef efbc gedab | bc gdebcf gecdb bagdcf +fbegcd gcedba eba acegf dbfa efbgd ebfadg ab fgceadb bgfea | fgbae gbedcf degfb agdebc +ceadf fdacbe ef edgafb dfe bgaedc cadfg bcef cfebgad ecabd | cafde fabedc debac eacfd +cd dgafe cbgfae decfg cfebg cfd gdbc febgdc fbegacd fceadb | dc beagfc aebcfg gcfeabd +adcefbg caefgb bafd dface bdcfe cegbd fbe gdfcae dceabf fb | efb ebcgd gbdcaef fb +fbdg gebac degbfc gd dfeagbc decfb gcd dafgce faecbd bdgec | gfdcae gfdb dg afgdce +fb fgedca fbe gfcde gcbfde dbceaf bgeca eafbdcg dgfb fbegc | fbe cbdegf bfe gedfc +acfbe fcbaged bgdcf cabgfd ag cagd fcbga bcfegd gfa eadbfg | afgcb gbdecf efdbcg fag +fbegc dgca dfc fagbedc bfadcg dc ebdfca fadbg cgbfd gfdbae | dabefg egdbaf gaebdf dc +cdbgf bdfaeg ca fgcab dgacfbe feac facgbe ebgcad bca gfbea | dafbeg cab cdagbe debfga +gfbe ebcfag bcedaf be egfac fegdca gebca eab cbgad gfacdbe | dabcgef bcagfed gcfea bea +bdefacg fbgedc efdagb beg geabf eg dafbce dage gfabc eabdf | gead gcafb ecfdab egfbdac +gd gfecbd dacefb dgbf cdegf acfge agbfced becdf aedbgc gdc | gdcef cgbead gd gefacbd +cgbfea cafed dbgefac gacb bc afbge fdabge efbac bcfgde cbe | gbac fcdbge agcb aecgdfb +abgefc cfeba gcdba fgdcea gf fcbgaed eadfcb gbfe fga bacgf | efcba fabecd dgcbfae eagcfd +gcdbfe fdec gcfdb bdfeg de efgba cbgdafe afgcbd cgdbea ged | cedgbf fced agfcdeb cgfbed +dbacfge cafdb gbcfea aegc afbec ea bae bgcedf befgc edgafb | dfgeabc bfgcde faceb fbecag +bfcgad bfegd fg dcgeb egaf bfedcag efabdc dfegba gfb abefd | gf abdgcf dcbfag fgb +degab dgebac bfdeacg cadeb fbdeac bag debgf cgda abgecf ga | dceba fdbeg edbac dbacfge +abdef gcbead bgce cgdab deg dgcbfa aedbg fbacdge eadcfg ge | cgfdba gcafde agfcedb fdacbge +defabg cabdg gcfed cabe gbeacd fgadbc eb geb aedcfgb bdgce | eb dbegc dfecg dbecag +egdabcf edcgb bcedgf cgb bgfe fcgabd bg acgfed cbaed dfegc | cgb gbc egcfad degbc +fe agebdc gfbead fcdea abecgfd bafcde beacd cbef def cgfad | dabgfe fde adfcg bfgead +ba fcabed bad dgacf dfgecab dcgba gdecb bdgcfa abgf caegfd | gdecb dgcfba gcdafe afbedgc +bdgef cdbgfa acbed gedcfb efdgba cg abcgedf cgb cgdbe cfeg | edabc ebdca edbcg ecgf +edfba bcfgead cbged defbcg ag gfadce gcaebd edabg cabg dga | fedagc bcag bdegc gaebfdc +edab fed egcfb ecgbfad fegbd fagdcb degcaf afgebd gabdf ed | def gdefb fgedb edcagf +fc ebfgda ebcfd cabed gcadbf baecfdg cgfe fdc egdfb gdecbf | defbg aecbfdg cadbegf adgfbe +bgdfc fgc fdegb dgecfb fcabd egbafdc gc dgce gabefc gedbfa | fbdgce gc dbfegca cg +bgedc ged gdfcea dcefb cdabg bgfe defbgc bdecaf dcgbfae ge | badefc gbfe cbegd fdagbce +cdefga cgdafeb cbe becdg gdefc cfbg cfdbeg cb febdac edgba | edbgcf abecfd ebgfcd fgbc +de aegcf agedcb afegbdc edbf fbdga facgdb gdaef dbaegf dea | cdabgf ead afgbcd edbf +cfagde eagfbc cbegf cg fcaegdb ebgfd gcf dafebc efabc acbg | bacfe fgc gcf cg +gadfce fbcaeg bdag eba bedcgfa dcfbe ab ebdgca ceagd ecabd | eabdc badec cdaeg dagb +aedb ebcagf fdeac be bdgfc eafbdc abcfegd aefgcd feb ecdfb | fecbd adeb be bfe +dg fgdecb dfecb fdcgeba gedcb gceab fdge cgd cgdbfa baedcf | ecbgd cagfdeb dcbfeg gd +fgcead bfdcag gecdf dfeacb dce aged gcbfe dcfgeab ed fgcda | cfegd de gcafd gefdc +dbec eafbdg dafegc eac gbacf decagb bcgae bdgea gbcefad ce | becag edgab cbadgfe edbc +gefcab agbdc febd bcegd de ecbfg afgdce ebafgdc dfebgc egd | de gdecfba edbf cdegb +abdcefg fbdega dcfag bd fegba badgec fgadb edbf fgaceb bdg | acdfg fagbce adcfg abgfd +ag agdb bfeag fbgdace bcfeda dgafeb egafdc begfc dfeba eag | ecbfg agbd dabg bfeacd +dagc dae fdaec edcafg fbadeg cgefa abcgef ad dfecb fdgcbae | eda eagcbf agfec debfc +ead beafd dfagb faceb bfedca facegd aefcbg cbed ed gfcbaed | abgdf eda agbfce ead +afdgb eabcgf dfgbe fecdgba dagceb gfa cafgdb af cdfa abdcg | abdfg dceagb decfagb fagcedb +dbcfga cb acb gcbafde fcbg egbfda dceaf gbfda dcfba cdbgae | fcadgb cdefgba agbfd cgfb +gceb fcgba cefdba caebfdg egfadb eagfcb cb beafg acb gfacd | abcedf bca gfcda bcge +eabdc caebf ad dgabcef fcaedg cfegba deacbf dabf dca begdc | dbgce dbfa fgebadc acedb +fbgce ec gcea dafcgeb fgbed fec adgbcf abcfeg fcbga cfbade | cbdfag ebgfc fgcbe agbfdc +afcg afebcg becgf fgadeb bdgaefc fa afe acedb abecf gdfebc | fgecb eacdfgb ceabf cgfa +fb gadeb aegdfb abgfe fab dfgb adfecbg bcaegd ebdafc cafeg | becdfga bf fbadec bgfd +ab dgafe fdaeb adb agcedf ecbfd agfb caedgb bdfage egfabdc | fedbc dfecag afdcge becfd +bgedf dgecfb fae gbaec fa cedafg dcabfge gedfab gafbe fbda | fcgdea geadcfb efbdg fa +cgfaed fdebg fcgabd fcegb bd dfaeg gfbeda fgdceba edba dgb | db ebcgf fgcbe edgfa +fgc egcafb dcgb fagdb bedafgc cdbgaf fedac cg gacfd dfbage | febgad cgfaeb fadbg gc +fdaebcg deabgc bfdeg dfcaeg efcgd cdaf cfbeag fcg cf cgeda | bgefcad bgdfe dafc ebagfc +egcfad dbecf cbgf fbe aecbd bcfdge dfbgea aebgdcf ecfdg fb | cgfb gecfd gefacdb fbcg +cdb adcf gbcdae bdceaf dfaeb cdfeb febgc fgedba cd cgdafeb | eadfb fcgeb cbedga bdacge +gd dacg gbdafc gfbdc bdegaf fbgca cbgdefa cbafge edfcb dfg | gbcafd dgac dgcafb cbfgae +cbf dafeb fbceag bc egbdfc edbgafc fbced ecdfg cdgb gdafec | bcf dbfea ebagcf gadfcbe +dcebgf eagfc aebfcd edcbg baefgdc fd cdefg dgaebc fde bfgd | ebagfcd acgefdb fagec gbdaec +afgdc bagec bdfg fb ecgdbfa fab dfecga bcgadf dcafbe bgafc | afgced fb dcafg feabcd +gef febag ebagc egcfbd fg cafg abfde abcfge afcgebd ebcgda | egf gaebf dfeba gadbce +ag cdeafg gdbfce daceb acgf efgbda adg cegda gaedbfc efcgd | debac eadbc bgaecdf cgbaedf +acefdbg debgac ecdgf ead facebg eafgb ad fedbga bfda eafgd | adbf eagfd eabcfgd ecagfb +cd bafegc fgcaed fcaeg dgc fdcag agdbf fedc gbadce egdabcf | fedbcga bgafd fcde cfed +decg egf ecgbfa degfa edbagfc dgcabf cdfag eg fcaedg faebd | gcadef efadg egf eg +feacbg cgfadbe efb efbga dfagb eb aefgc bgec cgedaf dcebfa | eb be be fbe +begc eacfdb dfacg agcfe ce eagbf eac eafdgb aefbcg dfgaecb | ce ce ce gbce +dfeagb dgaeb dbagefc gbcfae degf decba cbgdfa bgfda eg gae | ge agfdcbe bdace fdeg +cgdab cegdbf cfbad bg aegb caedfg eacgbfd dgb dgaec gdbaec | gbea eacgd gb cgaebd +ag ecdgbaf edcba eagcd aeg gcfa dfcgae egcdf gfdeba fcgbde | fgeadb dacge fdagceb egafbd +fdbgec bge fdacbe bfdga edfgb cbgaed gefc cefdb ge baegdfc | ebfgd gbe begdf eg +cedafb gdab fgced cabdf fgbaecd dcbgf gb bgc gabfdc ebfgca | bcadgf cbfda cdgfab agdb +fdcbg bgface ecdabf ad fgcbaed gcefad dac efgac cfagd daeg | dcfabge edga ad gcfea +bce gaecdb aefc bedfgca acbfge aebgf fbceg defgba dgfcb ce | ceaf ce bfgce ce +gefadc gefadb agd ebfcdag dbeg dfagb abfed gafcb dg adbcef | fbgad bged gd cfebda +dcfge egdbf adcgf bafecgd ecd gdfeac bdecaf ec cfgdab cage | acge dacgf facdg cgea +bagdec gecdfba gdabe deb eabc be acdgfe afgdb deagc gdecfb | aebgd cgdea adbge eabc +gebca bedgaf ac gcbeaf bcagedf bafge egcfda bedgc cabf cea | ecbdg efcgab ebagc bgadfec +edacbg gcfad efdabg bc cgfdbae bdc cfedab efbc beadf fadbc | dbc fcbe fbedacg cabfd +adfgce acgfb bgfadc dgbca fc gfc fgacdbe fagbe bcdf ebagcd | cbagdfe gfc fgbac cgbaed +gdbfec bea acdb ba bcged edabgc gcfaebd afebcg gedba gdeaf | ba fgcebd efgda gadfecb +gd gcda bgd gafbcde bdcfag bcgdf cedfb bgefda eacfbg cfbga | fgcab fdgcba bgacf bfedga +fgcadeb abdgc gce bagec fcbea ge aebcgd gead cedfgb bagdfc | gbdace baefc fdcagb cdgab +fbca aedfcg eagcbd fadbec bdgef fec cf bgcfade dbcef cbade | fgedb bgefadc fc cf +dbgfa feca gfbced cf abfgce fcb cafbg eabgc acdbge edafcbg | abgdf dbcgef geabfc fcb +dbaf fag bdfgea ecbgfa dgbfe fa edacg agcfdbe cefdbg fdgea | fgbaed cdegbf dacfbge gdcfbe +abc acefbd gacedbf gbcde dgabf ca fgcedb cega dgbca cgeadb | ca bcged abgfd bca +ceabgd cgfeb ea aedf gcbdfa cadbf acdfeb abfec eac dgcefba | cgdbafe cea adfe aec +dbcfgae agebc ebgd cebdfa ebacdg deagc be fdecga gbacf bce | deagcb agecdf caefdg cegad +dcaeg gea gdaf befgac cefgd facbdeg dcgbfe ga dagfec adecb | gadf gaedc age cabedgf +bead dagfbe gda bagfec ad egfba ecgfad fdcgb ecfabdg dfgab | agefdc dga bgfea dafcgbe +abcgd gecbfda cegd badfge bcaed fcaeb ed adcgfb gcabed edb | acefb acbgde deb ed +cgefdab dgbcfe gbe beca be fdecga bgcafe bfgda abgfe fgace | bfgda eb gbe bdgaf +age cefbadg bcfea cdagbe begca ag gedfca cbfdeg ebcgd dbga | efbac ega fecab dgba +cgedf fc defbgc cdf fceb dgebf bafgdce eadbgf ecgad gcfadb | cf deabgfc efgdbc fgbcda +bdgeacf bagdef gb becg bcfage cafbg bga fdbac caefdg eafcg | bcedafg cbeg bg gb +dfceb gcdab ecbad gfbdea eab gcbeda bgcdeaf ea abfgdc cgea | baedc egca dgacbe cedfb +gdaeb dgfbc cefg fe cfbgaed gdfeb fadcbg defgcb abcdfe dfe | gdcfba eagdb fe cfeg +abfcedg afgcde acgfd ae bdecga efbcd dea fdgabc feacd gfae | afdcge gaef aefgcd geacfd +beadfg cfdgb fdb agfcbde db abcgfd ecdgf cbagf bafgce bdca | efgcd dcefg cdgfe bd +fagbe fedbcag afbgcd agdfbe age adgcbe ea fead egbcf abgdf | gae cbegf afgdb ea +badfcg fagdc gaf fedcgba dagb acefd dbgcf cgfdbe ag gbecfa | ag bagd bdfgca fbadgc +cfebg gc fcbea dcbafe gbc gcedafb cegdba cagf fbgde baecgf | cg agcf befgc bgc +fegb ecdaf ecb gacefdb eb gdacbf cdegba abgfc afceb acegfb | ebafgcd afdgceb ebc be +adgb cgbae bg abecdg gcefa ecbad dbgfec gbe cbfdega baecfd | badg badg dbag aegbc +ab bfa gbedcaf adbgfe bfecg acefb fgdcae bcad fceda ebafdc | gebdaf edcfag ab ba +ceadbg cd gfdeca ebgfd gdfec dce fegbca ecfag fadc gdeabfc | gfaec gface fdac ecadgf +fbagd egdafb bdg adcefg gbfac daegbcf eadgf bd bfde dgceab | dbfe bd agfde agdef +ebg bgdfe acebdg dcfage abfdge agefd dgbcf eb bdfegac afbe | cdfbg aefb dcagef edfga +bfcd efc bfdcge gbdec bagfe agdceb cf dacgbef bfgec eadgfc | cfe dcbf cgebdf dbecag +cda cefdbg fgeca fdgbeca acgdf bdcgf da deafcb fbgcad bdga | afgbcd cfega gbfcda gdebcf +dcaf cagfb gdacb bgdfca fgaecb ebdag cd fdgcbae dbc bcfegd | cfdegb dc abcgd cbfedag +gabedc dgfab ecdfbg adegf afbc dbagc bacedgf bf fdb fdcbag | cfedgb dgcfab gbfcead dcbga +bcagde efd bgfcd fdecb aefb fe dcfbae gacfebd caebd afecgd | ebcdf afeb ef befa +abfc gcdaef agecdfb cb gacedb cgb gcbdf bdgfac gedfb gcdaf | gfceda bc bdfgaec bdgef +geabc gcebad cgbeaf begdcf gfabe fe bfgda gfe afce ebcfagd | febgac fcea fbcged baecgd +aedfb gbfe acbgde fe fcedgba aef fcadge bacdf fegdab ebdga | fcgdeba afdeb ef fae +gbcfd adfgcb gba dgcbafe agbfde ag cfag fecdbg gbdac edcab | fgcbd bgcad agb bdefga +agfde efgcba gaefc bdcfeg cfe bafc bgcedaf egbac agcedb cf | gebacf ecgafb gfceab cefag +febdc begcd ecgbdf dbacfe bdfagc adgec gbd gb afbdceg gefb | dbg gacbfd egcdfb gfebcd +decfbg dagfb afcgbd gdcfb cbaedf caefgdb da gdca gafeb abd | adbgcef dgafb abd cfbgeda +begcfd bgeaf dcfaeb cadfeg gcdb cadbgfe cg ecfbd cfbge cgf | cg gfc gdcb gcf +ecagdf dfcebg fgbea bg cbeadgf egb ebcafg edfab gbca fegac | bafeg aebfd gcab fbecdag +dgacf abfecg fcgadeb cgd gdbace cgbfa egfda dbfc cdbfga dc | cfbd gabdce dbgcaf egfda +afedcgb afge bfead gf gdfbe fgabed dgcbe dfceab dgf fabgdc | feag cdabef bgdacf gfea +adebgc de bfgacde beafdg egabc egcabf deg cead cbdeg dcgfb | ed eabdgf eadc dbafge +fcdbgae gbacf ebgdfc bcadeg bdgea fagdbe gce aecgb acde ce | cge ecg cabeg efdcgba +aefgcb fedagcb cefbdg ef dcbeg bacdge fegd edbfc fabdc cef | ecbgfd gdef bacdeg bcdeg +geadc gecfad gfcadb eg agdcf bgafce gdef acdbe gea dabegcf | ecfbag gebcaf baecd dfeg +cdeba bd aegcd bfadec ecfab bafd agbfce bfdcge bdc cgebdfa | abcfe agdce db adecg +fbadg faedgc bgdac bcegd bcadge agc gdefcb cbae gdfbace ca | defgcb ceagbd bdgca afedcg +acgfd cbdage agcbd dfa edcfg fa dbcfeag fabc dbaefg gdbcfa | af gedabfc af ebgdfac +dafgbc dfegc dc cgfae cgeafd cdf cagefb ceda bfged fdegcba | aecd cade deac fbged +cbegda dgfeb gefcb aefbgc fdgceb agdfe dgb bd fdbc bdgfaec | dcgbeaf db gfbed efdag +aefbd cdbeagf gd fdgc fgcdab afbcg bdg egfabc bfgad aebgcd | gdfc gadcfeb cfgd fgacb +eb gcbaed aeb fgdecba begd eagdc cadfb eabdc cfgade gacfeb | egdca dcbea bdfcgea be From b5824be5ba0201879ce322fa70b9cee3a6d612a3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 8 Dec 2021 10:57:37 +0100 Subject: [PATCH 200/479] 2021: d08: ex2: add solution --- 2021/d08/ex2/ex2.py | 77 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100755 2021/d08/ex2/ex2.py diff --git a/2021/d08/ex2/ex2.py b/2021/d08/ex2/ex2.py new file mode 100755 index 0000000..c22b23b --- /dev/null +++ b/2021/d08/ex2/ex2.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python + +import sys +from dataclasses import dataclass +from typing import Dict, List, Set + + +@dataclass +class Entry: + signals: List[Set[str]] + outputs: List[Set[str]] + + +def solve(input: List[str]) -> int: + def parse_entry(input: str) -> Entry: + signals, outputs = input.split(" | ") + return Entry( + [set(s) for s in signals.split()], [set(o) for o in outputs.split()] + ) + + def deduce_signals(entry: Entry) -> Dict[int, Set[str]]: + _1, _7, _4, *signals_to_deduce, _8 = sorted(entry.signals, key=len) + signals = { + 1: _1, + 4: _4, + 7: _7, + 8: _8, + } + + for sig in signals_to_deduce: + match = len(sig), len(sig & _4), len(sig & _1) + + if match == (6, 3, 2): + signals[0] = sig + elif match == (5, 2, 1): + signals[2] = sig + elif match == (5, 3, 2): + signals[3] = sig + elif match == (5, 3, 1): + signals[5] = sig + elif match == (6, 3, 1): + signals[6] = sig + elif match == (6, 4, 2): + signals[9] = sig + else: + assert False # Sanity check + + assert len(signals) == 10 # Sanity check + return signals + + def deduce_entry(entry: Entry) -> int: + decoded_signals = deduce_signals(entry) + + res = 0 + + for output in entry.outputs: + assert output in decoded_signals.values() # Sanity check + + for n, signal in decoded_signals.items(): + if output != signal: + continue + res = res * 10 + n + + return res + + entries = [parse_entry(line) for line in input] + + return sum(map(deduce_entry, entries)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 20f7e96cc5f15e28e8fc42d681e9dd491229bbb5 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 9 Dec 2021 12:57:08 +0100 Subject: [PATCH 201/479] 2021: d09: ex1: add input --- 2021/d09/ex1/input | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 2021/d09/ex1/input diff --git a/2021/d09/ex1/input b/2021/d09/ex1/input new file mode 100644 index 0000000..c6f7fd9 --- /dev/null +++ b/2021/d09/ex1/input @@ -0,0 +1,100 @@ +9876543298765698956789545678992103976545976323678910997879876432123679765323567894679434987654596521 +7998789129854987545697658789789212985439765454567899876568976569012489874212779943598929976653987432 +6429898934943496434589769894658924976929898765679969965345698798923456976433567892456998765432196543 +5210987899874987645678979943547895989899989898789357893234599987894678986547678901349899896563987656 +4329896798765797657889989652126789998798967999899969954345989876789989797698789316498766987854598787 +5498755679876798968997699643015678987676759899999898965959878965878997649899899997987654298976689898 +7987834656997899878976578932123789998545745799998787899898767854567998798965969898999743109987789999 +9896321345698998989965489543456999867623234567897676789789854343456799987654358799298654312398898989 +8765430234999987697896789654567899954310123456998545785678963212567898992101245690129796453479987978 +7654321345899986576997999876778978965421236567895431234789654345678957895212767789298987894567896669 +9785532456799765434989643987989569877654345878976544345698765456789548954329878999987798979878975456 +9876743767987654323679932198995476988765456989987655466899896787891239765434989989865679654989764367 +0999899878998743212567893999674365699986567898998767877894949898962678986676799878654589943499876458 +1989998989987654501457899876543234799897679987859878988943234999853467897897899867723457892398976567 +9879867991099865212345789989656125789649899876545989999654345998765679998998987654012349910987987989 +8768756689987654323456897298743239891234989765534597898798759879876789569989998632134598929876599096 +8653344578999865784587976349994345910199878964523456789929898764987893498977987545245987999965432145 +6542123469764986895678965499879966899989867893212345698939987653498902987856798767959876989996543234 +7752056778953497898789878987769899998767656989101234567898765432459919876545689878998785678989654546 +9854145789101298989899989876545768989654545679914348978997654321347898765434799989679654545678965687 +7543236993212349878998998765432459876543234567895567889459865432456987654323988995498763234589896789 +7654747894523498767897999654321345998769102678976988992398999545767899765499867894309982123456789999 +8765678965654976654456899865210236799898993589987899101987978996988979876987658989219873256798999989 +9876789998799865432345678994321346789987889998698978919876456789699767997996545678934965345789789778 +4987899989891974321234789986545456899876777897569567898765347897432356989987439789549876956797674567 +3298978978910985445445891297669767998785656789423456789653298976545469879876598999656989897896523456 +3129469568899876656566990998798978989654345893214567898764989897656798767987987988978998679999314567 +2012395436789987767678989899987899876543212379201879969889978789987987656799876877899976567898901238 +2193989325679898978989579768976789965432101268912989456998965678999896547898765656999875456567895449 +3989878934589769989793498959895689876743412347894592347987854567898786434569654547989765345478989567 +9978968895699654997652987645784789987954523456789693469876432457897654321298763239876543217345678978 +8867846789898969876543498732123678998766634787899989978994321367999865432598654567987982101234589989 +7654437999987899989754989643034567899898745678998767899989993479899987543498765678999878212345678997 +6542323899876789598769876542137878987999859899987656798767789598789897655679986799698765433456789876 +4321016789765679349989987756756789876789878910199545987656698997655789796789997894549977567567898765 +5633225899954598956799899867897897765689989429298769876845457986543456989899898943534988978678979987 +8764334567893487897898789998998976454568997998999998765432356978532349878956769892123499989789459998 +9875765789932346798997634569989432323467996987999989887845779865431234669545458789012943299892398989 +5987876894321457989989429979874321012399875676889876998956889978560123458932345699129892109901987878 +4598987899430349979678998899965456133987764545778965698768995989999294567890458798998789298319876567 +3219399978921298767587897679876967845976543234667894539878954399878989698921239997987699987423965456 +4301234567932987656456796567989878956965432133456793124989876498767878999432549876796589876539874347 +5412345789743597542345895434593989869874321012349891013999999987654567898643498765987678987698765458 +6523656897654987656556789323901299998765442123457999229878987896543456998789569979998789498789876769 +5439787898765698787667893219892398999879543434568978998767986797855669999897689989879899349999987899 +7656898919896789899878954398789987999989698545679567893457895498966798986998789394567988998789898989 +8967999323987897976989765987679876889998787686893467892124789349997997895429893233459867999698769678 +9698999934598956795499899876598765778999998797912349951015689123989876796210932012399756896569954599 +6549387895999987989323902965439874355698789898909498932123478939876765989929993243987646789459893989 +6321236789898999878919999876323943234987676989898987993234567899965434567898989349998789894398789878 +5433345998797898767897889987213495349876565677797656789446889999876515698987678998999899965987698767 +6985469899545989654665678999901989498765434545698768998658992398965106789976567987898999987976569656 +7876798795439876543234889569899878999876323434569979569769321987654345678989456976447688999895498767 +8987987654321989754015679499798767898983210128789989498999210398765656789654319895323567998789349878 +9098999876510199863126789987652358997654321247899796987578931239976768899965498789212348987679257989 +2129998995431239765257891099543768998765432656789545995467892946988979987896796568901236896578998996 +3679976789542398954348999198959879999876558767893239876567899897899989896997987699322345985456789125 +4599865679954987895459998987899989987998769879992123987678976789976799765989698789533959876348993234 +5989234567899876799567897956789890196549878989789544998989765678965698943476569897659896987257899345 +9976123456798765678989986844456789987698989395678959899895454567894567892565456998998765432125678976 +8765277567987654569998765432349999898987693234569998789654323456923478921012345679539854321034567897 +7654356679599987678999654321267898789965432145698987678943210147898569543235789794323969834245688998 +8765467989459899789998874210158999679876541016987894599964521234997679659347898989019879765766899899 +9876579894398789899987654332345696567987662929876793488895435349898989798959987879123989989877899787 +3987698789298678967998965453456789349898799899985932376789655456789599987899976768934599999999989656 +2498987679976543459019879867899892198789987789984321245698767567893498876789895457995678999878767938 +1349876567895432398999989988957989987679876698765540356789878678932987545456789346889789998767656899 +0198765456789321256789099899545678976598765549854321456899989799891095432347993275678992987654545789 +1987674345699592345679129654334688965499994321965545567998999896789194321236892164568921298543237898 +9876543234598989456989298743212567894389986539876667679567954965678987210235791013569432987654568956 +5987621023987679867895497652101345789579876547988798789678942134567976521256789123456943498765678945 +4997732654976598978996598764212345678989989656799899899989653655679876432345898235597894569876789534 +9876543459865467899987987654325766789799999789899965957899879769989997543456797546678965778989899325 +4988654598764348998998999766434589994598999898998654345678998998799987676567897667799796989999998934 +3298797679974245697999429887847893212987898987987434234789897567688999789878998778945689998999987896 +2129898989765134976878999998956789109876987656896510123498765434567899899989469899434567897898756789 +3298959398754299865757889979767899912985436445689323234569854323776789998794357986523479956989434599 +4987643239965987654345679869878999894976721336578935446798765612845899987654219875612396549876526989 +9876543129876799765234889754999998789987530123489976557999976701234599998764329874323489932987789878 +1995432035987999832123598932101989699998432236599987698999964312345678989876598765435567893499898767 +3989654124599898641034567893219876568999543445679998899989899423456989879987699897576789965689989656 +9878965435698765432155678965898765432987657656789999999875678954567999765698989998798999986789878543 +8767896776789986749878789896799987621298767767899899989654579765678989854799878999939998997898765432 +5456789987899987856989896789986798532349898898965778976543459879889875423999967894321987898969987643 +2345678999998998767998945999965987643656929969434569198754678992994989567898656976439876749456898765 +1234589923457899879987899889894398784789019654323691019867899921012398978997645897899985432345679876 +2365699894578923989875987676789249895899998766513589129878987892124987899876536789999876521236789987 +5456789689989012399954298545892134976999899895405678934989656789439876987654324679998787210123996798 +7687893578899234569895987699976549899999789984312389545694545696598765699765312567899654323245695459 +9798932345688965998769898987898799768987698765423578999943234789987674198653202469998765534367789568 +9899321234567899899654679876789988657899579877567678987890125679876583019765313578929878946978897679 +3976532345678945798753498765698976545986467988678789876789236798989432123984323489212989897889998989 +2987645456789659987654579874987654324985358999799899765698945987998943439876534794343598789999999990 +1298756569898798798765989989876543219876469999899988954567899876587894646987645679654987678999889891 +2349869698999997659877996593987655424976567895999876543456998765456789656798789789769887567998768789 +3567998987898989541988987432998966565987678934598765432567899854345699787899899899898765456789657679 +7678987676487678932399998949899879677898989323459876554678998743234678998976989944999854346996545568 +9899878554345568943567899898799998788969793212589988965689987664145699999765678932499710157895433477 +1998765443123459956789998765678969899654579323679999878799876543234589987654567943987621238997312556 +0197654321012367897991019834789456998765678954568954989899987654545678998765678954598534567898101245 From 137a98e936e729ee7e8b91ac3369c2225fe27848 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 9 Dec 2021 12:57:23 +0100 Subject: [PATCH 202/479] 2021: d09: ex1: add solution --- 2021/d09/ex1/ex1.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100755 2021/d09/ex1/ex1.py diff --git a/2021/d09/ex1/ex1.py b/2021/d09/ex1/ex1.py new file mode 100755 index 0000000..e84e893 --- /dev/null +++ b/2021/d09/ex1/ex1.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +import sys +from typing import Iterator, List, Tuple + +HeightMap = List[List[int]] +Point = Tuple[int, int] + + +def solve(input: List[str]) -> int: + height_map = [[int(c) for c in line] for line in input] + + def neighbours_of(point: Point) -> Iterator[Point]: + for dx, dy in (-1, 0), (1, 0), (0, -1), (0, 1): + x, y = point[0] + dx, point[1] + dy + if x < 0 or x >= len(height_map): + continue + if y < 0 or y >= len(height_map[0]): + continue + yield x, y + + def is_low_point(point: Point) -> bool: + for neighbour in neighbours_of(point): + if height_map[neighbour[0]][neighbour[1]] <= height_map[point[0]][point[1]]: + return False + return True + + def risk_level(point: Point) -> int: + return 1 + height_map[point[0]][point[1]] + + points = [(x, y) for x in range(len(height_map)) for y in range(len(height_map[0]))] + return sum(risk_level(p) for p in points if is_low_point(p)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From d06866158fb3717967bdce25fb4bac8bd8e7d270 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 9 Dec 2021 12:57:36 +0100 Subject: [PATCH 203/479] 2021: d09: ex2: add input --- 2021/d09/ex2/input | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 2021/d09/ex2/input diff --git a/2021/d09/ex2/input b/2021/d09/ex2/input new file mode 100644 index 0000000..c6f7fd9 --- /dev/null +++ b/2021/d09/ex2/input @@ -0,0 +1,100 @@ +9876543298765698956789545678992103976545976323678910997879876432123679765323567894679434987654596521 +7998789129854987545697658789789212985439765454567899876568976569012489874212779943598929976653987432 +6429898934943496434589769894658924976929898765679969965345698798923456976433567892456998765432196543 +5210987899874987645678979943547895989899989898789357893234599987894678986547678901349899896563987656 +4329896798765797657889989652126789998798967999899969954345989876789989797698789316498766987854598787 +5498755679876798968997699643015678987676759899999898965959878965878997649899899997987654298976689898 +7987834656997899878976578932123789998545745799998787899898767854567998798965969898999743109987789999 +9896321345698998989965489543456999867623234567897676789789854343456799987654358799298654312398898989 +8765430234999987697896789654567899954310123456998545785678963212567898992101245690129796453479987978 +7654321345899986576997999876778978965421236567895431234789654345678957895212767789298987894567896669 +9785532456799765434989643987989569877654345878976544345698765456789548954329878999987798979878975456 +9876743767987654323679932198995476988765456989987655466899896787891239765434989989865679654989764367 +0999899878998743212567893999674365699986567898998767877894949898962678986676799878654589943499876458 +1989998989987654501457899876543234799897679987859878988943234999853467897897899867723457892398976567 +9879867991099865212345789989656125789649899876545989999654345998765679998998987654012349910987987989 +8768756689987654323456897298743239891234989765534597898798759879876789569989998632134598929876599096 +8653344578999865784587976349994345910199878964523456789929898764987893498977987545245987999965432145 +6542123469764986895678965499879966899989867893212345698939987653498902987856798767959876989996543234 +7752056778953497898789878987769899998767656989101234567898765432459919876545689878998785678989654546 +9854145789101298989899989876545768989654545679914348978997654321347898765434799989679654545678965687 +7543236993212349878998998765432459876543234567895567889459865432456987654323988995498763234589896789 +7654747894523498767897999654321345998769102678976988992398999545767899765499867894309982123456789999 +8765678965654976654456899865210236799898993589987899101987978996988979876987658989219873256798999989 +9876789998799865432345678994321346789987889998698978919876456789699767997996545678934965345789789778 +4987899989891974321234789986545456899876777897569567898765347897432356989987439789549876956797674567 +3298978978910985445445891297669767998785656789423456789653298976545469879876598999656989897896523456 +3129469568899876656566990998798978989654345893214567898764989897656798767987987988978998679999314567 +2012395436789987767678989899987899876543212379201879969889978789987987656799876877899976567898901238 +2193989325679898978989579768976789965432101268912989456998965678999896547898765656999875456567895449 +3989878934589769989793498959895689876743412347894592347987854567898786434569654547989765345478989567 +9978968895699654997652987645784789987954523456789693469876432457897654321298763239876543217345678978 +8867846789898969876543498732123678998766634787899989978994321367999865432598654567987982101234589989 +7654437999987899989754989643034567899898745678998767899989993479899987543498765678999878212345678997 +6542323899876789598769876542137878987999859899987656798767789598789897655679986799698765433456789876 +4321016789765679349989987756756789876789878910199545987656698997655789796789997894549977567567898765 +5633225899954598956799899867897897765689989429298769876845457986543456989899898943534988978678979987 +8764334567893487897898789998998976454568997998999998765432356978532349878956769892123499989789459998 +9875765789932346798997634569989432323467996987999989887845779865431234669545458789012943299892398989 +5987876894321457989989429979874321012399875676889876998956889978560123458932345699129892109901987878 +4598987899430349979678998899965456133987764545778965698768995989999294567890458798998789298319876567 +3219399978921298767587897679876967845976543234667894539878954399878989698921239997987699987423965456 +4301234567932987656456796567989878956965432133456793124989876498767878999432549876796589876539874347 +5412345789743597542345895434593989869874321012349891013999999987654567898643498765987678987698765458 +6523656897654987656556789323901299998765442123457999229878987896543456998789569979998789498789876769 +5439787898765698787667893219892398999879543434568978998767986797855669999897689989879899349999987899 +7656898919896789899878954398789987999989698545679567893457895498966798986998789394567988998789898989 +8967999323987897976989765987679876889998787686893467892124789349997997895429893233459867999698769678 +9698999934598956795499899876598765778999998797912349951015689123989876796210932012399756896569954599 +6549387895999987989323902965439874355698789898909498932123478939876765989929993243987646789459893989 +6321236789898999878919999876323943234987676989898987993234567899965434567898989349998789894398789878 +5433345998797898767897889987213495349876565677797656789446889999876515698987678998999899965987698767 +6985469899545989654665678999901989498765434545698768998658992398965106789976567987898999987976569656 +7876798795439876543234889569899878999876323434569979569769321987654345678989456976447688999895498767 +8987987654321989754015679499798767898983210128789989498999210398765656789654319895323567998789349878 +9098999876510199863126789987652358997654321247899796987578931239976768899965498789212348987679257989 +2129998995431239765257891099543768998765432656789545995467892946988979987896796568901236896578998996 +3679976789542398954348999198959879999876558767893239876567899897899989896997987699322345985456789125 +4599865679954987895459998987899989987998769879992123987678976789976799765989698789533959876348993234 +5989234567899876799567897956789890196549878989789544998989765678965698943476569897659896987257899345 +9976123456798765678989986844456789987698989395678959899895454567894567892565456998998765432125678976 +8765277567987654569998765432349999898987693234569998789654323456923478921012345679539854321034567897 +7654356679599987678999654321267898789965432145698987678943210147898569543235789794323969834245688998 +8765467989459899789998874210158999679876541016987894599964521234997679659347898989019879765766899899 +9876579894398789899987654332345696567987662929876793488895435349898989798959987879123989989877899787 +3987698789298678967998965453456789349898799899985932376789655456789599987899976768934599999999989656 +2498987679976543459019879867899892198789987789984321245698767567893498876789895457995678999878767938 +1349876567895432398999989988957989987679876698765540356789878678932987545456789346889789998767656899 +0198765456789321256789099899545678976598765549854321456899989799891095432347993275678992987654545789 +1987674345699592345679129654334688965499994321965545567998999896789194321236892164568921298543237898 +9876543234598989456989298743212567894389986539876667679567954965678987210235791013569432987654568956 +5987621023987679867895497652101345789579876547988798789678942134567976521256789123456943498765678945 +4997732654976598978996598764212345678989989656799899899989653655679876432345898235597894569876789534 +9876543459865467899987987654325766789799999789899965957899879769989997543456797546678965778989899325 +4988654598764348998998999766434589994598999898998654345678998998799987676567897667799796989999998934 +3298797679974245697999429887847893212987898987987434234789897567688999789878998778945689998999987896 +2129898989765134976878999998956789109876987656896510123498765434567899899989469899434567897898756789 +3298959398754299865757889979767899912985436445689323234569854323776789998794357986523479956989434599 +4987643239965987654345679869878999894976721336578935446798765612845899987654219875612396549876526989 +9876543129876799765234889754999998789987530123489976557999976701234599998764329874323489932987789878 +1995432035987999832123598932101989699998432236599987698999964312345678989876598765435567893499898767 +3989654124599898641034567893219876568999543445679998899989899423456989879987699897576789965689989656 +9878965435698765432155678965898765432987657656789999999875678954567999765698989998798999986789878543 +8767896776789986749878789896799987621298767767899899989654579765678989854799878999939998997898765432 +5456789987899987856989896789986798532349898898965778976543459879889875423999967894321987898969987643 +2345678999998998767998945999965987643656929969434569198754678992994989567898656976439876749456898765 +1234589923457899879987899889894398784789019654323691019867899921012398978997645897899985432345679876 +2365699894578923989875987676789249895899998766513589129878987892124987899876536789999876521236789987 +5456789689989012399954298545892134976999899895405678934989656789439876987654324679998787210123996798 +7687893578899234569895987699976549899999789984312389545694545696598765699765312567899654323245695459 +9798932345688965998769898987898799768987698765423578999943234789987674198653202469998765534367789568 +9899321234567899899654679876789988657899579877567678987890125679876583019765313578929878946978897679 +3976532345678945798753498765698976545986467988678789876789236798989432123984323489212989897889998989 +2987645456789659987654579874987654324985358999799899765698945987998943439876534794343598789999999990 +1298756569898798798765989989876543219876469999899988954567899876587894646987645679654987678999889891 +2349869698999997659877996593987655424976567895999876543456998765456789656798789789769887567998768789 +3567998987898989541988987432998966565987678934598765432567899854345699787899899899898765456789657679 +7678987676487678932399998949899879677898989323459876554678998743234678998976989944999854346996545568 +9899878554345568943567899898799998788969793212589988965689987664145699999765678932499710157895433477 +1998765443123459956789998765678969899654579323679999878799876543234589987654567943987621238997312556 +0197654321012367897991019834789456998765678954568954989899987654545678998765678954598534567898101245 From 75a9a4710cf805820e16916865d0fbe87fbfd045 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 9 Dec 2021 12:57:48 +0100 Subject: [PATCH 204/479] 2021: d09: ex2: add solution --- 2021/d09/ex2/ex2.py | 60 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100755 2021/d09/ex2/ex2.py diff --git a/2021/d09/ex2/ex2.py b/2021/d09/ex2/ex2.py new file mode 100755 index 0000000..0311995 --- /dev/null +++ b/2021/d09/ex2/ex2.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +import sys +from typing import Iterator, List, Tuple + +HeightMap = List[List[int]] +Point = Tuple[int, int] + + +def solve(input: List[str]) -> int: + height_map = [[int(c) for c in line] for line in input] + + def neighbours_of(point: Point) -> Iterator[Point]: + for dx, dy in (-1, 0), (1, 0), (0, -1), (0, 1): + x, y = point[0] + dx, point[1] + dy + if x < 0 or x >= len(height_map): + continue + if y < 0 or y >= len(height_map[0]): + continue + yield x, y + + def is_low_point(point: Point) -> bool: + for neighbour in neighbours_of(point): + if height_map[neighbour[0]][neighbour[1]] <= height_map[point[0]][point[1]]: + return False + return True + + def explore_bassin(point: Point) -> int: + to_be_seen = set(neighbours_of(point)) + explored = {point} + bassin = {point} + + while len(to_be_seen) > 0: + new = to_be_seen.pop() + explored.add(new) + if height_map[new[0]][new[1]] == 9: + continue + bassin.add(new) + for neighbour in neighbours_of(new): + if neighbour in explored: + continue + to_be_seen.add(neighbour) + + return len(bassin) + + points = [(x, y) for x in range(len(height_map)) for y in range(len(height_map[0]))] + low_points = filter(is_low_point, points) + + bassin_sizes = sorted(map(explore_bassin, low_points), reverse=True) + + return bassin_sizes[0] * bassin_sizes[1] * bassin_sizes[2] + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 43621f22b26b9c6c5ac8b134b66683ad37ab4bde Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 10 Dec 2021 13:24:02 +0100 Subject: [PATCH 205/479] 2021: d10: ex1: add input --- 2021/d10/ex1/input | 110 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 2021/d10/ex1/input diff --git a/2021/d10/ex1/input b/2021/d10/ex1/input new file mode 100644 index 0000000..3a3d7bd --- /dev/null +++ b/2021/d10/ex1/input @@ -0,0 +1,110 @@ +<{[[({([{<[[([()<>]<<><>>)<[[]()]{<>()}>][<(()[])<()<>>>]]<(<(<><>)(())>)[<([]()){<><>}>{{()<>}<{}>}]>>[({ +<<({<{{{[(<{([{}{}]{{}[]}){({}())}}<<[[][]](()<>)>[{<><>}<{}<>>]>>(<[[()]([]{})]((()<>)[()() +({<<({[<[[<[([()])]<<<{}<>><()[]>>[[()<>]<[]()>]>>([((()[])[()])]{[[()()]<<><>>][{<>[]}(()<>)]}) +(([[<<[{(({{{(()<>)[()()]}[({}<>)[[][]]]}([{{}<>}<[]()}]{[[][]][()<>]})})(([({[]{}}{[][]}) +({{<[[<<{{[{[<{}{}>{[]{}}]<([]{}){()[]}>}]<{([<><>]([]<>)){({}())({}<>)}}[[<{}<>>([]{})][[()[]]]]>}}>>]] +[(<<<{([[[<{(<()<>>{<><>})(<[]<>>([][]))}[<[{}[]]>{<[]>(<><>)}]>([{{[]()}{[]()}}([<>[]][{}<> +<[{[{{([<(<{{[{}<>]({}{})}{{<>[]}(()())}}(<<<>{}>(<><>)>(<<>{}>[[]<>]))>)>[{[<[[()<>]{{}<> +{(<<[([<{<<<({()()}(<><>)}{((){})([]())}>>[<{<[]<>>{[]{}}}([()()])>]>}>]{{([{<{{[]<>}(<>)}<({}( +((<[{(({([<{(<[][]>)[<<>{}><()<>>]}<{<{}{}>}[{()[]}<{}[]>]>>])})<[{[{([{[]()}((){})][<<>()><()()>])>]}][[({{[ +[[{([[<<[({[<<[]{}>{[][]}>(<()<>>[{}()])][([{}[]}[<><>]){[{}()]}]}[<<<{}<>>{()<>}>(<{}()>([]()))>{[[<><>][ +{{{<[([[{<[<{([]{}>{<>()}}{<(){}><()()>}>[{[[][]](<>())}[{[]<>}[<>[]]]]]{<{{{}[]}{<><>}}[[()()](< +(([{(({[[[[{(<<>[]>((){})){<()<>><[]{}>}}{[{{}()}(()[])]((()){()<>})}]]]<[<<{(()[])<{}[]>}{ +{<<([(<([{{(<(()<>)[[][]]>{[[]{}]{(){}}})[{<(){}>[[]<>]}]}}])[[[([[{()()}{<>[]}]{[()]{[][]}}]<[(( +[{<<{<([(<[<{<{}[]>{{}[]}}(([]()))>{([(){}]<()[]>)(<[][]>{[]<>})}]>[{<<{<>()}[{}[]]>{(<><>)}>{[<[]<>>{()[]}]< +<{{<{[[{{([({<()>{(){}}}((<>[])(<><>)))[(<[]<>>[()[]])<<()()>{<>{}}>]])<[{[{[]<>}{()()}][[{}{}]<[]>]}<{{{ +[(<[{([{({<<[<<>()>[[]()]]{<<>{}><{}<>>}><{<()()>{{}{}}}(({}<>)<()<>>)>>})({(([<{}<>>{[][] +{(([{[<{{[({{[{}<>][()]}<{{}<>}>}(({<>[]})))]{((<[<>{}][<>[])>[[<>()]{[][]}]))<<<({}<>){{}<>}>( +{[<{({((([[{[(<>{}){<>()}][([]{}}]}]{[<(()()){[]()}>((<>[])<(){}>)]}]){<(<<{{}<>}>>)([[{<><>}< +{<{[(<{<[({<<[<><>]{()()}>[{()<>}<{}>]>[[<[]>][{()[]}{()}]]}(<(({}()){<><>})<(()())[<>()]>>{ +<[({[[{<([[{<{{}}>(<<><>>{[]()}}}[{{<>{}}<()<>>}{[[][]]{[]<>}}]]<((([][])<<>{}>)<((){})[{}() +{{[{<[{<<{<<(<{}[]><(){}>)<{<>[]}[{}()]>>[{{[]<>}<()<>>}[{{}<>}(<>())]]><[(({}<>)({}<>))<<{}<>><< +{<<({(<[(<[[{{[][]}{{}}}<[[]()]<<>())>]](<{{{}<>}{()<>}}>)>)]<(({{[[[][]]]}<[[(){}]<[]{}>]>}))> +({{([<<{[(<<{{<>()}<[]()>}<{(){}}{{}{}}>><(<{}[]>{<>{}})<([]<>)([]())>>>)]}>>[[{<{[<<(<>{}) +<{({{({<<[{<<{<>}{{}[]}>>[[{[]<>}{()()}]<<[][]>(()())>]}]{<<{[(){}><<><>>}{{<>[]}(()<>)}>[<<(){}>[[] +<({<([[[([({<{(){}}([][])>}<[{[][]}{<>()}]<[(){}][{}<>]>>){<({{}()}{[]{}})>{[{[]{})[()[]]]<[ +{([({[(([<{((({}()){{}<>})(<()[]>{()()})){[({}{})<<>[]>]([{}][()])}}>]{<<[<[[][]]{[][]}>({[]{}}<{}()>) +<<{[<({[(<[({<{}{}><()()>})]{<<[<><>]>>}>){{[((<<><>><{}[]>)){<{[]()}(<>())>}]{{{({}<>){[]<>}}{{ +<<({<[{(([{({({}())(<>{})}{((){})})[<[[][]]([][])>]}<<[[<>{}][[]<>]]<([]<>)[()()]>><<<{}[]>(()())>>]])[[[ +[{<({<(({([([{[]}]<{[]()}[()<>]>]{{(()())<{}()>}{{[]()}<()<>>}}][{(<[]<>>[<>{}])[<[]<>><<><>>]}<(<< +<{{((<<(<{({<{<>{}}[[]{}]>})[[{{[][]}{{}<>}}]]}[(([(()[])<()<>>]((<>[])<<>{}>))<[[<>()][<> +{[([<<<({[{<<[<>{}]<[]<>>>>({<<>{}>((){})}<{[][]}{[]{}}>)}<{(([]{})<<>>><{{}()}(<><>)>}<{<[] +<({[[{{{([(({[{}<>]{[]<>}}[{()<>}<(){}>])<[<{}()>[[]<>]]>)]{{[<{<>()}[{}()]><<<><>>{[][]}>]([[[][]](<>()) +[<<{{<[[{[<(<{()[]}[(){}]><[()[]]<<>{}>>)>[[[[[]{}]{[][]}]{<[]{}><(){}>}]({{<>()}<<>{}>}({()<> +[<[[(<[[[[<<<{()<>}[[]()]>>{[[<>[]]{[]{}}]{[<>[]][[]<>]}}>]]({[({[<><>]<{}<>>}<<(){}>[{}()]>)[[<<> +<{{({<([{({({{{}()}((){})})([([][])[[]<>]](([])[{}<>]))}<(([()<>][()[]])[<[]><{}{}>])<{({}<>)<<>()>} +{<[[[([{[<<(({{}<>})(<{}()](<>{}))){[[<>[]]({}<>)]}><[((<>()){[][]})[({}())<{}<>>]]<({<>[]}{{}<> +{<[<[({<({(<(({}[])<{}>)((<>[])({}<>))><(([][])(()()))>)})({{({{<>())}<{<>()}([]{})>)[[(()<>)<<>[]>](<< +{(<(<<{{({{<{(<>[])[[]]}{(<>{})>>{<(()())[{}{}]>{{[]{}}{{}<>}}}}(<{[{}[]]<(){}>}[[{}{}]{()<>}]>([{<>{}}[<>]] +[{[{{[[[{([<(({}{})<[][]>)<([]{})<<>{}>>>[{[[]{}]([]<>)}{(()())[<>[]]}}]((<([]<>)[()<>]>(<{}()>)){<[<>[]]( +{<<<<{(({<<({(()())(<>{})}<([][])[[]()]>)[{{[]()}(<>)}]><{[<<>()>]{<[]()>[[]<>]}}>>}>[(<<<[{()<>}{{}<> +[{[(<[<{<[({[{[]<>}<[][]>]{{<>()}}}[({<>[]}{{}{}}){[[]<>](<><>)}])({({{}<>}<{}<>>)}<[((){})[{ +{<[[{[(((<({([[]<>](()<>))}[{{()<>}({}())}(<[]{}>{[]{}})])<<(({})[{}{}])[(<>{})<()>]>>>))<[{{<[{{}<>}[[][] +[[<<([{<{((([<{}{}>(<><>)][({}[])])[[(<>{}){{}<>}](<()[]>[[]()])])[{({()}{{}{}})(({}())([]{}))}({[{}[]]{ +<<((<[<(([<{[<{}<>>][<{}{}>{{}[]}]}[{<<>()>[[]{}]}{[()[]]([]{})}]><{({()()}{[]})<{[]()}[{}{}]>}{((<>( +({<<{[(({{<<{[[]()]{{}()}}{[<>{}]<[][]>}>{(([]())[<>[]]){<[]{}>{<><>}}}>{{{{<>[]}{{}()]}{{<>{}}[{}{} +{((<<{<<<((<(({}{})(()))[[()()]{{}<>}]>{(<()[]][{}[]])[[<>[]]<<>>]}))>([[{({()[]}{()[]})(<[][]><{}{}>)}[[[[][ +[(<<{<[(<([<(<[]()><()()>)>]{({[<><>]{[][]}})}}<[([(()())[{}]]<<(){}>[<><>]>)][<<((){})>>[[{<><>}[{}()]][([] +[<{[<[[(({{{[<{}[]><<>{}}][[{}<>]<<>()>]}{[{[]}[{}[]]]{[()[]]<{}<>>}}}[({<(){}>{{}{}}}<(()[])( +<{([{(<[<<<<[[{}{}]([])](<{}{}>[[][]])>{{(()[]){<>[]}}<[<><>][(){}]>}>(([[{}{}]{{}<>}](<()()>))<<(<>{})<< +[(<[[[[(({[<<<<>{}><<><>>>>]<{[{{}<>}<()>]{{[]{}}[<>[]]}}<<<()[]>([]<>)><(<>{}){[]()}>>>}))[[([{< +[([(({<{([<[({{}{}}<{}{}>)[[[]{}]({}<>)]]<[([]<>)({}[])]{(()[]){[]<>}}>>{[<{[]<>}>{[()[]]<()<>>}][<([ +{<[<[[<[{({{<[[]()][{}()]>({()[]}(()[]))}([[<>()]])})}{{<{{[<>]<[]()>}{<{}[]]}}<{{()[]}<[]<>>}([()()]<{}()>)> +[{{(<(([([((<{{}{}}({}())>{{<>[]}<[]{}>})([{<>()}{{}<>}]{<()<>>[{}{}]})>]{{[<(<>){[]{}}>{<<>[]>[()[]]}] +[<<(({[[({({[{[]{}}<<>[]]]{[()()]<<>()>}}{[{<>[]}<()>]}){{<<()[]>{[]{}}><<<>>[[]()]>}}})<[{{[< +<([{{{(<{{{<<({}()){(){})>{<{}{}>{<>()}}>{(<()[]>({}()))<({}())<()()>>}}[(({[]{}}[<>{}])([{}<>])){{{{}}(< +<<{[{[[<([[<(<{}<>><()[]>)<{<>()>[<>()]>>]][{{{{()<>}<{}[]>}[<[]()>[()[]]]}<{[{}](<>{})}>}[<[[<><>]< +[{[([{<<[([[{<<>[]>(<>())}((()())({}{}))>{[({}())<<>()>]<(<><>){()<>}>}]({([(){}]<[]<>>){<[ +[{<<[[<((({[<[[]()]>(<<>>(<>{}))]<<([]<>)[<>{}]>{<[][]>(<>())}>}(([{{}<>}{{}[]}]{[()[]]{{}{}}})< +([<<{[([[<{<{({}())}{(()<>)}>[<[{}<>][[]()]><[<>{}]({}[])>]}<[([<>()]){[()<>]([]{})}][[[{}[]]][ +<{[[{({<{(<[[(()[])<<>[]>]<<<>()>{[]<>}>]>{[<(<>()){<>[]}>(([][]))]([<[]<>><{}{}>]([<>{}](()() +{[([{{(([[<{<[{}<>]([]{})>[((){})<()[]>]}[[{{}<>}<[][]>]<{[]<>}([]())>]>{<{{{}<>}{(){}}]{{[] +[{{<[([<{[[({[{}[]][(){}]}<{<>()}<[]{}>>)]<<({()<>}[[]()]){[<>[]]<()()>}>>]{[<<(<>[])<[]<>> +<[{<[<((<({[{[{}[])(<>{})}(({}[])[<>])]})>[[([{((){})<<>>}])[<((()<>)[{}{}])[[(){}]]>{<<{}()>{ +({[[[[[[[<((<[<><>][()[]]><(<><>)>))>{{<(<<>[]>{{}})[[[]<>]({}())]><{{()<>>[[]<>]}[<{}{}>{<>{}}]>}[{<(< +([([(<[{<[[{<{<>[]}>{{{}()]<{}()>}}<([{}()]{{}<>})[([][]){{}<>}]>]{<{{[]{}}{{}<>}}<[[]()]>>[[{()[]}{(){}}]{[ +{<{([([{<<<<{[<>()]<[]>}[[()<>]<()>]>>(([[<>[]][{}{}]])((([][]){<><>})([[]{}]<()<>})))><{<<[()()]<[]()> +[{({[{[(([([{{{}<>}{()<>}}(([]<>){{}{}})][<{()}{{}{}}>(<<>()>[<>()])])]))<<<({((<>()){[]{}})[{ +([([(<(({<(<<<{}[]>){{<><>}[[]{}]}>[{{[][]}<<><>>}])<{<<[]>(()[])>[[{}()]<[]<>>]}{({[]()}[<><>]){{{}[]}[{ +{{[{<{((<((<<<(){}>>{([]{})[[]()]}>([({}{})]{<()>{[]{}}}))[[(<<><>>)]<<<{}{}><(){}>>[({}[])({} +<{[({{<<((([[[(){}][{}<>]]<(<>[])<[]()>>]<[[{}()]({}())]>)({<[(){}]>{(<><>){[]{}}}})){{{<<[]()>[()<>]>[< +(<[[(<((<[[<{[[]()][()<>]}<[[][]]<[][]>>>((({}())((){}))(<{}<>]{()()}))]]>[[{<{[{}<>]}>([[{}<>](() +<<<{<(<[<{[[([<>()][()<>])(<<>()>[{}()])][<{<>()}>]]}<<<({<>[]}([]{}))<<(){}>>>[[({}())(())]]>{({({}[ +([<<<{<{({<[{(()<>)<()()>}]<[({}<>)]>>{[[{<>{}}(()[])](<<>>[[]<>])]}}{<<{<<>()>}><{{<>()}<<><>>}{<(){}>[(){ +{{(<<[{{({({({[]()}<{}()>)(([][])[()<>])}<{(<>())[()<>]}>)[[(([]<>)[[]<>])]]}[({[({}()){{}>]}) +<((((<{{{{{[{[(){}]([][])}[{<>{}}([]<>)]]([((){})]<[[][]][<><>]>)}}<(<{(()<>)([]{})}><([()<>]{<>() +<{<{<(<(<<<(<[[][]]<<>()>><[<>[]][[]]>)[<[<>{}][<>()]>]>{<{(()){{}()}}[<{}<>><<><>>]>[{<{}[]><<><>>}]}>{( +{[{<<(<([({{<<[]<>>[<>{}]>{<{}<>>([]<>)}}([<<>{}>((){})}<{<>[]}>)}<<({{}()})<(<>[])[[]]>>[[<<>[]>{()[]}][[[] +<<<<[<{<[{{(<[<>]<[]{}>><(<>{}){{}()}>)[[{<>{}}{{}[]}](<[]>[<>{}])]}{{[{{}[]}(()<>)]<([]())( +[([({[[{<{{<<{()()}<{}{}>>({{}{}}[{}{}]>>[{(<>{})<()()>}[[<>[]]<{}()>]]}[<<{<><>}(()[])>(<{}[]> +[<<[[(({<[[([(<>[]){()[]}][(<><>)[<>[]]])]<({<{}{}>(()[])}[<{}<>>({}())])((({}{})<{}[]>)[{{}<>}{{}{}}]) +(({({[<<[<[([<<><>){[]{}}][<()<>><[]<>>])({[{}<>]<[]<>>}<({}{})[{}[]]>)][{((<><>)(()[]))}[<<{}()>{<> +<((<[(<(<[[([{(){}}<<>()>]({(){}}{(){}}))]][{{[{[][]]{<>{}}]{[{}<>]([]{})}}}[<{[[]{}][<>()]}[(()[])< +{((<<{({<[([(([]())([]()))(<[][]>{()})])<<[<<>[]>[<>())](<()<>><()()>)>>]>{{[{<[<>{}]<[]<>>>}<{{<><>}< +{<<<<[((<{({<{<>[]}{<>()}><{<><>){<>()}>}([[[]()][(){}]]<<()<>>{<><>}>)){[{{<>[]}{[]()}}{(<>()) +({<<<<[{<{<{(<{}{}><()[]>)[{<>{}}]}>(<[([]{}){<><>}]{<<><>>[()[]]}}<[{()[]}{()[]}][{{}[]}{[][]}]>)}>}] +({({{<{{{[<{{(<><>)}({[]()}{<><>})}{<[{}[]]<[]<>>>[(<>[]){()()}]}><[[<<>()><[][]>]]>]<<[{[[]()]( +<{[<([<[({([{(<>{}){()}}<([]<>)[{}{}]>)[[<()[]><{}<>>][(<>{})[()()]]]){<{({}){{}{}}}<{<>()}[[ +{((({[{<{[<({[{}()]({}{})}<(<>)(()())>)({[[]{}](<><>)}[<<>[]>[<>[]]])><<[{[]<>}][([][])<[]()>]>( +({[((([<[(<{[(<>[])(()[])]}<[([][])([]<>)]<(()())>>>((([(){}])<(<>())<<><>>>)<[[()<>>{{}{} +[{{((<{[(<{[{{[][]}{<><>}}[[()[]]<[][]>]]<<({}[])((){})>>}>[(<([[]()]<{}[]>)([{}<>])>({<<>[]>(<>[])}[( +((<((<[<(<[{(<[]()>[()[]])((())(()[]))}{[[{}<>]([]{})]<[[]()]>}]>)><([<[<{[]<>}<{}[]>>[[(){}]]]({[[][]]{ +[(([([(([<<(<{<>}{[][]}>)[{[()<>]{{}{}}}({{}{}}<[]()>)]>>{([({<><>}<[]>){<{}{}>[()<>]}]<<[[]{}]{{ +[(<{<[[{[<<{<[[]<>]<[]()>>{{[]<>}}}><[[{{}()}([]<>)]][({{}<>}{{}{}})<[[][]](()())>]>><<({([]{})<<>{}>}){ +<{[<[(<<[[[[{<{}[]><[]<>>](<{}[]>{()[]})](<[<>()][[][]]>([()()]<<>()>))]]({([<()[]>[{}()]])<{[[]()]}{<[][ +<{{{([[([{{{<({}[])>}}<<({<>{}}{{}()))<({}{}){[]{}}>>[[(<>())[{}[]]]<<[]{}>{<>[]}>]>}([{[<< +[{<(({{<[{[[([<>{}]{<>{}})(((){})[{}[]])][{<{}<>>}[([]{})<{}>]]]}{<<([<>{}][()[]})[{{}}<{}()>]>( +[((<[{<<[<[{[{{}()}[{}[]]]<[<>[]][{}<>]>}]>]{[([([[]<>]{{}[]})[<(){}>[()[]]]]<<({}[])<[]()>>[( +[{([<{([(({(<[[]<>]>{({}()){<><>}})([([]())[[]<>]])}(<[({}())(<>())]<{()<>}[[]<>]>>)){{([[<><>][()[]>](<[][]> +<<(<<<{{{<<(<<[]<>>{<>()}>[<[]>])<{<{}<>>}{[{}{}]<<>[]>}>><{<<<>{}>({}<>)>}{([()[]]<<>()>)(<<><>><[]{}>)}>>< +{[<<[{{(<<[((({}{})[{}{}])(({}<>)[{}()]))]>{([[[(){}]<{}<>>][[{}[]]{()[]}]](<{[]{}}(<>[]>>))}>)}[(< +<{{[[<[[[(((({<><>}{{}{}})<[<>()]([]())>)[<{{}<>}>{((){})[[][]]}]))<{<{[[]()]<[][]>}{<[]<>>(<> +{<[<<([[[[{{<({}<>)<{}()>>[(<>())({}[])]}<{([][])({}<>)}>}(({[<>{}]{[]{}}}<(<>{})>)[<{[][]}{[][]}>{({}()){ +[[({{[(((({<{{<><>]}{(<><>){<><>}}>(<[()<>]<{}{}>>((<><>){<>[]}))}{<[[{}[]]([][])][{{}[]}[ +[{{<([((<<{(((<><>)<(){}>))((({}[]){<>()})(<{}()}({}{})))}><[<<{<>[]}[()<>]>{[<>{}]{[]()}}>{{ +[<{<{{({{<<<{[<><>]<[][]>}<<(){}>(<>)>>>([<{[]()}{{}[]}>{<{}()><[]<>>}]([([]())[[]]]([[]()]<<>{}>)))> +<[{<[(<{{([[<[{}{}]><([]<>)(()())>][<((){})[[]()]>[([]<>){<><>}]]]{<{<[]<>><<>>}{<{}<>><[]{} +{[((((((({([([(){}]([]<>)){[{}](<>[])}]{[<<>()>([]<>)]<<[][]>{[]<>}>})<<[{{}[]}(<><>)]<[()<>] +([({(([[[([[((<>{}){{}{}}]{[()<>]((){})}]((({})(<>[])){[{}{}]<<>()>})]{({(())[<>{}]}((<>{}) +{<[<{(<[{<[{(<{}()>)[<<>[]>(()<>)]}([{()[]}<{}<>>])}(({<[]{}><{}{}>}([[]<>]{{}()})){[[{}<>] +<<({[[<<[([(<[<><>]{<>{}}>{<(){}>(()())})<{[<>{}]<()[]>}>]<{[{<>{}}<<>()>]<{{}()}[()<>]>}<[[{}<>][{ From 295309a0f7126c92016ef601b005b5cb6de54250 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 10 Dec 2021 13:24:20 +0100 Subject: [PATCH 206/479] 2021: d10: ex1: add solution --- 2021/d10/ex1/ex1.py | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100755 2021/d10/ex1/ex1.py diff --git a/2021/d10/ex1/ex1.py b/2021/d10/ex1/ex1.py new file mode 100755 index 0000000..6770222 --- /dev/null +++ b/2021/d10/ex1/ex1.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +import sys +from typing import List, Optional, cast + + +def solve(input: List[str]) -> int: + def find_illegal_char(input: str) -> Optional[int]: + chunks: List[str] = [] + ends_to_start = { + ")": "(", + "]": "[", + "}": "{", + ">": "<", + } + + for i, c in enumerate(input): + # Is it a chunk beginning + if c not in ends_to_start: + chunks.append(c) + continue + # Is it matching the last element on the chunk stack + current = chunks.pop() + # If not, corruption has been found + if ends_to_start[c] != current: + return i + + return None + + score = { + ")": 3, + "]": 57, + "}": 1197, + ">": 25137, + } + + return sum( + score[line[cast(int, find_illegal_char(line))]] + for line in input + if find_illegal_char(line) is not None + ) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 85630222fc817a4472268a06db0afdef7e556269 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 10 Dec 2021 13:24:31 +0100 Subject: [PATCH 207/479] 2021: d10: ex2: add input --- 2021/d10/ex2/input | 110 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 2021/d10/ex2/input diff --git a/2021/d10/ex2/input b/2021/d10/ex2/input new file mode 100644 index 0000000..3a3d7bd --- /dev/null +++ b/2021/d10/ex2/input @@ -0,0 +1,110 @@ +<{[[({([{<[[([()<>]<<><>>)<[[]()]{<>()}>][<(()[])<()<>>>]]<(<(<><>)(())>)[<([]()){<><>}>{{()<>}<{}>}]>>[({ +<<({<{{{[(<{([{}{}]{{}[]}){({}())}}<<[[][]](()<>)>[{<><>}<{}<>>]>>(<[[()]([]{})]((()<>)[()() +({<<({[<[[<[([()])]<<<{}<>><()[]>>[[()<>]<[]()>]>>([((()[])[()])]{[[()()]<<><>>][{<>[]}(()<>)]}) +(([[<<[{(({{{(()<>)[()()]}[({}<>)[[][]]]}([{{}<>}<[]()}]{[[][]][()<>]})})(([({[]{}}{[][]}) +({{<[[<<{{[{[<{}{}>{[]{}}]<([]{}){()[]}>}]<{([<><>]([]<>)){({}())({}<>)}}[[<{}<>>([]{})][[()[]]]]>}}>>]] +[(<<<{([[[<{(<()<>>{<><>})(<[]<>>([][]))}[<[{}[]]>{<[]>(<><>)}]>([{{[]()}{[]()}}([<>[]][{}<> +<[{[{{([<(<{{[{}<>]({}{})}{{<>[]}(()())}}(<<<>{}>(<><>)>(<<>{}>[[]<>]))>)>[{[<[[()<>]{{}<> +{(<<[([<{<<<({()()}(<><>)}{((){})([]())}>>[<{<[]<>>{[]{}}}([()()])>]>}>]{{([{<{{[]<>}(<>)}<({}( +((<[{(({([<{(<[][]>)[<<>{}><()<>>]}<{<{}{}>}[{()[]}<{}[]>]>>])})<[{[{([{[]()}((){})][<<>()><()()>])>]}][[({{[ +[[{([[<<[({[<<[]{}>{[][]}>(<()<>>[{}()])][([{}[]}[<><>]){[{}()]}]}[<<<{}<>>{()<>}>(<{}()>([]()))>{[[<><>][ +{{{<[([[{<[<{([]{}>{<>()}}{<(){}><()()>}>[{[[][]](<>())}[{[]<>}[<>[]]]]]{<{{{}[]}{<><>}}[[()()](< +(([{(({[[[[{(<<>[]>((){})){<()<>><[]{}>}}{[{{}()}(()[])]((()){()<>})}]]]<[<<{(()[])<{}[]>}{ +{<<([(<([{{(<(()<>)[[][]]>{[[]{}]{(){}}})[{<(){}>[[]<>]}]}}])[[[([[{()()}{<>[]}]{[()]{[][]}}]<[(( +[{<<{<([(<[<{<{}[]>{{}[]}}(([]()))>{([(){}]<()[]>)(<[][]>{[]<>})}]>[{<<{<>()}[{}[]]>{(<><>)}>{[<[]<>>{()[]}]< +<{{<{[[{{([({<()>{(){}}}((<>[])(<><>)))[(<[]<>>[()[]])<<()()>{<>{}}>]])<[{[{[]<>}{()()}][[{}{}]<[]>]}<{{{ +[(<[{([{({<<[<<>()>[[]()]]{<<>{}><{}<>>}><{<()()>{{}{}}}(({}<>)<()<>>)>>})({(([<{}<>>{[][] +{(([{[<{{[({{[{}<>][()]}<{{}<>}>}(({<>[]})))]{((<[<>{}][<>[])>[[<>()]{[][]}]))<<<({}<>){{}<>}>( +{[<{({((([[{[(<>{}){<>()}][([]{}}]}]{[<(()()){[]()}>((<>[])<(){}>)]}]){<(<<{{}<>}>>)([[{<><>}< +{<{[(<{<[({<<[<><>]{()()}>[{()<>}<{}>]>[[<[]>][{()[]}{()}]]}(<(({}()){<><>})<(()())[<>()]>>{ +<[({[[{<([[{<{{}}>(<<><>>{[]()}}}[{{<>{}}<()<>>}{[[][]]{[]<>}}]]<((([][])<<>{}>)<((){})[{}() +{{[{<[{<<{<<(<{}[]><(){}>)<{<>[]}[{}()]>>[{{[]<>}<()<>>}[{{}<>}(<>())]]><[(({}<>)({}<>))<<{}<>><< +{<<({(<[(<[[{{[][]}{{}}}<[[]()]<<>())>]](<{{{}<>}{()<>}}>)>)]<(({{[[[][]]]}<[[(){}]<[]{}>]>}))> +({{([<<{[(<<{{<>()}<[]()>}<{(){}}{{}{}}>><(<{}[]>{<>{}})<([]<>)([]())>>>)]}>>[[{<{[<<(<>{}) +<{({{({<<[{<<{<>}{{}[]}>>[[{[]<>}{()()}]<<[][]>(()())>]}]{<<{[(){}><<><>>}{{<>[]}(()<>)}>[<<(){}>[[] +<({<([[[([({<{(){}}([][])>}<[{[][]}{<>()}]<[(){}][{}<>]>>){<({{}()}{[]{}})>{[{[]{})[()[]]]<[ +{([({[(([<{((({}()){{}<>})(<()[]>{()()})){[({}{})<<>[]>]([{}][()])}}>]{<<[<[[][]]{[][]}>({[]{}}<{}()>) +<<{[<({[(<[({<{}{}><()()>})]{<<[<><>]>>}>){{[((<<><>><{}[]>)){<{[]()}(<>())>}]{{{({}<>){[]<>}}{{ +<<({<[{(([{({({}())(<>{})}{((){})})[<[[][]]([][])>]}<<[[<>{}][[]<>]]<([]<>)[()()]>><<<{}[]>(()())>>]])[[[ +[{<({<(({([([{[]}]<{[]()}[()<>]>]{{(()())<{}()>}{{[]()}<()<>>}}][{(<[]<>>[<>{}])[<[]<>><<><>>]}<(<< +<{{((<<(<{({<{<>{}}[[]{}]>})[[{{[][]}{{}<>}}]]}[(([(()[])<()<>>]((<>[])<<>{}>))<[[<>()][<> +{[([<<<({[{<<[<>{}]<[]<>>>>({<<>{}>((){})}<{[][]}{[]{}}>)}<{(([]{})<<>>><{{}()}(<><>)>}<{<[] +<({[[{{{([(({[{}<>]{[]<>}}[{()<>}<(){}>])<[<{}()>[[]<>]]>)]{{[<{<>()}[{}()]><<<><>>{[][]}>]([[[][]](<>()) +[<<{{<[[{[<(<{()[]}[(){}]><[()[]]<<>{}>>)>[[[[[]{}]{[][]}]{<[]{}><(){}>}]({{<>()}<<>{}>}({()<> +[<[[(<[[[[<<<{()<>}[[]()]>>{[[<>[]]{[]{}}]{[<>[]][[]<>]}}>]]({[({[<><>]<{}<>>}<<(){}>[{}()]>)[[<<> +<{{({<([{({({{{}()}((){})})([([][])[[]<>]](([])[{}<>]))}<(([()<>][()[]])[<[]><{}{}>])<{({}<>)<<>()>} +{<[[[([{[<<(({{}<>})(<{}()](<>{}))){[[<>[]]({}<>)]}><[((<>()){[][]})[({}())<{}<>>]]<({<>[]}{{}<> +{<[<[({<({(<(({}[])<{}>)((<>[])({}<>))><(([][])(()()))>)})({{({{<>())}<{<>()}([]{})>)[[(()<>)<<>[]>](<< +{(<(<<{{({{<{(<>[])[[]]}{(<>{})>>{<(()())[{}{}]>{{[]{}}{{}<>}}}}(<{[{}[]]<(){}>}[[{}{}]{()<>}]>([{<>{}}[<>]] +[{[{{[[[{([<(({}{})<[][]>)<([]{})<<>{}>>>[{[[]{}]([]<>)}{(()())[<>[]]}}]((<([]<>)[()<>]>(<{}()>)){<[<>[]]( +{<<<<{(({<<({(()())(<>{})}<([][])[[]()]>)[{{[]()}(<>)}]><{[<<>()>]{<[]()>[[]<>]}}>>}>[(<<<[{()<>}{{}<> +[{[(<[<{<[({[{[]<>}<[][]>]{{<>()}}}[({<>[]}{{}{}}){[[]<>](<><>)}])({({{}<>}<{}<>>)}<[((){})[{ +{<[[{[(((<({([[]<>](()<>))}[{{()<>}({}())}(<[]{}>{[]{}})])<<(({})[{}{}])[(<>{})<()>]>>>))<[{{<[{{}<>}[[][] +[[<<([{<{((([<{}{}>(<><>)][({}[])])[[(<>{}){{}<>}](<()[]>[[]()])])[{({()}{{}{}})(({}())([]{}))}({[{}[]]{ +<<((<[<(([<{[<{}<>>][<{}{}>{{}[]}]}[{<<>()>[[]{}]}{[()[]]([]{})}]><{({()()}{[]})<{[]()}[{}{}]>}{((<>( +({<<{[(({{<<{[[]()]{{}()}}{[<>{}]<[][]>}>{(([]())[<>[]]){<[]{}>{<><>}}}>{{{{<>[]}{{}()]}{{<>{}}[{}{} +{((<<{<<<((<(({}{})(()))[[()()]{{}<>}]>{(<()[]][{}[]])[[<>[]]<<>>]}))>([[{({()[]}{()[]})(<[][]><{}{}>)}[[[[][ +[(<<{<[(<([<(<[]()><()()>)>]{({[<><>]{[][]}})}}<[([(()())[{}]]<<(){}>[<><>]>)][<<((){})>>[[{<><>}[{}()]][([] +[<{[<[[(({{{[<{}[]><<>{}}][[{}<>]<<>()>]}{[{[]}[{}[]]]{[()[]]<{}<>>}}}[({<(){}>{{}{}}}<(()[])( +<{([{(<[<<<<[[{}{}]([])](<{}{}>[[][]])>{{(()[]){<>[]}}<[<><>][(){}]>}>(([[{}{}]{{}<>}](<()()>))<<(<>{})<< +[(<[[[[(({[<<<<>{}><<><>>>>]<{[{{}<>}<()>]{{[]{}}[<>[]]}}<<<()[]>([]<>)><(<>{}){[]()}>>>}))[[([{< +[([(({<{([<[({{}{}}<{}{}>)[[[]{}]({}<>)]]<[([]<>)({}[])]{(()[]){[]<>}}>>{[<{[]<>}>{[()[]]<()<>>}][<([ +{<[<[[<[{({{<[[]()][{}()]>({()[]}(()[]))}([[<>()]])})}{{<{{[<>]<[]()>}{<{}[]]}}<{{()[]}<[]<>>}([()()]<{}()>)> +[{{(<(([([((<{{}{}}({}())>{{<>[]}<[]{}>})([{<>()}{{}<>}]{<()<>>[{}{}]})>]{{[<(<>){[]{}}>{<<>[]>[()[]]}] +[<<(({[[({({[{[]{}}<<>[]]]{[()()]<<>()>}}{[{<>[]}<()>]}){{<<()[]>{[]{}}><<<>>[[]()]>}}})<[{{[< +<([{{{(<{{{<<({}()){(){})>{<{}{}>{<>()}}>{(<()[]>({}()))<({}())<()()>>}}[(({[]{}}[<>{}])([{}<>])){{{{}}(< +<<{[{[[<([[<(<{}<>><()[]>)<{<>()>[<>()]>>]][{{{{()<>}<{}[]>}[<[]()>[()[]]]}<{[{}](<>{})}>}[<[[<><>]< +[{[([{<<[([[{<<>[]>(<>())}((()())({}{}))>{[({}())<<>()>]<(<><>){()<>}>}]({([(){}]<[]<>>){<[ +[{<<[[<((({[<[[]()]>(<<>>(<>{}))]<<([]<>)[<>{}]>{<[][]>(<>())}>}(([{{}<>}{{}[]}]{[()[]]{{}{}}})< +([<<{[([[<{<{({}())}{(()<>)}>[<[{}<>][[]()]><[<>{}]({}[])>]}<[([<>()]){[()<>]([]{})}][[[{}[]]][ +<{[[{({<{(<[[(()[])<<>[]>]<<<>()>{[]<>}>]>{[<(<>()){<>[]}>(([][]))]([<[]<>><{}{}>]([<>{}](()() +{[([{{(([[<{<[{}<>]([]{})>[((){})<()[]>]}[[{{}<>}<[][]>]<{[]<>}([]())>]>{<{{{}<>}{(){}}]{{[] +[{{<[([<{[[({[{}[]][(){}]}<{<>()}<[]{}>>)]<<({()<>}[[]()]){[<>[]]<()()>}>>]{[<<(<>[])<[]<>> +<[{<[<((<({[{[{}[])(<>{})}(({}[])[<>])]})>[[([{((){})<<>>}])[<((()<>)[{}{}])[[(){}]]>{<<{}()>{ +({[[[[[[[<((<[<><>][()[]]><(<><>)>))>{{<(<<>[]>{{}})[[[]<>]({}())]><{{()<>>[[]<>]}[<{}{}>{<>{}}]>}[{<(< +([([(<[{<[[{<{<>[]}>{{{}()]<{}()>}}<([{}()]{{}<>})[([][]){{}<>}]>]{<{{[]{}}{{}<>}}<[[]()]>>[[{()[]}{(){}}]{[ +{<{([([{<<<<{[<>()]<[]>}[[()<>]<()>]>>(([[<>[]][{}{}]])((([][]){<><>})([[]{}]<()<>})))><{<<[()()]<[]()> +[{({[{[(([([{{{}<>}{()<>}}(([]<>){{}{}})][<{()}{{}{}}>(<<>()>[<>()])])]))<<<({((<>()){[]{}})[{ +([([(<(({<(<<<{}[]>){{<><>}[[]{}]}>[{{[][]}<<><>>}])<{<<[]>(()[])>[[{}()]<[]<>>]}{({[]()}[<><>]){{{}[]}[{ +{{[{<{((<((<<<(){}>>{([]{})[[]()]}>([({}{})]{<()>{[]{}}}))[[(<<><>>)]<<<{}{}><(){}>>[({}[])({} +<{[({{<<((([[[(){}][{}<>]]<(<>[])<[]()>>]<[[{}()]({}())]>)({<[(){}]>{(<><>){[]{}}}})){{{<<[]()>[()<>]>[< +(<[[(<((<[[<{[[]()][()<>]}<[[][]]<[][]>>>((({}())((){}))(<{}<>]{()()}))]]>[[{<{[{}<>]}>([[{}<>](() +<<<{<(<[<{[[([<>()][()<>])(<<>()>[{}()])][<{<>()}>]]}<<<({<>[]}([]{}))<<(){}>>>[[({}())(())]]>{({({}[ +([<<<{<{({<[{(()<>)<()()>}]<[({}<>)]>>{[[{<>{}}(()[])](<<>>[[]<>])]}}{<<{<<>()>}><{{<>()}<<><>>}{<(){}>[(){ +{{(<<[{{({({({[]()}<{}()>)(([][])[()<>])}<{(<>())[()<>]}>)[[(([]<>)[[]<>])]]}[({[({}()){{}>]}) +<((((<{{{{{[{[(){}]([][])}[{<>{}}([]<>)]]([((){})]<[[][]][<><>]>)}}<(<{(()<>)([]{})}><([()<>]{<>() +<{<{<(<(<<<(<[[][]]<<>()>><[<>[]][[]]>)[<[<>{}][<>()]>]>{<{(()){{}()}}[<{}<>><<><>>]>[{<{}[]><<><>>}]}>{( +{[{<<(<([({{<<[]<>>[<>{}]>{<{}<>>([]<>)}}([<<>{}>((){})}<{<>[]}>)}<<({{}()})<(<>[])[[]]>>[[<<>[]>{()[]}][[[] +<<<<[<{<[{{(<[<>]<[]{}>><(<>{}){{}()}>)[[{<>{}}{{}[]}](<[]>[<>{}])]}{{[{{}[]}(()<>)]<([]())( +[([({[[{<{{<<{()()}<{}{}>>({{}{}}[{}{}]>>[{(<>{})<()()>}[[<>[]]<{}()>]]}[<<{<><>}(()[])>(<{}[]> +[<<[[(({<[[([(<>[]){()[]}][(<><>)[<>[]]])]<({<{}{}>(()[])}[<{}<>>({}())])((({}{})<{}[]>)[{{}<>}{{}{}}]) +(({({[<<[<[([<<><>){[]{}}][<()<>><[]<>>])({[{}<>]<[]<>>}<({}{})[{}[]]>)][{((<><>)(()[]))}[<<{}()>{<> +<((<[(<(<[[([{(){}}<<>()>]({(){}}{(){}}))]][{{[{[][]]{<>{}}]{[{}<>]([]{})}}}[<{[[]{}][<>()]}[(()[])< +{((<<{({<[([(([]())([]()))(<[][]>{()})])<<[<<>[]>[<>())](<()<>><()()>)>>]>{{[{<[<>{}]<[]<>>>}<{{<><>}< +{<<<<[((<{({<{<>[]}{<>()}><{<><>){<>()}>}([[[]()][(){}]]<<()<>>{<><>}>)){[{{<>[]}{[]()}}{(<>()) +({<<<<[{<{<{(<{}{}><()[]>)[{<>{}}]}>(<[([]{}){<><>}]{<<><>>[()[]]}}<[{()[]}{()[]}][{{}[]}{[][]}]>)}>}] +({({{<{{{[<{{(<><>)}({[]()}{<><>})}{<[{}[]]<[]<>>>[(<>[]){()()}]}><[[<<>()><[][]>]]>]<<[{[[]()]( +<{[<([<[({([{(<>{}){()}}<([]<>)[{}{}]>)[[<()[]><{}<>>][(<>{})[()()]]]){<{({}){{}{}}}<{<>()}[[ +{((({[{<{[<({[{}()]({}{})}<(<>)(()())>)({[[]{}](<><>)}[<<>[]>[<>[]]])><<[{[]<>}][([][])<[]()>]>( +({[((([<[(<{[(<>[])(()[])]}<[([][])([]<>)]<(()())>>>((([(){}])<(<>())<<><>>>)<[[()<>>{{}{} +[{{((<{[(<{[{{[][]}{<><>}}[[()[]]<[][]>]]<<({}[])((){})>>}>[(<([[]()]<{}[]>)([{}<>])>({<<>[]>(<>[])}[( +((<((<[<(<[{(<[]()>[()[]])((())(()[]))}{[[{}<>]([]{})]<[[]()]>}]>)><([<[<{[]<>}<{}[]>>[[(){}]]]({[[][]]{ +[(([([(([<<(<{<>}{[][]}>)[{[()<>]{{}{}}}({{}{}}<[]()>)]>>{([({<><>}<[]>){<{}{}>[()<>]}]<<[[]{}]{{ +[(<{<[[{[<<{<[[]<>]<[]()>>{{[]<>}}}><[[{{}()}([]<>)]][({{}<>}{{}{}})<[[][]](()())>]>><<({([]{})<<>{}>}){ +<{[<[(<<[[[[{<{}[]><[]<>>](<{}[]>{()[]})](<[<>()][[][]]>([()()]<<>()>))]]({([<()[]>[{}()]])<{[[]()]}{<[][ +<{{{([[([{{{<({}[])>}}<<({<>{}}{{}()))<({}{}){[]{}}>>[[(<>())[{}[]]]<<[]{}>{<>[]}>]>}([{[<< +[{<(({{<[{[[([<>{}]{<>{}})(((){})[{}[]])][{<{}<>>}[([]{})<{}>]]]}{<<([<>{}][()[]})[{{}}<{}()>]>( +[((<[{<<[<[{[{{}()}[{}[]]]<[<>[]][{}<>]>}]>]{[([([[]<>]{{}[]})[<(){}>[()[]]]]<<({}[])<[]()>>[( +[{([<{([(({(<[[]<>]>{({}()){<><>}})([([]())[[]<>]])}(<[({}())(<>())]<{()<>}[[]<>]>>)){{([[<><>][()[]>](<[][]> +<<(<<<{{{<<(<<[]<>>{<>()}>[<[]>])<{<{}<>>}{[{}{}]<<>[]>}>><{<<<>{}>({}<>)>}{([()[]]<<>()>)(<<><>><[]{}>)}>>< +{[<<[{{(<<[((({}{})[{}{}])(({}<>)[{}()]))]>{([[[(){}]<{}<>>][[{}[]]{()[]}]](<{[]{}}(<>[]>>))}>)}[(< +<{{[[<[[[(((({<><>}{{}{}})<[<>()]([]())>)[<{{}<>}>{((){})[[][]]}]))<{<{[[]()]<[][]>}{<[]<>>(<> +{<[<<([[[[{{<({}<>)<{}()>>[(<>())({}[])]}<{([][])({}<>)}>}(({[<>{}]{[]{}}}<(<>{})>)[<{[][]}{[][]}>{({}()){ +[[({{[(((({<{{<><>]}{(<><>){<><>}}>(<[()<>]<{}{}>>((<><>){<>[]}))}{<[[{}[]]([][])][{{}[]}[ +[{{<([((<<{(((<><>)<(){}>))((({}[]){<>()})(<{}()}({}{})))}><[<<{<>[]}[()<>]>{[<>{}]{[]()}}>{{ +[<{<{{({{<<<{[<><>]<[][]>}<<(){}>(<>)>>>([<{[]()}{{}[]}>{<{}()><[]<>>}]([([]())[[]]]([[]()]<<>{}>)))> +<[{<[(<{{([[<[{}{}]><([]<>)(()())>][<((){})[[]()]>[([]<>){<><>}]]]{<{<[]<>><<>>}{<{}<>><[]{} +{[((((((({([([(){}]([]<>)){[{}](<>[])}]{[<<>()>([]<>)]<<[][]>{[]<>}>})<<[{{}[]}(<><>)]<[()<>] +([({(([[[([[((<>{}){{}{}}]{[()<>]((){})}]((({})(<>[])){[{}{}]<<>()>})]{({(())[<>{}]}((<>{}) +{<[<{(<[{<[{(<{}()>)[<<>[]>(()<>)]}([{()[]}<{}<>>])}(({<[]{}><{}{}>}([[]<>]{{}()})){[[{}<>] +<<({[[<<[([(<[<><>]{<>{}}>{<(){}>(()())})<{[<>{}]<()[]>}>]<{[{<>{}}<<>()>]<{{}()}[()<>]>}<[[{}<>][{ From bf6881bacb3d8521f10e4e0589a68d2025dd0d56 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 10 Dec 2021 13:24:45 +0100 Subject: [PATCH 208/479] 2021: d10: ex2: add solution --- 2021/d10/ex2/ex2.py | 81 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 2021/d10/ex2/ex2.py diff --git a/2021/d10/ex2/ex2.py b/2021/d10/ex2/ex2.py new file mode 100755 index 0000000..d100b0f --- /dev/null +++ b/2021/d10/ex2/ex2.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python + +import sys +from typing import Iterator, List, Optional + + +def solve(input: List[str]) -> int: + def find_illegal_char(input: str) -> Optional[int]: + chunks: List[str] = [] + ends_to_start = { + ")": "(", + "]": "[", + "}": "{", + ">": "<", + } + + for i, c in enumerate(input): + # Is it a chunk beginning + if c not in ends_to_start: + chunks.append(c) + continue + # Is it matching the last element on the chunk stack + current = chunks.pop() + # If not, corruption has been found + if ends_to_start[c] != current: + return i + + return None + + def complete_line(input: str) -> str: + chunks: List[str] = [] + start_to_end = { + "(": ")", + "[": "]", + "{": "}", + "<": ">", + } + + for c in input: + # Is it a chunk beginning + if c in start_to_end: + chunks.append(c) + continue + # Otherwise we must match the last open chunk + assert start_to_end[chunks.pop()] == c # Sanity check + + return "".join(reversed(list(start_to_end[c] for c in chunks))) + + def score_completion(completion: str) -> int: + char_score = { + ")": 1, + "]": 2, + "}": 3, + ">": 4, + } + + score = 0 + + for c in completion: + score *= 5 + score += char_score[c] + + return score + + def score_completions(completions: Iterator[str]) -> int: + scores = sorted(map(score_completion, completions)) + return scores[len(scores) // 2] + + incomplete_lines = filter(lambda line: find_illegal_char(line) is None, input) + completions = map(complete_line, incomplete_lines) + + return score_completions(completions) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 60f8aca9dd17af65da54df0cb4f0610799d330fd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 11 Dec 2021 14:11:35 +0100 Subject: [PATCH 209/479] 2021: d11: ex1: add input --- 2021/d11/ex1/input | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 2021/d11/ex1/input diff --git a/2021/d11/ex1/input b/2021/d11/ex1/input new file mode 100644 index 0000000..ea9c78d --- /dev/null +++ b/2021/d11/ex1/input @@ -0,0 +1,10 @@ +4341347643 +5477728451 +2322733878 +5453762556 +2718123421 +4237886115 +5631617114 +2217667227 +4236581255 +4482627641 From c2cb30c7df44d4a5c926386a718ea8b6d1ef8c13 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 11 Dec 2021 14:11:59 +0100 Subject: [PATCH 210/479] 2021: d11: ex1: add solution --- 2021/d11/ex1/ex1.py | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 2021/d11/ex1/ex1.py diff --git a/2021/d11/ex1/ex1.py b/2021/d11/ex1/ex1.py new file mode 100755 index 0000000..d84d69e --- /dev/null +++ b/2021/d11/ex1/ex1.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import Iterator, List, Set, Tuple + +Grid = List[List[int]] +Point = Tuple[int, int] + + +def solve(input: List[str]) -> int: + levels = [[int(c) for c in line] for line in input] + + def step(levels: Grid) -> Tuple[Grid, int]: + # First step, increase levels + levels = [[l + 1 for l in line] for line in levels] + + def excited(levels: Grid) -> Set[Point]: + return set( + (i, j) + for i in range(len(levels)) + for j in range(len(levels[i])) + if levels[i][j] > 9 + ) + + def neighbours_of(point: Point) -> Iterator[Point]: + for dx, dy in itertools.product((-1, 0, 1), repeat=2): + if dx == 0 and dy == 0: + continue + x = point[0] + dx + y = point[1] + dy + if x < 0 or x >= len(levels): + continue + if y < 0 or y >= len(levels[x]): + continue + yield x, y + + # Second step, do flashes + has_flashed: Set[Point] = set() + while len(flashes := (excited(levels) - has_flashed)) > 0: + for (i, j) in flashes: + has_flashed.add((i, j)) + for x, y in neighbours_of((i, j)): + levels[x][y] += 1 + + # Finally, bring back energy levels to 0 + for i, j in has_flashed: + levels[i][j] = 0 + + return levels, len(has_flashed) + + res = 0 + for __ in range(100): + levels, flashes = step(levels) + res += flashes + return res + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 4e7552b34e276c2b856d53d5ec454ecee669dbbf Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 11 Dec 2021 14:12:08 +0100 Subject: [PATCH 211/479] 2021: d11: ex2: add input --- 2021/d11/ex2/input | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 2021/d11/ex2/input diff --git a/2021/d11/ex2/input b/2021/d11/ex2/input new file mode 100644 index 0000000..ea9c78d --- /dev/null +++ b/2021/d11/ex2/input @@ -0,0 +1,10 @@ +4341347643 +5477728451 +2322733878 +5453762556 +2718123421 +4237886115 +5631617114 +2217667227 +4236581255 +4482627641 From 00e984420cbd46c464d5fac7b7a7f87a15afe429 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 11 Dec 2021 14:12:19 +0100 Subject: [PATCH 212/479] 2021: d11: ex2: add solution --- 2021/d11/ex2/ex2.py | 66 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100755 2021/d11/ex2/ex2.py diff --git a/2021/d11/ex2/ex2.py b/2021/d11/ex2/ex2.py new file mode 100755 index 0000000..39e5092 --- /dev/null +++ b/2021/d11/ex2/ex2.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import Iterator, List, Set, Tuple + +Grid = List[List[int]] +Point = Tuple[int, int] + + +def solve(input: List[str]) -> int: + levels = [[int(c) for c in line] for line in input] + + def step(levels: Grid) -> Tuple[Grid, int]: + # First step, increase levels + levels = [[l + 1 for l in line] for line in levels] + + def excited(levels: Grid) -> Set[Point]: + return set( + (i, j) + for i in range(len(levels)) + for j in range(len(levels[i])) + if levels[i][j] > 9 + ) + + def neighbours_of(point: Point) -> Iterator[Point]: + for dx, dy in itertools.product((-1, 0, 1), repeat=2): + if dx == 0 and dy == 0: + continue + x = point[0] + dx + y = point[1] + dy + if x < 0 or x >= len(levels): + continue + if y < 0 or y >= len(levels[x]): + continue + yield x, y + + # Second step, do flashes + has_flashed: Set[Point] = set() + while len(flashes := (excited(levels) - has_flashed)) > 0: + for (i, j) in flashes: + has_flashed.add((i, j)) + for x, y in neighbours_of((i, j)): + levels[x][y] += 1 + + # Finally, bring back energy levels to 0 + for i, j in has_flashed: + levels[i][j] = 0 + + return levels, len(has_flashed) + + for i in itertools.count(1): + levels, flashes = step(levels) + if flashes == len(list(itertools.chain.from_iterable(levels))): + return i + + assert False # Sanity check + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 53489b62d6c0f40599ee28b3f47b4505e553f992 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 12 Dec 2021 15:12:36 +0100 Subject: [PATCH 213/479] 2021: d12: ex1: add input --- 2021/d12/ex1/input | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 2021/d12/ex1/input diff --git a/2021/d12/ex1/input b/2021/d12/ex1/input new file mode 100644 index 0000000..c2b0b8d --- /dev/null +++ b/2021/d12/ex1/input @@ -0,0 +1,22 @@ +ax-end +xq-GF +end-xq +im-wg +ax-ie +start-ws +ie-ws +CV-start +ng-wg +ng-ie +GF-ng +ng-av +CV-end +ie-GF +CV-ie +im-xq +start-GF +GF-ws +wg-LY +CV-ws +im-CV +CV-wg From d4907958acecab2765201bda0d515aaa33903706 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 12 Dec 2021 15:13:10 +0100 Subject: [PATCH 214/479] 2021: d12: ex1: add solution --- 2021/d12/ex1/ex1.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100755 2021/d12/ex1/ex1.py diff --git a/2021/d12/ex1/ex1.py b/2021/d12/ex1/ex1.py new file mode 100755 index 0000000..4e731a0 --- /dev/null +++ b/2021/d12/ex1/ex1.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +import sys +from collections import defaultdict +from typing import Dict, List, Set + +Map = Dict[str, Set[str]] + + +def solve(input: List[str]) -> int: + def parse() -> Map: + res: Map = defaultdict(set) + + for (start, to) in map(lambda s: s.split("-"), input): + res[start].add(to) + res[to].add(start) + + return res + + caves = parse() + + def dfs(start: str, seen: Set[str] = set()) -> int: + if start == "end": + return 1 + + seen = seen | {start} + res = 0 + + for dest in caves[start]: + if dest in seen and dest.islower(): + continue + res += dfs(dest, seen) + + return res + + return dfs("start") + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From bf519c8eab90f54708ab4cec8f898261676be6d6 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 12 Dec 2021 15:13:21 +0100 Subject: [PATCH 215/479] 2021: d12: ex2: add input --- 2021/d12/ex2/input | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 2021/d12/ex2/input diff --git a/2021/d12/ex2/input b/2021/d12/ex2/input new file mode 100644 index 0000000..c2b0b8d --- /dev/null +++ b/2021/d12/ex2/input @@ -0,0 +1,22 @@ +ax-end +xq-GF +end-xq +im-wg +ax-ie +start-ws +ie-ws +CV-start +ng-wg +ng-ie +GF-ng +ng-av +CV-end +ie-GF +CV-ie +im-xq +start-GF +GF-ws +wg-LY +CV-ws +im-CV +CV-wg From 9f4688d8c0cc18449f4b531802090cf42195643d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 12 Dec 2021 15:13:41 +0100 Subject: [PATCH 216/479] 2021: d12: ex2: add solution --- 2021/d12/ex2/ex2.py | 48 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100755 2021/d12/ex2/ex2.py diff --git a/2021/d12/ex2/ex2.py b/2021/d12/ex2/ex2.py new file mode 100755 index 0000000..86a2c10 --- /dev/null +++ b/2021/d12/ex2/ex2.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +import sys +from collections import defaultdict +from typing import Dict, List, Set + +Map = Dict[str, Set[str]] + + +def solve(input: List[str]) -> int: + def parse() -> Map: + res: Map = defaultdict(set) + + for (start, to) in map(lambda s: s.split("-"), input): + res[start].add(to) + res[to].add(start) + + return res + + caves = parse() + + def dfs(start: str, seen: Set[str] = set(), has_doubled_back: bool = False) -> int: + if start == "end": + return 1 + + seen = seen | {start} + res = 0 + + for dest in caves[start]: + doubles_back = False + if dest in seen and dest.islower(): + if has_doubled_back or dest == "start": + continue + doubles_back = True + res += dfs(dest, seen, has_doubled_back or doubles_back) + + return res + + return dfs("start") + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From f314b9d753c82a92b3293f08da571f763d224825 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 13 Dec 2021 12:45:05 +0100 Subject: [PATCH 217/479] 2021: d13: ex1: add input --- 2021/d13/ex1/input | 890 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 890 insertions(+) create mode 100644 2021/d13/ex1/input diff --git a/2021/d13/ex1/input b/2021/d13/ex1/input new file mode 100644 index 0000000..d11c2b7 --- /dev/null +++ b/2021/d13/ex1/input @@ -0,0 +1,890 @@ +1159,502 +291,184 +850,631 +460,631 +301,707 +768,56 +654,829 +582,466 +490,276 +261,3 +793,35 +559,453 +497,288 +594,275 +458,264 +1044,387 +654,842 +925,22 +688,72 +224,833 +1228,2 +1034,487 +420,830 +172,717 +1049,198 +669,305 +1168,49 +157,304 +90,669 +1036,1 +118,549 +1084,593 +268,61 +909,294 +467,74 +1114,632 +1066,609 +1058,602 +271,35 +474,299 +1173,35 +75,864 +470,543 +176,100 +485,736 +199,332 +23,634 +654,329 +748,526 +274,395 +378,474 +910,673 +1012,810 +383,859 +1163,5 +353,291 +741,383 +631,241 +179,436 +793,75 +495,324 +321,169 +1087,278 +1302,361 +1232,572 +417,317 +960,161 +1088,642 +1161,613 +631,653 +94,327 +244,733 +857,549 +572,220 +75,337 +259,5 +1235,192 +805,393 +126,68 +1250,723 +580,68 +397,441 +1297,165 +700,82 +1200,275 +214,56 +932,711 +676,126 +676,320 +169,388 +1049,3 +25,319 +1218,215 +179,217 +681,635 +512,574 +966,371 +1124,282 +387,444 +930,644 +179,781 +192,247 +1061,290 +500,557 +378,54 +855,159 +585,891 +358,295 +545,234 +1287,429 +425,648 +416,579 +1255,99 +59,290 +768,585 +1126,733 +253,600 +1235,332 +852,184 +223,357 +1143,585 +1096,36 +1125,194 +95,677 +885,768 +870,820 +165,527 +1201,660 +465,291 +387,702 +1041,872 +502,316 +358,814 +435,747 +1217,439 +177,113 +505,781 +850,746 +343,38 +499,530 +85,789 +1285,563 +321,541 +45,15 +1295,669 +1285,393 +363,262 +271,347 +646,809 +1143,794 +505,753 +224,201 +50,420 +2,297 +507,312 +823,100 +222,252 +1007,241 +1116,157 +274,499 +505,617 +1036,137 +987,623 +22,105 +30,239 +244,609 +835,333 +1019,184 +572,443 +134,613 +348,263 +927,35 +500,625 +421,807 +763,595 +277,838 +856,54 +1310,52 +855,287 +166,628 +1155,684 +609,327 +445,892 +1116,640 +159,346 +1116,478 +1116,849 +982,565 +1232,754 +1163,337 +0,136 +422,455 +1049,451 +857,345 +59,640 +688,822 +507,582 +351,485 +294,744 +1218,383 +751,665 +969,761 +50,165 +1253,358 +393,59 +629,331 +550,842 +30,80 +505,113 +731,30 +641,761 +513,780 +221,543 +1131,561 +1072,315 +252,602 +87,556 +1148,282 +902,61 +276,308 +35,250 +1057,600 +403,785 +113,502 +805,501 +0,86 +1028,364 +428,301 +1305,353 +616,645 +199,607 +744,68 +350,385 +412,530 +574,554 +713,806 +1193,327 +923,514 +952,743 +542,586 +890,830 +378,26 +0,394 +214,523 +335,210 +75,30 +845,282 +395,357 +1285,187 +597,806 +160,154 +589,760 +52,843 +654,117 +711,170 +137,78 +1130,595 +959,37 +1220,690 +797,252 +923,444 +1285,259 +55,99 +980,638 +641,305 +781,549 +1126,768 +184,161 +915,477 +731,702 +888,868 +537,194 +738,219 +1288,777 +982,285 +1087,357 +595,254 +1288,161 +266,21 +1310,136 +1144,745 +1111,562 +671,893 +1198,756 +1176,389 +1123,372 +748,831 +1168,400 +810,886 +805,141 +705,614 +269,760 +417,126 +1044,313 +1228,226 +1158,204 +288,645 +870,504 +266,313 +1253,470 +954,84 +134,806 +420,694 +348,711 +957,623 +1285,271 +1007,485 +428,593 +494,493 +1051,5 +274,698 +852,150 +1216,327 +559,477 +522,625 +691,644 +261,787 +823,346 +773,775 +907,254 +1288,789 +728,466 +559,665 +664,809 +833,656 +258,679 +422,474 +877,95 +1253,246 +822,709 +224,542 +154,456 +502,302 +171,231 +1253,872 +1260,824 +256,176 +372,364 +358,743 +1056,225 +1049,787 +1168,285 +679,465 +157,590 +214,820 +1051,89 +652,358 +192,80 +888,474 +679,241 +430,201 +681,53 +572,668 +626,501 +724,663 +78,98 +639,229 +591,495 +798,721 +494,857 +437,10 +1131,312 +1028,194 +72,428 +1014,151 +229,117 +1086,835 +923,892 +515,485 +485,288 +366,249 +1088,252 +745,390 +266,425 +880,649 +952,814 +656,329 +865,78 +440,504 +397,889 +706,294 +1096,56 +177,672 +900,285 +154,785 +803,582 +1126,126 +174,466 +438,171 +658,760 +57,694 +962,183 +440,820 +57,134 +1138,774 +430,733 +107,756 +1149,600 +1242,889 +997,57 +1156,886 +331,497 +947,856 +671,445 +658,358 +1118,169 +1156,456 +276,488 +873,884 +267,10 +880,61 +805,589 +944,249 +412,812 +326,394 +1265,816 +460,74 +562,526 +377,56 +552,61 +291,698 +822,194 +959,241 +656,758 +1071,332 +22,341 +565,504 +1052,679 +1091,299 +1217,639 +852,296 +1268,394 +738,883 +1238,225 +938,194 +811,124 +1039,347 +507,648 +460,737 +1019,849 +177,841 +798,270 +319,684 +915,865 +117,226 +1006,509 +274,163 +561,535 +497,606 +585,3 +185,52 +30,814 +348,183 +221,799 +395,477 +749,887 +957,603 +1014,631 +1310,842 +723,473 +214,717 +1290,768 +50,40 +1087,2 +797,556 +425,768 +1163,785 +387,514 +1302,809 +813,606 +649,786 +189,719 +343,843 +947,262 +992,439 +93,639 +261,451 +13,133 +932,837 +1153,590 +582,109 +1053,565 +922,581 +634,320 +311,856 +1176,281 +1265,368 +460,605 +1084,301 +1144,73 +341,837 +706,729 +303,485 +445,450 +960,385 +353,603 +1151,122 +160,37 +564,690 +798,574 +1049,891 +885,563 +363,710 +879,537 +840,49 +751,229 +1285,779 +868,562 +353,623 +1059,109 +269,134 +257,329 +788,711 +462,590 +74,490 +706,600 +602,753 +229,246 +602,312 +1144,628 +646,231 +1288,105 +566,826 +619,625 +440,717 +536,549 +1275,250 +477,501 +1168,721 +907,108 +708,507 +1039,547 +13,729 +93,455 +1118,647 +1161,165 +74,378 +417,518 +142,721 +967,843 +1307,436 +947,710 +699,773 +1280,814 +425,200 +1260,138 +110,395 +356,84 +1310,381 +1146,86 +522,631 +110,499 +5,353 +629,563 +1242,679 +840,319 +276,756 +134,358 +1287,689 +152,690 +1260,698 +217,682 +1034,57 +440,522 +201,773 +1193,567 +870,729 +1253,424 +301,719 +8,533 +738,443 +706,165 +475,458 +256,718 +298,875 +999,856 +894,740 +105,246 +420,679 +668,810 +1073,765 +301,603 +853,756 +763,138 +991,796 +954,19 +400,428 +1144,266 +323,497 +938,364 +708,312 +462,395 +870,74 +52,644 +982,665 +1066,40 +433,95 +421,535 +1230,788 +997,110 +1019,698 +161,600 +1094,420 +559,417 +923,702 +1022,645 +166,821 +505,841 +162,282 +773,119 +90,690 +977,786 +586,231 +223,892 +457,756 +1232,322 +512,721 +137,443 +1201,234 +979,49 +1258,283 +97,246 +422,868 +1009,187 +889,87 +251,416 +1202,492 +1302,533 +763,756 +597,424 +311,221 +313,589 +1253,134 +810,557 +1235,30 +356,19 +982,829 +1145,527 +132,30 +885,648 +654,381 +654,65 +234,816 +458,710 +1111,332 +1019,710 +331,49 +561,7 +440,281 +360,150 +261,198 +440,165 +412,59 +1131,582 +78,754 +1009,164 +587,501 +1029,773 +746,690 +50,600 +1260,756 +117,327 +257,441 +582,557 +89,481 +400,669 +216,249 +701,190 +50,196 +1302,737 +933,838 +421,87 +82,674 +80,554 +951,30 +1089,799 +1163,458 +562,816 +1141,836 +65,507 +110,691 +162,612 +189,368 +490,170 +634,520 +179,582 +656,198 +160,857 +1041,760 +549,205 +994,712 +1236,516 +1280,239 +201,121 +706,586 +1131,436 +629,501 +237,70 +1285,331 +898,82 +1230,554 +350,161 +59,254 +945,194 +1071,780 +1034,308 +878,833 +1220,669 +1049,835 +1043,10 +142,46 +403,109 +599,547 +403,640 +872,723 +351,37 +562,511 +1131,113 +462,695 +1252,315 +179,333 +842,282 +460,254 +887,665 +184,768 +529,549 +269,872 +1096,717 +117,345 +1089,95 +159,122 +475,436 +803,246 +597,312 +605,614 +751,417 +542,56 +751,453 +1015,702 +713,760 +822,681 +595,640 +895,108 +1056,18 +1220,231 +1150,717 +1173,443 +269,470 +147,5 +214,726 +667,0 +1243,537 +159,621 +349,170 +1305,338 +388,581 +611,773 +160,149 +1228,450 +550,700 +875,747 +305,668 +1173,3 +418,679 +102,833 +500,886 +1148,612 +923,436 +894,154 +813,288 +996,660 +922,469 +55,302 +902,891 +1168,718 +403,108 +490,808 +458,184 +857,247 +678,553 +662,887 +149,165 +1238,785 +805,672 +520,389 +1202,402 +1101,700 +870,372 +1193,119 +788,631 +734,572 +793,371 +661,556 +1168,848 +224,352 +505,277 +562,368 +11,0 +888,455 +1131,781 +865,892 +1006,52 +298,19 +714,385 +209,700 +803,436 +7,679 +579,702 +522,263 +1150,269 +1252,586 +160,73 +1238,428 +103,380 +1278,374 +808,578 +169,288 +495,845 +668,84 +137,451 +338,182 +850,737 +587,393 +721,555 +1275,698 +741,105 +774,866 +803,648 +1039,35 +1253,200 +1303,679 +831,278 +843,633 +421,439 +78,572 +576,572 +852,710 +259,889 +416,740 +294,150 +184,817 +678,777 +994,182 +442,562 +393,3 +885,200 +669,761 +1150,149 +1034,474 +542,585 +189,67 +820,276 +65,339 +31,416 +209,567 +502,578 +1081,648 +445,78 +1118,247 +217,458 +336,455 +1126,817 +805,753 +331,677 +25,331 +336,439 +92,158 +960,733 +137,603 +174,428 +734,140 +460,157 +43,569 +58,586 +196,632 +313,784 +199,287 + +fold along x=655 +fold along y=447 +fold along x=327 +fold along y=223 +fold along x=163 +fold along y=111 +fold along x=81 +fold along y=55 +fold along x=40 +fold along y=27 +fold along y=13 +fold along y=6 From b9860d1f32cf2f86187b5091f9fc8c6d0bb2996a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 13 Dec 2021 14:25:44 +0100 Subject: [PATCH 218/479] 2021: d13: ex1: add solution --- 2021/d13/ex1/ex1.py | 71 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100755 2021/d13/ex1/ex1.py diff --git a/2021/d13/ex1/ex1.py b/2021/d13/ex1/ex1.py new file mode 100755 index 0000000..fb71b61 --- /dev/null +++ b/2021/d13/ex1/ex1.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python + +import itertools +import sys +from copy import deepcopy +from typing import Iterable, List, Tuple, cast + +Paper = List[List[bool]] +Instruction = Tuple[str, int] + + +def solve(input: List[str]) -> int: + def transpose(paper: Paper) -> Paper: + return cast(Paper, list(zip(*paper))) + + def fold_along_y(paper: Paper, y: int) -> Paper: + assert not any(paper[y]) # Sanity check + assert y >= len(paper) // 2 # Ensure that we can actually fold the paper + + paper = deepcopy(paper) + for i, j in zip(itertools.count(y, -1), range(y, len(paper))): + paper[i] = [(dot_i or dot_j) for dot_i, dot_j in zip(paper[i], paper[j])] + + paper = paper[:y] + return paper + + def fold_along_x(paper: Paper, x: int) -> Paper: + return transpose(fold_along_y(transpose(paper), x)) + + def do_folds(paper: Paper, instructions: Iterable[Instruction]) -> Paper: + for axis, n in instructions: + if axis == "x": + paper = fold_along_x(paper, n) + elif axis == "y": + paper = fold_along_y(paper, n) + else: + assert False # Sanity check + + return paper + + def parse() -> Tuple[Paper, List[Instruction]]: + paper_part = itertools.takewhile(lambda s: s != "", input) + fold_part = itertools.islice( + itertools.dropwhile(lambda s: s != "", input), 1, None + ) + + points = {(int(x), int(y)) for x, y in map(lambda s: s.split(","), paper_part)} + folds = [ + (axis[-1], int(n)) for axis, n in map(lambda s: s.split("="), fold_part) + ] + + width, height = max(p[0] for p in points), max(p[1] for p in points) + + paper = [ + [(x, y) in points for x in range(width + 1)] for y in range(height + 1) + ] + + return paper, folds + + paper, instructions = parse() + + return sum(itertools.chain.from_iterable(do_folds(paper, instructions[:1]))) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 07d150e7968274d283f11a89473aca19be1417a1 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 13 Dec 2021 14:25:57 +0100 Subject: [PATCH 219/479] 2021: d13: ex2: add input --- 2021/d13/ex2/input | 890 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 890 insertions(+) create mode 100644 2021/d13/ex2/input diff --git a/2021/d13/ex2/input b/2021/d13/ex2/input new file mode 100644 index 0000000..d11c2b7 --- /dev/null +++ b/2021/d13/ex2/input @@ -0,0 +1,890 @@ +1159,502 +291,184 +850,631 +460,631 +301,707 +768,56 +654,829 +582,466 +490,276 +261,3 +793,35 +559,453 +497,288 +594,275 +458,264 +1044,387 +654,842 +925,22 +688,72 +224,833 +1228,2 +1034,487 +420,830 +172,717 +1049,198 +669,305 +1168,49 +157,304 +90,669 +1036,1 +118,549 +1084,593 +268,61 +909,294 +467,74 +1114,632 +1066,609 +1058,602 +271,35 +474,299 +1173,35 +75,864 +470,543 +176,100 +485,736 +199,332 +23,634 +654,329 +748,526 +274,395 +378,474 +910,673 +1012,810 +383,859 +1163,5 +353,291 +741,383 +631,241 +179,436 +793,75 +495,324 +321,169 +1087,278 +1302,361 +1232,572 +417,317 +960,161 +1088,642 +1161,613 +631,653 +94,327 +244,733 +857,549 +572,220 +75,337 +259,5 +1235,192 +805,393 +126,68 +1250,723 +580,68 +397,441 +1297,165 +700,82 +1200,275 +214,56 +932,711 +676,126 +676,320 +169,388 +1049,3 +25,319 +1218,215 +179,217 +681,635 +512,574 +966,371 +1124,282 +387,444 +930,644 +179,781 +192,247 +1061,290 +500,557 +378,54 +855,159 +585,891 +358,295 +545,234 +1287,429 +425,648 +416,579 +1255,99 +59,290 +768,585 +1126,733 +253,600 +1235,332 +852,184 +223,357 +1143,585 +1096,36 +1125,194 +95,677 +885,768 +870,820 +165,527 +1201,660 +465,291 +387,702 +1041,872 +502,316 +358,814 +435,747 +1217,439 +177,113 +505,781 +850,746 +343,38 +499,530 +85,789 +1285,563 +321,541 +45,15 +1295,669 +1285,393 +363,262 +271,347 +646,809 +1143,794 +505,753 +224,201 +50,420 +2,297 +507,312 +823,100 +222,252 +1007,241 +1116,157 +274,499 +505,617 +1036,137 +987,623 +22,105 +30,239 +244,609 +835,333 +1019,184 +572,443 +134,613 +348,263 +927,35 +500,625 +421,807 +763,595 +277,838 +856,54 +1310,52 +855,287 +166,628 +1155,684 +609,327 +445,892 +1116,640 +159,346 +1116,478 +1116,849 +982,565 +1232,754 +1163,337 +0,136 +422,455 +1049,451 +857,345 +59,640 +688,822 +507,582 +351,485 +294,744 +1218,383 +751,665 +969,761 +50,165 +1253,358 +393,59 +629,331 +550,842 +30,80 +505,113 +731,30 +641,761 +513,780 +221,543 +1131,561 +1072,315 +252,602 +87,556 +1148,282 +902,61 +276,308 +35,250 +1057,600 +403,785 +113,502 +805,501 +0,86 +1028,364 +428,301 +1305,353 +616,645 +199,607 +744,68 +350,385 +412,530 +574,554 +713,806 +1193,327 +923,514 +952,743 +542,586 +890,830 +378,26 +0,394 +214,523 +335,210 +75,30 +845,282 +395,357 +1285,187 +597,806 +160,154 +589,760 +52,843 +654,117 +711,170 +137,78 +1130,595 +959,37 +1220,690 +797,252 +923,444 +1285,259 +55,99 +980,638 +641,305 +781,549 +1126,768 +184,161 +915,477 +731,702 +888,868 +537,194 +738,219 +1288,777 +982,285 +1087,357 +595,254 +1288,161 +266,21 +1310,136 +1144,745 +1111,562 +671,893 +1198,756 +1176,389 +1123,372 +748,831 +1168,400 +810,886 +805,141 +705,614 +269,760 +417,126 +1044,313 +1228,226 +1158,204 +288,645 +870,504 +266,313 +1253,470 +954,84 +134,806 +420,694 +348,711 +957,623 +1285,271 +1007,485 +428,593 +494,493 +1051,5 +274,698 +852,150 +1216,327 +559,477 +522,625 +691,644 +261,787 +823,346 +773,775 +907,254 +1288,789 +728,466 +559,665 +664,809 +833,656 +258,679 +422,474 +877,95 +1253,246 +822,709 +224,542 +154,456 +502,302 +171,231 +1253,872 +1260,824 +256,176 +372,364 +358,743 +1056,225 +1049,787 +1168,285 +679,465 +157,590 +214,820 +1051,89 +652,358 +192,80 +888,474 +679,241 +430,201 +681,53 +572,668 +626,501 +724,663 +78,98 +639,229 +591,495 +798,721 +494,857 +437,10 +1131,312 +1028,194 +72,428 +1014,151 +229,117 +1086,835 +923,892 +515,485 +485,288 +366,249 +1088,252 +745,390 +266,425 +880,649 +952,814 +656,329 +865,78 +440,504 +397,889 +706,294 +1096,56 +177,672 +900,285 +154,785 +803,582 +1126,126 +174,466 +438,171 +658,760 +57,694 +962,183 +440,820 +57,134 +1138,774 +430,733 +107,756 +1149,600 +1242,889 +997,57 +1156,886 +331,497 +947,856 +671,445 +658,358 +1118,169 +1156,456 +276,488 +873,884 +267,10 +880,61 +805,589 +944,249 +412,812 +326,394 +1265,816 +460,74 +562,526 +377,56 +552,61 +291,698 +822,194 +959,241 +656,758 +1071,332 +22,341 +565,504 +1052,679 +1091,299 +1217,639 +852,296 +1268,394 +738,883 +1238,225 +938,194 +811,124 +1039,347 +507,648 +460,737 +1019,849 +177,841 +798,270 +319,684 +915,865 +117,226 +1006,509 +274,163 +561,535 +497,606 +585,3 +185,52 +30,814 +348,183 +221,799 +395,477 +749,887 +957,603 +1014,631 +1310,842 +723,473 +214,717 +1290,768 +50,40 +1087,2 +797,556 +425,768 +1163,785 +387,514 +1302,809 +813,606 +649,786 +189,719 +343,843 +947,262 +992,439 +93,639 +261,451 +13,133 +932,837 +1153,590 +582,109 +1053,565 +922,581 +634,320 +311,856 +1176,281 +1265,368 +460,605 +1084,301 +1144,73 +341,837 +706,729 +303,485 +445,450 +960,385 +353,603 +1151,122 +160,37 +564,690 +798,574 +1049,891 +885,563 +363,710 +879,537 +840,49 +751,229 +1285,779 +868,562 +353,623 +1059,109 +269,134 +257,329 +788,711 +462,590 +74,490 +706,600 +602,753 +229,246 +602,312 +1144,628 +646,231 +1288,105 +566,826 +619,625 +440,717 +536,549 +1275,250 +477,501 +1168,721 +907,108 +708,507 +1039,547 +13,729 +93,455 +1118,647 +1161,165 +74,378 +417,518 +142,721 +967,843 +1307,436 +947,710 +699,773 +1280,814 +425,200 +1260,138 +110,395 +356,84 +1310,381 +1146,86 +522,631 +110,499 +5,353 +629,563 +1242,679 +840,319 +276,756 +134,358 +1287,689 +152,690 +1260,698 +217,682 +1034,57 +440,522 +201,773 +1193,567 +870,729 +1253,424 +301,719 +8,533 +738,443 +706,165 +475,458 +256,718 +298,875 +999,856 +894,740 +105,246 +420,679 +668,810 +1073,765 +301,603 +853,756 +763,138 +991,796 +954,19 +400,428 +1144,266 +323,497 +938,364 +708,312 +462,395 +870,74 +52,644 +982,665 +1066,40 +433,95 +421,535 +1230,788 +997,110 +1019,698 +161,600 +1094,420 +559,417 +923,702 +1022,645 +166,821 +505,841 +162,282 +773,119 +90,690 +977,786 +586,231 +223,892 +457,756 +1232,322 +512,721 +137,443 +1201,234 +979,49 +1258,283 +97,246 +422,868 +1009,187 +889,87 +251,416 +1202,492 +1302,533 +763,756 +597,424 +311,221 +313,589 +1253,134 +810,557 +1235,30 +356,19 +982,829 +1145,527 +132,30 +885,648 +654,381 +654,65 +234,816 +458,710 +1111,332 +1019,710 +331,49 +561,7 +440,281 +360,150 +261,198 +440,165 +412,59 +1131,582 +78,754 +1009,164 +587,501 +1029,773 +746,690 +50,600 +1260,756 +117,327 +257,441 +582,557 +89,481 +400,669 +216,249 +701,190 +50,196 +1302,737 +933,838 +421,87 +82,674 +80,554 +951,30 +1089,799 +1163,458 +562,816 +1141,836 +65,507 +110,691 +162,612 +189,368 +490,170 +634,520 +179,582 +656,198 +160,857 +1041,760 +549,205 +994,712 +1236,516 +1280,239 +201,121 +706,586 +1131,436 +629,501 +237,70 +1285,331 +898,82 +1230,554 +350,161 +59,254 +945,194 +1071,780 +1034,308 +878,833 +1220,669 +1049,835 +1043,10 +142,46 +403,109 +599,547 +403,640 +872,723 +351,37 +562,511 +1131,113 +462,695 +1252,315 +179,333 +842,282 +460,254 +887,665 +184,768 +529,549 +269,872 +1096,717 +117,345 +1089,95 +159,122 +475,436 +803,246 +597,312 +605,614 +751,417 +542,56 +751,453 +1015,702 +713,760 +822,681 +595,640 +895,108 +1056,18 +1220,231 +1150,717 +1173,443 +269,470 +147,5 +214,726 +667,0 +1243,537 +159,621 +349,170 +1305,338 +388,581 +611,773 +160,149 +1228,450 +550,700 +875,747 +305,668 +1173,3 +418,679 +102,833 +500,886 +1148,612 +923,436 +894,154 +813,288 +996,660 +922,469 +55,302 +902,891 +1168,718 +403,108 +490,808 +458,184 +857,247 +678,553 +662,887 +149,165 +1238,785 +805,672 +520,389 +1202,402 +1101,700 +870,372 +1193,119 +788,631 +734,572 +793,371 +661,556 +1168,848 +224,352 +505,277 +562,368 +11,0 +888,455 +1131,781 +865,892 +1006,52 +298,19 +714,385 +209,700 +803,436 +7,679 +579,702 +522,263 +1150,269 +1252,586 +160,73 +1238,428 +103,380 +1278,374 +808,578 +169,288 +495,845 +668,84 +137,451 +338,182 +850,737 +587,393 +721,555 +1275,698 +741,105 +774,866 +803,648 +1039,35 +1253,200 +1303,679 +831,278 +843,633 +421,439 +78,572 +576,572 +852,710 +259,889 +416,740 +294,150 +184,817 +678,777 +994,182 +442,562 +393,3 +885,200 +669,761 +1150,149 +1034,474 +542,585 +189,67 +820,276 +65,339 +31,416 +209,567 +502,578 +1081,648 +445,78 +1118,247 +217,458 +336,455 +1126,817 +805,753 +331,677 +25,331 +336,439 +92,158 +960,733 +137,603 +174,428 +734,140 +460,157 +43,569 +58,586 +196,632 +313,784 +199,287 + +fold along x=655 +fold along y=447 +fold along x=327 +fold along y=223 +fold along x=163 +fold along y=111 +fold along x=81 +fold along y=55 +fold along x=40 +fold along y=27 +fold along y=13 +fold along y=6 From 0532cbeac33f1b79069e53cedfcfa60c234de8d0 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 13 Dec 2021 14:26:17 +0100 Subject: [PATCH 220/479] 2021: d13: ex2: add solution --- 2021/d13/ex2/ex2.py | 75 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 2021/d13/ex2/ex2.py diff --git a/2021/d13/ex2/ex2.py b/2021/d13/ex2/ex2.py new file mode 100755 index 0000000..d6a99af --- /dev/null +++ b/2021/d13/ex2/ex2.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python + +import itertools +import sys +from copy import deepcopy +from typing import Iterable, List, Tuple, cast + +Paper = List[List[bool]] +Instruction = Tuple[str, int] + + +def solve(input: List[str]) -> None: + def transpose(paper: Paper) -> Paper: + return cast(Paper, list(zip(*paper))) + + def fold_along_y(paper: Paper, y: int) -> Paper: + assert not any(paper[y]) # Sanity check + assert y >= len(paper) // 2 # Ensure that we can actually fold the paper + + paper = deepcopy(paper) + for i, j in zip(itertools.count(y, -1), range(y, len(paper))): + paper[i] = [(dot_i or dot_j) for dot_i, dot_j in zip(paper[i], paper[j])] + + paper = paper[:y] + return paper + + def fold_along_x(paper: Paper, x: int) -> Paper: + return transpose(fold_along_y(transpose(paper), x)) + + def do_folds(paper: Paper, instructions: Iterable[Instruction]) -> Paper: + for axis, n in instructions: + if axis == "x": + paper = fold_along_x(paper, n) + elif axis == "y": + paper = fold_along_y(paper, n) + else: + assert False # Sanity check + + return paper + + def parse() -> Tuple[Paper, List[Instruction]]: + paper_part = itertools.takewhile(lambda s: s != "", input) + fold_part = itertools.islice( + itertools.dropwhile(lambda s: s != "", input), 1, None + ) + + points = {(int(x), int(y)) for x, y in map(lambda s: s.split(","), paper_part)} + folds = [ + (axis[-1], int(n)) for axis, n in map(lambda s: s.split("="), fold_part) + ] + + width, height = max(p[0] for p in points), max(p[1] for p in points) + + paper = [ + [(x, y) in points for x in range(width + 1)] for y in range(height + 1) + ] + + return paper, folds + + def dump(paper: Paper) -> None: + for line in paper: + print("".join("#" if dot else "." for dot in line)) + + paper, instructions = parse() + + dump(do_folds(paper, instructions)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + solve(input) + + +if __name__ == "__main__": + main() From 39c5d2e59ac36bede3ace6c82216cc4bf530d246 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 13 Dec 2021 18:03:24 +0100 Subject: [PATCH 221/479] 2019: d07: ex1: quieten Mypy --- 2019/d07/ex1/ex1.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/2019/d07/ex1/ex1.py b/2019/d07/ex1/ex1.py index 1808ec8..5bea100 100755 --- a/2019/d07/ex1/ex1.py +++ b/2019/d07/ex1/ex1.py @@ -1,5 +1,9 @@ #!/usr/bin/env python +# Mypy has issues with assigning Callable to fields of objects +# See https://github.com/python/mypy/issues/708 +# type: ignore + import itertools import sys from copy import deepcopy From 006e9e3ac649dca3c2005f35f7ddc7d68f50bec7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 13 Dec 2021 18:03:55 +0100 Subject: [PATCH 222/479] nix: add tools to devShell --- flake.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/flake.nix b/flake.nix index 614040f..ba32138 100644 --- a/flake.nix +++ b/flake.nix @@ -56,6 +56,9 @@ devShell = pkgs.mkShell { buildInputs = with pkgs; [ + pkgs.python3Packages.black + pkgs.python3Packages.isort + pkgs.python3Packages.mypy python3 ]; From df55bc99936d2ca283f25f3256da62dd37414f15 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 14 Dec 2021 13:46:09 +0100 Subject: [PATCH 223/479] 2021: d14: ex1: add input --- 2021/d14/ex1/input | 102 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 2021/d14/ex1/input diff --git a/2021/d14/ex1/input b/2021/d14/ex1/input new file mode 100644 index 0000000..bae5f8e --- /dev/null +++ b/2021/d14/ex1/input @@ -0,0 +1,102 @@ +NNSOFOCNHBVVNOBSBHCB + +HN -> S +FK -> N +CH -> P +VP -> P +VV -> C +PB -> H +CP -> F +KO -> P +KN -> V +NO -> K +NF -> N +CO -> P +HO -> H +VH -> V +OV -> C +VS -> F +PK -> H +OS -> S +BF -> S +SN -> P +NK -> N +SV -> O +KB -> O +ON -> O +FN -> H +FO -> N +KV -> S +CS -> C +VO -> O +SP -> O +VK -> H +KP -> S +SK -> N +NC -> B +PN -> N +HV -> O +HS -> C +CN -> N +OO -> V +FF -> B +VC -> V +HK -> K +CC -> H +BO -> H +SC -> O +HH -> C +BV -> P +OB -> O +FC -> H +PO -> C +FV -> C +BK -> F +HB -> B +NH -> P +KF -> N +BP -> H +KK -> O +OH -> K +CB -> H +CK -> C +OK -> H +NN -> F +VF -> N +SO -> K +OP -> F +NP -> B +FS -> S +SH -> O +FP -> O +SF -> V +HF -> N +KC -> K +SB -> V +FH -> N +SS -> C +BB -> C +NV -> K +OC -> S +CV -> N +HC -> P +BC -> N +OF -> K +BH -> N +NS -> K +BN -> F +PC -> C +CF -> N +HP -> F +BS -> O +PF -> S +PV -> B +KH -> K +VN -> V +NB -> N +PH -> V +KS -> B +PP -> V +PS -> C +VB -> N +FB -> N From 5ad6df511bf5e35feabfef89cd8847b7393c901f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 14 Dec 2021 13:46:23 +0100 Subject: [PATCH 224/479] 2021: d14: ex1: add solution --- 2021/d14/ex1/ex1.py | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100755 2021/d14/ex1/ex1.py diff --git a/2021/d14/ex1/ex1.py b/2021/d14/ex1/ex1.py new file mode 100755 index 0000000..da06537 --- /dev/null +++ b/2021/d14/ex1/ex1.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from typing import Dict, Iterator, List, Tuple, TypeVar + +Rules = Dict[str, str] + +T = TypeVar("T") + + +def nth(iterable: Iterator[T], n: int) -> T: + return next(itertools.islice(iterable, n, None)) + + +def solve(input: List[str]) -> int: + def parse() -> Tuple[str, Rules]: + template = input[0] + rules = { + pair: insertion + for pair, insertion in map(lambda s: s.split(" -> "), input[2:]) + } + return template, rules + + def step(template: str, rules: Rules) -> str: + res: List[str] = [] + + # Look at all pairs + for a, b in zip(template, template[1:]): + res.append(a) + if (a + b) in rules: + res.append(rules[a + b]) + + # Add the last element + res.append(template[-1]) + return "".join(res) + + def polymerize(template: str, rules: Rules) -> Iterator[str]: + while True: + yield (template := step(template, rules)) + + def score(template: str) -> int: + counts = [n for __, n in Counter(template).most_common()] + return counts[0] - counts[-1] + + template, rules = parse() + return score(nth(polymerize(template, rules), 10 - 1)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 1ed52f1113705500ea8771ad43f89d251b3111e9 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 14 Dec 2021 13:46:29 +0100 Subject: [PATCH 225/479] 2021: d14: ex2: add input --- 2021/d14/ex2/input | 102 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 2021/d14/ex2/input diff --git a/2021/d14/ex2/input b/2021/d14/ex2/input new file mode 100644 index 0000000..bae5f8e --- /dev/null +++ b/2021/d14/ex2/input @@ -0,0 +1,102 @@ +NNSOFOCNHBVVNOBSBHCB + +HN -> S +FK -> N +CH -> P +VP -> P +VV -> C +PB -> H +CP -> F +KO -> P +KN -> V +NO -> K +NF -> N +CO -> P +HO -> H +VH -> V +OV -> C +VS -> F +PK -> H +OS -> S +BF -> S +SN -> P +NK -> N +SV -> O +KB -> O +ON -> O +FN -> H +FO -> N +KV -> S +CS -> C +VO -> O +SP -> O +VK -> H +KP -> S +SK -> N +NC -> B +PN -> N +HV -> O +HS -> C +CN -> N +OO -> V +FF -> B +VC -> V +HK -> K +CC -> H +BO -> H +SC -> O +HH -> C +BV -> P +OB -> O +FC -> H +PO -> C +FV -> C +BK -> F +HB -> B +NH -> P +KF -> N +BP -> H +KK -> O +OH -> K +CB -> H +CK -> C +OK -> H +NN -> F +VF -> N +SO -> K +OP -> F +NP -> B +FS -> S +SH -> O +FP -> O +SF -> V +HF -> N +KC -> K +SB -> V +FH -> N +SS -> C +BB -> C +NV -> K +OC -> S +CV -> N +HC -> P +BC -> N +OF -> K +BH -> N +NS -> K +BN -> F +PC -> C +CF -> N +HP -> F +BS -> O +PF -> S +PV -> B +KH -> K +VN -> V +NB -> N +PH -> V +KS -> B +PP -> V +PS -> C +VB -> N +FB -> N From 2730bcf359474fff3e564a3445a4e679cac982f7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 14 Dec 2021 13:46:34 +0100 Subject: [PATCH 226/479] 2021: d14: ex2: add solution --- 2021/d14/ex2/ex2.py | 66 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100755 2021/d14/ex2/ex2.py diff --git a/2021/d14/ex2/ex2.py b/2021/d14/ex2/ex2.py new file mode 100755 index 0000000..bf779c6 --- /dev/null +++ b/2021/d14/ex2/ex2.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import Counter +from copy import deepcopy +from typing import Dict, Iterator, List, NamedTuple, Tuple, TypeVar + + +class Template(NamedTuple): + bigrams: Counter[str] + counts: Counter[str] + + +Rules = Dict[str, str] + +T = TypeVar("T") + + +def nth(iterable: Iterator[T], n: int) -> T: + return next(itertools.islice(iterable, n, None)) + + +def solve(input: List[str]) -> int: + def parse() -> Tuple[Template, Rules]: + bigrams = Counter(a + b for a, b in zip(input[0], input[0][1:])) + counts = Counter(input[0]) + rules = { + pair: insertion + for pair, insertion in map(lambda s: s.split(" -> "), input[2:]) + } + return Template(bigrams, counts), rules + + def step(template: Template, rules: Rules) -> Template: + bigrams: Counter[str] = Counter() + counts = deepcopy(template.counts) + for p, n in template.bigrams.items(): + if p in rules: + insertion = rules[p] + bigrams[p[0] + insertion] += n + bigrams[insertion + p[1]] += n + counts[insertion] += n + else: + # Counts are not changed in this case + bigrams[p] = n + return Template(bigrams, counts) + + def polymerize(template: Template, rules: Rules) -> Iterator[Template]: + while True: + yield (template := step(template, rules)) + + def score(template: Template) -> int: + nums = [n for __, n in template.counts.most_common()] + return nums[0] - nums[-1] + + template, rules = parse() + return score(nth(polymerize(template, rules), 40 - 1)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 7c0034e8af51e4aa8ee75e9fd1d60df575696c5e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 15 Dec 2021 10:21:27 +0100 Subject: [PATCH 227/479] 2021: d15: ex1: add input --- 2021/d15/ex1/input | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 2021/d15/ex1/input diff --git a/2021/d15/ex1/input b/2021/d15/ex1/input new file mode 100644 index 0000000..15a36f8 --- /dev/null +++ b/2021/d15/ex1/input @@ -0,0 +1,100 @@ +7715611621811483411121929153345417926121654738244558184333228256741518593939121351941172244538819793 +5978192582116933121967117233221363821218169348147142177193168221219699236451313112198933914323123492 +3523162115513315258921111444182316618172925755923799136271191151813516522171176112647162541858173363 +7931931461145231897547234134741682994126523123999252325119362919742719127391146114344331291116971777 +3912157144212332298711374454411326743116179131395281613188171189221945922126933817119198199326455346 +2219143418191822913131432991534835872531239119117118416185912111192962531111319326176629318111185111 +9116687994992138729148521124241932317616396617951124297314235138854797168842416251775729287611967414 +7851151594489117347687963146449123171411231791678721232616848894581346355912616826231169619235952732 +2851861191919753472141651266114831227654463284483498521612827841418971981411931436113213396426946112 +6712388671398963172123321653869646551586461492219377899341274966231951164199917165932561616983929924 +3677326111792395522936119111175266111868435913873231478188182951214919133631271356331241911265195215 +2411238217381994191274413116991994522732518981599292983991998111631182731112386631322271192212411843 +1924296312792281346181932776933796211556871296835132761484192932264311663412971542122254194197225125 +5193911629511224247133119192711512118326922142611261829118422127224838641841967498792466123922241611 +3518421332332225373982119933189183848164192326315196127257111819966291868392125511182719699513213126 +1243423697719296145178212414496848356131291919119337192521512383952691111818938552679591331194252815 +1114134841622115582771529171517131623995521325269361158192181119511123926429217441181915118546111129 +3413463671141433362959518115315279211752711714921711141946919111126196926192311117361329611368827123 +1372787612785741712553922962223999622392124621931191746293231951121499351641599723992929211182183521 +1646324114562413462565234121468141622211633146398136728423519196521422661392274137424189885124111979 +8593927754728491812319341327322619591487122534343481851326173126244497617119592817617578171431611211 +3544996545112122938226413169257256114389524779177813732798495971419433331931141513863257159222211327 +1317112599316491522993299211918262655114758519194159564179393912978824213816415221134382876196791131 +2992415411131212997526331872111112996344865592792815133565817171814172837534233288248214812739937128 +7399281754443127946141431876481961612345132118851715323452891116597132773351188234354812269914136314 +1353222121126771342784863118971948121131151269737693294597543471364852531536931711275612918142912339 +1231143322424173511217841979211499894524361726733118828862941949323516193769441834412128333517121219 +4153113123817117759341379297738315498194824968743168793739217211372842125911549919617297111441613631 +9731976338891216952882213198614419772196764362991958541418412247316741111113414519698991177561491619 +1549968122497536224817279413173193149141335731431114111191969373537193295361951832648538349971115651 +3141199162911153239685453949619182151714537212236218628247835892234915714197151176914515494168817613 +2321634214222164696761674371984136262645585522114118771793891255516343661843273111241429184252481112 +1323271335941123627134295288123814147892434111122433863111883333942311312165717429336197351684297515 +1799383479828119861997991252537621715111112211243118199888781621163257948541164311576771111337441297 +3474558728714311424212121852197696651899775852781115664112735924716128287452112718142116441487711179 +1212211282414612598188336251113541918828321262911122168152739929958181711329326391542161816879229457 +9369141739122111275981911719178226989791269152711118514211312351951888312115211119912146165111417274 +1557942397217218772114458897214197121496239971221799298121731791112838411839164943531148113513822329 +2116511928331138153519713938955192461891971295394211113118549975869129341915148999142791221429844338 +1216615164189449189844291299217862321339427481291811189889121368125354184186711881158278233714798812 +2131462662132519141953391411117681836144434719816111765876594111661972132119291718521288742511921812 +1352178182113553243431145717611728111429117626322671124512968719613828222757811142112237112915916411 +9111861843583342173156761182486951611273911221233459621981815173222733765922411929621144273182167173 +6461614968141185513751845166496129581174136991312882746411333574211232145145411259791494747636513831 +8395826326831481781816141231151946694412171233118734118443712934188141261953428112498397283833996953 +3224325116954176581173265389433772885221125196135137181681253382516579111971122321919261361455573426 +5612711314828933927115772517317242878121717862126961211324793885131324871781627863678621349344985162 +9219113183181524712318355994194342313255174114168321236494161659235237996744938323416519175154774368 +1455219173629652263128124278132571923466188331613694112619643242969214341411691592236981126229531246 +9997212872235551519294812463451816576987351769737341319699248495132218138849526591159541452141311227 +9439551788914742428219371619927339189298769319132111753411511544151872351486489786185314584942895521 +4623921912121114189211698941781144517423493925244616879259454219595112526216227151411539965913122341 +9233881249291833812284319142291868129327632421241354425437738985391254261131535339322529281581561495 +6621816747917191382495161833567118397773372129721681832591214252274233112632684542595451911924821133 +1961985912891945611341231799388123719733816334154627934522422918536573253556769424412919116426182323 +8613914491619713822131419117143163659542154519169992171969135131941141557529457324123161951111765294 +4268219915611518484714151351482241221275914371738124149239386327831219359136247361161375174224223839 +2417628752221923911251535153892648194748229231761133182371314159657511173541128258975114145282143131 +1149132123898111199247912341113411962434312877836882119771691759571972141321747138787951211139182122 +8589114128711558917336937119159115193482491549524442733618822133531142619542652131192519259679572118 +8417549457115646563131638317315161112292939814589243166226251236828614439212129983319595172328298496 +7132261193213112392744229915239441239812134161721522541289116993632721981519211498478878212229136195 +5284114931928992331114192299645884318993264292231979919528343172899594924111575491982184914671211943 +4138427142832314543311113423227271112997816549131893391237171313241261242672582112128835619821371121 +4918821233299337972289281128133411678349812271421157479832992298658193248154113222111521996724714323 +9174191481421563857184797521172297912449121127431641255195914981149724121258184197136514813734273234 +4112626214511388118211446512388876694313187965929168166814111113382224115821767413172111376427638393 +3231154459742912972641231118291138185681466529142819182885451441118191771984959111111623683628161113 +5841171953222465917336112439651628888517153249964599148991263916813419222189131513441336935294361738 +1816982764214991569342131547714487273197791551197149221141426622298772319696223747144351291172292314 +9475574461545913358168363336339111314873371711345178219127111194927223149613171931929322893211152758 +4858113211241899116852635135769311112114182724528552311872195867129114349887193381564631182288641431 +9742923193935298412422519924115919956189443126116429369399671331114348991891115412454184715126299998 +9121814433419188117111757994391996912918393911152421324919462957262487176581182129438199211342711241 +9152171557731172939156141661228213792961792411377162925187423286231921473559751361928233131516412191 +7288111938512228994743624943311448872522112536176928681443419899213241329198212953522514116811911197 +9349832181421346375192594111125921597518122235122992135833853191479358257121815429654613383832118393 +5787987676213718162591455312614145484267395142381485479118249352234818169546988191111121531915975846 +1593328873913943873678371287612191117251139167998756142661344997618573521246115295381218111199353123 +7792811294182231635163292331735316144325221519124512326112978344515322371153671145111948211314111961 +2318518221984644229891593834523191322527124556185113492672653928784664122218293847186517161551631851 +1112829983141931112651721133161412432143348121156512484214145542131639818492551211129611431998577181 +3592613729447389151192925815192425191916611234864255478391561193394996337454189464938128832119348811 +1271921732441182191447179913999221292183221141274914288646297111212268851116317378213664353119951955 +1952724641973599331362393291821311217123755111853629765725951319311313197419922547371189952219569671 +9175174929918626863191261492871635282719323944341514814391991254113352393192263965371316169319756114 +7796162132715959911612986171614281934119795141614191521216692472181723351815721531573126767456111621 +1929441344612524315169915972256329374194651851188791336975193211635164981382125948798143115991218147 +3196918124398432195448219783729332721415743182553947677319291263569111194212214141296123149311195918 +3158114419662114389969334121776231616687394316562465952127448362341922599962916219531841316418231911 +7689421696457392537729119321129879691967715569123191226313319112314943111466159111416157881113611939 +7831513935396926282212738725323211942958912226993621996662133721199282226293728546453712751822771285 +2123699211953181196938911293262179311281131944194219219814973246548631519123711749121712622686521314 +5191342118926287865138111129119915719811398331646995511667311198221618374236169145912891632927912111 +8214442493117223193442175221522611659488871176512331552482329112125141241921222999759248511345262843 +1914183724394277228911926796911512739125432271261643511196439716723711131491717732211162514393511298 +1119745958685726562282127671296828241734389837168591468985891281128335925991724159212218314375287914 +9517519684395161899187861919321914215994991181859919191641351832193212127643354718852685876126577315 +3342917922251914252338185581691191842316989111841311466776912683629971312998965551711141287138724241 +8176221727998313186834559714891971413547985825489911732617146966111238282644811394895278181837711185 From a4b81dac45b46d562f55a0fc1d73f8b5cf18e279 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 15 Dec 2021 10:21:33 +0100 Subject: [PATCH 228/479] 2021: d15: ex1: add solution --- 2021/d15/ex1/ex1.py | 54 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100755 2021/d15/ex1/ex1.py diff --git a/2021/d15/ex1/ex1.py b/2021/d15/ex1/ex1.py new file mode 100755 index 0000000..4399aba --- /dev/null +++ b/2021/d15/ex1/ex1.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python + +import heapq +import sys +from typing import Iterator, List, NamedTuple, Set + + +class Point(NamedTuple): + x: int + y: int + + +def solve(input: List[str]) -> int: + levels = [[int(c) for c in line] for line in input] + + def neighbours(p: Point) -> Iterator[Point]: + for dx, dy in (-1, 0), (1, 0), (0, -1), (0, 1): + x, y = p.x + dx, p.y + dy + if x < 0 or x >= len(levels): + continue + if y < 0 or y >= len(levels[0]): + continue + yield Point(x, y) + + def djikstra(start: Point, end: Point) -> int: + # Priority queue of (distance, point) + queue = [(0, start)] + seen: Set[Point] = set() + + while len(queue) > 0: + dist, p = heapq.heappop(queue) + if p == end: + return dist + # We must have seen p with a smaller distance before + if p in seen: + continue + # First time encountering p, must be the smallest distance to it + seen.add(p) + # Add all neighbours to be visited + for n in neighbours(p): + heapq.heappush(queue, (dist + levels[n.x][n.y], n)) + + assert False # Sanity check + + return djikstra(Point(0, 0), Point(len(levels) - 1, len(levels[0]) - 1)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 8c09efb22706785de5b569e662e19bcef3f418ae Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 15 Dec 2021 10:21:39 +0100 Subject: [PATCH 229/479] 2021: d15: ex2: add input --- 2021/d15/ex2/input | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 2021/d15/ex2/input diff --git a/2021/d15/ex2/input b/2021/d15/ex2/input new file mode 100644 index 0000000..15a36f8 --- /dev/null +++ b/2021/d15/ex2/input @@ -0,0 +1,100 @@ +7715611621811483411121929153345417926121654738244558184333228256741518593939121351941172244538819793 +5978192582116933121967117233221363821218169348147142177193168221219699236451313112198933914323123492 +3523162115513315258921111444182316618172925755923799136271191151813516522171176112647162541858173363 +7931931461145231897547234134741682994126523123999252325119362919742719127391146114344331291116971777 +3912157144212332298711374454411326743116179131395281613188171189221945922126933817119198199326455346 +2219143418191822913131432991534835872531239119117118416185912111192962531111319326176629318111185111 +9116687994992138729148521124241932317616396617951124297314235138854797168842416251775729287611967414 +7851151594489117347687963146449123171411231791678721232616848894581346355912616826231169619235952732 +2851861191919753472141651266114831227654463284483498521612827841418971981411931436113213396426946112 +6712388671398963172123321653869646551586461492219377899341274966231951164199917165932561616983929924 +3677326111792395522936119111175266111868435913873231478188182951214919133631271356331241911265195215 +2411238217381994191274413116991994522732518981599292983991998111631182731112386631322271192212411843 +1924296312792281346181932776933796211556871296835132761484192932264311663412971542122254194197225125 +5193911629511224247133119192711512118326922142611261829118422127224838641841967498792466123922241611 +3518421332332225373982119933189183848164192326315196127257111819966291868392125511182719699513213126 +1243423697719296145178212414496848356131291919119337192521512383952691111818938552679591331194252815 +1114134841622115582771529171517131623995521325269361158192181119511123926429217441181915118546111129 +3413463671141433362959518115315279211752711714921711141946919111126196926192311117361329611368827123 +1372787612785741712553922962223999622392124621931191746293231951121499351641599723992929211182183521 +1646324114562413462565234121468141622211633146398136728423519196521422661392274137424189885124111979 +8593927754728491812319341327322619591487122534343481851326173126244497617119592817617578171431611211 +3544996545112122938226413169257256114389524779177813732798495971419433331931141513863257159222211327 +1317112599316491522993299211918262655114758519194159564179393912978824213816415221134382876196791131 +2992415411131212997526331872111112996344865592792815133565817171814172837534233288248214812739937128 +7399281754443127946141431876481961612345132118851715323452891116597132773351188234354812269914136314 +1353222121126771342784863118971948121131151269737693294597543471364852531536931711275612918142912339 +1231143322424173511217841979211499894524361726733118828862941949323516193769441834412128333517121219 +4153113123817117759341379297738315498194824968743168793739217211372842125911549919617297111441613631 +9731976338891216952882213198614419772196764362991958541418412247316741111113414519698991177561491619 +1549968122497536224817279413173193149141335731431114111191969373537193295361951832648538349971115651 +3141199162911153239685453949619182151714537212236218628247835892234915714197151176914515494168817613 +2321634214222164696761674371984136262645585522114118771793891255516343661843273111241429184252481112 +1323271335941123627134295288123814147892434111122433863111883333942311312165717429336197351684297515 +1799383479828119861997991252537621715111112211243118199888781621163257948541164311576771111337441297 +3474558728714311424212121852197696651899775852781115664112735924716128287452112718142116441487711179 +1212211282414612598188336251113541918828321262911122168152739929958181711329326391542161816879229457 +9369141739122111275981911719178226989791269152711118514211312351951888312115211119912146165111417274 +1557942397217218772114458897214197121496239971221799298121731791112838411839164943531148113513822329 +2116511928331138153519713938955192461891971295394211113118549975869129341915148999142791221429844338 +1216615164189449189844291299217862321339427481291811189889121368125354184186711881158278233714798812 +2131462662132519141953391411117681836144434719816111765876594111661972132119291718521288742511921812 +1352178182113553243431145717611728111429117626322671124512968719613828222757811142112237112915916411 +9111861843583342173156761182486951611273911221233459621981815173222733765922411929621144273182167173 +6461614968141185513751845166496129581174136991312882746411333574211232145145411259791494747636513831 +8395826326831481781816141231151946694412171233118734118443712934188141261953428112498397283833996953 +3224325116954176581173265389433772885221125196135137181681253382516579111971122321919261361455573426 +5612711314828933927115772517317242878121717862126961211324793885131324871781627863678621349344985162 +9219113183181524712318355994194342313255174114168321236494161659235237996744938323416519175154774368 +1455219173629652263128124278132571923466188331613694112619643242969214341411691592236981126229531246 +9997212872235551519294812463451816576987351769737341319699248495132218138849526591159541452141311227 +9439551788914742428219371619927339189298769319132111753411511544151872351486489786185314584942895521 +4623921912121114189211698941781144517423493925244616879259454219595112526216227151411539965913122341 +9233881249291833812284319142291868129327632421241354425437738985391254261131535339322529281581561495 +6621816747917191382495161833567118397773372129721681832591214252274233112632684542595451911924821133 +1961985912891945611341231799388123719733816334154627934522422918536573253556769424412919116426182323 +8613914491619713822131419117143163659542154519169992171969135131941141557529457324123161951111765294 +4268219915611518484714151351482241221275914371738124149239386327831219359136247361161375174224223839 +2417628752221923911251535153892648194748229231761133182371314159657511173541128258975114145282143131 +1149132123898111199247912341113411962434312877836882119771691759571972141321747138787951211139182122 +8589114128711558917336937119159115193482491549524442733618822133531142619542652131192519259679572118 +8417549457115646563131638317315161112292939814589243166226251236828614439212129983319595172328298496 +7132261193213112392744229915239441239812134161721522541289116993632721981519211498478878212229136195 +5284114931928992331114192299645884318993264292231979919528343172899594924111575491982184914671211943 +4138427142832314543311113423227271112997816549131893391237171313241261242672582112128835619821371121 +4918821233299337972289281128133411678349812271421157479832992298658193248154113222111521996724714323 +9174191481421563857184797521172297912449121127431641255195914981149724121258184197136514813734273234 +4112626214511388118211446512388876694313187965929168166814111113382224115821767413172111376427638393 +3231154459742912972641231118291138185681466529142819182885451441118191771984959111111623683628161113 +5841171953222465917336112439651628888517153249964599148991263916813419222189131513441336935294361738 +1816982764214991569342131547714487273197791551197149221141426622298772319696223747144351291172292314 +9475574461545913358168363336339111314873371711345178219127111194927223149613171931929322893211152758 +4858113211241899116852635135769311112114182724528552311872195867129114349887193381564631182288641431 +9742923193935298412422519924115919956189443126116429369399671331114348991891115412454184715126299998 +9121814433419188117111757994391996912918393911152421324919462957262487176581182129438199211342711241 +9152171557731172939156141661228213792961792411377162925187423286231921473559751361928233131516412191 +7288111938512228994743624943311448872522112536176928681443419899213241329198212953522514116811911197 +9349832181421346375192594111125921597518122235122992135833853191479358257121815429654613383832118393 +5787987676213718162591455312614145484267395142381485479118249352234818169546988191111121531915975846 +1593328873913943873678371287612191117251139167998756142661344997618573521246115295381218111199353123 +7792811294182231635163292331735316144325221519124512326112978344515322371153671145111948211314111961 +2318518221984644229891593834523191322527124556185113492672653928784664122218293847186517161551631851 +1112829983141931112651721133161412432143348121156512484214145542131639818492551211129611431998577181 +3592613729447389151192925815192425191916611234864255478391561193394996337454189464938128832119348811 +1271921732441182191447179913999221292183221141274914288646297111212268851116317378213664353119951955 +1952724641973599331362393291821311217123755111853629765725951319311313197419922547371189952219569671 +9175174929918626863191261492871635282719323944341514814391991254113352393192263965371316169319756114 +7796162132715959911612986171614281934119795141614191521216692472181723351815721531573126767456111621 +1929441344612524315169915972256329374194651851188791336975193211635164981382125948798143115991218147 +3196918124398432195448219783729332721415743182553947677319291263569111194212214141296123149311195918 +3158114419662114389969334121776231616687394316562465952127448362341922599962916219531841316418231911 +7689421696457392537729119321129879691967715569123191226313319112314943111466159111416157881113611939 +7831513935396926282212738725323211942958912226993621996662133721199282226293728546453712751822771285 +2123699211953181196938911293262179311281131944194219219814973246548631519123711749121712622686521314 +5191342118926287865138111129119915719811398331646995511667311198221618374236169145912891632927912111 +8214442493117223193442175221522611659488871176512331552482329112125141241921222999759248511345262843 +1914183724394277228911926796911512739125432271261643511196439716723711131491717732211162514393511298 +1119745958685726562282127671296828241734389837168591468985891281128335925991724159212218314375287914 +9517519684395161899187861919321914215994991181859919191641351832193212127643354718852685876126577315 +3342917922251914252338185581691191842316989111841311466776912683629971312998965551711141287138724241 +8176221727998313186834559714891971413547985825489911732617146966111238282644811394895278181837711185 From fcce87c199a0e06a2092f39c3f522e26006c1116 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 15 Dec 2021 10:21:46 +0100 Subject: [PATCH 230/479] 2021: d15: ex2: add solution --- 2021/d15/ex2/ex2.py | 75 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100755 2021/d15/ex2/ex2.py diff --git a/2021/d15/ex2/ex2.py b/2021/d15/ex2/ex2.py new file mode 100755 index 0000000..c2bbd30 --- /dev/null +++ b/2021/d15/ex2/ex2.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python + +import heapq +import sys +from typing import Iterator, List, NamedTuple, Set + + +class Point(NamedTuple): + x: int + y: int + + +def solve(input: List[str]) -> int: + def parse_levels() -> List[List[int]]: + levels = [[int(c) for c in line] for line in input] + width, height = len(levels), len(levels[0]) + + res = [[0 for j in range(width * 5)] for i in range(height * 5)] + + for i in range(height): + for j in range(width): + res[i][j] = levels[i][j] + + # Do first row of blocks + for i in range(height): + for j in range(width, width * 5): + res[i][j] = res[i][j - width] % 9 + 1 + + for i in range(height, height * 5): + for j in range(width * 5): + res[i][j] = res[i - height][j] % 9 + 1 + + return res + + levels = parse_levels() + + def neighbours(p: Point) -> Iterator[Point]: + for dx, dy in (-1, 0), (1, 0), (0, -1), (0, 1): + x, y = p.x + dx, p.y + dy + if x < 0 or x >= len(levels): + continue + if y < 0 or y >= len(levels[0]): + continue + yield Point(x, y) + + def djikstra(start: Point, end: Point) -> int: + # Priority queue of (distance, point) + queue = [(0, start)] + seen: Set[Point] = set() + + while len(queue) > 0: + dist, p = heapq.heappop(queue) + if p == end: + return dist + # We must have seen p with a smaller distance before + if p in seen: + continue + # First time encountering p, must be the smallest distance to it + seen.add(p) + # Add all neighbours to be visited + for n in neighbours(p): + heapq.heappush(queue, (dist + levels[n.x][n.y], n)) + + assert False # Sanity check + + return djikstra(Point(0, 0), Point(len(levels) - 1, len(levels[0]) - 1)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 918aa91abacc6bec3fd5d2a6e8c3fcff3bc9bab2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 16 Dec 2021 12:59:15 +0100 Subject: [PATCH 231/479] 2021: d16: ex1: add input --- 2021/d16/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2021/d16/ex1/input diff --git a/2021/d16/ex1/input b/2021/d16/ex1/input new file mode 100644 index 0000000..1c41adf --- /dev/null +++ b/2021/d16/ex1/input @@ -0,0 +1 @@ +2052ED9802D3B9F465E9AE6003E52B8DEE3AF97CA38100957401A88803D05A25C1E00043E1545883B397259385B47E40257CCEDC7401700043E3F42A8AE0008741E8831EC8020099459D40994E996C8F4801CDC3395039CB60E24B583193DD75D299E95ADB3D3004E5FB941A004AE4E69128D240130D80252E6B27991EC8AD90020F22DF2A8F32EA200AC748CAA0064F6EEEA000B948DFBED7FA4660084BCCEAC01000042E37C3E8BA0008446D8751E0C014A0036E69E226C9FFDE2020016A3B454200CBAC01399BEE299337DC52A7E2C2600BF802B274C8848FA02F331D563B3D300566107C0109B4198B5E888200E90021115E31C5120043A31C3E85E400874428D30AA0E3804D32D32EED236459DC6AC86600E4F3B4AAA4C2A10050336373ED536553855301A600B6802B2B994516469EE45467968C016D004E6E9EE7CE656B6D34491D8018E6805E3B01620C053080136CA0060801C6004A801880360300C226007B8018E0073801A801938004E2400E01801E800434FA790097F39E5FB004A5B3CF47F7ED5965B3CF47F7ED59D401694DEB57F7382D3F6A908005ED253B3449CE9E0399649EB19A005E5398E9142396BD1CA56DFB25C8C65A0930056613FC0141006626C5586E200DC26837080C0169D5DC00D5C40188730D616000215192094311007A5E87B26B12FCD5E5087A896402978002111960DC1E0004363942F8880008741A8E10EE4E778FA2F723A2F60089E4F1FE2E4C5B29B0318005982E600AD802F26672368CB1EC044C2E380552229399D93C9D6A813B98D04272D94440093E2CCCFF158B2CCFE8E24017CE002AD2940294A00CD5638726004066362F1B0C0109311F00424CFE4CF4C016C004AE70CA632A33D2513004F003339A86739F5BAD5350CE73EB75A24DD22280055F34A30EA59FE15CC62F9500 From e4e9042c0f4e32bb4a6e81df0f8e5a04a5d5f9dd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 16 Dec 2021 12:59:21 +0100 Subject: [PATCH 232/479] 2021: d16: ex1: add solution --- 2021/d16/ex1/ex1.py | 138 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100755 2021/d16/ex1/ex1.py diff --git a/2021/d16/ex1/ex1.py b/2021/d16/ex1/ex1.py new file mode 100755 index 0000000..1978196 --- /dev/null +++ b/2021/d16/ex1/ex1.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python + +import enum +import functools +import itertools +import sys +from dataclasses import dataclass +from typing import Iterable, Iterator, List, Tuple + +RawPacket = List[bool] + + +class PacketType(enum.IntEnum): + SUM = 0 + PRODUCT = 1 + MINIMUM = 2 + MAXIMUM = 3 + LITTERAL = 4 + GREATER = 5 + LESS = 6 + EQUAL = 7 + + +class PacketLengthType(enum.IntEnum): + TOTAL_BITS = 0 # Next 15 bits are the number of bits in the sub-packets + TOTAL_PACKETS = 1 # Next 11 bits are the number of sub-packets + + +@dataclass +class PacketLength: + type: PacketLengthType + length: int + + +@dataclass +class Packet: + version: int + type: PacketType + + +@dataclass +class OperatorPacket(Packet): + packets: List[Packet] + + +@dataclass +class LitteralPacket(Packet): + number: int + + +def solve(input: List[str]) -> int: + def to_raw(packet: str) -> RawPacket: + def bits(n: int) -> Iterator[bool]: + for i in range(3, -1, -1): + yield bool(n & (1 << i)) + + nums = [int(c, 16) for c in input[0]] + return list(itertools.chain.from_iterable(bits(n) for n in nums)) + + def bits_to_int(bits: Iterable[bool]) -> int: + return functools.reduce(lambda a, b: (a << 1) + b, bits, 0) + + def parse_packet(p: RawPacket) -> Tuple[int, Packet]: + def packet_version(p: RawPacket) -> int: + return bits_to_int(p[:3]) + + def packet_type(p: RawPacket) -> PacketType: + return PacketType(bits_to_int(p[3:6])) + + def parse_length(p: RawPacket) -> Tuple[int, PacketLength]: + assert packet_type(p) != PacketType.LITTERAL # Sanity check + type = PacketLengthType(bits_to_int(p[6:7])) + if type == PacketLengthType.TOTAL_BITS: + index = 7 + 15 + length = bits_to_int(p[7:index]) + else: + index = 7 + 11 + length = bits_to_int(p[7:index]) + return index, PacketLength(type, length) + + def parse_litteral(p: RawPacket) -> Tuple[int, LitteralPacket]: + version, type = packet_version(p), packet_type(p) + assert type == PacketType.LITTERAL # Sanity check + index = 6 + bits: List[bool] = [] + while True: + bits += p[index + 1 : index + 5] + index += 5 + # Check if we were at the last one + if p[index - 5] == 0: + break + return index, LitteralPacket(version, type, bits_to_int(bits)) + + def parse_operator(p: RawPacket) -> Tuple[int, OperatorPacket]: + version, type = packet_version(p), packet_type(p) + assert type != PacketType.LITTERAL # Sanity check + + index, length = parse_length(p) + packets: List[Packet] = [] + + if length.type == PacketLengthType.TOTAL_BITS: + sub_index = 0 + while sub_index < length.length: + parsed, packet = parse_packet(p[index:]) + sub_index += parsed + index += parsed + packets.append(packet) + else: + while len(packets) < length.length: + parsed, packet = parse_packet(p[index:]) + index += parsed + packets.append(packet) + + return index, OperatorPacket(version, type, packets) + + if packet_type(p) == PacketType.LITTERAL: + return parse_litteral(p) + return parse_operator(p) + + def score(p: Packet) -> int: + if p.type == PacketType.LITTERAL: + return p.version + assert isinstance(p, OperatorPacket) # Sanity check + return p.version + sum(score(c) for c in p.packets) + + raw = to_raw(input[0]) + __, packet = parse_packet(raw) + + return score(packet) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 6aaefd6d6f56b9dd064cc0cfaf874c1c1bb5b31d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 16 Dec 2021 12:59:29 +0100 Subject: [PATCH 233/479] 2021: d16: ex2: add input --- 2021/d16/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2021/d16/ex2/input diff --git a/2021/d16/ex2/input b/2021/d16/ex2/input new file mode 100644 index 0000000..1c41adf --- /dev/null +++ b/2021/d16/ex2/input @@ -0,0 +1 @@ +2052ED9802D3B9F465E9AE6003E52B8DEE3AF97CA38100957401A88803D05A25C1E00043E1545883B397259385B47E40257CCEDC7401700043E3F42A8AE0008741E8831EC8020099459D40994E996C8F4801CDC3395039CB60E24B583193DD75D299E95ADB3D3004E5FB941A004AE4E69128D240130D80252E6B27991EC8AD90020F22DF2A8F32EA200AC748CAA0064F6EEEA000B948DFBED7FA4660084BCCEAC01000042E37C3E8BA0008446D8751E0C014A0036E69E226C9FFDE2020016A3B454200CBAC01399BEE299337DC52A7E2C2600BF802B274C8848FA02F331D563B3D300566107C0109B4198B5E888200E90021115E31C5120043A31C3E85E400874428D30AA0E3804D32D32EED236459DC6AC86600E4F3B4AAA4C2A10050336373ED536553855301A600B6802B2B994516469EE45467968C016D004E6E9EE7CE656B6D34491D8018E6805E3B01620C053080136CA0060801C6004A801880360300C226007B8018E0073801A801938004E2400E01801E800434FA790097F39E5FB004A5B3CF47F7ED5965B3CF47F7ED59D401694DEB57F7382D3F6A908005ED253B3449CE9E0399649EB19A005E5398E9142396BD1CA56DFB25C8C65A0930056613FC0141006626C5586E200DC26837080C0169D5DC00D5C40188730D616000215192094311007A5E87B26B12FCD5E5087A896402978002111960DC1E0004363942F8880008741A8E10EE4E778FA2F723A2F60089E4F1FE2E4C5B29B0318005982E600AD802F26672368CB1EC044C2E380552229399D93C9D6A813B98D04272D94440093E2CCCFF158B2CCFE8E24017CE002AD2940294A00CD5638726004066362F1B0C0109311F00424CFE4CF4C016C004AE70CA632A33D2513004F003339A86739F5BAD5350CE73EB75A24DD22280055F34A30EA59FE15CC62F9500 From 9403676d369bbc1bc0cd2c9cf980ba7d6d5ebb11 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 16 Dec 2021 12:59:36 +0100 Subject: [PATCH 234/479] 2021: d16: ex2: add solution --- 2021/d16/ex2/ex2.py | 158 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100755 2021/d16/ex2/ex2.py diff --git a/2021/d16/ex2/ex2.py b/2021/d16/ex2/ex2.py new file mode 100755 index 0000000..bb9ad4e --- /dev/null +++ b/2021/d16/ex2/ex2.py @@ -0,0 +1,158 @@ +#!/usr/bin/env python + +import enum +import functools +import itertools +import math +import sys +from dataclasses import dataclass +from typing import Callable, Dict, Iterable, Iterator, List, Tuple + +RawPacket = List[bool] + + +class PacketType(enum.IntEnum): + SUM = 0 + PRODUCT = 1 + MINIMUM = 2 + MAXIMUM = 3 + LITTERAL = 4 + GREATER = 5 + LESS = 6 + EQUAL = 7 + + +class PacketLengthType(enum.IntEnum): + TOTAL_BITS = 0 # Next 15 bits are the number of bits in the sub-packets + TOTAL_PACKETS = 1 # Next 11 bits are the number of sub-packets + + +@dataclass +class PacketLength: + type: PacketLengthType + length: int + + +@dataclass +class Packet: + version: int + type: PacketType + + +@dataclass +class OperatorPacket(Packet): + packets: List[Packet] + + +@dataclass +class LitteralPacket(Packet): + number: int + + +def solve(input: List[str]) -> int: + def to_raw(packet: str) -> RawPacket: + def bits(n: int) -> Iterator[bool]: + for i in range(3, -1, -1): + yield bool(n & (1 << i)) + + nums = [int(c, 16) for c in input[0]] + return list(itertools.chain.from_iterable(bits(n) for n in nums)) + + def bits_to_int(bits: Iterable[bool]) -> int: + return functools.reduce(lambda a, b: (a << 1) + b, bits, 0) + + def parse_packet(p: RawPacket) -> Tuple[int, Packet]: + def packet_version(p: RawPacket) -> int: + return bits_to_int(p[:3]) + + def packet_type(p: RawPacket) -> PacketType: + return PacketType(bits_to_int(p[3:6])) + + def parse_length(p: RawPacket) -> Tuple[int, PacketLength]: + assert packet_type(p) != PacketType.LITTERAL # Sanity check + type = PacketLengthType(bits_to_int(p[6:7])) + if type == PacketLengthType.TOTAL_BITS: + index = 7 + 15 + length = bits_to_int(p[7:index]) + else: + index = 7 + 11 + length = bits_to_int(p[7:index]) + return index, PacketLength(type, length) + + def parse_litteral(p: RawPacket) -> Tuple[int, LitteralPacket]: + version, type = packet_version(p), packet_type(p) + assert type == PacketType.LITTERAL # Sanity check + index = 6 + bits: List[bool] = [] + while True: + bits += p[index + 1 : index + 5] + index += 5 + # Check if we were at the last one + if p[index - 5] == 0: + break + return index, LitteralPacket(version, type, bits_to_int(bits)) + + def parse_operator(p: RawPacket) -> Tuple[int, OperatorPacket]: + version, type = packet_version(p), packet_type(p) + assert type != PacketType.LITTERAL # Sanity check + + index, length = parse_length(p) + packets: List[Packet] = [] + + if length.type == PacketLengthType.TOTAL_BITS: + sub_index = 0 + while sub_index < length.length: + parsed, packet = parse_packet(p[index:]) + sub_index += parsed + index += parsed + packets.append(packet) + else: + while len(packets) < length.length: + parsed, packet = parse_packet(p[index:]) + index += parsed + packets.append(packet) + + return index, OperatorPacket(version, type, packets) + + if packet_type(p) == PacketType.LITTERAL: + return parse_litteral(p) + return parse_operator(p) + + def eval(p: Packet) -> int: + if p.type == PacketType.LITTERAL: + assert isinstance(p, LitteralPacket) # Sanity check + return p.number + assert isinstance(p, OperatorPacket) # Sanity check + + packet_values = [eval(c) for c in p.packets] + + ops: Dict[PacketType, Callable[[List[int]], int]] = { + PacketType.SUM: sum, + PacketType.PRODUCT: math.prod, + PacketType.MINIMUM: min, + PacketType.MAXIMUM: max, + PacketType.SUM: sum, + PacketType.GREATER: lambda values: values[0] > values[1], + PacketType.LESS: lambda values: values[0] < values[1], + PacketType.EQUAL: lambda values: values[0] == values[1], + } + + assert len(packet_values) >= 1 # Sanity check + if p.type in (PacketType.GREATER, PacketType.LESS, PacketType.EQUAL): + assert len(packet_values) == 2 # Sanity check + + return ops[p.type](packet_values) + + raw = to_raw(input[0]) + __, packet = parse_packet(raw) + + return eval(packet) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 0889e490ee900e70e15696feaedcdb1a2651e03f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 17 Dec 2021 17:38:20 +0100 Subject: [PATCH 235/479] 2021: d17: ex1: add input --- 2021/d17/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2021/d17/ex1/input diff --git a/2021/d17/ex1/input b/2021/d17/ex1/input new file mode 100644 index 0000000..791984a --- /dev/null +++ b/2021/d17/ex1/input @@ -0,0 +1 @@ +target area: x=79..137, y=-176..-117 From 54c92ff0fe09d86cec2cd3b6cab303e995d33f48 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 17 Dec 2021 17:38:26 +0100 Subject: [PATCH 236/479] 2021: d17: ex1: add solution --- 2021/d17/ex1/ex1.py | 110 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100755 2021/d17/ex1/ex1.py diff --git a/2021/d17/ex1/ex1.py b/2021/d17/ex1/ex1.py new file mode 100755 index 0000000..00bbca2 --- /dev/null +++ b/2021/d17/ex1/ex1.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import Iterator, List, NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class Probe(NamedTuple): + position: Point + velocity: Point + + +class Area(NamedTuple): + min: Point + max: Point + + +def solve(input: List[str]) -> int: + def parse(line: str) -> Area: + x_range = line.split("x=")[1].split(",")[0] + y_range = line.split("y=")[1] + + min_x, max_x = map(int, x_range.split("..")) + min_y, max_y = map(int, y_range.split("..")) + + # Sanity check + assert min_x <= max_x + assert min_y <= max_y + + return Area(Point(min_x, min_y), Point(max_x, max_y)) + + def trajectory(p: Probe) -> Iterator[Probe]: + def step(p: Probe) -> Probe: + def drag(x: int) -> int: + if x < 0: + return x + 1 + if x > 0: + return x - 1 + return 0 + + def gravity(y: int) -> int: + return y - 1 + + pos, vel = p + + new_pos = Point(pos.x + vel.x, pos.y + vel.y) + new_vel = Point(drag(vel.x), gravity(vel.y)) + + return Probe(new_pos, new_vel) + + while True: + yield (p := step(p)) + + def hits_target(probe: Probe, area: Area) -> bool: + # Too lazy to find an actual good condition on this loop, early break is enough + for p in trajectory(probe): + x, y = p.position + # Early exit when we cannot possibly get to the area + if y < area.min.y and p.velocity.y <= 0: + break + if x < area.min.x and p.velocity.x <= 0: + break + if x > area.max.x and p.velocity.x >= 0: + break + # Keep going if we're not in bounds + if x < area.min.x or x > area.max.x: + continue + if y < area.min.y or y > area.max.y: + continue + # We are in the area + return True + return False + + def find_velocities(area: Area) -> Iterator[Point]: + position = Point(0, 0) + assert area.min.y < 0 # Sanity check, due to lower bound in loop + + # Can't overshoot after a single step + for vx in range(0, area.max.x + 1): + # Can't overshoot after a single step, symmetric velocity when coming down + for vy in range(area.min.y, abs(area.min.y) + 1): + velocity = Point(vx, vy) + if hits_target(Probe(position, velocity), area): + yield velocity + + def highest_point(velocity: Point) -> Point: + # When the y velocity is negative, the height can only go down + of_interest = itertools.takewhile( + lambda p: p.velocity.y >= 0, trajectory(Probe(Point(0, 0), velocity)) + ) + points = [p.position for p in of_interest] + return max(points, key=lambda p: p.y, default=Point(0, 0)) + + target_area = parse(input[0]) + velocities = set(find_velocities(target_area)) + return max(highest_point(v).y for v in velocities) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 15d5b0ddad0a88f25458b59bfecc4fbd8a2ca3e7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 17 Dec 2021 17:38:32 +0100 Subject: [PATCH 237/479] 2021: d17: ex2: add input --- 2021/d17/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2021/d17/ex2/input diff --git a/2021/d17/ex2/input b/2021/d17/ex2/input new file mode 100644 index 0000000..791984a --- /dev/null +++ b/2021/d17/ex2/input @@ -0,0 +1 @@ +target area: x=79..137, y=-176..-117 From a34dccc5d6506a359ac815b7864222aca0296e8d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 17 Dec 2021 17:38:38 +0100 Subject: [PATCH 238/479] 2021: d17: ex2: add solution --- 2021/d17/ex2/ex2.py | 101 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100755 2021/d17/ex2/ex2.py diff --git a/2021/d17/ex2/ex2.py b/2021/d17/ex2/ex2.py new file mode 100755 index 0000000..bc7dab1 --- /dev/null +++ b/2021/d17/ex2/ex2.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python + +import sys +from typing import Iterator, List, NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class Probe(NamedTuple): + position: Point + velocity: Point + + +class Area(NamedTuple): + min: Point + max: Point + + +def solve(input: List[str]) -> int: + def parse(line: str) -> Area: + x_range = line.split("x=")[1].split(",")[0] + y_range = line.split("y=")[1] + + min_x, max_x = map(int, x_range.split("..")) + min_y, max_y = map(int, y_range.split("..")) + + # Sanity check + assert min_x <= max_x + assert min_y <= max_y + + return Area(Point(min_x, min_y), Point(max_x, max_y)) + + def trajectory(p: Probe) -> Iterator[Probe]: + def step(p: Probe) -> Probe: + def drag(x: int) -> int: + if x < 0: + return x + 1 + if x > 0: + return x - 1 + return 0 + + def gravity(y: int) -> int: + return y - 1 + + pos, vel = p + + new_pos = Point(pos.x + vel.x, pos.y + vel.y) + new_vel = Point(drag(vel.x), gravity(vel.y)) + + return Probe(new_pos, new_vel) + + while True: + yield (p := step(p)) + + def hits_target(probe: Probe, area: Area) -> bool: + # Too lazy to find an actual good condition on this loop, early break is enough + for p in trajectory(probe): + x, y = p.position + # Early exit when we cannot possibly get to the area + if y < area.min.y and p.velocity.y <= 0: + break + if x < area.min.x and p.velocity.x <= 0: + break + if x > area.max.x and p.velocity.x >= 0: + break + # Keep going if we're not in bounds + if x < area.min.x or x > area.max.x: + continue + if y < area.min.y or y > area.max.y: + continue + # We are in the area + return True + return False + + def find_velocities(area: Area) -> Iterator[Point]: + position = Point(0, 0) + assert area.min.y < 0 # Sanity check, due to lower bound in loop + + # Can't overshoot after a single step + for vx in range(0, area.max.x + 1): + # Can't overshoot after a single step, symmetric velocity when coming down + for vy in range(area.min.y, abs(area.min.y) + 1): + velocity = Point(vx, vy) + if hits_target(Probe(position, velocity), area): + yield velocity + + target_area = parse(input[0]) + velocities = set(find_velocities(target_area)) + return len(velocities) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 4f5357a38884f878dbb53e03afb096655fd19474 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 18 Dec 2021 16:05:30 +0100 Subject: [PATCH 239/479] 2021: d18: ex1: add input --- 2021/d18/ex1/input | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 2021/d18/ex1/input diff --git a/2021/d18/ex1/input b/2021/d18/ex1/input new file mode 100644 index 0000000..1dd0bc9 --- /dev/null +++ b/2021/d18/ex1/input @@ -0,0 +1,100 @@ +[[3,[8,[2,1]]],[[[0,6],[0,2]],3]] +[[[1,[8,5]],[[3,9],0]],2] +[5,[[5,[3,8]],[7,4]]] +[1,[[[0,4],[8,5]],6]] +[[[1,[0,3]],2],[2,[0,[7,9]]]] +[[[4,[4,4]],[[7,2],[7,1]]],9] +[5,[4,4]] +[[0,[[2,6],[8,9]]],[[4,5],2]] +[[[8,2],0],3] +[[9,0],[3,3]] +[[[[5,2],2],5],5] +[[[1,6],[[0,4],[7,7]]],[[1,4],[[6,5],5]]] +[[[[4,1],[4,1]],[2,[5,5]]],[1,[0,[0,6]]]] +[[[[1,5],1],[8,4]],[9,[3,4]]] +[[1,[3,3]],[[[7,4],[8,1]],2]] +[3,[[[2,1],4],[5,4]]] +[6,[[0,[1,9]],[[4,0],8]]] +[5,[7,[7,[8,8]]]] +[[[[6,2],[5,8]],[5,[3,1]]],[[7,9],[[2,0],6]]] +[[[7,[7,9]],[5,7]],[[[9,3],[6,9]],[[1,2],[2,3]]]] +[[[[4,1],2],[1,[6,6]]],[[[2,2],[8,8]],4]] +[[[[3,7],4],8],[6,[[0,2],3]]] +[[[[1,8],2],3],[[9,[1,7]],[[0,0],[6,8]]]] +[[[9,[5,2]],7],[[8,6],[8,[1,2]]]] +[[[7,[1,0]],[[6,0],[8,4]]],[[[7,8],5],[3,[1,2]]]] +[[[[2,5],9],[[8,2],0]],0] +[0,[[[7,5],[4,1]],[5,[6,6]]]] +[[[[3,6],2],[[1,1],[6,6]]],0] +[[[[0,9],[2,5]],[2,[3,2]]],[6,3]] +[3,[[9,[1,4]],[[0,8],[4,6]]]] +[1,[[5,[5,9]],[9,0]]] +[[[6,8],4],[[[6,6],2],[[3,9],2]]] +[5,[[[7,5],[4,8]],0]] +[[9,[6,6]],[9,[[6,8],[6,4]]]] +[[[4,8],[0,[2,8]]],[7,[[4,5],[1,6]]]] +[[[6,[8,6]],2],[[[2,9],[2,4]],[0,2]]] +[[[0,[5,6]],[[3,8],3]],[[3,1],7]] +[[1,[8,1]],[1,[6,[7,1]]]] +[[[5,[9,6]],[3,5]],2] +[[3,7],[[[2,5],[4,1]],[3,[5,6]]]] +[[8,7],[[9,6],3]] +[[[[4,2],[4,8]],[7,[4,5]]],2] +[[[[6,7],6],3],[[[6,7],4],0]] +[[[0,1],[[9,1],[2,9]]],9] +[[[[8,5],[5,8]],[0,7]],[0,[8,[3,2]]]] +[[4,[[6,5],[1,9]]],[[[0,0],1],6]] +[[[[9,5],9],[2,[6,3]]],[[2,9],[6,9]]] +[[[7,[5,0]],1],[7,[[8,7],3]]] +[[[2,4],2],[[[3,0],6],[[0,2],[9,2]]]] +[[1,[[7,3],[4,3]]],[[[3,9],[1,1]],[3,6]]] +[[[[4,7],7],[[7,1],[2,3]]],[1,[[7,6],[5,6]]]] +[[0,[5,2]],0] +[[[[6,6],[4,8]],8],[[0,[7,4]],8]] +[[4,[7,2]],[[[0,8],1],[9,5]]] +[0,0] +[[[[3,7],6],3],[3,[[3,3],1]]] +[[[6,5],7],[[3,5],[[6,4],[4,9]]]] +[[4,[[7,9],9]],9] +[5,[8,[[7,4],1]]] +[[[[2,4],[5,7]],8],[[[7,6],[6,9]],[[3,9],[6,4]]]] +[[[4,8],3],[[[3,9],7],0]] +[0,[8,[[4,2],3]]] +[[[[0,1],[5,8]],[7,2]],[2,4]] +[[6,[8,[1,9]]],[[[6,5],[8,1]],[7,[6,4]]]] +[[9,3],[5,[0,6]]] +[[2,[7,[2,0]]],[[2,1],[5,5]]] +[[[0,[7,0]],[[0,4],[4,9]]],[8,[[6,1],[6,3]]]] +[[[[5,7],[3,2]],[0,[5,0]]],[[0,[1,6]],3]] +[[[[6,3],[9,5]],[9,9]],[[5,[8,3]],[[0,0],[0,3]]]] +[[6,[4,9]],[[[9,9],[8,4]],4]] +[0,[2,5]] +[[[[7,9],[1,2]],[3,3]],[[[7,2],7],[[1,6],0]]] +[[[[8,0],2],8],[[[1,5],9],9]] +[[[0,[6,9]],4],[[[4,8],5],4]] +[[6,[[0,3],4]],[0,[[8,3],1]]] +[[[1,2],[2,[3,3]]],[6,7]] +[[0,[[7,4],5]],[3,[[8,2],0]]] +[[[[0,1],[1,7]],[[2,7],[5,9]]],[[[7,0],0],[8,1]]] +[[6,4],[3,0]] +[[[[6,6],4],[5,1]],[7,3]] +[[[[9,2],3],[8,[4,8]]],7] +[[5,[[2,2],[9,2]]],[[[1,8],0],[8,[6,3]]]] +[2,[[0,0],[0,[9,9]]]] +[[4,4],[[6,5],[6,5]]] +[[[[9,1],2],4],5] +[[[[2,1],[3,1]],[[2,6],9]],5] +[[[9,[0,6]],7],[[8,3],[[8,1],2]]] +[[[6,[0,0]],[2,[0,0]]],[[[0,4],8],3]] +[[[[4,1],[2,9]],[6,5]],3] +[[9,[[9,4],8]],[[[5,5],3],[[3,4],4]]] +[8,[9,[[0,3],1]]] +[9,[[[6,0],4],9]] +[[6,[2,9]],[[[2,7],[5,3]],0]] +[[[4,1],5],[8,[[0,7],4]]] +[[[[2,5],5],[[8,2],[8,9]]],[[9,6],[[0,3],[2,3]]]] +[6,1] +[[1,7],4] +[[8,7],0] +[[[[5,4],7],5],[[[6,1],5],[5,[5,5]]]] +[[[6,[1,5]],[0,[7,0]]],[[[1,5],3],[5,[1,0]]]] From 950af51d0d8b5d28123c1eeb7b318415878d712d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 18 Dec 2021 16:05:38 +0100 Subject: [PATCH 240/479] 2021: d18: ex1: add solution --- 2021/d18/ex1/ex1.py | 208 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 208 insertions(+) create mode 100755 2021/d18/ex1/ex1.py diff --git a/2021/d18/ex1/ex1.py b/2021/d18/ex1/ex1.py new file mode 100755 index 0000000..7a02746 --- /dev/null +++ b/2021/d18/ex1/ex1.py @@ -0,0 +1,208 @@ +#!/usr/bin/env python + +import functools +import itertools +import sys +from dataclasses import dataclass +from typing import Iterator, List, Optional, Tuple + + +@dataclass +class Tree: + parent: Optional["Pair"] + + +@dataclass +class Pair(Tree): + left: Tree + right: Tree + + +@dataclass +class Num(Tree): + val: int + + +# True means left, False means right +Path = List[bool] + + +def solve(input: List[str]) -> int: + def make_pair(left: Tree, right: Tree, parent: Optional[Pair] = None) -> Pair: + pair = Pair(parent=parent, left=left, right=right) + pair.left.parent = pair + pair.right.parent = pair + return pair + + def make_num(val: int, parent: Optional[Pair] = None) -> Num: + return Num(parent=parent, val=val) + + # FIXME: remove this + def debug(tree: Tree) -> str: + if isinstance(tree, Pair): + return f"[{debug(tree.left)},{debug(tree.right)}]" + assert isinstance(tree, Num) + return str(tree.val) + + def parse() -> List[Tree]: + def parse_snailfish_number(line: str) -> Tree: + def parse_index(input: str, index: int = 0) -> Tuple[int, Tree]: + if input[index] == "[": + left_index, left = parse_index(input, index + 1) + assert input[left_index] == "," # Sanity check + right_index, right = parse_index(input, left_index + 1) + assert input[right_index] == "]" # Sanity check + return right_index + 1, make_pair(left, right) + res = 0 + for i in itertools.count(index): + if i < len(input) and input[i] in set(str(i) for i in range(10)): + res = res * 10 + int(input[i]) + else: + return i, make_num(res) + assert False # Sanity check + + __, res = parse_index(line) + return res + + return [parse_snailfish_number(line) for line in input] + + def explosion_path(number: Tree) -> Optional[Path]: + def dfs(number: Pair, path: Path = []) -> Optional[Path]: + if ( + len(path) >= 4 + and isinstance(number.left, Num) + and isinstance(number.right, Num) + ): + return path + if isinstance(number.left, Pair): + left_path = dfs(number.left, path + [True]) + if left_path is not None: + return left_path + if isinstance(number.right, Pair): + right_path = dfs(number.right, path + [False]) + if right_path is not None: + return right_path + return None + + assert isinstance(number, Pair) # Sanity check + return dfs(number) + + def split_path(number: Tree) -> Optional[Path]: + def dfs(number: Pair, path: Path = []) -> Optional[Path]: + if isinstance(number.left, Num): + if number.left.val >= 10: + return path + [True] + else: + assert isinstance(number.left, Pair) # Sanity check + if (left_path := dfs(number.left, path + [True])) is not None: + return left_path + if isinstance(number.right, Num): + if number.right.val >= 10: + return path + [False] + else: + assert isinstance(number.right, Pair) # Sanity check + if (right_path := dfs(number.right, path + [False])) is not None: + return right_path + return None + + assert isinstance(number, Pair) # Sanity check + return dfs(number) + + def explode(number: Tree, path: Path) -> Tree: + def walk(number: Tree, reverse: bool) -> Iterator[Tree]: + if isinstance(number, Num): + yield number + else: + assert isinstance(number, Pair) # Sanity check + first, second = ( + (number.right, number.left) + if reverse + else (number.left, number.right) + ) + yield from walk(first, reverse) + yield number + yield from walk(second, reverse) + + def next_num(number: Tree, reverse: bool) -> Optional[Num]: + if number.parent is None: + return None + sibling = number.parent.left if reverse else number.parent.right + if number is sibling: + return next_num(number.parent, reverse) + for node in walk(sibling, reverse=reverse): + if isinstance(node, Num): + return node + return None + + assert isinstance(number, Pair) # Sanity check + + if len(path) == 0: + p, n = next_num(number, reverse=True), next_num(number, reverse=False) + if p is not None: + assert isinstance(number.left, Num) # Safety check + p.val += number.left.val + if n is not None: + assert isinstance(number.right, Num) # Safety check + n.val += number.right.val + return make_num(0) + + parent, left, right = number.parent, number.left, number.right + if path[0]: + left = explode(number.left, path[1:]) + else: + right = explode(number.right, path[1:]) + + return make_pair(parent=parent, left=left, right=right) + + def split(number: Tree, path: Path) -> Tree: + def split_int(num: int, parent: Optional[Pair]) -> Tree: + assert num >= 0 # Sanity check + left = num // 2 + right = num - left + res = make_pair(left=make_num(left), right=make_num(right), parent=parent) + return res + + if len(path) == 0: + assert isinstance(number, Num) # Sanity check + return split_int(number.val, number.parent) + + assert isinstance(number, Pair) # Sanity check + + parent, left, right = number.parent, number.left, number.right + if path[0]: + left = split(number.left, path[1:]) + else: + right = split(number.right, path[1:]) + + return make_pair(parent=parent, left=left, right=right) + + def reduce(number: Tree) -> Tree: + path = explosion_path(number) + if path is not None: + return reduce(explode(number, path)) + path = split_path(number) + if path is not None: + return reduce(split(number, path)) + return number + + def add(left: Tree, right: Tree) -> Tree: + return reduce(make_pair(left=left, right=right)) + + def magnitude(number: Tree) -> int: + if isinstance(number, Num): + return number.val + assert isinstance(number, Pair) # Safety check + return 3 * magnitude(number.left) + 2 * magnitude(number.right) + + numbers = parse() + result = functools.reduce(add, numbers) + return magnitude(result) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 61d721c57eec37ddcf26bde96609ab6cfebd4dc3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 18 Dec 2021 16:05:48 +0100 Subject: [PATCH 241/479] 2021: d18: ex2: add input --- 2021/d18/ex2/input | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 2021/d18/ex2/input diff --git a/2021/d18/ex2/input b/2021/d18/ex2/input new file mode 100644 index 0000000..1dd0bc9 --- /dev/null +++ b/2021/d18/ex2/input @@ -0,0 +1,100 @@ +[[3,[8,[2,1]]],[[[0,6],[0,2]],3]] +[[[1,[8,5]],[[3,9],0]],2] +[5,[[5,[3,8]],[7,4]]] +[1,[[[0,4],[8,5]],6]] +[[[1,[0,3]],2],[2,[0,[7,9]]]] +[[[4,[4,4]],[[7,2],[7,1]]],9] +[5,[4,4]] +[[0,[[2,6],[8,9]]],[[4,5],2]] +[[[8,2],0],3] +[[9,0],[3,3]] +[[[[5,2],2],5],5] +[[[1,6],[[0,4],[7,7]]],[[1,4],[[6,5],5]]] +[[[[4,1],[4,1]],[2,[5,5]]],[1,[0,[0,6]]]] +[[[[1,5],1],[8,4]],[9,[3,4]]] +[[1,[3,3]],[[[7,4],[8,1]],2]] +[3,[[[2,1],4],[5,4]]] +[6,[[0,[1,9]],[[4,0],8]]] +[5,[7,[7,[8,8]]]] +[[[[6,2],[5,8]],[5,[3,1]]],[[7,9],[[2,0],6]]] +[[[7,[7,9]],[5,7]],[[[9,3],[6,9]],[[1,2],[2,3]]]] +[[[[4,1],2],[1,[6,6]]],[[[2,2],[8,8]],4]] +[[[[3,7],4],8],[6,[[0,2],3]]] +[[[[1,8],2],3],[[9,[1,7]],[[0,0],[6,8]]]] +[[[9,[5,2]],7],[[8,6],[8,[1,2]]]] +[[[7,[1,0]],[[6,0],[8,4]]],[[[7,8],5],[3,[1,2]]]] +[[[[2,5],9],[[8,2],0]],0] +[0,[[[7,5],[4,1]],[5,[6,6]]]] +[[[[3,6],2],[[1,1],[6,6]]],0] +[[[[0,9],[2,5]],[2,[3,2]]],[6,3]] +[3,[[9,[1,4]],[[0,8],[4,6]]]] +[1,[[5,[5,9]],[9,0]]] +[[[6,8],4],[[[6,6],2],[[3,9],2]]] +[5,[[[7,5],[4,8]],0]] +[[9,[6,6]],[9,[[6,8],[6,4]]]] +[[[4,8],[0,[2,8]]],[7,[[4,5],[1,6]]]] +[[[6,[8,6]],2],[[[2,9],[2,4]],[0,2]]] +[[[0,[5,6]],[[3,8],3]],[[3,1],7]] +[[1,[8,1]],[1,[6,[7,1]]]] +[[[5,[9,6]],[3,5]],2] +[[3,7],[[[2,5],[4,1]],[3,[5,6]]]] +[[8,7],[[9,6],3]] +[[[[4,2],[4,8]],[7,[4,5]]],2] +[[[[6,7],6],3],[[[6,7],4],0]] +[[[0,1],[[9,1],[2,9]]],9] +[[[[8,5],[5,8]],[0,7]],[0,[8,[3,2]]]] +[[4,[[6,5],[1,9]]],[[[0,0],1],6]] +[[[[9,5],9],[2,[6,3]]],[[2,9],[6,9]]] +[[[7,[5,0]],1],[7,[[8,7],3]]] +[[[2,4],2],[[[3,0],6],[[0,2],[9,2]]]] +[[1,[[7,3],[4,3]]],[[[3,9],[1,1]],[3,6]]] +[[[[4,7],7],[[7,1],[2,3]]],[1,[[7,6],[5,6]]]] +[[0,[5,2]],0] +[[[[6,6],[4,8]],8],[[0,[7,4]],8]] +[[4,[7,2]],[[[0,8],1],[9,5]]] +[0,0] +[[[[3,7],6],3],[3,[[3,3],1]]] +[[[6,5],7],[[3,5],[[6,4],[4,9]]]] +[[4,[[7,9],9]],9] +[5,[8,[[7,4],1]]] +[[[[2,4],[5,7]],8],[[[7,6],[6,9]],[[3,9],[6,4]]]] +[[[4,8],3],[[[3,9],7],0]] +[0,[8,[[4,2],3]]] +[[[[0,1],[5,8]],[7,2]],[2,4]] +[[6,[8,[1,9]]],[[[6,5],[8,1]],[7,[6,4]]]] +[[9,3],[5,[0,6]]] +[[2,[7,[2,0]]],[[2,1],[5,5]]] +[[[0,[7,0]],[[0,4],[4,9]]],[8,[[6,1],[6,3]]]] +[[[[5,7],[3,2]],[0,[5,0]]],[[0,[1,6]],3]] +[[[[6,3],[9,5]],[9,9]],[[5,[8,3]],[[0,0],[0,3]]]] +[[6,[4,9]],[[[9,9],[8,4]],4]] +[0,[2,5]] +[[[[7,9],[1,2]],[3,3]],[[[7,2],7],[[1,6],0]]] +[[[[8,0],2],8],[[[1,5],9],9]] +[[[0,[6,9]],4],[[[4,8],5],4]] +[[6,[[0,3],4]],[0,[[8,3],1]]] +[[[1,2],[2,[3,3]]],[6,7]] +[[0,[[7,4],5]],[3,[[8,2],0]]] +[[[[0,1],[1,7]],[[2,7],[5,9]]],[[[7,0],0],[8,1]]] +[[6,4],[3,0]] +[[[[6,6],4],[5,1]],[7,3]] +[[[[9,2],3],[8,[4,8]]],7] +[[5,[[2,2],[9,2]]],[[[1,8],0],[8,[6,3]]]] +[2,[[0,0],[0,[9,9]]]] +[[4,4],[[6,5],[6,5]]] +[[[[9,1],2],4],5] +[[[[2,1],[3,1]],[[2,6],9]],5] +[[[9,[0,6]],7],[[8,3],[[8,1],2]]] +[[[6,[0,0]],[2,[0,0]]],[[[0,4],8],3]] +[[[[4,1],[2,9]],[6,5]],3] +[[9,[[9,4],8]],[[[5,5],3],[[3,4],4]]] +[8,[9,[[0,3],1]]] +[9,[[[6,0],4],9]] +[[6,[2,9]],[[[2,7],[5,3]],0]] +[[[4,1],5],[8,[[0,7],4]]] +[[[[2,5],5],[[8,2],[8,9]]],[[9,6],[[0,3],[2,3]]]] +[6,1] +[[1,7],4] +[[8,7],0] +[[[[5,4],7],5],[[[6,1],5],[5,[5,5]]]] +[[[6,[1,5]],[0,[7,0]]],[[[1,5],3],[5,[1,0]]]] From a33665b45966e6421c26d20add19eef884c35992 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 18 Dec 2021 16:05:53 +0100 Subject: [PATCH 242/479] 2021: d18: ex2: add solution --- 2021/d18/ex2/ex2.py | 210 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100755 2021/d18/ex2/ex2.py diff --git a/2021/d18/ex2/ex2.py b/2021/d18/ex2/ex2.py new file mode 100755 index 0000000..c0a37a7 --- /dev/null +++ b/2021/d18/ex2/ex2.py @@ -0,0 +1,210 @@ +#!/usr/bin/env python + +import itertools +import sys +from copy import deepcopy +from dataclasses import dataclass +from typing import Iterator, List, Optional, Tuple + + +@dataclass +class Tree: + parent: Optional["Pair"] + + +@dataclass +class Pair(Tree): + left: Tree + right: Tree + + +@dataclass +class Num(Tree): + val: int + + +# True means left, False means right +Path = List[bool] + + +def solve(input: List[str]) -> int: + def make_pair(left: Tree, right: Tree, parent: Optional[Pair] = None) -> Pair: + pair = Pair(parent=parent, left=left, right=right) + pair.left.parent = pair + pair.right.parent = pair + return pair + + def make_num(val: int, parent: Optional[Pair] = None) -> Num: + return Num(parent=parent, val=val) + + # FIXME: remove this + def debug(tree: Tree) -> str: + if isinstance(tree, Pair): + return f"[{debug(tree.left)},{debug(tree.right)}]" + assert isinstance(tree, Num) + return str(tree.val) + + def parse() -> List[Tree]: + def parse_snailfish_number(line: str) -> Tree: + def parse_index(input: str, index: int = 0) -> Tuple[int, Tree]: + if input[index] == "[": + left_index, left = parse_index(input, index + 1) + assert input[left_index] == "," # Sanity check + right_index, right = parse_index(input, left_index + 1) + assert input[right_index] == "]" # Sanity check + return right_index + 1, make_pair(left, right) + res = 0 + for i in itertools.count(index): + if i < len(input) and input[i] in set(str(i) for i in range(10)): + res = res * 10 + int(input[i]) + else: + return i, make_num(res) + assert False # Sanity check + + __, res = parse_index(line) + return res + + return [parse_snailfish_number(line) for line in input] + + def explosion_path(number: Tree) -> Optional[Path]: + def dfs(number: Pair, path: Path = []) -> Optional[Path]: + if ( + len(path) >= 4 + and isinstance(number.left, Num) + and isinstance(number.right, Num) + ): + return path + if isinstance(number.left, Pair): + left_path = dfs(number.left, path + [True]) + if left_path is not None: + return left_path + if isinstance(number.right, Pair): + right_path = dfs(number.right, path + [False]) + if right_path is not None: + return right_path + return None + + assert isinstance(number, Pair) # Sanity check + return dfs(number) + + def split_path(number: Tree) -> Optional[Path]: + def dfs(number: Pair, path: Path = []) -> Optional[Path]: + if isinstance(number.left, Num): + if number.left.val >= 10: + return path + [True] + else: + assert isinstance(number.left, Pair) # Sanity check + if (left_path := dfs(number.left, path + [True])) is not None: + return left_path + if isinstance(number.right, Num): + if number.right.val >= 10: + return path + [False] + else: + assert isinstance(number.right, Pair) # Sanity check + if (right_path := dfs(number.right, path + [False])) is not None: + return right_path + return None + + assert isinstance(number, Pair) # Sanity check + return dfs(number) + + def explode(number: Tree, path: Path) -> Tree: + def walk(number: Tree, reverse: bool) -> Iterator[Tree]: + if isinstance(number, Num): + yield number + else: + assert isinstance(number, Pair) # Sanity check + first, second = ( + (number.right, number.left) + if reverse + else (number.left, number.right) + ) + yield from walk(first, reverse) + yield number + yield from walk(second, reverse) + + def next_num(number: Tree, reverse: bool) -> Optional[Num]: + if number.parent is None: + return None + sibling = number.parent.left if reverse else number.parent.right + if number is sibling: + return next_num(number.parent, reverse) + for node in walk(sibling, reverse=reverse): + if isinstance(node, Num): + return node + return None + + assert isinstance(number, Pair) # Sanity check + + if len(path) == 0: + p, n = next_num(number, reverse=True), next_num(number, reverse=False) + if p is not None: + assert isinstance(number.left, Num) # Safety check + p.val += number.left.val + if n is not None: + assert isinstance(number.right, Num) # Safety check + n.val += number.right.val + return make_num(0) + + parent, left, right = number.parent, number.left, number.right + if path[0]: + left = explode(number.left, path[1:]) + else: + right = explode(number.right, path[1:]) + + return make_pair(parent=parent, left=left, right=right) + + def split(number: Tree, path: Path) -> Tree: + def split_int(num: int, parent: Optional[Pair]) -> Tree: + assert num >= 0 # Sanity check + left = num // 2 + right = num - left + res = make_pair(left=make_num(left), right=make_num(right), parent=parent) + return res + + if len(path) == 0: + assert isinstance(number, Num) # Sanity check + return split_int(number.val, number.parent) + + assert isinstance(number, Pair) # Sanity check + + parent, left, right = number.parent, number.left, number.right + if path[0]: + left = split(number.left, path[1:]) + else: + right = split(number.right, path[1:]) + + return make_pair(parent=parent, left=left, right=right) + + def reduce(number: Tree) -> Tree: + path = explosion_path(number) + if path is not None: + return reduce(explode(number, path)) + path = split_path(number) + if path is not None: + return reduce(split(number, path)) + return number + + def add(left: Tree, right: Tree) -> Tree: + return reduce(make_pair(left=left, right=right)) + + def magnitude(number: Tree) -> int: + if isinstance(number, Num): + return number.val + assert isinstance(number, Pair) # Safety check + return 3 * magnitude(number.left) + 2 * magnitude(number.right) + + numbers = parse() + return max( + magnitude(add(deepcopy(l), deepcopy(r))) + for l, r in itertools.permutations(numbers, 2) + ) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 45d595465991a34f2825e5ce789646f0130e551a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 19 Dec 2021 14:23:16 +0100 Subject: [PATCH 243/479] 2021: d19: ex1: add input --- 2021/d19/ex1/input | 778 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 778 insertions(+) create mode 100644 2021/d19/ex1/input diff --git a/2021/d19/ex1/input b/2021/d19/ex1/input new file mode 100644 index 0000000..56c93b8 --- /dev/null +++ b/2021/d19/ex1/input @@ -0,0 +1,778 @@ +--- scanner 0 --- +712,493,-580 +-705,-746,944 +-468,-742,927 +-906,-760,-387 +523,612,505 +-973,425,-333 +361,-777,-655 +-172,-143,-8 +403,-606,-574 +-655,761,677 +-670,-738,898 +459,511,-563 +713,-623,478 +-605,714,848 +-18,-8,104 +510,641,739 +-991,515,-523 +556,559,577 +709,-678,647 +789,-632,517 +-976,-761,-391 +-966,491,-435 +-611,679,810 +383,-654,-565 +641,491,-564 +-790,-798,-400 + +--- scanner 1 --- +-286,612,-671 +550,-491,494 +-344,-303,619 +487,-410,518 +973,-373,-692 +110,31,-17 +662,607,-702 +983,-337,-801 +-550,671,606 +-466,-293,710 +793,650,-662 +-506,595,519 +-294,-768,-699 +444,-519,645 +-312,599,-535 +-464,-304,529 +489,802,531 +438,778,402 +831,-342,-707 +-542,513,494 +-301,621,-550 +-445,-677,-708 +560,846,460 +-293,-724,-739 +638,590,-629 + +--- scanner 2 --- +-635,-463,-706 +896,-619,679 +647,295,757 +797,-608,645 +-270,-724,575 +-493,485,466 +-340,466,-635 +931,-698,684 +624,689,-597 +584,235,861 +411,-511,-238 +-577,670,452 +592,614,-699 +69,3,116 +469,-472,-403 +-762,-440,-769 +562,-473,-299 +-426,448,-617 +670,355,931 +683,528,-588 +-378,-620,578 +-535,525,-608 +-6,-191,36 +-647,-428,-727 +-454,-713,576 +-458,625,481 + +--- scanner 3 --- +438,-559,589 +-590,703,724 +451,970,-584 +657,488,518 +620,-539,588 +569,-409,-714 +-654,-497,546 +506,893,-703 +367,-557,605 +-760,743,-517 +299,925,-664 +-802,-444,601 +-760,797,-413 +523,-491,-552 +520,525,466 +47,174,-89 +-554,-293,-909 +-699,577,686 +-563,-244,-847 +710,529,430 +556,-438,-480 +-61,65,25 +-577,-242,-690 +-807,795,-448 +-601,599,763 +-846,-494,561 + +--- scanner 4 --- +519,654,-940 +723,-779,431 +512,259,327 +-614,322,-479 +-1,-73,-119 +807,-942,-373 +410,690,-950 +-660,-720,-524 +-889,427,353 +-582,-558,474 +-505,385,-481 +-827,536,391 +-549,416,-405 +735,-539,388 +638,-629,470 +-609,-834,-559 +472,303,326 +-636,-659,521 +-833,511,409 +-711,-721,-586 +745,-941,-451 +503,350,478 +504,685,-798 +-532,-659,336 +813,-874,-376 + +--- scanner 5 --- +637,-351,-454 +820,833,-269 +487,-374,703 +-451,-657,828 +766,726,370 +-109,-27,-55 +-452,-602,760 +526,-342,910 +833,757,-477 +-647,-678,769 +689,-411,-450 +-845,657,-682 +-560,535,563 +-468,403,553 +6,111,87 +718,-486,-416 +-664,-436,-479 +771,843,-494 +-655,-530,-493 +772,807,513 +672,815,457 +-717,-428,-587 +-797,629,-713 +606,-297,758 +-433,544,520 +-699,752,-723 + +--- scanner 6 --- +-712,-426,681 +398,-239,-616 +-866,737,603 +787,581,-421 +-624,425,-698 +660,636,788 +-641,478,-670 +-855,410,-685 +54,176,135 +-496,-215,-283 +889,500,-360 +479,-258,-539 +765,483,789 +699,635,723 +819,-682,528 +-691,-319,832 +413,-316,-666 +-865,873,502 +-400,-297,-214 +-411,-257,-391 +47,-11,-7 +908,714,-409 +739,-634,430 +-589,-300,721 +-806,911,549 +746,-579,435 + +--- scanner 7 --- +-748,-520,456 +850,883,-684 +720,-714,-439 +734,-633,-369 +892,871,-799 +829,848,-672 +-452,587,-307 +409,-653,665 +422,838,525 +421,-494,564 +-522,703,760 +-724,-450,600 +761,-674,-597 +-356,-656,-802 +-455,691,-415 +-561,613,894 +-321,-533,-753 +526,839,432 +361,800,374 +391,-623,659 +-49,101,-52 +-453,598,-491 +-711,-374,399 +-556,692,859 +90,-64,7 +-445,-561,-815 + +--- scanner 8 --- +711,-456,-414 +290,-741,546 +381,736,-240 +-404,-352,-609 +-512,-394,-694 +-386,-749,593 +-466,-745,599 +-616,687,954 +542,637,568 +352,-724,460 +629,585,653 +560,-563,-393 +303,-949,470 +70,-14,46 +482,600,-239 +-436,-781,432 +-107,31,169 +600,-437,-516 +428,774,-299 +-806,273,-250 +-819,288,-481 +-709,762,937 +-335,-434,-705 +519,574,718 +-791,341,-464 +-669,741,851 + +--- scanner 9 --- +658,667,348 +-507,-411,-746 +489,722,344 +132,158,41 +624,-673,-878 +-644,568,696 +652,-735,-754 +-370,-679,656 +528,713,268 +747,-722,-843 +535,-741,347 +-522,974,-638 +-563,739,654 +-454,-708,560 +456,-673,284 +-600,-335,-744 +-438,-676,659 +-496,-227,-747 +541,680,-475 +639,-751,276 +-554,691,674 +-612,840,-677 +-601,939,-643 +79,50,-113 +611,536,-451 +465,479,-488 + +--- scanner 10 --- +832,700,-495 +-400,854,718 +-24,73,89 +-588,544,-742 +-529,703,-780 +771,-593,-458 +-621,-815,623 +883,676,-366 +877,-621,-609 +528,548,698 +-496,849,685 +-454,-751,-758 +761,744,-424 +683,488,665 +-492,-693,-669 +834,-512,-482 +-335,755,724 +659,505,738 +-806,-766,645 +490,-444,743 +-688,-774,667 +338,-439,837 +-567,601,-646 +-401,-780,-593 +348,-475,728 +66,-68,8 + +--- scanner 11 --- +557,487,481 +-411,-305,476 +-729,705,812 +544,489,-731 +581,-542,-442 +-773,838,730 +-916,955,-691 +-594,-372,-747 +430,444,590 +673,438,-707 +581,550,562 +469,-550,-600 +556,-506,-524 +-31,6,77 +-139,144,-41 +-418,-407,542 +-408,-363,-710 +615,560,-775 +-679,972,-695 +546,-464,375 +-779,876,765 +-478,-359,-709 +456,-344,374 +365,-466,364 +-714,926,-687 +-393,-495,566 + +--- scanner 12 --- +-554,440,781 +620,-665,578 +-484,464,637 +-432,-355,595 +-100,114,-60 +567,665,-581 +658,632,378 +579,627,343 +669,666,477 +-459,-545,-640 +701,-707,749 +-826,574,-834 +-531,-512,-587 +626,-356,-521 +609,-609,-539 +-888,565,-785 +-693,-558,-669 +622,813,-634 +610,-427,-519 +-13,-13,73 +-471,-279,604 +582,857,-584 +-408,477,838 +-669,588,-836 +611,-685,626 +-601,-359,650 + +--- scanner 13 --- +-607,351,-484 +120,23,-52 +454,-521,-469 +841,462,484 +-704,-386,498 +555,817,-561 +-601,431,-488 +-494,549,769 +-768,401,-452 +514,-469,-465 +-492,515,851 +-712,-486,442 +882,550,537 +589,-440,-431 +400,-552,743 +-730,-338,-284 +606,807,-499 +613,750,-424 +-623,-392,355 +845,498,674 +445,-632,895 +-22,-18,68 +-580,552,764 +477,-671,688 +-740,-387,-509 +-654,-325,-492 + +--- scanner 14 --- +695,-578,-741 +-525,-524,908 +627,579,740 +760,-659,787 +-518,-492,-772 +-669,412,783 +756,501,-366 +821,452,-499 +-559,-362,-779 +670,538,749 +-765,875,-491 +710,-615,897 +-139,20,128 +-704,858,-677 +-534,-604,881 +-880,846,-640 +-743,467,748 +705,658,678 +719,447,-365 +774,-787,907 +-573,-549,798 +9,95,-35 +-465,-311,-776 +-654,460,634 +596,-658,-757 +626,-617,-560 + +--- scanner 15 --- +661,511,-766 +458,-453,788 +-435,-460,692 +-325,-841,-621 +643,528,-513 +454,-559,864 +663,527,-695 +685,-911,-473 +-469,-391,561 +-421,650,-613 +-393,-890,-656 +-384,598,-476 +-653,398,485 +-319,-403,608 +-425,686,-423 +506,-909,-564 +663,656,912 +-660,341,560 +729,758,919 +560,-506,926 +639,568,937 +-18,-10,58 +-711,331,622 +-326,-876,-486 +506,-913,-537 + +--- scanner 16 --- +-443,-656,375 +499,-609,-905 +-788,-254,-779 +757,881,-622 +505,-605,-825 +338,-641,-855 +-799,-294,-956 +-558,481,-500 +550,-485,523 +-533,840,544 +-454,-767,309 +860,827,-675 +-575,428,-472 +360,668,836 +-513,730,479 +506,685,731 +-703,-212,-887 +-344,413,-485 +364,629,768 +-532,687,522 +843,902,-582 +562,-418,704 +-460,-772,334 +-108,116,-53 +564,-498,642 + +--- scanner 17 --- +-779,-922,-822 +707,-737,-658 +-353,566,475 +29,-40,-85 +522,297,-805 +631,-650,-614 +-449,566,520 +-505,714,-477 +-468,538,-465 +521,227,-801 +-780,-885,-876 +-710,-766,541 +-646,-987,-871 +789,-762,-622 +849,512,744 +-415,618,312 +560,-718,631 +748,471,588 +836,396,648 +587,-774,579 +-781,-865,647 +521,-732,401 +-654,599,-448 +484,413,-792 +-757,-725,746 + +--- scanner 18 --- +588,452,452 +696,-717,478 +-592,750,399 +720,557,-881 +-919,-583,750 +487,440,611 +627,453,-880 +-99,159,-27 +392,-491,-745 +-485,892,365 +258,-530,-655 +-719,-344,-698 +-647,440,-786 +-669,-300,-658 +-483,732,303 +293,-525,-734 +778,392,-842 +-870,-592,812 +-666,-492,-643 +753,-680,332 +-655,528,-780 +-564,389,-761 +-40,0,-148 +552,-693,408 +493,422,581 +-921,-569,593 + +--- scanner 19 --- +642,-674,-824 +-308,502,851 +-241,-283,729 +-655,743,-775 +-4,173,16 +176,-21,8 +594,-607,443 +-230,440,852 +621,744,-440 +520,-583,-814 +470,735,-349 +-360,-249,678 +640,-493,-813 +-797,728,-744 +639,-574,362 +469,775,-393 +531,512,449 +613,609,539 +-311,-482,-707 +574,524,689 +-374,-458,-626 +777,-571,440 +-233,434,784 +-391,-259,664 +-807,837,-780 +-268,-609,-598 + +--- scanner 20 --- +131,165,-117 +-691,728,707 +-657,524,-685 +-575,-348,-621 +805,543,456 +10,-6,-166 +439,-390,620 +-663,436,-693 +935,-596,-470 +474,-343,618 +-698,-560,526 +-660,-451,400 +-535,-304,-671 +873,-587,-421 +522,746,-748 +426,728,-857 +698,559,303 +-639,732,574 +543,-390,566 +-638,385,-776 +-688,704,525 +711,524,452 +-520,-496,-674 +488,888,-855 +-737,-549,422 +716,-573,-419 + +--- scanner 21 --- +-696,-367,959 +573,-537,-825 +862,-826,707 +-803,630,451 +-616,332,-658 +877,-813,938 +-616,-875,-583 +-662,-818,-516 +376,421,889 +10,-124,158 +651,660,-577 +809,-798,724 +804,661,-682 +706,-549,-704 +-763,545,463 +414,374,948 +-786,-498,923 +-873,714,446 +-673,-745,-566 +550,475,949 +-614,420,-709 +-33,21,30 +-650,-481,895 +-655,443,-679 +652,595,-616 +787,-488,-806 + +--- scanner 22 --- +64,81,54 +-633,524,-715 +-680,-850,-309 +-663,372,613 +-848,-812,430 +788,-328,-489 +842,-431,-542 +738,-714,669 +863,-345,-582 +-640,-736,417 +-648,-689,-259 +-571,473,-725 +569,758,-411 +-623,-822,479 +-701,507,532 +927,523,543 +917,537,574 +602,839,-456 +122,-68,153 +893,472,424 +605,761,-594 +-708,531,-658 +-644,-683,-339 +675,-564,646 +-667,432,561 +686,-629,756 + +--- scanner 23 --- +-489,640,-740 +-739,-813,720 +399,-469,534 +-451,424,514 +-864,-439,-801 +-865,-385,-764 +-458,554,473 +436,-460,348 +451,875,619 +439,341,-733 +546,-647,-529 +-454,373,420 +622,-603,-616 +704,-639,-641 +455,858,856 +437,-456,418 +-473,720,-641 +415,392,-604 +459,829,654 +-590,-784,835 +-553,-796,659 +5,-29,20 +371,463,-675 +-670,679,-671 +-731,-390,-866 + +--- scanner 24 --- +479,813,605 +-421,-402,-375 +444,851,599 +-48,139,125 +-748,529,574 +105,11,84 +647,-560,-465 +-862,612,-634 +546,508,-529 +-785,731,-579 +667,-561,-647 +643,-520,985 +-656,-747,608 +-808,581,578 +-707,-757,670 +733,-330,967 +397,680,649 +-380,-490,-428 +665,-577,-718 +667,-432,960 +517,742,-516 +-417,-438,-565 +-649,-690,533 +-817,692,-786 +599,580,-562 +-673,500,540 + +--- scanner 25 --- +-587,-880,-854 +774,-772,-664 +-665,449,-801 +399,-948,578 +-368,-666,714 +693,243,629 +953,479,-759 +-494,391,634 +963,465,-790 +704,325,429 +929,414,-909 +-812,-870,-903 +442,-751,549 +559,322,560 +-588,493,572 +-604,-794,-916 +155,34,-112 +711,-622,-687 +-399,-694,762 +722,-687,-577 +-358,-789,616 +26,-59,-17 +-631,374,-772 +404,-719,583 +-627,314,-720 +-602,399,581 + +--- scanner 26 --- +-537,-661,-554 +-494,-780,790 +659,-817,588 +784,-534,-350 +-498,-840,738 +725,-513,-546 +609,514,811 +596,485,577 +-569,365,639 +-458,481,-780 +-631,-763,-616 +33,-53,121 +-66,64,-29 +564,545,-271 +596,614,-439 +-523,-755,-563 +-525,447,506 +-550,528,-756 +-460,-705,819 +-656,535,-823 +714,-894,707 +518,578,-478 +866,-849,627 +716,-589,-351 +642,567,739 +-519,412,468 + +--- scanner 27 --- +-85,-16,64 +418,478,-378 +-513,623,709 +814,736,845 +-632,-710,-855 +557,-666,-807 +-594,452,667 +-556,252,-630 +-592,-760,-811 +-604,-645,429 +-588,-647,358 +783,728,850 +-647,-707,-663 +52,-66,-100 +849,608,807 +-603,500,687 +-635,217,-625 +834,-623,651 +358,501,-552 +836,-802,587 +298,564,-448 +746,-733,-810 +609,-713,-817 +832,-802,560 +-605,-665,611 +-120,-179,-120 +-545,351,-664 From da2a08ffbe1afb7bdfc69e64e37601700a5c9896 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 19 Dec 2021 14:23:21 +0100 Subject: [PATCH 244/479] 2021: d19: ex1: add solution --- 2021/d19/ex1/ex1.py | 167 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100755 2021/d19/ex1/ex1.py diff --git a/2021/d19/ex1/ex1.py b/2021/d19/ex1/ex1.py new file mode 100755 index 0000000..e42af3c --- /dev/null +++ b/2021/d19/ex1/ex1.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python + +import itertools +import sys +from dataclasses import dataclass +from typing import List, Optional, Set, Tuple + + +@dataclass(eq=True, frozen=True) # Hash-able +class Vector: + x: int + y: int + z: int + + def __add__(self, other: "Vector") -> "Vector": + return Vector(self.x + other.x, self.y + other.y, self.z + other.z) + + def __sub__(self, other: "Vector") -> "Vector": + return Vector(self.x - other.x, self.y - other.y, self.z - other.z) + + +@dataclass(eq=True, frozen=True) # Hash-able +class Matrix: + v1: Vector + v2: Vector + v3: Vector + + def __matmul__(self, other: Vector) -> Vector: + return Vector( + self.v1.x * other.x + self.v1.y * other.y + self.v1.z * other.z, + self.v2.x * other.x + self.v2.y * other.y + self.v2.z * other.z, + self.v3.x * other.x + self.v3.y * other.y + self.v3.z * other.z, + ) + + +def rotations() -> List[Matrix]: + def cos(angle: int) -> int: + if angle == 0: + return 1 + if angle == 180: + return -1 + assert angle in (90, 270) # Sanity check + return 0 + + def sin(angle: int) -> int: + if angle == 90: + return 1 + if angle == 270: + return -1 + assert angle in (0, 180) # Sanity check + return 0 + + def rotate(x: int, y: int, z: int) -> Matrix: + v1 = Vector( + cos(z) * cos(y), + cos(z) * sin(y) * sin(x) - sin(z) * cos(x), + cos(z) * sin(y) * cos(x) + sin(z) * sin(x), + ) + v2 = Vector( + sin(z) * cos(y), + sin(z) * sin(y) * sin(x) + cos(z) * cos(x), + sin(z) * sin(y) * cos(x) - cos(z) * sin(x), + ) + v3 = Vector(-sin(y), cos(y) * sin(x), cos(y) * cos(x)) + return Matrix(v1, v2, v3) + + return [ + rotate(0, 0, 0), + rotate(90, 0, 0), + rotate(180, 0, 0), + rotate(270, 0, 0), + rotate(0, 90, 0), + rotate(90, 90, 0), + rotate(180, 90, 0), + rotate(270, 90, 0), + rotate(0, 180, 0), + rotate(90, 180, 0), + rotate(180, 180, 0), + rotate(270, 180, 0), + rotate(0, 270, 0), + rotate(90, 270, 0), + rotate(180, 270, 0), + rotate(270, 270, 0), + rotate(0, 0, 90), + rotate(90, 0, 90), + rotate(180, 0, 90), + rotate(270, 0, 90), + rotate(0, 0, 270), + rotate(90, 0, 270), + rotate(180, 0, 270), + rotate(270, 0, 270), + ] + + +ROTATIONS = rotations() + +BeaconList = Set[Vector] + + +def solve(input: List[str]) -> int: + def parse() -> List[BeaconList]: + res: List[BeaconList] = [] + + for line in input: + if "scanner" in line: + res.append(set()) + continue + if line == "": + continue + x, y, z = map(int, line.split(",")) + res[-1].add(Vector(x, y, z)) + + return res + + def find_overlap( + known: BeaconList, other: BeaconList + ) -> Optional[Tuple[Matrix, Vector]]: + def find_delta(known: BeaconList, other: BeaconList) -> Optional[Vector]: + for dest, source in itertools.product(known, rotated): + delta = dest - source + if sum((v + delta) in known for v in rotated) >= 12: + return delta + return None + + for r in ROTATIONS: + rotated = set(r @ v for v in other) + if (delta := find_delta(known, rotated)) is not None: + return r, delta + + return None + + def apply(known: BeaconList, other: BeaconList) -> Tuple[bool, BeaconList]: + res = find_overlap(known, other) + if res is None: + return False, known + + rot, delta = res + + new = {(rot @ v) + delta for v in other} + + # Return whether there are new points in the set + return not (new <= known), (known | new) + + def match_all(scans: List[BeaconList]) -> BeaconList: + # First scan is our basis + known = scans[0] + # No need to inspect the first scan in the future + to_match = scans[1:] + + while to_match: + s = to_match.pop(0) + applied, known = apply(known, s) + if not applied: + to_match.append(s) + return known + + beacons = parse() + return len(match_all(beacons)) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From ab3bbd0005ad46910eb822860ede81a2b79c314b Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 19 Dec 2021 14:23:30 +0100 Subject: [PATCH 245/479] 2021: d19: ex2: add input --- 2021/d19/ex2/input | 778 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 778 insertions(+) create mode 100644 2021/d19/ex2/input diff --git a/2021/d19/ex2/input b/2021/d19/ex2/input new file mode 100644 index 0000000..56c93b8 --- /dev/null +++ b/2021/d19/ex2/input @@ -0,0 +1,778 @@ +--- scanner 0 --- +712,493,-580 +-705,-746,944 +-468,-742,927 +-906,-760,-387 +523,612,505 +-973,425,-333 +361,-777,-655 +-172,-143,-8 +403,-606,-574 +-655,761,677 +-670,-738,898 +459,511,-563 +713,-623,478 +-605,714,848 +-18,-8,104 +510,641,739 +-991,515,-523 +556,559,577 +709,-678,647 +789,-632,517 +-976,-761,-391 +-966,491,-435 +-611,679,810 +383,-654,-565 +641,491,-564 +-790,-798,-400 + +--- scanner 1 --- +-286,612,-671 +550,-491,494 +-344,-303,619 +487,-410,518 +973,-373,-692 +110,31,-17 +662,607,-702 +983,-337,-801 +-550,671,606 +-466,-293,710 +793,650,-662 +-506,595,519 +-294,-768,-699 +444,-519,645 +-312,599,-535 +-464,-304,529 +489,802,531 +438,778,402 +831,-342,-707 +-542,513,494 +-301,621,-550 +-445,-677,-708 +560,846,460 +-293,-724,-739 +638,590,-629 + +--- scanner 2 --- +-635,-463,-706 +896,-619,679 +647,295,757 +797,-608,645 +-270,-724,575 +-493,485,466 +-340,466,-635 +931,-698,684 +624,689,-597 +584,235,861 +411,-511,-238 +-577,670,452 +592,614,-699 +69,3,116 +469,-472,-403 +-762,-440,-769 +562,-473,-299 +-426,448,-617 +670,355,931 +683,528,-588 +-378,-620,578 +-535,525,-608 +-6,-191,36 +-647,-428,-727 +-454,-713,576 +-458,625,481 + +--- scanner 3 --- +438,-559,589 +-590,703,724 +451,970,-584 +657,488,518 +620,-539,588 +569,-409,-714 +-654,-497,546 +506,893,-703 +367,-557,605 +-760,743,-517 +299,925,-664 +-802,-444,601 +-760,797,-413 +523,-491,-552 +520,525,466 +47,174,-89 +-554,-293,-909 +-699,577,686 +-563,-244,-847 +710,529,430 +556,-438,-480 +-61,65,25 +-577,-242,-690 +-807,795,-448 +-601,599,763 +-846,-494,561 + +--- scanner 4 --- +519,654,-940 +723,-779,431 +512,259,327 +-614,322,-479 +-1,-73,-119 +807,-942,-373 +410,690,-950 +-660,-720,-524 +-889,427,353 +-582,-558,474 +-505,385,-481 +-827,536,391 +-549,416,-405 +735,-539,388 +638,-629,470 +-609,-834,-559 +472,303,326 +-636,-659,521 +-833,511,409 +-711,-721,-586 +745,-941,-451 +503,350,478 +504,685,-798 +-532,-659,336 +813,-874,-376 + +--- scanner 5 --- +637,-351,-454 +820,833,-269 +487,-374,703 +-451,-657,828 +766,726,370 +-109,-27,-55 +-452,-602,760 +526,-342,910 +833,757,-477 +-647,-678,769 +689,-411,-450 +-845,657,-682 +-560,535,563 +-468,403,553 +6,111,87 +718,-486,-416 +-664,-436,-479 +771,843,-494 +-655,-530,-493 +772,807,513 +672,815,457 +-717,-428,-587 +-797,629,-713 +606,-297,758 +-433,544,520 +-699,752,-723 + +--- scanner 6 --- +-712,-426,681 +398,-239,-616 +-866,737,603 +787,581,-421 +-624,425,-698 +660,636,788 +-641,478,-670 +-855,410,-685 +54,176,135 +-496,-215,-283 +889,500,-360 +479,-258,-539 +765,483,789 +699,635,723 +819,-682,528 +-691,-319,832 +413,-316,-666 +-865,873,502 +-400,-297,-214 +-411,-257,-391 +47,-11,-7 +908,714,-409 +739,-634,430 +-589,-300,721 +-806,911,549 +746,-579,435 + +--- scanner 7 --- +-748,-520,456 +850,883,-684 +720,-714,-439 +734,-633,-369 +892,871,-799 +829,848,-672 +-452,587,-307 +409,-653,665 +422,838,525 +421,-494,564 +-522,703,760 +-724,-450,600 +761,-674,-597 +-356,-656,-802 +-455,691,-415 +-561,613,894 +-321,-533,-753 +526,839,432 +361,800,374 +391,-623,659 +-49,101,-52 +-453,598,-491 +-711,-374,399 +-556,692,859 +90,-64,7 +-445,-561,-815 + +--- scanner 8 --- +711,-456,-414 +290,-741,546 +381,736,-240 +-404,-352,-609 +-512,-394,-694 +-386,-749,593 +-466,-745,599 +-616,687,954 +542,637,568 +352,-724,460 +629,585,653 +560,-563,-393 +303,-949,470 +70,-14,46 +482,600,-239 +-436,-781,432 +-107,31,169 +600,-437,-516 +428,774,-299 +-806,273,-250 +-819,288,-481 +-709,762,937 +-335,-434,-705 +519,574,718 +-791,341,-464 +-669,741,851 + +--- scanner 9 --- +658,667,348 +-507,-411,-746 +489,722,344 +132,158,41 +624,-673,-878 +-644,568,696 +652,-735,-754 +-370,-679,656 +528,713,268 +747,-722,-843 +535,-741,347 +-522,974,-638 +-563,739,654 +-454,-708,560 +456,-673,284 +-600,-335,-744 +-438,-676,659 +-496,-227,-747 +541,680,-475 +639,-751,276 +-554,691,674 +-612,840,-677 +-601,939,-643 +79,50,-113 +611,536,-451 +465,479,-488 + +--- scanner 10 --- +832,700,-495 +-400,854,718 +-24,73,89 +-588,544,-742 +-529,703,-780 +771,-593,-458 +-621,-815,623 +883,676,-366 +877,-621,-609 +528,548,698 +-496,849,685 +-454,-751,-758 +761,744,-424 +683,488,665 +-492,-693,-669 +834,-512,-482 +-335,755,724 +659,505,738 +-806,-766,645 +490,-444,743 +-688,-774,667 +338,-439,837 +-567,601,-646 +-401,-780,-593 +348,-475,728 +66,-68,8 + +--- scanner 11 --- +557,487,481 +-411,-305,476 +-729,705,812 +544,489,-731 +581,-542,-442 +-773,838,730 +-916,955,-691 +-594,-372,-747 +430,444,590 +673,438,-707 +581,550,562 +469,-550,-600 +556,-506,-524 +-31,6,77 +-139,144,-41 +-418,-407,542 +-408,-363,-710 +615,560,-775 +-679,972,-695 +546,-464,375 +-779,876,765 +-478,-359,-709 +456,-344,374 +365,-466,364 +-714,926,-687 +-393,-495,566 + +--- scanner 12 --- +-554,440,781 +620,-665,578 +-484,464,637 +-432,-355,595 +-100,114,-60 +567,665,-581 +658,632,378 +579,627,343 +669,666,477 +-459,-545,-640 +701,-707,749 +-826,574,-834 +-531,-512,-587 +626,-356,-521 +609,-609,-539 +-888,565,-785 +-693,-558,-669 +622,813,-634 +610,-427,-519 +-13,-13,73 +-471,-279,604 +582,857,-584 +-408,477,838 +-669,588,-836 +611,-685,626 +-601,-359,650 + +--- scanner 13 --- +-607,351,-484 +120,23,-52 +454,-521,-469 +841,462,484 +-704,-386,498 +555,817,-561 +-601,431,-488 +-494,549,769 +-768,401,-452 +514,-469,-465 +-492,515,851 +-712,-486,442 +882,550,537 +589,-440,-431 +400,-552,743 +-730,-338,-284 +606,807,-499 +613,750,-424 +-623,-392,355 +845,498,674 +445,-632,895 +-22,-18,68 +-580,552,764 +477,-671,688 +-740,-387,-509 +-654,-325,-492 + +--- scanner 14 --- +695,-578,-741 +-525,-524,908 +627,579,740 +760,-659,787 +-518,-492,-772 +-669,412,783 +756,501,-366 +821,452,-499 +-559,-362,-779 +670,538,749 +-765,875,-491 +710,-615,897 +-139,20,128 +-704,858,-677 +-534,-604,881 +-880,846,-640 +-743,467,748 +705,658,678 +719,447,-365 +774,-787,907 +-573,-549,798 +9,95,-35 +-465,-311,-776 +-654,460,634 +596,-658,-757 +626,-617,-560 + +--- scanner 15 --- +661,511,-766 +458,-453,788 +-435,-460,692 +-325,-841,-621 +643,528,-513 +454,-559,864 +663,527,-695 +685,-911,-473 +-469,-391,561 +-421,650,-613 +-393,-890,-656 +-384,598,-476 +-653,398,485 +-319,-403,608 +-425,686,-423 +506,-909,-564 +663,656,912 +-660,341,560 +729,758,919 +560,-506,926 +639,568,937 +-18,-10,58 +-711,331,622 +-326,-876,-486 +506,-913,-537 + +--- scanner 16 --- +-443,-656,375 +499,-609,-905 +-788,-254,-779 +757,881,-622 +505,-605,-825 +338,-641,-855 +-799,-294,-956 +-558,481,-500 +550,-485,523 +-533,840,544 +-454,-767,309 +860,827,-675 +-575,428,-472 +360,668,836 +-513,730,479 +506,685,731 +-703,-212,-887 +-344,413,-485 +364,629,768 +-532,687,522 +843,902,-582 +562,-418,704 +-460,-772,334 +-108,116,-53 +564,-498,642 + +--- scanner 17 --- +-779,-922,-822 +707,-737,-658 +-353,566,475 +29,-40,-85 +522,297,-805 +631,-650,-614 +-449,566,520 +-505,714,-477 +-468,538,-465 +521,227,-801 +-780,-885,-876 +-710,-766,541 +-646,-987,-871 +789,-762,-622 +849,512,744 +-415,618,312 +560,-718,631 +748,471,588 +836,396,648 +587,-774,579 +-781,-865,647 +521,-732,401 +-654,599,-448 +484,413,-792 +-757,-725,746 + +--- scanner 18 --- +588,452,452 +696,-717,478 +-592,750,399 +720,557,-881 +-919,-583,750 +487,440,611 +627,453,-880 +-99,159,-27 +392,-491,-745 +-485,892,365 +258,-530,-655 +-719,-344,-698 +-647,440,-786 +-669,-300,-658 +-483,732,303 +293,-525,-734 +778,392,-842 +-870,-592,812 +-666,-492,-643 +753,-680,332 +-655,528,-780 +-564,389,-761 +-40,0,-148 +552,-693,408 +493,422,581 +-921,-569,593 + +--- scanner 19 --- +642,-674,-824 +-308,502,851 +-241,-283,729 +-655,743,-775 +-4,173,16 +176,-21,8 +594,-607,443 +-230,440,852 +621,744,-440 +520,-583,-814 +470,735,-349 +-360,-249,678 +640,-493,-813 +-797,728,-744 +639,-574,362 +469,775,-393 +531,512,449 +613,609,539 +-311,-482,-707 +574,524,689 +-374,-458,-626 +777,-571,440 +-233,434,784 +-391,-259,664 +-807,837,-780 +-268,-609,-598 + +--- scanner 20 --- +131,165,-117 +-691,728,707 +-657,524,-685 +-575,-348,-621 +805,543,456 +10,-6,-166 +439,-390,620 +-663,436,-693 +935,-596,-470 +474,-343,618 +-698,-560,526 +-660,-451,400 +-535,-304,-671 +873,-587,-421 +522,746,-748 +426,728,-857 +698,559,303 +-639,732,574 +543,-390,566 +-638,385,-776 +-688,704,525 +711,524,452 +-520,-496,-674 +488,888,-855 +-737,-549,422 +716,-573,-419 + +--- scanner 21 --- +-696,-367,959 +573,-537,-825 +862,-826,707 +-803,630,451 +-616,332,-658 +877,-813,938 +-616,-875,-583 +-662,-818,-516 +376,421,889 +10,-124,158 +651,660,-577 +809,-798,724 +804,661,-682 +706,-549,-704 +-763,545,463 +414,374,948 +-786,-498,923 +-873,714,446 +-673,-745,-566 +550,475,949 +-614,420,-709 +-33,21,30 +-650,-481,895 +-655,443,-679 +652,595,-616 +787,-488,-806 + +--- scanner 22 --- +64,81,54 +-633,524,-715 +-680,-850,-309 +-663,372,613 +-848,-812,430 +788,-328,-489 +842,-431,-542 +738,-714,669 +863,-345,-582 +-640,-736,417 +-648,-689,-259 +-571,473,-725 +569,758,-411 +-623,-822,479 +-701,507,532 +927,523,543 +917,537,574 +602,839,-456 +122,-68,153 +893,472,424 +605,761,-594 +-708,531,-658 +-644,-683,-339 +675,-564,646 +-667,432,561 +686,-629,756 + +--- scanner 23 --- +-489,640,-740 +-739,-813,720 +399,-469,534 +-451,424,514 +-864,-439,-801 +-865,-385,-764 +-458,554,473 +436,-460,348 +451,875,619 +439,341,-733 +546,-647,-529 +-454,373,420 +622,-603,-616 +704,-639,-641 +455,858,856 +437,-456,418 +-473,720,-641 +415,392,-604 +459,829,654 +-590,-784,835 +-553,-796,659 +5,-29,20 +371,463,-675 +-670,679,-671 +-731,-390,-866 + +--- scanner 24 --- +479,813,605 +-421,-402,-375 +444,851,599 +-48,139,125 +-748,529,574 +105,11,84 +647,-560,-465 +-862,612,-634 +546,508,-529 +-785,731,-579 +667,-561,-647 +643,-520,985 +-656,-747,608 +-808,581,578 +-707,-757,670 +733,-330,967 +397,680,649 +-380,-490,-428 +665,-577,-718 +667,-432,960 +517,742,-516 +-417,-438,-565 +-649,-690,533 +-817,692,-786 +599,580,-562 +-673,500,540 + +--- scanner 25 --- +-587,-880,-854 +774,-772,-664 +-665,449,-801 +399,-948,578 +-368,-666,714 +693,243,629 +953,479,-759 +-494,391,634 +963,465,-790 +704,325,429 +929,414,-909 +-812,-870,-903 +442,-751,549 +559,322,560 +-588,493,572 +-604,-794,-916 +155,34,-112 +711,-622,-687 +-399,-694,762 +722,-687,-577 +-358,-789,616 +26,-59,-17 +-631,374,-772 +404,-719,583 +-627,314,-720 +-602,399,581 + +--- scanner 26 --- +-537,-661,-554 +-494,-780,790 +659,-817,588 +784,-534,-350 +-498,-840,738 +725,-513,-546 +609,514,811 +596,485,577 +-569,365,639 +-458,481,-780 +-631,-763,-616 +33,-53,121 +-66,64,-29 +564,545,-271 +596,614,-439 +-523,-755,-563 +-525,447,506 +-550,528,-756 +-460,-705,819 +-656,535,-823 +714,-894,707 +518,578,-478 +866,-849,627 +716,-589,-351 +642,567,739 +-519,412,468 + +--- scanner 27 --- +-85,-16,64 +418,478,-378 +-513,623,709 +814,736,845 +-632,-710,-855 +557,-666,-807 +-594,452,667 +-556,252,-630 +-592,-760,-811 +-604,-645,429 +-588,-647,358 +783,728,850 +-647,-707,-663 +52,-66,-100 +849,608,807 +-603,500,687 +-635,217,-625 +834,-623,651 +358,501,-552 +836,-802,587 +298,564,-448 +746,-733,-810 +609,-713,-817 +832,-802,560 +-605,-665,611 +-120,-179,-120 +-545,351,-664 From a83f108eeb6d5b46a440201ab7c5ff67fd5a2d62 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 19 Dec 2021 14:23:37 +0100 Subject: [PATCH 246/479] 2021: d19: ex2: add solution --- 2021/d19/ex2/ex2.py | 178 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100755 2021/d19/ex2/ex2.py diff --git a/2021/d19/ex2/ex2.py b/2021/d19/ex2/ex2.py new file mode 100755 index 0000000..ff4f6ad --- /dev/null +++ b/2021/d19/ex2/ex2.py @@ -0,0 +1,178 @@ +#!/usr/bin/env python + +import itertools +import sys +from dataclasses import dataclass +from typing import List, Optional, Set, Tuple + + +@dataclass(eq=True, frozen=True) # Hash-able +class Vector: + x: int + y: int + z: int + + def __add__(self, other: "Vector") -> "Vector": + return Vector(self.x + other.x, self.y + other.y, self.z + other.z) + + def __sub__(self, other: "Vector") -> "Vector": + return Vector(self.x - other.x, self.y - other.y, self.z - other.z) + + +@dataclass(eq=True, frozen=True) # Hash-able +class Matrix: + v1: Vector + v2: Vector + v3: Vector + + def __matmul__(self, other: Vector) -> Vector: + return Vector( + self.v1.x * other.x + self.v1.y * other.y + self.v1.z * other.z, + self.v2.x * other.x + self.v2.y * other.y + self.v2.z * other.z, + self.v3.x * other.x + self.v3.y * other.y + self.v3.z * other.z, + ) + + +def rotations() -> List[Matrix]: + def cos(angle: int) -> int: + if angle == 0: + return 1 + if angle == 180: + return -1 + assert angle in (90, 270) # Sanity check + return 0 + + def sin(angle: int) -> int: + if angle == 90: + return 1 + if angle == 270: + return -1 + assert angle in (0, 180) # Sanity check + return 0 + + def rotate(x: int, y: int, z: int) -> Matrix: + v1 = Vector( + cos(z) * cos(y), + cos(z) * sin(y) * sin(x) - sin(z) * cos(x), + cos(z) * sin(y) * cos(x) + sin(z) * sin(x), + ) + v2 = Vector( + sin(z) * cos(y), + sin(z) * sin(y) * sin(x) + cos(z) * cos(x), + sin(z) * sin(y) * cos(x) - cos(z) * sin(x), + ) + v3 = Vector(-sin(y), cos(y) * sin(x), cos(y) * cos(x)) + return Matrix(v1, v2, v3) + + return [ + rotate(0, 0, 0), + rotate(90, 0, 0), + rotate(180, 0, 0), + rotate(270, 0, 0), + rotate(0, 90, 0), + rotate(90, 90, 0), + rotate(180, 90, 0), + rotate(270, 90, 0), + rotate(0, 180, 0), + rotate(90, 180, 0), + rotate(180, 180, 0), + rotate(270, 180, 0), + rotate(0, 270, 0), + rotate(90, 270, 0), + rotate(180, 270, 0), + rotate(270, 270, 0), + rotate(0, 0, 90), + rotate(90, 0, 90), + rotate(180, 0, 90), + rotate(270, 0, 90), + rotate(0, 0, 270), + rotate(90, 0, 270), + rotate(180, 0, 270), + rotate(270, 0, 270), + ] + + +ROTATIONS = rotations() + +BeaconList = Set[Vector] + + +def solve(input: List[str]) -> int: + def parse() -> List[BeaconList]: + res: List[BeaconList] = [] + + for line in input: + if "scanner" in line: + res.append(set()) + continue + if line == "": + continue + x, y, z = map(int, line.split(",")) + res[-1].add(Vector(x, y, z)) + + return res + + def find_overlap( + known: BeaconList, other: BeaconList + ) -> Optional[Tuple[Matrix, Vector]]: + def find_delta(known: BeaconList, other: BeaconList) -> Optional[Vector]: + for dest, source in itertools.product(known, rotated): + delta = dest - source + if sum((v + delta) in known for v in rotated) >= 12: + return delta + return None + + for r in ROTATIONS: + rotated = set(r @ v for v in other) + if (delta := find_delta(known, rotated)) is not None: + return r, delta + + return None + + def apply(known: BeaconList, other: BeaconList) -> Tuple[bool, Vector, BeaconList]: + res = find_overlap(known, other) + if res is None: + return False, Vector(0, 0, 0), known + + rot, delta = res + + new = {(rot @ v) + delta for v in other} + + # Return whether there are new points in the set + return (new <= known), delta, (known | new) + + def match_all(scans: List[BeaconList]) -> Set[Vector]: + # First scan is our basis + known = scans[0] + # No need to inspect the first scan in the future + to_match = scans[1:] + # Position our first scanner at the origin + deltas = {Vector(0, 0, 0)} + + while to_match: + s = to_match.pop(0) + applied, delta, known = apply(known, s) + if not applied: + to_match.append(s) + else: + deltas.add(delta) + return deltas + + def manhattan_dist(v1: Vector, v2: Vector) -> int: + return abs(v1.x - v2.x) + abs(v1.y - v2.y) + abs(v1.z - v2.z) + + beacons = parse() + scanner_positions = match_all(beacons) + return max( + manhattan_dist(v1, v2) + for v1, v2 in itertools.combinations(scanner_positions, 2) + ) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 7a502bdc9c6e4190a5950a61a9de35c8c4cbccfe Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 20 Dec 2021 15:23:47 +0100 Subject: [PATCH 247/479] 2021: d20: ex1: add input --- 2021/d20/ex1/input | 102 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 2021/d20/ex1/input diff --git a/2021/d20/ex1/input b/2021/d20/ex1/input new file mode 100644 index 0000000..2afe0ac --- /dev/null +++ b/2021/d20/ex1/input @@ -0,0 +1,102 @@ +##..#######.#.#...##..#.#....#..#####..###...#..#.#..##....#.###..#.###..#.#.#.##.######.#.##.#.#..#######.####..#.#.#.##..##.#.#######...#..#...........###.#.........#..#....#.#..##.##....#.##.#...#.##..##....##..#####......#.#.##....#...#########...#..##...####.#####.##.#.###..##.##..#.#..#.......#..##....#.##.######.#.##..##......####...#.##..#...#.###.##..##...#..#####..#.#.###.#.##..##..#####...#.#.#...###..#.##.####.#.#..#####..##.##...#.#.#....####.##..#.##.###.....##.#....#####....###...##.#.#...... + +##.##...#.##...####.#.#..######......#.##.#.#.###......#.#...##..##.###.###.##.#..#..#.....#..####.. +#######...##..#....#..####..##.##.#.##.##.##..#...##.##..##..#..##....#########....##........###...# +##.#.###...#...###.#####..#..#.##..#....#####..##.#..#..#....##.#..#.#..#...#.##....##.##......##### +..#...##..##..#.###..###.#.###.##.#.###.##.####..#.#.##....#..##.###.##..##......#.#####.##..#.#.#.# +#.........#.##.#.#....#..#..##..###..###.#...##.#.#.###.##..#.##.......###.###...#..##.#####.#...#.# +.##..####.#.###.#..#.......####.....#.###...####.#.###..####..#.......##.##.##########..#.#.#..#.#.. +#..#.###..#.##..######.....#######.##.#.#...##..#.##...##..#.##..###..######..#.##.....##...#.#.#.#. +###..#..###.#.#.#...#####...#.#..#.##....##.#.##..#..###.#..##..####.######.#.#...#.#..#.####...##.# +#....#...#####.###.######..#....##.#....#####..#.#####...#.#...#.#.#.######...##...##.##..####.##..# +.###..####.#..##.#####.#...#....####.#.##..##..###....#.#..##...#..#..####.####...#...#....###..##.# +..#...####.##.#.#.##.#..##.....#.#.###.#.#.##....##........#...##...#.#.####.##..#...#.#.....#..#..# +.##....#....#.##.##.......####.#.###.#..##..#.#..#..#.....#.##.###..##.##..#.####.######.#.##..#.##. +..##.#..#.#..#.#....######.....#..##...#......##....#...#..#.#...#..#.#.#####....####.###.#.#####... +#.#...#.####.###..#.#.####.####...###.###.#.#..##........#..#...##.###....##..#..##.#.####.#.##..##. +###.###.#.#.......###.#....####..##.#....#.####...#..#.#.##.....##..##......#####...#..##.....##.#.# +#...###.#.#..#.#.#..####.######..#..##.###..#....#..#..##.##..##.###...####..#..#..####..#.#####.##. +..#.##....#.###...#######..##.#.##..###...#...#....####.#.##.####....##..###...##.#.####..#..#..#.#. +#######..#.#.#.#.###..###..###.....#####..######.#.#..#.#.#..#.#.#.#...#.#..##....#.####.###.##.#.#. +..###...##.#.#######.....###..##.#..###....##........##..#..#.##.#.####.##....#####.##..##...##....# +.#..#..#...##.#.##..#.#.##.##.######..#.####...#.......####....#.###..#....#.#........####.#...#.##. +##..#.#...#.#.##.#..#.##.......##.#..#.#.#.#.####.##....#.#...#....######.#......#.##.#.##...#.##..# +#.#.#.#########...#.##..#...###....#..#..#.###.##...#.#..#...#.#...#.###.#.#.##..##....###...#.#...# +##..###.#.####.##..##.##.###.##.#.#..##..#######...#...#.###.#.##.##.#...#.....#.#.#####..##.#.##.#. +...#..##...###########.#.#####.###.#.......#....#####..#.#.###..#....#...###...#..##.###...##.###.## +##.......#....####..#...##.####..#.#..#..####......#.....#.##.#.##..#...#.####.#.#.#.##...#...#..#.. +#.....##.#......##.####.##.#....#.####..#..##.#..#.##.#.#..###.##..#.#..####......##.#..##..####.... +.#.##.##..#...########.#.#.......#...#.###..#...#..#..##.#.#...#####..#..######..#..#.#...###..##.#. +##.##..##...#.##.##.#.###.#.....##.#...####.###.#.#..#...##.#.#...###..###..#...#.#..##......#..###. +####..#.#..#...##.###....#..##.##.##.#..#..#.##..##...#.#.#.#...#.#......####.#.#..#......##.##..... +##.....##..#...##.######.#....#.###....####.##.##.###.#.##..####.#...##.##.#.##.....#..###.#.....### +#.#..#..#.#....##.#.##.#...##.#.#..##.#.##...#...###.#...#####.#.....##.#.#...##.....######..#.#.### +...#.#..##.....####.#.#..#.#.###.....##..#.#..#.##..#.#.##..##...##...#.####.#.#.##...####.#.#.#.#.# +...##.##...#####.#.#..###.####.#.#.#.#.#####.#.######.####.#.#.##.####.####..###.#...###..#.#.#.#### +#..##.#.##.#..#.##.##...#.#.##.#.##..#.###.###..#.##....##.####....##..#.#.##.####.#....##..#.#..#.. +#.######.##.###.#.#...##...##...#.###..###.#.......#.###...#..##.....#..#.......##.###.....#.##..#.# +..#.##.#...##.#..#...###.#.##.###...#...#...#..###...#..#...######.###.#.....#.###.#..###.....#...#. +##.#.#.......###.#.#....#..#.#.#..#..#.###.##.#..#..###.###.#....#.......###....##.#.###.###.###...# +...##.###..#...#.#...##..##..#.#.#...#.##..#.....#..#...###..##.##.##.....####..#.#.#..##..##..#..#. +#......#####..#.###.....##...######.......#..####....#.#.#...#.#..#.####.#...###...#..#.#.##...#.#.. +#.##...#.##.##...##....#....####.##..#....#..##....#..#.##.......######.#.##.###.##....#.#.#.....##. +#####.#.....###....##..#####..#.#.##.##.#.#.#...####.###.###..#....#...##.#.#....#..####.#...###..## +#.#####..##...######.######....#.#.#..##.##.######..##...#...####..##.##.#.#....#.#.#.#..#...#...#.. +.###.#.##.#.#.##.##....#..####.#..##.#.##....###.##...#....#..###..##.#########..##.......##.....#.# +##..#.##..#..#.#.#..#...##...##########...##.##..#..#.#.###########.....#######....#....#.###.#...#. +...##.#..##...#..#.##...###...####.#...#####.####..#.###..###....###..#..#####.#.##.#.##....#......# +..##..##...###.#.#.#..#.#####..#.##..#..#...###.###..##....#.#.##...###..#.###..#.#.##.###.##....### +.#.#.#######.#..#.....#.##.###...##.##.###.##..##...###..#.##...###.#..##..###.#.####.#..##..##...#. +#.####.#.#....###...###....##...##.....#.###.#.....#..#...#..####.#...#..#######...###.#........#... +..##...#.#..###..##..#.#..####.#...#.##.#...#.#..###..#.##.#.#.#...###..######....#.###.#.#.#..##.#. +###.#.#.....###..#....###.#.......##...#..#.###..###.#......#...##..#.#..###..#.##.#.##.######.#.#.# +#...###.#.#....#.####....##.###...##..##....#####....#......#.#.......###...#.#..#.#....#....####.#. +#.#.##.######..#.#.######.#...#..###.#..####..#.##..###.#.#.#.###..#..#.#....#..#.##.#..##.####.##.# +#.##.#.###...#.##.#..#.#....#.####...#.###...#..###......#.########....#.#####..#.#.#..#...#.####.#. +####...#.#.##.###...##.#....#.#..######.#.######.#.##.#.#.#..#...#.###.#..#.####.#..#.#....#....#.## +##.##.....#.##..#......#....###.#..#######.#...##..#.#...##..##.#.#..##.###.######.....###.##.##..## +..####.##.#####....#.#..#.#.#.########.#.###........#..###...###........####.##.##.#.#..#.##.....#.# +...#.#..#.#.###.....##.#.##.#.##..#.##..#..####........###..####..##..#.####..#...#.####.##.#.#.##.# +.##.#.#..#####..#####.#.....##.#.####.#.###..#..##.#..####.###.##.###.###.#..#..##....#.##.....#.#.. +.#...####..##.###....##..#..##.###..#..##....#...##.###.###.#...##..###.#..##.#.##...##.##.#..##.#.. +.#.##.##.####.###.#.#..##.....####.##..######.###..#.#.##..##.#.#.....#.#############..#..#..###..## +.#.#..###...###..###.#....###.....##.#.#..###..####..##.##.#.##...########..##..####.##.##.##.#.#... +...#.##.###.#..#..##...#..##..#.....##..#.#..###..#...#...##.#.#..#.###.#####..#.....##...###.###### +##...#..##.#.##.##...#.....#....#...##.###...#####..#..##.##.###..#.###.##..#.#..##.##..#.#...###### +.##.#..###.###....#.###.#..#..#..##...############...#########.#..#.###...###....#..#.########.#.##. +.........###..##.####.#.#...#..##.#...###....###.##.######.#..#.#..###.###.#.###.##.##.##..#.#.#.#.. +.##....###.#.###.#.#..##...#.#...#.##....###...##.#..#######....##..#...#...#....##.##..####.######. +###.####...##.#.###.....#..######....###..#.#.#..#######..#..#.##.#.####.###.#....#..#.#...##..#.#.. +##..#.#####.###...#..#.......###.###..##.....##...#.##.##..###.####..#...#.#.##.#.#...##....#.##.### +#...####......###.##..#..####.##.#.###.##.#.#....#.....#..#...###..##..##..#.##..###.#.##.###....#.. +#..##.#..####...##.##.####..#....#......###...##.#.#..#.#.....#..##..###..#.##.##.#..####..##.#.#### +....#..#......##....###...#.##..##.#...#.....#..##.#.###..#...#...........##..#####....#..#.##...#.. +...#..####.#.#####.####...#..#..#..###.#.#.#.##.##......#.####........##.#.....#..###.#..#..##..###. +#######.#.#..#.##..#.#.##.#..#..#......#.#..####....#####.#.....###.#.#..##.#..#..##.#..###..#.###.# +#....#.#.##.##...#..##.####....###....#...#..###..##.######...#.##.##.##.#.#.#.#####.##.#.####.###.# +...#.#..#..#....#...###..#.#..#...#..##...#..##.#.###.#.##...#####......#.##.#..#.###..##.##...#.#.# +.#.##.....#####.#.#####..###.#.###....##...#.....##...###.##.#.#.#...##.......###....##..##...##.... +####.#...##.#####.##..####.########...#..#..#....#.##.###..###.##.##..###.###.######..##...#......## +.##...###..###..#.####.##.##...#.....####.###.##.#.##..#.#.#.#.#....##.#######.##.##..#...#....##### +.###.##....#.#......#.##....#..###.##..##..##..##..#.......#..#.#.###...#..####.##.#.##..###..##.##. +....######.#..#.##.##.#####..#.##.#.#.#.##..#..#.########.#####..###.###.#...#..##.#......##.#.#.#.. +.#.#.#...###.#.#.#....###.####..#.##....#......#...#.#.##.##.#..###.....#.#.##..##.#..###.#.#.####.. +##....########.#..#####...#.....##.#.....##.#...####..####..#......##...#..#..##..#..#.##..###..##.# +##..####.#####.#.#.#.#.###.###..#..#...##.#.#....#.#..#.#.###..#.##...#.#.##.#.##.##....#..######.## +#..#.....#.#..#.#.#..##..#....#.#.###.#.#..#..###..#.#...###..##...####.##..#..#...#.#...###.##..##. +...#..#...####.##.###.#####.###.##..###.#....##..##...#.###.#...#...#.............##...####.####.#.# +.###.##...##.#.###.#.#...##.#..#...#####..##.#.#...##.#######.####....####....#######.#...#.#.###... +....#.#...##.#.####.#####.#.######.#####.##...####...###.#.##.####..##.###.###....#.....#####.....#. +......##.#.#....#.#..##..#.#.###...##.##.####.#....##...##...##...#...#.###.#.##...#..####....##.... +.#####..#.#####...##.#...###.#.#..#.#..##..#.#.#.##..#.##....###..###..#..##...##..#.###.#.##....### +#####....#.#...##.###.#....###.##.........#..##..###.#...######.#..#.#.########.....###.#.#...#..... +.##.#.#####.#..#.#.#.###...########.###..##.#..#.####.#...##.#....#...##.######..##....##....##.##.. +###...##.##..####...#.#.#..##.....###..#..##..#.####.###..#.#.##.######...#.#...###.##..#....##.#.## +##..##.#..#..#.###.#..#..#....#..#....###.####.###...#.##.##.##......##.####...#.....#...#.#...#..#. +....#.##...#..##.##......#.#.#..####....#..#######.#...#...##..#......#.#........##.##....###....##. +##.#...#...##.###.###..####.#...#..##...##.###..#..###..#.....#...###..###.##..#..#####.....####.##. +.##.#...#..####..#.....##..###.#.#.#..#...##...###...#..##.....#..##...##..###.#..#####...##.#..###. +.#.#.#..####...#.###.###....##....#.#..#.#..#..#####.#..#...#.###.........##.####.####..#.##..##..#. +#..##.####.#..##....#.####.###...#.#..#####.##.#..#......###.##...#....#.##..#....##.#.....#.##.##.# +#..#..#.###.#..#.#.####.####..#.#.#..#.#...#....#######.####.............####..###.#..####.######.## +.#....####...#...#...#..#..##......#######.###.##..####.##.####.#####....##.###.#.###..#.#....#...#. From 62f0a786c2d119d4666c5e487261cb28227b14a7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 20 Dec 2021 15:23:53 +0100 Subject: [PATCH 248/479] 2021: d20: ex1: add solution --- 2021/d20/ex1/ex1.py | 82 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100755 2021/d20/ex1/ex1.py diff --git a/2021/d20/ex1/ex1.py b/2021/d20/ex1/ex1.py new file mode 100755 index 0000000..3a65ef4 --- /dev/null +++ b/2021/d20/ex1/ex1.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List, NamedTuple, Set, Tuple + + +class Point(NamedTuple): + x: int + y: int + + +Algorithm = List[bool] +Image = Set[Point] + + +def solve(input: List[str]) -> int: + def parse() -> Tuple[Algorithm, Image]: + algo_str, blank, *image_str = input + + assert blank == "" # Sanity check + assert len(algo_str) == 512 # Sanity check + + algo = [c == "#" for c in algo_str] + image = { + Point(i, j) + for i in range(len(image_str)) + for j in range(len(image_str[0])) + if image_str[i][j] == "#" + } + + return algo, image + + def do_step(algo: Algorithm, image: Image, step: int) -> Image: + min_x, max_x = min(p.x for p in image), max(p.x for p in image) + min_y, max_y = min(p.y for p in image), max(p.y for p in image) + + def color(p: Point) -> bool: + # Always return true if we *know* that it is lit + if p in image: + return True + # Return early if the rules don't lead to a flashing infinity case + flashes_infinity = algo[0] and not algo[-1] + if not flashes_infinity: + return False + # Pixels in proximity to the image are assumed to change their state normally + if min_x <= p.x <= max_x and min_y <= p.y <= max_y: + return False + # Odd indices have a "lit infinity" which turns off, and vice versa + return (step % 2) == 1 + + def bits(p: Point) -> int: + x, y = p + res = 0 + for dx, dy in itertools.product(range(-1, 1 + 1), repeat=2): + res = (res << 1) + color(Point(x + dx, y + dy)) + return res + + # We know the image we care for cannot grow by more than 1 per turn + xs, ys = range(min_x - 1, max_x + 1 + 1), range(min_y - 1, max_y + 1 + 1) + + res: Image = set() + for p in map(Point._make, itertools.product(xs, ys)): + if algo[bits(p)]: + res.add(p) + + return res + + rules, image = parse() + for i in range(2): + image = do_step(rules, image, i) + + return len(image) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 52da7aafe9888d5d0881b1f973ce9a2948f33d69 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 20 Dec 2021 15:24:00 +0100 Subject: [PATCH 249/479] 2021: d20: ex2: add input --- 2021/d20/ex2/input | 102 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 2021/d20/ex2/input diff --git a/2021/d20/ex2/input b/2021/d20/ex2/input new file mode 100644 index 0000000..2afe0ac --- /dev/null +++ b/2021/d20/ex2/input @@ -0,0 +1,102 @@ +##..#######.#.#...##..#.#....#..#####..###...#..#.#..##....#.###..#.###..#.#.#.##.######.#.##.#.#..#######.####..#.#.#.##..##.#.#######...#..#...........###.#.........#..#....#.#..##.##....#.##.#...#.##..##....##..#####......#.#.##....#...#########...#..##...####.#####.##.#.###..##.##..#.#..#.......#..##....#.##.######.#.##..##......####...#.##..#...#.###.##..##...#..#####..#.#.###.#.##..##..#####...#.#.#...###..#.##.####.#.#..#####..##.##...#.#.#....####.##..#.##.###.....##.#....#####....###...##.#.#...... + +##.##...#.##...####.#.#..######......#.##.#.#.###......#.#...##..##.###.###.##.#..#..#.....#..####.. +#######...##..#....#..####..##.##.#.##.##.##..#...##.##..##..#..##....#########....##........###...# +##.#.###...#...###.#####..#..#.##..#....#####..##.#..#..#....##.#..#.#..#...#.##....##.##......##### +..#...##..##..#.###..###.#.###.##.#.###.##.####..#.#.##....#..##.###.##..##......#.#####.##..#.#.#.# +#.........#.##.#.#....#..#..##..###..###.#...##.#.#.###.##..#.##.......###.###...#..##.#####.#...#.# +.##..####.#.###.#..#.......####.....#.###...####.#.###..####..#.......##.##.##########..#.#.#..#.#.. +#..#.###..#.##..######.....#######.##.#.#...##..#.##...##..#.##..###..######..#.##.....##...#.#.#.#. +###..#..###.#.#.#...#####...#.#..#.##....##.#.##..#..###.#..##..####.######.#.#...#.#..#.####...##.# +#....#...#####.###.######..#....##.#....#####..#.#####...#.#...#.#.#.######...##...##.##..####.##..# +.###..####.#..##.#####.#...#....####.#.##..##..###....#.#..##...#..#..####.####...#...#....###..##.# +..#...####.##.#.#.##.#..##.....#.#.###.#.#.##....##........#...##...#.#.####.##..#...#.#.....#..#..# +.##....#....#.##.##.......####.#.###.#..##..#.#..#..#.....#.##.###..##.##..#.####.######.#.##..#.##. +..##.#..#.#..#.#....######.....#..##...#......##....#...#..#.#...#..#.#.#####....####.###.#.#####... +#.#...#.####.###..#.#.####.####...###.###.#.#..##........#..#...##.###....##..#..##.#.####.#.##..##. +###.###.#.#.......###.#....####..##.#....#.####...#..#.#.##.....##..##......#####...#..##.....##.#.# +#...###.#.#..#.#.#..####.######..#..##.###..#....#..#..##.##..##.###...####..#..#..####..#.#####.##. +..#.##....#.###...#######..##.#.##..###...#...#....####.#.##.####....##..###...##.#.####..#..#..#.#. +#######..#.#.#.#.###..###..###.....#####..######.#.#..#.#.#..#.#.#.#...#.#..##....#.####.###.##.#.#. +..###...##.#.#######.....###..##.#..###....##........##..#..#.##.#.####.##....#####.##..##...##....# +.#..#..#...##.#.##..#.#.##.##.######..#.####...#.......####....#.###..#....#.#........####.#...#.##. +##..#.#...#.#.##.#..#.##.......##.#..#.#.#.#.####.##....#.#...#....######.#......#.##.#.##...#.##..# +#.#.#.#########...#.##..#...###....#..#..#.###.##...#.#..#...#.#...#.###.#.#.##..##....###...#.#...# +##..###.#.####.##..##.##.###.##.#.#..##..#######...#...#.###.#.##.##.#...#.....#.#.#####..##.#.##.#. +...#..##...###########.#.#####.###.#.......#....#####..#.#.###..#....#...###...#..##.###...##.###.## +##.......#....####..#...##.####..#.#..#..####......#.....#.##.#.##..#...#.####.#.#.#.##...#...#..#.. +#.....##.#......##.####.##.#....#.####..#..##.#..#.##.#.#..###.##..#.#..####......##.#..##..####.... +.#.##.##..#...########.#.#.......#...#.###..#...#..#..##.#.#...#####..#..######..#..#.#...###..##.#. +##.##..##...#.##.##.#.###.#.....##.#...####.###.#.#..#...##.#.#...###..###..#...#.#..##......#..###. +####..#.#..#...##.###....#..##.##.##.#..#..#.##..##...#.#.#.#...#.#......####.#.#..#......##.##..... +##.....##..#...##.######.#....#.###....####.##.##.###.#.##..####.#...##.##.#.##.....#..###.#.....### +#.#..#..#.#....##.#.##.#...##.#.#..##.#.##...#...###.#...#####.#.....##.#.#...##.....######..#.#.### +...#.#..##.....####.#.#..#.#.###.....##..#.#..#.##..#.#.##..##...##...#.####.#.#.##...####.#.#.#.#.# +...##.##...#####.#.#..###.####.#.#.#.#.#####.#.######.####.#.#.##.####.####..###.#...###..#.#.#.#### +#..##.#.##.#..#.##.##...#.#.##.#.##..#.###.###..#.##....##.####....##..#.#.##.####.#....##..#.#..#.. +#.######.##.###.#.#...##...##...#.###..###.#.......#.###...#..##.....#..#.......##.###.....#.##..#.# +..#.##.#...##.#..#...###.#.##.###...#...#...#..###...#..#...######.###.#.....#.###.#..###.....#...#. +##.#.#.......###.#.#....#..#.#.#..#..#.###.##.#..#..###.###.#....#.......###....##.#.###.###.###...# +...##.###..#...#.#...##..##..#.#.#...#.##..#.....#..#...###..##.##.##.....####..#.#.#..##..##..#..#. +#......#####..#.###.....##...######.......#..####....#.#.#...#.#..#.####.#...###...#..#.#.##...#.#.. +#.##...#.##.##...##....#....####.##..#....#..##....#..#.##.......######.#.##.###.##....#.#.#.....##. +#####.#.....###....##..#####..#.#.##.##.#.#.#...####.###.###..#....#...##.#.#....#..####.#...###..## +#.#####..##...######.######....#.#.#..##.##.######..##...#...####..##.##.#.#....#.#.#.#..#...#...#.. +.###.#.##.#.#.##.##....#..####.#..##.#.##....###.##...#....#..###..##.#########..##.......##.....#.# +##..#.##..#..#.#.#..#...##...##########...##.##..#..#.#.###########.....#######....#....#.###.#...#. +...##.#..##...#..#.##...###...####.#...#####.####..#.###..###....###..#..#####.#.##.#.##....#......# +..##..##...###.#.#.#..#.#####..#.##..#..#...###.###..##....#.#.##...###..#.###..#.#.##.###.##....### +.#.#.#######.#..#.....#.##.###...##.##.###.##..##...###..#.##...###.#..##..###.#.####.#..##..##...#. +#.####.#.#....###...###....##...##.....#.###.#.....#..#...#..####.#...#..#######...###.#........#... +..##...#.#..###..##..#.#..####.#...#.##.#...#.#..###..#.##.#.#.#...###..######....#.###.#.#.#..##.#. +###.#.#.....###..#....###.#.......##...#..#.###..###.#......#...##..#.#..###..#.##.#.##.######.#.#.# +#...###.#.#....#.####....##.###...##..##....#####....#......#.#.......###...#.#..#.#....#....####.#. +#.#.##.######..#.#.######.#...#..###.#..####..#.##..###.#.#.#.###..#..#.#....#..#.##.#..##.####.##.# +#.##.#.###...#.##.#..#.#....#.####...#.###...#..###......#.########....#.#####..#.#.#..#...#.####.#. +####...#.#.##.###...##.#....#.#..######.#.######.#.##.#.#.#..#...#.###.#..#.####.#..#.#....#....#.## +##.##.....#.##..#......#....###.#..#######.#...##..#.#...##..##.#.#..##.###.######.....###.##.##..## +..####.##.#####....#.#..#.#.#.########.#.###........#..###...###........####.##.##.#.#..#.##.....#.# +...#.#..#.#.###.....##.#.##.#.##..#.##..#..####........###..####..##..#.####..#...#.####.##.#.#.##.# +.##.#.#..#####..#####.#.....##.#.####.#.###..#..##.#..####.###.##.###.###.#..#..##....#.##.....#.#.. +.#...####..##.###....##..#..##.###..#..##....#...##.###.###.#...##..###.#..##.#.##...##.##.#..##.#.. +.#.##.##.####.###.#.#..##.....####.##..######.###..#.#.##..##.#.#.....#.#############..#..#..###..## +.#.#..###...###..###.#....###.....##.#.#..###..####..##.##.#.##...########..##..####.##.##.##.#.#... +...#.##.###.#..#..##...#..##..#.....##..#.#..###..#...#...##.#.#..#.###.#####..#.....##...###.###### +##...#..##.#.##.##...#.....#....#...##.###...#####..#..##.##.###..#.###.##..#.#..##.##..#.#...###### +.##.#..###.###....#.###.#..#..#..##...############...#########.#..#.###...###....#..#.########.#.##. +.........###..##.####.#.#...#..##.#...###....###.##.######.#..#.#..###.###.#.###.##.##.##..#.#.#.#.. +.##....###.#.###.#.#..##...#.#...#.##....###...##.#..#######....##..#...#...#....##.##..####.######. +###.####...##.#.###.....#..######....###..#.#.#..#######..#..#.##.#.####.###.#....#..#.#...##..#.#.. +##..#.#####.###...#..#.......###.###..##.....##...#.##.##..###.####..#...#.#.##.#.#...##....#.##.### +#...####......###.##..#..####.##.#.###.##.#.#....#.....#..#...###..##..##..#.##..###.#.##.###....#.. +#..##.#..####...##.##.####..#....#......###...##.#.#..#.#.....#..##..###..#.##.##.#..####..##.#.#### +....#..#......##....###...#.##..##.#...#.....#..##.#.###..#...#...........##..#####....#..#.##...#.. +...#..####.#.#####.####...#..#..#..###.#.#.#.##.##......#.####........##.#.....#..###.#..#..##..###. +#######.#.#..#.##..#.#.##.#..#..#......#.#..####....#####.#.....###.#.#..##.#..#..##.#..###..#.###.# +#....#.#.##.##...#..##.####....###....#...#..###..##.######...#.##.##.##.#.#.#.#####.##.#.####.###.# +...#.#..#..#....#...###..#.#..#...#..##...#..##.#.###.#.##...#####......#.##.#..#.###..##.##...#.#.# +.#.##.....#####.#.#####..###.#.###....##...#.....##...###.##.#.#.#...##.......###....##..##...##.... +####.#...##.#####.##..####.########...#..#..#....#.##.###..###.##.##..###.###.######..##...#......## +.##...###..###..#.####.##.##...#.....####.###.##.#.##..#.#.#.#.#....##.#######.##.##..#...#....##### +.###.##....#.#......#.##....#..###.##..##..##..##..#.......#..#.#.###...#..####.##.#.##..###..##.##. +....######.#..#.##.##.#####..#.##.#.#.#.##..#..#.########.#####..###.###.#...#..##.#......##.#.#.#.. +.#.#.#...###.#.#.#....###.####..#.##....#......#...#.#.##.##.#..###.....#.#.##..##.#..###.#.#.####.. +##....########.#..#####...#.....##.#.....##.#...####..####..#......##...#..#..##..#..#.##..###..##.# +##..####.#####.#.#.#.#.###.###..#..#...##.#.#....#.#..#.#.###..#.##...#.#.##.#.##.##....#..######.## +#..#.....#.#..#.#.#..##..#....#.#.###.#.#..#..###..#.#...###..##...####.##..#..#...#.#...###.##..##. +...#..#...####.##.###.#####.###.##..###.#....##..##...#.###.#...#...#.............##...####.####.#.# +.###.##...##.#.###.#.#...##.#..#...#####..##.#.#...##.#######.####....####....#######.#...#.#.###... +....#.#...##.#.####.#####.#.######.#####.##...####...###.#.##.####..##.###.###....#.....#####.....#. +......##.#.#....#.#..##..#.#.###...##.##.####.#....##...##...##...#...#.###.#.##...#..####....##.... +.#####..#.#####...##.#...###.#.#..#.#..##..#.#.#.##..#.##....###..###..#..##...##..#.###.#.##....### +#####....#.#...##.###.#....###.##.........#..##..###.#...######.#..#.#.########.....###.#.#...#..... +.##.#.#####.#..#.#.#.###...########.###..##.#..#.####.#...##.#....#...##.######..##....##....##.##.. +###...##.##..####...#.#.#..##.....###..#..##..#.####.###..#.#.##.######...#.#...###.##..#....##.#.## +##..##.#..#..#.###.#..#..#....#..#....###.####.###...#.##.##.##......##.####...#.....#...#.#...#..#. +....#.##...#..##.##......#.#.#..####....#..#######.#...#...##..#......#.#........##.##....###....##. +##.#...#...##.###.###..####.#...#..##...##.###..#..###..#.....#...###..###.##..#..#####.....####.##. +.##.#...#..####..#.....##..###.#.#.#..#...##...###...#..##.....#..##...##..###.#..#####...##.#..###. +.#.#.#..####...#.###.###....##....#.#..#.#..#..#####.#..#...#.###.........##.####.####..#.##..##..#. +#..##.####.#..##....#.####.###...#.#..#####.##.#..#......###.##...#....#.##..#....##.#.....#.##.##.# +#..#..#.###.#..#.#.####.####..#.#.#..#.#...#....#######.####.............####..###.#..####.######.## +.#....####...#...#...#..#..##......#######.###.##..####.##.####.#####....##.###.#.###..#.#....#...#. From da979f53d09def02035587c97b9559da5c0b6019 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 20 Dec 2021 15:24:05 +0100 Subject: [PATCH 250/479] 2021: d20: ex2: add solution --- 2021/d20/ex2/ex2.py | 82 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100755 2021/d20/ex2/ex2.py diff --git a/2021/d20/ex2/ex2.py b/2021/d20/ex2/ex2.py new file mode 100755 index 0000000..4564961 --- /dev/null +++ b/2021/d20/ex2/ex2.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List, NamedTuple, Set, Tuple + + +class Point(NamedTuple): + x: int + y: int + + +Algorithm = List[bool] +Image = Set[Point] + + +def solve(input: List[str]) -> int: + def parse() -> Tuple[Algorithm, Image]: + algo_str, blank, *image_str = input + + assert blank == "" # Sanity check + assert len(algo_str) == 512 # Sanity check + + algo = [c == "#" for c in algo_str] + image = { + Point(i, j) + for i in range(len(image_str)) + for j in range(len(image_str[0])) + if image_str[i][j] == "#" + } + + return algo, image + + def do_step(algo: Algorithm, image: Image, step: int) -> Image: + min_x, max_x = min(p.x for p in image), max(p.x for p in image) + min_y, max_y = min(p.y for p in image), max(p.y for p in image) + + def color(p: Point) -> bool: + # Always return true if we *know* that it is lit + if p in image: + return True + # Return early if the rules don't lead to a flashing infinity case + flashes_infinity = algo[0] and not algo[-1] + if not flashes_infinity: + return False + # Pixels in proximity to the image are assumed to change their state normally + if min_x <= p.x <= max_x and min_y <= p.y <= max_y: + return False + # Odd indices have a "lit infinity" which turns off, and vice versa + return (step % 2) == 1 + + def bits(p: Point) -> int: + x, y = p + res = 0 + for dx, dy in itertools.product(range(-1, 1 + 1), repeat=2): + res = (res << 1) + color(Point(x + dx, y + dy)) + return res + + # We know the image we care for cannot grow by more than 1 per turn + xs, ys = range(min_x - 1, max_x + 1 + 1), range(min_y - 1, max_y + 1 + 1) + + res: Image = set() + for p in map(Point._make, itertools.product(xs, ys)): + if algo[bits(p)]: + res.add(p) + + return res + + rules, image = parse() + for i in range(50): + image = do_step(rules, image, i) + + return len(image) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From d4d6bbe742e7674f419d8eb07d526d9e579b2c35 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 21 Dec 2021 15:04:37 +0100 Subject: [PATCH 251/479] 2021: d21: ex1: add input --- 2021/d21/ex1/input | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 2021/d21/ex1/input diff --git a/2021/d21/ex1/input b/2021/d21/ex1/input new file mode 100644 index 0000000..1002be5 --- /dev/null +++ b/2021/d21/ex1/input @@ -0,0 +1,2 @@ +Player 1 starting position: 8 +Player 2 starting position: 5 From ead3395a83f15d27689444266900391224c23955 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 21 Dec 2021 15:04:43 +0100 Subject: [PATCH 252/479] 2021: d21: ex1: add solution --- 2021/d21/ex1/ex1.py | 78 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100755 2021/d21/ex1/ex1.py diff --git a/2021/d21/ex1/ex1.py b/2021/d21/ex1/ex1.py new file mode 100755 index 0000000..5967837 --- /dev/null +++ b/2021/d21/ex1/ex1.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import Iterable, Iterator, List, NamedTuple, Tuple, TypeVar + +T = TypeVar("T") + + +def grouper(iterable: Iterable[T], n: int) -> Iterator[Tuple[T, ...]]: + args = [iter(iterable)] * n + return itertools.zip_longest(*args) + + +def take(n: int, iterable: Iterable[T]) -> List[T]: + return list(itertools.islice(iterable, n)) + + +class PlayerStats(NamedTuple): + position: int + score: int + + +class GameState(NamedTuple): + p1: PlayerStats + p2: PlayerStats + total_rolls: int + + +WINNING_SCORE = 1000 + + +def solve(input: List[str]) -> int: + def parse() -> Tuple[int, int]: + p1, p2 = input[0].split(" ")[-1], input[1].split(" ")[-1] + return int(p1), int(p2) + + def deterministic_die() -> Iterator[int]: + return itertools.cycle(range(1, 100 + 1)) + + def do_turn(stats: PlayerStats, rolls: Iterator[int]) -> PlayerStats: + position, score = stats + roll = sum(take(3, rolls)) + position = ((position - 1 + roll) % 10) + 1 + score += position + return PlayerStats(position, score) + + def play_to_end(intial_state: GameState) -> GameState: + p1, p2, total_rolls = intial_state + die_rolls = deterministic_die() + + while True: + p1 = do_turn(p1, die_rolls) + total_rolls += 3 + if p1.score >= WINNING_SCORE: + break + p2 = do_turn(p2, die_rolls) + total_rolls += 3 + if p2.score >= WINNING_SCORE: + break + + return GameState(p1, p2, total_rolls) + + position1, position2 = parse() + p1, p2, total_rolls = play_to_end( + GameState(PlayerStats(position1, 0), PlayerStats(position2, 0), 0) + ) + # The loser *must* have the lowest score + return min(p1.score, p2.score) * total_rolls + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 2975f1f898397998d38d01fe678840d517e40ff0 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 21 Dec 2021 15:04:49 +0100 Subject: [PATCH 253/479] 2021: d21: ex2: add input --- 2021/d21/ex2/input | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 2021/d21/ex2/input diff --git a/2021/d21/ex2/input b/2021/d21/ex2/input new file mode 100644 index 0000000..1002be5 --- /dev/null +++ b/2021/d21/ex2/input @@ -0,0 +1,2 @@ +Player 1 starting position: 8 +Player 2 starting position: 5 From 0e47d63758f3fe559ca7d172e2adafd74c9a89c7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 21 Dec 2021 15:04:56 +0100 Subject: [PATCH 254/479] 2021: d21: ex2: add solution --- 2021/d21/ex2/ex2.py | 79 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 2021/d21/ex2/ex2.py diff --git a/2021/d21/ex2/ex2.py b/2021/d21/ex2/ex2.py new file mode 100755 index 0000000..5184285 --- /dev/null +++ b/2021/d21/ex2/ex2.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python + +import functools +import itertools +import sys +from typing import Iterable, Iterator, List, NamedTuple, Tuple, TypeVar + +T = TypeVar("T") + + +def grouper(iterable: Iterable[T], n: int) -> Iterator[Tuple[T, ...]]: + args = [iter(iterable)] * n + return itertools.zip_longest(*args) + + +def take(n: int, iterable: Iterable[T]) -> List[T]: + return list(itertools.islice(iterable, n)) + + +class PlayerStats(NamedTuple): + position: int + score: int + + +ROLL_TO_UNIVERSES = { + 3: 1, + 4: 3, + 5: 6, + 6: 7, + 7: 6, + 8: 3, + 9: 1, +} + +WINNING_SCORE = 21 + + +def solve(input: List[str]) -> int: + def parse() -> Tuple[int, int]: + p1, p2 = input[0].split(" ")[-1], input[1].split(" ")[-1] + return int(p1), int(p2) + + def do_turn(stats: PlayerStats, roll: int) -> PlayerStats: + position, score = stats + position = ((position - 1 + roll) % 10) + 1 + score += position + return PlayerStats(position, score) + + @functools.cache + def play_universes(p1: PlayerStats, p2: PlayerStats) -> Tuple[int, int]: + p1_wins, p2_wins = 0, 0 + + # Only 9 different outcomes from a 3d3 roll, with differing probabilities + for roll, roll_probability in ROLL_TO_UNIVERSES.items(): + new_p1 = do_turn(p1, roll) + if new_p1.score >= WINNING_SCORE: + # Account for differing number of split universes when counting a win + p1_wins += roll_probability + continue + + # Exchange p1 and p2 roles, count their wins, and account for number of splits + new_p2_wins, new_p1_wins = play_universes(p2, new_p1) + p1_wins += new_p1_wins * roll_probability + p2_wins += new_p2_wins * roll_probability + + return p1_wins, p2_wins + + p1, p2 = parse() + p1_wins, p2_wins = play_universes(PlayerStats(p1, 0), PlayerStats(p2, 0)) + return max(p1_wins, p2_wins) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 2dfd17a6de3849832160dbb9b25a9df5ddfae03b Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 22 Dec 2021 16:41:00 +0100 Subject: [PATCH 255/479] 2021: d22: ex1: add input --- 2021/d22/ex1/input | 420 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 420 insertions(+) create mode 100644 2021/d22/ex1/input diff --git a/2021/d22/ex1/input b/2021/d22/ex1/input new file mode 100644 index 0000000..072c596 --- /dev/null +++ b/2021/d22/ex1/input @@ -0,0 +1,420 @@ +on x=-4..48,y=-30..24,z=-39..15 +on x=-19..33,y=-15..29,z=-4..42 +on x=-1..49,y=-14..38,z=-27..20 +on x=-28..16,y=-16..36,z=-21..27 +on x=-23..27,y=-26..20,z=-23..22 +on x=-8..43,y=-10..43,z=-21..30 +on x=-45..4,y=-6..47,z=-15..33 +on x=-22..22,y=-6..45,z=-29..19 +on x=-30..18,y=-47..-3,z=-24..22 +on x=-6..43,y=-37..8,z=-19..27 +off x=18..28,y=-15..4,z=32..49 +on x=-2..45,y=-17..35,z=-15..34 +off x=-49..-33,y=-49..-31,z=-10..5 +on x=-31..21,y=-12..34,z=-48..6 +off x=-38..-27,y=-44..-25,z=-17..-4 +on x=-21..32,y=-9..45,z=-18..33 +off x=-14..3,y=-10..-1,z=-40..-29 +on x=-30..16,y=-13..34,z=-4..45 +off x=24..34,y=13..32,z=-38..-25 +on x=-27..26,y=-14..38,z=-24..22 +on x=35544..55136,y=51736..62748,z=-58537..-33425 +on x=33690..50869,y=-78828..-40948,z=-44269..-23196 +on x=65407..77846,y=-1962..21102,z=30745..35336 +on x=43820..63036,y=45669..68304,z=-27802..-19946 +on x=-80968..-79217,y=-15189..550,z=-20396..-2177 +on x=22543..55131,y=-50184..-36252,z=46098..64106 +on x=-12595..7924,y=-24867..-13344,z=-96867..-68102 +on x=9874..31255,y=65277..89043,z=-936..16277 +on x=-13411..5153,y=-10968..4147,z=-87107..-78849 +on x=-8897..8799,y=57380..81655,z=9642..37776 +on x=67474..84855,y=-6483..10922,z=41290..57415 +on x=-8012..1755,y=34193..64326,z=48900..73023 +on x=54961..78882,y=-7659..5406,z=36768..70357 +on x=4538..32860,y=-47844..-36498,z=51393..73621 +on x=16397..28684,y=16381..47358,z=-87090..-57131 +on x=38468..57198,y=-14413..-5639,z=-67748..-57437 +on x=-60663..-47089,y=-34032..-26482,z=49838..59849 +on x=-35900..-24050,y=-62434..-43634,z=35478..45195 +on x=39580..65361,y=49921..69519,z=19635..40186 +on x=72891..74867,y=-42056..-22591,z=-6916..20783 +on x=1951..24816,y=-74448..-64168,z=-36633..-31963 +on x=24833..49754,y=20298..43211,z=51546..73514 +on x=-3167..30380,y=35722..38122,z=-76109..-57000 +on x=-82903..-79067,y=-8395..20541,z=-5265..4392 +on x=3218..14953,y=-13800..-1624,z=-89481..-62873 +on x=-53283..-38277,y=1641..4903,z=-70901..-45748 +on x=-32141..-25640,y=-34847..-13896,z=69407..86876 +on x=37990..61788,y=44601..58722,z=-49195..-29888 +on x=46963..82000,y=-20841..-6866,z=27132..57574 +on x=53439..75061,y=42180..56045,z=-29192..-7810 +on x=56225..83464,y=-29936..-24016,z=9181..40276 +on x=-25381..6615,y=-36495..-470,z=-92049..-72629 +on x=32658..54160,y=47754..70225,z=-6772..7057 +on x=1541..22570,y=64100..80080,z=-46051..-26336 +on x=290..25368,y=-75499..-38271,z=-71991..-44993 +on x=-90436..-74173,y=-16161..9329,z=-6785..12872 +on x=-77341..-60209,y=12324..44621,z=-14282..15269 +on x=43442..74799,y=38197..48084,z=9898..46142 +on x=-8617..-3246,y=-18762..3821,z=-87843..-72818 +on x=30362..51314,y=-8722..8473,z=54067..78087 +on x=-27208..-9871,y=10214..23370,z=70814..83559 +on x=-34980..-14547,y=-78208..-70283,z=-27640..-3899 +on x=-42751..-6005,y=44998..73226,z=34016..57989 +on x=-82302..-64007,y=13489..29455,z=-38227..-20899 +on x=-11988..12700,y=-28404..-6516,z=-90902..-70602 +on x=33172..47497,y=-22050..5845,z=63959..73452 +on x=4520..20681,y=53723..81778,z=42603..64776 +on x=9456..39703,y=48507..61312,z=-51529..-40905 +on x=-40098..-6364,y=30241..51715,z=-80424..-53739 +on x=12558..41048,y=-75142..-67808,z=-28847..-5450 +on x=-45305..-37476,y=59373..65800,z=30613..52009 +on x=-51862..-28691,y=-80526..-49298,z=7585..33680 +on x=33988..56509,y=-76294..-52403,z=-24060..8376 +on x=66701..87231,y=-14532..2225,z=-2979..12349 +on x=6390..28035,y=24319..41006,z=66533..72374 +on x=-92154..-59055,y=17719..22642,z=6955..28468 +on x=33232..43716,y=-9213..10287,z=-76824..-69144 +on x=-15670..8102,y=55811..91367,z=-36831..-16337 +on x=-11992..-4723,y=51539..87697,z=23232..47761 +on x=-5295..18741,y=-72590..-48553,z=-73622..-40811 +on x=18186..41716,y=67026..78411,z=-34911..-5988 +on x=-68762..-64823,y=-45789..-18913,z=9605..45048 +on x=-12471..-8333,y=-49562..-33936,z=-68222..-58934 +on x=-1314..15331,y=-30976..-16222,z=67572..84940 +on x=-67163..-61062,y=-53863..-18643,z=-47613..-15657 +on x=71390..87446,y=-28061..-15108,z=-17260..5398 +on x=43837..73348,y=47081..51019,z=-27859..-13016 +on x=38886..48555,y=44108..70423,z=28181..43111 +on x=-77134..-58601,y=-13936..11454,z=22269..39015 +on x=16000..20829,y=-96924..-65406,z=-17350..6468 +on x=-63622..-40677,y=39467..48832,z=28335..33734 +on x=-83957..-71425,y=18893..29929,z=-11533..-2293 +on x=-92470..-69285,y=14707..19654,z=18369..26120 +on x=13641..38318,y=-32184..-19122,z=-82832..-59293 +on x=38368..44793,y=7451..23119,z=-79164..-55642 +on x=-34078..-24088,y=37612..70266,z=-57847..-30148 +on x=45511..61076,y=25218..47528,z=21820..50200 +on x=-9251..14390,y=-26731..9955,z=-84053..-62781 +on x=7166..29475,y=65191..78750,z=-56267..-31353 +on x=-1215..16834,y=-98600..-71219,z=-235..21112 +on x=66193..69134,y=28687..42487,z=-17341..-7323 +on x=-32865..-5842,y=14478..43666,z=-87864..-55075 +on x=40182..48489,y=57444..85093,z=-21528..-5631 +on x=-37152..-5019,y=30492..43671,z=56217..78887 +on x=46382..55909,y=-67994..-58067,z=-16846..-3160 +on x=32700..56924,y=22430..44279,z=41830..63068 +on x=26774..34296,y=-80268..-60786,z=13217..29206 +on x=-5802..1019,y=34264..65124,z=50883..74910 +on x=-42392..-13729,y=13094..41810,z=-79316..-51263 +on x=-16021..473,y=57439..86998,z=-46753..-30286 +on x=-62595..-45603,y=4608..9583,z=57915..82579 +on x=-4473..1973,y=57840..73813,z=-68167..-33772 +on x=-83547..-62073,y=-33126..-18871,z=-17468..2918 +on x=-46545..-39844,y=-70331..-60310,z=13062..37682 +on x=-31519..469,y=-711..7423,z=-94431..-62298 +on x=60002..89047,y=-29111..-9661,z=12744..28690 +on x=-1450..20279,y=-13723..5802,z=-98979..-77404 +on x=-7347..23250,y=-90904..-68475,z=-38218..-31606 +on x=-15622..-8177,y=62746..92916,z=-31184..3126 +on x=-53804..-52634,y=45539..66268,z=-46218..-7476 +on x=-65959..-57397,y=36117..52643,z=19481..45747 +on x=43928..54629,y=8065..16553,z=-72837..-47865 +on x=-77510..-62388,y=-54448..-20445,z=-16968..15103 +on x=28751..32027,y=-47236..-17317,z=55145..71895 +on x=-63166..-38470,y=-77573..-47295,z=-20443..6131 +on x=28272..58068,y=53583..65317,z=5882..27642 +on x=-87017..-47718,y=-29823..-6062,z=24910..39735 +on x=9462..38606,y=66092..87363,z=14791..34975 +on x=60870..83615,y=16444..35987,z=-1375..18757 +on x=-61017..-51891,y=38733..57918,z=-55845..-32294 +on x=17842..45753,y=58058..78326,z=16889..44761 +on x=66304..81980,y=-51921..-35554,z=-1171..8798 +on x=-33872..-17168,y=37853..39657,z=48783..81069 +on x=17025..42143,y=-32845..-10455,z=65973..83280 +on x=35256..55278,y=-72080..-40057,z=7549..32601 +on x=30028..53691,y=-15660..2864,z=55672..84796 +on x=-93477..-72259,y=13273..37746,z=-13865..-732 +on x=8114..19004,y=61128..80348,z=40437..54937 +on x=35042..46361,y=23302..44970,z=57849..81964 +on x=15670..27956,y=-50201..-32885,z=43089..78261 +on x=-22149..-4701,y=70832..92978,z=-18375..8955 +on x=-11307..5395,y=64032..80176,z=16681..41609 +on x=-43425..-28061,y=67202..74457,z=-36752..-9283 +on x=-47157..-23853,y=22746..46164,z=59388..69758 +on x=-66470..-41360,y=24611..42210,z=-58386..-38174 +on x=24871..39254,y=52512..83471,z=-2514..17277 +on x=9854..12006,y=-42027..-22328,z=-78647..-71822 +on x=-63822..-45142,y=-74770..-40518,z=-12693..-1226 +on x=7514..29519,y=-70540..-40815,z=50673..66670 +on x=-86355..-64456,y=1739..18125,z=21907..45251 +on x=23938..36472,y=-35351..-19431,z=56359..87714 +on x=-61952..-33569,y=51907..81871,z=-38456..-18781 +on x=54670..64202,y=19047..45756,z=-35785..-24071 +on x=-62952..-32348,y=-23703..-756,z=64776..79497 +on x=42131..72686,y=43348..69631,z=-12082..9850 +on x=19070..30412,y=980..20591,z=-90809..-62142 +on x=-9351..-4058,y=46899..70855,z=-57535..-32949 +on x=58882..72704,y=21502..45491,z=26413..44449 +on x=27826..59456,y=-80504..-41682,z=17382..44358 +on x=-48248..-41584,y=23606..41769,z=54404..66807 +on x=803..3373,y=-78943..-70599,z=14956..29213 +on x=-77364..-60633,y=-36875..-17085,z=-1174..21376 +on x=-71159..-63592,y=-30044..-11779,z=-61398..-36500 +on x=-69639..-51727,y=-25463..-11440,z=35873..47448 +on x=-14747..1355,y=-90524..-63391,z=-33627..-15447 +on x=-14250..14802,y=-51215..-28495,z=61720..73235 +on x=-34423..-6304,y=-44713..-24670,z=65483..74818 +on x=62322..90758,y=13367..39938,z=7438..27708 +on x=46367..81400,y=11677..35279,z=-47304..-24771 +on x=4379..23035,y=61932..84911,z=-63724..-43631 +on x=-89042..-68392,y=-5068..16120,z=-14807..4087 +on x=63034..91408,y=-10916..23888,z=12401..43459 +on x=-82262..-59907,y=3979..40319,z=-1175..25220 +on x=16006..42587,y=-72561..-58071,z=-33042..-9704 +on x=68016..92195,y=8804..14233,z=-33255..-1477 +on x=-50921..-37413,y=45745..81563,z=1283..20895 +on x=11428..31965,y=47684..73555,z=26199..46769 +on x=-22972..1981,y=16390..37660,z=62583..75045 +on x=33829..56047,y=53258..57241,z=-44084..-20261 +on x=-84051..-68366,y=29094..43279,z=-17225..10812 +on x=50085..75114,y=6497..31618,z=-37737..-17385 +on x=17484..32905,y=-48591..-23834,z=-75180..-54610 +on x=51877..82949,y=-18174..-5750,z=-53652..-42825 +on x=32775..58264,y=-11346..9920,z=57936..66561 +on x=-52169..-28507,y=-90305..-53670,z=-19641..13206 +on x=-71218..-41412,y=-59994..-48983,z=15647..33905 +on x=26805..52467,y=62380..84830,z=-4520..10963 +on x=-4087..2092,y=71217..97333,z=8093..33139 +on x=-80230..-57401,y=-31567..3147,z=39782..58307 +on x=-80572..-67522,y=31920..50297,z=-7054..10350 +on x=-71271..-49989,y=-37730..-28383,z=37368..55962 +on x=-75528..-56735,y=37170..52802,z=-34426..-19488 +on x=64763..85408,y=-7784..5034,z=-41782..-15632 +on x=-61687..-55301,y=54758..61276,z=-15846..9067 +on x=30543..63245,y=-18542..-4101,z=-79361..-45457 +on x=-14932..5661,y=54028..79525,z=-61556..-32216 +on x=24493..31197,y=-34578..1825,z=63560..86978 +on x=-61036..-47222,y=14404..38815,z=29338..54873 +on x=-38192..-8201,y=-81948..-57915,z=-17188..10726 +on x=1990..15491,y=56137..78488,z=-42010..-28371 +on x=5049..33267,y=-79591..-57008,z=-42567..-22184 +on x=24693..34274,y=24506..45113,z=-79046..-65370 +on x=68172..98565,y=-14312..8628,z=-9721..13285 +on x=-18235..6826,y=-25122..10050,z=60096..85636 +on x=45928..69951,y=-60287..-37529,z=-20540..7359 +on x=-32041..-5059,y=51092..63261,z=-66204..-31843 +on x=63653..71469,y=-34873..-31161,z=14048..39702 +on x=22396..43880,y=-3824..14660,z=-90531..-56170 +on x=-1717..21789,y=53858..67026,z=-58144..-47816 +on x=-51019..-40959,y=-75814..-60550,z=11755..46123 +on x=-57489..-39503,y=-64465..-33404,z=-48668..-30131 +on x=27760..59108,y=42790..67256,z=17743..35790 +on x=-43692..-29811,y=-88277..-59083,z=5968..37461 +on x=-47420..-22185,y=-68408..-52385,z=23869..44928 +on x=39709..61505,y=-21268..1882,z=-76594..-60038 +on x=54698..76952,y=-17074..10219,z=24567..44175 +on x=-95465..-62390,y=-29895..-23300,z=-11863..4898 +on x=23365..40278,y=58938..80416,z=-21545..9812 +on x=11923..35757,y=-66990..-41080,z=-61382..-33846 +on x=67045..75089,y=-11897..4681,z=-47955..-24267 +on x=-90376..-59893,y=117..26316,z=28188..35096 +off x=24651..28210,y=-24590..-10312,z=66417..75292 +off x=-43951..-18830,y=-69398..-52261,z=28497..50225 +off x=42514..62323,y=-60372..-24865,z=37347..49320 +on x=49798..77900,y=-72682..-49927,z=-10258..958 +off x=24604..45145,y=36058..57891,z=-53557..-34761 +on x=-65518..-39972,y=34159..54763,z=-17646..9176 +off x=-76836..-49612,y=27033..40308,z=24773..37790 +off x=41029..63639,y=34627..54572,z=-60195..-35060 +off x=5440..40626,y=31825..56887,z=58565..74579 +on x=-85410..-68908,y=-16763..12913,z=1884..24605 +on x=-70712..-56718,y=-48053..-38417,z=-37942..-32604 +off x=-66574..-45489,y=34467..41894,z=-46802..-24009 +off x=-30928..-7167,y=43518..70824,z=33329..64950 +off x=-52088..-17091,y=-28441..-10616,z=56304..83190 +off x=73277..76646,y=-5922..10725,z=23075..35243 +off x=-44861..-12403,y=-18397..9805,z=-90975..-64778 +on x=-19159..-8086,y=-84649..-57626,z=-4777..30377 +on x=-48235..-45399,y=-76542..-41786,z=-27853..-11708 +off x=-41696..-17405,y=-81352..-58226,z=-51727..-15321 +on x=-21612..8433,y=-88881..-57104,z=20197..38496 +off x=64866..82781,y=-35287..-19222,z=2225..31593 +off x=-60086..-31957,y=-66807..-52584,z=-47785..-31167 +on x=-75232..-65410,y=6879..15928,z=25821..33108 +on x=49721..74332,y=-32211..-5492,z=37490..67240 +on x=-69008..-59258,y=-67365..-39177,z=2702..22494 +on x=40598..77320,y=-44858..-24495,z=-39106..-18658 +on x=-66046..-43012,y=9311..31541,z=51758..55618 +on x=-74902..-54476,y=9991..38601,z=-18468..-2400 +off x=934..27205,y=-52862..-47494,z=-78005..-46221 +off x=36318..42994,y=63750..79912,z=-11834..6870 +off x=-9448..6260,y=69407..96104,z=3742..26473 +on x=34180..59194,y=56640..70053,z=-6782..2219 +off x=-71868..-58289,y=-50419..-43052,z=-16738..3185 +off x=-55443..-21609,y=-43083..-21999,z=-75650..-51578 +off x=-3124..2680,y=26555..50324,z=-84693..-65786 +off x=65726..80418,y=-21970..-4777,z=28280..55831 +off x=-12755..2382,y=21228..27803,z=-80546..-62078 +on x=-70824..-46210,y=-46992..-35115,z=-6484..18899 +off x=19667..33161,y=59955..85149,z=19245..33893 +off x=5654..11498,y=56328..89517,z=-51989..-33158 +on x=-20574..-5577,y=39609..41373,z=66022..82822 +on x=-16635..-2094,y=61755..97252,z=-10151..3379 +off x=-61710..-29756,y=-53529..-20524,z=50061..67887 +off x=12337..45140,y=60042..89297,z=9701..36968 +off x=-42381..-17258,y=-40434..-12651,z=-79807..-52351 +off x=-57645..-52169,y=-20403..4163,z=-62673..-54906 +on x=26686..40465,y=7785..22540,z=72481..83980 +on x=-23030..-18498,y=-31032..-9833,z=61054..83029 +on x=-10867..9838,y=45397..66784,z=-51464..-39505 +off x=56847..77259,y=-17184..2949,z=-55341..-38773 +on x=15524..40419,y=-42588..-27508,z=61847..79655 +on x=-91271..-71952,y=15556..34300,z=14005..28676 +on x=65780..81595,y=-29919..-17998,z=28053..44908 +on x=31479..58997,y=55159..82009,z=-20523..11865 +on x=2149..19762,y=-86184..-56666,z=18206..36344 +off x=27069..56637,y=-73675..-53032,z=-13508..15432 +on x=67416..85446,y=2917..28648,z=5402..35606 +on x=-44500..-23236,y=-91223..-65053,z=-3525..14263 +on x=-75739..-51755,y=49292..67356,z=-23308..10605 +on x=-34841..-9806,y=-19491..-1709,z=64409..96498 +on x=9551..24535,y=65245..79434,z=-24616..-12986 +on x=-83205..-55438,y=-39820..-19718,z=22074..38142 +off x=-71953..-53073,y=-44959..-30448,z=34060..50956 +off x=-48764..-35469,y=-61736..-43279,z=41195..52261 +on x=15917..37063,y=-75662..-56956,z=18898..36595 +on x=37396..54561,y=-29290..-16200,z=64044..76199 +off x=-14179..10592,y=-80049..-51222,z=38386..68137 +on x=-29902..-21453,y=-94461..-71699,z=-6448..6244 +off x=66863..74181,y=9066..35219,z=-28995..-8750 +on x=7191..37647,y=-74506..-52303,z=45114..65447 +off x=53433..79524,y=21402..48649,z=5035..16962 +off x=54924..71855,y=28434..48319,z=-27603..-14643 +off x=44568..73341,y=41377..69060,z=2132..18323 +off x=32192..46654,y=-86893..-59876,z=21008..38923 +off x=-26751..-3856,y=21442..39353,z=-84098..-58106 +off x=63303..65533,y=42998..54340,z=3302..15908 +on x=4235..13687,y=-50180..-34351,z=-76521..-58485 +on x=-33290..-9251,y=40469..57296,z=-66106..-48947 +off x=-81172..-62578,y=6482..36668,z=-45865..-22894 +off x=-81904..-65892,y=-11941..4053,z=-42478..-22147 +off x=35829..70381,y=41448..69602,z=18749..38582 +on x=-10433..-2099,y=-82602..-51316,z=36823..64092 +on x=38080..53913,y=36937..47688,z=39322..71479 +on x=-21560..-4521,y=66563..85082,z=20252..45582 +off x=-85857..-68417,y=-41847..-28573,z=-7729..2847 +on x=-68327..-31793,y=-21900..-289,z=56789..69398 +on x=-67562..-42688,y=16743..32262,z=22000..44570 +off x=48052..67704,y=-23423..4103,z=44261..78217 +on x=-22576..-194,y=61895..82600,z=-40620..-5831 +on x=-16931..7379,y=-15102..1748,z=-87988..-74150 +on x=-26047..12491,y=55107..74563,z=21205..33348 +off x=-25435..-946,y=-82352..-52608,z=33364..53843 +off x=-5833..18798,y=39831..56611,z=-72213..-47388 +off x=-5822..14115,y=-98135..-64976,z=-20248..9788 +on x=-15154..670,y=-75227..-54455,z=33215..60140 +off x=18909..48180,y=62835..69076,z=27175..44519 +off x=-58838..-51811,y=-8942..14922,z=-72422..-48233 +on x=47362..82935,y=-58723..-33218,z=-14356..7150 +on x=-64609..-42063,y=-58790..-35608,z=-50387..-39455 +on x=9832..20482,y=40076..58832,z=41495..59344 +on x=-29810..-7444,y=-73368..-47276,z=-64805..-37263 +on x=-66021..-35774,y=44614..81545,z=-2880..20810 +on x=30417..44347,y=64937..66634,z=27916..47000 +on x=14925..33804,y=-59990..-48743,z=-55335..-46081 +off x=-45330..-16788,y=-2912..25446,z=-78240..-63474 +off x=-75837..-58168,y=-7970..3635,z=30476..60250 +off x=-12011..13258,y=-89694..-69437,z=23137..41026 +on x=58141..91626,y=-3240..13201,z=23976..30297 +off x=-69440..-42294,y=-3341..11023,z=-75797..-55367 +off x=28775..48112,y=49087..66505,z=-47634..-19480 +off x=17405..40878,y=-78515..-63319,z=20589..35237 +on x=46505..79525,y=46254..52587,z=-16956..-979 +off x=14778..49904,y=51599..61793,z=-68550..-48309 +off x=-17127..-2237,y=-80624..-47506,z=-43373..-23646 +on x=42852..55498,y=60931..70121,z=-913..10924 +on x=53866..67942,y=10584..28056,z=44574..51590 +on x=52164..61481,y=25073..45284,z=20579..54644 +off x=-38817..-3710,y=49963..73191,z=35577..68161 +off x=74571..87380,y=-26549..-8365,z=-41849..-15478 +on x=-11635..-3471,y=-2190..2324,z=-84076..-75086 +on x=-87133..-75239,y=-9635..11698,z=-1887..26028 +off x=-65700..-58148,y=-27843..-17147,z=46837..51188 +on x=-8973..19499,y=-57314..-31198,z=-82041..-63223 +on x=-8234..7290,y=72201..85190,z=-41415..-12525 +off x=-69515..-63879,y=-11878..12202,z=-61049..-31131 +on x=-593..25155,y=71211..88034,z=-13360..13827 +off x=-41118..-22761,y=-51023..-43558,z=42131..56647 +on x=45695..64697,y=-70454..-47486,z=4653..27783 +off x=-69391..-49194,y=-6224..21792,z=-56102..-46702 +on x=12567..16989,y=63359..83739,z=-7433..18488 +on x=-47607..-28894,y=-76890..-58285,z=16882..41914 +on x=-30015..4988,y=14737..22104,z=62453..85467 +on x=-54404..-44808,y=-50918..-32444,z=-49452..-43588 +off x=12954..44089,y=-28041..-5913,z=67605..87219 +on x=-82272..-53812,y=25783..42439,z=-42516..-12409 +off x=-94480..-60573,y=-25004..-2471,z=-2718..11057 +off x=51649..65225,y=-14724..6310,z=38450..66205 +off x=69856..80286,y=21304..46173,z=-11935..15518 +on x=-77660..-69829,y=-25072..-3423,z=25500..50923 +off x=37047..59725,y=51835..79489,z=272..35097 +on x=-67713..-31489,y=35835..38541,z=-57246..-47586 +on x=-18556..-7707,y=-17678..-8114,z=-87728..-59085 +off x=-78610..-61520,y=11250..38454,z=-8429..3203 +off x=-44797..-21166,y=-14536..9531,z=59712..82290 +off x=45719..59834,y=-18760..-4920,z=-52363..-46018 +off x=-35717..-12687,y=-83577..-62558,z=-8962..21313 +on x=44536..59941,y=29580..64623,z=-24759..-4916 +off x=-18864..-3108,y=48226..78222,z=42732..67354 +on x=12357..39639,y=-44392..-26900,z=-82899..-54317 +off x=-58310..-24651,y=15307..42877,z=-77149..-40022 +on x=-43945..-20285,y=70712..82950,z=-4121..3442 +off x=7101..22967,y=64872..83707,z=-25824..-9526 +on x=-62076..-43190,y=-21347..-3360,z=-63874..-36231 +off x=6340..27337,y=-73151..-47585,z=46269..52581 +off x=47397..57486,y=-63732..-40590,z=44295..49537 +off x=-78613..-57237,y=-56534..-32459,z=-35285..-13648 +off x=-31072..-7685,y=-38542..-7098,z=57760..83347 +on x=-63099..-35927,y=-77355..-53793,z=29264..33129 +on x=-3649..25126,y=4399..19136,z=-90001..-77851 +off x=8510..11246,y=57072..89213,z=11594..31605 +off x=-16380..3546,y=28043..58308,z=62410..70708 +off x=-73518..-51371,y=8803..36830,z=27148..50003 +off x=-76901..-55804,y=-20544..-14756,z=-34886..-16018 +on x=42245..58590,y=-60103..-37286,z=-38862..-20729 +off x=2872..20494,y=76096..89070,z=-30072..-13378 +off x=62225..70240,y=18398..51759,z=-26426..-10316 +on x=-8268..25701,y=-44287..-22096,z=-73605..-62816 +on x=12693..28817,y=-90968..-58755,z=-38493..-10212 +on x=-72781..-51700,y=-59730..-40159,z=-22471..-10811 +off x=-86186..-61431,y=-40796..-16811,z=-20606..1945 +on x=19756..40482,y=41370..75797,z=22120..46137 +on x=-38689..-13316,y=-24252..-16211,z=66862..80344 +on x=25358..46927,y=-81264..-64854,z=29512..35413 +on x=-16755..18260,y=-75084..-53865,z=48791..62218 +on x=37799..45278,y=38376..53913,z=31553..51525 +on x=-78288..-65705,y=-20882..5515,z=-56620..-32490 +off x=-14779..-3865,y=-35491..-12433,z=60969..77610 +on x=1041..7426,y=-75565..-54588,z=36056..52921 +on x=-41864..-34775,y=22219..51820,z=40842..71780 +off x=-23755..2275,y=51063..64402,z=-67945..-44438 +on x=-93770..-74301,y=-30533..2469,z=-4612..7196 +on x=-59566..-38442,y=-68259..-32849,z=36360..51994 +on x=43187..57027,y=-18906..-8453,z=-77163..-57489 +on x=-29794..-6913,y=28460..55404,z=-79855..-58015 +off x=-57236..-52204,y=-21814..-7565,z=38317..74160 +off x=56146..75194,y=-39180..-18839,z=-56810..-31930 +on x=-66300..-58204,y=-19301..-4228,z=-61589..-39254 +off x=-73278..-68405,y=22614..43899,z=-16199..-10518 +on x=57074..79996,y=-6578..17919,z=33160..54010 +off x=-40719..-2100,y=65789..80371,z=34406..44030 +on x=-44080..-27053,y=2572..27247,z=51202..87551 +on x=-25151..-7880,y=-60771..-53496,z=-55535..-47740 +off x=-14214..11970,y=-4404..16997,z=-90900..-64733 +off x=16310..46047,y=55884..79489,z=-14464..20211 +on x=51594..75047,y=26992..37723,z=-11584..-911 +on x=-45309..-20784,y=44096..70601,z=-52394..-33571 +off x=16870..35569,y=13219..31860,z=69493..87370 +on x=-22983..-16966,y=59778..70013,z=26803..46876 +on x=33076..50573,y=-80935..-61509,z=-30866..-2196 From ce432cf4618c382e2df161e39806e903d295c82a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 22 Dec 2021 16:41:07 +0100 Subject: [PATCH 256/479] 2021: d22: ex1: add solution --- 2021/d22/ex1/ex1.py | 173 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100755 2021/d22/ex1/ex1.py diff --git a/2021/d22/ex1/ex1.py b/2021/d22/ex1/ex1.py new file mode 100755 index 0000000..dac1513 --- /dev/null +++ b/2021/d22/ex1/ex1.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python + +import functools +import itertools +import sys +from typing import List, NamedTuple, Optional, Set, Tuple + + +class Point(NamedTuple): + x: int + y: int + z: int + + +class Cuboid(NamedTuple): + min: Point + max: Point + + +class Step(NamedTuple): + state: bool + bounds: Cuboid + + +Grid = Set[Cuboid] + +MAX_BOUND = 10000000000000000000000000000000000000000000 # Just a very large integer +MIN_BOUND = -MAX_BOUND + + +def solve(input: List[str]) -> int: + def parse() -> List[Step]: + def parse_step(line: str) -> Step: + state, cuboid = line.split(" ") + + xs, ys, zs = cuboid.split(",") + + min_x, max_x = map(int, xs[2:].split("..")) + min_y, max_y = map(int, ys[2:].split("..")) + min_z, max_z = map(int, zs[2:].split("..")) + + # Sanity check + assert min_x <= max_x + assert min_y <= max_y + assert min_z <= max_z + + bounds = Cuboid(Point(min_x, min_y, min_z), Point(max_x, max_y, max_z)) + + return Step(state == "on", bounds) + + return [parse_step(line) for line in input] + + def overlapping_range( + min_a: int, max_a: int, min_b: int, max_b: int + ) -> Optional[Tuple[int, int]]: + if max_a < min_b or min_a > max_b: + return None + return max(min_a, min_b), min(max_a, max_b) + + def overlapping_cube(cube: Cuboid, other: Cuboid) -> Optional[Cuboid]: + xs = overlapping_range(cube.min.x, cube.max.x, other.min.x, other.max.x) + ys = overlapping_range(cube.min.y, cube.max.y, other.min.y, other.max.y) + zs = overlapping_range(cube.min.z, cube.max.z, other.min.z, other.max.z) + + if xs is None or ys is None or zs is None: + return None + return Cuboid(Point(xs[0], ys[0], zs[0]), Point(xs[1], ys[1], zs[1])) + + def overlaps(cube: Cuboid, other: Cuboid) -> bool: + return overlapping_cube(cube, other) is not None + + def carve_out(grid: Grid, hole: Cuboid) -> Grid: + from itertools import filterfalse + + def do_carve(c: Cuboid) -> Set[Cuboid]: + cubes: Set[Cuboid] = set() + + min, max = c + + rightside = overlapping_range(hole.max.x + 1, MAX_BOUND, min.x, max.x) + leftside = overlapping_range(MIN_BOUND, hole.min.x - 1, min.x, max.x) + xs = overlapping_range(hole.min.x, hole.max.x, min.x, max.x) + if rightside is not None: + min_r, max_r = rightside + cubes.add( + Cuboid(Point(min_r, min.y, min.z), Point(max_r, max.y, max.z)) + ) + if leftside is not None: + min_l, max_l = leftside + cubes.add( + Cuboid(Point(min_l, min.y, min.z), Point(max_l, max.y, max.z)) + ) + + backside = overlapping_range(hole.max.y + 1, MAX_BOUND, min.y, max.y) + frontside = overlapping_range(MIN_BOUND, hole.min.y - 1, min.y, max.y) + ys = overlapping_range(hole.min.y, hole.max.y, min.y, max.y) + if backside is not None and xs is not None: + min_x, max_x = xs + min_b, max_b = backside + cubes.add( + Cuboid(Point(min_x, min_b, min.z), Point(max_x, max_b, max.z)) + ) + if frontside is not None and xs is not None: + min_x, max_x = xs + min_f, max_f = frontside + cubes.add( + Cuboid(Point(min_x, min_f, min.z), Point(max_x, max_f, max.z)) + ) + + topside = overlapping_range(hole.max.z + 1, MAX_BOUND, min.z, max.z) + bottomside = overlapping_range(MIN_BOUND, hole.min.z - 1, min.z, max.z) + if topside is not None and xs is not None and ys is not None: + min_x, max_x = xs + min_y, max_y = ys + min_t, max_t = topside + cubes.add( + Cuboid(Point(min_x, min_y, min_t), Point(max_x, max_y, max_t)) + ) + if bottomside is not None and xs is not None and ys is not None: + min_x, max_x = xs + min_y, max_y = ys + min_b, max_b = bottomside + cubes.add( + Cuboid(Point(min_x, min_y, min_b), Point(max_x, max_y, max_b)) + ) + + return cubes + + overlaps_us = lambda c: overlaps(c, hole) + + of_interest, other = filter(overlaps_us, grid), filterfalse(overlaps_us, grid) + + return set(other) | set( + itertools.chain.from_iterable(do_carve(c) for c in of_interest) + ) + + def apply(grid: Grid, step: Step) -> Grid: + cuboid = step.bounds + + # Remove that cube from the grid, potentially splitting cubes that overlap + grid = carve_out(grid, cuboid) + + # Add it back in if we want to turn on those cubes + if step.state: + grid.add(cuboid) + + return grid + + def count_cubes(c: Cuboid) -> int: + min, max = c + return (max.x + 1 - min.x) * (max.y + 1 - min.y) * (max.z + 1 - min.z) + + def score(grid: Grid) -> int: + area_of_interest = Cuboid(Point(-50, -50, -50), Point(50, 50, 50)) + of_interest = { + cube + for cube in map(lambda c: overlapping_cube(c, area_of_interest), grid) + if cube is not None + } + return sum(map(count_cubes, of_interest)) + + steps = parse() + grid: Grid = functools.reduce(apply, steps, set()) + return score(grid) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 17f903385c0f5a6eb500e2b0092e3b6ed61213a9 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 22 Dec 2021 16:41:13 +0100 Subject: [PATCH 257/479] 2021: d22: ex2: add input --- 2021/d22/ex2/input | 420 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 420 insertions(+) create mode 100644 2021/d22/ex2/input diff --git a/2021/d22/ex2/input b/2021/d22/ex2/input new file mode 100644 index 0000000..072c596 --- /dev/null +++ b/2021/d22/ex2/input @@ -0,0 +1,420 @@ +on x=-4..48,y=-30..24,z=-39..15 +on x=-19..33,y=-15..29,z=-4..42 +on x=-1..49,y=-14..38,z=-27..20 +on x=-28..16,y=-16..36,z=-21..27 +on x=-23..27,y=-26..20,z=-23..22 +on x=-8..43,y=-10..43,z=-21..30 +on x=-45..4,y=-6..47,z=-15..33 +on x=-22..22,y=-6..45,z=-29..19 +on x=-30..18,y=-47..-3,z=-24..22 +on x=-6..43,y=-37..8,z=-19..27 +off x=18..28,y=-15..4,z=32..49 +on x=-2..45,y=-17..35,z=-15..34 +off x=-49..-33,y=-49..-31,z=-10..5 +on x=-31..21,y=-12..34,z=-48..6 +off x=-38..-27,y=-44..-25,z=-17..-4 +on x=-21..32,y=-9..45,z=-18..33 +off x=-14..3,y=-10..-1,z=-40..-29 +on x=-30..16,y=-13..34,z=-4..45 +off x=24..34,y=13..32,z=-38..-25 +on x=-27..26,y=-14..38,z=-24..22 +on x=35544..55136,y=51736..62748,z=-58537..-33425 +on x=33690..50869,y=-78828..-40948,z=-44269..-23196 +on x=65407..77846,y=-1962..21102,z=30745..35336 +on x=43820..63036,y=45669..68304,z=-27802..-19946 +on x=-80968..-79217,y=-15189..550,z=-20396..-2177 +on x=22543..55131,y=-50184..-36252,z=46098..64106 +on x=-12595..7924,y=-24867..-13344,z=-96867..-68102 +on x=9874..31255,y=65277..89043,z=-936..16277 +on x=-13411..5153,y=-10968..4147,z=-87107..-78849 +on x=-8897..8799,y=57380..81655,z=9642..37776 +on x=67474..84855,y=-6483..10922,z=41290..57415 +on x=-8012..1755,y=34193..64326,z=48900..73023 +on x=54961..78882,y=-7659..5406,z=36768..70357 +on x=4538..32860,y=-47844..-36498,z=51393..73621 +on x=16397..28684,y=16381..47358,z=-87090..-57131 +on x=38468..57198,y=-14413..-5639,z=-67748..-57437 +on x=-60663..-47089,y=-34032..-26482,z=49838..59849 +on x=-35900..-24050,y=-62434..-43634,z=35478..45195 +on x=39580..65361,y=49921..69519,z=19635..40186 +on x=72891..74867,y=-42056..-22591,z=-6916..20783 +on x=1951..24816,y=-74448..-64168,z=-36633..-31963 +on x=24833..49754,y=20298..43211,z=51546..73514 +on x=-3167..30380,y=35722..38122,z=-76109..-57000 +on x=-82903..-79067,y=-8395..20541,z=-5265..4392 +on x=3218..14953,y=-13800..-1624,z=-89481..-62873 +on x=-53283..-38277,y=1641..4903,z=-70901..-45748 +on x=-32141..-25640,y=-34847..-13896,z=69407..86876 +on x=37990..61788,y=44601..58722,z=-49195..-29888 +on x=46963..82000,y=-20841..-6866,z=27132..57574 +on x=53439..75061,y=42180..56045,z=-29192..-7810 +on x=56225..83464,y=-29936..-24016,z=9181..40276 +on x=-25381..6615,y=-36495..-470,z=-92049..-72629 +on x=32658..54160,y=47754..70225,z=-6772..7057 +on x=1541..22570,y=64100..80080,z=-46051..-26336 +on x=290..25368,y=-75499..-38271,z=-71991..-44993 +on x=-90436..-74173,y=-16161..9329,z=-6785..12872 +on x=-77341..-60209,y=12324..44621,z=-14282..15269 +on x=43442..74799,y=38197..48084,z=9898..46142 +on x=-8617..-3246,y=-18762..3821,z=-87843..-72818 +on x=30362..51314,y=-8722..8473,z=54067..78087 +on x=-27208..-9871,y=10214..23370,z=70814..83559 +on x=-34980..-14547,y=-78208..-70283,z=-27640..-3899 +on x=-42751..-6005,y=44998..73226,z=34016..57989 +on x=-82302..-64007,y=13489..29455,z=-38227..-20899 +on x=-11988..12700,y=-28404..-6516,z=-90902..-70602 +on x=33172..47497,y=-22050..5845,z=63959..73452 +on x=4520..20681,y=53723..81778,z=42603..64776 +on x=9456..39703,y=48507..61312,z=-51529..-40905 +on x=-40098..-6364,y=30241..51715,z=-80424..-53739 +on x=12558..41048,y=-75142..-67808,z=-28847..-5450 +on x=-45305..-37476,y=59373..65800,z=30613..52009 +on x=-51862..-28691,y=-80526..-49298,z=7585..33680 +on x=33988..56509,y=-76294..-52403,z=-24060..8376 +on x=66701..87231,y=-14532..2225,z=-2979..12349 +on x=6390..28035,y=24319..41006,z=66533..72374 +on x=-92154..-59055,y=17719..22642,z=6955..28468 +on x=33232..43716,y=-9213..10287,z=-76824..-69144 +on x=-15670..8102,y=55811..91367,z=-36831..-16337 +on x=-11992..-4723,y=51539..87697,z=23232..47761 +on x=-5295..18741,y=-72590..-48553,z=-73622..-40811 +on x=18186..41716,y=67026..78411,z=-34911..-5988 +on x=-68762..-64823,y=-45789..-18913,z=9605..45048 +on x=-12471..-8333,y=-49562..-33936,z=-68222..-58934 +on x=-1314..15331,y=-30976..-16222,z=67572..84940 +on x=-67163..-61062,y=-53863..-18643,z=-47613..-15657 +on x=71390..87446,y=-28061..-15108,z=-17260..5398 +on x=43837..73348,y=47081..51019,z=-27859..-13016 +on x=38886..48555,y=44108..70423,z=28181..43111 +on x=-77134..-58601,y=-13936..11454,z=22269..39015 +on x=16000..20829,y=-96924..-65406,z=-17350..6468 +on x=-63622..-40677,y=39467..48832,z=28335..33734 +on x=-83957..-71425,y=18893..29929,z=-11533..-2293 +on x=-92470..-69285,y=14707..19654,z=18369..26120 +on x=13641..38318,y=-32184..-19122,z=-82832..-59293 +on x=38368..44793,y=7451..23119,z=-79164..-55642 +on x=-34078..-24088,y=37612..70266,z=-57847..-30148 +on x=45511..61076,y=25218..47528,z=21820..50200 +on x=-9251..14390,y=-26731..9955,z=-84053..-62781 +on x=7166..29475,y=65191..78750,z=-56267..-31353 +on x=-1215..16834,y=-98600..-71219,z=-235..21112 +on x=66193..69134,y=28687..42487,z=-17341..-7323 +on x=-32865..-5842,y=14478..43666,z=-87864..-55075 +on x=40182..48489,y=57444..85093,z=-21528..-5631 +on x=-37152..-5019,y=30492..43671,z=56217..78887 +on x=46382..55909,y=-67994..-58067,z=-16846..-3160 +on x=32700..56924,y=22430..44279,z=41830..63068 +on x=26774..34296,y=-80268..-60786,z=13217..29206 +on x=-5802..1019,y=34264..65124,z=50883..74910 +on x=-42392..-13729,y=13094..41810,z=-79316..-51263 +on x=-16021..473,y=57439..86998,z=-46753..-30286 +on x=-62595..-45603,y=4608..9583,z=57915..82579 +on x=-4473..1973,y=57840..73813,z=-68167..-33772 +on x=-83547..-62073,y=-33126..-18871,z=-17468..2918 +on x=-46545..-39844,y=-70331..-60310,z=13062..37682 +on x=-31519..469,y=-711..7423,z=-94431..-62298 +on x=60002..89047,y=-29111..-9661,z=12744..28690 +on x=-1450..20279,y=-13723..5802,z=-98979..-77404 +on x=-7347..23250,y=-90904..-68475,z=-38218..-31606 +on x=-15622..-8177,y=62746..92916,z=-31184..3126 +on x=-53804..-52634,y=45539..66268,z=-46218..-7476 +on x=-65959..-57397,y=36117..52643,z=19481..45747 +on x=43928..54629,y=8065..16553,z=-72837..-47865 +on x=-77510..-62388,y=-54448..-20445,z=-16968..15103 +on x=28751..32027,y=-47236..-17317,z=55145..71895 +on x=-63166..-38470,y=-77573..-47295,z=-20443..6131 +on x=28272..58068,y=53583..65317,z=5882..27642 +on x=-87017..-47718,y=-29823..-6062,z=24910..39735 +on x=9462..38606,y=66092..87363,z=14791..34975 +on x=60870..83615,y=16444..35987,z=-1375..18757 +on x=-61017..-51891,y=38733..57918,z=-55845..-32294 +on x=17842..45753,y=58058..78326,z=16889..44761 +on x=66304..81980,y=-51921..-35554,z=-1171..8798 +on x=-33872..-17168,y=37853..39657,z=48783..81069 +on x=17025..42143,y=-32845..-10455,z=65973..83280 +on x=35256..55278,y=-72080..-40057,z=7549..32601 +on x=30028..53691,y=-15660..2864,z=55672..84796 +on x=-93477..-72259,y=13273..37746,z=-13865..-732 +on x=8114..19004,y=61128..80348,z=40437..54937 +on x=35042..46361,y=23302..44970,z=57849..81964 +on x=15670..27956,y=-50201..-32885,z=43089..78261 +on x=-22149..-4701,y=70832..92978,z=-18375..8955 +on x=-11307..5395,y=64032..80176,z=16681..41609 +on x=-43425..-28061,y=67202..74457,z=-36752..-9283 +on x=-47157..-23853,y=22746..46164,z=59388..69758 +on x=-66470..-41360,y=24611..42210,z=-58386..-38174 +on x=24871..39254,y=52512..83471,z=-2514..17277 +on x=9854..12006,y=-42027..-22328,z=-78647..-71822 +on x=-63822..-45142,y=-74770..-40518,z=-12693..-1226 +on x=7514..29519,y=-70540..-40815,z=50673..66670 +on x=-86355..-64456,y=1739..18125,z=21907..45251 +on x=23938..36472,y=-35351..-19431,z=56359..87714 +on x=-61952..-33569,y=51907..81871,z=-38456..-18781 +on x=54670..64202,y=19047..45756,z=-35785..-24071 +on x=-62952..-32348,y=-23703..-756,z=64776..79497 +on x=42131..72686,y=43348..69631,z=-12082..9850 +on x=19070..30412,y=980..20591,z=-90809..-62142 +on x=-9351..-4058,y=46899..70855,z=-57535..-32949 +on x=58882..72704,y=21502..45491,z=26413..44449 +on x=27826..59456,y=-80504..-41682,z=17382..44358 +on x=-48248..-41584,y=23606..41769,z=54404..66807 +on x=803..3373,y=-78943..-70599,z=14956..29213 +on x=-77364..-60633,y=-36875..-17085,z=-1174..21376 +on x=-71159..-63592,y=-30044..-11779,z=-61398..-36500 +on x=-69639..-51727,y=-25463..-11440,z=35873..47448 +on x=-14747..1355,y=-90524..-63391,z=-33627..-15447 +on x=-14250..14802,y=-51215..-28495,z=61720..73235 +on x=-34423..-6304,y=-44713..-24670,z=65483..74818 +on x=62322..90758,y=13367..39938,z=7438..27708 +on x=46367..81400,y=11677..35279,z=-47304..-24771 +on x=4379..23035,y=61932..84911,z=-63724..-43631 +on x=-89042..-68392,y=-5068..16120,z=-14807..4087 +on x=63034..91408,y=-10916..23888,z=12401..43459 +on x=-82262..-59907,y=3979..40319,z=-1175..25220 +on x=16006..42587,y=-72561..-58071,z=-33042..-9704 +on x=68016..92195,y=8804..14233,z=-33255..-1477 +on x=-50921..-37413,y=45745..81563,z=1283..20895 +on x=11428..31965,y=47684..73555,z=26199..46769 +on x=-22972..1981,y=16390..37660,z=62583..75045 +on x=33829..56047,y=53258..57241,z=-44084..-20261 +on x=-84051..-68366,y=29094..43279,z=-17225..10812 +on x=50085..75114,y=6497..31618,z=-37737..-17385 +on x=17484..32905,y=-48591..-23834,z=-75180..-54610 +on x=51877..82949,y=-18174..-5750,z=-53652..-42825 +on x=32775..58264,y=-11346..9920,z=57936..66561 +on x=-52169..-28507,y=-90305..-53670,z=-19641..13206 +on x=-71218..-41412,y=-59994..-48983,z=15647..33905 +on x=26805..52467,y=62380..84830,z=-4520..10963 +on x=-4087..2092,y=71217..97333,z=8093..33139 +on x=-80230..-57401,y=-31567..3147,z=39782..58307 +on x=-80572..-67522,y=31920..50297,z=-7054..10350 +on x=-71271..-49989,y=-37730..-28383,z=37368..55962 +on x=-75528..-56735,y=37170..52802,z=-34426..-19488 +on x=64763..85408,y=-7784..5034,z=-41782..-15632 +on x=-61687..-55301,y=54758..61276,z=-15846..9067 +on x=30543..63245,y=-18542..-4101,z=-79361..-45457 +on x=-14932..5661,y=54028..79525,z=-61556..-32216 +on x=24493..31197,y=-34578..1825,z=63560..86978 +on x=-61036..-47222,y=14404..38815,z=29338..54873 +on x=-38192..-8201,y=-81948..-57915,z=-17188..10726 +on x=1990..15491,y=56137..78488,z=-42010..-28371 +on x=5049..33267,y=-79591..-57008,z=-42567..-22184 +on x=24693..34274,y=24506..45113,z=-79046..-65370 +on x=68172..98565,y=-14312..8628,z=-9721..13285 +on x=-18235..6826,y=-25122..10050,z=60096..85636 +on x=45928..69951,y=-60287..-37529,z=-20540..7359 +on x=-32041..-5059,y=51092..63261,z=-66204..-31843 +on x=63653..71469,y=-34873..-31161,z=14048..39702 +on x=22396..43880,y=-3824..14660,z=-90531..-56170 +on x=-1717..21789,y=53858..67026,z=-58144..-47816 +on x=-51019..-40959,y=-75814..-60550,z=11755..46123 +on x=-57489..-39503,y=-64465..-33404,z=-48668..-30131 +on x=27760..59108,y=42790..67256,z=17743..35790 +on x=-43692..-29811,y=-88277..-59083,z=5968..37461 +on x=-47420..-22185,y=-68408..-52385,z=23869..44928 +on x=39709..61505,y=-21268..1882,z=-76594..-60038 +on x=54698..76952,y=-17074..10219,z=24567..44175 +on x=-95465..-62390,y=-29895..-23300,z=-11863..4898 +on x=23365..40278,y=58938..80416,z=-21545..9812 +on x=11923..35757,y=-66990..-41080,z=-61382..-33846 +on x=67045..75089,y=-11897..4681,z=-47955..-24267 +on x=-90376..-59893,y=117..26316,z=28188..35096 +off x=24651..28210,y=-24590..-10312,z=66417..75292 +off x=-43951..-18830,y=-69398..-52261,z=28497..50225 +off x=42514..62323,y=-60372..-24865,z=37347..49320 +on x=49798..77900,y=-72682..-49927,z=-10258..958 +off x=24604..45145,y=36058..57891,z=-53557..-34761 +on x=-65518..-39972,y=34159..54763,z=-17646..9176 +off x=-76836..-49612,y=27033..40308,z=24773..37790 +off x=41029..63639,y=34627..54572,z=-60195..-35060 +off x=5440..40626,y=31825..56887,z=58565..74579 +on x=-85410..-68908,y=-16763..12913,z=1884..24605 +on x=-70712..-56718,y=-48053..-38417,z=-37942..-32604 +off x=-66574..-45489,y=34467..41894,z=-46802..-24009 +off x=-30928..-7167,y=43518..70824,z=33329..64950 +off x=-52088..-17091,y=-28441..-10616,z=56304..83190 +off x=73277..76646,y=-5922..10725,z=23075..35243 +off x=-44861..-12403,y=-18397..9805,z=-90975..-64778 +on x=-19159..-8086,y=-84649..-57626,z=-4777..30377 +on x=-48235..-45399,y=-76542..-41786,z=-27853..-11708 +off x=-41696..-17405,y=-81352..-58226,z=-51727..-15321 +on x=-21612..8433,y=-88881..-57104,z=20197..38496 +off x=64866..82781,y=-35287..-19222,z=2225..31593 +off x=-60086..-31957,y=-66807..-52584,z=-47785..-31167 +on x=-75232..-65410,y=6879..15928,z=25821..33108 +on x=49721..74332,y=-32211..-5492,z=37490..67240 +on x=-69008..-59258,y=-67365..-39177,z=2702..22494 +on x=40598..77320,y=-44858..-24495,z=-39106..-18658 +on x=-66046..-43012,y=9311..31541,z=51758..55618 +on x=-74902..-54476,y=9991..38601,z=-18468..-2400 +off x=934..27205,y=-52862..-47494,z=-78005..-46221 +off x=36318..42994,y=63750..79912,z=-11834..6870 +off x=-9448..6260,y=69407..96104,z=3742..26473 +on x=34180..59194,y=56640..70053,z=-6782..2219 +off x=-71868..-58289,y=-50419..-43052,z=-16738..3185 +off x=-55443..-21609,y=-43083..-21999,z=-75650..-51578 +off x=-3124..2680,y=26555..50324,z=-84693..-65786 +off x=65726..80418,y=-21970..-4777,z=28280..55831 +off x=-12755..2382,y=21228..27803,z=-80546..-62078 +on x=-70824..-46210,y=-46992..-35115,z=-6484..18899 +off x=19667..33161,y=59955..85149,z=19245..33893 +off x=5654..11498,y=56328..89517,z=-51989..-33158 +on x=-20574..-5577,y=39609..41373,z=66022..82822 +on x=-16635..-2094,y=61755..97252,z=-10151..3379 +off x=-61710..-29756,y=-53529..-20524,z=50061..67887 +off x=12337..45140,y=60042..89297,z=9701..36968 +off x=-42381..-17258,y=-40434..-12651,z=-79807..-52351 +off x=-57645..-52169,y=-20403..4163,z=-62673..-54906 +on x=26686..40465,y=7785..22540,z=72481..83980 +on x=-23030..-18498,y=-31032..-9833,z=61054..83029 +on x=-10867..9838,y=45397..66784,z=-51464..-39505 +off x=56847..77259,y=-17184..2949,z=-55341..-38773 +on x=15524..40419,y=-42588..-27508,z=61847..79655 +on x=-91271..-71952,y=15556..34300,z=14005..28676 +on x=65780..81595,y=-29919..-17998,z=28053..44908 +on x=31479..58997,y=55159..82009,z=-20523..11865 +on x=2149..19762,y=-86184..-56666,z=18206..36344 +off x=27069..56637,y=-73675..-53032,z=-13508..15432 +on x=67416..85446,y=2917..28648,z=5402..35606 +on x=-44500..-23236,y=-91223..-65053,z=-3525..14263 +on x=-75739..-51755,y=49292..67356,z=-23308..10605 +on x=-34841..-9806,y=-19491..-1709,z=64409..96498 +on x=9551..24535,y=65245..79434,z=-24616..-12986 +on x=-83205..-55438,y=-39820..-19718,z=22074..38142 +off x=-71953..-53073,y=-44959..-30448,z=34060..50956 +off x=-48764..-35469,y=-61736..-43279,z=41195..52261 +on x=15917..37063,y=-75662..-56956,z=18898..36595 +on x=37396..54561,y=-29290..-16200,z=64044..76199 +off x=-14179..10592,y=-80049..-51222,z=38386..68137 +on x=-29902..-21453,y=-94461..-71699,z=-6448..6244 +off x=66863..74181,y=9066..35219,z=-28995..-8750 +on x=7191..37647,y=-74506..-52303,z=45114..65447 +off x=53433..79524,y=21402..48649,z=5035..16962 +off x=54924..71855,y=28434..48319,z=-27603..-14643 +off x=44568..73341,y=41377..69060,z=2132..18323 +off x=32192..46654,y=-86893..-59876,z=21008..38923 +off x=-26751..-3856,y=21442..39353,z=-84098..-58106 +off x=63303..65533,y=42998..54340,z=3302..15908 +on x=4235..13687,y=-50180..-34351,z=-76521..-58485 +on x=-33290..-9251,y=40469..57296,z=-66106..-48947 +off x=-81172..-62578,y=6482..36668,z=-45865..-22894 +off x=-81904..-65892,y=-11941..4053,z=-42478..-22147 +off x=35829..70381,y=41448..69602,z=18749..38582 +on x=-10433..-2099,y=-82602..-51316,z=36823..64092 +on x=38080..53913,y=36937..47688,z=39322..71479 +on x=-21560..-4521,y=66563..85082,z=20252..45582 +off x=-85857..-68417,y=-41847..-28573,z=-7729..2847 +on x=-68327..-31793,y=-21900..-289,z=56789..69398 +on x=-67562..-42688,y=16743..32262,z=22000..44570 +off x=48052..67704,y=-23423..4103,z=44261..78217 +on x=-22576..-194,y=61895..82600,z=-40620..-5831 +on x=-16931..7379,y=-15102..1748,z=-87988..-74150 +on x=-26047..12491,y=55107..74563,z=21205..33348 +off x=-25435..-946,y=-82352..-52608,z=33364..53843 +off x=-5833..18798,y=39831..56611,z=-72213..-47388 +off x=-5822..14115,y=-98135..-64976,z=-20248..9788 +on x=-15154..670,y=-75227..-54455,z=33215..60140 +off x=18909..48180,y=62835..69076,z=27175..44519 +off x=-58838..-51811,y=-8942..14922,z=-72422..-48233 +on x=47362..82935,y=-58723..-33218,z=-14356..7150 +on x=-64609..-42063,y=-58790..-35608,z=-50387..-39455 +on x=9832..20482,y=40076..58832,z=41495..59344 +on x=-29810..-7444,y=-73368..-47276,z=-64805..-37263 +on x=-66021..-35774,y=44614..81545,z=-2880..20810 +on x=30417..44347,y=64937..66634,z=27916..47000 +on x=14925..33804,y=-59990..-48743,z=-55335..-46081 +off x=-45330..-16788,y=-2912..25446,z=-78240..-63474 +off x=-75837..-58168,y=-7970..3635,z=30476..60250 +off x=-12011..13258,y=-89694..-69437,z=23137..41026 +on x=58141..91626,y=-3240..13201,z=23976..30297 +off x=-69440..-42294,y=-3341..11023,z=-75797..-55367 +off x=28775..48112,y=49087..66505,z=-47634..-19480 +off x=17405..40878,y=-78515..-63319,z=20589..35237 +on x=46505..79525,y=46254..52587,z=-16956..-979 +off x=14778..49904,y=51599..61793,z=-68550..-48309 +off x=-17127..-2237,y=-80624..-47506,z=-43373..-23646 +on x=42852..55498,y=60931..70121,z=-913..10924 +on x=53866..67942,y=10584..28056,z=44574..51590 +on x=52164..61481,y=25073..45284,z=20579..54644 +off x=-38817..-3710,y=49963..73191,z=35577..68161 +off x=74571..87380,y=-26549..-8365,z=-41849..-15478 +on x=-11635..-3471,y=-2190..2324,z=-84076..-75086 +on x=-87133..-75239,y=-9635..11698,z=-1887..26028 +off x=-65700..-58148,y=-27843..-17147,z=46837..51188 +on x=-8973..19499,y=-57314..-31198,z=-82041..-63223 +on x=-8234..7290,y=72201..85190,z=-41415..-12525 +off x=-69515..-63879,y=-11878..12202,z=-61049..-31131 +on x=-593..25155,y=71211..88034,z=-13360..13827 +off x=-41118..-22761,y=-51023..-43558,z=42131..56647 +on x=45695..64697,y=-70454..-47486,z=4653..27783 +off x=-69391..-49194,y=-6224..21792,z=-56102..-46702 +on x=12567..16989,y=63359..83739,z=-7433..18488 +on x=-47607..-28894,y=-76890..-58285,z=16882..41914 +on x=-30015..4988,y=14737..22104,z=62453..85467 +on x=-54404..-44808,y=-50918..-32444,z=-49452..-43588 +off x=12954..44089,y=-28041..-5913,z=67605..87219 +on x=-82272..-53812,y=25783..42439,z=-42516..-12409 +off x=-94480..-60573,y=-25004..-2471,z=-2718..11057 +off x=51649..65225,y=-14724..6310,z=38450..66205 +off x=69856..80286,y=21304..46173,z=-11935..15518 +on x=-77660..-69829,y=-25072..-3423,z=25500..50923 +off x=37047..59725,y=51835..79489,z=272..35097 +on x=-67713..-31489,y=35835..38541,z=-57246..-47586 +on x=-18556..-7707,y=-17678..-8114,z=-87728..-59085 +off x=-78610..-61520,y=11250..38454,z=-8429..3203 +off x=-44797..-21166,y=-14536..9531,z=59712..82290 +off x=45719..59834,y=-18760..-4920,z=-52363..-46018 +off x=-35717..-12687,y=-83577..-62558,z=-8962..21313 +on x=44536..59941,y=29580..64623,z=-24759..-4916 +off x=-18864..-3108,y=48226..78222,z=42732..67354 +on x=12357..39639,y=-44392..-26900,z=-82899..-54317 +off x=-58310..-24651,y=15307..42877,z=-77149..-40022 +on x=-43945..-20285,y=70712..82950,z=-4121..3442 +off x=7101..22967,y=64872..83707,z=-25824..-9526 +on x=-62076..-43190,y=-21347..-3360,z=-63874..-36231 +off x=6340..27337,y=-73151..-47585,z=46269..52581 +off x=47397..57486,y=-63732..-40590,z=44295..49537 +off x=-78613..-57237,y=-56534..-32459,z=-35285..-13648 +off x=-31072..-7685,y=-38542..-7098,z=57760..83347 +on x=-63099..-35927,y=-77355..-53793,z=29264..33129 +on x=-3649..25126,y=4399..19136,z=-90001..-77851 +off x=8510..11246,y=57072..89213,z=11594..31605 +off x=-16380..3546,y=28043..58308,z=62410..70708 +off x=-73518..-51371,y=8803..36830,z=27148..50003 +off x=-76901..-55804,y=-20544..-14756,z=-34886..-16018 +on x=42245..58590,y=-60103..-37286,z=-38862..-20729 +off x=2872..20494,y=76096..89070,z=-30072..-13378 +off x=62225..70240,y=18398..51759,z=-26426..-10316 +on x=-8268..25701,y=-44287..-22096,z=-73605..-62816 +on x=12693..28817,y=-90968..-58755,z=-38493..-10212 +on x=-72781..-51700,y=-59730..-40159,z=-22471..-10811 +off x=-86186..-61431,y=-40796..-16811,z=-20606..1945 +on x=19756..40482,y=41370..75797,z=22120..46137 +on x=-38689..-13316,y=-24252..-16211,z=66862..80344 +on x=25358..46927,y=-81264..-64854,z=29512..35413 +on x=-16755..18260,y=-75084..-53865,z=48791..62218 +on x=37799..45278,y=38376..53913,z=31553..51525 +on x=-78288..-65705,y=-20882..5515,z=-56620..-32490 +off x=-14779..-3865,y=-35491..-12433,z=60969..77610 +on x=1041..7426,y=-75565..-54588,z=36056..52921 +on x=-41864..-34775,y=22219..51820,z=40842..71780 +off x=-23755..2275,y=51063..64402,z=-67945..-44438 +on x=-93770..-74301,y=-30533..2469,z=-4612..7196 +on x=-59566..-38442,y=-68259..-32849,z=36360..51994 +on x=43187..57027,y=-18906..-8453,z=-77163..-57489 +on x=-29794..-6913,y=28460..55404,z=-79855..-58015 +off x=-57236..-52204,y=-21814..-7565,z=38317..74160 +off x=56146..75194,y=-39180..-18839,z=-56810..-31930 +on x=-66300..-58204,y=-19301..-4228,z=-61589..-39254 +off x=-73278..-68405,y=22614..43899,z=-16199..-10518 +on x=57074..79996,y=-6578..17919,z=33160..54010 +off x=-40719..-2100,y=65789..80371,z=34406..44030 +on x=-44080..-27053,y=2572..27247,z=51202..87551 +on x=-25151..-7880,y=-60771..-53496,z=-55535..-47740 +off x=-14214..11970,y=-4404..16997,z=-90900..-64733 +off x=16310..46047,y=55884..79489,z=-14464..20211 +on x=51594..75047,y=26992..37723,z=-11584..-911 +on x=-45309..-20784,y=44096..70601,z=-52394..-33571 +off x=16870..35569,y=13219..31860,z=69493..87370 +on x=-22983..-16966,y=59778..70013,z=26803..46876 +on x=33076..50573,y=-80935..-61509,z=-30866..-2196 From 14cfc776b77078a96ba06cec8601a8062a37ebc7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 22 Dec 2021 16:41:20 +0100 Subject: [PATCH 258/479] 2021: d22: ex2: add solution --- 2021/d22/ex2/ex2.py | 167 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100755 2021/d22/ex2/ex2.py diff --git a/2021/d22/ex2/ex2.py b/2021/d22/ex2/ex2.py new file mode 100755 index 0000000..3c7d2c5 --- /dev/null +++ b/2021/d22/ex2/ex2.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python + +import functools +import itertools +import sys +from typing import List, NamedTuple, Optional, Set, Tuple + + +class Point(NamedTuple): + x: int + y: int + z: int + + +class Cuboid(NamedTuple): + min: Point + max: Point + + +class Step(NamedTuple): + state: bool + bounds: Cuboid + + +Grid = Set[Cuboid] + +MAX_BOUND = 10000000000000000000000000000000000000000000 # Just a very large integer +MIN_BOUND = -MAX_BOUND + + +def solve(input: List[str]) -> int: + def parse() -> List[Step]: + def parse_step(line: str) -> Step: + state, cuboid = line.split(" ") + + xs, ys, zs = cuboid.split(",") + + min_x, max_x = map(int, xs[2:].split("..")) + min_y, max_y = map(int, ys[2:].split("..")) + min_z, max_z = map(int, zs[2:].split("..")) + + # Sanity check + assert min_x <= max_x + assert min_y <= max_y + assert min_z <= max_z + + bounds = Cuboid(Point(min_x, min_y, min_z), Point(max_x, max_y, max_z)) + + return Step(state == "on", bounds) + + return [parse_step(line) for line in input] + + def overlapping_range( + min_a: int, max_a: int, min_b: int, max_b: int + ) -> Optional[Tuple[int, int]]: + if max_a < min_b or min_a > max_b: + return None + return max(min_a, min_b), min(max_a, max_b) + + def overlapping_cube(cube: Cuboid, other: Cuboid) -> Optional[Cuboid]: + xs = overlapping_range(cube.min.x, cube.max.x, other.min.x, other.max.x) + ys = overlapping_range(cube.min.y, cube.max.y, other.min.y, other.max.y) + zs = overlapping_range(cube.min.z, cube.max.z, other.min.z, other.max.z) + + if xs is None or ys is None or zs is None: + return None + return Cuboid(Point(xs[0], ys[0], zs[0]), Point(xs[1], ys[1], zs[1])) + + def overlaps(cube: Cuboid, other: Cuboid) -> bool: + return overlapping_cube(cube, other) is not None + + def carve_out(grid: Grid, hole: Cuboid) -> Grid: + from itertools import filterfalse + + def do_carve(c: Cuboid) -> Set[Cuboid]: + cubes: Set[Cuboid] = set() + + min, max = c + + rightside = overlapping_range(hole.max.x + 1, MAX_BOUND, min.x, max.x) + leftside = overlapping_range(MIN_BOUND, hole.min.x - 1, min.x, max.x) + xs = overlapping_range(hole.min.x, hole.max.x, min.x, max.x) + if rightside is not None: + min_r, max_r = rightside + cubes.add( + Cuboid(Point(min_r, min.y, min.z), Point(max_r, max.y, max.z)) + ) + if leftside is not None: + min_l, max_l = leftside + cubes.add( + Cuboid(Point(min_l, min.y, min.z), Point(max_l, max.y, max.z)) + ) + + backside = overlapping_range(hole.max.y + 1, MAX_BOUND, min.y, max.y) + frontside = overlapping_range(MIN_BOUND, hole.min.y - 1, min.y, max.y) + ys = overlapping_range(hole.min.y, hole.max.y, min.y, max.y) + if backside is not None and xs is not None: + min_x, max_x = xs + min_b, max_b = backside + cubes.add( + Cuboid(Point(min_x, min_b, min.z), Point(max_x, max_b, max.z)) + ) + if frontside is not None and xs is not None: + min_x, max_x = xs + min_f, max_f = frontside + cubes.add( + Cuboid(Point(min_x, min_f, min.z), Point(max_x, max_f, max.z)) + ) + + topside = overlapping_range(hole.max.z + 1, MAX_BOUND, min.z, max.z) + bottomside = overlapping_range(MIN_BOUND, hole.min.z - 1, min.z, max.z) + if topside is not None and xs is not None and ys is not None: + min_x, max_x = xs + min_y, max_y = ys + min_t, max_t = topside + cubes.add( + Cuboid(Point(min_x, min_y, min_t), Point(max_x, max_y, max_t)) + ) + if bottomside is not None and xs is not None and ys is not None: + min_x, max_x = xs + min_y, max_y = ys + min_b, max_b = bottomside + cubes.add( + Cuboid(Point(min_x, min_y, min_b), Point(max_x, max_y, max_b)) + ) + + return cubes + + overlaps_us = lambda c: overlaps(c, hole) + + of_interest, other = filter(overlaps_us, grid), filterfalse(overlaps_us, grid) + + return set(other) | set( + itertools.chain.from_iterable(do_carve(c) for c in of_interest) + ) + + def apply(grid: Grid, step: Step) -> Grid: + cuboid = step.bounds + + # Remove that cube from the grid, potentially splitting cubes that overlap + grid = carve_out(grid, cuboid) + + # Add it back in if we want to turn on those cubes + if step.state: + grid.add(cuboid) + + return grid + + def count_cubes(c: Cuboid) -> int: + min, max = c + return (max.x + 1 - min.x) * (max.y + 1 - min.y) * (max.z + 1 - min.z) + + def score(grid: Grid) -> int: + return sum(map(count_cubes, grid)) + + steps = parse() + grid: Grid = functools.reduce(apply, steps, set()) + return score(grid) + + +def main() -> None: + input = [line.strip() for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 0daf3f7e039f87a42e250efa51d802c9f404942d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 26 Dec 2021 17:38:24 +0100 Subject: [PATCH 259/479] 2021: d23: ex1: add input --- 2021/d23/ex1/input | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 2021/d23/ex1/input diff --git a/2021/d23/ex1/input b/2021/d23/ex1/input new file mode 100644 index 0000000..9b8c8e7 --- /dev/null +++ b/2021/d23/ex1/input @@ -0,0 +1,5 @@ +############# +#...........# +###C#B#A#D### + #C#D#A#B# + ######### From 42979f727b545ca5834e23e218d9681ddf36e384 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 26 Dec 2021 17:38:29 +0100 Subject: [PATCH 260/479] 2021: d23: ex1: add solution --- 2021/d23/ex1/ex1.py | 200 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100755 2021/d23/ex1/ex1.py diff --git a/2021/d23/ex1/ex1.py b/2021/d23/ex1/ex1.py new file mode 100755 index 0000000..0b99d71 --- /dev/null +++ b/2021/d23/ex1/ex1.py @@ -0,0 +1,200 @@ +#!/usr/bin/env python + +import enum +import functools +import sys +from typing import Iterator, List, NamedTuple, Optional, Tuple + + +class Point(NamedTuple): + x: int + y: int + + +class Amphipod(enum.IntEnum): + A = 0 + B = 1 + C = 2 + D = 3 + + +class Direction(enum.IntEnum): + ALLEY = 0 + ROOM = 1 + + +# 7-length tuple, but easier for mypy in a variadic type +Alley = Tuple[Optional[Amphipod], ...] + +# Actually variadic tuple, instead of a list, for memoization purposes +Room = Tuple[Amphipod, ...] + +# 4-length tuple, but easier for mypy in a variadic type +Rooms = Tuple[Room, ...] + + +class Board(NamedTuple): + alley: Alley + rooms: Rooms + + +class Move(NamedTuple): + cost: int + new_board: Board + + +FUEL_COST = { + Amphipod.A: 1, + Amphipod.B: 10, + Amphipod.C: 100, + Amphipod.D: 1000, +} + +DISTANCE = [ + # From room 1 + (2, 1, 1, 3, 5, 7, 8), + # From room 2 + (4, 3, 1, 1, 3, 5, 6), + # From room 3 + (6, 5, 3, 1, 1, 3, 4), + # From room 4 + (8, 7, 5, 3, 1, 1, 2), +] + +AMPHIPOD_FROM_STRING = { + "A": Amphipod.A, + "B": Amphipod.B, + "C": Amphipod.C, + "D": Amphipod.D, +} + +ROOM_SIZE = 2 + + +def solve(input: List[str]) -> int: + def parse() -> Board: + alley: Alley = (None,) * 7 + rooms: Rooms = () + for i in (3, 5, 7, 9): + room: Room = tuple( + AMPHIPOD_FROM_STRING[input[j][i]] for j in range(2, 3 + 1) + ) + rooms = rooms + (room,) + + return Board(alley, rooms) + + def room_is_solved(board: Board, amphipod: Amphipod) -> bool: + room = board.rooms[amphipod] + return len(room) == ROOM_SIZE and all(a == amphipod for a in room) + + def board_is_solved(board: Board) -> bool: + return all(room_is_solved(board, Amphipod(i)) for i in range(len(board.rooms))) + + def move_cost( + board: Board, room: int, alley_spot: int, direction: Direction + ) -> Optional[int]: + # Going left-to-right, or right-to-left + if room < (alley_spot - 1): + alley_start = room + 2 + # Look at the end spot if we're going to the alley, not if we come from there + alley_end = alley_spot + (1 - direction) + else: + # Look at the first spot if we're going to the alley, not if we come from there + alley_start = alley_spot + direction + alley_end = room + 2 + + # Is there any obstacle in the way + if any(spot is not None for spot in board.alley[alley_start:alley_end]): + return None + + amphipod = ( + board.alley[alley_spot] + if direction == Direction.ROOM + else board.rooms[room][0] + ) + assert amphipod is not None # Sanity check + + return FUEL_COST[amphipod] * ( + DISTANCE[room][alley_spot] + direction + ROOM_SIZE - len(board.rooms[room]) + ) + + # Yes this returns a 0-or-1 length iterator, but it's practical for `moves` + def alley_moves_for(board: Board, i: int) -> Iterator[Move]: + # Return early if we're trying to move out of an empty spot + spot = board.alley[i] + if spot is None: + return + + # Can't yet move to the target room if any amphipod is out of place there + if any(other != spot for other in board.rooms[spot]): + return + + cost = move_cost(board, spot, i, Direction.ROOM) + + # Can't move there yet, there's an obstacle in the way + if cost is None: + return + + # Update the board state + alley, rooms = board + rooms = rooms[:spot] + ((spot,) + rooms[spot],) + rooms[spot + 1 :] + alley = alley[:i] + (None,) + alley[i + 1 :] + + yield Move(cost, Board(alley, rooms)) + + def rooms_moves_for(board: Board, i: int) -> Iterator[Move]: + room = board.rooms[i] + # No need to move out of a solved room + if all(a == i for a in room): + return + + for dest in range(len(board.alley)): + cost = move_cost(board, i, dest, Direction.ALLEY) + + # Can't move there yet, there's an obstacle in the way + if cost is None: + continue + + # Update the board state + alley, rooms = board + rooms = rooms[:i] + (room[1:],) + rooms[i + 1 :] + alley = alley[:dest] + (room[0],) + alley[dest + 1 :] + + yield Move(cost, Board(alley, rooms)) + + def moves(board: Board) -> Iterator[Move]: + for i in range(len(board.alley)): + yield from alley_moves_for(board, i) + for i in range(len(board.rooms)): + yield from rooms_moves_for(board, i) + + @functools.cache + def total_cost(board: Board) -> Optional[int]: + if board_is_solved(board): + return 0 + + best = None + + for cost, new_board in moves(board): + if (end_cost := total_cost(new_board)) is None: + continue + cost += end_cost + if best is None or cost < best: + best = cost + + return best + + board = parse() + cost = total_cost(board) + assert cost is not None # Sanity check + + return cost + + +def main() -> None: + input = [line.rstrip("\n") for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From d04c77d40c145c9788ec456da339dfa51742ecf3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 26 Dec 2021 17:38:35 +0100 Subject: [PATCH 261/479] 2021: d23: ex2: add input --- 2021/d23/ex2/input | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 2021/d23/ex2/input diff --git a/2021/d23/ex2/input b/2021/d23/ex2/input new file mode 100644 index 0000000..9b8c8e7 --- /dev/null +++ b/2021/d23/ex2/input @@ -0,0 +1,5 @@ +############# +#...........# +###C#B#A#D### + #C#D#A#B# + ######### From 637c5975254fa300dc469c3a14c2715e318d876c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 26 Dec 2021 17:38:40 +0100 Subject: [PATCH 262/479] 2021: d23: ex2: add solution --- 2021/d23/ex2/ex2.py | 212 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 212 insertions(+) create mode 100755 2021/d23/ex2/ex2.py diff --git a/2021/d23/ex2/ex2.py b/2021/d23/ex2/ex2.py new file mode 100755 index 0000000..8c077d9 --- /dev/null +++ b/2021/d23/ex2/ex2.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python + +import enum +import functools +import sys +from typing import Iterator, List, NamedTuple, Optional, Tuple + + +class Point(NamedTuple): + x: int + y: int + + +class Amphipod(enum.IntEnum): + A = 0 + B = 1 + C = 2 + D = 3 + + +class Direction(enum.IntEnum): + ALLEY = 0 + ROOM = 1 + + +# 7-length tuple, but easier for mypy in a variadic type +Alley = Tuple[Optional[Amphipod], ...] + +# Actually variadic tuple, instead of a list, for memoization purposes +Room = Tuple[Amphipod, ...] + +# 4-length tuple, but easier for mypy in a variadic type +Rooms = Tuple[Room, ...] + + +class Board(NamedTuple): + alley: Alley + rooms: Rooms + + +class Move(NamedTuple): + cost: int + new_board: Board + + +FUEL_COST = { + Amphipod.A: 1, + Amphipod.B: 10, + Amphipod.C: 100, + Amphipod.D: 1000, +} + +DISTANCE = [ + # From room 1 + (2, 1, 1, 3, 5, 7, 8), + # From room 2 + (4, 3, 1, 1, 3, 5, 6), + # From room 3 + (6, 5, 3, 1, 1, 3, 4), + # From room 4 + (8, 7, 5, 3, 1, 1, 2), +] + +AMPHIPOD_FROM_STRING = { + "A": Amphipod.A, + "B": Amphipod.B, + "C": Amphipod.C, + "D": Amphipod.D, +} + +ROOM_SIZE = 4 + + +def solve(input: List[str]) -> int: + def parse() -> Board: + def adjust_board(board: Board) -> Board: + rooms: Rooms = () + ADDITIONAL = ( + (Amphipod.D, Amphipod.D), + (Amphipod.C, Amphipod.B), + (Amphipod.B, Amphipod.A), + (Amphipod.A, Amphipod.C), + ) + for i, room in enumerate(board.rooms): + rooms = rooms + (room[:1] + ADDITIONAL[i] + room[1:],) + return Board(board.alley, rooms) + + alley: Alley = (None,) * 7 + rooms: Rooms = () + for i in (3, 5, 7, 9): + room: Room = tuple( + AMPHIPOD_FROM_STRING[input[j][i]] for j in range(2, 3 + 1) + ) + rooms = rooms + (room,) + + return adjust_board(Board(alley, rooms)) + + def room_is_solved(board: Board, amphipod: Amphipod) -> bool: + room = board.rooms[amphipod] + return len(room) == ROOM_SIZE and all(a == amphipod for a in room) + + def board_is_solved(board: Board) -> bool: + return all(room_is_solved(board, Amphipod(i)) for i in range(len(board.rooms))) + + def move_cost( + board: Board, room: int, alley_spot: int, direction: Direction + ) -> Optional[int]: + # Going left-to-right, or right-to-left + if room < (alley_spot - 1): + alley_start = room + 2 + # Look at the end spot if we're going to the alley, not if we come from there + alley_end = alley_spot + (1 - direction) + else: + # Look at the first spot if we're going to the alley, not if we come from there + alley_start = alley_spot + direction + alley_end = room + 2 + + # Is there any obstacle in the way + if any(spot is not None for spot in board.alley[alley_start:alley_end]): + return None + + amphipod = ( + board.alley[alley_spot] + if direction == Direction.ROOM + else board.rooms[room][0] + ) + assert amphipod is not None # Sanity check + + return FUEL_COST[amphipod] * ( + DISTANCE[room][alley_spot] + direction + ROOM_SIZE - len(board.rooms[room]) + ) + + # Yes this returns a 0-or-1 length iterator, but it's practical for `moves` + def alley_moves_for(board: Board, i: int) -> Iterator[Move]: + # Return early if we're trying to move out of an empty spot + spot = board.alley[i] + if spot is None: + return + + # Can't yet move to the target room if any amphipod is out of place there + if any(other != spot for other in board.rooms[spot]): + return + + cost = move_cost(board, spot, i, Direction.ROOM) + + # Can't move there yet, there's an obstacle in the way + if cost is None: + return + + # Update the board state + alley, rooms = board + rooms = rooms[:spot] + ((spot,) + rooms[spot],) + rooms[spot + 1 :] + alley = alley[:i] + (None,) + alley[i + 1 :] + + yield Move(cost, Board(alley, rooms)) + + def rooms_moves_for(board: Board, i: int) -> Iterator[Move]: + room = board.rooms[i] + # No need to move out of a solved room + if all(a == i for a in room): + return + + for dest in range(len(board.alley)): + cost = move_cost(board, i, dest, Direction.ALLEY) + + # Can't move there yet, there's an obstacle in the way + if cost is None: + continue + + # Update the board state + alley, rooms = board + rooms = rooms[:i] + (room[1:],) + rooms[i + 1 :] + alley = alley[:dest] + (room[0],) + alley[dest + 1 :] + + yield Move(cost, Board(alley, rooms)) + + def moves(board: Board) -> Iterator[Move]: + for i in range(len(board.alley)): + yield from alley_moves_for(board, i) + for i in range(len(board.rooms)): + yield from rooms_moves_for(board, i) + + @functools.cache + def total_cost(board: Board) -> Optional[int]: + if board_is_solved(board): + return 0 + + best = None + + for cost, new_board in moves(board): + if (end_cost := total_cost(new_board)) is None: + continue + cost += end_cost + if best is None or cost < best: + best = cost + + return best + + board = parse() + cost = total_cost(board) + assert cost is not None # Sanity check + + return cost + + +def main() -> None: + input = [line.rstrip("\n") for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From f42b43d8bca68ee0d4c2648ab729a71155e5fb52 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 25 Dec 2021 00:30:39 +0100 Subject: [PATCH 263/479] nix: use proper python environment --- flake.nix | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index ba32138..117bc02 100644 --- a/flake.nix +++ b/flake.nix @@ -56,10 +56,11 @@ devShell = pkgs.mkShell { buildInputs = with pkgs; [ - pkgs.python3Packages.black - pkgs.python3Packages.isort - pkgs.python3Packages.mypy - python3 + (python3.withPackages (ps: with ps; [ + black + isort + mypy + ])) ]; inherit (self.checks.${system}.pre-commit) shellHook; From 0d3efefaa5e5e3bbc6a0d9ff532466205aeec1bd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 25 Dec 2021 00:30:52 +0100 Subject: [PATCH 264/479] nix: add z3 to python environment --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index 117bc02..1de3f33 100644 --- a/flake.nix +++ b/flake.nix @@ -60,6 +60,7 @@ black isort mypy + z3 ])) ]; From 4a691b8dd2d38e4e943ce6da796bc7b42c9a6024 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 25 Dec 2021 00:31:29 +0100 Subject: [PATCH 265/479] 2021: d24: ex1: add input --- 2021/d24/ex1/input | 252 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 2021/d24/ex1/input diff --git a/2021/d24/ex1/input b/2021/d24/ex1/input new file mode 100644 index 0000000..549ccd6 --- /dev/null +++ b/2021/d24/ex1/input @@ -0,0 +1,252 @@ +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 14 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 14 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 14 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 2 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 14 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 1 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 12 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 13 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 15 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 5 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -12 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 5 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -12 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 5 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 12 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 9 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -7 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 3 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 13 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 13 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -8 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 2 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -5 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 1 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -10 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 11 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -7 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 8 +mul y x +add z y From ed49448d047191383b04ad8e7fa03e2062ee73fb Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 25 Dec 2021 00:31:37 +0100 Subject: [PATCH 266/479] 2021: d24: ex1: add solution --- 2021/d24/ex1/ex1.py | 111 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100755 2021/d24/ex1/ex1.py diff --git a/2021/d24/ex1/ex1.py b/2021/d24/ex1/ex1.py new file mode 100755 index 0000000..5d703d8 --- /dev/null +++ b/2021/d24/ex1/ex1.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python + +import enum +import functools +import sys +from typing import List, Literal, NamedTuple, Optional, Union, cast + +import z3 + +Register = Literal["w", "x", "y", "z"] + + +class InstructionType(enum.Enum): + INPUT = "inp" + ADD = "add" + MULTIPLY = "mul" + DIVIDE = "div" + MODULO = "mod" + EQUAL = "eql" + + +class Instruction(NamedTuple): + type: InstructionType + destination: Register + source: Optional[Union[Register, int]] + + +def solve(input: List[str]) -> int: + def parse() -> List[Instruction]: + def parse_instruction(line: str) -> Instruction: + type, *registers = line.split() + + assert registers[0] in ("w", "x", "y", "z") # Sanity check + destination = cast(Register, registers[0]) + + source: Optional[Union[Register, int]] = None + if type != "inp": + if registers[1] in ("w", "x", "y", "z"): + source = cast(Register, registers[1]) + else: + source = int(registers[1]) + + return Instruction(InstructionType(type), destination, source) + + return [parse_instruction(line) for line in input] + + def run_z3(instructions: List[Instruction]) -> int: + solver = z3.Optimize() + + BITS = 64 + + digits = [z3.BitVec(f"input_{i}", BITS) for i in range(14)] + next_input = iter(digits).__next__ + + for d in digits: + solver.add(z3.And(1 <= d, d <= 9)) + + zero, one = z3.BitVecVal(0, BITS), z3.BitVecVal(1, BITS) + + registers = {r: zero for r in ("w", "x", "y", "z")} + + for i, instr in enumerate(instructions): + if instr.type == InstructionType.INPUT: + registers[instr.destination] = next_input() + continue + + assert instr.source is not None # Sanity check + + value = registers[instr.destination] + if isinstance(instr.source, int): + source = z3.BitVecVal(instr.source, BITS) + else: + source = registers[instr.source] + + res = z3.BitVec(f"result_{i}", BITS) + if instr.type == InstructionType.ADD: + solver.add(res == (value + source)) + elif instr.type == InstructionType.MULTIPLY: + solver.add(res == (value * source)) + elif instr.type == InstructionType.DIVIDE: + solver.add(source > zero) # Sanity check + solver.add(res == (value / source)) + elif instr.type == InstructionType.MODULO: + solver.add(value >= zero) # Sanity check + solver.add(source > zero) # Sanity check + solver.add(res == (value % source)) + elif instr.type == InstructionType.EQUAL: + solver.add(res == z3.If(value == source, one, zero)) + else: + assert False # Sanity check + registers[instr.destination] = res + + solver.add(registers["z"] == zero) + + model_number = functools.reduce(lambda a, b: a * 10 + b, digits) + + solver.maximize(model_number) + assert solver.check() == z3.sat # Sanity check + + return solver.model().eval(model_number) + + return run_z3(parse()) + + +def main() -> None: + input = [line.rstrip("\n") for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From f4cd01f6a0f950561013e32093c9d12b975c5af6 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 25 Dec 2021 00:32:02 +0100 Subject: [PATCH 267/479] 2021: d24: ex2: add input --- 2021/d24/ex2/input | 252 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 252 insertions(+) create mode 100644 2021/d24/ex2/input diff --git a/2021/d24/ex2/input b/2021/d24/ex2/input new file mode 100644 index 0000000..549ccd6 --- /dev/null +++ b/2021/d24/ex2/input @@ -0,0 +1,252 @@ +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 14 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 14 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 14 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 2 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 14 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 1 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 12 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 13 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 15 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 5 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -12 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 5 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -12 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 5 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 12 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 9 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -7 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 3 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 1 +add x 13 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 13 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -8 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 2 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -5 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 1 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -10 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 11 +mul y x +add z y +inp w +mul x 0 +add x z +mod x 26 +div z 26 +add x -7 +eql x w +eql x 0 +mul y 0 +add y 25 +mul y x +add y 1 +mul z y +mul y 0 +add y w +add y 8 +mul y x +add z y From 18d91fee78525f8da3d34fb7b52ee5dce729ff8a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 25 Dec 2021 00:32:07 +0100 Subject: [PATCH 268/479] 2021: d24: ex2: add solution --- 2021/d24/ex2/ex2.py | 111 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100755 2021/d24/ex2/ex2.py diff --git a/2021/d24/ex2/ex2.py b/2021/d24/ex2/ex2.py new file mode 100755 index 0000000..63231dd --- /dev/null +++ b/2021/d24/ex2/ex2.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python + +import enum +import functools +import sys +from typing import List, Literal, NamedTuple, Optional, Union, cast + +import z3 + +Register = Literal["w", "x", "y", "z"] + + +class InstructionType(enum.Enum): + INPUT = "inp" + ADD = "add" + MULTIPLY = "mul" + DIVIDE = "div" + MODULO = "mod" + EQUAL = "eql" + + +class Instruction(NamedTuple): + type: InstructionType + destination: Register + source: Optional[Union[Register, int]] + + +def solve(input: List[str]) -> int: + def parse() -> List[Instruction]: + def parse_instruction(line: str) -> Instruction: + type, *registers = line.split() + + assert registers[0] in ("w", "x", "y", "z") # Sanity check + destination = cast(Register, registers[0]) + + source: Optional[Union[Register, int]] = None + if type != "inp": + if registers[1] in ("w", "x", "y", "z"): + source = cast(Register, registers[1]) + else: + source = int(registers[1]) + + return Instruction(InstructionType(type), destination, source) + + return [parse_instruction(line) for line in input] + + def run_z3(instructions: List[Instruction]) -> int: + solver = z3.Optimize() + + BITS = 64 + + digits = [z3.BitVec(f"input_{i}", BITS) for i in range(14)] + next_input = iter(digits).__next__ + + for d in digits: + solver.add(z3.And(1 <= d, d <= 9)) + + zero, one = z3.BitVecVal(0, BITS), z3.BitVecVal(1, BITS) + + registers = {r: zero for r in ("w", "x", "y", "z")} + + for i, instr in enumerate(instructions): + if instr.type == InstructionType.INPUT: + registers[instr.destination] = next_input() + continue + + assert instr.source is not None # Sanity check + + value = registers[instr.destination] + if isinstance(instr.source, int): + source = z3.BitVecVal(instr.source, BITS) + else: + source = registers[instr.source] + + res = z3.BitVec(f"result_{i}", BITS) + if instr.type == InstructionType.ADD: + solver.add(res == (value + source)) + elif instr.type == InstructionType.MULTIPLY: + solver.add(res == (value * source)) + elif instr.type == InstructionType.DIVIDE: + solver.add(source > zero) # Sanity check + solver.add(res == (value / source)) + elif instr.type == InstructionType.MODULO: + solver.add(value >= zero) # Sanity check + solver.add(source > zero) # Sanity check + solver.add(res == (value % source)) + elif instr.type == InstructionType.EQUAL: + solver.add(res == z3.If(value == source, one, zero)) + else: + assert False # Sanity check + registers[instr.destination] = res + + solver.add(registers["z"] == zero) + + model_number = functools.reduce(lambda a, b: a * 10 + b, digits) + + solver.minimize(model_number) + assert solver.check() == z3.sat # Sanity check + + return solver.model().eval(model_number) + + return run_z3(parse()) + + +def main() -> None: + input = [line.rstrip("\n") for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 4447a4da44ebd1a501716e41daa4fa189a767b18 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 25 Dec 2021 16:55:03 +0100 Subject: [PATCH 269/479] 2021: d25: ex1: add input --- 2021/d25/ex1/input | 137 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 2021/d25/ex1/input diff --git a/2021/d25/ex1/input b/2021/d25/ex1/input new file mode 100644 index 0000000..192c325 --- /dev/null +++ b/2021/d25/ex1/input @@ -0,0 +1,137 @@ +>>vv..>v..>vv.....>vv...>.>...>>......v>v>.v.v..>v..v>.>v.....v..>vvvv.>.>vv>v..v>.v>..v>>>>.>vv.>>vv>.>>v..>.v.v>v>v.>vv.>.......vv.>.>>v. +v>.>v>.v....>>v.vvv>.>>..>....>.v>.v>vv.v..v.v..v>.>.v>.>..>>v.vvvvv..>>..v.v..>>v>vv>.v..vvv.>v..v>>>v.v..>>...>vv..>>v.v>>.>v>.>.v....>>. +v.>vv....v>..v>>..v.>>.....vv..>.vvv>.....v.v>vvv>..v>>..v...>...>...vv.v..>.vvv>>.v>vv..v.>>>....vv.>.>..v..vv.>>v>.>>.>>.v>>>>.>v.v.>v..v +.v.>>..v...v>v.>>>>v....>.....>...v.v..>.v...>.v.....>>.v>v...>.>.>..>v>>>>.v.>..>......>.v>>.>v..>.>vv.>.v>...v.>v.>>.>...>>>..>>>.vv>..v. +.....v.>.v>........>>.>.>vvv.vv>>.>vvv.v.>vvv.....v..>v..>vvv.>.v>.>..v..vv.>...v>>>>vv>.v..v.>..>..vvvv.>.>vvv....v>..>...v...v.v>v.>..v.v +>..>..>..v.>>..v>..vv....>vv.vv>..>v........>..vv>.>.v.>...v.>v...vvv>.....v..vv...vv>.......v>vv.vv.>.vv..v>..v.v.>..>>>.v..vv>...v>vv..>v +.v.>..vv>.>>v>...>.>.>..>.vvv..v>v.v>>.v...v.vv..v..vvv..vv.v.vv...>v..v....>>>>..vvv>v..>.vv.v.>...>vv>......v...>.v...v....v....>v>.>>... +>v.v.v>>.v.>..>>v>>>v.>v.....v>...>>..v.v>.v..>>..>.vvv...>...v>>v.v....v>.vv>.>.v>.>>>.v>>.v..vvv>.vv......v.v...v...>.vvvvv>.>..>>...vv>. +vv>..v.>>v.>.>v.>..v.v>....vv.v..>>.>>v>>..>>>>v>..v>.>.>.>......vv>vv>>>v....>.>v..>.>>vv...>>v.....>>>....>.v.v>v>..v>v.>vv.v>..>.>.>v>.. +v.v.v>v.v..vv.v..>.>v.v.v..>.>.>.>...v.v.>>v>vv.>>....>>..vv...v.v.>..v>.>v.v..v.>.>.>..>...>.vvv...v.v>....vv.>..v>.vv.....>..v>>>.>v.>..v +v...>.>.>v>.v....vv.v>...>v>vv.>..v...>>>..>.>........>..v.>>.v.....>.vvv...>v.>>.vv>v>>>>...>.vv.>...>.>..v..>>>...v.vv.>>v....>.vvv>>v.>. +.>...vv.v........v.v......v>vvv.vv..>...vvv..vv.>.v.v...>vv.>>...>.v..>v>vv>.>v...v.v..vvv.v>>...>.>.vv.>v>v>.v.....>.v.v.>.>v>....>v..>v.> +..v.vvvv.v....>.vvvv.....v.v...>>v>.>.>.vv>>vv.v.v.v.>.vv>vv.>.>v.vvv.>v..v>v.>...>.>>....>.v>...vv...>v>vv...vv>>vvvv..v.v.v>>.>v>..>v>>v. +..>...v.v.....v.v.v>..>..v.>>>..v>v....>v>v..v>.v....>vv>..>.>.....v..>>v..>>v>...>v>v..>.v.>>....>vv.>...vv.........>v>.v..>>v.v.v>>v.v>>> +vv>.v.v>vv.........v..>..>>>>v...>..v...v..v>..vvvv....v.v...v>..>>v.>.v.>v.v.v>..>....>...>v>>vv...>...>>>..vvvv..>.>>v.v>...v..>.v..v.v.. +.>.>vvv..v.>.v>.........v...>..v.>....v.v>.v.v.v..>.>.v..v...v.......v...vv.v.v..v..v>..v..>>>.v.v>...>..>.>>>v>>..>>..>..v...>v....>.....> +v.v.vv.vv>..>>v.>>.>.>>v..>v.vv...>vv....>.>....v...v...>v...>..v>.v>v...>..vv>>..vvv>....>vv>vv>.....>v>>v.>>v..>.v...v..v>>..>.v..v..v... +vv...>v.>...vv>.>.v>..v.....v.>...>.>v.>vvv>>>.>>.........>.>..>...v>..vv..v.v.v.>vv.v>>...>>.v..v>v......>v>v.v...vv....>>>..>>v>.vv...... +v>.v..v..>.v>>....>.>.>>v>.v.>v.v>.v.>v.v>..v>.>.v>v......>>.>......v..v.v.>.v>>v...>v>>..v....>.v..vv>...>.v..>....v.>.>......v.>.>v>v>..> +>>v>.>>..vv>.>>v.v.>v.v...vv.>>.>>..v...v>v....vv...>>>.v>..vvvv.vv>v>>...v....vv.>.>.v....v>...>vv...v.>.v.vvv.v>.vvv>>vvv>.......>.>.vv.v +...vv>v.v>..>.>.v...vvvv..vvv..>.v>..>.>v.>>>v....>..v>.vvv.>..v.>.>.v....>.......vvvv>.v>.>v.>>>.>vv..>.vv.>>...v..>>v.>>.>v..>vv.>v.>.>>. +>.>>v>>>.....>vvv>.vv.>v..>.>..v>>...>>v..>....>>>v..>.>v..>>v>v.>.>v.vv.v>vv..v>v>>>v.>...>...>>>.v>.v>>>v..vv>v>>>>>v>>.........>v.v>.>>> +.......vv....>v..>..v>v.>.v.v.v>>...v.v.v...v>v.>...v...v.v...>>>.v...>v.v>>.v.>....>>>..>.>v...v....>..>.v..>.v>.>..>>>.v>>.>v.>v>.>.v..>. +..v.v...vvv..>>>vv....>>..>.v>..>>...v.>>v..v...v..v.>>.>...v>..>.........v.>..>.vv.>.v..>.>v.>v>.v.v.vv.>...>v..>.v.v.v...v..>.vv...vv>.v> +v....>v.v>...>...>>.......v....vv>>....>....v...v>>.>v.>....>.>.vv>v.>>..>..>...v>v.v.>>>..>.>>..v>.>...>.v..........>..>>>.>v.v.>.v>.>>... +>>.>.....v...>.>>>vvv>.>>>.v>.v>v..>v..vv>..v>vv.>.v.>v.....>>>v.v.>v.>..>>v..>>..v.v..v.v.>>.v.>..v..>.....v...v>..>>>.v..v....v.....v.>.. +....vv..vv.>..vv..>.>..v..v>.v.>v.>>.v...>.v..vv.>v.>>v...>...>..>v>.>...>vv.>.vv..v..>v>v>.v.>..>.>v>....v.>.v>..v...v>..v>>.>..vv.v>v.>.> +v.....>>.>v>v..v..>>v>v>>vvv.v..>....>.>>..vv.....>>..>.....vv>.......v>.>.v..>..v>.v.>.>.>...>.v..v.>>..v.v.vvvv>.v..vv>.>v..>v.v>>.vv...> +v>.v.>>...v.>..v.v>v.vv>..>...>v>>v.v>.v.>..v.>....>.>>v>.>>>vv.>..vvvv..>..>>>...>.....v>..v>>..v.v>..>>v....>.v.v..vv...>....>vv.>.vvvv>. +vv>v>>..>v>>.vvv..>v>vv..>>.vv.v>vv>.v..vv.v...>>....>.v.v>>.>>.>v...v.>...v>>>.v.vv>>v...v.>>..v..vv..v.....>>>.>>v.v>..>.vv>>..>.>.....>. +....vvv>..vv....v...v.v>v>>vvv>.v..vv.>>....>.>.v...>..>....v>...>..>v>vv..>..>>..v..>vv....vvv.>vvvv..v....>....>vv.vvvv.v..>vv.v.>v>.vvv> +>>>>v>v.....vv..>v.v>>.v.v.>..vv.v>>...>v.v..v.v...v>>.>v.v...>..>.>>..>.>v.>>vv.vv.v....v>.v..v....v.v..v.>>....v.>>>>.......>v....>vv.>v. +....v.v.>..v..>vv..v.>>>>.....vvv...v>>.v>..v.>.v>v..v.>v...v.>>>>.>..>..vv.v>.v>..>.>v.....v..>>..>.>v.v..v>v.>>.....>v.v>v.v.vvvv.>.v>>>> +>.>>.vv....>>.>..>........>.>.v...v.>.v......>.>..v.>..v..vv>.vv...vv...v.>v.>....>>......>>>.>vv>.v.>..>vvv...vv.....v>vvv.v...>.vvv.v.>>. +....v>...v...v.v...v...>...>.>v>v.>>...>...v>vv..vv.>.vv>...>v>..>>..>.>v..v>..>.>....v>..v...vv>.vv.>>.v>v.vvvv>.....v.v..>.v..vv>v>>v.>>v +v>..>>v>v.......v.......>v>.>.>.>.v.>>.v.>v>.vv.v.v.v>.v>.v...v.>>..v.....vv.vv...v.>.....>...>..>>>v..v.v>.v>v>v.>..v>v.>.>..v>...>..>v..v +.>..>>vv.>vv.v>v..v>>>....>>v.v..vv>>...>v....v>vvv>.....>.>.>..>v.>...vvv....v...vv..v.>...>...v.vvv..>>..>v.vv>.vvv>.>.>.v.>..>v.>vv..vv> +....>vv.>>>.v..>>v.>vvv...v..>v..vv...vvv.v.vv.v.....>.>vv..v>..>....vvv>..>>.>.....>>>..>v....>..v.>v.v>.>>.v...vv>.v>.v>.v>v....v...vv..v +>.v>....>>.>>...vv..v.>..>.v..>.v>..>.v.v.>v....v>>.v...>>v..>.>>vv..>v>>>.>..v>.>..>.vv.v....>.>.v...>.v.vv>v>v.vv..>.vv.v..vv...>.v..vv>> +..v.vvvv.>>>.......>>>...........v.>.>>>v>v.>....>vv.>.v>..v..>>.>.v.vv>...v...vvvv.>v>vv...>>>.v.v....v.>.>..v.>>>>..>..v..>>..>>.>>>.>>.. +v>v>v....vv..v>v.>v..v.v..v..>.v.>>..>>v>....>...v.....>..>.vv.v.vv....>....vvv>.v.v.....>>v>...v.v>.>>>.vvv>>v.>>>.>v...v>.v..>......>>vvv +.>.v.>..>>..>..v..v>v>...vvv>v>>v>.>.>..v>>...>v....v.v...v>vv>>v.v.v.>v>>..>...vvv.....v>>....v...v.v>.v.>...v>.vv...>v......v>>.v>vvv.vvv +.v>.vv.>>..v.>.>...v>.v.>>.vv..>>>....>.>.>.vv..vv.....>v...v.>.>.....vv.v...>.v>v.vv>.>>v..v>>vvv>vv>>..v.v>>..>.>>>>v>...>v.v>.>v...vv... +>>vv>...v.v>..v..>vv..v>...>......>..v.>.v.v>v........v.>vv>v..v>.v.>.v.vv..v....v.>...v>.v>v.v>...>..v....>....>>>v>>vv...vv>vv.>..>.>.... +.>.>>.>>.>.v>>...>.....>v..>.>vv.>.>v...vv..vvv....v.vv>v...v>.vv>.......v>.v.>....v>...vvv.>.v...v..>v.>>..v...v.>..v..>.>v...v>v>v>..>v>. +..v..v..v.vv>.v..v.....v.>...v>..>..v.>>>v>>v..>.>...>.v.>...>vv>.v..v...>v>v...>v>v.v>v>>v.>v..>..>vv..v>v.v.v.vvvv.>v>>>.>v>v.v...>v..>>> +..vvv>>..>v..v>>...v.>..v>>>>.....v.>>.........>....>.>..vv...v>..v.>......>.v>.v>..>..>>.vv.>>.>..v.>v...v>.>>>.v>.>.>.>v.>.....>>>vvvv>.v +v..v...vv...>>>>....v..>..v>..>.............>v..v.........vv.>.v>vv...v.v.>>v...>...>..vv....v...>..>..>...>v.....v.>v.>..>>.vv.......>>... +...>...>vv>>>.v>......v.>>>>>..>.>>..v>v>.>..v>>>v.>>......v.vv..vv.>>vv>v.v.>>>v>>.vvvv.>v...v..vvv>vv.....v...v>..vv...>...>>>..v.......v +v>.>>.>v.v>>..v>v....v>>>...v.v>..v..v>>.v..v.v.vvv.v>..>..v.vv...v.v....>..v.>vv>v>..>..>vvvv.>.v.......>v>>...>.>..v>v>.>>>v..>v>..>..... +..>.>.>>...>.v.>v..v..>...>..>v.>v.>..vv..v..>>..v.>>...>v...vv>>>>.>.v..v...>.v>.>v>...v.v.v>.vv......v..>v.....>.>.>.>.>>vv>>...>>.v.v.>. +v.>>>...vv>.>v>.>>v......>>>v.v..>.>.>v>>v>.v.vv.v>>.....>.>.vv.>>v>v......v>>v.v.>>..vv..v..>.v..>.>.>>>.vvv.>v..>..v...>.v.vv>>..v...v..> +vv.>.......v.v.....>.>.v.>>>vv..>v.v..>..v.v>vv.v>>..vv..vvv...>..>>.>.v..>.v>.>>v>.vv>.>v>vv.....v....>v>v>.v>.v..vv..v>.vv..v>...vvv..>.> +..v......v..v.>........v...>..v>v>.v....>..v>.>>v>.>>....>>>>.>.>v>..>.v>vv>>.v....>..>.>v>..v....v>>.>.vvvv.vv....>v.v>..vv.......>>.>.>.> +.>....v..>..vv....>.>....>vv>......v.>.vv...v>>....>>.v>.v>.>..>.>>..v..>....v.>>vvv..v.>>>>>.>>v..vv>v.v...vv.v.v>...>...v>.>vv.vv...v.>v. +>v>.>.>v>v>v......>.>>v....v.>.v.....v..>.v>v..>.v..>>.v>>v>.....>>>.>v....>vv.v.v>v..vv..v>vvvvv...>>>...>..>.v...>.>>..v>v..>vv.>..>.v... +v..>v.>..v..v>....v.>.>v..>....v>v.>.....>>vv.>>v...>v>.>v..vv.>>...v.>>..>v.>.>>.>>>>....v.>.vv>>v.....>.v....>.>..v>v..>.....>...>>.v.... +>.v>.vv..>..v.>.....vv.vv.v>>...v>>v..>.v..v..>>v.>.vv...>.v.>..>>v..v..v....v>.>..>.v>v.>......vv..>...>.v>v.....>.>>>.v.v....>>>.>>.vv>>> +>..v>>...>.v..v.>..>v...v...v>..>.>v.v>.>.vvv.v..>.>..>>.>.>v.>vv....v>>.v>>.v>.v.v>v.v>..>.vv...vv.>.v......>>>v.>..>v..v....>v..>>...>.v> +...v>.>vv>..v>v>.vv>.>.>..v......>>v.>.>>.vv>v>.v.v.v.>>..>..>>.v.>.v.>.....v..>..v.>>..v>v>>.>.>.vv.v>vvvvvv.>v>.>>v..v.>.v.>.>>..v.>..vvv +v>..v.>v.......>.v.v>v>v.v.....v>.v>...>v>.>.>.v.vv..>v.>>..v>...v>.>.v>>.vv.v...v....vv.>..>.v>>...v..>>>.v>v....>v.>..>.v...v...>.>..v>.. +v>vvvv>vvv.>>...>>.>.v..v....v.>v......>.v.>>.vv....>v>>>>..v......>vv>...>>>.v.v.v>>v..vvv>....>..>v.>v...v.v..>..vv..>>.v..v..>.>.v.>v.>. +......v.>....vv>>>.vv..>.>v>.v....>v..>..>.v.....vv>v....v>.v.vvvv.>.v...vv>.v.vv..>v.v.>>vvv...>vv.v>.v>.v..>.>.>.>>>..v.v>v>vv.vv>....... +>...>v..v..>vv>.v....>.v>.v.v.>..>v>.>..v.>.>v.>.>.v..v.v.>v>>v.>v.>....vv.v..v.>..>>...>...v>>..>....v.v>>v.v>v>.>.v..v.>..v.>>>...>...... +....v>>v...v..>.v>.>.v..>>.>.>v..v>.>....v.v>..v>>vv>..vvvv>>...v....vv..>..v.vvv.>.vvvv>....v.>.>v...v...>....v..>.v>vv.v.vvv..v.v>.vvv>.. +...v.vv.>v>>v>>.v>..v>.vvv>v>>...v>v>v>.v.>.v..v>.vv>v.v....>.>>vvv..vvv>.v.vv..>..>...>v.>.v.v....v....v>>...v..>.vv.vv.vv.>.>.vv..v.>.>vv +>....vvv>>..v.>.v.v>v.>.v>>>..>.>.vvv.>.>>vv>v.v.>..>...v.v>..v..v.v>v>........v.vv...v>v.>>..>.>...>v..vv>>.>>.>....>vvv>..>.>>....>..>v.. +v>>.>>v.>>vvv...v.>.....>.vv...v>>v..v..v.v>>.>..>>v.>>.>.>vvvv..vvvv.>v....>>....vv..v.v>v.>.>..v.>v...vv.>>.>>v.>...vv...v...v.v.>.vv.>.. +v..>>>v.>>...v>.>v>..v.v>.>..>>..vvv.v....v>v..>...v>>>.>.vv>v>v.v....vv.vv>>.........>........v.vv>.>v.vv.v.v..>vvvvvv...vv..>>>......v>.. +v>.....vvv>.vv>vv.>vv>v...>>v..>..>vvv..vvv....vvvvvvv.>v.>>..>v>>>>...>..v>.v..........>v>...>v>>..v..>>v....vvv..>......vv..v.>>v........ +v.....v>....>>v>.vv.>>v.vvv.v>>v>.>..v..>.v>.vv....>>>v>.>vvv>.v.>..>.>>.v.vv..>>.vv.>>.>.>>.>.vv>>..v.v.>.>........>vv>>v.>..>vv.>...vv.>v +>v..>v.....v.....v..v>.v>v.>..>v.v>>>..v.v.>.>.v....>...v.>>v>v>..>..v>>.v......v>.v.v>.v..>v>..>.....vv.>>..>v.vv.vv.....>>.v..>.....v..>. +.>.>>vv>...>>vv.>..>>.v.>v.>vv>.v>>...>..>....v>.v.v>vvv>.v.>>>..v.>.v...v..>......v...>.>>>v..>v.v.>..>.>>..vv.>v....vvv>.>.>>>>..>.vv...v +>......>...v>..>.v.v>.vvv.v>v>..>...>vv..vv>v>>>...vv.>.vv.v>vv..v.v>v.v>>>.>v.>>.>>.v..>.>.>.>..>.vv..vv.v.v.....>..>v..v.vvvv>v......>.>v +..v.v>v.>v.>v>vv>>.>..>..>v>>.vv...>....>v.v.v.vv.....>.>vv....>..v>.>.>.>.>..>>v>v...>....v.vv.>>.v>.>..>>.>v..vvv>....v.>.....v>.>...v..v +v...>v....v....>..v....>vv.>.v.v.vv.......vv.v...>vv>>..>...>.....v.v>.v.v>>.....>>.v.....v.>.vv.v>.>.v..vv...v....>>.v.vvv.v....>.....>>.> +...v.v>.>..>.>.>...vv....>....>v....>.>>vv..>v>v..>...>..v..v.>>>v>>vv...v..>>.>>..v.v.>>.>.v.>...>....v.>.>v.>...>>v....>>.>v.v......>>..v +..vv.v.....v>...>..v...vv.........>.....v..vv>....>vvvv..>v>v.>>>>v.v>..v.v.>..>...>v...>.>...>.>v>>...vv.v..v.>>.....>....v>v>v..>..vv.... +..>v>>.>..v.....>v.v.v.v>.>.>v.v.>>>>vv>......>.v.v.>>.>.v>>..vv..v.>...>..v>v.>v>>vvv..v..vv.>.>...>>....v>v..v.......>v.vvvvv...>.>>..>.. +v.v..>>v..>.>v..>..v.>...>v.....>vvv..>.>v.v....>.v.v>..>.v>.>.>vvv..>..v...>...v>v.....>v..v.v.>vv..>>...>.v>..v>>.v..v.v>..v>..vvv>..>.v. +.v.vvvvv.>.>>>>vvv>>v>>>....>vv..>..v>..v>>v...>..>v.vvv>....>.v.....>....>.v>.>vv.v>vv..>..>...vv>.v.>>..v.v.v>.>v>.>v>..v..>.>v...v>.v..> +.v.v>..>....>.v>vv..>.>>.....>.>..>v>..vvv.v.v>..vv.>.>>.>..v.>>.>............v.vvv>.v>>>..v..>...>.>v>>...v..v.v...>>v>.>..>>v.v>v..>.>v>. +v>>..v.>v.v.>.>>v......>v...>>...>>>..v...v...>.v...v>>v>>>>vv.>>..>...v....>>...>vv.>v...v.....vv.v.v..v.>...v.v.>....>.>..>v...>.>>.....v +>.v.>.v...v.....>v.vv....>v.>.v.v.v....>.........>v..>....v.vv.v>.v.>...vvv.v.>>>vv.....>.....vv.>>>.>>.v>..>..>.>v.....vvv>v>....v.>..>.>v +v>v.v.>...>.vv..>>.>>.>..v.>.>v.>.v..v>v.>.v.>..vv..>>v..>..v>.v.......v..v..v.>vv.>>v...>....v>..vv.>>..vv.v....v>...v.v....v>.>..v..vv.v. +..>.v.v.>v...>>v>.>.>.vv..>..>v.....v.>>vv..v.>.>..>>..>.vv..v.v..vv...>>.vv>v...>vv>>>v....>vv.v.....>>.vvv.v>>>v....vv.v..v..>.>.v..>..>> +v>..v>.>..>..>....>>v...v..v>..>..>v..>.v>...v...>.>.>.>...>...v.v>..v.>v>.>vv..>..vvv..v>vvv.>..v.v.v.>v..>>>>....v>>>>>v.v..v>>...v..v..v +.>....v>.>...v.v>.....>v....>......>>..v..v..>>vv.vv.v.v.v......>..>.vvv.>>..>v.v.>.>.....v>.>.>>>.>.vv.....v>v.>>v....vv.>.v.v.v....v...>. +v>v.....>.vvv.>....>.>>vv.>>vv>>>.v>>vv>..>..vv...>>>vv>>>..v..vv.>...vvvv>....>......v.v..v.v>..vvv..>.v>.v..>.v...v.vvvv>...v.v>.>>....>. +>>.>v..v.>.v.>...>>.>..>vv.....>v...v...>..>>..>v>..vv>..v.vv>.v.....v....>v..>v.v.>....>>vv>...>v>>..vvv>.......vv..>.v>v.vv>vvvv...>v..>> +..vv..>..vv.v>..v>>>>v....>>......>..v.v...v.v>vvv.>>>>vv..>v..>>..>.>.>v.v.>.>vvv>.v.v..vv...v.....v..vv.v....v.>.v.v.v>>v....v.....v.v>vv +..v.v.>>....v...v>.>.....v.v>....v...v..v..v>.>vv.>v.v>v.v..>>>.v>.>>v>..v>vv.>vv......>v.v.........v..v>v>.vvv.>v>v..>v.v..v.vv.vv>.v>>.>. +v...v.>v>.>..>v>..>>v.>.v>.v>.>.v....vv>..>..vv.>..>v..>v.vv.>.>..>>v..v>.>.....>....>>..vv.>>..>.>....>vv.v..v>.vv.vvv...>.>>......>>..v.. +.v..>>...>>..>...>v.>....>>..>.v..>>..>.>..>v>.v>.v.v..>v.>>v>...v.>.v..>..>....>...>.>.>.v....>vv>>>.>v>.vv...>.v.v>v..>>vv..>.>v.v.v.>.v> +v..v...v..vv.>.>.vv...vv.v..>>vv.>..v.v>.>v..>>.>..>>...v..v.>>>.v>>...v.>v.v>>v..>..v>>>v.v..>..v.>vvv..v>>...v..>...>...>>..v..vvv>.>.... +...vv.v.>.....>>>vv.....v.>..v..>v..>>v>..>.>.v>.v..>>v.vv>>v...vv..>vv.>.v..v>v....>>....v.>>v...>>.v.v>>v..v.v..v>>>>vv>>..>...>v.....v.> +>>.v..v.>.vv..v.>.v>.>.v>.v>>.>>v.>>..>..>.vvvv>>.v.>>..vv...>vv>.v.>...v>...>.v..>v>.v>v..>>>>.....v.>..v.vv.v.>....v.>.vvv.v>v>..>.>>v>.v +....>.v>>..v.vv...>.v...v>....>v>..v>.>>...>>..vvv.>.vv>>>>v.vv>..>..>vv.v>>..>.>>>>..vv>>.>.....>.v.v>...>.>>>..vv..v...>.>..>>v..v.....>> +>>>.v.v.>>.v..>v.v......>.v>..v>.>>..v>v...v...v>v>..v.>.v...>>v>.>..v...v>..>.>vv.>v.vvv>>.v>..........v.........>.v..>.>...v.....>..>..v. +>.>>>>vv.>>..>.v>...vv..vv>..v>.>>.vv>.>..v...v>...>>.....>v.vv...>>.v>>>.v...>.>v>v.vv.....>>.v>.v...v>>.....>..>>v..v>.v....>v...v.....>v +.v..>.v.v..>.v..v..v.>..v.v>v.v>>vv>vv...>..v.v.....>>..v.v>.v>>.>vv....>>>.>>vv>......v>>..v..>.>v>.>>>....v>vv..>.....>>vv.v..>..v...vv.v +..v.>.>.>v>.v>.>...>..vv..vvv....v.vv..v....>.>.v.v...>....>v>v....v.v..v>vv...v>>v.v....v.v.>..vv..vv.v>>>..v....>>.v>.>.>v...v.v>>>>.v... +v.v..>>.>vv.v>......>v>.>..v>.v.>...>......vv..vvv.v..>...v..v>.>.v>v...v..>....>.>.v.v..vv.>v.>v>.vv>v...v>.vv..v..v...>>.v.v....>>..>>vv. +.vv...vvvv.>.v...v.>.v.>v......>vvv>>v..v>vv.>>.v>v.vv..>.>..>......v>...v.>>>>>.vvv.>>v...>>>v..v.v>>v>...>.....>vv..v.>v>......>>>v...vv> +....>>...v>...>v>>>>v>>>.....>....>.>.>..>>..vv...vv...v.>vv.>>>...>>.>..v>>vv.v.>..vv..>.>v..v.>.v>..>.vv.>v>v>.>...v..v.v...v>.>v...v>>>. +.v.v.v.v>.......v.vv......v..v.vv>>>...>..v.>.>..>......>v..>v>v>vv.>.v.v.>.v.>..v>.v.>>>v..>>..>.v..>...vv>.>>v>.....v..v.>.>.....vvv>..>. +v.....vv>vv>.>vvv..>>...>>v.>v.vv...>....vv.v>>>vv>.>>v.v>>vv.vvv>.>>..>vv>.v...v...v...>...>.>>vv>>v...vvvvvv>..v..>.v..>>>..>.vvv...>vv>v +>..>>>.vvv..vv>>...v.v>...>...vv...>>v.v.>v....v>.....>v.v.>...>v>vv>>.>>.>.>..>v>..v.>>v.v.v.>...>>vv.>>.>.>..v>.v.v....vv..v>.>...v>v.>.> +>v>...v..vv...>.>.v.>>...v>>>.>v.v.v.v.>...vvv.>.v....v....>....v>v>.>vv.>v...v>...v.......>.v.......>v..v...v>.>..v>..>..v>.v..>vv.>v>vv.. +vv.>>..v>>vv.v..v.vv>>>>>v>>......v..v...v>vv>>v.v..>.v>vv>v..v......>>>>v>v..>v>.v..v.>..v....vv..v...v>>>..>....>...v...>>>.vv>..>v....>> +..>.v.v.>>.vv...>v>>>v>>.v..>>.>>>.....>>.vv>v>>>>...v...v...v.>>..>>..>>v.>>>>v...>.>v..>.>.>..>.v.>..>v>v.v.vvv>....vvv.v..v.v...v.v>v... +>v.>>>.v.>v.v.>.>v>.v>.>>>vvv.>.v>..>vvv..v..>.>.vv>v.>..vv..v...v.>>v.v>..>.>vv.v.vvv.v...vv>v.vv..>v.v>..vv...>>.......v....>>...>vv..vv> +vv>.>v>.v.vv..>.>.>..>>vv>>v>......v>.v.v>.v.v.....>.>>..>v>v.>>.>..>v.v>v.v>...vv>v>...>>vv..>.>.>>.>>.v.v...vv....>v.v..v>v.>>..v>>..v.>. +.>v>.v.>>...v....>...v..>v>v.>...v.>.....v.>.>.>v......v>>.>v.>.v..>.>>...v..vv..>v..v.>..vv>>..>.>.v..vv.>.>.....>....>.vv.v...v.>v.>v..v> +>v>.>vv..>.>>v>..>v>v.>...>.v.vv>>.>.vvv..>...>....v>.>vv>>..>>>.v>>v>.v..>..v..v>...v.>v...>>..v>>..>.v.>>..v..vv..vv.....v.v..v..vvv....v +vv....>vvv.>.>>>....>.>v>.>vv..v>.>..>.>v>.vv.v.vv.>v>.>>.>>vv>>.....v....>>>vv>>....>vv.v..>.v.vv>..>v....>.>>>>..>.>..vvvv.v.......v...v. +>>..>.>.>vvvv>.>v>>v.v.>>>.v>..>.>.....v>.....vv.>...>>v.>v.>>...>>.>.vvvv>v.....v>v.v>>..v..>..>>.v.>.>...v>...vv>.>v>..vvv......v.>v....> +.vvv...vv.>.>.v..vv>>.>...v>.vv....vv.v..v>........>v.>>>...>.>.....v..>.v.>v.v..>..v..v>.>..>>>vv>..>.v...v>...vvv.v.v.>.v.vv..>>>v..v.>v. +>v.v>>>....vv>v..v..vv>.v.>.....vv.>..v..v>vvv.>>v.v.>.>.>v.>..v>v.v>.v.v...v..v.>.v.>v.>v>.v>v.........v..>v.>v>v.v.v.>..>.>....vvvvvv>.>. +...vv.>v.vv.>v>..v..v.>v>v..>.....>.>>.v.>>.>..>>.v.vv..>v.v>v..>v...v.vv.>.>.v>vv...vv.vv.v.vvv...>v>vvv......v...>>>>.>.v>..vv..>.v>>>..> +>.v...v....v.vv.....>>v..>....vv..vv....>..>>..>.>vvvvv>v..>.>>>>>..>v..v.>>>.v>....v..v>...>...vvvvv...>>.......>>vvvv.>v..v...>..>>>..... +.v.>v..>vv...v>......>vv..v.....v....>.vv.>vvvv.>v>v.>.>v..v......v.>>.>....v.>>v>>v.>v>>v....>.v>.v>...v>.v>v>.>..v>...>>>v>..>>>>>...v.v> +.>>.v>.>.>>>..v.v.v.v>>v..v>.>>v..v>v>>.>>......>v>..>.>vvv.>...>>...>.>>.>>..>>v.....v..>......>...v>vv..v>..v>.vvv.vvv....>.>..vv>>..v>v. +v.>.....v>>vv.v.v>>vvvv.>>vvv...>v>.v.v...>..>>v.>v>.>v>>>....>v..v..v>..>..vv>>.v.v.vv.v..v....v>.v.v.vv...v...>.>.>v....v.>>v..vv.>>.>... +>v>vv.>v...>.v..v.vvv>.>.>>vv>..>>>...>v.>v..vv>vv..v.>>v.>v>v.>..>...v..v>>>vv..>>v...>.v.>.v.>.v>.v.>.>v...v>>>v..vv..v>.v>.vvvv>v.>.v.>. +.>..v..>.vv.>vv.>v.>......>..v....v>.v>vv>...>vv....v...>v>.v..vv>>.......v>v.>v>>....v.>....vv.vv..>.>>v.v...>.>v.>.v.vv.>.>v...v..>>.v... +>.....vv...>v.>v>.>>.vv>>>..vvv.>vvv>..>v..v..v>v>>vvv>v>>..>>v..>..v.v.>v..>...v>.>v....v.v>>..v....v.vvvv...>....v.>..v.>v....v.>.>vv...> +>v..>>.v>>.vv>..>v.>..>>v>v..>..v...>>v.v.>v............>vv.v.vv..>>vv...>..>>.>...v.v>>..>>v..v>.vv..v.v>v..>.vv>>.>>>v>.v>>.>v.vv>..v.v.> +.v..vv....v..v.v.v.........v>>.>v...>v..v>.v.>..vv>...v...v.vv.v>v..>..vv.vv..>vv.v.>.v>vv.>..........>>vv...>v>.....vv..v.>.>v.v>...>....v +.>>.>...v.>v....>.....v>.>v.>.....v.>>..v...>.>v.>>.>>>.vv..>>.>v..v>.>>...>..>.vv.v....>.v..>vv.v...>>.v>.vvv.>.>v.vv..v.>.>>>>.>>...v>v.. +...vv>>>v..>..v>vv.>.>>v..v>vvv>..vv.>v>.v..vvvvv.....vv>>.v>v..>..>>.v.v...v...v...>v.v..vv.v.>v>.>v..>v.>.vvv..>.>.v..>.vv..>v>...>>v.>.. +v.vv.>>>..v>.vv>...v>....>v>..>v.>.....>vv..>>......>>.>.vv.v..>>..>.>.v.....vv..v.v.....>.v>v.>.>>.>.v>>>.v.>..v..vv..>.v...>..v.>.>>..v.v +..vv...v.>v>.........v>>v.....v..vv.>vv.>.>.>...>>.......>...vv.>vv>.....v.>>.>......>....>>.vv..>....vv.v.vv..v..v....>...v.......>v>..>.> +.>.v..v.....>.>>.v.>>...v.>.v>.v>..v....>>v>>v>.>..>.v.vv.v.>..v>>...vv.v.>>>...v.>>.v>vv.v.vv...>v.>>....v.v....vv>.v.v...>...>...>v.>v... +.v.vv>>v.v.vv>..>.>.>.v.v.>.....vv>>v>vvv.....>>>v.>.v..>>..>.vv>v..v.>vv.>v.>..v.>vv>v>...v>v>>.v.>.....>..v>.>..v>v..........vv......>.vv +.vv..>>>>..v.>.v.>..>.v>.....v.>>v.>.......vv>>v.v>..>>.>v>>>.....>..v......>..v>.vv.>.v.>v>.>.v....>v.>v.v.v..v.vv...v.vv>.v>.....>..v>..v +.v..v>v>>....v....vv>...vv..v>...v..>...>...>..>v..>>>.vv.v....v...>v.>.......v.v.>v....v..v>...........v..>v>>.>.>>v....v.>.v...v.>.v>..v. From afb38fba2c3e2a1ee2b837fa5d93499e217be07f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 25 Dec 2021 16:55:18 +0100 Subject: [PATCH 270/479] 2021: d25: ex1: add solution --- 2021/d25/ex1/ex1.py | 88 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 2021/d25/ex1/ex1.py diff --git a/2021/d25/ex1/ex1.py b/2021/d25/ex1/ex1.py new file mode 100755 index 0000000..c785a12 --- /dev/null +++ b/2021/d25/ex1/ex1.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import List, NamedTuple, Set + + +class Point(NamedTuple): + x: int + y: int + + +class Map(NamedTuple): + east: Set[Point] + south: Set[Point] + dimensions: Point + + +def solve(input: List[str]) -> int: + def parse() -> Map: + east, south = set(), set() + + for x, line in enumerate(input): + for y, c in enumerate(line): + if c == ".": + continue + if c == "v": + south.add(Point(x, y)) + if c == ">": + east.add(Point(x, y)) + + return Map(east, south, Point(len(input), len(input[0]))) + + def step(sea_cucumbers: Map) -> Map: + def move_east(p: Point) -> Point: + return Point(p.x, (p.y + 1) % sea_cucumbers.dimensions.y) + + def move_south(p: Point) -> Point: + return Point((p.x + 1) % sea_cucumbers.dimensions.x, p.y) + + east, south = set(), set() + + for old_p in sea_cucumbers.east: + p = move_east(old_p) + if p in sea_cucumbers.east or p in sea_cucumbers.south: + east.add(old_p) + continue + east.add(p) + + for old_p in sea_cucumbers.south: + p = move_south(old_p) + if p in east or p in sea_cucumbers.south: + south.add(old_p) + continue + south.add(p) + + return Map(east, south, sea_cucumbers.dimensions) + + def debug(map: Map) -> None: + for x in range(map.dimensions.x): + print( + "".join( + "v" + if Point(x, y) in map.south + else ">" + if Point(x, y) in map.east + else "." + for y in range(map.dimensions.y) + ) + ) + + sea_cucumbers = parse() + for i in itertools.count(1): + if (new_map := step(sea_cucumbers)) == sea_cucumbers: + return i + print(i) + sea_cucumbers = new_map + + assert False # Sanity check + + +def main() -> None: + input = [line.rstrip("\n") for line in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 2fa3ffadeb049e113628fc8c85ff1e7b56aaa69e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 25 Dec 2021 16:55:24 +0100 Subject: [PATCH 271/479] 2021: d25: ex2: add input --- 2021/d25/ex2/input | 137 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 2021/d25/ex2/input diff --git a/2021/d25/ex2/input b/2021/d25/ex2/input new file mode 100644 index 0000000..192c325 --- /dev/null +++ b/2021/d25/ex2/input @@ -0,0 +1,137 @@ +>>vv..>v..>vv.....>vv...>.>...>>......v>v>.v.v..>v..v>.>v.....v..>vvvv.>.>vv>v..v>.v>..v>>>>.>vv.>>vv>.>>v..>.v.v>v>v.>vv.>.......vv.>.>>v. +v>.>v>.v....>>v.vvv>.>>..>....>.v>.v>vv.v..v.v..v>.>.v>.>..>>v.vvvvv..>>..v.v..>>v>vv>.v..vvv.>v..v>>>v.v..>>...>vv..>>v.v>>.>v>.>.v....>>. +v.>vv....v>..v>>..v.>>.....vv..>.vvv>.....v.v>vvv>..v>>..v...>...>...vv.v..>.vvv>>.v>vv..v.>>>....vv.>.>..v..vv.>>v>.>>.>>.v>>>>.>v.v.>v..v +.v.>>..v...v>v.>>>>v....>.....>...v.v..>.v...>.v.....>>.v>v...>.>.>..>v>>>>.v.>..>......>.v>>.>v..>.>vv.>.v>...v.>v.>>.>...>>>..>>>.vv>..v. +.....v.>.v>........>>.>.>vvv.vv>>.>vvv.v.>vvv.....v..>v..>vvv.>.v>.>..v..vv.>...v>>>>vv>.v..v.>..>..vvvv.>.>vvv....v>..>...v...v.v>v.>..v.v +>..>..>..v.>>..v>..vv....>vv.vv>..>v........>..vv>.>.v.>...v.>v...vvv>.....v..vv...vv>.......v>vv.vv.>.vv..v>..v.v.>..>>>.v..vv>...v>vv..>v +.v.>..vv>.>>v>...>.>.>..>.vvv..v>v.v>>.v...v.vv..v..vvv..vv.v.vv...>v..v....>>>>..vvv>v..>.vv.v.>...>vv>......v...>.v...v....v....>v>.>>... +>v.v.v>>.v.>..>>v>>>v.>v.....v>...>>..v.v>.v..>>..>.vvv...>...v>>v.v....v>.vv>.>.v>.>>>.v>>.v..vvv>.vv......v.v...v...>.vvvvv>.>..>>...vv>. +vv>..v.>>v.>.>v.>..v.v>....vv.v..>>.>>v>>..>>>>v>..v>.>.>.>......vv>vv>>>v....>.>v..>.>>vv...>>v.....>>>....>.v.v>v>..v>v.>vv.v>..>.>.>v>.. +v.v.v>v.v..vv.v..>.>v.v.v..>.>.>.>...v.v.>>v>vv.>>....>>..vv...v.v.>..v>.>v.v..v.>.>.>..>...>.vvv...v.v>....vv.>..v>.vv.....>..v>>>.>v.>..v +v...>.>.>v>.v....vv.v>...>v>vv.>..v...>>>..>.>........>..v.>>.v.....>.vvv...>v.>>.vv>v>>>>...>.vv.>...>.>..v..>>>...v.vv.>>v....>.vvv>>v.>. +.>...vv.v........v.v......v>vvv.vv..>...vvv..vv.>.v.v...>vv.>>...>.v..>v>vv>.>v...v.v..vvv.v>>...>.>.vv.>v>v>.v.....>.v.v.>.>v>....>v..>v.> +..v.vvvv.v....>.vvvv.....v.v...>>v>.>.>.vv>>vv.v.v.v.>.vv>vv.>.>v.vvv.>v..v>v.>...>.>>....>.v>...vv...>v>vv...vv>>vvvv..v.v.v>>.>v>..>v>>v. +..>...v.v.....v.v.v>..>..v.>>>..v>v....>v>v..v>.v....>vv>..>.>.....v..>>v..>>v>...>v>v..>.v.>>....>vv.>...vv.........>v>.v..>>v.v.v>>v.v>>> +vv>.v.v>vv.........v..>..>>>>v...>..v...v..v>..vvvv....v.v...v>..>>v.>.v.>v.v.v>..>....>...>v>>vv...>...>>>..vvvv..>.>>v.v>...v..>.v..v.v.. +.>.>vvv..v.>.v>.........v...>..v.>....v.v>.v.v.v..>.>.v..v...v.......v...vv.v.v..v..v>..v..>>>.v.v>...>..>.>>>v>>..>>..>..v...>v....>.....> +v.v.vv.vv>..>>v.>>.>.>>v..>v.vv...>vv....>.>....v...v...>v...>..v>.v>v...>..vv>>..vvv>....>vv>vv>.....>v>>v.>>v..>.v...v..v>>..>.v..v..v... +vv...>v.>...vv>.>.v>..v.....v.>...>.>v.>vvv>>>.>>.........>.>..>...v>..vv..v.v.v.>vv.v>>...>>.v..v>v......>v>v.v...vv....>>>..>>v>.vv...... +v>.v..v..>.v>>....>.>.>>v>.v.>v.v>.v.>v.v>..v>.>.v>v......>>.>......v..v.v.>.v>>v...>v>>..v....>.v..vv>...>.v..>....v.>.>......v.>.>v>v>..> +>>v>.>>..vv>.>>v.v.>v.v...vv.>>.>>..v...v>v....vv...>>>.v>..vvvv.vv>v>>...v....vv.>.>.v....v>...>vv...v.>.v.vvv.v>.vvv>>vvv>.......>.>.vv.v +...vv>v.v>..>.>.v...vvvv..vvv..>.v>..>.>v.>>>v....>..v>.vvv.>..v.>.>.v....>.......vvvv>.v>.>v.>>>.>vv..>.vv.>>...v..>>v.>>.>v..>vv.>v.>.>>. +>.>>v>>>.....>vvv>.vv.>v..>.>..v>>...>>v..>....>>>v..>.>v..>>v>v.>.>v.vv.v>vv..v>v>>>v.>...>...>>>.v>.v>>>v..vv>v>>>>>v>>.........>v.v>.>>> +.......vv....>v..>..v>v.>.v.v.v>>...v.v.v...v>v.>...v...v.v...>>>.v...>v.v>>.v.>....>>>..>.>v...v....>..>.v..>.v>.>..>>>.v>>.>v.>v>.>.v..>. +..v.v...vvv..>>>vv....>>..>.v>..>>...v.>>v..v...v..v.>>.>...v>..>.........v.>..>.vv.>.v..>.>v.>v>.v.v.vv.>...>v..>.v.v.v...v..>.vv...vv>.v> +v....>v.v>...>...>>.......v....vv>>....>....v...v>>.>v.>....>.>.vv>v.>>..>..>...v>v.v.>>>..>.>>..v>.>...>.v..........>..>>>.>v.v.>.v>.>>... +>>.>.....v...>.>>>vvv>.>>>.v>.v>v..>v..vv>..v>vv.>.v.>v.....>>>v.v.>v.>..>>v..>>..v.v..v.v.>>.v.>..v..>.....v...v>..>>>.v..v....v.....v.>.. +....vv..vv.>..vv..>.>..v..v>.v.>v.>>.v...>.v..vv.>v.>>v...>...>..>v>.>...>vv.>.vv..v..>v>v>.v.>..>.>v>....v.>.v>..v...v>..v>>.>..vv.v>v.>.> +v.....>>.>v>v..v..>>v>v>>vvv.v..>....>.>>..vv.....>>..>.....vv>.......v>.>.v..>..v>.v.>.>.>...>.v..v.>>..v.v.vvvv>.v..vv>.>v..>v.v>>.vv...> +v>.v.>>...v.>..v.v>v.vv>..>...>v>>v.v>.v.>..v.>....>.>>v>.>>>vv.>..vvvv..>..>>>...>.....v>..v>>..v.v>..>>v....>.v.v..vv...>....>vv.>.vvvv>. +vv>v>>..>v>>.vvv..>v>vv..>>.vv.v>vv>.v..vv.v...>>....>.v.v>>.>>.>v...v.>...v>>>.v.vv>>v...v.>>..v..vv..v.....>>>.>>v.v>..>.vv>>..>.>.....>. +....vvv>..vv....v...v.v>v>>vvv>.v..vv.>>....>.>.v...>..>....v>...>..>v>vv..>..>>..v..>vv....vvv.>vvvv..v....>....>vv.vvvv.v..>vv.v.>v>.vvv> +>>>>v>v.....vv..>v.v>>.v.v.>..vv.v>>...>v.v..v.v...v>>.>v.v...>..>.>>..>.>v.>>vv.vv.v....v>.v..v....v.v..v.>>....v.>>>>.......>v....>vv.>v. +....v.v.>..v..>vv..v.>>>>.....vvv...v>>.v>..v.>.v>v..v.>v...v.>>>>.>..>..vv.v>.v>..>.>v.....v..>>..>.>v.v..v>v.>>.....>v.v>v.v.vvvv.>.v>>>> +>.>>.vv....>>.>..>........>.>.v...v.>.v......>.>..v.>..v..vv>.vv...vv...v.>v.>....>>......>>>.>vv>.v.>..>vvv...vv.....v>vvv.v...>.vvv.v.>>. +....v>...v...v.v...v...>...>.>v>v.>>...>...v>vv..vv.>.vv>...>v>..>>..>.>v..v>..>.>....v>..v...vv>.vv.>>.v>v.vvvv>.....v.v..>.v..vv>v>>v.>>v +v>..>>v>v.......v.......>v>.>.>.>.v.>>.v.>v>.vv.v.v.v>.v>.v...v.>>..v.....vv.vv...v.>.....>...>..>>>v..v.v>.v>v>v.>..v>v.>.>..v>...>..>v..v +.>..>>vv.>vv.v>v..v>>>....>>v.v..vv>>...>v....v>vvv>.....>.>.>..>v.>...vvv....v...vv..v.>...>...v.vvv..>>..>v.vv>.vvv>.>.>.v.>..>v.>vv..vv> +....>vv.>>>.v..>>v.>vvv...v..>v..vv...vvv.v.vv.v.....>.>vv..v>..>....vvv>..>>.>.....>>>..>v....>..v.>v.v>.>>.v...vv>.v>.v>.v>v....v...vv..v +>.v>....>>.>>...vv..v.>..>.v..>.v>..>.v.v.>v....v>>.v...>>v..>.>>vv..>v>>>.>..v>.>..>.vv.v....>.>.v...>.v.vv>v>v.vv..>.vv.v..vv...>.v..vv>> +..v.vvvv.>>>.......>>>...........v.>.>>>v>v.>....>vv.>.v>..v..>>.>.v.vv>...v...vvvv.>v>vv...>>>.v.v....v.>.>..v.>>>>..>..v..>>..>>.>>>.>>.. +v>v>v....vv..v>v.>v..v.v..v..>.v.>>..>>v>....>...v.....>..>.vv.v.vv....>....vvv>.v.v.....>>v>...v.v>.>>>.vvv>>v.>>>.>v...v>.v..>......>>vvv +.>.v.>..>>..>..v..v>v>...vvv>v>>v>.>.>..v>>...>v....v.v...v>vv>>v.v.v.>v>>..>...vvv.....v>>....v...v.v>.v.>...v>.vv...>v......v>>.v>vvv.vvv +.v>.vv.>>..v.>.>...v>.v.>>.vv..>>>....>.>.>.vv..vv.....>v...v.>.>.....vv.v...>.v>v.vv>.>>v..v>>vvv>vv>>..v.v>>..>.>>>>v>...>v.v>.>v...vv... +>>vv>...v.v>..v..>vv..v>...>......>..v.>.v.v>v........v.>vv>v..v>.v.>.v.vv..v....v.>...v>.v>v.v>...>..v....>....>>>v>>vv...vv>vv.>..>.>.... +.>.>>.>>.>.v>>...>.....>v..>.>vv.>.>v...vv..vvv....v.vv>v...v>.vv>.......v>.v.>....v>...vvv.>.v...v..>v.>>..v...v.>..v..>.>v...v>v>v>..>v>. +..v..v..v.vv>.v..v.....v.>...v>..>..v.>>>v>>v..>.>...>.v.>...>vv>.v..v...>v>v...>v>v.v>v>>v.>v..>..>vv..v>v.v.v.vvvv.>v>>>.>v>v.v...>v..>>> +..vvv>>..>v..v>>...v.>..v>>>>.....v.>>.........>....>.>..vv...v>..v.>......>.v>.v>..>..>>.vv.>>.>..v.>v...v>.>>>.v>.>.>.>v.>.....>>>vvvv>.v +v..v...vv...>>>>....v..>..v>..>.............>v..v.........vv.>.v>vv...v.v.>>v...>...>..vv....v...>..>..>...>v.....v.>v.>..>>.vv.......>>... +...>...>vv>>>.v>......v.>>>>>..>.>>..v>v>.>..v>>>v.>>......v.vv..vv.>>vv>v.v.>>>v>>.vvvv.>v...v..vvv>vv.....v...v>..vv...>...>>>..v.......v +v>.>>.>v.v>>..v>v....v>>>...v.v>..v..v>>.v..v.v.vvv.v>..>..v.vv...v.v....>..v.>vv>v>..>..>vvvv.>.v.......>v>>...>.>..v>v>.>>>v..>v>..>..... +..>.>.>>...>.v.>v..v..>...>..>v.>v.>..vv..v..>>..v.>>...>v...vv>>>>.>.v..v...>.v>.>v>...v.v.v>.vv......v..>v.....>.>.>.>.>>vv>>...>>.v.v.>. +v.>>>...vv>.>v>.>>v......>>>v.v..>.>.>v>>v>.v.vv.v>>.....>.>.vv.>>v>v......v>>v.v.>>..vv..v..>.v..>.>.>>>.vvv.>v..>..v...>.v.vv>>..v...v..> +vv.>.......v.v.....>.>.v.>>>vv..>v.v..>..v.v>vv.v>>..vv..vvv...>..>>.>.v..>.v>.>>v>.vv>.>v>vv.....v....>v>v>.v>.v..vv..v>.vv..v>...vvv..>.> +..v......v..v.>........v...>..v>v>.v....>..v>.>>v>.>>....>>>>.>.>v>..>.v>vv>>.v....>..>.>v>..v....v>>.>.vvvv.vv....>v.v>..vv.......>>.>.>.> +.>....v..>..vv....>.>....>vv>......v.>.vv...v>>....>>.v>.v>.>..>.>>..v..>....v.>>vvv..v.>>>>>.>>v..vv>v.v...vv.v.v>...>...v>.>vv.vv...v.>v. +>v>.>.>v>v>v......>.>>v....v.>.v.....v..>.v>v..>.v..>>.v>>v>.....>>>.>v....>vv.v.v>v..vv..v>vvvvv...>>>...>..>.v...>.>>..v>v..>vv.>..>.v... +v..>v.>..v..v>....v.>.>v..>....v>v.>.....>>vv.>>v...>v>.>v..vv.>>...v.>>..>v.>.>>.>>>>....v.>.vv>>v.....>.v....>.>..v>v..>.....>...>>.v.... +>.v>.vv..>..v.>.....vv.vv.v>>...v>>v..>.v..v..>>v.>.vv...>.v.>..>>v..v..v....v>.>..>.v>v.>......vv..>...>.v>v.....>.>>>.v.v....>>>.>>.vv>>> +>..v>>...>.v..v.>..>v...v...v>..>.>v.v>.>.vvv.v..>.>..>>.>.>v.>vv....v>>.v>>.v>.v.v>v.v>..>.vv...vv.>.v......>>>v.>..>v..v....>v..>>...>.v> +...v>.>vv>..v>v>.vv>.>.>..v......>>v.>.>>.vv>v>.v.v.v.>>..>..>>.v.>.v.>.....v..>..v.>>..v>v>>.>.>.vv.v>vvvvvv.>v>.>>v..v.>.v.>.>>..v.>..vvv +v>..v.>v.......>.v.v>v>v.v.....v>.v>...>v>.>.>.v.vv..>v.>>..v>...v>.>.v>>.vv.v...v....vv.>..>.v>>...v..>>>.v>v....>v.>..>.v...v...>.>..v>.. +v>vvvv>vvv.>>...>>.>.v..v....v.>v......>.v.>>.vv....>v>>>>..v......>vv>...>>>.v.v.v>>v..vvv>....>..>v.>v...v.v..>..vv..>>.v..v..>.>.v.>v.>. +......v.>....vv>>>.vv..>.>v>.v....>v..>..>.v.....vv>v....v>.v.vvvv.>.v...vv>.v.vv..>v.v.>>vvv...>vv.v>.v>.v..>.>.>.>>>..v.v>v>vv.vv>....... +>...>v..v..>vv>.v....>.v>.v.v.>..>v>.>..v.>.>v.>.>.v..v.v.>v>>v.>v.>....vv.v..v.>..>>...>...v>>..>....v.v>>v.v>v>.>.v..v.>..v.>>>...>...... +....v>>v...v..>.v>.>.v..>>.>.>v..v>.>....v.v>..v>>vv>..vvvv>>...v....vv..>..v.vvv.>.vvvv>....v.>.>v...v...>....v..>.v>vv.v.vvv..v.v>.vvv>.. +...v.vv.>v>>v>>.v>..v>.vvv>v>>...v>v>v>.v.>.v..v>.vv>v.v....>.>>vvv..vvv>.v.vv..>..>...>v.>.v.v....v....v>>...v..>.vv.vv.vv.>.>.vv..v.>.>vv +>....vvv>>..v.>.v.v>v.>.v>>>..>.>.vvv.>.>>vv>v.v.>..>...v.v>..v..v.v>v>........v.vv...v>v.>>..>.>...>v..vv>>.>>.>....>vvv>..>.>>....>..>v.. +v>>.>>v.>>vvv...v.>.....>.vv...v>>v..v..v.v>>.>..>>v.>>.>.>vvvv..vvvv.>v....>>....vv..v.v>v.>.>..v.>v...vv.>>.>>v.>...vv...v...v.v.>.vv.>.. +v..>>>v.>>...v>.>v>..v.v>.>..>>..vvv.v....v>v..>...v>>>.>.vv>v>v.v....vv.vv>>.........>........v.vv>.>v.vv.v.v..>vvvvvv...vv..>>>......v>.. +v>.....vvv>.vv>vv.>vv>v...>>v..>..>vvv..vvv....vvvvvvv.>v.>>..>v>>>>...>..v>.v..........>v>...>v>>..v..>>v....vvv..>......vv..v.>>v........ +v.....v>....>>v>.vv.>>v.vvv.v>>v>.>..v..>.v>.vv....>>>v>.>vvv>.v.>..>.>>.v.vv..>>.vv.>>.>.>>.>.vv>>..v.v.>.>........>vv>>v.>..>vv.>...vv.>v +>v..>v.....v.....v..v>.v>v.>..>v.v>>>..v.v.>.>.v....>...v.>>v>v>..>..v>>.v......v>.v.v>.v..>v>..>.....vv.>>..>v.vv.vv.....>>.v..>.....v..>. +.>.>>vv>...>>vv.>..>>.v.>v.>vv>.v>>...>..>....v>.v.v>vvv>.v.>>>..v.>.v...v..>......v...>.>>>v..>v.v.>..>.>>..vv.>v....vvv>.>.>>>>..>.vv...v +>......>...v>..>.v.v>.vvv.v>v>..>...>vv..vv>v>>>...vv.>.vv.v>vv..v.v>v.v>>>.>v.>>.>>.v..>.>.>.>..>.vv..vv.v.v.....>..>v..v.vvvv>v......>.>v +..v.v>v.>v.>v>vv>>.>..>..>v>>.vv...>....>v.v.v.vv.....>.>vv....>..v>.>.>.>.>..>>v>v...>....v.vv.>>.v>.>..>>.>v..vvv>....v.>.....v>.>...v..v +v...>v....v....>..v....>vv.>.v.v.vv.......vv.v...>vv>>..>...>.....v.v>.v.v>>.....>>.v.....v.>.vv.v>.>.v..vv...v....>>.v.vvv.v....>.....>>.> +...v.v>.>..>.>.>...vv....>....>v....>.>>vv..>v>v..>...>..v..v.>>>v>>vv...v..>>.>>..v.v.>>.>.v.>...>....v.>.>v.>...>>v....>>.>v.v......>>..v +..vv.v.....v>...>..v...vv.........>.....v..vv>....>vvvv..>v>v.>>>>v.v>..v.v.>..>...>v...>.>...>.>v>>...vv.v..v.>>.....>....v>v>v..>..vv.... +..>v>>.>..v.....>v.v.v.v>.>.>v.v.>>>>vv>......>.v.v.>>.>.v>>..vv..v.>...>..v>v.>v>>vvv..v..vv.>.>...>>....v>v..v.......>v.vvvvv...>.>>..>.. +v.v..>>v..>.>v..>..v.>...>v.....>vvv..>.>v.v....>.v.v>..>.v>.>.>vvv..>..v...>...v>v.....>v..v.v.>vv..>>...>.v>..v>>.v..v.v>..v>..vvv>..>.v. +.v.vvvvv.>.>>>>vvv>>v>>>....>vv..>..v>..v>>v...>..>v.vvv>....>.v.....>....>.v>.>vv.v>vv..>..>...vv>.v.>>..v.v.v>.>v>.>v>..v..>.>v...v>.v..> +.v.v>..>....>.v>vv..>.>>.....>.>..>v>..vvv.v.v>..vv.>.>>.>..v.>>.>............v.vvv>.v>>>..v..>...>.>v>>...v..v.v...>>v>.>..>>v.v>v..>.>v>. +v>>..v.>v.v.>.>>v......>v...>>...>>>..v...v...>.v...v>>v>>>>vv.>>..>...v....>>...>vv.>v...v.....vv.v.v..v.>...v.v.>....>.>..>v...>.>>.....v +>.v.>.v...v.....>v.vv....>v.>.v.v.v....>.........>v..>....v.vv.v>.v.>...vvv.v.>>>vv.....>.....vv.>>>.>>.v>..>..>.>v.....vvv>v>....v.>..>.>v +v>v.v.>...>.vv..>>.>>.>..v.>.>v.>.v..v>v.>.v.>..vv..>>v..>..v>.v.......v..v..v.>vv.>>v...>....v>..vv.>>..vv.v....v>...v.v....v>.>..v..vv.v. +..>.v.v.>v...>>v>.>.>.vv..>..>v.....v.>>vv..v.>.>..>>..>.vv..v.v..vv...>>.vv>v...>vv>>>v....>vv.v.....>>.vvv.v>>>v....vv.v..v..>.>.v..>..>> +v>..v>.>..>..>....>>v...v..v>..>..>v..>.v>...v...>.>.>.>...>...v.v>..v.>v>.>vv..>..vvv..v>vvv.>..v.v.v.>v..>>>>....v>>>>>v.v..v>>...v..v..v +.>....v>.>...v.v>.....>v....>......>>..v..v..>>vv.vv.v.v.v......>..>.vvv.>>..>v.v.>.>.....v>.>.>>>.>.vv.....v>v.>>v....vv.>.v.v.v....v...>. +v>v.....>.vvv.>....>.>>vv.>>vv>>>.v>>vv>..>..vv...>>>vv>>>..v..vv.>...vvvv>....>......v.v..v.v>..vvv..>.v>.v..>.v...v.vvvv>...v.v>.>>....>. +>>.>v..v.>.v.>...>>.>..>vv.....>v...v...>..>>..>v>..vv>..v.vv>.v.....v....>v..>v.v.>....>>vv>...>v>>..vvv>.......vv..>.v>v.vv>vvvv...>v..>> +..vv..>..vv.v>..v>>>>v....>>......>..v.v...v.v>vvv.>>>>vv..>v..>>..>.>.>v.v.>.>vvv>.v.v..vv...v.....v..vv.v....v.>.v.v.v>>v....v.....v.v>vv +..v.v.>>....v...v>.>.....v.v>....v...v..v..v>.>vv.>v.v>v.v..>>>.v>.>>v>..v>vv.>vv......>v.v.........v..v>v>.vvv.>v>v..>v.v..v.vv.vv>.v>>.>. +v...v.>v>.>..>v>..>>v.>.v>.v>.>.v....vv>..>..vv.>..>v..>v.vv.>.>..>>v..v>.>.....>....>>..vv.>>..>.>....>vv.v..v>.vv.vvv...>.>>......>>..v.. +.v..>>...>>..>...>v.>....>>..>.v..>>..>.>..>v>.v>.v.v..>v.>>v>...v.>.v..>..>....>...>.>.>.v....>vv>>>.>v>.vv...>.v.v>v..>>vv..>.>v.v.v.>.v> +v..v...v..vv.>.>.vv...vv.v..>>vv.>..v.v>.>v..>>.>..>>...v..v.>>>.v>>...v.>v.v>>v..>..v>>>v.v..>..v.>vvv..v>>...v..>...>...>>..v..vvv>.>.... +...vv.v.>.....>>>vv.....v.>..v..>v..>>v>..>.>.v>.v..>>v.vv>>v...vv..>vv.>.v..v>v....>>....v.>>v...>>.v.v>>v..v.v..v>>>>vv>>..>...>v.....v.> +>>.v..v.>.vv..v.>.v>.>.v>.v>>.>>v.>>..>..>.vvvv>>.v.>>..vv...>vv>.v.>...v>...>.v..>v>.v>v..>>>>.....v.>..v.vv.v.>....v.>.vvv.v>v>..>.>>v>.v +....>.v>>..v.vv...>.v...v>....>v>..v>.>>...>>..vvv.>.vv>>>>v.vv>..>..>vv.v>>..>.>>>>..vv>>.>.....>.v.v>...>.>>>..vv..v...>.>..>>v..v.....>> +>>>.v.v.>>.v..>v.v......>.v>..v>.>>..v>v...v...v>v>..v.>.v...>>v>.>..v...v>..>.>vv.>v.vvv>>.v>..........v.........>.v..>.>...v.....>..>..v. +>.>>>>vv.>>..>.v>...vv..vv>..v>.>>.vv>.>..v...v>...>>.....>v.vv...>>.v>>>.v...>.>v>v.vv.....>>.v>.v...v>>.....>..>>v..v>.v....>v...v.....>v +.v..>.v.v..>.v..v..v.>..v.v>v.v>>vv>vv...>..v.v.....>>..v.v>.v>>.>vv....>>>.>>vv>......v>>..v..>.>v>.>>>....v>vv..>.....>>vv.v..>..v...vv.v +..v.>.>.>v>.v>.>...>..vv..vvv....v.vv..v....>.>.v.v...>....>v>v....v.v..v>vv...v>>v.v....v.v.>..vv..vv.v>>>..v....>>.v>.>.>v...v.v>>>>.v... +v.v..>>.>vv.v>......>v>.>..v>.v.>...>......vv..vvv.v..>...v..v>.>.v>v...v..>....>.>.v.v..vv.>v.>v>.vv>v...v>.vv..v..v...>>.v.v....>>..>>vv. +.vv...vvvv.>.v...v.>.v.>v......>vvv>>v..v>vv.>>.v>v.vv..>.>..>......v>...v.>>>>>.vvv.>>v...>>>v..v.v>>v>...>.....>vv..v.>v>......>>>v...vv> +....>>...v>...>v>>>>v>>>.....>....>.>.>..>>..vv...vv...v.>vv.>>>...>>.>..v>>vv.v.>..vv..>.>v..v.>.v>..>.vv.>v>v>.>...v..v.v...v>.>v...v>>>. +.v.v.v.v>.......v.vv......v..v.vv>>>...>..v.>.>..>......>v..>v>v>vv.>.v.v.>.v.>..v>.v.>>>v..>>..>.v..>...vv>.>>v>.....v..v.>.>.....vvv>..>. +v.....vv>vv>.>vvv..>>...>>v.>v.vv...>....vv.v>>>vv>.>>v.v>>vv.vvv>.>>..>vv>.v...v...v...>...>.>>vv>>v...vvvvvv>..v..>.v..>>>..>.vvv...>vv>v +>..>>>.vvv..vv>>...v.v>...>...vv...>>v.v.>v....v>.....>v.v.>...>v>vv>>.>>.>.>..>v>..v.>>v.v.v.>...>>vv.>>.>.>..v>.v.v....vv..v>.>...v>v.>.> +>v>...v..vv...>.>.v.>>...v>>>.>v.v.v.v.>...vvv.>.v....v....>....v>v>.>vv.>v...v>...v.......>.v.......>v..v...v>.>..v>..>..v>.v..>vv.>v>vv.. +vv.>>..v>>vv.v..v.vv>>>>>v>>......v..v...v>vv>>v.v..>.v>vv>v..v......>>>>v>v..>v>.v..v.>..v....vv..v...v>>>..>....>...v...>>>.vv>..>v....>> +..>.v.v.>>.vv...>v>>>v>>.v..>>.>>>.....>>.vv>v>>>>...v...v...v.>>..>>..>>v.>>>>v...>.>v..>.>.>..>.v.>..>v>v.v.vvv>....vvv.v..v.v...v.v>v... +>v.>>>.v.>v.v.>.>v>.v>.>>>vvv.>.v>..>vvv..v..>.>.vv>v.>..vv..v...v.>>v.v>..>.>vv.v.vvv.v...vv>v.vv..>v.v>..vv...>>.......v....>>...>vv..vv> +vv>.>v>.v.vv..>.>.>..>>vv>>v>......v>.v.v>.v.v.....>.>>..>v>v.>>.>..>v.v>v.v>...vv>v>...>>vv..>.>.>>.>>.v.v...vv....>v.v..v>v.>>..v>>..v.>. +.>v>.v.>>...v....>...v..>v>v.>...v.>.....v.>.>.>v......v>>.>v.>.v..>.>>...v..vv..>v..v.>..vv>>..>.>.v..vv.>.>.....>....>.vv.v...v.>v.>v..v> +>v>.>vv..>.>>v>..>v>v.>...>.v.vv>>.>.vvv..>...>....v>.>vv>>..>>>.v>>v>.v..>..v..v>...v.>v...>>..v>>..>.v.>>..v..vv..vv.....v.v..v..vvv....v +vv....>vvv.>.>>>....>.>v>.>vv..v>.>..>.>v>.vv.v.vv.>v>.>>.>>vv>>.....v....>>>vv>>....>vv.v..>.v.vv>..>v....>.>>>>..>.>..vvvv.v.......v...v. +>>..>.>.>vvvv>.>v>>v.v.>>>.v>..>.>.....v>.....vv.>...>>v.>v.>>...>>.>.vvvv>v.....v>v.v>>..v..>..>>.v.>.>...v>...vv>.>v>..vvv......v.>v....> +.vvv...vv.>.>.v..vv>>.>...v>.vv....vv.v..v>........>v.>>>...>.>.....v..>.v.>v.v..>..v..v>.>..>>>vv>..>.v...v>...vvv.v.v.>.v.vv..>>>v..v.>v. +>v.v>>>....vv>v..v..vv>.v.>.....vv.>..v..v>vvv.>>v.v.>.>.>v.>..v>v.v>.v.v...v..v.>.v.>v.>v>.v>v.........v..>v.>v>v.v.v.>..>.>....vvvvvv>.>. +...vv.>v.vv.>v>..v..v.>v>v..>.....>.>>.v.>>.>..>>.v.vv..>v.v>v..>v...v.vv.>.>.v>vv...vv.vv.v.vvv...>v>vvv......v...>>>>.>.v>..vv..>.v>>>..> +>.v...v....v.vv.....>>v..>....vv..vv....>..>>..>.>vvvvv>v..>.>>>>>..>v..v.>>>.v>....v..v>...>...vvvvv...>>.......>>vvvv.>v..v...>..>>>..... +.v.>v..>vv...v>......>vv..v.....v....>.vv.>vvvv.>v>v.>.>v..v......v.>>.>....v.>>v>>v.>v>>v....>.v>.v>...v>.v>v>.>..v>...>>>v>..>>>>>...v.v> +.>>.v>.>.>>>..v.v.v.v>>v..v>.>>v..v>v>>.>>......>v>..>.>vvv.>...>>...>.>>.>>..>>v.....v..>......>...v>vv..v>..v>.vvv.vvv....>.>..vv>>..v>v. +v.>.....v>>vv.v.v>>vvvv.>>vvv...>v>.v.v...>..>>v.>v>.>v>>>....>v..v..v>..>..vv>>.v.v.vv.v..v....v>.v.v.vv...v...>.>.>v....v.>>v..vv.>>.>... +>v>vv.>v...>.v..v.vvv>.>.>>vv>..>>>...>v.>v..vv>vv..v.>>v.>v>v.>..>...v..v>>>vv..>>v...>.v.>.v.>.v>.v.>.>v...v>>>v..vv..v>.v>.vvvv>v.>.v.>. +.>..v..>.vv.>vv.>v.>......>..v....v>.v>vv>...>vv....v...>v>.v..vv>>.......v>v.>v>>....v.>....vv.vv..>.>>v.v...>.>v.>.v.vv.>.>v...v..>>.v... +>.....vv...>v.>v>.>>.vv>>>..vvv.>vvv>..>v..v..v>v>>vvv>v>>..>>v..>..v.v.>v..>...v>.>v....v.v>>..v....v.vvvv...>....v.>..v.>v....v.>.>vv...> +>v..>>.v>>.vv>..>v.>..>>v>v..>..v...>>v.v.>v............>vv.v.vv..>>vv...>..>>.>...v.v>>..>>v..v>.vv..v.v>v..>.vv>>.>>>v>.v>>.>v.vv>..v.v.> +.v..vv....v..v.v.v.........v>>.>v...>v..v>.v.>..vv>...v...v.vv.v>v..>..vv.vv..>vv.v.>.v>vv.>..........>>vv...>v>.....vv..v.>.>v.v>...>....v +.>>.>...v.>v....>.....v>.>v.>.....v.>>..v...>.>v.>>.>>>.vv..>>.>v..v>.>>...>..>.vv.v....>.v..>vv.v...>>.v>.vvv.>.>v.vv..v.>.>>>>.>>...v>v.. +...vv>>>v..>..v>vv.>.>>v..v>vvv>..vv.>v>.v..vvvvv.....vv>>.v>v..>..>>.v.v...v...v...>v.v..vv.v.>v>.>v..>v.>.vvv..>.>.v..>.vv..>v>...>>v.>.. +v.vv.>>>..v>.vv>...v>....>v>..>v.>.....>vv..>>......>>.>.vv.v..>>..>.>.v.....vv..v.v.....>.v>v.>.>>.>.v>>>.v.>..v..vv..>.v...>..v.>.>>..v.v +..vv...v.>v>.........v>>v.....v..vv.>vv.>.>.>...>>.......>...vv.>vv>.....v.>>.>......>....>>.vv..>....vv.v.vv..v..v....>...v.......>v>..>.> +.>.v..v.....>.>>.v.>>...v.>.v>.v>..v....>>v>>v>.>..>.v.vv.v.>..v>>...vv.v.>>>...v.>>.v>vv.v.vv...>v.>>....v.v....vv>.v.v...>...>...>v.>v... +.v.vv>>v.v.vv>..>.>.>.v.v.>.....vv>>v>vvv.....>>>v.>.v..>>..>.vv>v..v.>vv.>v.>..v.>vv>v>...v>v>>.v.>.....>..v>.>..v>v..........vv......>.vv +.vv..>>>>..v.>.v.>..>.v>.....v.>>v.>.......vv>>v.v>..>>.>v>>>.....>..v......>..v>.vv.>.v.>v>.>.v....>v.>v.v.v..v.vv...v.vv>.v>.....>..v>..v +.v..v>v>>....v....vv>...vv..v>...v..>...>...>..>v..>>>.vv.v....v...>v.>.......v.v.>v....v..v>...........v..>v>>.>.>>v....v.>.v...v.>.v>..v. From f65d22ece507bdf5d49129f16f9273366bf7aca5 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 25 Dec 2021 16:55:30 +0100 Subject: [PATCH 272/479] 2021: d25: ex2: add solution --- 2021/d25/ex2/ex2.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 2021/d25/ex2/ex2.py diff --git a/2021/d25/ex2/ex2.py b/2021/d25/ex2/ex2.py new file mode 100755 index 0000000..918e0ec --- /dev/null +++ b/2021/d25/ex2/ex2.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python + + +def main() -> None: + print("There is no part two...") + + +if __name__ == "__main__": + main() From 4efa9d74e3290ae642b140acaf31b45e4f02553e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 1 Dec 2022 09:58:01 +0100 Subject: [PATCH 273/479] nix: fix 'pyright' --- flake.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/flake.nix b/flake.nix index 1de3f33..7796816 100644 --- a/flake.nix +++ b/flake.nix @@ -62,6 +62,7 @@ mypy z3 ])) + pyright ]; inherit (self.checks.${system}.pre-commit) shellHook; From c5861c0b22a8db21af812af2e66aaa9bd1d4af23 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 1 Dec 2022 10:01:42 +0100 Subject: [PATCH 274/479] nix: bump flake inputs --- 2019/d18/ex1/ex1.py | 4 +-- 2019/d18/ex2/ex2.py | 4 +-- flake.lock | 60 ++++++++++++++++++++++++++++++++++++++------- flake.nix | 1 + 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/2019/d18/ex1/ex1.py b/2019/d18/ex1/ex1.py index 1968be5..8599ea4 100755 --- a/2019/d18/ex1/ex1.py +++ b/2019/d18/ex1/ex1.py @@ -65,7 +65,7 @@ def build_graph(grid: RawGrid) -> Graph: def solve(G: Graph, start: str) -> int: - @lru_cache(2 ** 20) + @lru_cache(2**20) def reachable_keys(src: str, found: FrozenSet[str]) -> List[Tuple[str, int]]: queue = [] distance: DefaultDict[str, Union[float, int]] = defaultdict(lambda: inf) @@ -97,7 +97,7 @@ def solve(G: Graph, start: str) -> int: return reachable - @lru_cache(2 ** 20) + @lru_cache(2**20) def min_steps( src: str, keys_to_find: int, found: FrozenSet[str] = frozenset() ) -> int: diff --git a/2019/d18/ex2/ex2.py b/2019/d18/ex2/ex2.py index 4463618..9b890a5 100755 --- a/2019/d18/ex2/ex2.py +++ b/2019/d18/ex2/ex2.py @@ -65,7 +65,7 @@ def build_graph(grid: RawGrid) -> Graph: def solve(G: Graph, start: str) -> int: - @lru_cache(2 ** 20) + @lru_cache(2**20) def reachable_keys(src: str, found: FrozenSet[str]) -> GraphInfo: queue = [] distance: DefaultDict[str, Union[float, int]] = defaultdict(lambda: inf) @@ -97,7 +97,7 @@ def solve(G: Graph, start: str) -> int: return reachable - @lru_cache(2 ** 20) + @lru_cache(2**20) def min_steps( sources: str, keys_to_find: int, found: FrozenSet[str] = frozenset() ) -> Union[float, int]: diff --git a/flake.lock b/flake.lock index b743e83..7bc7877 100644 --- a/flake.lock +++ b/flake.lock @@ -1,12 +1,28 @@ { "nodes": { + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1668681692, + "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", + "owner": "edolstra", + "repo": "flake-compat", + "rev": "009399224d5e398d03b22badca40a37ac85412a1", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, "futils": { "locked": { - "lastModified": 1638122382, - "narHash": "sha256-sQzZzAbvKEqN9s0bzWuYmRaA03v40gaJ4+iL1LXjaeI=", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", "owner": "numtide", "repo": "flake-utils", - "rev": "74f7e4319258e287b0f9cb95426c9853b282730b", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { @@ -16,13 +32,34 @@ "type": "github" } }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1660459072, + "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1638286143, - "narHash": "sha256-A+rgjbIpz3uPRKHPXwdmouVcVn5pZqLnaZHymjkraG4=", + "lastModified": 1669542132, + "narHash": "sha256-DRlg++NJAwPh8io3ExBJdNW7Djs3plVI5jgYQ+iXAZQ=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "29d1f6e1f625d246dcf84a78ef97b4da3cafc6ea", + "rev": "a115bb9bd56831941be3776c8a94005867f316a7", "type": "github" }, "original": { @@ -34,19 +71,24 @@ }, "pre-commit-hooks": { "inputs": { + "flake-compat": "flake-compat", "flake-utils": [ "futils" ], + "gitignore": "gitignore", "nixpkgs": [ "nixpkgs" + ], + "nixpkgs-stable": [ + "nixpkgs" ] }, "locked": { - "lastModified": 1637745948, - "narHash": "sha256-DmQG1bZk24eS+BAHwnHPyYIadMLKbq0d1b//iapYIPU=", + "lastModified": 1669829516, + "narHash": "sha256-laWMD/TZzyrulu8xLNoSPertXOxjRD7BrcAVwKl+NyQ=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "c3b4f94350b0e59c2546fa85890cc70d03616b9c", + "rev": "471c7f1ecace25e39099206431300322632d25c4", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 7796816..d09ee81 100644 --- a/flake.nix +++ b/flake.nix @@ -24,6 +24,7 @@ inputs = { flake-utils.follows = "futils"; nixpkgs.follows = "nixpkgs"; + nixpkgs-stable.follows = "nixpkgs"; }; }; }; From a9e68c07d6e1e5a7ba336b01563dad7a5176af1c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 1 Dec 2022 10:02:37 +0100 Subject: [PATCH 275/479] nix: use 'nixpkgs-unstable' --- flake.lock | 8 ++++---- flake.nix | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 7bc7877..3b08152 100644 --- a/flake.lock +++ b/flake.lock @@ -55,16 +55,16 @@ }, "nixpkgs": { "locked": { - "lastModified": 1669542132, - "narHash": "sha256-DRlg++NJAwPh8io3ExBJdNW7Djs3plVI5jgYQ+iXAZQ=", + "lastModified": 1669809720, + "narHash": "sha256-RMT77f6CPOYtLLQ2esj+EJ1BPVWxf4RDidjrSvA5OhI=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "a115bb9bd56831941be3776c8a94005867f316a7", + "rev": "227de2b3bbec142f912c09d5e8a1b4e778aa54fb", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "nixpkgs-unstable", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index d09ee81..9960c28 100644 --- a/flake.nix +++ b/flake.nix @@ -13,7 +13,7 @@ type = "github"; owner = "NixOS"; repo = "nixpkgs"; - ref = "nixos-unstable"; + ref = "nixpkgs-unstable"; }; pre-commit-hooks = { From 99d677590f63e6d67954a4ad7b936a63097ba91f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 1 Dec 2022 09:55:51 +0100 Subject: [PATCH 276/479] 2022: d01: ex1: add input --- 2022/d01/ex1/input | 2244 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2244 insertions(+) create mode 100644 2022/d01/ex1/input diff --git a/2022/d01/ex1/input b/2022/d01/ex1/input new file mode 100644 index 0000000..ae1422a --- /dev/null +++ b/2022/d01/ex1/input @@ -0,0 +1,2244 @@ +10062 +15651 +1271 +14355 +7220 + +4878 +1754 +8466 +4741 +2582 +3003 +5327 +3172 +1327 +6310 + +22413 +4145 +22294 + +23108 +30453 + +2084 +3496 +4800 +1388 +8728 +6380 +6397 +2558 +2120 +6159 + +25265 +20200 +2083 + +7424 +5830 +2575 +2825 +2234 +6106 +5505 +2847 +2059 +7145 +7223 + +58621 + +2926 +9188 +7432 +1639 +7420 +1161 +5517 +2703 +5446 + +2457 +5814 +1294 +3280 +8531 +8214 +4736 +1964 +1155 +2380 + +2812 +1827 +5533 +1756 +1491 +4127 +6452 +5935 +1415 +6221 +3489 +2681 +4849 +5250 + +2922 +10365 +5819 +10227 +2962 +2702 + +2982 +9254 +14137 +5026 +9374 + +5933 +2888 +2250 +4514 +1825 +5616 +3497 +2988 +1181 +3836 +1032 +5847 +5383 + +5044 +5922 +3155 +1610 +5510 +5016 +6666 +7024 +4649 +2764 +6444 + +12932 + +4764 +4285 +1278 +5020 +5917 +1888 +4757 +6323 +5067 +1314 +1530 +5748 +5573 +5848 + +6078 +6687 +5510 +7642 +6719 +4376 +7733 +1356 +4064 +4159 + +7426 +1147 +4176 +2797 +9484 +7907 +10806 + +24981 +21675 +9324 + +5537 +5730 +1280 +2090 +2963 +5992 +6043 +5141 +3039 +2120 +3664 +3816 +3859 +5406 + +1315 +8662 +2280 +11800 +10201 +3886 + +3048 +4147 +3299 +3912 +1571 +4582 +1621 +2201 +4543 +5377 +3016 +5297 +5213 +1338 +3929 + +5456 +4051 +1621 +5228 +2672 +3277 +4006 +4954 +1487 +5361 +3298 +4335 +3015 +1139 + +2875 +6387 +2926 +5439 +3494 +5287 +3793 +3714 +4944 +1094 +6728 +3302 +6345 + +9641 +5967 +10265 +1129 +3759 +5632 +4913 +6151 + +5890 +4285 +3601 +3344 +7294 +6321 +2730 +6352 +2350 +7214 +4034 +1032 + +4266 +2086 +12754 +8475 +5044 +9616 + +27815 +19415 + +7914 +11106 +6938 +10695 +6902 +2983 +3710 + +7659 +3565 +1310 +11842 + +8750 +17624 +9697 +16020 + +4606 +6296 +2321 +1272 +3504 +7121 +2313 +8016 +7910 +4786 + +11012 +12831 +3980 +12204 + +7996 +7933 +1500 +1810 +4030 +8645 +1710 +7506 +8096 +8661 + +5694 +4145 +3095 +3963 +2396 +5197 +6086 +6793 +5924 +5043 +1241 +5011 + +2410 +7373 +6724 +2641 +1827 +8344 +6833 +8336 +6517 +1376 + +6084 +9909 +1760 +10864 +4904 +6734 +9492 + +8002 +4098 + +17545 +1504 +17040 +14118 + +1103 +5378 +6135 +6207 +3143 +5550 +5723 +5494 +2841 +1461 +2413 +2252 +1904 +3474 + +1788 +5889 +7810 +8520 +5415 +4633 +1422 +9526 +6762 + +1187 +2137 +6551 +8399 +1510 +7099 +3465 +5179 + +7056 +3142 +3237 +4910 +6656 +3680 +2619 +5549 +5737 +4493 +5359 +1336 + +4690 +6692 +4638 +5490 +6449 +1518 +5872 +7935 +7742 +1895 +4528 + +4929 +5947 +5044 +1627 +5037 +6646 +5949 +2142 +2362 +3050 +6390 +5467 +5496 + +11896 +13381 +1055 +3993 +4275 +12480 + +1903 +1527 +3280 +3748 +3315 +1058 +2541 +4245 +4386 +4792 +4937 +2345 +2551 +1901 + +2674 +9184 +3423 +1954 +2788 +5954 +7827 +4466 +4901 + +4653 +12104 +14737 +8740 +4164 + +5317 +5734 +4580 +3244 +5509 +4009 +2576 +4137 +1282 +5506 +3530 +3057 +5408 +5952 +1849 + +9691 +16403 +16828 + +3653 +6762 +2042 +4618 +4212 +6293 +4782 +2071 +6303 +1662 +6814 + +3720 +6801 +2350 +4456 +4623 +3242 +2471 +4104 +4096 +3641 +4022 +3702 +3169 + +7146 +5318 +1820 +3845 +4955 +4134 +8848 +6614 +5497 + +11545 +4050 +20095 + +8230 +11577 +6426 +4671 +11838 + +1726 +7355 +8115 +2780 + +1795 +4697 +10410 +8064 +2370 +9497 +1221 + +2909 +6719 +2733 +4335 +1327 +1672 +1297 +6705 +5209 +6690 +5855 +5432 +3804 + +7874 +7949 +6658 +1621 +8850 +3235 +9142 +2856 + +6968 +7042 + +7463 +8035 +4908 +5032 +4791 +2030 +1768 +8611 +2114 +8748 + +11054 +16021 +9826 +11604 +4819 + +11214 +4850 +11665 +1891 +1347 +4053 +4570 + +66862 + +1597 +6127 +6229 +11518 +9308 +9661 +11410 + +13224 +1160 +1978 +13018 +14604 + +2773 +3885 +2383 +2850 +1758 +5724 +4418 +4637 +1510 +3870 +3793 +4116 +6281 +2026 + +3714 +2840 +2116 +3505 +3941 +6676 +5696 +3216 +6406 +4660 +4974 +2005 +5293 + +2580 +1645 +5677 +5376 +6527 +4410 +6837 +3069 +2399 +3727 +5658 +4817 +5911 + +2126 +2851 +2766 +8660 +8181 +3449 +2765 +1299 + +18470 +9129 +17956 +14494 + +1033 +4468 +5938 +2874 +2406 +1175 +5997 + +1256 +7932 +1544 +2772 +5709 +1348 +2919 + +4399 +1449 +8295 +7470 +2088 +1958 +2857 +1722 +5204 + +8161 +6865 +6428 +4807 +2173 +8614 +5109 +1769 +2125 + +1112 +7417 +1328 +6385 +4670 +2840 +3293 +6438 +6639 +6129 +4144 + +5554 +15529 +1499 + +9459 +3175 +7412 +10610 +10283 +6807 +10056 +8657 + +5195 +1397 +5365 +3713 +4376 +4034 +2480 +2665 +2566 +4664 +5262 +5913 +2455 +6048 +4488 + +10875 + +5322 +8688 +2636 +14243 + +11403 +7465 +10079 +2270 +15254 + +11758 +7630 +5137 +6345 +7119 +10008 +6125 + +5184 + +4306 +1159 +6483 +5131 +5009 +4585 +2996 +3514 +4009 +4788 +6841 +2189 +3030 + +3132 +6730 +5733 +2747 +6464 +5221 +4567 +3528 +4264 +6006 +3295 + +4829 +23038 +16150 + +1519 +10692 +11102 +6321 +2948 +11851 +6301 + +5787 +2664 +6046 +4527 +1955 +5270 +1557 +4567 +5631 +2150 +4612 +3044 +2568 +3589 +5334 + +2303 +10849 +3983 +10010 +4854 +2111 + +4576 +1236 +3111 +4898 +5930 +5241 +2783 +5451 +6549 +5623 +7257 +2589 + +6031 +4307 +6669 +7866 +4333 +2069 +2778 +5463 +7149 +3091 +1001 + +8737 +1843 +4676 +4381 +6164 +2616 +2453 +1739 +4845 +2909 + +1396 +2963 +10672 +11217 +9975 +6511 +8694 + +5262 +3743 +1895 +3811 +6089 +4659 +4195 +4633 +1928 +3865 +2166 +4947 +5040 +4052 +5291 + +16754 +8916 +17259 +17813 + +9683 +13286 +13577 +9343 +1792 +3335 + +25505 +12891 +20104 + +8618 +6560 +4584 +1118 +3931 +1229 +6759 +8275 + +18418 +14090 +3552 +3156 + +4681 +2564 +4557 +4838 +2048 +3097 +4513 +5181 +3803 +1857 +3836 +3089 +4322 +4049 + +3768 +12991 +1680 +2378 + +2609 +5115 +2179 +6126 +1423 +1300 +6113 +3720 +1279 +4681 +1147 +1728 +2087 +4708 + +11919 +12306 +11697 +9806 +11749 +3995 + +5298 +1877 +2065 +10499 +3493 +2892 + +4172 +2913 +2288 +7358 +1065 +3030 +5316 +5023 +1876 +2610 +5309 +5175 + +6904 +9471 +1232 +1741 +2239 +8554 +6327 +6507 +7603 + +23962 +3536 + +3214 +1102 +3823 +1876 +3929 +4890 +5526 +3009 +2619 +1565 +3364 +1392 +2407 +3129 +3586 + +8438 +2649 +4887 +4306 +1675 +2870 +2014 +1160 +6542 +8475 + +10172 +1686 +5999 +9145 +10361 +7814 + +3049 +5192 +2091 +4788 +3460 +2701 +2441 +2485 +2440 +2256 +5054 +4631 +5652 +3636 +3827 + +5944 +7870 +2055 +9296 +7574 +8691 +8852 + +2178 +1658 +6451 +6725 +1093 +6265 +7412 +5641 +2348 +5377 +2680 + +6607 +13797 +10728 +6412 + +10824 +25891 +24424 + +2278 +3407 +1688 +6069 +2324 +1868 +6037 +2496 +3324 +5346 +4118 +3881 +5260 +2094 +2334 + +3330 +2884 +6186 +5513 +3483 +6790 +4571 +4173 +4569 +1909 +5574 + +2073 +2159 +1468 +6189 +2770 +5299 +2039 +4247 +6289 +5453 +3797 +1432 +5501 +2600 + +7484 +8409 +8216 +1966 +2720 +5125 +5532 +10092 + +3704 +4032 +13787 +14642 +6007 + +2893 +3724 +6947 +5569 +6284 +5015 +6589 +4359 +3846 +5402 +5771 +2995 + +3027 +2193 +4194 +6211 +4912 +4523 +3402 +4199 +4777 +5955 +3217 +6162 +1556 +5269 + +6162 +7433 +2853 +4649 +4505 +7220 +5276 +1873 +6655 +5549 +2992 + +3304 +3655 +2028 +4079 +5182 +6830 +3885 +2274 +2769 +2514 +2146 + +2616 +5717 +1758 +2847 +4579 +1853 +1556 +2043 +1293 +1566 +2327 +6678 +5738 + +17934 +19341 + +6652 +3289 +6927 +2152 +2094 +2458 +5635 +6927 +4626 +6846 +5324 +6085 +2571 + +4344 +6656 +3831 +4768 +12536 +13166 + +2696 +5427 +9429 +1393 +5758 +9578 +4958 + +6889 +3107 +1112 +3035 +4159 +3697 +4832 +2604 +6318 +2804 +4325 +5497 +4214 + +3588 +5313 +1330 +8568 +9017 +1794 +9578 +8426 +4836 + +31988 + +5561 +3355 +5593 +3448 +2235 +3836 +2375 +2690 +1704 +3729 +2626 +6329 +3297 +5067 + +4244 +1729 +1598 +1025 +5921 +3214 +2230 +4120 +1274 +1136 +5798 +4259 +2821 +1968 + +5291 +7790 +8452 +1235 +10438 +2069 +1365 +9288 + +5533 +4261 +6170 +1884 +5315 +2901 +3588 +2903 +2441 +2264 +3162 +4188 +3993 +1592 + +15202 +9385 +17135 +10731 + +4591 +2068 +1136 +4292 +4351 +2100 +6075 +4463 +5887 +4507 +1273 +3815 +3595 +4846 + +8033 +7540 +9200 +10554 +2572 +2148 +7195 +9335 + +6923 +4006 +5057 +1209 +5025 +4788 +2977 +3924 +1149 +5407 +3240 +4363 +2870 + +18428 +1484 +6717 + +21437 +10877 + +13896 +13142 +14976 +4279 +7760 + +3736 +3606 +6255 +1070 +4078 +1204 +4140 +5864 +5772 +3706 +4794 +1810 +3891 + +7568 +9015 +8576 +9630 +4006 +8770 +7403 +7606 +8039 + +3523 +5469 +4603 +7988 +6196 +6253 +7393 +7866 +1976 +8036 +1708 + +23475 + +58206 + +8598 +4206 +7981 +1145 +8057 +3214 +2519 +4155 +6886 +7736 + +10064 +5532 +4310 + +5605 +6163 +3079 +5633 +7550 +1557 +3957 +3829 +8064 +5976 + +14566 +2324 +11737 +8884 + +5741 +9973 +5120 +8385 +6468 +6446 + +12939 +7370 +11204 +3902 + +6531 +6059 +3199 +4544 +2988 +6196 +5805 +2947 +6562 +6497 +5311 +1092 +3929 + +2969 +5314 +5341 +7533 +1601 +9340 +1458 +4516 +1911 + +18278 +17057 +19676 +13319 + +1740 +1218 +7693 +7610 +1179 +2611 +2494 +1995 +2606 +3634 +4818 + +51246 + +7826 +5544 +5835 +5983 +5180 +7833 +8681 +7170 +1166 +7254 + +2013 +4870 +1732 +5678 +5275 +4257 +3686 +6372 +6335 +2539 +1566 +3028 +1304 +3809 + +4410 +6375 +5386 +7307 +2385 +6675 +1443 +5057 +4051 +5263 +4460 + +3437 +4993 +6230 +2211 +6522 +4888 +5539 +4875 +4449 +3257 +1333 +3603 + +1433 +4953 +4098 +10882 +8320 +11840 +10795 + +6925 +7292 +9340 +2198 +1406 +2490 +5490 +6380 +6512 + +4332 +2273 +3506 +6399 +3161 +2458 +4217 +2567 +4582 +2109 +4513 +5392 + +2597 +7554 +9150 +5701 +8972 +7443 +6788 +3224 + +6098 +7293 +6994 +8305 +7896 +2339 +3312 +7702 +3616 + +55975 + +2514 +10887 + +7264 +10835 +21533 + +6666 +1428 +6668 +7673 +2755 +3344 +5937 +6942 +7279 +7284 +3344 + +4809 + +4748 +7859 +5322 +3460 +3728 +2462 +7973 +1576 + +1207 +1949 +2608 +1448 +2317 +3410 +7804 +2404 +9159 + +38251 + +10983 +5513 +9496 +7341 +11958 +7265 + +10483 +7081 +5477 +12178 + +8421 +13928 +7231 +10781 +11620 + +7219 +2204 +5179 +5011 +4139 +2160 +6130 +1902 +5293 +8458 + +13895 +10711 +10857 +14214 + +9062 +4001 +8483 +4260 +9408 + +8856 +2473 +4738 +9554 +1238 +6186 +1747 +6853 +8308 + +6468 +5359 +8925 +7929 +9055 +6194 +4431 +4177 + +1452 +2594 +5079 +6108 +7286 +6997 +1052 +4952 +2458 +5843 +3390 + +59084 + +4350 +2892 +6057 +6449 +3274 +4882 +2824 +2625 +2761 +6381 +1803 +2641 +6303 +3518 + +4595 +15941 +14489 +12371 +13428 + +6748 +3113 +13130 +13855 +10202 + +4461 +4550 +3781 +5173 +2232 +3067 +3125 +3914 +5166 +4059 +1403 +1913 +2538 +5819 + +5492 +2956 +6397 +5485 +3908 +1764 +2853 +2690 +2751 +6816 +6510 +5134 +2251 + +1912 +11885 +9792 +9026 + +15319 +21333 +4765 + +1510 +1760 +1193 +5378 +5539 +1362 +3155 +6051 +3748 +5010 +4280 +1834 +5830 +1273 +2963 + +2625 +5173 +2499 +5779 +3165 +2148 +2098 +4888 +2787 +5898 +3977 +2740 +2160 +1791 +2522 + +20725 + +15813 +26702 + +1464 +3116 +7046 +5531 +13731 + +4178 +4204 +3722 +2109 +1772 +3920 +2560 +4029 +5846 +4360 +4538 +4889 +2312 +1086 +1093 + +1020 +3213 +1017 +3650 +4290 +2888 +4208 +2723 +4149 +2381 +3332 +1308 +2755 +4357 + +3010 +5317 +1507 +5472 +2171 +6005 +4331 +5355 +3211 +3797 +3963 +3738 +1899 +3390 +1455 + +2098 +6531 +3206 +4272 +7461 +5093 +5370 +5502 +1543 +4543 +5069 +3491 + +3195 +3617 +1509 +2926 +1668 +5901 +5893 +3950 +2428 +2572 +2390 +4899 +2234 +3937 +3111 + +6510 +1964 +6255 +1875 +5118 +3782 +3884 +5480 +2808 +4666 +2827 +3088 +3182 +3470 + +7230 +5126 +5584 +4880 +7753 +6132 +4098 +2893 +3148 +4209 +3646 + +2971 +2439 +2362 +6416 +5306 +2714 +4752 +6354 +4807 +3723 +4143 +6503 + +8492 +19004 +6323 + +5999 +7828 +7411 +4296 +8321 +5238 +5709 +5631 +6110 +1128 + +6126 +7809 +1458 +15754 +3603 + +8908 +8693 +8558 +3270 +5458 +12906 + +2463 +7423 +6250 +2029 +15528 + +5146 +6644 +1905 +6828 +2572 +4226 +6264 +4324 +3369 +5999 +5373 +5591 +6634 + +2053 +7877 +2218 +2415 +2090 +6433 +8607 +3502 +8313 +2841 + +5471 +5190 +4424 +5184 +3040 +5373 +4799 +8122 +1038 + +4988 +2833 +4461 +2976 +1168 +5195 +1043 +2270 +7339 +7435 +7226 +5779 + +11587 +6728 +6765 +11498 +4711 +3547 + +2878 +8426 +11717 +8591 +5481 +10803 +11181 + +4915 +2093 +6057 +6957 +13009 +12971 + +17979 +3250 +19984 + +5650 +5756 +3307 +10549 +6717 +9579 +2849 +6885 + +2609 +2347 +4692 +5000 +5068 +5148 +4337 +4316 +2654 +2221 +1822 + +13157 + +10140 +5075 +10446 +2946 +5902 +5856 +8096 +8762 + +16951 +9118 +17962 + +7524 +4389 +3716 +3580 +5930 +1197 +3233 +6070 +4612 +2477 +6792 + +6403 +11307 +10753 +9665 +4919 +6485 +3189 + +8790 +10424 +8816 +3840 +6236 +5529 +8946 +3864 + +1370 +4810 +3752 +1664 +1247 +3227 +4605 +4906 +5436 +4534 +4722 +4104 +5629 +4962 +3203 + +2120 +4830 +2859 +2828 +3020 +5260 +5795 +3286 +5247 +6126 +4156 +3624 +2730 + +58973 + +18871 +8511 + +13088 +1608 +12123 +5162 +9357 +2409 + +3194 +2605 +8440 +9642 +9067 +5709 +4431 +5553 + +10532 +36332 + +7227 +10011 +7519 +4030 +7444 +2693 +3845 + +10004 +5735 +9671 +3576 +7111 +1292 +10428 +2800 + +4229 +6072 +3748 +1466 +2305 +2664 +2612 +5054 +2625 +2778 +2712 +2788 +5133 + +10716 +11271 +11169 +9815 +1641 +1025 + +3016 +3916 +6618 +4213 +6968 +3525 +1944 +6525 +1920 +8741 + +19472 + +15684 +10706 +14780 +15411 +9358 + +5290 +8167 +5269 +7051 +2848 +3948 +5987 +4844 +7749 +5696 + +9032 +12663 +11173 +14750 + +1121 +2123 +6582 +5753 +6358 +2524 +6486 +2259 +2197 +1883 +3005 +2406 +5967 From 7054b000432d1b9f7f8d9e8a9a3d35ea8d5a5d6f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 1 Dec 2022 09:57:05 +0100 Subject: [PATCH 277/479] 2022: d01: ex1: add solution --- 2022/d01/ex1/ex1.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100755 2022/d01/ex1/ex1.py diff --git a/2022/d01/ex1/ex1.py b/2022/d01/ex1/ex1.py new file mode 100755 index 0000000..00c6305 --- /dev/null +++ b/2022/d01/ex1/ex1.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: list[list[int]]) -> int: + return max(map(sum, input), default=0) + + +def main() -> None: + input = [ + [int(line) for line in group.splitlines()] + for group in sys.stdin.read().split("\n\n") + if group + ] + print(solve(input)) + + +if __name__ == "__main__": + main() From 80ee0fddb5866b1907e5a36f71ee9e70b6455ce0 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 1 Dec 2022 09:57:19 +0100 Subject: [PATCH 278/479] 2022: d01: ex2: add input --- 2022/d01/ex2/input | 2244 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2244 insertions(+) create mode 100644 2022/d01/ex2/input diff --git a/2022/d01/ex2/input b/2022/d01/ex2/input new file mode 100644 index 0000000..ae1422a --- /dev/null +++ b/2022/d01/ex2/input @@ -0,0 +1,2244 @@ +10062 +15651 +1271 +14355 +7220 + +4878 +1754 +8466 +4741 +2582 +3003 +5327 +3172 +1327 +6310 + +22413 +4145 +22294 + +23108 +30453 + +2084 +3496 +4800 +1388 +8728 +6380 +6397 +2558 +2120 +6159 + +25265 +20200 +2083 + +7424 +5830 +2575 +2825 +2234 +6106 +5505 +2847 +2059 +7145 +7223 + +58621 + +2926 +9188 +7432 +1639 +7420 +1161 +5517 +2703 +5446 + +2457 +5814 +1294 +3280 +8531 +8214 +4736 +1964 +1155 +2380 + +2812 +1827 +5533 +1756 +1491 +4127 +6452 +5935 +1415 +6221 +3489 +2681 +4849 +5250 + +2922 +10365 +5819 +10227 +2962 +2702 + +2982 +9254 +14137 +5026 +9374 + +5933 +2888 +2250 +4514 +1825 +5616 +3497 +2988 +1181 +3836 +1032 +5847 +5383 + +5044 +5922 +3155 +1610 +5510 +5016 +6666 +7024 +4649 +2764 +6444 + +12932 + +4764 +4285 +1278 +5020 +5917 +1888 +4757 +6323 +5067 +1314 +1530 +5748 +5573 +5848 + +6078 +6687 +5510 +7642 +6719 +4376 +7733 +1356 +4064 +4159 + +7426 +1147 +4176 +2797 +9484 +7907 +10806 + +24981 +21675 +9324 + +5537 +5730 +1280 +2090 +2963 +5992 +6043 +5141 +3039 +2120 +3664 +3816 +3859 +5406 + +1315 +8662 +2280 +11800 +10201 +3886 + +3048 +4147 +3299 +3912 +1571 +4582 +1621 +2201 +4543 +5377 +3016 +5297 +5213 +1338 +3929 + +5456 +4051 +1621 +5228 +2672 +3277 +4006 +4954 +1487 +5361 +3298 +4335 +3015 +1139 + +2875 +6387 +2926 +5439 +3494 +5287 +3793 +3714 +4944 +1094 +6728 +3302 +6345 + +9641 +5967 +10265 +1129 +3759 +5632 +4913 +6151 + +5890 +4285 +3601 +3344 +7294 +6321 +2730 +6352 +2350 +7214 +4034 +1032 + +4266 +2086 +12754 +8475 +5044 +9616 + +27815 +19415 + +7914 +11106 +6938 +10695 +6902 +2983 +3710 + +7659 +3565 +1310 +11842 + +8750 +17624 +9697 +16020 + +4606 +6296 +2321 +1272 +3504 +7121 +2313 +8016 +7910 +4786 + +11012 +12831 +3980 +12204 + +7996 +7933 +1500 +1810 +4030 +8645 +1710 +7506 +8096 +8661 + +5694 +4145 +3095 +3963 +2396 +5197 +6086 +6793 +5924 +5043 +1241 +5011 + +2410 +7373 +6724 +2641 +1827 +8344 +6833 +8336 +6517 +1376 + +6084 +9909 +1760 +10864 +4904 +6734 +9492 + +8002 +4098 + +17545 +1504 +17040 +14118 + +1103 +5378 +6135 +6207 +3143 +5550 +5723 +5494 +2841 +1461 +2413 +2252 +1904 +3474 + +1788 +5889 +7810 +8520 +5415 +4633 +1422 +9526 +6762 + +1187 +2137 +6551 +8399 +1510 +7099 +3465 +5179 + +7056 +3142 +3237 +4910 +6656 +3680 +2619 +5549 +5737 +4493 +5359 +1336 + +4690 +6692 +4638 +5490 +6449 +1518 +5872 +7935 +7742 +1895 +4528 + +4929 +5947 +5044 +1627 +5037 +6646 +5949 +2142 +2362 +3050 +6390 +5467 +5496 + +11896 +13381 +1055 +3993 +4275 +12480 + +1903 +1527 +3280 +3748 +3315 +1058 +2541 +4245 +4386 +4792 +4937 +2345 +2551 +1901 + +2674 +9184 +3423 +1954 +2788 +5954 +7827 +4466 +4901 + +4653 +12104 +14737 +8740 +4164 + +5317 +5734 +4580 +3244 +5509 +4009 +2576 +4137 +1282 +5506 +3530 +3057 +5408 +5952 +1849 + +9691 +16403 +16828 + +3653 +6762 +2042 +4618 +4212 +6293 +4782 +2071 +6303 +1662 +6814 + +3720 +6801 +2350 +4456 +4623 +3242 +2471 +4104 +4096 +3641 +4022 +3702 +3169 + +7146 +5318 +1820 +3845 +4955 +4134 +8848 +6614 +5497 + +11545 +4050 +20095 + +8230 +11577 +6426 +4671 +11838 + +1726 +7355 +8115 +2780 + +1795 +4697 +10410 +8064 +2370 +9497 +1221 + +2909 +6719 +2733 +4335 +1327 +1672 +1297 +6705 +5209 +6690 +5855 +5432 +3804 + +7874 +7949 +6658 +1621 +8850 +3235 +9142 +2856 + +6968 +7042 + +7463 +8035 +4908 +5032 +4791 +2030 +1768 +8611 +2114 +8748 + +11054 +16021 +9826 +11604 +4819 + +11214 +4850 +11665 +1891 +1347 +4053 +4570 + +66862 + +1597 +6127 +6229 +11518 +9308 +9661 +11410 + +13224 +1160 +1978 +13018 +14604 + +2773 +3885 +2383 +2850 +1758 +5724 +4418 +4637 +1510 +3870 +3793 +4116 +6281 +2026 + +3714 +2840 +2116 +3505 +3941 +6676 +5696 +3216 +6406 +4660 +4974 +2005 +5293 + +2580 +1645 +5677 +5376 +6527 +4410 +6837 +3069 +2399 +3727 +5658 +4817 +5911 + +2126 +2851 +2766 +8660 +8181 +3449 +2765 +1299 + +18470 +9129 +17956 +14494 + +1033 +4468 +5938 +2874 +2406 +1175 +5997 + +1256 +7932 +1544 +2772 +5709 +1348 +2919 + +4399 +1449 +8295 +7470 +2088 +1958 +2857 +1722 +5204 + +8161 +6865 +6428 +4807 +2173 +8614 +5109 +1769 +2125 + +1112 +7417 +1328 +6385 +4670 +2840 +3293 +6438 +6639 +6129 +4144 + +5554 +15529 +1499 + +9459 +3175 +7412 +10610 +10283 +6807 +10056 +8657 + +5195 +1397 +5365 +3713 +4376 +4034 +2480 +2665 +2566 +4664 +5262 +5913 +2455 +6048 +4488 + +10875 + +5322 +8688 +2636 +14243 + +11403 +7465 +10079 +2270 +15254 + +11758 +7630 +5137 +6345 +7119 +10008 +6125 + +5184 + +4306 +1159 +6483 +5131 +5009 +4585 +2996 +3514 +4009 +4788 +6841 +2189 +3030 + +3132 +6730 +5733 +2747 +6464 +5221 +4567 +3528 +4264 +6006 +3295 + +4829 +23038 +16150 + +1519 +10692 +11102 +6321 +2948 +11851 +6301 + +5787 +2664 +6046 +4527 +1955 +5270 +1557 +4567 +5631 +2150 +4612 +3044 +2568 +3589 +5334 + +2303 +10849 +3983 +10010 +4854 +2111 + +4576 +1236 +3111 +4898 +5930 +5241 +2783 +5451 +6549 +5623 +7257 +2589 + +6031 +4307 +6669 +7866 +4333 +2069 +2778 +5463 +7149 +3091 +1001 + +8737 +1843 +4676 +4381 +6164 +2616 +2453 +1739 +4845 +2909 + +1396 +2963 +10672 +11217 +9975 +6511 +8694 + +5262 +3743 +1895 +3811 +6089 +4659 +4195 +4633 +1928 +3865 +2166 +4947 +5040 +4052 +5291 + +16754 +8916 +17259 +17813 + +9683 +13286 +13577 +9343 +1792 +3335 + +25505 +12891 +20104 + +8618 +6560 +4584 +1118 +3931 +1229 +6759 +8275 + +18418 +14090 +3552 +3156 + +4681 +2564 +4557 +4838 +2048 +3097 +4513 +5181 +3803 +1857 +3836 +3089 +4322 +4049 + +3768 +12991 +1680 +2378 + +2609 +5115 +2179 +6126 +1423 +1300 +6113 +3720 +1279 +4681 +1147 +1728 +2087 +4708 + +11919 +12306 +11697 +9806 +11749 +3995 + +5298 +1877 +2065 +10499 +3493 +2892 + +4172 +2913 +2288 +7358 +1065 +3030 +5316 +5023 +1876 +2610 +5309 +5175 + +6904 +9471 +1232 +1741 +2239 +8554 +6327 +6507 +7603 + +23962 +3536 + +3214 +1102 +3823 +1876 +3929 +4890 +5526 +3009 +2619 +1565 +3364 +1392 +2407 +3129 +3586 + +8438 +2649 +4887 +4306 +1675 +2870 +2014 +1160 +6542 +8475 + +10172 +1686 +5999 +9145 +10361 +7814 + +3049 +5192 +2091 +4788 +3460 +2701 +2441 +2485 +2440 +2256 +5054 +4631 +5652 +3636 +3827 + +5944 +7870 +2055 +9296 +7574 +8691 +8852 + +2178 +1658 +6451 +6725 +1093 +6265 +7412 +5641 +2348 +5377 +2680 + +6607 +13797 +10728 +6412 + +10824 +25891 +24424 + +2278 +3407 +1688 +6069 +2324 +1868 +6037 +2496 +3324 +5346 +4118 +3881 +5260 +2094 +2334 + +3330 +2884 +6186 +5513 +3483 +6790 +4571 +4173 +4569 +1909 +5574 + +2073 +2159 +1468 +6189 +2770 +5299 +2039 +4247 +6289 +5453 +3797 +1432 +5501 +2600 + +7484 +8409 +8216 +1966 +2720 +5125 +5532 +10092 + +3704 +4032 +13787 +14642 +6007 + +2893 +3724 +6947 +5569 +6284 +5015 +6589 +4359 +3846 +5402 +5771 +2995 + +3027 +2193 +4194 +6211 +4912 +4523 +3402 +4199 +4777 +5955 +3217 +6162 +1556 +5269 + +6162 +7433 +2853 +4649 +4505 +7220 +5276 +1873 +6655 +5549 +2992 + +3304 +3655 +2028 +4079 +5182 +6830 +3885 +2274 +2769 +2514 +2146 + +2616 +5717 +1758 +2847 +4579 +1853 +1556 +2043 +1293 +1566 +2327 +6678 +5738 + +17934 +19341 + +6652 +3289 +6927 +2152 +2094 +2458 +5635 +6927 +4626 +6846 +5324 +6085 +2571 + +4344 +6656 +3831 +4768 +12536 +13166 + +2696 +5427 +9429 +1393 +5758 +9578 +4958 + +6889 +3107 +1112 +3035 +4159 +3697 +4832 +2604 +6318 +2804 +4325 +5497 +4214 + +3588 +5313 +1330 +8568 +9017 +1794 +9578 +8426 +4836 + +31988 + +5561 +3355 +5593 +3448 +2235 +3836 +2375 +2690 +1704 +3729 +2626 +6329 +3297 +5067 + +4244 +1729 +1598 +1025 +5921 +3214 +2230 +4120 +1274 +1136 +5798 +4259 +2821 +1968 + +5291 +7790 +8452 +1235 +10438 +2069 +1365 +9288 + +5533 +4261 +6170 +1884 +5315 +2901 +3588 +2903 +2441 +2264 +3162 +4188 +3993 +1592 + +15202 +9385 +17135 +10731 + +4591 +2068 +1136 +4292 +4351 +2100 +6075 +4463 +5887 +4507 +1273 +3815 +3595 +4846 + +8033 +7540 +9200 +10554 +2572 +2148 +7195 +9335 + +6923 +4006 +5057 +1209 +5025 +4788 +2977 +3924 +1149 +5407 +3240 +4363 +2870 + +18428 +1484 +6717 + +21437 +10877 + +13896 +13142 +14976 +4279 +7760 + +3736 +3606 +6255 +1070 +4078 +1204 +4140 +5864 +5772 +3706 +4794 +1810 +3891 + +7568 +9015 +8576 +9630 +4006 +8770 +7403 +7606 +8039 + +3523 +5469 +4603 +7988 +6196 +6253 +7393 +7866 +1976 +8036 +1708 + +23475 + +58206 + +8598 +4206 +7981 +1145 +8057 +3214 +2519 +4155 +6886 +7736 + +10064 +5532 +4310 + +5605 +6163 +3079 +5633 +7550 +1557 +3957 +3829 +8064 +5976 + +14566 +2324 +11737 +8884 + +5741 +9973 +5120 +8385 +6468 +6446 + +12939 +7370 +11204 +3902 + +6531 +6059 +3199 +4544 +2988 +6196 +5805 +2947 +6562 +6497 +5311 +1092 +3929 + +2969 +5314 +5341 +7533 +1601 +9340 +1458 +4516 +1911 + +18278 +17057 +19676 +13319 + +1740 +1218 +7693 +7610 +1179 +2611 +2494 +1995 +2606 +3634 +4818 + +51246 + +7826 +5544 +5835 +5983 +5180 +7833 +8681 +7170 +1166 +7254 + +2013 +4870 +1732 +5678 +5275 +4257 +3686 +6372 +6335 +2539 +1566 +3028 +1304 +3809 + +4410 +6375 +5386 +7307 +2385 +6675 +1443 +5057 +4051 +5263 +4460 + +3437 +4993 +6230 +2211 +6522 +4888 +5539 +4875 +4449 +3257 +1333 +3603 + +1433 +4953 +4098 +10882 +8320 +11840 +10795 + +6925 +7292 +9340 +2198 +1406 +2490 +5490 +6380 +6512 + +4332 +2273 +3506 +6399 +3161 +2458 +4217 +2567 +4582 +2109 +4513 +5392 + +2597 +7554 +9150 +5701 +8972 +7443 +6788 +3224 + +6098 +7293 +6994 +8305 +7896 +2339 +3312 +7702 +3616 + +55975 + +2514 +10887 + +7264 +10835 +21533 + +6666 +1428 +6668 +7673 +2755 +3344 +5937 +6942 +7279 +7284 +3344 + +4809 + +4748 +7859 +5322 +3460 +3728 +2462 +7973 +1576 + +1207 +1949 +2608 +1448 +2317 +3410 +7804 +2404 +9159 + +38251 + +10983 +5513 +9496 +7341 +11958 +7265 + +10483 +7081 +5477 +12178 + +8421 +13928 +7231 +10781 +11620 + +7219 +2204 +5179 +5011 +4139 +2160 +6130 +1902 +5293 +8458 + +13895 +10711 +10857 +14214 + +9062 +4001 +8483 +4260 +9408 + +8856 +2473 +4738 +9554 +1238 +6186 +1747 +6853 +8308 + +6468 +5359 +8925 +7929 +9055 +6194 +4431 +4177 + +1452 +2594 +5079 +6108 +7286 +6997 +1052 +4952 +2458 +5843 +3390 + +59084 + +4350 +2892 +6057 +6449 +3274 +4882 +2824 +2625 +2761 +6381 +1803 +2641 +6303 +3518 + +4595 +15941 +14489 +12371 +13428 + +6748 +3113 +13130 +13855 +10202 + +4461 +4550 +3781 +5173 +2232 +3067 +3125 +3914 +5166 +4059 +1403 +1913 +2538 +5819 + +5492 +2956 +6397 +5485 +3908 +1764 +2853 +2690 +2751 +6816 +6510 +5134 +2251 + +1912 +11885 +9792 +9026 + +15319 +21333 +4765 + +1510 +1760 +1193 +5378 +5539 +1362 +3155 +6051 +3748 +5010 +4280 +1834 +5830 +1273 +2963 + +2625 +5173 +2499 +5779 +3165 +2148 +2098 +4888 +2787 +5898 +3977 +2740 +2160 +1791 +2522 + +20725 + +15813 +26702 + +1464 +3116 +7046 +5531 +13731 + +4178 +4204 +3722 +2109 +1772 +3920 +2560 +4029 +5846 +4360 +4538 +4889 +2312 +1086 +1093 + +1020 +3213 +1017 +3650 +4290 +2888 +4208 +2723 +4149 +2381 +3332 +1308 +2755 +4357 + +3010 +5317 +1507 +5472 +2171 +6005 +4331 +5355 +3211 +3797 +3963 +3738 +1899 +3390 +1455 + +2098 +6531 +3206 +4272 +7461 +5093 +5370 +5502 +1543 +4543 +5069 +3491 + +3195 +3617 +1509 +2926 +1668 +5901 +5893 +3950 +2428 +2572 +2390 +4899 +2234 +3937 +3111 + +6510 +1964 +6255 +1875 +5118 +3782 +3884 +5480 +2808 +4666 +2827 +3088 +3182 +3470 + +7230 +5126 +5584 +4880 +7753 +6132 +4098 +2893 +3148 +4209 +3646 + +2971 +2439 +2362 +6416 +5306 +2714 +4752 +6354 +4807 +3723 +4143 +6503 + +8492 +19004 +6323 + +5999 +7828 +7411 +4296 +8321 +5238 +5709 +5631 +6110 +1128 + +6126 +7809 +1458 +15754 +3603 + +8908 +8693 +8558 +3270 +5458 +12906 + +2463 +7423 +6250 +2029 +15528 + +5146 +6644 +1905 +6828 +2572 +4226 +6264 +4324 +3369 +5999 +5373 +5591 +6634 + +2053 +7877 +2218 +2415 +2090 +6433 +8607 +3502 +8313 +2841 + +5471 +5190 +4424 +5184 +3040 +5373 +4799 +8122 +1038 + +4988 +2833 +4461 +2976 +1168 +5195 +1043 +2270 +7339 +7435 +7226 +5779 + +11587 +6728 +6765 +11498 +4711 +3547 + +2878 +8426 +11717 +8591 +5481 +10803 +11181 + +4915 +2093 +6057 +6957 +13009 +12971 + +17979 +3250 +19984 + +5650 +5756 +3307 +10549 +6717 +9579 +2849 +6885 + +2609 +2347 +4692 +5000 +5068 +5148 +4337 +4316 +2654 +2221 +1822 + +13157 + +10140 +5075 +10446 +2946 +5902 +5856 +8096 +8762 + +16951 +9118 +17962 + +7524 +4389 +3716 +3580 +5930 +1197 +3233 +6070 +4612 +2477 +6792 + +6403 +11307 +10753 +9665 +4919 +6485 +3189 + +8790 +10424 +8816 +3840 +6236 +5529 +8946 +3864 + +1370 +4810 +3752 +1664 +1247 +3227 +4605 +4906 +5436 +4534 +4722 +4104 +5629 +4962 +3203 + +2120 +4830 +2859 +2828 +3020 +5260 +5795 +3286 +5247 +6126 +4156 +3624 +2730 + +58973 + +18871 +8511 + +13088 +1608 +12123 +5162 +9357 +2409 + +3194 +2605 +8440 +9642 +9067 +5709 +4431 +5553 + +10532 +36332 + +7227 +10011 +7519 +4030 +7444 +2693 +3845 + +10004 +5735 +9671 +3576 +7111 +1292 +10428 +2800 + +4229 +6072 +3748 +1466 +2305 +2664 +2612 +5054 +2625 +2778 +2712 +2788 +5133 + +10716 +11271 +11169 +9815 +1641 +1025 + +3016 +3916 +6618 +4213 +6968 +3525 +1944 +6525 +1920 +8741 + +19472 + +15684 +10706 +14780 +15411 +9358 + +5290 +8167 +5269 +7051 +2848 +3948 +5987 +4844 +7749 +5696 + +9032 +12663 +11173 +14750 + +1121 +2123 +6582 +5753 +6358 +2524 +6486 +2259 +2197 +1883 +3005 +2406 +5967 From 06fee9ad241ae097682c809ac40dd3b6a135aabd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 1 Dec 2022 09:57:27 +0100 Subject: [PATCH 279/479] 2022: d01: ex2: add solution --- 2022/d01/ex2/ex2.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100755 2022/d01/ex2/ex2.py diff --git a/2022/d01/ex2/ex2.py b/2022/d01/ex2/ex2.py new file mode 100755 index 0000000..64da90e --- /dev/null +++ b/2022/d01/ex2/ex2.py @@ -0,0 +1,21 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: list[list[int]]) -> int: + totals = sorted(map(lambda l: sum(l, start=0), input), reverse=True) + return sum(totals[:3]) + + +def main() -> None: + input = [ + [int(line) for line in group.splitlines()] + for group in sys.stdin.read().split("\n\n") + if group + ] + print(solve(input)) + + +if __name__ == "__main__": + main() From 0df109da5b3846cc4343ff50ac10290ce4fba240 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 2 Dec 2022 08:05:33 +0100 Subject: [PATCH 280/479] 2022: d02: ex1: add input --- 2022/d02/ex1/input | 2500 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2500 insertions(+) create mode 100644 2022/d02/ex1/input diff --git a/2022/d02/ex1/input b/2022/d02/ex1/input new file mode 100644 index 0000000..787ae71 --- /dev/null +++ b/2022/d02/ex1/input @@ -0,0 +1,2500 @@ +B Y +A Z +A Z +C Z +B Y +B Y +B X +B Z +C Z +B X +B Y +A Z +B Y +B Z +B Y +C Z +B Z +B Y +B Z +C Y +B Y +A Z +B Y +B Y +B Y +C Y +A Z +B Y +B X +A Z +B X +A Z +A Z +B Y +B Y +B X +A Z +B Y +B Z +C X +C X +B Y +B Y +B X +B X +C X +B X +A Z +B Y +B Y +C X +A Z +B Y +B Z +B X +B X +A Z +A X +B Y +B Y +B Z +C Z +B Z +B Z +B Z +A Z +A Z +B X +B X +B Y +B X +B X +C Z +C Z +A Z +A Y +A Z +B Z +A Z +B Y +C X +B X +C X +B Z +B Z +C Z +B Z +B X +C X +A Z +C X +B Z +A Y +C Z +B Y +C Y +B X +A X +B Y +B X +B X +B Z +B Y +A Z +B Z +B Y +B Y +A X +A Z +B X +B X +B X +B X +B Z +B Z +B Y +C X +A Z +A Z +B Y +B Z +B Y +A Z +B Z +A Z +A Z +C X +B Z +A Z +A Z +B Y +B Z +A Z +B Y +B Y +A Z +B Y +C X +B Z +B Y +B X +C X +B X +B X +B X +A Z +A Z +C Y +A Z +B Y +A Z +C X +B Z +B Z +C X +B Y +C X +B X +B X +C X +A Z +B Y +C X +B X +B Y +A Z +B Y +B Y +C X +B Y +C X +A Z +A Z +A Z +B Y +B Y +A X +A Z +A Z +B Y +C X +C Y +B Y +C X +A Z +B X +A Z +A Z +C X +B Y +A Z +B Y +C X +A Z +B X +B Y +A Z +B Y +B X +B X +C X +B Y +C Y +A Z +B Y +B Y +C Y +B Y +C Y +C X +A Y +A Y +B Z +B Y +A Z +B Z +B X +B X +B Y +A Z +B Y +B X +B Y +B Y +C Z +B Y +B Y +A Z +A Z +B Z +A Y +C X +B Y +B Y +B Z +B Z +B Y +C X +B Y +B X +B Z +B Y +B X +B Y +C Z +B Y +B X +A Z +B Z +B Z +A Z +C X +B Y +C Z +A Z +B Y +C Z +B Y +B X +B Y +B X +C Z +B Z +A Z +A Z +A Z +A X +B Z +B Y +B X +B Y +A Z +B Z +C Z +B X +B Z +B Z +A Z +B Y +B X +A Z +A Z +B Y +B X +A Z +A Z +C Z +A Z +C Z +B Y +B Y +B Z +C X +A Z +B X +B Y +B X +B Y +B Y +B X +B Z +B X +C Z +C X +C X +A Z +A Z +B X +B X +A Y +C X +B Y +A Y +B Z +B X +A Z +B X +B Y +B Y +B Y +B Y +A Z +A Z +B Y +B X +C Z +B Z +C X +B Z +B Y +C X +A Z +B Y +A Z +A Z +B Z +B Y +B X +A Z +B X +B Y +A Z +B Z +B X +B X +A Z +C Y +B X +A Z +B X +B Y +C X +B Y +C Z +C X +B Y +B Y +B Y +B X +B Y +B X +A Y +A Z +B Z +B Y +B X +B Z +B Y +C Z +B Y +A Z +B X +A Z +C X +A X +B Z +B Z +C X +A Z +B X +A Z +A Z +B Z +A Z +B Y +B Z +C Z +A Y +A Z +A Z +A Z +C X +B Z +B Z +B Y +B X +B Y +B Y +B Y +B Z +B Y +B Y +A Z +B Z +A Z +C X +B Y +B X +B Y +B X +B Y +B Y +C X +B Y +B Y +B Z +B Y +C X +B Y +B X +B Y +C X +A X +A Z +C Z +B Y +C Z +B X +C Z +C X +C Z +B Y +B Y +C X +C X +B Y +C X +A Y +B Y +B X +B X +B Z +B Y +C Y +C X +B X +B Y +B Z +B X +B Z +B Z +C X +B X +B Y +B Z +B X +C Z +A Y +B Y +B Y +B Y +A Y +C Y +B Y +B Z +B Z +B Y +B Y +B Z +B X +B X +B Y +A Z +C Y +C Z +B Y +B X +B Y +B Y +C X +B Y +C X +A Z +B X +C X +C Z +A Z +A Z +B Y +C X +A Z +A Z +B Y +A Y +B Y +A Z +A Z +B X +C X +A Z +B X +B Z +A Z +A Z +B X +B Y +B X +B Z +B Y +B Y +B Z +C X +C X +B Y +A Z +B X +B X +B Y +B Z +B Y +B X +B Z +B X +B Y +C X +B Y +B Y +C Y +A Z +B Y +B X +B Y +A Z +C X +A Z +A X +B Z +B X +A Z +B Y +B X +B X +A Z +B Y +A Z +B Z +B Y +A Z +B Y +B Y +A Z +B Z +C Z +B Y +B Y +C Y +A Z +B Y +B Y +B Y +B Y +B Z +B Y +B Y +B Y +C X +B Z +B X +A Z +B Z +C X +B Y +B Y +A Z +B Y +B X +A Z +A Z +C Z +B X +B X +B Y +B Z +B Z +B Z +B Y +B Y +B Y +B Y +B Z +B Y +A Z +A Y +A Z +B Y +B Y +A Z +B X +B Y +A Z +C Z +B Z +B Z +B Y +A Z +A Z +B Y +B X +B Z +B X +B Y +B Y +B X +C X +B Z +B X +A Z +B Y +C Z +B X +A Z +C Z +C Z +A Z +B Y +B Y +A Y +B Y +C Z +B X +C X +B Y +B X +B Z +B Y +B Z +B Y +B Y +A Z +B X +B X +A Y +B Z +B X +B Z +A Y +B Z +C X +B X +B X +B Z +B X +C Y +B Y +C X +C X +B Z +B X +C Z +B Z +A Z +C Y +B Y +B Y +B X +B Z +B Y +B Y +B X +C X +B Y +B Y +C Y +B Z +C X +A Z +B X +B X +B Z +B X +B Y +A Z +B Z +B X +A Z +B Y +C X +A Y +A Z +C X +B X +B Z +B X +C X +A Z +B X +B Y +B Y +A Z +B Z +C X +A Z +B Z +C X +B X +A Z +C X +C Z +B Y +B Z +B Y +B X +C Z +B Z +B Z +B Y +A Z +C Z +A Y +B Y +C X +B Y +B Z +A Z +B Z +A Z +B X +C X +B Y +A Z +B Y +B X +C Z +B Z +C X +B Y +B X +C Y +B Y +C X +B Y +B Y +B Y +B Z +B Y +B X +B Y +B Y +A Z +A Z +C X +B Z +B Y +A Z +B X +C X +B Y +B X +A Z +C Z +A Z +B Z +B Y +B X +B Z +B Y +A Z +C X +C Z +A Y +A Z +C X +C Y +C Z +B Y +B X +B Z +B Y +B X +B Y +A Z +B Y +C X +B X +B Y +C Z +B Y +B Y +B Y +B X +B Y +C Z +B X +B Y +B Y +B Z +B X +B X +B Z +B Z +A Z +A Z +C X +B Y +B Y +C X +B Y +B X +A Y +C Z +B Y +B Z +B Y +B Y +A Z +B Y +B Z +B Y +B Z +B X +B Z +B Y +A Z +B X +B Z +B Y +B Y +B Z +B Y +A Z +B X +B Y +B Z +B X +B Y +B X +B X +B Y +B X +C Y +B Z +B Y +B Z +C Y +A Z +B Y +A Z +B X +A Z +A Z +C Z +B X +C Y +A Z +B Z +B Z +B X +B Z +B Y +A Z +B Z +C Z +A Z +C Y +A Z +B Y +A Z +B Y +A Z +B X +A Z +B Z +C X +B Y +B Y +B Y +C X +B Z +C X +A Z +A Z +C X +B Y +B Z +B X +B Y +B X +A Z +B Y +B Y +A Z +B Y +B Z +B Z +B X +B Z +B Y +B X +B Y +B Y +C X +C Z +B Y +B Y +B Y +B Z +B Y +B Y +B Y +A Z +B Y +B X +B Y +B X +B Z +B Y +B X +B X +A Y +B Y +B X +B Y +B Y +B Y +B Z +B X +A Z +B Y +B Y +B Y +A Z +B X +B X +C Z +B Y +B Y +A Z +B Y +B Z +B X +C X +B Y +B Y +C X +C Z +B X +A Z +B Y +B Y +B X +B X +B X +B Y +B Y +A Z +A Z +B Y +B Y +A Z +B Z +A Z +C X +C X +B Y +B Y +A Z +A Z +C Z +B Z +B X +A Z +B X +B Y +B Y +B X +B Y +B Y +C Z +B Y +B X +C Z +C Z +B X +B Y +B Y +B Z +A Z +B Y +B Y +B Y +B X +B X +A Z +A Z +B X +B Y +B Z +B Y +B Z +B Y +B Z +C X +B Y +C X +B Y +B Y +C Y +A Z +B X +C Z +B Y +B Z +B Y +B Y +B Y +C X +B X +B Y +A Z +C Y +B Y +A Z +B Y +B Z +B Z +B Y +B Y +B Y +C X +B Y +A Y +C Y +B X +B X +B X +B X +B Z +B X +B Z +B Y +B Y +A Z +B X +B X +A Z +A Y +B Y +B Z +B Y +C X +B Y +B X +B Z +C X +B Z +B Y +B X +B X +A Z +B Y +B Y +B Y +C X +A X +B X +C X +B X +C X +B X +A X +B Y +B Y +B Y +B Y +B Z +C Y +C X +A Z +B Z +B Z +B Y +B Z +B Y +B Y +B X +B Z +A Z +A Z +B Z +B X +B Z +A Z +B Y +B Y +B Y +B Z +A Y +B X +B Z +B Y +B Y +B Y +B Y +C X +B Z +C X +A Z +A Z +B Z +A Y +C X +B X +B X +C X +A Z +A Z +A Z +B Y +B Z +A X +A X +B Y +C X +A Z +B Z +A Z +B Y +B Y +B X +B X +B Y +C X +B Z +B Y +B X +B X +B Y +B Z +B Y +B Y +B X +B X +B X +B Y +C X +B Y +B Y +B X +B Y +B Y +B X +B X +A Z +C X +B X +A Z +B Y +B Y +B Z +B Y +B X +A Z +C Y +B X +B Z +B Y +C X +A Z +B X +A Z +A Z +B Y +B Z +B Y +A Z +B Y +B Z +A Z +C Z +B Y +B Y +B X +B Z +B Y +B X +B X +B Y +B Z +B X +B Y +C Z +A X +B Y +C X +A X +B X +B X +B Z +A X +B X +B Y +B X +A Z +B Z +C Z +B X +B X +A Z +B X +B X +B Z +B Y +B Y +A Z +B Y +B Y +B X +B X +B X +B Y +A Y +C X +B X +A Z +B X +B Y +C Z +B Y +B Y +A Z +B Y +A Z +B Y +A Z +B Y +B Y +A Z +B X +B X +B Y +B Y +B Y +A Z +B Y +B Y +A Z +B X +A X +A Z +B Y +B X +B Z +B Z +B Y +B Y +C Y +B Y +B Y +B X +B Y +A Z +C X +B Z +B X +B Z +A Z +B Y +B Z +B X +A Z +A Z +C X +B X +A Y +C X +B Z +B Z +C Z +B Z +B Z +C Y +A Z +C Z +A Z +C Z +B Z +B Y +C X +B Y +B X +A Z +C Y +B X +B Y +B Y +B X +B Y +A Z +A Z +B Y +B Z +B Y +C X +B X +B Y +B X +A Z +C X +B Y +B Y +B Y +B Y +C Z +B Y +C Z +A X +C Z +B X +B Y +B Y +B X +B Y +C X +C X +A Z +B Y +B Y +C X +B Z +C Y +B Z +B Z +B Z +B X +B X +B X +B Z +B X +C X +B Y +C X +B X +C Z +B Y +B X +B Z +B Y +B Y +B Y +B Y +B Y +B X +B X +A Z +B Y +B X +B Y +B Y +A Y +B Y +B Y +A Z +A Z +C Z +B X +B Y +B Y +B Z +C Z +C X +A Z +C X +A X +B X +B Z +B Y +A Z +C Z +B Y +C Z +B X +A Z +B X +A Z +B Y +A Y +B Y +B Y +A Z +C X +B X +B Y +A Z +B Z +B Y +B X +B X +C Y +B X +A Z +B Z +A Z +C X +C Y +B Z +B Z +A Z +B X +B Y +B X +C X +B Y +B Y +B X +C X +B X +B Y +B X +B Y +B Z +B Y +B X +B X +A Z +B Y +B Y +C X +C Y +C X +A Z +A Z +B X +B X +B Z +A Z +A Z +C Z +B Z +A X +B X +B Y +B Y +A Z +B Y +B X +B X +B X +B Y +B X +B Y +B Y +B Y +B Y +B Y +B Y +B Z +A Z +B Y +B X +C X +A Y +B Y +B Y +B Z +C Z +B X +C X +B Z +B Y +B Y +B X +B X +B X +A Z +B X +A Y +B Y +B Y +C X +A Z +B Y +C X +B Y +B X +B X +B X +C Z +B X +A Z +B Y +B Y +B Y +A Z +A Z +B X +A Y +B Y +B Y +B Y +B X +B X +B Z +B X +B Z +B X +B Y +A Y +A Z +C Y +B Z +C X +B Z +B Y +B X +A Y +B Y +B X +B Y +B X +C Z +B X +C Z +B Y +B X +B Z +A Y +A Y +C Z +B X +B X +B Y +A Z +B Y +B Z +A Z +B X +B X +B X +B X +B X +B Z +A Z +A Z +C Y +C X +A Z +A Z +C X +B X +B X +B Z +B X +A Z +B Y +B X +B Y +C X +A Z +B Z +C X +B Y +B Y +A Z +B Y +B Y +B X +B Y +C Y +B X +B Z +B Y +A Z +B Z +A Y +B Y +A Z +B X +B Y +A Z +B Y +C Z +B Z +B Y +C X +C X +B X +B Z +B Y +B Z +B Z +B Z +B Z +A Z +B Y +B X +B Z +B Y +B X +A Z +A Z +A Z +B Y +C Y +C Z +B Z +B X +B Y +B Z +B Y +A Z +A Z +C Z +B X +B Y +B Z +B X +A Y +A Y +B Y +A Y +B Z +B Y +A Z +B Y +B Y +B Y +C Z +B X +B Z +B X +B Y +B Y +B Y +C X +B X +B Y +B Z +B X +B Y +B Y +B Y +B X +B X +B X +A Z +B Y +B Y +C X +C X +C X +C X +B Z +A Z +A Z +B Z +B Y +B X +A Z +C Z +B Y +B X +C Z +C X +B X +B Y +B Y +B X +B X +B Y +A Z +B X +B X +B X +B Y +A Y +B X +A Z +B Y +B Y +B Y +C Y +B Z +B X +B Z +C X +B Y +B Z +C X +B X +B X +B Y +B Y +B Y +A Z +A Z +A Z +B Y +B X +C Z +B Z +B Y +B Y +B Y +B Y +B Z +C X +A Z +C Z +B Z +B X +B X +A Z +B X +B Z +A Z +B Y +B Y +A Z +B Y +B Y +C Y +C Z +B X +A Z +B Z +B Y +C Z +C X +B X +A Z +B Y +B Z +B X +A Z +A Z +A Z +B Y +B X +C X +B Z +B Z +B X +B X +B Y +A Z +B X +B X +B Z +A Z +C X +B X +B Y +B Z +A Z +B Y +B Y +B Y +C X +B Z +A Y +A Z +B Z +C X +A Z +A Z +B Y +C X +B Y +B Z +C X +B Y +B Y +A Z +B Z +A Z +C Z +A Z +B X +B Z +A Z +B X +B Y +C Z +A Y +B Y +B Y +B Y +A Z +B Z +A Y +A Z +B Z +B Y +B Y +A Y +B Y +C X +B Z +B Z +A Z +B X +B X +A Z +B Z +C Y +A Z +A Z +B Y +B Z +B X +C Y +B Y +B Y +B Z +B Y +B Z +B X +B X +B Y +B Y +C X +C X +B X +B X +C X +A Z +B Y +C Z +A Z +B X +B Y +B Z +A Z +C Y +A Z +B Z +A Z +C X +C X +B X +B X +B Y +B Y +B Y +B Y +B Z +B X +B Z +C Y +B Y +A Z +B Y +B X +A Y +B Y +B Z +C X +B X +A Z +A Z +B Y +B Y +A Z +C X +B X +B Y +B Y +B Z +A Z +A Z +C Z +A Z +B Y +B Y +B Y +A Z +B Z +B Y +A Z +A Y +B Y +B Y +B Z +A X +A Z +B Z +B X +A Z +B Z +B Y +B Y +B X +A Y +C Y +B Y +B Y +B X +B Z +A Z +B X +B X +B Y +B Y +A Z +B X +C X +B X +B X +A Z +B Y +C X +A Z +B X +C Z +A Z +B Y +B Y +B X +B X +A Z +C Z +B X +B X +B Y +A Z +B Y +B Y +B X +B Y +B X +A Z +B Y +B Z +B X +A Z +B Y +C Z +C X +A Z +A Y +B X +B Z +B Y +B Y +B Y +B Z +B Z +A Y +C X +B X +C X +B Y +B Y +B Z +B Y +C Y +C X +B Z +C X +B Y +B X +B Y +B Y +A Z +B Y +A Z +A Z +A Z +A Z +B Y +A Z +B X +B X +B X +C Z +B Z +C Y +B Y +A Z +B Z +B Y +B Y +B Y +A Z +B Z +C Y +C X +B Y +B Y +B Y +B X +B Y +B Z +A Z +B Y +B Y +C Y +B Z +B X +B Y +B X +B Z +B Y +C Y +C Y +A Z +B X +B X +A Y +B Z +A Z +B Y +B X +B X +B Z +B X +A Z +B Y +C X +C X +B Z +A Z +B Y +B Y +B Y +B Y +B Y +B X +B Y +B Y +B Z +B Z +A X +A Z +A Z +A Z +A Y +C X +B Y +B Z +B X +A Z +B Y +B Y +B X +B Y +B Y +C Y +C Y +B X +A Z +B Y +C X +B Y +A Y +B X +B X +B Y +C X +A Z +B Y +B X +C X +C Z +B Y +B Y +B Y +A Z +B X +A Z +C Z +B Z +B Y +B Y +B X +B Y +B Y +B X +A Z +C X +C Z +B X +B Y +C Y +B X +A Z +B Y +A Z +B Y +A Y +A Z +A Z +B Y +B Y +B Z +C Z +C X +B Y +B Z +B Y +A Z +B Y +B Z +B Y +B X +B Y +B Z +B Y +B Z +C X +B Y +B Y +C Z +A Z +B Y +C X +B X +A Y +B Y +A Z +B Y +B X +B Y +B Y +B X +B X +B X +B Y +B Y +C Z +B Z +C X +C Z +B Y +C X +B X +A Z +B Y +C Z +A Y +B Y +B Y +B Y +C X +B X +B Y +B Y +B Z +C X +B X +B Z +A Z +B X +B Z +B X +A Z +B Y +B Z +C X +B X +C X +B X +B Y +B Z +B Z +B Z +A Z +B Y +B X +B Y +B Y +B X +B Z +B Y +C X +A Z +B Z +B X +A Z +B Y +B Y +B Y +A Z +A Z +C X +B X +A Y +B Y +B Y +B Y +A Z +A Z +A Z +C Y +B Z +A Y +B Y +B X +B X +B Y +C X +B Y +C Z +B Y +A X +B Y +B X +B Y +B X +C Z +B Y +B Z +B X +B Z +A Z +B Y +B X +B Y +A Z +B X +C Y +B X +B Y +B Y +B Y +C X +B Y +B Y +B Y +A Z +B Z +C X +A Z +B Y +C Y +B X +A Z +C Z +B X +B Y +B X +C Z +B X +B Z +C Y +B X +B Y +B X +B Z +B X +B Z +B Y +B Z +B X +A Z +B X +A X +B X +B Y +B Y +B Y +A Z +B Y +B Y +B Z +C X +B Y +B Y +B Y +B X +B X +B X +C Z +B Z +B X +A Z +B Y +B Z +B Y +B Y +B Y +B Y +C X +A Z +B Z +B Y +B Y +B Z +A Z +B Y +B Z +B Y +B Y +C Y +A Z +B Z +C X +B X +C Z +B X +B X +B Y +B Y +A X +B Y +C Z +A Z +B X +C Z +C Z +B X +A Z +B X +C Z +B Z +B Y +B Y +C X +A Z +B X +B Y +B X +B X +B X +B Y +C X +B Z +B Y +B Y +B Y +B X +A Z +A Z +B Y +B Z +B Y +A Z +B Y +B X +A Z +B Z +B Y +B X +B Y +A Y +B Y +B Y +B Y +B Z +B X +B Y +C Z +C X +B Y +C Y +B Z +A Z +A Z +B Y +B Y +A Z +B Z +B Y +B X +A Z +A Z +C X +A Z +C X +A Z +B Y +C X +B X +B X +B Y +A Y +B Y +B Z +B X +B Y +B Y +A Z +B X +B Y +A Z +A Y +A Z +C X +A Z +C X +A X +B Y +B Y +A Z +B X +B Z +B Y +B Y +B Z +B Y +B Y +B X +B Y +C X +C X +B Y +B Y +B X +C Z +C Z +C Z +C X +B Y +C Z +A Z +C Z +B Y +A Z +B Z +B X +A Y +B Y +B Y +B X +B Y +B Y +C X +B Y +A Z +B Y +A Z +C Z +A Z +B Y +B Z +A Z +B X +B X +B Z +B X +B Y +A Z +B Y +C X +A Z +C Z +B X +A Z +B Y +B Y +C Z +B Z +A Z +B Y +B X +B Y +B Z +C Z +A Y +A Z +B X +B X +A Z +C Y +B Y +A X +A Z +B X +B Y +B X +A Z +C X +B Y +B Y +C X +A X +B Y +A Z +A Z +B Y +B Z +B Y +B Y +B Y +B X +B Y +B X +B X +B X +B Y +A Z +C X +A Z +A Z +A X +A Z +B X +B Z +B Y +A Z From ed2497a67c4b941a2642193b42991637c660eed1 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 2 Dec 2022 08:05:39 +0100 Subject: [PATCH 281/479] 2022: d02: ex1: add solution --- 2022/d02/ex1/ex1.py | 61 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100755 2022/d02/ex1/ex1.py diff --git a/2022/d02/ex1/ex1.py b/2022/d02/ex1/ex1.py new file mode 100755 index 0000000..30900c8 --- /dev/null +++ b/2022/d02/ex1/ex1.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python + +import enum +import sys + + +class Outcome(enum.IntEnum): + Lose = 0 + Draw = 3 + Win = 6 + + +class Choice(enum.IntEnum): + Rock = 1 + Paper = 2 + Scissors = 3 + + @classmethod + def from_input(cls, input: str) -> "Choice": + match input: + case "A" | "X": + return cls.Rock + case "B" | "Y": + return cls.Paper + case "C" | "Z": + return cls.Scissors + assert False # Sanity check + + +def score(other: Choice, you: Choice) -> int: + def outcome() -> Outcome: + if other == you: + return Outcome.Draw + if other == other.Rock and you == other.Paper: + return Outcome.Win + if other == other.Paper and you == other.Scissors: + return Outcome.Win + if other == other.Scissors and you == other.Rock: + return Outcome.Win + return Outcome.Lose + + return you + outcome() + + +Round = tuple[Choice, Choice] + + +def solve(input: list[Round]) -> int: + return sum(map(lambda round: score(*round), input)) + + +def main() -> None: + input: list[Round] = [ + (Choice.from_input(round[0]), Choice.from_input(round[2])) + for round in sys.stdin.readlines() + ] + print(solve(input)) + + +if __name__ == "__main__": + main() From 439a4362d16e7b06a9a4f520bfa332e861d01c8d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 2 Dec 2022 08:05:47 +0100 Subject: [PATCH 282/479] 2022: d02: ex2: add input --- 2022/d02/ex2/input | 2500 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2500 insertions(+) create mode 100644 2022/d02/ex2/input diff --git a/2022/d02/ex2/input b/2022/d02/ex2/input new file mode 100644 index 0000000..787ae71 --- /dev/null +++ b/2022/d02/ex2/input @@ -0,0 +1,2500 @@ +B Y +A Z +A Z +C Z +B Y +B Y +B X +B Z +C Z +B X +B Y +A Z +B Y +B Z +B Y +C Z +B Z +B Y +B Z +C Y +B Y +A Z +B Y +B Y +B Y +C Y +A Z +B Y +B X +A Z +B X +A Z +A Z +B Y +B Y +B X +A Z +B Y +B Z +C X +C X +B Y +B Y +B X +B X +C X +B X +A Z +B Y +B Y +C X +A Z +B Y +B Z +B X +B X +A Z +A X +B Y +B Y +B Z +C Z +B Z +B Z +B Z +A Z +A Z +B X +B X +B Y +B X +B X +C Z +C Z +A Z +A Y +A Z +B Z +A Z +B Y +C X +B X +C X +B Z +B Z +C Z +B Z +B X +C X +A Z +C X +B Z +A Y +C Z +B Y +C Y +B X +A X +B Y +B X +B X +B Z +B Y +A Z +B Z +B Y +B Y +A X +A Z +B X +B X +B X +B X +B Z +B Z +B Y +C X +A Z +A Z +B Y +B Z +B Y +A Z +B Z +A Z +A Z +C X +B Z +A Z +A Z +B Y +B Z +A Z +B Y +B Y +A Z +B Y +C X +B Z +B Y +B X +C X +B X +B X +B X +A Z +A Z +C Y +A Z +B Y +A Z +C X +B Z +B Z +C X +B Y +C X +B X +B X +C X +A Z +B Y +C X +B X +B Y +A Z +B Y +B Y +C X +B Y +C X +A Z +A Z +A Z +B Y +B Y +A X +A Z +A Z +B Y +C X +C Y +B Y +C X +A Z +B X +A Z +A Z +C X +B Y +A Z +B Y +C X +A Z +B X +B Y +A Z +B Y +B X +B X +C X +B Y +C Y +A Z +B Y +B Y +C Y +B Y +C Y +C X +A Y +A Y +B Z +B Y +A Z +B Z +B X +B X +B Y +A Z +B Y +B X +B Y +B Y +C Z +B Y +B Y +A Z +A Z +B Z +A Y +C X +B Y +B Y +B Z +B Z +B Y +C X +B Y +B X +B Z +B Y +B X +B Y +C Z +B Y +B X +A Z +B Z +B Z +A Z +C X +B Y +C Z +A Z +B Y +C Z +B Y +B X +B Y +B X +C Z +B Z +A Z +A Z +A Z +A X +B Z +B Y +B X +B Y +A Z +B Z +C Z +B X +B Z +B Z +A Z +B Y +B X +A Z +A Z +B Y +B X +A Z +A Z +C Z +A Z +C Z +B Y +B Y +B Z +C X +A Z +B X +B Y +B X +B Y +B Y +B X +B Z +B X +C Z +C X +C X +A Z +A Z +B X +B X +A Y +C X +B Y +A Y +B Z +B X +A Z +B X +B Y +B Y +B Y +B Y +A Z +A Z +B Y +B X +C Z +B Z +C X +B Z +B Y +C X +A Z +B Y +A Z +A Z +B Z +B Y +B X +A Z +B X +B Y +A Z +B Z +B X +B X +A Z +C Y +B X +A Z +B X +B Y +C X +B Y +C Z +C X +B Y +B Y +B Y +B X +B Y +B X +A Y +A Z +B Z +B Y +B X +B Z +B Y +C Z +B Y +A Z +B X +A Z +C X +A X +B Z +B Z +C X +A Z +B X +A Z +A Z +B Z +A Z +B Y +B Z +C Z +A Y +A Z +A Z +A Z +C X +B Z +B Z +B Y +B X +B Y +B Y +B Y +B Z +B Y +B Y +A Z +B Z +A Z +C X +B Y +B X +B Y +B X +B Y +B Y +C X +B Y +B Y +B Z +B Y +C X +B Y +B X +B Y +C X +A X +A Z +C Z +B Y +C Z +B X +C Z +C X +C Z +B Y +B Y +C X +C X +B Y +C X +A Y +B Y +B X +B X +B Z +B Y +C Y +C X +B X +B Y +B Z +B X +B Z +B Z +C X +B X +B Y +B Z +B X +C Z +A Y +B Y +B Y +B Y +A Y +C Y +B Y +B Z +B Z +B Y +B Y +B Z +B X +B X +B Y +A Z +C Y +C Z +B Y +B X +B Y +B Y +C X +B Y +C X +A Z +B X +C X +C Z +A Z +A Z +B Y +C X +A Z +A Z +B Y +A Y +B Y +A Z +A Z +B X +C X +A Z +B X +B Z +A Z +A Z +B X +B Y +B X +B Z +B Y +B Y +B Z +C X +C X +B Y +A Z +B X +B X +B Y +B Z +B Y +B X +B Z +B X +B Y +C X +B Y +B Y +C Y +A Z +B Y +B X +B Y +A Z +C X +A Z +A X +B Z +B X +A Z +B Y +B X +B X +A Z +B Y +A Z +B Z +B Y +A Z +B Y +B Y +A Z +B Z +C Z +B Y +B Y +C Y +A Z +B Y +B Y +B Y +B Y +B Z +B Y +B Y +B Y +C X +B Z +B X +A Z +B Z +C X +B Y +B Y +A Z +B Y +B X +A Z +A Z +C Z +B X +B X +B Y +B Z +B Z +B Z +B Y +B Y +B Y +B Y +B Z +B Y +A Z +A Y +A Z +B Y +B Y +A Z +B X +B Y +A Z +C Z +B Z +B Z +B Y +A Z +A Z +B Y +B X +B Z +B X +B Y +B Y +B X +C X +B Z +B X +A Z +B Y +C Z +B X +A Z +C Z +C Z +A Z +B Y +B Y +A Y +B Y +C Z +B X +C X +B Y +B X +B Z +B Y +B Z +B Y +B Y +A Z +B X +B X +A Y +B Z +B X +B Z +A Y +B Z +C X +B X +B X +B Z +B X +C Y +B Y +C X +C X +B Z +B X +C Z +B Z +A Z +C Y +B Y +B Y +B X +B Z +B Y +B Y +B X +C X +B Y +B Y +C Y +B Z +C X +A Z +B X +B X +B Z +B X +B Y +A Z +B Z +B X +A Z +B Y +C X +A Y +A Z +C X +B X +B Z +B X +C X +A Z +B X +B Y +B Y +A Z +B Z +C X +A Z +B Z +C X +B X +A Z +C X +C Z +B Y +B Z +B Y +B X +C Z +B Z +B Z +B Y +A Z +C Z +A Y +B Y +C X +B Y +B Z +A Z +B Z +A Z +B X +C X +B Y +A Z +B Y +B X +C Z +B Z +C X +B Y +B X +C Y +B Y +C X +B Y +B Y +B Y +B Z +B Y +B X +B Y +B Y +A Z +A Z +C X +B Z +B Y +A Z +B X +C X +B Y +B X +A Z +C Z +A Z +B Z +B Y +B X +B Z +B Y +A Z +C X +C Z +A Y +A Z +C X +C Y +C Z +B Y +B X +B Z +B Y +B X +B Y +A Z +B Y +C X +B X +B Y +C Z +B Y +B Y +B Y +B X +B Y +C Z +B X +B Y +B Y +B Z +B X +B X +B Z +B Z +A Z +A Z +C X +B Y +B Y +C X +B Y +B X +A Y +C Z +B Y +B Z +B Y +B Y +A Z +B Y +B Z +B Y +B Z +B X +B Z +B Y +A Z +B X +B Z +B Y +B Y +B Z +B Y +A Z +B X +B Y +B Z +B X +B Y +B X +B X +B Y +B X +C Y +B Z +B Y +B Z +C Y +A Z +B Y +A Z +B X +A Z +A Z +C Z +B X +C Y +A Z +B Z +B Z +B X +B Z +B Y +A Z +B Z +C Z +A Z +C Y +A Z +B Y +A Z +B Y +A Z +B X +A Z +B Z +C X +B Y +B Y +B Y +C X +B Z +C X +A Z +A Z +C X +B Y +B Z +B X +B Y +B X +A Z +B Y +B Y +A Z +B Y +B Z +B Z +B X +B Z +B Y +B X +B Y +B Y +C X +C Z +B Y +B Y +B Y +B Z +B Y +B Y +B Y +A Z +B Y +B X +B Y +B X +B Z +B Y +B X +B X +A Y +B Y +B X +B Y +B Y +B Y +B Z +B X +A Z +B Y +B Y +B Y +A Z +B X +B X +C Z +B Y +B Y +A Z +B Y +B Z +B X +C X +B Y +B Y +C X +C Z +B X +A Z +B Y +B Y +B X +B X +B X +B Y +B Y +A Z +A Z +B Y +B Y +A Z +B Z +A Z +C X +C X +B Y +B Y +A Z +A Z +C Z +B Z +B X +A Z +B X +B Y +B Y +B X +B Y +B Y +C Z +B Y +B X +C Z +C Z +B X +B Y +B Y +B Z +A Z +B Y +B Y +B Y +B X +B X +A Z +A Z +B X +B Y +B Z +B Y +B Z +B Y +B Z +C X +B Y +C X +B Y +B Y +C Y +A Z +B X +C Z +B Y +B Z +B Y +B Y +B Y +C X +B X +B Y +A Z +C Y +B Y +A Z +B Y +B Z +B Z +B Y +B Y +B Y +C X +B Y +A Y +C Y +B X +B X +B X +B X +B Z +B X +B Z +B Y +B Y +A Z +B X +B X +A Z +A Y +B Y +B Z +B Y +C X +B Y +B X +B Z +C X +B Z +B Y +B X +B X +A Z +B Y +B Y +B Y +C X +A X +B X +C X +B X +C X +B X +A X +B Y +B Y +B Y +B Y +B Z +C Y +C X +A Z +B Z +B Z +B Y +B Z +B Y +B Y +B X +B Z +A Z +A Z +B Z +B X +B Z +A Z +B Y +B Y +B Y +B Z +A Y +B X +B Z +B Y +B Y +B Y +B Y +C X +B Z +C X +A Z +A Z +B Z +A Y +C X +B X +B X +C X +A Z +A Z +A Z +B Y +B Z +A X +A X +B Y +C X +A Z +B Z +A Z +B Y +B Y +B X +B X +B Y +C X +B Z +B Y +B X +B X +B Y +B Z +B Y +B Y +B X +B X +B X +B Y +C X +B Y +B Y +B X +B Y +B Y +B X +B X +A Z +C X +B X +A Z +B Y +B Y +B Z +B Y +B X +A Z +C Y +B X +B Z +B Y +C X +A Z +B X +A Z +A Z +B Y +B Z +B Y +A Z +B Y +B Z +A Z +C Z +B Y +B Y +B X +B Z +B Y +B X +B X +B Y +B Z +B X +B Y +C Z +A X +B Y +C X +A X +B X +B X +B Z +A X +B X +B Y +B X +A Z +B Z +C Z +B X +B X +A Z +B X +B X +B Z +B Y +B Y +A Z +B Y +B Y +B X +B X +B X +B Y +A Y +C X +B X +A Z +B X +B Y +C Z +B Y +B Y +A Z +B Y +A Z +B Y +A Z +B Y +B Y +A Z +B X +B X +B Y +B Y +B Y +A Z +B Y +B Y +A Z +B X +A X +A Z +B Y +B X +B Z +B Z +B Y +B Y +C Y +B Y +B Y +B X +B Y +A Z +C X +B Z +B X +B Z +A Z +B Y +B Z +B X +A Z +A Z +C X +B X +A Y +C X +B Z +B Z +C Z +B Z +B Z +C Y +A Z +C Z +A Z +C Z +B Z +B Y +C X +B Y +B X +A Z +C Y +B X +B Y +B Y +B X +B Y +A Z +A Z +B Y +B Z +B Y +C X +B X +B Y +B X +A Z +C X +B Y +B Y +B Y +B Y +C Z +B Y +C Z +A X +C Z +B X +B Y +B Y +B X +B Y +C X +C X +A Z +B Y +B Y +C X +B Z +C Y +B Z +B Z +B Z +B X +B X +B X +B Z +B X +C X +B Y +C X +B X +C Z +B Y +B X +B Z +B Y +B Y +B Y +B Y +B Y +B X +B X +A Z +B Y +B X +B Y +B Y +A Y +B Y +B Y +A Z +A Z +C Z +B X +B Y +B Y +B Z +C Z +C X +A Z +C X +A X +B X +B Z +B Y +A Z +C Z +B Y +C Z +B X +A Z +B X +A Z +B Y +A Y +B Y +B Y +A Z +C X +B X +B Y +A Z +B Z +B Y +B X +B X +C Y +B X +A Z +B Z +A Z +C X +C Y +B Z +B Z +A Z +B X +B Y +B X +C X +B Y +B Y +B X +C X +B X +B Y +B X +B Y +B Z +B Y +B X +B X +A Z +B Y +B Y +C X +C Y +C X +A Z +A Z +B X +B X +B Z +A Z +A Z +C Z +B Z +A X +B X +B Y +B Y +A Z +B Y +B X +B X +B X +B Y +B X +B Y +B Y +B Y +B Y +B Y +B Y +B Z +A Z +B Y +B X +C X +A Y +B Y +B Y +B Z +C Z +B X +C X +B Z +B Y +B Y +B X +B X +B X +A Z +B X +A Y +B Y +B Y +C X +A Z +B Y +C X +B Y +B X +B X +B X +C Z +B X +A Z +B Y +B Y +B Y +A Z +A Z +B X +A Y +B Y +B Y +B Y +B X +B X +B Z +B X +B Z +B X +B Y +A Y +A Z +C Y +B Z +C X +B Z +B Y +B X +A Y +B Y +B X +B Y +B X +C Z +B X +C Z +B Y +B X +B Z +A Y +A Y +C Z +B X +B X +B Y +A Z +B Y +B Z +A Z +B X +B X +B X +B X +B X +B Z +A Z +A Z +C Y +C X +A Z +A Z +C X +B X +B X +B Z +B X +A Z +B Y +B X +B Y +C X +A Z +B Z +C X +B Y +B Y +A Z +B Y +B Y +B X +B Y +C Y +B X +B Z +B Y +A Z +B Z +A Y +B Y +A Z +B X +B Y +A Z +B Y +C Z +B Z +B Y +C X +C X +B X +B Z +B Y +B Z +B Z +B Z +B Z +A Z +B Y +B X +B Z +B Y +B X +A Z +A Z +A Z +B Y +C Y +C Z +B Z +B X +B Y +B Z +B Y +A Z +A Z +C Z +B X +B Y +B Z +B X +A Y +A Y +B Y +A Y +B Z +B Y +A Z +B Y +B Y +B Y +C Z +B X +B Z +B X +B Y +B Y +B Y +C X +B X +B Y +B Z +B X +B Y +B Y +B Y +B X +B X +B X +A Z +B Y +B Y +C X +C X +C X +C X +B Z +A Z +A Z +B Z +B Y +B X +A Z +C Z +B Y +B X +C Z +C X +B X +B Y +B Y +B X +B X +B Y +A Z +B X +B X +B X +B Y +A Y +B X +A Z +B Y +B Y +B Y +C Y +B Z +B X +B Z +C X +B Y +B Z +C X +B X +B X +B Y +B Y +B Y +A Z +A Z +A Z +B Y +B X +C Z +B Z +B Y +B Y +B Y +B Y +B Z +C X +A Z +C Z +B Z +B X +B X +A Z +B X +B Z +A Z +B Y +B Y +A Z +B Y +B Y +C Y +C Z +B X +A Z +B Z +B Y +C Z +C X +B X +A Z +B Y +B Z +B X +A Z +A Z +A Z +B Y +B X +C X +B Z +B Z +B X +B X +B Y +A Z +B X +B X +B Z +A Z +C X +B X +B Y +B Z +A Z +B Y +B Y +B Y +C X +B Z +A Y +A Z +B Z +C X +A Z +A Z +B Y +C X +B Y +B Z +C X +B Y +B Y +A Z +B Z +A Z +C Z +A Z +B X +B Z +A Z +B X +B Y +C Z +A Y +B Y +B Y +B Y +A Z +B Z +A Y +A Z +B Z +B Y +B Y +A Y +B Y +C X +B Z +B Z +A Z +B X +B X +A Z +B Z +C Y +A Z +A Z +B Y +B Z +B X +C Y +B Y +B Y +B Z +B Y +B Z +B X +B X +B Y +B Y +C X +C X +B X +B X +C X +A Z +B Y +C Z +A Z +B X +B Y +B Z +A Z +C Y +A Z +B Z +A Z +C X +C X +B X +B X +B Y +B Y +B Y +B Y +B Z +B X +B Z +C Y +B Y +A Z +B Y +B X +A Y +B Y +B Z +C X +B X +A Z +A Z +B Y +B Y +A Z +C X +B X +B Y +B Y +B Z +A Z +A Z +C Z +A Z +B Y +B Y +B Y +A Z +B Z +B Y +A Z +A Y +B Y +B Y +B Z +A X +A Z +B Z +B X +A Z +B Z +B Y +B Y +B X +A Y +C Y +B Y +B Y +B X +B Z +A Z +B X +B X +B Y +B Y +A Z +B X +C X +B X +B X +A Z +B Y +C X +A Z +B X +C Z +A Z +B Y +B Y +B X +B X +A Z +C Z +B X +B X +B Y +A Z +B Y +B Y +B X +B Y +B X +A Z +B Y +B Z +B X +A Z +B Y +C Z +C X +A Z +A Y +B X +B Z +B Y +B Y +B Y +B Z +B Z +A Y +C X +B X +C X +B Y +B Y +B Z +B Y +C Y +C X +B Z +C X +B Y +B X +B Y +B Y +A Z +B Y +A Z +A Z +A Z +A Z +B Y +A Z +B X +B X +B X +C Z +B Z +C Y +B Y +A Z +B Z +B Y +B Y +B Y +A Z +B Z +C Y +C X +B Y +B Y +B Y +B X +B Y +B Z +A Z +B Y +B Y +C Y +B Z +B X +B Y +B X +B Z +B Y +C Y +C Y +A Z +B X +B X +A Y +B Z +A Z +B Y +B X +B X +B Z +B X +A Z +B Y +C X +C X +B Z +A Z +B Y +B Y +B Y +B Y +B Y +B X +B Y +B Y +B Z +B Z +A X +A Z +A Z +A Z +A Y +C X +B Y +B Z +B X +A Z +B Y +B Y +B X +B Y +B Y +C Y +C Y +B X +A Z +B Y +C X +B Y +A Y +B X +B X +B Y +C X +A Z +B Y +B X +C X +C Z +B Y +B Y +B Y +A Z +B X +A Z +C Z +B Z +B Y +B Y +B X +B Y +B Y +B X +A Z +C X +C Z +B X +B Y +C Y +B X +A Z +B Y +A Z +B Y +A Y +A Z +A Z +B Y +B Y +B Z +C Z +C X +B Y +B Z +B Y +A Z +B Y +B Z +B Y +B X +B Y +B Z +B Y +B Z +C X +B Y +B Y +C Z +A Z +B Y +C X +B X +A Y +B Y +A Z +B Y +B X +B Y +B Y +B X +B X +B X +B Y +B Y +C Z +B Z +C X +C Z +B Y +C X +B X +A Z +B Y +C Z +A Y +B Y +B Y +B Y +C X +B X +B Y +B Y +B Z +C X +B X +B Z +A Z +B X +B Z +B X +A Z +B Y +B Z +C X +B X +C X +B X +B Y +B Z +B Z +B Z +A Z +B Y +B X +B Y +B Y +B X +B Z +B Y +C X +A Z +B Z +B X +A Z +B Y +B Y +B Y +A Z +A Z +C X +B X +A Y +B Y +B Y +B Y +A Z +A Z +A Z +C Y +B Z +A Y +B Y +B X +B X +B Y +C X +B Y +C Z +B Y +A X +B Y +B X +B Y +B X +C Z +B Y +B Z +B X +B Z +A Z +B Y +B X +B Y +A Z +B X +C Y +B X +B Y +B Y +B Y +C X +B Y +B Y +B Y +A Z +B Z +C X +A Z +B Y +C Y +B X +A Z +C Z +B X +B Y +B X +C Z +B X +B Z +C Y +B X +B Y +B X +B Z +B X +B Z +B Y +B Z +B X +A Z +B X +A X +B X +B Y +B Y +B Y +A Z +B Y +B Y +B Z +C X +B Y +B Y +B Y +B X +B X +B X +C Z +B Z +B X +A Z +B Y +B Z +B Y +B Y +B Y +B Y +C X +A Z +B Z +B Y +B Y +B Z +A Z +B Y +B Z +B Y +B Y +C Y +A Z +B Z +C X +B X +C Z +B X +B X +B Y +B Y +A X +B Y +C Z +A Z +B X +C Z +C Z +B X +A Z +B X +C Z +B Z +B Y +B Y +C X +A Z +B X +B Y +B X +B X +B X +B Y +C X +B Z +B Y +B Y +B Y +B X +A Z +A Z +B Y +B Z +B Y +A Z +B Y +B X +A Z +B Z +B Y +B X +B Y +A Y +B Y +B Y +B Y +B Z +B X +B Y +C Z +C X +B Y +C Y +B Z +A Z +A Z +B Y +B Y +A Z +B Z +B Y +B X +A Z +A Z +C X +A Z +C X +A Z +B Y +C X +B X +B X +B Y +A Y +B Y +B Z +B X +B Y +B Y +A Z +B X +B Y +A Z +A Y +A Z +C X +A Z +C X +A X +B Y +B Y +A Z +B X +B Z +B Y +B Y +B Z +B Y +B Y +B X +B Y +C X +C X +B Y +B Y +B X +C Z +C Z +C Z +C X +B Y +C Z +A Z +C Z +B Y +A Z +B Z +B X +A Y +B Y +B Y +B X +B Y +B Y +C X +B Y +A Z +B Y +A Z +C Z +A Z +B Y +B Z +A Z +B X +B X +B Z +B X +B Y +A Z +B Y +C X +A Z +C Z +B X +A Z +B Y +B Y +C Z +B Z +A Z +B Y +B X +B Y +B Z +C Z +A Y +A Z +B X +B X +A Z +C Y +B Y +A X +A Z +B X +B Y +B X +A Z +C X +B Y +B Y +C X +A X +B Y +A Z +A Z +B Y +B Z +B Y +B Y +B Y +B X +B Y +B X +B X +B X +B Y +A Z +C X +A Z +A Z +A X +A Z +B X +B Z +B Y +A Z From b79109ed37912d892006445dcd318703ad775856 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 2 Dec 2022 08:06:13 +0100 Subject: [PATCH 283/479] 2022: d02: ex2: add solution --- 2022/d02/ex2/ex2.py | 71 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100755 2022/d02/ex2/ex2.py diff --git a/2022/d02/ex2/ex2.py b/2022/d02/ex2/ex2.py new file mode 100755 index 0000000..0b668f1 --- /dev/null +++ b/2022/d02/ex2/ex2.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python + +import enum +import sys + + +class Outcome(enum.IntEnum): + Lose = 0 + Draw = 3 + Win = 6 + + @classmethod + def from_input(cls, input: str) -> "Outcome": + match input: + case "X": + return cls.Lose + case "Y": + return cls.Draw + case "Z": + return cls.Win + assert False # Sanity check + + +class Choice(enum.IntEnum): + Rock = 1 + Paper = 2 + Scissors = 3 + + @classmethod + def from_input(cls, input: str) -> "Choice": + match input: + case "A": + return cls.Rock + case "B": + return cls.Paper + case "C": + return cls.Scissors + assert False # Sanity check + + +def score(other: Choice, outcome: Outcome) -> int: + def choice() -> Choice: + match outcome: + case Outcome.Lose: + delta = -1 + case Outcome.Draw: + delta = 0 + case Outcome.Win: + delta = 1 + return Choice((other + delta - 1) % 3 + 1) + + return outcome + choice() + + +Round = tuple[Choice, Outcome] + + +def solve(input: list[Round]) -> int: + return sum(map(lambda round: score(*round), input)) + + +def main() -> None: + input: list[Round] = [ + (Choice.from_input(round[0]), Outcome.from_input(round[2])) + for round in sys.stdin.readlines() + ] + print(solve(input)) + + +if __name__ == "__main__": + main() From 6c496ec591b5483e1e1ed20bec3e35fe2bf0a687 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 3 Dec 2022 07:48:26 +0100 Subject: [PATCH 284/479] 2022: d03: ex1: add input --- 2022/d03/ex1/input | 300 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 2022/d03/ex1/input diff --git a/2022/d03/ex1/input b/2022/d03/ex1/input new file mode 100644 index 0000000..f82eaf1 --- /dev/null +++ b/2022/d03/ex1/input @@ -0,0 +1,300 @@ +FzQrhQpJtJMFzlpplrTWjTnTTrjVsVvvTnTs +mScqSqqgcfPCqGPZcfGNSvTNsVVNSjNvWSNsNz +fPcPGqgCcHgFzQpJJtHtJH +DZDqqlrjplDHrNCmnBcHBMCRcJzb +RQFLStFvdcBbzdJbJM +PThQtwftTPFvtTPhvtFtfFtpZZllwjRNlsqNqqZjwpGlrZ +pPwtqgwJZPJLgQqSFlqhFFlqMd +DBmCWBBDWTRGvcVRTCCnnfQlFSdlzfhfdMWQfjhhQz +drmBVVCRgprPtrZp +HznjQjvmzDMVrQnMLJMMlfWgPSlJGWWJPl +BdcqqhcdBRpFhhZBthhctdJSJJWfgGFlJCSFgbWPCDJS +NdRTZdNqBwqtthpRBTTRqdtZrsLQVzrrzjzDwDsnmrQrnsrr +HZFZCFzZWszqsRTBZTNMhmthVTmhDppmMQVPpm +wjvSbJddvrvlrvnJSJJvlJmhPlhVPVtGVpQDBVMpphQP +frbrfrcvvnvjfwbcJgrrCBRsCFsNzRgRCHCqssRH +dDFNqNqZqPLNqvqTTvCLSPdZssGHClJQJcRHJGHHcHBcsMsQ +lrjmWgWWrhjgrppQHHMQrsQRJGcBJc +lVlmnwjmdTTSvVFN +FWNFHvQPmLGwwwSHtswwln +RfMJcDdfdcfdddfZjdchrtZmSmCZVtqVnZmrnrtC +JMmJcfjjphcghpgjhRGzGzBBGPFGNBvPTpFL +cVPVwStmmcQPBQPpSCppwhHZNNqHszNBhsNRNjqHzj +MfWdDgvdbnvgMTWgvgZfzmsZJHzNhqjqjRhJ +MDWMWGndMgFDnFLDwQrPPCSrCSVrlmGS +QLZmPdRdWmMsMDWZmsLWWrhMHcHGzHvGzFcvrvzNrc +tplSbLVBlvHHcFNnSr +VqfgwLlCJWmWQTfW +nRWvlvRbtLvdMCPFGL +wrfsJNNGhNzGrTgDMDLgPMLPfq +wcVhJQhwhrrBpmVblBRGSG +HHHcggrZLcQQcQll +GzfzTRTzmmFMwSNSwdSJQtNLNB +TGbmLMFTzVVVTMzmFMfFPMHPZhnjZCpHnhgnZnPWCPZZ +MRwwpVMHRspqVqwmccDlDrcHBBZgBl +jQfQQQjWWFBgmcgDfcZg +hvvSQzSnQQSWWQWSjTZVTRMshwVCssppwV +pvrTvCvtFppCHMMZcdDFdcZM +wLjTQnqljjSnlwjqjRgLcHHHMBDMZhBMHgHcbBDh +mqjqlSNqRqwSRrWCvzGmtfTfzs +TWScDCqCQQVBWDqWHsHswwBgRJzRhhHp +dPttGrvFfGjMjnjvshsJgsJLgghRgH +rFMlGdtjPffNnnrffSNcVCDqQqCQRqQRRN +GmBRbVpPbmJcwggBBgWW +LjsTCNNtddjHqLLgWwccqgfq +nsjNjntNtjHCsDwZmwZZVmmGSvSD +bwDDgNFtMMDbFsMbFwWWVcRcSpcgjgQWhWSp +lfTJJlvdfCffccWppRjRlcSc +RnzGdJJmsMNnMFtM +bsBTFsqqTTmFZTsQBWWznWCRshlJNJlCVh +GjGnDvDjvjPppHwwpwgrPPClJhNVRCzhhzJWlWlhNlvJ +ffdgLrgdLrDjdfHPbbZbttcBbcbLmntn +TNTwwvTTHNtTHNLLVqtqTSZBJnrnhhbrFJjZjnVZgghF +cplWfRlzcWfRCZZhFrGjBfjZjn +pddzDsRpDcclzCQMWBvNSmTTSqdvPPvqwqtT +DQTttwwLtQtVSDMJDRmmSS +ffsWfvrBWrPvwJhPhPSMPMVn +WsvsggFvwNLgHtNQ +llBbVDMTlFVdFDTbVggSVsqZqZZZqqvNJZJRNRWgtv +HhpjcHHvjPsqCsWcNcsq +GfpvnPvwFDTTFFDw +GMmFGMGFFgVwQHQwwM +cJtZNtZTbThcZtcZJJtTZWJPllgNgpPvVgpjHvQpRpHQNg +hWcJZcnhcJznbcBZLqSLDfCmHqnqCLsD +zQpjLpnhnsHTnlQLrMCCHPFrvvCMPcHm +ZfgdSBtNqBwlgSDfZDwtqSFvJCvrPrVvFmwCJFvrmmFV +dfbRNZBqDtgRNBNNNljLLjhGRGGWGLGTRhjz +hhrnfBzhtzZgDgDnBfrfDZsRpMNCNNWjwCCfGQGGNGCGQC +lcdPmHLSPDSdFDpQMLjCQQQCRGpN +lJSSbmPdVdVvdHbvSDFHHPlZqgBnttzgTsssTrqgbZbsTT +FsdsShrgggLDdbSDsgrGrlWHTpfRpTjjfFTzRTRjBWWp +mPvqCmJCqJNnPvPNPCvvLTTVjHjzNWHHTWRBRVTWVz +wJLvqPZmJtccncvZmJqqrghDGQwbdSGdsgGgQgQr +zFwtNJGtNFlpnwHccZjZbcpprsmc +PWQfBWhBgQgTWQRLThBqMSVDSbbDRsVDmsmZsSZDjr +fvQfWBfLqfTqhLhCvNFttJlCwGrrCC +fNrGLNrfNrGjllRRRPmWVL +tbJdcFbSSssZSmmpFcsSbwDWVWBlllVPDnnjBFjDRnBF +ZZJcvZctgNmmvMGhQm +HhhjFRhgrcRTFLvWVJVQWJVHDHQJPP +GwCmwBfGzfSCzCfwtmtzzJVWSVJJZrbWQQQqJJDZVJ +mtfzpGdststtBmfmCwrGRFcTcvjngjFnRcLnpLLn +rrwjdwLgVmVwHrfPCJPQBCBGmPtt +ccNZqbNnMMblNpTlNpnhhBPSJsQhJtJtChPJqS +vTWvNcWNWTFvnnvcgjzDLVQLgHVwWDrW +jNPgbNHbfLJgLzfz +ShvhhFVVDShFVqMSSSvZfffvPLtBBBBJJlpfLJJv +DqhnShhMnZZwCSDCMhChrRnNrNdNQbHNNPmjmdHN +VQVZGQFnzFTSsBfgzgfs +rjlpjtDrtMLZPMtPtpPZPwCsgSHgMHCCmCTWsgBWSBmg +pjvDqLwrlDtwqtqNLvtjpPPwRNbQRncQVQddZhRhJQbJncbG +PsBSqnSdQsFhmmmnppFc +TRhNvrTCvNTHVcfHbJVTpc +rhtWvGWLrjRqdSqqLLqdld +vPhfqPJvrMrnffDDhvpMjdzGMLdLLQpllLGQ +mbmcFSScGbSCcQlzwQQlclsg +BSGVCmCTZWCGGvnvfZHqqrDhHN +GSRfrzGRhzsGChjTBBlqBgjgCTCn +wHQwtDVDHwHHDJcDWJZwzHZBqTnnBFlvjFgBqnljjvBdBZ +JNmVJpVmNtDHJWHrbfPLhbGhrzRbpr +WcWcbzNPbDwBNvWBwRMPQmJZQRQZftRZGP +LhVHFgggTHCFHhfMQQSMMGQRMLLM +qnrqppFVHphqfDsNbzjrzbrN +cwgDrdLSrBrvvhDzCljjTW +VHtVZpspQtMQsVRQppFVQVHtCdPTPTzdjvhTzTTPRvjjvWhn +QQZpMdJsQFJHtMHdScwLwLJGrSScSwqw +ZsjNflGfRfRPrZNRFcffLwJdwcLdDBnwzzzDznVn +CTGvhhTqbtbgTqLJWdDntzWWdnLw +phCMgmQGvvHCvMhbTQQFsNsNFPZSfZjffmNsll +CNpCJHLNhhSSHZPgrFlFFWgpFpmzjj +qQttDVDwQGdQGvqDQfwbcVrrlljjzzmzrVJgrr +nvMDsqqqQvfvsqDnRSZHJPPZHhLHLS +RNNrrPfDNRQwQhjscghMqs +WVZlHvnZqtlLVLvwjwhsggTstMhwTw +vGHWLJlVWlmLVqRCGCFFNfqqGf +MNzqCnvqvqvCVLBvvCVCpVcRssncrPSTWGrPSPdGTcrP +hmHwFmQjFlhtZmHwtZjjddSSGcsdPrrGcQQQRGPW +fHbbFjlhZwmtwhfjmmwmmLbpLqzqvBzLzCvLNRMbNB +tQfLrtQPrrfDSSCVlDfLSrmbBjGvWjjLmWWWpWNNppmv +wdHhRTTndnRThdvnBFGpNBMnpvvp +JdqTHTHHRdqzsJRRzTRHscJdDSGCfDlqQZqlfZrZZCffqSSQ +hQMWLsgGJMMhsCHggQWhgspDWFPzZvPvptDvzvmtdtdF +BrBlrTBrNRbfnjNQlZDztPvpmpppmzvfdd +jQlQlqQVbVcsMgMgChhJVs +MtFMCTWRFRRtCRTTRTMGJddjLdstHvBzBHzHVVpL +lZSDnbDlnZPrbHpzJJsdSVJpBL +nNghhPrlZlgDTFhCfMFJRMQF +RGpPFZPRQZPFRGvpPQPpjvpmhnnCMjhmhgBgVgMVWBVgVM +wLtfNdNHmrNthCBgCbhnngWd +srSfwHfszsNmtswlrqQDGQFDRPJGDvzRppRJ +GVFFGvVWZLFsmssFRNfVvmGGJPpJTTqDBvTpqlpDvqbBtTPl +gQhzzChzrMQhjpzlzWzJpPpBJb +ghgWjcCjMgCHWdQMhdjChCmfwmRRGZZGVHLZHRfmNwVs +DnDVhdnrfSfpcGGjQQGdJddJ +bPWPRbRsRMsHNzDqTZcGBcqZqmmN +HvwPvvzMPwDCChDVwS +vTCCvTfWFDTtRPMvfWFlDFHBqGLpLzbwBgWwqzGqbBbB +cQcSNchSJSZShVJNnZrhSqBpgwGHHtGwqtbwLbqpbr +JNnJVsJscNstNhQsjnVVNlFfMmTMFfCTfjFvfPRPPF +VLFBsgffNFNqRvbz +ChltjTdjDhHpHZvdpjjZhwCpbNrbSzzbrNGMTMMNSMbWWNSN +vQjpttQhHnLsBQVLsQ +mbzQgTzRVVbsVdQgzzVRddmztFGWNGNNWnGtFSGBsrCNWCrC +jfJjvPPwLDcHDPvDDPDppLCWCFBGWntCBnrtFcrFWTGn +wpJPLjvpTTDpwhfgzmVMbqhdhVRgzl +PlcqbWClLmnqZVLq +THwdrrhddhhfJJhwLJhpQnDVnznnmZQQnSpfpD +vrFdvGsGHhhhwHjFGrFGJHdMCCcNgbWMPccRRccMFLNPPP +tbppJqcNtJnZzRJbPFsFPHfZrrshFDjj +GdwgwlLgGCndsDFrhDHHFF +SSlLnmmvqWNqmcqb +ZPFPPTZpZSWzCMMSzPBsFvhtlQvJQQtJhsVs +dmNbmgbrwDNmbcDgwNdcwdLsnhlJlnvtsBJnhVQqqnstLB +bNGfDGgHHVwbwNwVfgmRMzCzzCSHjSRZSZCTRS +dDTffQdqQQLBLnVLLQvL +rrBHZZcgJcrLvNLtLgRLbN +cjjJhrFlhZwFFzwJzmTBBdmTsDPzDsBP +ClGrJJMNCrGQqlcPvWgnDP +ZBvbjHpSwBVVVcWjjjqQ +BLSbbwsHSTBHwmLHHLbBsSTFdrfvCrtmdzfGJzrdzGJddGfh +gljWRwmSjtJWjJtJjgjSZfVSTVVHGZSVHcVchZ +pBzLFQpPsFBGcGBTThfB +pFpQzFLPLpvQFQnLbsqqGddgjbmwRldwtWmlGWwj +PDQDMFQBMfWPvjdLLndLjrmsMj +qZqVzTRRqHtvZGGtVqTTzVjLLsrmJCddnLjrjHsrhdCr +GzwcZtqNzqvNqwzZVGRwSzbpWfFbWPlWFpNDBfQfFNNf +dfRszdzVdsjwdhLwCCqwGllHvPGPwG +SpJtBLFgcGqHQClqZF +JrttrtcTmSSLrmtBTrNgnBJjbNhhbhzRdsVdMhNjhMMhVd +MPFSCfSMqVSBGrtzlvccfQctzbzl +hZNjTHWWTZwshbLvmlWpBzmbmm +dRTTJNDNhjsJqBBMMgrJPVVr +WnVzDMjlDVWwwHgwhmgNhNNsJh +qfvrLNCcbLdvpcvbrPPqCsGhSJGTTBspTshBpTBBms +ZLvvZfrPfPCLbCFFzjVQzRnNNMVzDQ +nllbFTTpTFTBcnCjQPqQdZRQZhCb +tvWszrrztvSmzQQvrDmZRjjjPPDVqPRdZRdCPd +gfzvSsftgQHQHgQl +GVbHRRGRLpdmGWTm +gSPPltPlrlvccFccPlcJNCTpnnmpMCLMMmWfdRmMSS +FzNJRhhvPFRvQwzqjqzBHZZj +PhZSpFBPBFsNmjBVllltBj +JMGLnrrnbfffrdqRqPHnnqLDVTDDjgmRgwtmjDljlDVlwl +LHMqPqPnnqGLWJPMnndrGfSWppzvvFSChFFFvvzQSQZz +RSWWssbvnnCqZnWsRCnssWrTggNhgbNHBgQjhhQBgjNT +mcpzcppzczcDGVcPcDLLGLjmrMNTNtQNHhMHrQBQNTgN +LVpPfcjjWvsFFnFf +MpddpdCpJdJlbdMvBHMnnsHqSRvG +PWvZfFmZrrfmwWwFznBnqRRSGcsBVmVBRG +zjzzhQPQvzjLPQzwffrwrtlTCDtJDlgJLltpTTJlTl +TvTWjjzpznGttFFZccrrPrSZllcB +gNNSqHMqsMHQJHNZCDDCZDqLZdlZBD +SMQNSRNbRRHwhwhsRmtnvWVmmnbGnjmpGn +ccSVQjCQddTsFJcH +gLppBfgfmvCRFdsddTJJgb +WMLMmWGGBZWZLCtvDhlSSDGlwhSPSzSP +TpqVGVHFQGmqSqPZdccNCzzhdwCjNG +fffbbvftMrBMDDcCccCZCjlvhCCd +RLWMnbftDhnMRtfBftRJMtLMgFgHmmpmPmSmmQFPPLHHVTQS +nRvwQSDNcpVJJcJR +qZMjBhjhZMMBzLBGLGrjJbTPVTpbdPPdVbVb +ZZpmFFZlfGqfmmGMzlfmMmnWQDtHtSvnWWNSHSSstFtS +bFDGZjGDbbRSgLtN +CphJVfJWCTBgvfLHNRcwnt +WVhPWBTzzChzhhhBmrpPPCJZDQtdMlrjFQdrFqsjdrQsFG +ZBpVQHHVMMWWdmmLWw +lQhhrjcRttrqbvQLNwdDWzmNSDmStz +QbGqhcbvcsqvCCHnsCZHCnTn +tlWtQTTTJjTQtVnmrbnPWVShVC +MDMGGzsHcwFgGZBqrmmPSnbqVmNVGC +sZFPwHcMZDBRTlvQQJttTQTR +FhVRfGptMGMnZhRFBNRBCCNHHNvTNTRC +zmwrLLSjrbzmNlcvvrHvDPCN +JLwjQdSbjdbSdqJQFGVqFVMgnGHMfGVV +fffZWrJqZSHWTWHqSvrgDhggzRjttsDhpDgs +PGlBLcBBbnnbLLFbGLBjRgjFTFVzshtzpgsppz +TGCPnMPQlGnPmclPlnnQmbmHJvNvfHdqwddwvvZfCNHCfW +ClLwpspTPrTFZCdzFbZdbQ +RRMWfRgWVRMRQBZZScVczVGFbjNb +MfnvMqWmslvDhQPw +hdndSdqsTddBhdcmmNHFDcqHttPF +JjMzzMZQGwZGZJzMzZJQzGJFvPvNPtFmvmNmDvcFtvDHMv +gZwzQwJfGVJQJbGLBsSTSTdTbCWDBSnd +ZZCHZRzMZGRMhMMVVFNThrdd +SgsccSPmmgqssSlqsgcmscSqlhpFdVThjphNrdrhjdwdhFJN +vmttqTcqvLqqmPccmqSBbRWnWzQZZZZBHnQCzHDH +GgPnGdSPBpGsLTBL +rVNJjmwZqtZZshltFTtvRFsL +mqmWrZVqWjrqZMNwPMQQbsddgdsbsgPz +LZLVvjZrggHLJggSZDgrnPnQnRnppVRllntRdPFz +chMCzbqGmhNhhbBCMBdFnpfqFnltRRQnlPpQ +TChmWcMMTmBswJzZZrWrvzgg +gngRNBNRBsNFFBgfgbLLLnqdSLvLTcbLbd +GWtlChlVMllcZSDWSLbdZL +lljjGlhMGrGJpsFdRJfsfzfz +jVTdrnGQcQtTTTFQqBqsgHHFgsqf +ZZLbPLzDzPZCmsgqsBHt +wDzDlPblRDPLPvhvwtdnnhdrnrMGWMVGMThj +spjjpjvjpjmQjrpCMfSlfzrPBl +dHFntHWnnbRVFtnbcqHFzBCCCPzfPMlcCSlgllzc +RLbVWHnnSWtnHFbdbVRdNNtQsjsQTjDLwmGTmTssQwmLGJ +JbJJSLMhRMSLhNqqwFDwFNcFqL +GcpnGnznnpzpzGpffNTNTwTfwdDNNdTFdD +nllnlPGWQWHcGpzzQGGzGvHGJbVVtJSChQVbmtmVJrmrmbRm +GFsFrzwrflmtdtbltG +ggLPDngCJncNLJRDwgnllmJqjWMjhjhjWWmWjj +nBNRNPgpRgDLTgNwfsSHVBQHVHwsZr +WwvnvWvcFtwtSFSF +zBZZZRQSzMBSgSVJGjGTPTGFzCzmmj +fZDrpZZfRfMgSQDDBhgQghDHsnbrcNlWnnLWHLrHsWnllc +ZVncdPPwVPdhZngnqHWHNNvTHvlMvn +fSLjjLSGGBjTTHqvBqrMNT +RSSSDGRtSGZthTTctmtg +rtzrfJbgJHRfGRZLPR +hdVhlllmFlFPLwHmsRGGZP +nTWhRjTBTWlvNQgnJSSbrJtz +JgVTpBpfvgpTDDJFJvTgggtlFlNNMRLNNzNNZRNHMRCLlF +wbPWcSGbGqWDlnNWMMMCLMWZ +wrsGcbrcbcqwDwbcmGvQBQgTTsdVJgJsVdQf +mztrhgJtDrhgcrZmnhbnzbhcMTMPlBCPBGVGTMVGslCCPGDs +FLRQmjjFSQpQwLlPsMsCpvslvPCB +fNLLwSdSwWSWjwmrtczZhhrJzdzh +HHwCwJFmHZttZCfCSffSMHcVDMcPBRPcPRDhPghM +nvQLsTnLslnLvpzGTssnsRPDMhPgVPVgtcVMRPgVQQ +vnsTGWlTLsWTLLvNsGWlsZrwmZCJddjFmtJJNZFftj +hbjSTvSJTfcSwcPSPfTbfHszVVFpGnpJpsHFnHVVls +rtZrcQrRZZQrmZBQlCGppnppHzpVFCGR +WmLqmgNtcLNQWTbPvfPwbbdb +HzZgsdHglHlzdHsFtsNNJSlNcSpjcjlrrNVv +wqqWRPPqwmbcqPjQVvSPJJrVpv +qqBBqmWRhqRLqcBnhzzztgnTdDHnHsFsHn +rJPFVwwsrJwmdVrLWJvvRBWBvbzWlb +nDZcNGNpjTpHncvpZCDnTNZGhlWzQhWbpRRQlQhpWWSWLlQb +CDNntnCCHnvmqPfwtFdVqd +gqBwgBjCswwgqNBNCVDDTVdhlSDTDcZc +HvRRFMzRRRRMpHrtTllfhZHHSShHTf +PmlGLPrppMrrmFFmLMWRjbsjnsjwQNJWnbQjWgBN +pDggpFgRghZjBFPPnPPFrt +cwTfLwBVwCWbLcVTVVvrdndGjMHrnGJtnttdMC +NTVcWNvcBSpgNqspRQlN +DLDgFlDmNZfjfnJZSF +tctvttzvGGzvrHqtVVdwnJGSSnnjjZdWTdwW +zvpcrbpHpqJJsPbPlLlhmhglPQ +pvHHvssFCFZQNCftttdQdd +VgTGTTVGgLjDjlLGzgPVMTNwmcwQmMQfQtmdcmwMJwNm +TPjTDjfGWTLLljgzrWpZZbsqrFqhqbps +ppVLcfcwSLgpSLVLgWwtfshDNDqvWvGvlQZvDNHQHjqq +MPrzmdRrPPrCJFnMnMRRFRPdqqZQNQvjvZDGDlHhQvGNDG +BmBMBBJTMmPBJMMFCCFJRmrsTlVpVbpwLSVwLsgcwTVlVc +SSGzmFRzmRGLgSSmGMJFnvfvJnJVnJQnMl +cBpjHtjwNfcpNZtppHtCMlMPMlJBVlVQlvJPvJ +dNtNZwqWfqtqZWtHttsqHqrRrrdRTLbmmzSLmTGGmbrg +RrrddnrgnRbbgWdGrfnwgQwjDjDpvTpBQTwBPP +MHCStZJzSwvPjWQD +mcJWVHCCLcGLbdcn +PlMsdjPdGMjdPSrSjgddbLbmHHTszHZzpHmsTFvmpzZzmN +ntRJQVRfcQhcQWhnchBJWntTFTTTNTSpFtztmZFDTpDZ +hQfcfCBSwCccVJhSJnrPPGLqPlbPLCrqldgb +vgvWDMZvGpcqgqsP +tSdtjLHLQLHjdFdDddQSQhwlsGqwQlqqqhQsPhGc +tbRjtTLFRvTZDBrMrV From ef2a4c07009d0ece0d1fa9cfb2ad442b77bb7622 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 3 Dec 2022 07:48:31 +0100 Subject: [PATCH 285/479] 2022: d03: ex1: add solution --- 2022/d03/ex1/ex1.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100755 2022/d03/ex1/ex1.py diff --git a/2022/d03/ex1/ex1.py b/2022/d03/ex1/ex1.py new file mode 100755 index 0000000..95f341f --- /dev/null +++ b/2022/d03/ex1/ex1.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: list[str]) -> int: + def score(line: str) -> int: + common_items = set(line[: len(line) // 2]) & set(line[len(line) // 2 :]) + assert len(common_items) == 1 # Sanity check + common = common_items.pop() + return common.isupper() * 26 + ord(common.lower()) - ord("a") + 1 + + return sum(map(lambda line: score(line), input)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From edeae4d9f481004efb3459a7adb6b6ed6edf1745 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 3 Dec 2022 07:48:43 +0100 Subject: [PATCH 286/479] 2022: d03: ex2: add input --- 2022/d03/ex2/input | 300 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 2022/d03/ex2/input diff --git a/2022/d03/ex2/input b/2022/d03/ex2/input new file mode 100644 index 0000000..f82eaf1 --- /dev/null +++ b/2022/d03/ex2/input @@ -0,0 +1,300 @@ +FzQrhQpJtJMFzlpplrTWjTnTTrjVsVvvTnTs +mScqSqqgcfPCqGPZcfGNSvTNsVVNSjNvWSNsNz +fPcPGqgCcHgFzQpJJtHtJH +DZDqqlrjplDHrNCmnBcHBMCRcJzb +RQFLStFvdcBbzdJbJM +PThQtwftTPFvtTPhvtFtfFtpZZllwjRNlsqNqqZjwpGlrZ +pPwtqgwJZPJLgQqSFlqhFFlqMd +DBmCWBBDWTRGvcVRTCCnnfQlFSdlzfhfdMWQfjhhQz +drmBVVCRgprPtrZp +HznjQjvmzDMVrQnMLJMMlfWgPSlJGWWJPl +BdcqqhcdBRpFhhZBthhctdJSJJWfgGFlJCSFgbWPCDJS +NdRTZdNqBwqtthpRBTTRqdtZrsLQVzrrzjzDwDsnmrQrnsrr +HZFZCFzZWszqsRTBZTNMhmthVTmhDppmMQVPpm +wjvSbJddvrvlrvnJSJJvlJmhPlhVPVtGVpQDBVMpphQP +frbrfrcvvnvjfwbcJgrrCBRsCFsNzRgRCHCqssRH +dDFNqNqZqPLNqvqTTvCLSPdZssGHClJQJcRHJGHHcHBcsMsQ +lrjmWgWWrhjgrppQHHMQrsQRJGcBJc +lVlmnwjmdTTSvVFN +FWNFHvQPmLGwwwSHtswwln +RfMJcDdfdcfdddfZjdchrtZmSmCZVtqVnZmrnrtC +JMmJcfjjphcghpgjhRGzGzBBGPFGNBvPTpFL +cVPVwStmmcQPBQPpSCppwhHZNNqHszNBhsNRNjqHzj +MfWdDgvdbnvgMTWgvgZfzmsZJHzNhqjqjRhJ +MDWMWGndMgFDnFLDwQrPPCSrCSVrlmGS +QLZmPdRdWmMsMDWZmsLWWrhMHcHGzHvGzFcvrvzNrc +tplSbLVBlvHHcFNnSr +VqfgwLlCJWmWQTfW +nRWvlvRbtLvdMCPFGL +wrfsJNNGhNzGrTgDMDLgPMLPfq +wcVhJQhwhrrBpmVblBRGSG +HHHcggrZLcQQcQll +GzfzTRTzmmFMwSNSwdSJQtNLNB +TGbmLMFTzVVVTMzmFMfFPMHPZhnjZCpHnhgnZnPWCPZZ +MRwwpVMHRspqVqwmccDlDrcHBBZgBl +jQfQQQjWWFBgmcgDfcZg +hvvSQzSnQQSWWQWSjTZVTRMshwVCssppwV +pvrTvCvtFppCHMMZcdDFdcZM +wLjTQnqljjSnlwjqjRgLcHHHMBDMZhBMHgHcbBDh +mqjqlSNqRqwSRrWCvzGmtfTfzs +TWScDCqCQQVBWDqWHsHswwBgRJzRhhHp +dPttGrvFfGjMjnjvshsJgsJLgghRgH +rFMlGdtjPffNnnrffSNcVCDqQqCQRqQRRN +GmBRbVpPbmJcwggBBgWW +LjsTCNNtddjHqLLgWwccqgfq +nsjNjntNtjHCsDwZmwZZVmmGSvSD +bwDDgNFtMMDbFsMbFwWWVcRcSpcgjgQWhWSp +lfTJJlvdfCffccWppRjRlcSc +RnzGdJJmsMNnMFtM +bsBTFsqqTTmFZTsQBWWznWCRshlJNJlCVh +GjGnDvDjvjPppHwwpwgrPPClJhNVRCzhhzJWlWlhNlvJ +ffdgLrgdLrDjdfHPbbZbttcBbcbLmntn +TNTwwvTTHNtTHNLLVqtqTSZBJnrnhhbrFJjZjnVZgghF +cplWfRlzcWfRCZZhFrGjBfjZjn +pddzDsRpDcclzCQMWBvNSmTTSqdvPPvqwqtT +DQTttwwLtQtVSDMJDRmmSS +ffsWfvrBWrPvwJhPhPSMPMVn +WsvsggFvwNLgHtNQ +llBbVDMTlFVdFDTbVggSVsqZqZZZqqvNJZJRNRWgtv +HhpjcHHvjPsqCsWcNcsq +GfpvnPvwFDTTFFDw +GMmFGMGFFgVwQHQwwM +cJtZNtZTbThcZtcZJJtTZWJPllgNgpPvVgpjHvQpRpHQNg +hWcJZcnhcJznbcBZLqSLDfCmHqnqCLsD +zQpjLpnhnsHTnlQLrMCCHPFrvvCMPcHm +ZfgdSBtNqBwlgSDfZDwtqSFvJCvrPrVvFmwCJFvrmmFV +dfbRNZBqDtgRNBNNNljLLjhGRGGWGLGTRhjz +hhrnfBzhtzZgDgDnBfrfDZsRpMNCNNWjwCCfGQGGNGCGQC +lcdPmHLSPDSdFDpQMLjCQQQCRGpN +lJSSbmPdVdVvdHbvSDFHHPlZqgBnttzgTsssTrqgbZbsTT +FsdsShrgggLDdbSDsgrGrlWHTpfRpTjjfFTzRTRjBWWp +mPvqCmJCqJNnPvPNPCvvLTTVjHjzNWHHTWRBRVTWVz +wJLvqPZmJtccncvZmJqqrghDGQwbdSGdsgGgQgQr +zFwtNJGtNFlpnwHccZjZbcpprsmc +PWQfBWhBgQgTWQRLThBqMSVDSbbDRsVDmsmZsSZDjr +fvQfWBfLqfTqhLhCvNFttJlCwGrrCC +fNrGLNrfNrGjllRRRPmWVL +tbJdcFbSSssZSmmpFcsSbwDWVWBlllVPDnnjBFjDRnBF +ZZJcvZctgNmmvMGhQm +HhhjFRhgrcRTFLvWVJVQWJVHDHQJPP +GwCmwBfGzfSCzCfwtmtzzJVWSVJJZrbWQQQqJJDZVJ +mtfzpGdststtBmfmCwrGRFcTcvjngjFnRcLnpLLn +rrwjdwLgVmVwHrfPCJPQBCBGmPtt +ccNZqbNnMMblNpTlNpnhhBPSJsQhJtJtChPJqS +vTWvNcWNWTFvnnvcgjzDLVQLgHVwWDrW +jNPgbNHbfLJgLzfz +ShvhhFVVDShFVqMSSSvZfffvPLtBBBBJJlpfLJJv +DqhnShhMnZZwCSDCMhChrRnNrNdNQbHNNPmjmdHN +VQVZGQFnzFTSsBfgzgfs +rjlpjtDrtMLZPMtPtpPZPwCsgSHgMHCCmCTWsgBWSBmg +pjvDqLwrlDtwqtqNLvtjpPPwRNbQRncQVQddZhRhJQbJncbG +PsBSqnSdQsFhmmmnppFc +TRhNvrTCvNTHVcfHbJVTpc +rhtWvGWLrjRqdSqqLLqdld +vPhfqPJvrMrnffDDhvpMjdzGMLdLLQpllLGQ +mbmcFSScGbSCcQlzwQQlclsg +BSGVCmCTZWCGGvnvfZHqqrDhHN +GSRfrzGRhzsGChjTBBlqBgjgCTCn +wHQwtDVDHwHHDJcDWJZwzHZBqTnnBFlvjFgBqnljjvBdBZ +JNmVJpVmNtDHJWHrbfPLhbGhrzRbpr +WcWcbzNPbDwBNvWBwRMPQmJZQRQZftRZGP +LhVHFgggTHCFHhfMQQSMMGQRMLLM +qnrqppFVHphqfDsNbzjrzbrN +cwgDrdLSrBrvvhDzCljjTW +VHtVZpspQtMQsVRQppFVQVHtCdPTPTzdjvhTzTTPRvjjvWhn +QQZpMdJsQFJHtMHdScwLwLJGrSScSwqw +ZsjNflGfRfRPrZNRFcffLwJdwcLdDBnwzzzDznVn +CTGvhhTqbtbgTqLJWdDntzWWdnLw +phCMgmQGvvHCvMhbTQQFsNsNFPZSfZjffmNsll +CNpCJHLNhhSSHZPgrFlFFWgpFpmzjj +qQttDVDwQGdQGvqDQfwbcVrrlljjzzmzrVJgrr +nvMDsqqqQvfvsqDnRSZHJPPZHhLHLS +RNNrrPfDNRQwQhjscghMqs +WVZlHvnZqtlLVLvwjwhsggTstMhwTw +vGHWLJlVWlmLVqRCGCFFNfqqGf +MNzqCnvqvqvCVLBvvCVCpVcRssncrPSTWGrPSPdGTcrP +hmHwFmQjFlhtZmHwtZjjddSSGcsdPrrGcQQQRGPW +fHbbFjlhZwmtwhfjmmwmmLbpLqzqvBzLzCvLNRMbNB +tQfLrtQPrrfDSSCVlDfLSrmbBjGvWjjLmWWWpWNNppmv +wdHhRTTndnRThdvnBFGpNBMnpvvp +JdqTHTHHRdqzsJRRzTRHscJdDSGCfDlqQZqlfZrZZCffqSSQ +hQMWLsgGJMMhsCHggQWhgspDWFPzZvPvptDvzvmtdtdF +BrBlrTBrNRbfnjNQlZDztPvpmpppmzvfdd +jQlQlqQVbVcsMgMgChhJVs +MtFMCTWRFRRtCRTTRTMGJddjLdstHvBzBHzHVVpL +lZSDnbDlnZPrbHpzJJsdSVJpBL +nNghhPrlZlgDTFhCfMFJRMQF +RGpPFZPRQZPFRGvpPQPpjvpmhnnCMjhmhgBgVgMVWBVgVM +wLtfNdNHmrNthCBgCbhnngWd +srSfwHfszsNmtswlrqQDGQFDRPJGDvzRppRJ +GVFFGvVWZLFsmssFRNfVvmGGJPpJTTqDBvTpqlpDvqbBtTPl +gQhzzChzrMQhjpzlzWzJpPpBJb +ghgWjcCjMgCHWdQMhdjChCmfwmRRGZZGVHLZHRfmNwVs +DnDVhdnrfSfpcGGjQQGdJddJ +bPWPRbRsRMsHNzDqTZcGBcqZqmmN +HvwPvvzMPwDCChDVwS +vTCCvTfWFDTtRPMvfWFlDFHBqGLpLzbwBgWwqzGqbBbB +cQcSNchSJSZShVJNnZrhSqBpgwGHHtGwqtbwLbqpbr +JNnJVsJscNstNhQsjnVVNlFfMmTMFfCTfjFvfPRPPF +VLFBsgffNFNqRvbz +ChltjTdjDhHpHZvdpjjZhwCpbNrbSzzbrNGMTMMNSMbWWNSN +vQjpttQhHnLsBQVLsQ +mbzQgTzRVVbsVdQgzzVRddmztFGWNGNNWnGtFSGBsrCNWCrC +jfJjvPPwLDcHDPvDDPDppLCWCFBGWntCBnrtFcrFWTGn +wpJPLjvpTTDpwhfgzmVMbqhdhVRgzl +PlcqbWClLmnqZVLq +THwdrrhddhhfJJhwLJhpQnDVnznnmZQQnSpfpD +vrFdvGsGHhhhwHjFGrFGJHdMCCcNgbWMPccRRccMFLNPPP +tbppJqcNtJnZzRJbPFsFPHfZrrshFDjj +GdwgwlLgGCndsDFrhDHHFF +SSlLnmmvqWNqmcqb +ZPFPPTZpZSWzCMMSzPBsFvhtlQvJQQtJhsVs +dmNbmgbrwDNmbcDgwNdcwdLsnhlJlnvtsBJnhVQqqnstLB +bNGfDGgHHVwbwNwVfgmRMzCzzCSHjSRZSZCTRS +dDTffQdqQQLBLnVLLQvL +rrBHZZcgJcrLvNLtLgRLbN +cjjJhrFlhZwFFzwJzmTBBdmTsDPzDsBP +ClGrJJMNCrGQqlcPvWgnDP +ZBvbjHpSwBVVVcWjjjqQ +BLSbbwsHSTBHwmLHHLbBsSTFdrfvCrtmdzfGJzrdzGJddGfh +gljWRwmSjtJWjJtJjgjSZfVSTVVHGZSVHcVchZ +pBzLFQpPsFBGcGBTThfB +pFpQzFLPLpvQFQnLbsqqGddgjbmwRldwtWmlGWwj +PDQDMFQBMfWPvjdLLndLjrmsMj +qZqVzTRRqHtvZGGtVqTTzVjLLsrmJCddnLjrjHsrhdCr +GzwcZtqNzqvNqwzZVGRwSzbpWfFbWPlWFpNDBfQfFNNf +dfRszdzVdsjwdhLwCCqwGllHvPGPwG +SpJtBLFgcGqHQClqZF +JrttrtcTmSSLrmtBTrNgnBJjbNhhbhzRdsVdMhNjhMMhVd +MPFSCfSMqVSBGrtzlvccfQctzbzl +hZNjTHWWTZwshbLvmlWpBzmbmm +dRTTJNDNhjsJqBBMMgrJPVVr +WnVzDMjlDVWwwHgwhmgNhNNsJh +qfvrLNCcbLdvpcvbrPPqCsGhSJGTTBspTshBpTBBms +ZLvvZfrPfPCLbCFFzjVQzRnNNMVzDQ +nllbFTTpTFTBcnCjQPqQdZRQZhCb +tvWszrrztvSmzQQvrDmZRjjjPPDVqPRdZRdCPd +gfzvSsftgQHQHgQl +GVbHRRGRLpdmGWTm +gSPPltPlrlvccFccPlcJNCTpnnmpMCLMMmWfdRmMSS +FzNJRhhvPFRvQwzqjqzBHZZj +PhZSpFBPBFsNmjBVllltBj +JMGLnrrnbfffrdqRqPHnnqLDVTDDjgmRgwtmjDljlDVlwl +LHMqPqPnnqGLWJPMnndrGfSWppzvvFSChFFFvvzQSQZz +RSWWssbvnnCqZnWsRCnssWrTggNhgbNHBgQjhhQBgjNT +mcpzcppzczcDGVcPcDLLGLjmrMNTNtQNHhMHrQBQNTgN +LVpPfcjjWvsFFnFf +MpddpdCpJdJlbdMvBHMnnsHqSRvG +PWvZfFmZrrfmwWwFznBnqRRSGcsBVmVBRG +zjzzhQPQvzjLPQzwffrwrtlTCDtJDlgJLltpTTJlTl +TvTWjjzpznGttFFZccrrPrSZllcB +gNNSqHMqsMHQJHNZCDDCZDqLZdlZBD +SMQNSRNbRRHwhwhsRmtnvWVmmnbGnjmpGn +ccSVQjCQddTsFJcH +gLppBfgfmvCRFdsddTJJgb +WMLMmWGGBZWZLCtvDhlSSDGlwhSPSzSP +TpqVGVHFQGmqSqPZdccNCzzhdwCjNG +fffbbvftMrBMDDcCccCZCjlvhCCd +RLWMnbftDhnMRtfBftRJMtLMgFgHmmpmPmSmmQFPPLHHVTQS +nRvwQSDNcpVJJcJR +qZMjBhjhZMMBzLBGLGrjJbTPVTpbdPPdVbVb +ZZpmFFZlfGqfmmGMzlfmMmnWQDtHtSvnWWNSHSSstFtS +bFDGZjGDbbRSgLtN +CphJVfJWCTBgvfLHNRcwnt +WVhPWBTzzChzhhhBmrpPPCJZDQtdMlrjFQdrFqsjdrQsFG +ZBpVQHHVMMWWdmmLWw +lQhhrjcRttrqbvQLNwdDWzmNSDmStz +QbGqhcbvcsqvCCHnsCZHCnTn +tlWtQTTTJjTQtVnmrbnPWVShVC +MDMGGzsHcwFgGZBqrmmPSnbqVmNVGC +sZFPwHcMZDBRTlvQQJttTQTR +FhVRfGptMGMnZhRFBNRBCCNHHNvTNTRC +zmwrLLSjrbzmNlcvvrHvDPCN +JLwjQdSbjdbSdqJQFGVqFVMgnGHMfGVV +fffZWrJqZSHWTWHqSvrgDhggzRjttsDhpDgs +PGlBLcBBbnnbLLFbGLBjRgjFTFVzshtzpgsppz +TGCPnMPQlGnPmclPlnnQmbmHJvNvfHdqwddwvvZfCNHCfW +ClLwpspTPrTFZCdzFbZdbQ +RRMWfRgWVRMRQBZZScVczVGFbjNb +MfnvMqWmslvDhQPw +hdndSdqsTddBhdcmmNHFDcqHttPF +JjMzzMZQGwZGZJzMzZJQzGJFvPvNPtFmvmNmDvcFtvDHMv +gZwzQwJfGVJQJbGLBsSTSTdTbCWDBSnd +ZZCHZRzMZGRMhMMVVFNThrdd +SgsccSPmmgqssSlqsgcmscSqlhpFdVThjphNrdrhjdwdhFJN +vmttqTcqvLqqmPccmqSBbRWnWzQZZZZBHnQCzHDH +GgPnGdSPBpGsLTBL +rVNJjmwZqtZZshltFTtvRFsL +mqmWrZVqWjrqZMNwPMQQbsddgdsbsgPz +LZLVvjZrggHLJggSZDgrnPnQnRnppVRllntRdPFz +chMCzbqGmhNhhbBCMBdFnpfqFnltRRQnlPpQ +TChmWcMMTmBswJzZZrWrvzgg +gngRNBNRBsNFFBgfgbLLLnqdSLvLTcbLbd +GWtlChlVMllcZSDWSLbdZL +lljjGlhMGrGJpsFdRJfsfzfz +jVTdrnGQcQtTTTFQqBqsgHHFgsqf +ZZLbPLzDzPZCmsgqsBHt +wDzDlPblRDPLPvhvwtdnnhdrnrMGWMVGMThj +spjjpjvjpjmQjrpCMfSlfzrPBl +dHFntHWnnbRVFtnbcqHFzBCCCPzfPMlcCSlgllzc +RLbVWHnnSWtnHFbdbVRdNNtQsjsQTjDLwmGTmTssQwmLGJ +JbJJSLMhRMSLhNqqwFDwFNcFqL +GcpnGnznnpzpzGpffNTNTwTfwdDNNdTFdD +nllnlPGWQWHcGpzzQGGzGvHGJbVVtJSChQVbmtmVJrmrmbRm +GFsFrzwrflmtdtbltG +ggLPDngCJncNLJRDwgnllmJqjWMjhjhjWWmWjj +nBNRNPgpRgDLTgNwfsSHVBQHVHwsZr +WwvnvWvcFtwtSFSF +zBZZZRQSzMBSgSVJGjGTPTGFzCzmmj +fZDrpZZfRfMgSQDDBhgQghDHsnbrcNlWnnLWHLrHsWnllc +ZVncdPPwVPdhZngnqHWHNNvTHvlMvn +fSLjjLSGGBjTTHqvBqrMNT +RSSSDGRtSGZthTTctmtg +rtzrfJbgJHRfGRZLPR +hdVhlllmFlFPLwHmsRGGZP +nTWhRjTBTWlvNQgnJSSbrJtz +JgVTpBpfvgpTDDJFJvTgggtlFlNNMRLNNzNNZRNHMRCLlF +wbPWcSGbGqWDlnNWMMMCLMWZ +wrsGcbrcbcqwDwbcmGvQBQgTTsdVJgJsVdQf +mztrhgJtDrhgcrZmnhbnzbhcMTMPlBCPBGVGTMVGslCCPGDs +FLRQmjjFSQpQwLlPsMsCpvslvPCB +fNLLwSdSwWSWjwmrtczZhhrJzdzh +HHwCwJFmHZttZCfCSffSMHcVDMcPBRPcPRDhPghM +nvQLsTnLslnLvpzGTssnsRPDMhPgVPVgtcVMRPgVQQ +vnsTGWlTLsWTLLvNsGWlsZrwmZCJddjFmtJJNZFftj +hbjSTvSJTfcSwcPSPfTbfHszVVFpGnpJpsHFnHVVls +rtZrcQrRZZQrmZBQlCGppnppHzpVFCGR +WmLqmgNtcLNQWTbPvfPwbbdb +HzZgsdHglHlzdHsFtsNNJSlNcSpjcjlrrNVv +wqqWRPPqwmbcqPjQVvSPJJrVpv +qqBBqmWRhqRLqcBnhzzztgnTdDHnHsFsHn +rJPFVwwsrJwmdVrLWJvvRBWBvbzWlb +nDZcNGNpjTpHncvpZCDnTNZGhlWzQhWbpRRQlQhpWWSWLlQb +CDNntnCCHnvmqPfwtFdVqd +gqBwgBjCswwgqNBNCVDDTVdhlSDTDcZc +HvRRFMzRRRRMpHrtTllfhZHHSShHTf +PmlGLPrppMrrmFFmLMWRjbsjnsjwQNJWnbQjWgBN +pDggpFgRghZjBFPPnPPFrt +cwTfLwBVwCWbLcVTVVvrdndGjMHrnGJtnttdMC +NTVcWNvcBSpgNqspRQlN +DLDgFlDmNZfjfnJZSF +tctvttzvGGzvrHqtVVdwnJGSSnnjjZdWTdwW +zvpcrbpHpqJJsPbPlLlhmhglPQ +pvHHvssFCFZQNCftttdQdd +VgTGTTVGgLjDjlLGzgPVMTNwmcwQmMQfQtmdcmwMJwNm +TPjTDjfGWTLLljgzrWpZZbsqrFqhqbps +ppVLcfcwSLgpSLVLgWwtfshDNDqvWvGvlQZvDNHQHjqq +MPrzmdRrPPrCJFnMnMRRFRPdqqZQNQvjvZDGDlHhQvGNDG +BmBMBBJTMmPBJMMFCCFJRmrsTlVpVbpwLSVwLsgcwTVlVc +SSGzmFRzmRGLgSSmGMJFnvfvJnJVnJQnMl +cBpjHtjwNfcpNZtppHtCMlMPMlJBVlVQlvJPvJ +dNtNZwqWfqtqZWtHttsqHqrRrrdRTLbmmzSLmTGGmbrg +RrrddnrgnRbbgWdGrfnwgQwjDjDpvTpBQTwBPP +MHCStZJzSwvPjWQD +mcJWVHCCLcGLbdcn +PlMsdjPdGMjdPSrSjgddbLbmHHTszHZzpHmsTFvmpzZzmN +ntRJQVRfcQhcQWhnchBJWntTFTTTNTSpFtztmZFDTpDZ +hQfcfCBSwCccVJhSJnrPPGLqPlbPLCrqldgb +vgvWDMZvGpcqgqsP +tSdtjLHLQLHjdFdDddQSQhwlsGqwQlqqqhQsPhGc +tbRjtTLFRvTZDBrMrV From 30ff9c5266a53e149f3f74418ece0efae5e8a203 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 3 Dec 2022 07:48:51 +0100 Subject: [PATCH 287/479] 2022: d03: ex2: add solution --- 2022/d03/ex2/ex2.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100755 2022/d03/ex2/ex2.py diff --git a/2022/d03/ex2/ex2.py b/2022/d03/ex2/ex2.py new file mode 100755 index 0000000..c9779e5 --- /dev/null +++ b/2022/d03/ex2/ex2.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +import sys +from collections.abc import Iterator + +Group = tuple[str, str, str] + + +def solve(input: list[str]) -> int: + def score(lines: Group) -> int: + common_items = set(lines[0]) & set(lines[1]) & set(lines[2]) + assert len(common_items) == 1 # Sanity check + common = common_items.pop() + return common.isupper() * 26 + ord(common.lower()) - ord("a") + 1 + + def iter_3() -> Iterator[Group]: + args = [iter(input)] * 3 + yield from zip(*args, strict=True) # type: ignore + + return sum(map(score, iter_3())) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 197c7060db63e4a167ee6c1ef7af1290bd4dcf4a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 4 Dec 2022 06:31:37 +0100 Subject: [PATCH 288/479] 2022: d04: ex1: add input --- 2022/d04/ex1/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2022/d04/ex1/input diff --git a/2022/d04/ex1/input b/2022/d04/ex1/input new file mode 100644 index 0000000..b52da37 --- /dev/null +++ b/2022/d04/ex1/input @@ -0,0 +1,1000 @@ +75-76,18-75 +2-54,1-50 +82-83,78-82 +13-37,37-75 +79-80,2-80 +29-90,30-89 +13-16,12-15 +20-93,20-94 +90-95,33-90 +16-77,76-92 +42-52,15-52 +6-34,9-89 +13-77,12-76 +18-81,17-81 +2-34,2-33 +17-92,20-93 +24-89,7-11 +6-49,27-49 +17-69,16-69 +34-57,35-58 +71-76,73-87 +69-72,70-72 +30-70,29-69 +48-85,52-84 +14-69,13-15 +2-61,3-70 +17-86,17-85 +7-98,8-98 +8-93,12-94 +16-35,35-49 +13-59,13-79 +5-95,4-95 +2-40,2-39 +16-44,22-60 +8-26,9-27 +48-89,88-91 +19-97,18-20 +10-81,9-9 +3-40,58-73 +2-93,92-92 +77-83,73-84 +7-84,6-6 +35-45,38-59 +28-79,57-74 +52-82,55-83 +60-60,9-60 +63-86,40-64 +44-80,13-26 +17-67,19-75 +33-69,5-68 +5-31,4-54 +81-82,64-81 +55-92,55-95 +28-29,29-82 +34-93,33-33 +88-95,62-88 +64-81,65-81 +81-82,64-81 +28-94,28-94 +9-76,6-75 +34-36,35-58 +86-89,12-89 +29-31,30-31 +46-78,83-87 +11-77,1-11 +27-34,37-68 +3-4,4-93 +7-89,89-90 +18-94,14-16 +28-89,10-88 +89-91,33-89 +17-53,17-52 +70-87,70-86 +1-33,1-86 +67-68,33-67 +13-75,14-27 +26-73,26-72 +28-57,17-19 +65-65,3-65 +5-92,28-29 +2-19,19-81 +29-42,29-37 +16-70,47-87 +5-77,1-2 +28-40,28-41 +98-98,10-98 +11-21,3-74 +4-32,5-31 +5-98,4-4 +23-99,22-97 +77-99,82-94 +8-91,9-91 +1-60,59-93 +9-11,10-37 +88-88,11-89 +71-89,48-70 +6-77,6-76 +82-91,84-90 +7-97,47-96 +54-64,54-67 +7-34,16-35 +5-97,4-97 +1-1,3-18 +42-51,42-45 +69-70,69-80 +16-86,16-88 +58-59,58-58 +56-86,57-57 +11-35,10-35 +15-20,37-98 +4-97,96-98 +32-34,32-34 +53-66,12-33 +65-65,3-66 +82-83,9-82 +5-59,2-5 +74-90,43-91 +34-86,35-87 +65-91,5-92 +7-86,8-87 +46-48,47-56 +87-92,8-83 +21-21,22-54 +50-97,50-93 +8-74,8-96 +45-46,46-57 +82-98,34-79 +29-62,29-55 +15-68,16-69 +26-88,37-88 +45-78,46-46 +60-65,60-61 +3-36,36-37 +55-84,56-91 +7-99,7-97 +2-98,1-99 +51-89,63-90 +4-99,3-99 +6-50,6-51 +37-98,62-98 +38-86,38-39 +1-96,1-95 +88-90,78-84 +44-61,4-45 +6-89,89-90 +7-93,19-93 +56-94,93-97 +5-25,13-28 +28-35,29-63 +62-70,63-76 +20-20,21-48 +13-48,45-72 +13-50,50-89 +25-79,25-78 +44-74,33-73 +87-87,62-87 +30-57,54-56 +30-64,20-65 +4-95,5-96 +22-54,13-88 +11-11,8-9 +66-84,67-83 +6-95,7-74 +36-84,23-36 +18-35,18-35 +96-97,42-96 +10-11,11-91 +9-96,95-98 +8-68,8-8 +15-18,13-20 +37-50,8-98 +9-10,10-98 +12-93,13-13 +6-79,7-79 +18-59,18-41 +25-52,41-53 +6-82,6-80 +74-74,6-74 +1-98,1-99 +51-94,93-98 +84-98,5-85 +26-35,23-35 +45-89,34-88 +36-78,37-37 +2-11,17-59 +20-96,20-97 +30-46,13-47 +15-86,15-88 +30-60,12-29 +82-97,12-82 +2-2,3-87 +60-89,59-87 +5-85,6-86 +16-84,15-16 +10-29,18-73 +64-93,65-99 +37-60,37-67 +2-98,1-96 +7-14,8-14 +29-64,29-29 +34-58,33-58 +1-97,2-97 +13-20,23-59 +64-64,65-76 +16-48,6-47 +81-90,81-89 +76-91,23-40 +22-46,21-46 +13-74,74-74 +34-35,18-34 +38-90,37-37 +34-61,36-61 +41-52,42-42 +3-12,3-87 +96-97,43-96 +97-98,4-96 +24-67,40-68 +13-31,4-23 +27-57,26-26 +3-84,84-85 +16-94,93-99 +16-16,17-74 +34-60,2-34 +17-98,17-30 +45-61,34-40 +12-17,11-14 +95-95,3-94 +48-69,11-68 +8-51,50-99 +44-80,44-76 +4-4,5-94 +31-47,30-55 +27-35,36-36 +3-57,3-98 +2-90,3-90 +22-79,22-80 +28-46,27-46 +1-1,3-30 +36-81,36-50 +19-40,19-41 +22-93,11-22 +32-58,31-58 +35-44,24-43 +1-8,1-80 +7-27,9-19 +78-90,14-78 +1-37,36-51 +32-36,30-37 +43-45,30-44 +65-80,66-79 +96-97,43-96 +62-94,61-92 +4-96,96-97 +15-75,14-76 +39-82,38-82 +3-95,3-57 +22-98,32-96 +2-93,3-93 +25-62,62-63 +6-58,57-87 +3-25,2-80 +50-54,51-52 +2-91,1-86 +97-98,38-97 +54-74,3-96 +6-31,31-87 +37-39,38-97 +8-55,8-42 +6-33,7-33 +18-96,81-97 +9-95,94-99 +6-13,5-46 +14-73,34-73 +7-94,7-89 +56-86,57-86 +12-53,11-53 +25-60,24-59 +39-75,28-28 +52-53,52-54 +6-35,12-34 +57-88,38-58 +57-58,7-58 +45-64,4-63 +26-84,3-80 +15-84,15-85 +16-89,17-89 +34-91,33-90 +24-67,94-95 +43-45,44-73 +29-65,66-74 +23-83,22-84 +2-99,1-99 +24-52,25-52 +4-6,5-87 +5-96,1-5 +5-18,24-31 +49-93,55-94 +11-94,43-95 +18-41,17-40 +86-88,85-87 +12-56,16-57 +45-71,45-54 +65-73,62-73 +93-93,61-92 +33-94,34-93 +7-62,14-62 +4-99,1-2 +6-69,1-1 +5-84,83-87 +6-82,93-99 +81-81,1-81 +2-81,1-74 +23-93,22-93 +9-11,3-3 +13-40,12-40 +10-87,9-94 +53-63,54-54 +25-72,45-71 +1-2,5-98 +63-67,23-64 +98-98,63-97 +63-87,50-58 +9-80,10-75 +1-1,3-40 +11-75,76-99 +32-98,33-97 +44-44,34-43 +49-52,33-51 +1-97,2-97 +82-82,82-82 +84-97,4-96 +1-95,13-96 +31-87,4-30 +15-40,5-7 +87-91,40-79 +6-99,5-99 +6-67,55-84 +56-94,83-99 +5-48,49-49 +14-25,24-35 +21-66,22-66 +93-96,94-95 +64-65,18-64 +69-96,68-84 +3-98,2-99 +3-95,2-95 +35-98,94-98 +19-28,29-88 +48-94,49-94 +29-47,29-35 +3-50,1-3 +1-4,1-61 +20-63,19-89 +11-96,11-50 +2-2,5-94 +76-97,76-95 +14-33,47-75 +88-91,12-87 +12-64,12-89 +4-84,3-84 +13-98,6-13 +65-75,64-75 +30-30,19-30 +99-99,39-99 +18-70,18-44 +1-31,1-42 +49-84,83-90 +94-95,54-94 +9-94,95-95 +69-69,68-94 +10-82,10-81 +98-99,63-93 +82-82,75-81 +59-66,25-64 +28-88,88-88 +50-81,81-98 +80-80,27-81 +11-95,10-72 +23-96,22-95 +15-73,14-73 +13-13,3-13 +29-77,29-71 +52-89,78-96 +6-52,25-53 +16-87,15-87 +37-85,63-86 +2-26,11-27 +27-48,28-28 +17-29,9-17 +21-70,21-76 +85-99,85-86 +47-77,48-77 +4-35,36-36 +92-96,58-92 +48-80,47-79 +4-29,82-90 +26-88,27-89 +37-92,36-38 +10-93,11-94 +72-72,17-73 +58-66,60-67 +19-46,19-19 +39-78,30-39 +61-99,39-60 +8-92,8-91 +7-83,5-7 +3-80,1-1 +90-99,5-91 +5-92,92-93 +6-88,6-89 +57-95,19-94 +30-76,31-31 +12-94,93-93 +35-49,36-49 +15-67,16-66 +88-91,63-89 +56-79,55-55 +1-5,4-12 +31-87,30-88 +72-79,73-80 +69-81,70-91 +20-42,43-43 +3-65,15-66 +46-46,45-72 +16-21,15-22 +98-99,34-97 +10-28,48-80 +1-97,3-98 +14-99,15-99 +25-25,25-75 +12-91,12-92 +94-98,11-79 +9-90,9-92 +50-54,49-51 +64-82,64-83 +8-10,9-59 +9-96,96-96 +1-17,23-86 +66-91,66-98 +3-93,2-82 +7-8,8-83 +24-28,25-28 +94-95,7-94 +38-86,38-93 +4-50,32-49 +7-61,61-88 +86-86,9-85 +10-94,7-10 +96-96,10-96 +13-67,40-68 +21-53,22-53 +12-38,13-39 +4-7,21-63 +26-90,91-96 +56-99,56-98 +19-20,18-19 +86-90,7-85 +18-59,18-32 +73-75,69-75 +24-77,25-77 +28-94,25-26 +17-79,79-80 +55-57,54-80 +8-22,8-22 +96-96,7-96 +51-63,53-63 +14-99,15-99 +20-98,20-97 +93-95,9-66 +79-93,78-79 +20-48,20-53 +43-81,44-82 +28-93,29-94 +1-28,28-29 +81-86,56-86 +30-86,89-89 +79-79,78-90 +87-93,27-62 +37-87,37-87 +95-96,4-95 +40-72,38-41 +67-80,48-79 +63-63,19-63 +3-98,16-99 +64-93,37-43 +8-85,16-83 +66-69,50-68 +11-87,12-86 +77-92,5-92 +99-99,96-98 +3-94,2-4 +29-97,28-96 +57-76,65-76 +58-75,58-63 +67-88,66-88 +77-88,57-86 +5-84,84-97 +10-71,8-70 +7-17,3-18 +42-89,43-89 +30-31,3-30 +42-87,41-43 +68-93,67-94 +3-85,3-86 +26-81,27-27 +82-99,74-83 +50-88,51-89 +7-9,11-81 +17-53,25-53 +5-95,5-99 +34-73,74-90 +34-40,35-40 +10-68,46-69 +28-96,95-98 +58-59,5-58 +1-99,2-99 +4-98,5-87 +3-96,2-98 +84-88,83-85 +11-96,10-97 +19-88,2-87 +19-72,23-51 +6-96,2-96 +18-64,14-16 +96-99,3-97 +75-91,13-75 +18-57,32-58 +17-33,17-37 +43-64,63-63 +97-97,14-84 +89-99,9-89 +63-85,64-85 +77-78,47-77 +20-21,1-16 +23-33,23-28 +58-90,59-67 +39-80,20-40 +15-46,3-15 +13-82,81-89 +1-4,9-92 +15-45,3-15 +18-78,12-12 +3-3,2-61 +1-9,1-3 +7-7,6-99 +5-35,4-34 +5-74,6-74 +18-55,17-55 +92-94,11-68 +27-97,27-83 +14-57,57-58 +25-69,26-36 +72-94,72-95 +4-80,4-94 +7-77,7-99 +42-91,42-92 +38-67,22-37 +40-93,40-87 +31-65,5-64 +34-96,96-97 +1-28,27-27 +12-63,13-13 +97-99,71-91 +17-69,16-68 +56-67,56-65 +5-68,6-68 +17-93,23-99 +8-14,7-14 +18-89,18-18 +3-38,39-62 +4-4,5-39 +27-85,84-84 +32-95,96-99 +7-68,17-67 +20-69,19-70 +92-92,32-91 +3-18,4-46 +13-94,13-94 +52-80,52-81 +29-87,3-86 +79-80,35-79 +23-67,47-68 +22-96,24-95 +7-68,4-4 +5-98,3-5 +84-89,84-99 +18-21,1-15 +41-85,40-85 +38-63,60-60 +43-89,43-43 +11-83,10-84 +43-61,11-43 +25-91,26-26 +23-23,22-95 +2-2,1-92 +79-94,9-79 +6-96,34-96 +58-75,57-67 +11-14,14-15 +20-93,19-21 +7-85,7-85 +19-56,20-55 +87-89,6-87 +90-90,2-91 +23-50,22-49 +78-92,22-77 +75-77,74-76 +81-90,81-94 +26-81,81-81 +12-58,41-90 +14-84,13-84 +38-89,39-90 +66-73,65-73 +8-75,8-63 +6-67,3-4 +2-69,3-68 +15-61,15-69 +57-75,57-76 +9-98,98-99 +6-6,20-67 +47-91,46-90 +26-96,26-97 +25-56,24-56 +28-53,27-53 +26-55,25-55 +25-68,26-68 +6-11,11-37 +24-27,25-25 +44-56,8-57 +29-30,29-98 +28-33,27-67 +7-17,7-11 +4-5,25-77 +33-35,34-75 +1-72,73-73 +10-92,92-93 +2-22,83-94 +4-97,96-99 +38-50,18-51 +39-42,41-41 +55-57,55-58 +19-89,36-88 +47-67,48-68 +83-90,83-85 +3-80,46-81 +22-92,48-61 +19-93,33-94 +2-3,1-72 +98-99,30-97 +35-54,54-54 +4-97,5-98 +7-90,8-91 +31-61,4-29 +14-18,15-25 +26-27,26-63 +26-26,9-26 +25-60,60-60 +66-97,63-96 +70-91,6-71 +21-88,22-22 +18-92,14-18 +11-87,4-7 +57-88,58-88 +37-81,3-44 +67-89,55-98 +25-91,24-90 +68-82,67-67 +70-72,43-71 +4-74,74-75 +18-83,9-19 +16-80,81-81 +3-75,2-74 +3-71,11-72 +38-55,7-38 +19-65,20-49 +17-98,16-18 +45-95,24-94 +11-16,15-89 +28-68,29-43 +26-26,25-48 +4-98,3-30 +9-95,95-96 +31-54,31-58 +31-43,30-30 +8-10,10-89 +2-15,1-90 +26-76,46-77 +63-91,62-91 +4-62,19-63 +36-88,36-87 +19-98,19-97 +2-98,98-98 +11-84,11-85 +26-29,6-28 +22-61,26-72 +38-56,38-57 +9-73,1-72 +24-73,23-73 +80-80,9-79 +31-33,32-96 +3-94,4-93 +26-26,25-83 +1-99,1-97 +7-94,7-99 +10-52,3-51 +39-47,42-47 +44-96,43-44 +3-94,2-94 +30-44,29-43 +60-99,60-92 +18-69,69-69 +20-32,1-20 +2-81,13-82 +16-75,9-16 +69-79,80-91 +12-90,12-15 +55-67,56-93 +17-45,3-17 +3-3,2-78 +12-27,28-28 +42-90,59-90 +30-96,31-98 +47-68,63-64 +1-97,2-97 +28-81,22-81 +10-88,1-88 +15-84,15-81 +67-72,68-68 +1-72,1-72 +90-91,86-90 +89-94,79-93 +92-98,15-92 +2-99,1-99 +1-99,99-99 +16-99,17-99 +11-17,17-95 +38-87,39-87 +24-47,28-46 +38-94,38-99 +58-85,59-67 +20-22,21-21 +82-88,59-87 +90-99,89-98 +12-21,20-91 +64-99,61-64 +6-43,5-44 +23-23,24-76 +4-95,3-3 +23-71,24-71 +39-47,38-38 +73-91,92-92 +23-93,87-96 +46-76,27-77 +78-79,65-78 +27-46,26-46 +77-82,83-85 +2-54,54-55 +1-3,6-99 +42-42,22-43 +7-96,8-96 +28-33,28-87 +1-31,1-85 +2-93,3-94 +4-96,2-96 +30-30,29-99 +30-39,30-30 +4-18,34-88 +68-69,68-87 +30-95,30-76 +10-63,10-99 +2-98,98-98 +12-37,11-11 +9-80,9-81 +37-37,38-83 +95-99,7-95 +3-26,60-98 +3-99,4-28 +5-95,6-95 +41-86,42-85 +72-95,39-94 +1-51,1-62 +3-95,95-96 +73-83,74-79 +93-97,93-96 +33-93,32-93 +22-40,21-39 +11-14,18-79 +96-97,58-95 +16-40,40-89 +1-88,2-88 +5-51,5-29 +20-48,31-49 +3-95,95-96 +23-89,23-90 +55-80,56-79 +43-43,42-59 +55-84,54-83 +13-76,76-77 +22-94,9-35 +23-96,68-91 +1-85,60-84 +27-27,11-27 +33-35,33-64 +9-77,10-10 +69-81,90-91 +16-95,16-96 +21-94,21-22 +7-95,3-94 +47-79,1-57 +5-39,5-39 +12-82,13-82 +70-70,63-70 +64-64,26-63 +2-4,4-94 +80-80,79-97 +38-75,37-38 +54-91,92-92 +63-83,63-65 +8-56,8-55 +98-98,27-97 +26-91,28-92 +24-85,20-72 +13-18,30-84 +29-67,29-68 +87-95,8-87 +13-26,11-41 +16-99,17-99 +16-98,17-98 +18-54,18-83 +63-80,64-87 +63-63,58-63 +37-91,37-85 +6-12,4-7 +6-58,30-59 +18-52,53-96 +17-61,17-75 +49-72,71-97 +11-69,11-36 +22-84,22-83 +1-64,1-65 +27-39,38-38 +48-49,49-88 +1-1,3-74 +55-92,55-98 +51-51,8-52 +2-26,1-26 +23-64,64-64 +57-82,57-81 +91-91,26-91 +6-97,41-98 +1-94,1-95 +56-83,16-99 +8-8,10-88 +38-43,6-42 +22-84,2-89 +14-76,72-88 +31-93,30-93 +72-92,73-92 +57-58,21-57 +4-94,6-94 +11-85,86-86 +9-61,8-61 +69-91,69-69 +27-77,77-78 +10-52,10-51 +9-9,8-49 +66-67,65-78 +2-90,2-98 +42-42,41-79 +3-86,3-42 +15-93,25-73 +26-94,27-95 +16-99,15-99 +1-1,3-65 +97-98,4-96 +25-87,26-97 +3-20,20-96 +32-81,32-80 +22-85,22-95 +4-96,97-98 +97-99,62-75 +87-99,46-87 +98-99,44-76 +26-93,26-33 +56-87,34-63 +1-91,95-98 +12-97,11-80 +19-36,19-91 +19-25,25-98 +99-99,7-92 +37-46,38-43 +73-75,73-78 +18-97,97-97 +4-98,4-94 +88-88,25-88 +95-95,4-95 +3-70,9-71 +20-54,19-21 +34-40,24-39 +3-3,2-95 +5-37,4-37 +5-81,5-80 +2-95,9-95 +12-87,13-13 +2-3,2-96 +19-63,19-94 +64-84,35-35 +8-96,5-95 +37-69,38-52 +91-98,12-92 +66-87,66-83 +36-58,20-57 +8-82,82-83 +11-71,13-70 +40-43,39-43 +1-73,1-1 +12-91,12-92 +73-97,41-57 +6-83,7-7 +20-36,19-41 +15-91,14-90 +18-51,13-50 +12-97,97-97 +1-89,89-89 +13-34,12-34 +46-52,46-79 +34-36,34-35 +22-76,76-76 +3-93,4-76 +34-35,22-34 +7-20,20-20 +16-47,2-27 +59-60,2-59 +96-99,37-94 +4-92,4-94 +12-30,8-29 +22-32,22-22 +1-99,2-98 +61-70,53-70 +45-96,46-96 +84-99,2-85 +1-2,1-99 +19-99,20-94 +77-86,86-88 +25-83,3-82 +6-70,5-70 +38-85,85-86 +55-83,55-84 +87-98,86-97 +29-31,29-74 +5-42,5-41 +21-99,21-77 +47-71,46-51 +33-51,50-50 +52-60,5-40 +28-94,29-29 +6-23,11-14 +31-33,32-48 +74-75,44-74 +84-96,84-96 +38-38,37-45 +53-90,92-94 +12-32,2-8 +39-70,38-70 +93-96,17-93 +43-60,33-37 +4-22,3-95 +1-89,2-90 +27-76,26-77 +34-71,57-71 +49-62,20-62 +48-97,2-95 +11-72,2-5 +72-72,72-92 +22-65,64-78 +24-96,24-25 +38-93,32-94 +70-71,59-70 +38-76,38-76 +31-50,30-50 +22-97,21-69 +22-79,24-80 +69-88,88-88 +47-48,46-87 +27-29,28-42 +24-24,25-71 +11-94,20-95 +1-10,29-85 +32-52,32-86 +15-72,73-93 +15-28,15-47 +14-64,15-64 +88-88,25-89 +80-80,15-80 +3-58,58-59 +19-96,95-99 +39-74,40-87 +64-71,71-72 +49-80,36-80 +61-79,49-78 From 742de9ade3ff04d21a0891af0b491bbdb66d082c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 4 Dec 2022 06:31:43 +0100 Subject: [PATCH 289/479] 2022: d04: ex1: add solution --- 2022/d04/ex1/ex1.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 2022/d04/ex1/ex1.py diff --git a/2022/d04/ex1/ex1.py b/2022/d04/ex1/ex1.py new file mode 100755 index 0000000..8ec60f6 --- /dev/null +++ b/2022/d04/ex1/ex1.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: list[str]) -> int: + def is_redundant(line: str) -> bool: + def assignment_to_set(elf: str) -> set[int]: + start, end = elf.split("-") + return set(range(int(start), int(end) + 1)) + + elf1, elf2 = map(assignment_to_set, line.split(",")) + return elf1.issubset(elf2) or elf2.issubset(elf1) + + return sum(map(is_redundant, input)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From affe5cd89b84921f6a2a4bfd553194d90ead1ca7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 4 Dec 2022 06:31:49 +0100 Subject: [PATCH 290/479] 2022: d04: ex2: add input --- 2022/d04/ex2/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2022/d04/ex2/input diff --git a/2022/d04/ex2/input b/2022/d04/ex2/input new file mode 100644 index 0000000..b52da37 --- /dev/null +++ b/2022/d04/ex2/input @@ -0,0 +1,1000 @@ +75-76,18-75 +2-54,1-50 +82-83,78-82 +13-37,37-75 +79-80,2-80 +29-90,30-89 +13-16,12-15 +20-93,20-94 +90-95,33-90 +16-77,76-92 +42-52,15-52 +6-34,9-89 +13-77,12-76 +18-81,17-81 +2-34,2-33 +17-92,20-93 +24-89,7-11 +6-49,27-49 +17-69,16-69 +34-57,35-58 +71-76,73-87 +69-72,70-72 +30-70,29-69 +48-85,52-84 +14-69,13-15 +2-61,3-70 +17-86,17-85 +7-98,8-98 +8-93,12-94 +16-35,35-49 +13-59,13-79 +5-95,4-95 +2-40,2-39 +16-44,22-60 +8-26,9-27 +48-89,88-91 +19-97,18-20 +10-81,9-9 +3-40,58-73 +2-93,92-92 +77-83,73-84 +7-84,6-6 +35-45,38-59 +28-79,57-74 +52-82,55-83 +60-60,9-60 +63-86,40-64 +44-80,13-26 +17-67,19-75 +33-69,5-68 +5-31,4-54 +81-82,64-81 +55-92,55-95 +28-29,29-82 +34-93,33-33 +88-95,62-88 +64-81,65-81 +81-82,64-81 +28-94,28-94 +9-76,6-75 +34-36,35-58 +86-89,12-89 +29-31,30-31 +46-78,83-87 +11-77,1-11 +27-34,37-68 +3-4,4-93 +7-89,89-90 +18-94,14-16 +28-89,10-88 +89-91,33-89 +17-53,17-52 +70-87,70-86 +1-33,1-86 +67-68,33-67 +13-75,14-27 +26-73,26-72 +28-57,17-19 +65-65,3-65 +5-92,28-29 +2-19,19-81 +29-42,29-37 +16-70,47-87 +5-77,1-2 +28-40,28-41 +98-98,10-98 +11-21,3-74 +4-32,5-31 +5-98,4-4 +23-99,22-97 +77-99,82-94 +8-91,9-91 +1-60,59-93 +9-11,10-37 +88-88,11-89 +71-89,48-70 +6-77,6-76 +82-91,84-90 +7-97,47-96 +54-64,54-67 +7-34,16-35 +5-97,4-97 +1-1,3-18 +42-51,42-45 +69-70,69-80 +16-86,16-88 +58-59,58-58 +56-86,57-57 +11-35,10-35 +15-20,37-98 +4-97,96-98 +32-34,32-34 +53-66,12-33 +65-65,3-66 +82-83,9-82 +5-59,2-5 +74-90,43-91 +34-86,35-87 +65-91,5-92 +7-86,8-87 +46-48,47-56 +87-92,8-83 +21-21,22-54 +50-97,50-93 +8-74,8-96 +45-46,46-57 +82-98,34-79 +29-62,29-55 +15-68,16-69 +26-88,37-88 +45-78,46-46 +60-65,60-61 +3-36,36-37 +55-84,56-91 +7-99,7-97 +2-98,1-99 +51-89,63-90 +4-99,3-99 +6-50,6-51 +37-98,62-98 +38-86,38-39 +1-96,1-95 +88-90,78-84 +44-61,4-45 +6-89,89-90 +7-93,19-93 +56-94,93-97 +5-25,13-28 +28-35,29-63 +62-70,63-76 +20-20,21-48 +13-48,45-72 +13-50,50-89 +25-79,25-78 +44-74,33-73 +87-87,62-87 +30-57,54-56 +30-64,20-65 +4-95,5-96 +22-54,13-88 +11-11,8-9 +66-84,67-83 +6-95,7-74 +36-84,23-36 +18-35,18-35 +96-97,42-96 +10-11,11-91 +9-96,95-98 +8-68,8-8 +15-18,13-20 +37-50,8-98 +9-10,10-98 +12-93,13-13 +6-79,7-79 +18-59,18-41 +25-52,41-53 +6-82,6-80 +74-74,6-74 +1-98,1-99 +51-94,93-98 +84-98,5-85 +26-35,23-35 +45-89,34-88 +36-78,37-37 +2-11,17-59 +20-96,20-97 +30-46,13-47 +15-86,15-88 +30-60,12-29 +82-97,12-82 +2-2,3-87 +60-89,59-87 +5-85,6-86 +16-84,15-16 +10-29,18-73 +64-93,65-99 +37-60,37-67 +2-98,1-96 +7-14,8-14 +29-64,29-29 +34-58,33-58 +1-97,2-97 +13-20,23-59 +64-64,65-76 +16-48,6-47 +81-90,81-89 +76-91,23-40 +22-46,21-46 +13-74,74-74 +34-35,18-34 +38-90,37-37 +34-61,36-61 +41-52,42-42 +3-12,3-87 +96-97,43-96 +97-98,4-96 +24-67,40-68 +13-31,4-23 +27-57,26-26 +3-84,84-85 +16-94,93-99 +16-16,17-74 +34-60,2-34 +17-98,17-30 +45-61,34-40 +12-17,11-14 +95-95,3-94 +48-69,11-68 +8-51,50-99 +44-80,44-76 +4-4,5-94 +31-47,30-55 +27-35,36-36 +3-57,3-98 +2-90,3-90 +22-79,22-80 +28-46,27-46 +1-1,3-30 +36-81,36-50 +19-40,19-41 +22-93,11-22 +32-58,31-58 +35-44,24-43 +1-8,1-80 +7-27,9-19 +78-90,14-78 +1-37,36-51 +32-36,30-37 +43-45,30-44 +65-80,66-79 +96-97,43-96 +62-94,61-92 +4-96,96-97 +15-75,14-76 +39-82,38-82 +3-95,3-57 +22-98,32-96 +2-93,3-93 +25-62,62-63 +6-58,57-87 +3-25,2-80 +50-54,51-52 +2-91,1-86 +97-98,38-97 +54-74,3-96 +6-31,31-87 +37-39,38-97 +8-55,8-42 +6-33,7-33 +18-96,81-97 +9-95,94-99 +6-13,5-46 +14-73,34-73 +7-94,7-89 +56-86,57-86 +12-53,11-53 +25-60,24-59 +39-75,28-28 +52-53,52-54 +6-35,12-34 +57-88,38-58 +57-58,7-58 +45-64,4-63 +26-84,3-80 +15-84,15-85 +16-89,17-89 +34-91,33-90 +24-67,94-95 +43-45,44-73 +29-65,66-74 +23-83,22-84 +2-99,1-99 +24-52,25-52 +4-6,5-87 +5-96,1-5 +5-18,24-31 +49-93,55-94 +11-94,43-95 +18-41,17-40 +86-88,85-87 +12-56,16-57 +45-71,45-54 +65-73,62-73 +93-93,61-92 +33-94,34-93 +7-62,14-62 +4-99,1-2 +6-69,1-1 +5-84,83-87 +6-82,93-99 +81-81,1-81 +2-81,1-74 +23-93,22-93 +9-11,3-3 +13-40,12-40 +10-87,9-94 +53-63,54-54 +25-72,45-71 +1-2,5-98 +63-67,23-64 +98-98,63-97 +63-87,50-58 +9-80,10-75 +1-1,3-40 +11-75,76-99 +32-98,33-97 +44-44,34-43 +49-52,33-51 +1-97,2-97 +82-82,82-82 +84-97,4-96 +1-95,13-96 +31-87,4-30 +15-40,5-7 +87-91,40-79 +6-99,5-99 +6-67,55-84 +56-94,83-99 +5-48,49-49 +14-25,24-35 +21-66,22-66 +93-96,94-95 +64-65,18-64 +69-96,68-84 +3-98,2-99 +3-95,2-95 +35-98,94-98 +19-28,29-88 +48-94,49-94 +29-47,29-35 +3-50,1-3 +1-4,1-61 +20-63,19-89 +11-96,11-50 +2-2,5-94 +76-97,76-95 +14-33,47-75 +88-91,12-87 +12-64,12-89 +4-84,3-84 +13-98,6-13 +65-75,64-75 +30-30,19-30 +99-99,39-99 +18-70,18-44 +1-31,1-42 +49-84,83-90 +94-95,54-94 +9-94,95-95 +69-69,68-94 +10-82,10-81 +98-99,63-93 +82-82,75-81 +59-66,25-64 +28-88,88-88 +50-81,81-98 +80-80,27-81 +11-95,10-72 +23-96,22-95 +15-73,14-73 +13-13,3-13 +29-77,29-71 +52-89,78-96 +6-52,25-53 +16-87,15-87 +37-85,63-86 +2-26,11-27 +27-48,28-28 +17-29,9-17 +21-70,21-76 +85-99,85-86 +47-77,48-77 +4-35,36-36 +92-96,58-92 +48-80,47-79 +4-29,82-90 +26-88,27-89 +37-92,36-38 +10-93,11-94 +72-72,17-73 +58-66,60-67 +19-46,19-19 +39-78,30-39 +61-99,39-60 +8-92,8-91 +7-83,5-7 +3-80,1-1 +90-99,5-91 +5-92,92-93 +6-88,6-89 +57-95,19-94 +30-76,31-31 +12-94,93-93 +35-49,36-49 +15-67,16-66 +88-91,63-89 +56-79,55-55 +1-5,4-12 +31-87,30-88 +72-79,73-80 +69-81,70-91 +20-42,43-43 +3-65,15-66 +46-46,45-72 +16-21,15-22 +98-99,34-97 +10-28,48-80 +1-97,3-98 +14-99,15-99 +25-25,25-75 +12-91,12-92 +94-98,11-79 +9-90,9-92 +50-54,49-51 +64-82,64-83 +8-10,9-59 +9-96,96-96 +1-17,23-86 +66-91,66-98 +3-93,2-82 +7-8,8-83 +24-28,25-28 +94-95,7-94 +38-86,38-93 +4-50,32-49 +7-61,61-88 +86-86,9-85 +10-94,7-10 +96-96,10-96 +13-67,40-68 +21-53,22-53 +12-38,13-39 +4-7,21-63 +26-90,91-96 +56-99,56-98 +19-20,18-19 +86-90,7-85 +18-59,18-32 +73-75,69-75 +24-77,25-77 +28-94,25-26 +17-79,79-80 +55-57,54-80 +8-22,8-22 +96-96,7-96 +51-63,53-63 +14-99,15-99 +20-98,20-97 +93-95,9-66 +79-93,78-79 +20-48,20-53 +43-81,44-82 +28-93,29-94 +1-28,28-29 +81-86,56-86 +30-86,89-89 +79-79,78-90 +87-93,27-62 +37-87,37-87 +95-96,4-95 +40-72,38-41 +67-80,48-79 +63-63,19-63 +3-98,16-99 +64-93,37-43 +8-85,16-83 +66-69,50-68 +11-87,12-86 +77-92,5-92 +99-99,96-98 +3-94,2-4 +29-97,28-96 +57-76,65-76 +58-75,58-63 +67-88,66-88 +77-88,57-86 +5-84,84-97 +10-71,8-70 +7-17,3-18 +42-89,43-89 +30-31,3-30 +42-87,41-43 +68-93,67-94 +3-85,3-86 +26-81,27-27 +82-99,74-83 +50-88,51-89 +7-9,11-81 +17-53,25-53 +5-95,5-99 +34-73,74-90 +34-40,35-40 +10-68,46-69 +28-96,95-98 +58-59,5-58 +1-99,2-99 +4-98,5-87 +3-96,2-98 +84-88,83-85 +11-96,10-97 +19-88,2-87 +19-72,23-51 +6-96,2-96 +18-64,14-16 +96-99,3-97 +75-91,13-75 +18-57,32-58 +17-33,17-37 +43-64,63-63 +97-97,14-84 +89-99,9-89 +63-85,64-85 +77-78,47-77 +20-21,1-16 +23-33,23-28 +58-90,59-67 +39-80,20-40 +15-46,3-15 +13-82,81-89 +1-4,9-92 +15-45,3-15 +18-78,12-12 +3-3,2-61 +1-9,1-3 +7-7,6-99 +5-35,4-34 +5-74,6-74 +18-55,17-55 +92-94,11-68 +27-97,27-83 +14-57,57-58 +25-69,26-36 +72-94,72-95 +4-80,4-94 +7-77,7-99 +42-91,42-92 +38-67,22-37 +40-93,40-87 +31-65,5-64 +34-96,96-97 +1-28,27-27 +12-63,13-13 +97-99,71-91 +17-69,16-68 +56-67,56-65 +5-68,6-68 +17-93,23-99 +8-14,7-14 +18-89,18-18 +3-38,39-62 +4-4,5-39 +27-85,84-84 +32-95,96-99 +7-68,17-67 +20-69,19-70 +92-92,32-91 +3-18,4-46 +13-94,13-94 +52-80,52-81 +29-87,3-86 +79-80,35-79 +23-67,47-68 +22-96,24-95 +7-68,4-4 +5-98,3-5 +84-89,84-99 +18-21,1-15 +41-85,40-85 +38-63,60-60 +43-89,43-43 +11-83,10-84 +43-61,11-43 +25-91,26-26 +23-23,22-95 +2-2,1-92 +79-94,9-79 +6-96,34-96 +58-75,57-67 +11-14,14-15 +20-93,19-21 +7-85,7-85 +19-56,20-55 +87-89,6-87 +90-90,2-91 +23-50,22-49 +78-92,22-77 +75-77,74-76 +81-90,81-94 +26-81,81-81 +12-58,41-90 +14-84,13-84 +38-89,39-90 +66-73,65-73 +8-75,8-63 +6-67,3-4 +2-69,3-68 +15-61,15-69 +57-75,57-76 +9-98,98-99 +6-6,20-67 +47-91,46-90 +26-96,26-97 +25-56,24-56 +28-53,27-53 +26-55,25-55 +25-68,26-68 +6-11,11-37 +24-27,25-25 +44-56,8-57 +29-30,29-98 +28-33,27-67 +7-17,7-11 +4-5,25-77 +33-35,34-75 +1-72,73-73 +10-92,92-93 +2-22,83-94 +4-97,96-99 +38-50,18-51 +39-42,41-41 +55-57,55-58 +19-89,36-88 +47-67,48-68 +83-90,83-85 +3-80,46-81 +22-92,48-61 +19-93,33-94 +2-3,1-72 +98-99,30-97 +35-54,54-54 +4-97,5-98 +7-90,8-91 +31-61,4-29 +14-18,15-25 +26-27,26-63 +26-26,9-26 +25-60,60-60 +66-97,63-96 +70-91,6-71 +21-88,22-22 +18-92,14-18 +11-87,4-7 +57-88,58-88 +37-81,3-44 +67-89,55-98 +25-91,24-90 +68-82,67-67 +70-72,43-71 +4-74,74-75 +18-83,9-19 +16-80,81-81 +3-75,2-74 +3-71,11-72 +38-55,7-38 +19-65,20-49 +17-98,16-18 +45-95,24-94 +11-16,15-89 +28-68,29-43 +26-26,25-48 +4-98,3-30 +9-95,95-96 +31-54,31-58 +31-43,30-30 +8-10,10-89 +2-15,1-90 +26-76,46-77 +63-91,62-91 +4-62,19-63 +36-88,36-87 +19-98,19-97 +2-98,98-98 +11-84,11-85 +26-29,6-28 +22-61,26-72 +38-56,38-57 +9-73,1-72 +24-73,23-73 +80-80,9-79 +31-33,32-96 +3-94,4-93 +26-26,25-83 +1-99,1-97 +7-94,7-99 +10-52,3-51 +39-47,42-47 +44-96,43-44 +3-94,2-94 +30-44,29-43 +60-99,60-92 +18-69,69-69 +20-32,1-20 +2-81,13-82 +16-75,9-16 +69-79,80-91 +12-90,12-15 +55-67,56-93 +17-45,3-17 +3-3,2-78 +12-27,28-28 +42-90,59-90 +30-96,31-98 +47-68,63-64 +1-97,2-97 +28-81,22-81 +10-88,1-88 +15-84,15-81 +67-72,68-68 +1-72,1-72 +90-91,86-90 +89-94,79-93 +92-98,15-92 +2-99,1-99 +1-99,99-99 +16-99,17-99 +11-17,17-95 +38-87,39-87 +24-47,28-46 +38-94,38-99 +58-85,59-67 +20-22,21-21 +82-88,59-87 +90-99,89-98 +12-21,20-91 +64-99,61-64 +6-43,5-44 +23-23,24-76 +4-95,3-3 +23-71,24-71 +39-47,38-38 +73-91,92-92 +23-93,87-96 +46-76,27-77 +78-79,65-78 +27-46,26-46 +77-82,83-85 +2-54,54-55 +1-3,6-99 +42-42,22-43 +7-96,8-96 +28-33,28-87 +1-31,1-85 +2-93,3-94 +4-96,2-96 +30-30,29-99 +30-39,30-30 +4-18,34-88 +68-69,68-87 +30-95,30-76 +10-63,10-99 +2-98,98-98 +12-37,11-11 +9-80,9-81 +37-37,38-83 +95-99,7-95 +3-26,60-98 +3-99,4-28 +5-95,6-95 +41-86,42-85 +72-95,39-94 +1-51,1-62 +3-95,95-96 +73-83,74-79 +93-97,93-96 +33-93,32-93 +22-40,21-39 +11-14,18-79 +96-97,58-95 +16-40,40-89 +1-88,2-88 +5-51,5-29 +20-48,31-49 +3-95,95-96 +23-89,23-90 +55-80,56-79 +43-43,42-59 +55-84,54-83 +13-76,76-77 +22-94,9-35 +23-96,68-91 +1-85,60-84 +27-27,11-27 +33-35,33-64 +9-77,10-10 +69-81,90-91 +16-95,16-96 +21-94,21-22 +7-95,3-94 +47-79,1-57 +5-39,5-39 +12-82,13-82 +70-70,63-70 +64-64,26-63 +2-4,4-94 +80-80,79-97 +38-75,37-38 +54-91,92-92 +63-83,63-65 +8-56,8-55 +98-98,27-97 +26-91,28-92 +24-85,20-72 +13-18,30-84 +29-67,29-68 +87-95,8-87 +13-26,11-41 +16-99,17-99 +16-98,17-98 +18-54,18-83 +63-80,64-87 +63-63,58-63 +37-91,37-85 +6-12,4-7 +6-58,30-59 +18-52,53-96 +17-61,17-75 +49-72,71-97 +11-69,11-36 +22-84,22-83 +1-64,1-65 +27-39,38-38 +48-49,49-88 +1-1,3-74 +55-92,55-98 +51-51,8-52 +2-26,1-26 +23-64,64-64 +57-82,57-81 +91-91,26-91 +6-97,41-98 +1-94,1-95 +56-83,16-99 +8-8,10-88 +38-43,6-42 +22-84,2-89 +14-76,72-88 +31-93,30-93 +72-92,73-92 +57-58,21-57 +4-94,6-94 +11-85,86-86 +9-61,8-61 +69-91,69-69 +27-77,77-78 +10-52,10-51 +9-9,8-49 +66-67,65-78 +2-90,2-98 +42-42,41-79 +3-86,3-42 +15-93,25-73 +26-94,27-95 +16-99,15-99 +1-1,3-65 +97-98,4-96 +25-87,26-97 +3-20,20-96 +32-81,32-80 +22-85,22-95 +4-96,97-98 +97-99,62-75 +87-99,46-87 +98-99,44-76 +26-93,26-33 +56-87,34-63 +1-91,95-98 +12-97,11-80 +19-36,19-91 +19-25,25-98 +99-99,7-92 +37-46,38-43 +73-75,73-78 +18-97,97-97 +4-98,4-94 +88-88,25-88 +95-95,4-95 +3-70,9-71 +20-54,19-21 +34-40,24-39 +3-3,2-95 +5-37,4-37 +5-81,5-80 +2-95,9-95 +12-87,13-13 +2-3,2-96 +19-63,19-94 +64-84,35-35 +8-96,5-95 +37-69,38-52 +91-98,12-92 +66-87,66-83 +36-58,20-57 +8-82,82-83 +11-71,13-70 +40-43,39-43 +1-73,1-1 +12-91,12-92 +73-97,41-57 +6-83,7-7 +20-36,19-41 +15-91,14-90 +18-51,13-50 +12-97,97-97 +1-89,89-89 +13-34,12-34 +46-52,46-79 +34-36,34-35 +22-76,76-76 +3-93,4-76 +34-35,22-34 +7-20,20-20 +16-47,2-27 +59-60,2-59 +96-99,37-94 +4-92,4-94 +12-30,8-29 +22-32,22-22 +1-99,2-98 +61-70,53-70 +45-96,46-96 +84-99,2-85 +1-2,1-99 +19-99,20-94 +77-86,86-88 +25-83,3-82 +6-70,5-70 +38-85,85-86 +55-83,55-84 +87-98,86-97 +29-31,29-74 +5-42,5-41 +21-99,21-77 +47-71,46-51 +33-51,50-50 +52-60,5-40 +28-94,29-29 +6-23,11-14 +31-33,32-48 +74-75,44-74 +84-96,84-96 +38-38,37-45 +53-90,92-94 +12-32,2-8 +39-70,38-70 +93-96,17-93 +43-60,33-37 +4-22,3-95 +1-89,2-90 +27-76,26-77 +34-71,57-71 +49-62,20-62 +48-97,2-95 +11-72,2-5 +72-72,72-92 +22-65,64-78 +24-96,24-25 +38-93,32-94 +70-71,59-70 +38-76,38-76 +31-50,30-50 +22-97,21-69 +22-79,24-80 +69-88,88-88 +47-48,46-87 +27-29,28-42 +24-24,25-71 +11-94,20-95 +1-10,29-85 +32-52,32-86 +15-72,73-93 +15-28,15-47 +14-64,15-64 +88-88,25-89 +80-80,15-80 +3-58,58-59 +19-96,95-99 +39-74,40-87 +64-71,71-72 +49-80,36-80 +61-79,49-78 From 64a9d16216eea7125d03b60e31372c5e38f797d7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 4 Dec 2022 06:31:58 +0100 Subject: [PATCH 291/479] 2022: d04: ex2: add solution --- 2022/d04/ex2/ex2.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 2022/d04/ex2/ex2.py diff --git a/2022/d04/ex2/ex2.py b/2022/d04/ex2/ex2.py new file mode 100755 index 0000000..1b0049c --- /dev/null +++ b/2022/d04/ex2/ex2.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: list[str]) -> int: + def is_overlapping(line: str) -> bool: + def assignment_to_set(elf: str) -> set[int]: + start, end = elf.split("-") + return set(range(int(start), int(end) + 1)) + + elf1, elf2 = map(assignment_to_set, line.split(",")) + return bool(elf1 & elf2) + + return sum(map(is_overlapping, input)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 157522996ffc581dbc0dd64940d7274f8c6eab1a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 5 Dec 2022 08:25:51 +0100 Subject: [PATCH 292/479] 2022: d05: ex1: add input --- 2022/d05/ex1/input | 512 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 512 insertions(+) create mode 100644 2022/d05/ex1/input diff --git a/2022/d05/ex1/input b/2022/d05/ex1/input new file mode 100644 index 0000000..7d3e974 --- /dev/null +++ b/2022/d05/ex1/input @@ -0,0 +1,512 @@ +[W] [V] [P] +[B] [T] [C] [B] [G] +[G] [S] [V] [H] [N] [T] +[Z] [B] [W] [J] [D] [M] [S] +[R] [C] [N] [N] [F] [W] [C] [W] +[D] [F] [S] [M] [L] [T] [L] [Z] [Z] +[C] [W] [B] [G] [S] [V] [F] [D] [N] +[V] [G] [C] [Q] [T] [J] [P] [B] [M] + 1 2 3 4 5 6 7 8 9 + +move 2 from 8 to 4 +move 2 from 7 to 3 +move 2 from 9 to 2 +move 4 from 1 to 9 +move 1 from 7 to 8 +move 1 from 9 to 6 +move 6 from 6 to 1 +move 6 from 1 to 6 +move 2 from 7 to 1 +move 9 from 4 to 1 +move 6 from 2 to 7 +move 5 from 9 to 7 +move 7 from 3 to 7 +move 19 from 7 to 9 +move 1 from 7 to 1 +move 3 from 6 to 8 +move 4 from 5 to 6 +move 1 from 4 to 1 +move 2 from 5 to 2 +move 8 from 9 to 7 +move 1 from 5 to 1 +move 3 from 9 to 4 +move 1 from 4 to 9 +move 2 from 4 to 7 +move 1 from 7 to 6 +move 3 from 8 to 9 +move 17 from 1 to 7 +move 21 from 7 to 3 +move 4 from 6 to 2 +move 1 from 7 to 2 +move 8 from 9 to 2 +move 2 from 8 to 3 +move 1 from 1 to 7 +move 2 from 7 to 9 +move 1 from 6 to 1 +move 1 from 7 to 4 +move 1 from 1 to 2 +move 4 from 6 to 1 +move 1 from 9 to 2 +move 1 from 7 to 9 +move 1 from 4 to 1 +move 7 from 3 to 7 +move 6 from 2 to 8 +move 3 from 3 to 4 +move 1 from 8 to 4 +move 12 from 2 to 8 +move 2 from 9 to 2 +move 12 from 3 to 2 +move 12 from 8 to 6 +move 3 from 4 to 2 +move 19 from 2 to 8 +move 4 from 1 to 9 +move 1 from 3 to 8 +move 1 from 4 to 6 +move 1 from 2 to 4 +move 1 from 6 to 3 +move 8 from 9 to 6 +move 1 from 4 to 9 +move 1 from 3 to 1 +move 1 from 9 to 5 +move 11 from 6 to 3 +move 5 from 8 to 6 +move 14 from 6 to 9 +move 2 from 1 to 4 +move 3 from 8 to 1 +move 8 from 8 to 4 +move 3 from 3 to 4 +move 8 from 3 to 1 +move 9 from 8 to 2 +move 12 from 4 to 2 +move 12 from 9 to 3 +move 9 from 3 to 4 +move 1 from 5 to 3 +move 7 from 7 to 1 +move 2 from 9 to 1 +move 2 from 4 to 6 +move 16 from 2 to 6 +move 1 from 2 to 8 +move 10 from 1 to 4 +move 1 from 8 to 2 +move 4 from 1 to 6 +move 15 from 4 to 8 +move 1 from 4 to 2 +move 2 from 6 to 8 +move 5 from 2 to 8 +move 21 from 8 to 3 +move 6 from 1 to 3 +move 15 from 6 to 1 +move 1 from 2 to 1 +move 1 from 8 to 9 +move 15 from 1 to 3 +move 7 from 3 to 8 +move 1 from 7 to 9 +move 2 from 9 to 8 +move 2 from 3 to 7 +move 4 from 6 to 1 +move 2 from 7 to 8 +move 1 from 6 to 2 +move 4 from 8 to 3 +move 2 from 4 to 8 +move 1 from 2 to 1 +move 4 from 1 to 5 +move 3 from 5 to 8 +move 1 from 5 to 1 +move 12 from 8 to 3 +move 3 from 1 to 2 +move 17 from 3 to 5 +move 2 from 5 to 3 +move 15 from 5 to 1 +move 1 from 1 to 4 +move 17 from 3 to 2 +move 5 from 2 to 8 +move 17 from 3 to 6 +move 6 from 1 to 3 +move 5 from 1 to 6 +move 4 from 8 to 9 +move 10 from 3 to 8 +move 7 from 2 to 9 +move 2 from 6 to 3 +move 2 from 2 to 8 +move 1 from 1 to 4 +move 17 from 6 to 9 +move 13 from 8 to 2 +move 2 from 4 to 1 +move 1 from 6 to 7 +move 2 from 2 to 4 +move 8 from 2 to 7 +move 1 from 6 to 1 +move 4 from 7 to 9 +move 1 from 4 to 7 +move 1 from 4 to 6 +move 1 from 1 to 7 +move 5 from 2 to 4 +move 2 from 3 to 8 +move 6 from 7 to 1 +move 1 from 7 to 4 +move 11 from 9 to 7 +move 1 from 8 to 4 +move 8 from 1 to 2 +move 1 from 1 to 4 +move 1 from 1 to 9 +move 1 from 6 to 1 +move 1 from 8 to 4 +move 6 from 2 to 3 +move 1 from 1 to 3 +move 1 from 6 to 7 +move 1 from 4 to 6 +move 6 from 2 to 5 +move 7 from 3 to 4 +move 2 from 7 to 6 +move 2 from 7 to 3 +move 8 from 7 to 5 +move 3 from 6 to 7 +move 1 from 5 to 7 +move 1 from 7 to 5 +move 13 from 9 to 3 +move 1 from 3 to 8 +move 8 from 4 to 3 +move 3 from 5 to 1 +move 7 from 4 to 1 +move 5 from 1 to 4 +move 3 from 1 to 4 +move 2 from 1 to 8 +move 2 from 7 to 5 +move 2 from 8 to 9 +move 1 from 7 to 6 +move 1 from 8 to 7 +move 4 from 5 to 1 +move 1 from 7 to 2 +move 2 from 1 to 8 +move 1 from 2 to 1 +move 5 from 9 to 7 +move 3 from 9 to 4 +move 8 from 4 to 8 +move 6 from 8 to 5 +move 11 from 5 to 1 +move 3 from 4 to 2 +move 9 from 3 to 7 +move 6 from 7 to 2 +move 13 from 3 to 2 +move 3 from 8 to 1 +move 2 from 2 to 8 +move 1 from 6 to 7 +move 3 from 8 to 4 +move 9 from 1 to 5 +move 5 from 5 to 8 +move 2 from 8 to 4 +move 3 from 9 to 4 +move 2 from 8 to 2 +move 8 from 1 to 5 +move 8 from 7 to 9 +move 1 from 8 to 3 +move 15 from 5 to 9 +move 6 from 4 to 1 +move 1 from 7 to 2 +move 4 from 2 to 1 +move 1 from 3 to 4 +move 5 from 1 to 7 +move 3 from 7 to 3 +move 14 from 9 to 8 +move 1 from 4 to 8 +move 1 from 7 to 6 +move 2 from 4 to 5 +move 4 from 1 to 5 +move 1 from 6 to 5 +move 4 from 9 to 3 +move 5 from 3 to 7 +move 4 from 5 to 9 +move 1 from 3 to 7 +move 1 from 3 to 2 +move 4 from 5 to 2 +move 4 from 7 to 5 +move 4 from 2 to 1 +move 1 from 5 to 4 +move 7 from 9 to 7 +move 1 from 4 to 2 +move 1 from 5 to 8 +move 21 from 2 to 4 +move 1 from 9 to 8 +move 1 from 9 to 4 +move 3 from 4 to 1 +move 7 from 1 to 6 +move 1 from 5 to 1 +move 18 from 4 to 7 +move 1 from 5 to 8 +move 27 from 7 to 8 +move 1 from 7 to 3 +move 1 from 3 to 7 +move 1 from 7 to 2 +move 1 from 2 to 1 +move 42 from 8 to 9 +move 1 from 8 to 7 +move 1 from 8 to 2 +move 1 from 4 to 6 +move 1 from 2 to 9 +move 2 from 1 to 2 +move 1 from 7 to 3 +move 7 from 6 to 4 +move 4 from 9 to 6 +move 1 from 3 to 2 +move 1 from 2 to 7 +move 2 from 2 to 5 +move 1 from 8 to 4 +move 1 from 9 to 3 +move 5 from 4 to 7 +move 1 from 5 to 6 +move 1 from 5 to 9 +move 1 from 6 to 3 +move 1 from 7 to 5 +move 2 from 3 to 2 +move 22 from 9 to 7 +move 2 from 2 to 3 +move 18 from 7 to 9 +move 1 from 4 to 9 +move 1 from 1 to 4 +move 4 from 7 to 3 +move 4 from 3 to 2 +move 3 from 4 to 5 +move 1 from 2 to 4 +move 5 from 6 to 9 +move 1 from 5 to 3 +move 1 from 4 to 7 +move 2 from 5 to 1 +move 3 from 2 to 4 +move 1 from 5 to 6 +move 2 from 7 to 9 +move 1 from 6 to 8 +move 2 from 3 to 2 +move 2 from 4 to 7 +move 1 from 8 to 7 +move 1 from 4 to 6 +move 35 from 9 to 7 +move 13 from 7 to 3 +move 1 from 2 to 7 +move 1 from 2 to 5 +move 1 from 5 to 8 +move 1 from 8 to 5 +move 8 from 7 to 3 +move 1 from 6 to 4 +move 6 from 3 to 9 +move 1 from 1 to 9 +move 1 from 4 to 1 +move 14 from 9 to 8 +move 1 from 5 to 7 +move 16 from 3 to 2 +move 2 from 1 to 2 +move 1 from 9 to 2 +move 1 from 8 to 1 +move 1 from 1 to 3 +move 7 from 2 to 9 +move 6 from 9 to 8 +move 1 from 3 to 4 +move 3 from 7 to 6 +move 2 from 2 to 1 +move 1 from 4 to 7 +move 2 from 2 to 5 +move 1 from 9 to 6 +move 2 from 2 to 5 +move 2 from 6 to 2 +move 4 from 5 to 4 +move 5 from 2 to 6 +move 1 from 1 to 7 +move 1 from 1 to 2 +move 13 from 8 to 1 +move 2 from 8 to 4 +move 19 from 7 to 4 +move 3 from 1 to 6 +move 11 from 4 to 3 +move 2 from 7 to 9 +move 4 from 2 to 5 +move 2 from 9 to 5 +move 1 from 7 to 4 +move 2 from 5 to 7 +move 4 from 3 to 4 +move 3 from 4 to 1 +move 3 from 5 to 1 +move 9 from 6 to 4 +move 1 from 7 to 9 +move 1 from 7 to 5 +move 10 from 1 to 4 +move 1 from 9 to 6 +move 1 from 6 to 8 +move 32 from 4 to 5 +move 7 from 5 to 4 +move 27 from 5 to 9 +move 5 from 3 to 2 +move 3 from 2 to 8 +move 1 from 6 to 2 +move 8 from 4 to 9 +move 1 from 2 to 9 +move 8 from 8 to 6 +move 2 from 4 to 3 +move 1 from 2 to 3 +move 15 from 9 to 8 +move 4 from 1 to 4 +move 3 from 4 to 8 +move 6 from 9 to 7 +move 1 from 4 to 9 +move 8 from 8 to 2 +move 2 from 1 to 9 +move 2 from 7 to 9 +move 10 from 8 to 3 +move 6 from 2 to 6 +move 2 from 3 to 2 +move 6 from 6 to 3 +move 1 from 7 to 5 +move 8 from 3 to 2 +move 4 from 3 to 2 +move 1 from 3 to 5 +move 6 from 6 to 1 +move 4 from 3 to 7 +move 2 from 5 to 8 +move 3 from 7 to 5 +move 6 from 1 to 7 +move 1 from 3 to 4 +move 1 from 3 to 9 +move 10 from 7 to 4 +move 8 from 2 to 8 +move 11 from 9 to 5 +move 11 from 4 to 1 +move 5 from 2 to 6 +move 3 from 2 to 7 +move 11 from 1 to 6 +move 1 from 5 to 6 +move 8 from 5 to 4 +move 19 from 6 to 7 +move 3 from 7 to 9 +move 3 from 5 to 4 +move 1 from 2 to 5 +move 3 from 5 to 7 +move 8 from 9 to 6 +move 2 from 4 to 1 +move 1 from 1 to 9 +move 2 from 9 to 7 +move 6 from 6 to 2 +move 2 from 4 to 6 +move 4 from 8 to 6 +move 1 from 8 to 1 +move 7 from 6 to 7 +move 1 from 9 to 4 +move 5 from 8 to 4 +move 3 from 2 to 6 +move 4 from 6 to 4 +move 2 from 9 to 6 +move 3 from 2 to 9 +move 16 from 4 to 8 +move 1 from 6 to 8 +move 2 from 9 to 5 +move 1 from 9 to 7 +move 2 from 5 to 2 +move 1 from 4 to 6 +move 2 from 2 to 5 +move 1 from 9 to 6 +move 3 from 7 to 3 +move 7 from 7 to 8 +move 2 from 7 to 1 +move 3 from 8 to 5 +move 3 from 6 to 2 +move 4 from 7 to 4 +move 1 from 5 to 1 +move 1 from 5 to 7 +move 3 from 3 to 4 +move 5 from 1 to 4 +move 16 from 7 to 2 +move 5 from 4 to 7 +move 19 from 8 to 1 +move 11 from 2 to 9 +move 11 from 9 to 6 +move 2 from 1 to 6 +move 2 from 4 to 1 +move 5 from 4 to 6 +move 1 from 5 to 9 +move 1 from 9 to 6 +move 2 from 2 to 6 +move 1 from 5 to 4 +move 8 from 6 to 5 +move 16 from 1 to 6 +move 1 from 4 to 9 +move 3 from 2 to 9 +move 2 from 2 to 5 +move 2 from 5 to 8 +move 4 from 8 to 4 +move 4 from 9 to 7 +move 2 from 1 to 3 +move 5 from 6 to 4 +move 21 from 6 to 2 +move 9 from 7 to 3 +move 1 from 1 to 2 +move 1 from 5 to 3 +move 23 from 2 to 7 +move 1 from 7 to 5 +move 3 from 6 to 1 +move 9 from 4 to 5 +move 11 from 7 to 1 +move 2 from 3 to 4 +move 1 from 3 to 7 +move 1 from 4 to 1 +move 10 from 1 to 6 +move 5 from 7 to 1 +move 3 from 1 to 4 +move 7 from 1 to 7 +move 4 from 3 to 8 +move 4 from 7 to 4 +move 5 from 7 to 3 +move 2 from 4 to 9 +move 1 from 8 to 1 +move 4 from 4 to 1 +move 1 from 6 to 1 +move 1 from 6 to 5 +move 16 from 5 to 1 +move 2 from 5 to 7 +move 1 from 5 to 6 +move 2 from 8 to 2 +move 1 from 7 to 9 +move 3 from 9 to 5 +move 2 from 5 to 4 +move 6 from 7 to 1 +move 3 from 4 to 7 +move 1 from 8 to 6 +move 5 from 1 to 4 +move 1 from 6 to 1 +move 19 from 1 to 5 +move 1 from 7 to 6 +move 9 from 3 to 1 +move 6 from 6 to 5 +move 4 from 6 to 9 +move 3 from 9 to 4 +move 13 from 1 to 4 +move 1 from 3 to 1 +move 2 from 5 to 1 +move 1 from 2 to 3 +move 1 from 3 to 9 +move 4 from 5 to 4 +move 1 from 2 to 3 +move 1 from 3 to 5 +move 1 from 9 to 1 +move 1 from 9 to 5 +move 19 from 4 to 7 +move 4 from 1 to 6 +move 5 from 4 to 3 +move 3 from 6 to 1 +move 1 from 6 to 8 +move 2 from 1 to 6 +move 2 from 1 to 7 +move 2 from 6 to 3 +move 2 from 3 to 1 +move 8 from 7 to 6 +move 5 from 3 to 9 +move 2 from 4 to 9 +move 2 from 6 to 8 +move 10 from 7 to 2 +move 7 from 2 to 9 +move 1 from 8 to 9 +move 1 from 1 to 2 +move 2 from 9 to 3 +move 2 from 8 to 7 +move 1 from 1 to 6 +move 1 from 2 to 8 +move 2 from 2 to 5 +move 4 from 5 to 7 +move 5 from 6 to 1 +move 1 from 3 to 4 From 624ccdd8636e76dc37c45df3e84fbd9f952ba56d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 5 Dec 2022 08:26:01 +0100 Subject: [PATCH 293/479] 2022: d05: ex1: add solution --- 2022/d05/ex1/ex1.py | 55 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100755 2022/d05/ex1/ex1.py diff --git a/2022/d05/ex1/ex1.py b/2022/d05/ex1/ex1.py new file mode 100755 index 0000000..f4a50b8 --- /dev/null +++ b/2022/d05/ex1/ex1.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +import dataclasses +import sys + +Stack = list[str] + + +@dataclasses.dataclass +class Instruction: + n: int + start: int + end: int + + @classmethod + def from_input(cls, input: str) -> "Instruction": + words = input.split() + return Instruction(int(words[1]), int(words[3]) - 1, int(words[5]) - 1) + + +def parse(input: list[str]) -> tuple[list[Stack], list[Instruction]]: + def parse_stacks(input: list[str]) -> list[Stack]: + stacks: list[Stack] = [[] for _ in range(1, len(input[-1]), 4)] + for line in reversed(input[:-1]): + for stack, i in enumerate(range(1, len(line), 4)): + c = line[i] + if c == " ": + continue + stacks[stack].append(c) + return stacks + + def parse_instructions(input: list[str]) -> list[Instruction]: + return list(map(Instruction.from_input, input)) + + empty_line = input.index("") + + return parse_stacks(input[:empty_line]), parse_instructions(input[empty_line + 1 :]) + + +def solve(input: list[str]) -> str: + stacks, instructions = parse(input) + for instr in instructions: + start, end = stacks[instr.start], stacks[instr.end] + items = (start.pop() for _ in range(instr.n)) + end.extend(items) + return "".join(stack[-1] for stack in stacks if stack) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 50dfee46e6ce720eec03c24fd861e1b426ba8bab Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 5 Dec 2022 08:26:09 +0100 Subject: [PATCH 294/479] 2022: d05: ex2: add input --- 2022/d05/ex2/input | 512 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 512 insertions(+) create mode 100644 2022/d05/ex2/input diff --git a/2022/d05/ex2/input b/2022/d05/ex2/input new file mode 100644 index 0000000..7d3e974 --- /dev/null +++ b/2022/d05/ex2/input @@ -0,0 +1,512 @@ +[W] [V] [P] +[B] [T] [C] [B] [G] +[G] [S] [V] [H] [N] [T] +[Z] [B] [W] [J] [D] [M] [S] +[R] [C] [N] [N] [F] [W] [C] [W] +[D] [F] [S] [M] [L] [T] [L] [Z] [Z] +[C] [W] [B] [G] [S] [V] [F] [D] [N] +[V] [G] [C] [Q] [T] [J] [P] [B] [M] + 1 2 3 4 5 6 7 8 9 + +move 2 from 8 to 4 +move 2 from 7 to 3 +move 2 from 9 to 2 +move 4 from 1 to 9 +move 1 from 7 to 8 +move 1 from 9 to 6 +move 6 from 6 to 1 +move 6 from 1 to 6 +move 2 from 7 to 1 +move 9 from 4 to 1 +move 6 from 2 to 7 +move 5 from 9 to 7 +move 7 from 3 to 7 +move 19 from 7 to 9 +move 1 from 7 to 1 +move 3 from 6 to 8 +move 4 from 5 to 6 +move 1 from 4 to 1 +move 2 from 5 to 2 +move 8 from 9 to 7 +move 1 from 5 to 1 +move 3 from 9 to 4 +move 1 from 4 to 9 +move 2 from 4 to 7 +move 1 from 7 to 6 +move 3 from 8 to 9 +move 17 from 1 to 7 +move 21 from 7 to 3 +move 4 from 6 to 2 +move 1 from 7 to 2 +move 8 from 9 to 2 +move 2 from 8 to 3 +move 1 from 1 to 7 +move 2 from 7 to 9 +move 1 from 6 to 1 +move 1 from 7 to 4 +move 1 from 1 to 2 +move 4 from 6 to 1 +move 1 from 9 to 2 +move 1 from 7 to 9 +move 1 from 4 to 1 +move 7 from 3 to 7 +move 6 from 2 to 8 +move 3 from 3 to 4 +move 1 from 8 to 4 +move 12 from 2 to 8 +move 2 from 9 to 2 +move 12 from 3 to 2 +move 12 from 8 to 6 +move 3 from 4 to 2 +move 19 from 2 to 8 +move 4 from 1 to 9 +move 1 from 3 to 8 +move 1 from 4 to 6 +move 1 from 2 to 4 +move 1 from 6 to 3 +move 8 from 9 to 6 +move 1 from 4 to 9 +move 1 from 3 to 1 +move 1 from 9 to 5 +move 11 from 6 to 3 +move 5 from 8 to 6 +move 14 from 6 to 9 +move 2 from 1 to 4 +move 3 from 8 to 1 +move 8 from 8 to 4 +move 3 from 3 to 4 +move 8 from 3 to 1 +move 9 from 8 to 2 +move 12 from 4 to 2 +move 12 from 9 to 3 +move 9 from 3 to 4 +move 1 from 5 to 3 +move 7 from 7 to 1 +move 2 from 9 to 1 +move 2 from 4 to 6 +move 16 from 2 to 6 +move 1 from 2 to 8 +move 10 from 1 to 4 +move 1 from 8 to 2 +move 4 from 1 to 6 +move 15 from 4 to 8 +move 1 from 4 to 2 +move 2 from 6 to 8 +move 5 from 2 to 8 +move 21 from 8 to 3 +move 6 from 1 to 3 +move 15 from 6 to 1 +move 1 from 2 to 1 +move 1 from 8 to 9 +move 15 from 1 to 3 +move 7 from 3 to 8 +move 1 from 7 to 9 +move 2 from 9 to 8 +move 2 from 3 to 7 +move 4 from 6 to 1 +move 2 from 7 to 8 +move 1 from 6 to 2 +move 4 from 8 to 3 +move 2 from 4 to 8 +move 1 from 2 to 1 +move 4 from 1 to 5 +move 3 from 5 to 8 +move 1 from 5 to 1 +move 12 from 8 to 3 +move 3 from 1 to 2 +move 17 from 3 to 5 +move 2 from 5 to 3 +move 15 from 5 to 1 +move 1 from 1 to 4 +move 17 from 3 to 2 +move 5 from 2 to 8 +move 17 from 3 to 6 +move 6 from 1 to 3 +move 5 from 1 to 6 +move 4 from 8 to 9 +move 10 from 3 to 8 +move 7 from 2 to 9 +move 2 from 6 to 3 +move 2 from 2 to 8 +move 1 from 1 to 4 +move 17 from 6 to 9 +move 13 from 8 to 2 +move 2 from 4 to 1 +move 1 from 6 to 7 +move 2 from 2 to 4 +move 8 from 2 to 7 +move 1 from 6 to 1 +move 4 from 7 to 9 +move 1 from 4 to 7 +move 1 from 4 to 6 +move 1 from 1 to 7 +move 5 from 2 to 4 +move 2 from 3 to 8 +move 6 from 7 to 1 +move 1 from 7 to 4 +move 11 from 9 to 7 +move 1 from 8 to 4 +move 8 from 1 to 2 +move 1 from 1 to 4 +move 1 from 1 to 9 +move 1 from 6 to 1 +move 1 from 8 to 4 +move 6 from 2 to 3 +move 1 from 1 to 3 +move 1 from 6 to 7 +move 1 from 4 to 6 +move 6 from 2 to 5 +move 7 from 3 to 4 +move 2 from 7 to 6 +move 2 from 7 to 3 +move 8 from 7 to 5 +move 3 from 6 to 7 +move 1 from 5 to 7 +move 1 from 7 to 5 +move 13 from 9 to 3 +move 1 from 3 to 8 +move 8 from 4 to 3 +move 3 from 5 to 1 +move 7 from 4 to 1 +move 5 from 1 to 4 +move 3 from 1 to 4 +move 2 from 1 to 8 +move 2 from 7 to 5 +move 2 from 8 to 9 +move 1 from 7 to 6 +move 1 from 8 to 7 +move 4 from 5 to 1 +move 1 from 7 to 2 +move 2 from 1 to 8 +move 1 from 2 to 1 +move 5 from 9 to 7 +move 3 from 9 to 4 +move 8 from 4 to 8 +move 6 from 8 to 5 +move 11 from 5 to 1 +move 3 from 4 to 2 +move 9 from 3 to 7 +move 6 from 7 to 2 +move 13 from 3 to 2 +move 3 from 8 to 1 +move 2 from 2 to 8 +move 1 from 6 to 7 +move 3 from 8 to 4 +move 9 from 1 to 5 +move 5 from 5 to 8 +move 2 from 8 to 4 +move 3 from 9 to 4 +move 2 from 8 to 2 +move 8 from 1 to 5 +move 8 from 7 to 9 +move 1 from 8 to 3 +move 15 from 5 to 9 +move 6 from 4 to 1 +move 1 from 7 to 2 +move 4 from 2 to 1 +move 1 from 3 to 4 +move 5 from 1 to 7 +move 3 from 7 to 3 +move 14 from 9 to 8 +move 1 from 4 to 8 +move 1 from 7 to 6 +move 2 from 4 to 5 +move 4 from 1 to 5 +move 1 from 6 to 5 +move 4 from 9 to 3 +move 5 from 3 to 7 +move 4 from 5 to 9 +move 1 from 3 to 7 +move 1 from 3 to 2 +move 4 from 5 to 2 +move 4 from 7 to 5 +move 4 from 2 to 1 +move 1 from 5 to 4 +move 7 from 9 to 7 +move 1 from 4 to 2 +move 1 from 5 to 8 +move 21 from 2 to 4 +move 1 from 9 to 8 +move 1 from 9 to 4 +move 3 from 4 to 1 +move 7 from 1 to 6 +move 1 from 5 to 1 +move 18 from 4 to 7 +move 1 from 5 to 8 +move 27 from 7 to 8 +move 1 from 7 to 3 +move 1 from 3 to 7 +move 1 from 7 to 2 +move 1 from 2 to 1 +move 42 from 8 to 9 +move 1 from 8 to 7 +move 1 from 8 to 2 +move 1 from 4 to 6 +move 1 from 2 to 9 +move 2 from 1 to 2 +move 1 from 7 to 3 +move 7 from 6 to 4 +move 4 from 9 to 6 +move 1 from 3 to 2 +move 1 from 2 to 7 +move 2 from 2 to 5 +move 1 from 8 to 4 +move 1 from 9 to 3 +move 5 from 4 to 7 +move 1 from 5 to 6 +move 1 from 5 to 9 +move 1 from 6 to 3 +move 1 from 7 to 5 +move 2 from 3 to 2 +move 22 from 9 to 7 +move 2 from 2 to 3 +move 18 from 7 to 9 +move 1 from 4 to 9 +move 1 from 1 to 4 +move 4 from 7 to 3 +move 4 from 3 to 2 +move 3 from 4 to 5 +move 1 from 2 to 4 +move 5 from 6 to 9 +move 1 from 5 to 3 +move 1 from 4 to 7 +move 2 from 5 to 1 +move 3 from 2 to 4 +move 1 from 5 to 6 +move 2 from 7 to 9 +move 1 from 6 to 8 +move 2 from 3 to 2 +move 2 from 4 to 7 +move 1 from 8 to 7 +move 1 from 4 to 6 +move 35 from 9 to 7 +move 13 from 7 to 3 +move 1 from 2 to 7 +move 1 from 2 to 5 +move 1 from 5 to 8 +move 1 from 8 to 5 +move 8 from 7 to 3 +move 1 from 6 to 4 +move 6 from 3 to 9 +move 1 from 1 to 9 +move 1 from 4 to 1 +move 14 from 9 to 8 +move 1 from 5 to 7 +move 16 from 3 to 2 +move 2 from 1 to 2 +move 1 from 9 to 2 +move 1 from 8 to 1 +move 1 from 1 to 3 +move 7 from 2 to 9 +move 6 from 9 to 8 +move 1 from 3 to 4 +move 3 from 7 to 6 +move 2 from 2 to 1 +move 1 from 4 to 7 +move 2 from 2 to 5 +move 1 from 9 to 6 +move 2 from 2 to 5 +move 2 from 6 to 2 +move 4 from 5 to 4 +move 5 from 2 to 6 +move 1 from 1 to 7 +move 1 from 1 to 2 +move 13 from 8 to 1 +move 2 from 8 to 4 +move 19 from 7 to 4 +move 3 from 1 to 6 +move 11 from 4 to 3 +move 2 from 7 to 9 +move 4 from 2 to 5 +move 2 from 9 to 5 +move 1 from 7 to 4 +move 2 from 5 to 7 +move 4 from 3 to 4 +move 3 from 4 to 1 +move 3 from 5 to 1 +move 9 from 6 to 4 +move 1 from 7 to 9 +move 1 from 7 to 5 +move 10 from 1 to 4 +move 1 from 9 to 6 +move 1 from 6 to 8 +move 32 from 4 to 5 +move 7 from 5 to 4 +move 27 from 5 to 9 +move 5 from 3 to 2 +move 3 from 2 to 8 +move 1 from 6 to 2 +move 8 from 4 to 9 +move 1 from 2 to 9 +move 8 from 8 to 6 +move 2 from 4 to 3 +move 1 from 2 to 3 +move 15 from 9 to 8 +move 4 from 1 to 4 +move 3 from 4 to 8 +move 6 from 9 to 7 +move 1 from 4 to 9 +move 8 from 8 to 2 +move 2 from 1 to 9 +move 2 from 7 to 9 +move 10 from 8 to 3 +move 6 from 2 to 6 +move 2 from 3 to 2 +move 6 from 6 to 3 +move 1 from 7 to 5 +move 8 from 3 to 2 +move 4 from 3 to 2 +move 1 from 3 to 5 +move 6 from 6 to 1 +move 4 from 3 to 7 +move 2 from 5 to 8 +move 3 from 7 to 5 +move 6 from 1 to 7 +move 1 from 3 to 4 +move 1 from 3 to 9 +move 10 from 7 to 4 +move 8 from 2 to 8 +move 11 from 9 to 5 +move 11 from 4 to 1 +move 5 from 2 to 6 +move 3 from 2 to 7 +move 11 from 1 to 6 +move 1 from 5 to 6 +move 8 from 5 to 4 +move 19 from 6 to 7 +move 3 from 7 to 9 +move 3 from 5 to 4 +move 1 from 2 to 5 +move 3 from 5 to 7 +move 8 from 9 to 6 +move 2 from 4 to 1 +move 1 from 1 to 9 +move 2 from 9 to 7 +move 6 from 6 to 2 +move 2 from 4 to 6 +move 4 from 8 to 6 +move 1 from 8 to 1 +move 7 from 6 to 7 +move 1 from 9 to 4 +move 5 from 8 to 4 +move 3 from 2 to 6 +move 4 from 6 to 4 +move 2 from 9 to 6 +move 3 from 2 to 9 +move 16 from 4 to 8 +move 1 from 6 to 8 +move 2 from 9 to 5 +move 1 from 9 to 7 +move 2 from 5 to 2 +move 1 from 4 to 6 +move 2 from 2 to 5 +move 1 from 9 to 6 +move 3 from 7 to 3 +move 7 from 7 to 8 +move 2 from 7 to 1 +move 3 from 8 to 5 +move 3 from 6 to 2 +move 4 from 7 to 4 +move 1 from 5 to 1 +move 1 from 5 to 7 +move 3 from 3 to 4 +move 5 from 1 to 4 +move 16 from 7 to 2 +move 5 from 4 to 7 +move 19 from 8 to 1 +move 11 from 2 to 9 +move 11 from 9 to 6 +move 2 from 1 to 6 +move 2 from 4 to 1 +move 5 from 4 to 6 +move 1 from 5 to 9 +move 1 from 9 to 6 +move 2 from 2 to 6 +move 1 from 5 to 4 +move 8 from 6 to 5 +move 16 from 1 to 6 +move 1 from 4 to 9 +move 3 from 2 to 9 +move 2 from 2 to 5 +move 2 from 5 to 8 +move 4 from 8 to 4 +move 4 from 9 to 7 +move 2 from 1 to 3 +move 5 from 6 to 4 +move 21 from 6 to 2 +move 9 from 7 to 3 +move 1 from 1 to 2 +move 1 from 5 to 3 +move 23 from 2 to 7 +move 1 from 7 to 5 +move 3 from 6 to 1 +move 9 from 4 to 5 +move 11 from 7 to 1 +move 2 from 3 to 4 +move 1 from 3 to 7 +move 1 from 4 to 1 +move 10 from 1 to 6 +move 5 from 7 to 1 +move 3 from 1 to 4 +move 7 from 1 to 7 +move 4 from 3 to 8 +move 4 from 7 to 4 +move 5 from 7 to 3 +move 2 from 4 to 9 +move 1 from 8 to 1 +move 4 from 4 to 1 +move 1 from 6 to 1 +move 1 from 6 to 5 +move 16 from 5 to 1 +move 2 from 5 to 7 +move 1 from 5 to 6 +move 2 from 8 to 2 +move 1 from 7 to 9 +move 3 from 9 to 5 +move 2 from 5 to 4 +move 6 from 7 to 1 +move 3 from 4 to 7 +move 1 from 8 to 6 +move 5 from 1 to 4 +move 1 from 6 to 1 +move 19 from 1 to 5 +move 1 from 7 to 6 +move 9 from 3 to 1 +move 6 from 6 to 5 +move 4 from 6 to 9 +move 3 from 9 to 4 +move 13 from 1 to 4 +move 1 from 3 to 1 +move 2 from 5 to 1 +move 1 from 2 to 3 +move 1 from 3 to 9 +move 4 from 5 to 4 +move 1 from 2 to 3 +move 1 from 3 to 5 +move 1 from 9 to 1 +move 1 from 9 to 5 +move 19 from 4 to 7 +move 4 from 1 to 6 +move 5 from 4 to 3 +move 3 from 6 to 1 +move 1 from 6 to 8 +move 2 from 1 to 6 +move 2 from 1 to 7 +move 2 from 6 to 3 +move 2 from 3 to 1 +move 8 from 7 to 6 +move 5 from 3 to 9 +move 2 from 4 to 9 +move 2 from 6 to 8 +move 10 from 7 to 2 +move 7 from 2 to 9 +move 1 from 8 to 9 +move 1 from 1 to 2 +move 2 from 9 to 3 +move 2 from 8 to 7 +move 1 from 1 to 6 +move 1 from 2 to 8 +move 2 from 2 to 5 +move 4 from 5 to 7 +move 5 from 6 to 1 +move 1 from 3 to 4 From 2ea00cec0a460a67386667a3bcbfdfaed25b11ce Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 5 Dec 2022 08:26:15 +0100 Subject: [PATCH 295/479] 2022: d05: ex2: add solution --- 2022/d05/ex2/ex2.py | 56 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100755 2022/d05/ex2/ex2.py diff --git a/2022/d05/ex2/ex2.py b/2022/d05/ex2/ex2.py new file mode 100755 index 0000000..d5db4ac --- /dev/null +++ b/2022/d05/ex2/ex2.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python + +import dataclasses +import sys + +Stack = list[str] + + +@dataclasses.dataclass +class Instruction: + n: int + start: int + end: int + + @classmethod + def from_input(cls, input: str) -> "Instruction": + words = input.split() + return Instruction(int(words[1]), int(words[3]) - 1, int(words[5]) - 1) + + +def parse(input: list[str]) -> tuple[list[Stack], list[Instruction]]: + def parse_stacks(input: list[str]) -> list[Stack]: + stacks: list[Stack] = [[] for _ in range(1, len(input[-1]), 4)] + for line in reversed(input[:-1]): + for stack, i in enumerate(range(1, len(line), 4)): + c = line[i] + if c == " ": + continue + stacks[stack].append(c) + return stacks + + def parse_instructions(input: list[str]) -> list[Instruction]: + return list(map(Instruction.from_input, input)) + + empty_line = input.index("") + + return parse_stacks(input[:empty_line]), parse_instructions(input[empty_line + 1 :]) + + +def solve(input: list[str]) -> str: + stacks, instructions = parse(input) + for instr in instructions: + start, end = stacks[instr.start], stacks[instr.end] + items = [start.pop() for _ in range(instr.n)] + items.reverse() + end.extend(items) + return "".join(stack[-1] for stack in stacks if stack) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 6dc7baa4a8ea3ccff8766c8a18ff31d00db2d6ea Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 6 Dec 2022 07:48:56 +0100 Subject: [PATCH 296/479] 2022: d06: ex1: add input --- 2022/d06/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2022/d06/ex1/input diff --git a/2022/d06/ex1/input b/2022/d06/ex1/input new file mode 100644 index 0000000..e92addc --- /dev/null +++ b/2022/d06/ex1/input @@ -0,0 +1 @@ +zcncrcnrrlccmhchssgqsqrsstfffnqfnfsswgwjjcmcnnvjvwjvwvfvnvwwhvvwmwhmwwwhbhhldhdmhhdfdbdfbdblllnfllgslllqhlhfhlhqllncnfnsffwmwzzlglzlwlhwwmvmddpvvbrvrdvrdvdhhzdhdpdzzbgbsssrpsrshrshhbqbgbmmtwwcbcrbbvnvhnncscwcwlcwlwnwswbbnwntthzzdlzdzffvqvdqvvtptdptphpddzzvhzvzwwqgqjjjvsspvspsbsffvpvcvjcvjvrvjjgmjjhrrdhhdvhvttjttzptpssnlnjjlnnhmnndjnjwwtjjtbbfflwfwgwvvpjpwpcwcgglmgmdmnmbbqtqctcwcmwwvmvlmvmdvdvhvlhlzhzttghttnvnjntnqqtmtwwhvhrhfhchqchhdrdllnwnfwfjjmsmmnhhshnhpptstjjpnpzzhmmpssgrsrzsrrffzjjhvjhjcjcpcvpccfnfjnfjfllssrdsdnnmffldldppcctcmtctffprpsrrrfhfmflldccnpppvsswppdgpgjpgpqgpqpjppclcjczcnzzzqvzzwlzzqfzffsqqphqhvqqbcccstsdttwcwcvvmjjhqqmllpglgtgwgnnbnrbnnjdndhhbrbvrvwwwblwwwppmdmttztqzqrqjjpggpmgpmpqqmssvnsvnndnvddtztddrrsnsbbshhqmhqmmdnnrsrllqvvfjfpfqpqfqflqlmqmrrqgrqrrhvvfddfhhfnhnlncnzzwwjwswpsscpchcssrzssjqsqrsswbbzggnqnwqqsrqqzbqbddtffcjjdggwlwnwtnnpddcqddsppcwpcwpphvphhhrprqrqttwgwqwppvdpvvrgggmpmddzvvwwthwtttbqtbbftfrffbdfbbspshphpwhppnhnmhhbbshbsbmbdmmtrmrbrprbprphhnmhmvhmhhqqbvqvqcvcwcbwcchbbgwwqffrcffsvvcczrztrzzdhdmhdmmzbbvlvqqtptpvvfsfppdzppmddfvdfdwdfdmdwwlvvqdvqdqmdqqmnmdndsswsfwfvwfwzzhrzhhwfhhpvhppmssnhsnsnwswvwlwdwzwnwswwmqmjmbbdjdbbtllcpllltqlttnvvppznpnttlrrwlwvllphpbblccgjcggbtbwtwdwrrbnndpddbqqnpnrnnqqshspsggtptztpzzclcggtqtgqttcmmbgbfbdfdfsddlrlvrlvvmqqgbqgbqbcbbnpplqqblqbqmbbbdqbbhjjcgcdgdwdjwjqqlsqqnnwffglfglgnlggjgjtgjtgjtgjjclcwcqqvpvwwvgvhgvhvjjzpzbznnvrrrpbpdbdhhmshsnnnwppcbcvvlldccdggqnqgnqqzbzzcfflnnmppcgcmgmrgmrgmgngwwptpzzpfzpfzpzdppgcgtcgtgccvtctzzdmzmlmzlzwllbplblltgtctrrghgvhgvvfvssngsschshrhvrvddghgwwwwzgwgvgccjdjzjwwvdvvqsqshsvvddmddbllvppmlpmlmwlwppjmppwrrdzrrpmrmrdmrmbmzzwttvwwsfswwlflnlrlvvdllzbztbtpbtppnjpnpdnnjrjsshtssvvsjvjfjwffsszvsvjssqzsslpslppjpspqptbncvzrlwtjvsrwtnzzhwdfsmlthvgqgjrpshpbsrrvnsdbqslbcplnpcjqwmwqsnwdcjsdmccbdglwbrcdcqsfhjqhstvhqqdwltqwhhqcrnpvnzjhhbjvqbqhclwggjqfvnfsvcnjjhbmrvbpjqrbljbtltvnsgdfhddlmsdhcrfwvlvbsdrjwjvtnqzhrlqgjmzsmjlpdjsrjmdhmvgwjmfwtqffnzfrtswrlgvvhhqgpzcjwscfqgjmdhtvbgzdlvzfhgqlqbfwsjrmmhrlcwhrcnwwvngcmsrfgczsfqvvmdtmtprfvjrwrwcqwvgmzcjncrzvcswlzsdszvdtwmptnrhgzqwrhjjtbchhpwsdjnqmnsgzwqzvlzlsznpqgvtqnldjqpvndtsjlzhpzsgthbwvwnlbwjlmndqpcdvjdgdzhctpghlfwrtqtvfwdpgrjbmwzqgthjpmlrsqmzsznddhrbjnggqrdntpbngvldnnltfnmdwfhftjvpqbrzqvdzbzzctshzldtcdgfnczglrrjtwswzdvjrfgwztwznbpplmbgwpcmstcsjtqhmzmzsjwsfbjlbnbdtdsmlpdmrrbhdhpzrjdpzhcwsrgfrhmqzqtjfhpvltnthwjrrrpnsbmmwrhsfqbmnvwhpntltsgwgnqhcvlndfrtrfrnlmbhltmtgzhlzqgtsbbnggdjvbslfbczhpghqqcqlrbtpnbqbflfjrmpmwwvjqgvcqtmfggmptqlqstcmdtqlslnnzwbgnstftfsvsjdrmgbzfnzltwbjmqhsvshnmwhftjdndltdpngzwbrjpgpwmqgfsflnhmtzcmdjmzwrsrrrmpvwgggwrhrwtfwdbgbpmwpcdspdtbqvdwwsnwdtrtdtgnfzzsmlbcqdzbsqnrgtvvnlfcdlcgcnfpqbddqcjfqtmpndmnwvfqgjzrltqvlprmbbhmtwbzjjgfhhhfjswpffmjnsdmrcjrwlwpmfrmhljpphlwwwwmgsjcsrcvmfrdjdhshddshpplzsnsphcmdhvllgmdgrvbvjmtpltdthffsvwwhvgqrhmfjfpdswcqldrhpmznffjsntwrnmnpmsshljszbchctptsdlnbcvpfvtlfnzcrljpdwrsjnlpqcpnwvnqhzhqmjbvlbtgslzthlbbjzsgdglbrltzjdshpfbndjtssvsjqlstnrjdzzjvlpqhmwvrsvndcqrqjjcsqvmvrbhngtcfdprlbnqmhqllddgjpdzbjlphntrtgjrdgtbslrtzczbnnlddzzsvqvqvvzjpjqfhztgtsfggdppfdhzsbjzqjmpnmgqzlsdhjjbfpbsbnzpmhwrzjqhczrgcsflfwtrgwbnbrshjpwltntsnsdhmhqlmzdprcrcpcpjnphsmjwhzdqtncdbwgspmnfzsgmpbdhmslqchhhbbwfrghhnfjplsvrtbvplgrwdnbnfsgpwrqczvzlnfsngnsnbwvpmfdcmjztdnrllslnwcfwwnwsvztqmgqtfvmdqrrrmwfmphbcvwwttpmwjjbvqrmlwtwfsjdpcbmdlnlzcqntfzzmslshwprjfhwwpbbdfcdjwllfwcznwpjpwrlsfnnbgzjllrgtzcdcvhdhbtlrcvfdvsdjlzsmwwqvpzfhzjlqpfbqstvfrpcchmtwgbrhqqbglrvzmctdlpnvmglgdtzpbdngtfdnmsmwbgjstzbqwqcdlhfrtqqnhqvpfhdrjqvsvstftdgwwnwpfbfbdcfqnqlwpdnfhhfctwrgdqpbpbmgnfsnbpjfctvdtjnsfqlrtctrnjgltndngcmrdphhsqpjhprbngjzqqhnhhrdwlwwpmhzwshvrtzfgzlrhwghvpvfprbbvflltplpptvrmwcrdqndfqbfqtlqqwvphsmcvnbzghvsptrphhfcgdsslhfbcwhtjcmnpbvqrfgpsjgqpnnwwhjjwqrhhqgznwdzjqbtmmjljjwctqtfgwqbdrjwqwbbcftvjwfdfrgvsrlcrccpvfzdrcjvqfbhddpvrrhjrmhdgchrghbzsqpmgnmslfctblwlvphdfpvtdtwpdfsjwssmgnsvsqpdbqngccsplhmjbwjwtzwsbjhwpwcslqjdchmbvzrbgnwvjrrrdtvhtlzlrbwthzlhhqzzpvpwbzrrbrbtpwnhldhqqltqrqdddfwdmjzgctnlrjrjwvddfmjpnptdmrvnqjvsjfrmlvlqsthhsbvnjlsdzrjngfnqdjfssmvgrchbwmwbbvfqfhvrtwghmrpddnwbrbvbmqvfzbjdsnbzgrtmsfhmsmjtrqsgmpnwwbfwtp From aba16a255631bb153120f1a77943f38a2fc68673 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 6 Dec 2022 07:49:02 +0100 Subject: [PATCH 297/479] 2022: d06: ex1: add solution --- 2022/d06/ex1/ex1.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100755 2022/d06/ex1/ex1.py diff --git a/2022/d06/ex1/ex1.py b/2022/d06/ex1/ex1.py new file mode 100755 index 0000000..954bded --- /dev/null +++ b/2022/d06/ex1/ex1.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +import collections +import itertools +import sys +from collections.abc import Iterable +from typing import TypeVar + +T = TypeVar("T") + + +def sliding_window(iterable: Iterable[T], n: int) -> Iterable[tuple[T, ...]]: + it = iter(iterable) + window = collections.deque(itertools.islice(it, n), maxlen=n) + if len(window) == n: + yield tuple(window) + for x in it: + window.append(x) + yield tuple(window) + + +def solve(input: str) -> int: + SIZE = 4 + for i, tup in enumerate(sliding_window(input, SIZE), start=SIZE): + if len(set(tup)) == SIZE: + return i + assert False + + +def main() -> None: + input = sys.stdin.read().replace("\n", "") + print(solve(input)) + + +if __name__ == "__main__": + main() From 73ea22bb589fe45485bf199dee805b0185826880 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 6 Dec 2022 07:49:08 +0100 Subject: [PATCH 298/479] 2022: d06: ex2: add input --- 2022/d06/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2022/d06/ex2/input diff --git a/2022/d06/ex2/input b/2022/d06/ex2/input new file mode 100644 index 0000000..e92addc --- /dev/null +++ b/2022/d06/ex2/input @@ -0,0 +1 @@ +zcncrcnrrlccmhchssgqsqrsstfffnqfnfsswgwjjcmcnnvjvwjvwvfvnvwwhvvwmwhmwwwhbhhldhdmhhdfdbdfbdblllnfllgslllqhlhfhlhqllncnfnsffwmwzzlglzlwlhwwmvmddpvvbrvrdvrdvdhhzdhdpdzzbgbsssrpsrshrshhbqbgbmmtwwcbcrbbvnvhnncscwcwlcwlwnwswbbnwntthzzdlzdzffvqvdqvvtptdptphpddzzvhzvzwwqgqjjjvsspvspsbsffvpvcvjcvjvrvjjgmjjhrrdhhdvhvttjttzptpssnlnjjlnnhmnndjnjwwtjjtbbfflwfwgwvvpjpwpcwcgglmgmdmnmbbqtqctcwcmwwvmvlmvmdvdvhvlhlzhzttghttnvnjntnqqtmtwwhvhrhfhchqchhdrdllnwnfwfjjmsmmnhhshnhpptstjjpnpzzhmmpssgrsrzsrrffzjjhvjhjcjcpcvpccfnfjnfjfllssrdsdnnmffldldppcctcmtctffprpsrrrfhfmflldccnpppvsswppdgpgjpgpqgpqpjppclcjczcnzzzqvzzwlzzqfzffsqqphqhvqqbcccstsdttwcwcvvmjjhqqmllpglgtgwgnnbnrbnnjdndhhbrbvrvwwwblwwwppmdmttztqzqrqjjpggpmgpmpqqmssvnsvnndnvddtztddrrsnsbbshhqmhqmmdnnrsrllqvvfjfpfqpqfqflqlmqmrrqgrqrrhvvfddfhhfnhnlncnzzwwjwswpsscpchcssrzssjqsqrsswbbzggnqnwqqsrqqzbqbddtffcjjdggwlwnwtnnpddcqddsppcwpcwpphvphhhrprqrqttwgwqwppvdpvvrgggmpmddzvvwwthwtttbqtbbftfrffbdfbbspshphpwhppnhnmhhbbshbsbmbdmmtrmrbrprbprphhnmhmvhmhhqqbvqvqcvcwcbwcchbbgwwqffrcffsvvcczrztrzzdhdmhdmmzbbvlvqqtptpvvfsfppdzppmddfvdfdwdfdmdwwlvvqdvqdqmdqqmnmdndsswsfwfvwfwzzhrzhhwfhhpvhppmssnhsnsnwswvwlwdwzwnwswwmqmjmbbdjdbbtllcpllltqlttnvvppznpnttlrrwlwvllphpbblccgjcggbtbwtwdwrrbnndpddbqqnpnrnnqqshspsggtptztpzzclcggtqtgqttcmmbgbfbdfdfsddlrlvrlvvmqqgbqgbqbcbbnpplqqblqbqmbbbdqbbhjjcgcdgdwdjwjqqlsqqnnwffglfglgnlggjgjtgjtgjtgjjclcwcqqvpvwwvgvhgvhvjjzpzbznnvrrrpbpdbdhhmshsnnnwppcbcvvlldccdggqnqgnqqzbzzcfflnnmppcgcmgmrgmrgmgngwwptpzzpfzpfzpzdppgcgtcgtgccvtctzzdmzmlmzlzwllbplblltgtctrrghgvhgvvfvssngsschshrhvrvddghgwwwwzgwgvgccjdjzjwwvdvvqsqshsvvddmddbllvppmlpmlmwlwppjmppwrrdzrrpmrmrdmrmbmzzwttvwwsfswwlflnlrlvvdllzbztbtpbtppnjpnpdnnjrjsshtssvvsjvjfjwffsszvsvjssqzsslpslppjpspqptbncvzrlwtjvsrwtnzzhwdfsmlthvgqgjrpshpbsrrvnsdbqslbcplnpcjqwmwqsnwdcjsdmccbdglwbrcdcqsfhjqhstvhqqdwltqwhhqcrnpvnzjhhbjvqbqhclwggjqfvnfsvcnjjhbmrvbpjqrbljbtltvnsgdfhddlmsdhcrfwvlvbsdrjwjvtnqzhrlqgjmzsmjlpdjsrjmdhmvgwjmfwtqffnzfrtswrlgvvhhqgpzcjwscfqgjmdhtvbgzdlvzfhgqlqbfwsjrmmhrlcwhrcnwwvngcmsrfgczsfqvvmdtmtprfvjrwrwcqwvgmzcjncrzvcswlzsdszvdtwmptnrhgzqwrhjjtbchhpwsdjnqmnsgzwqzvlzlsznpqgvtqnldjqpvndtsjlzhpzsgthbwvwnlbwjlmndqpcdvjdgdzhctpghlfwrtqtvfwdpgrjbmwzqgthjpmlrsqmzsznddhrbjnggqrdntpbngvldnnltfnmdwfhftjvpqbrzqvdzbzzctshzldtcdgfnczglrrjtwswzdvjrfgwztwznbpplmbgwpcmstcsjtqhmzmzsjwsfbjlbnbdtdsmlpdmrrbhdhpzrjdpzhcwsrgfrhmqzqtjfhpvltnthwjrrrpnsbmmwrhsfqbmnvwhpntltsgwgnqhcvlndfrtrfrnlmbhltmtgzhlzqgtsbbnggdjvbslfbczhpghqqcqlrbtpnbqbflfjrmpmwwvjqgvcqtmfggmptqlqstcmdtqlslnnzwbgnstftfsvsjdrmgbzfnzltwbjmqhsvshnmwhftjdndltdpngzwbrjpgpwmqgfsflnhmtzcmdjmzwrsrrrmpvwgggwrhrwtfwdbgbpmwpcdspdtbqvdwwsnwdtrtdtgnfzzsmlbcqdzbsqnrgtvvnlfcdlcgcnfpqbddqcjfqtmpndmnwvfqgjzrltqvlprmbbhmtwbzjjgfhhhfjswpffmjnsdmrcjrwlwpmfrmhljpphlwwwwmgsjcsrcvmfrdjdhshddshpplzsnsphcmdhvllgmdgrvbvjmtpltdthffsvwwhvgqrhmfjfpdswcqldrhpmznffjsntwrnmnpmsshljszbchctptsdlnbcvpfvtlfnzcrljpdwrsjnlpqcpnwvnqhzhqmjbvlbtgslzthlbbjzsgdglbrltzjdshpfbndjtssvsjqlstnrjdzzjvlpqhmwvrsvndcqrqjjcsqvmvrbhngtcfdprlbnqmhqllddgjpdzbjlphntrtgjrdgtbslrtzczbnnlddzzsvqvqvvzjpjqfhztgtsfggdppfdhzsbjzqjmpnmgqzlsdhjjbfpbsbnzpmhwrzjqhczrgcsflfwtrgwbnbrshjpwltntsnsdhmhqlmzdprcrcpcpjnphsmjwhzdqtncdbwgspmnfzsgmpbdhmslqchhhbbwfrghhnfjplsvrtbvplgrwdnbnfsgpwrqczvzlnfsngnsnbwvpmfdcmjztdnrllslnwcfwwnwsvztqmgqtfvmdqrrrmwfmphbcvwwttpmwjjbvqrmlwtwfsjdpcbmdlnlzcqntfzzmslshwprjfhwwpbbdfcdjwllfwcznwpjpwrlsfnnbgzjllrgtzcdcvhdhbtlrcvfdvsdjlzsmwwqvpzfhzjlqpfbqstvfrpcchmtwgbrhqqbglrvzmctdlpnvmglgdtzpbdngtfdnmsmwbgjstzbqwqcdlhfrtqqnhqvpfhdrjqvsvstftdgwwnwpfbfbdcfqnqlwpdnfhhfctwrgdqpbpbmgnfsnbpjfctvdtjnsfqlrtctrnjgltndngcmrdphhsqpjhprbngjzqqhnhhrdwlwwpmhzwshvrtzfgzlrhwghvpvfprbbvflltplpptvrmwcrdqndfqbfqtlqqwvphsmcvnbzghvsptrphhfcgdsslhfbcwhtjcmnpbvqrfgpsjgqpnnwwhjjwqrhhqgznwdzjqbtmmjljjwctqtfgwqbdrjwqwbbcftvjwfdfrgvsrlcrccpvfzdrcjvqfbhddpvrrhjrmhdgchrghbzsqpmgnmslfctblwlvphdfpvtdtwpdfsjwssmgnsvsqpdbqngccsplhmjbwjwtzwsbjhwpwcslqjdchmbvzrbgnwvjrrrdtvhtlzlrbwthzlhhqzzpvpwbzrrbrbtpwnhldhqqltqrqdddfwdmjzgctnlrjrjwvddfmjpnptdmrvnqjvsjfrmlvlqsthhsbvnjlsdzrjngfnqdjfssmvgrchbwmwbbvfqfhvrtwghmrpddnwbrbvbmqvfzbjdsnbzgrtmsfhmsmjtrqsgmpnwwbfwtp From 4c09d5caa58ad488a8ccc6cdc094c1221bb6be64 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 6 Dec 2022 07:49:13 +0100 Subject: [PATCH 299/479] 2022: d06: ex2: add solution --- 2022/d06/ex2/ex2.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100755 2022/d06/ex2/ex2.py diff --git a/2022/d06/ex2/ex2.py b/2022/d06/ex2/ex2.py new file mode 100755 index 0000000..a663efc --- /dev/null +++ b/2022/d06/ex2/ex2.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +import collections +import itertools +import sys +from collections.abc import Iterable +from typing import TypeVar + +T = TypeVar("T") + + +def sliding_window(iterable: Iterable[T], n: int) -> Iterable[tuple[T, ...]]: + it = iter(iterable) + window = collections.deque(itertools.islice(it, n), maxlen=n) + if len(window) == n: + yield tuple(window) + for x in it: + window.append(x) + yield tuple(window) + + +def solve(input: str) -> int: + SIZE = 14 + for i, tup in enumerate(sliding_window(input, SIZE), start=SIZE): + if len(set(tup)) == SIZE: + return i + assert False + + +def main() -> None: + input = sys.stdin.read().replace("\n", "") + print(solve(input)) + + +if __name__ == "__main__": + main() From e995443027edd543a9cf6dd0dc08739882657334 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 7 Dec 2022 09:18:05 +0100 Subject: [PATCH 300/479] 2022: d07: ex1: add input --- 2022/d07/ex1/input | 1010 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1010 insertions(+) create mode 100644 2022/d07/ex1/input diff --git a/2022/d07/ex1/input b/2022/d07/ex1/input new file mode 100644 index 0000000..a3077b9 --- /dev/null +++ b/2022/d07/ex1/input @@ -0,0 +1,1010 @@ +$ cd / +$ ls +dir bsnqsfm +dir dtqvbspj +dir hhhtrws +dir ldmsq +307337 pnm.slh +dir pqcndb +dir pwtqzwv +212421 zcrfndg.cms +$ cd bsnqsfm +$ ls +179236 lccnhn +$ cd .. +$ cd dtqvbspj +$ ls +221336 gdjfp.mfp +273114 jjgpvcqv.jlq +$ cd .. +$ cd hhhtrws +$ ls +dir gcbg +dir jjgpvcqv +dir mgvdbtl +1606 mgvdbtl.ztt +dir qhv +27538 wprqtd.wph +$ cd gcbg +$ ls +dir bgcwh +dir bsnqsfm +dir jjgpvcqv +186683 lccnhn +dir rqbnd +32944 zjfs.mdf +$ cd bgcwh +$ ls +211273 nvns +$ cd .. +$ cd bsnqsfm +$ ls +dir bsnqsfm +210022 dtqvbspj +dir gpcpgfh +189603 pnm.slh +199755 rcsffv.gbt +$ cd bsnqsfm +$ ls +292856 bsnqsfm.vww +$ cd .. +$ cd gpcpgfh +$ ls +177703 jrr.jnj +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +233963 bsnqsfm.fnn +127603 gpcpgfh.gtw +dir jjgpvcqv +48213 jrs.bdw +172974 pnm.slh +$ cd jjgpvcqv +$ ls +dir bqnctqvn +dir bsnqsfm +dir gpcpgfh +254570 qpmnqwvl +258040 rrvjrv.zbp +$ cd bqnctqvn +$ ls +106211 bsnqsfm.pql +299973 dtqvbspj +dir nzrst +$ cd nzrst +$ ls +dir whtfvrl +$ cd whtfvrl +$ ls +12412 vzdrqs.rwt +$ cd .. +$ cd .. +$ cd .. +$ cd bsnqsfm +$ ls +293832 bggllqhj.dvb +$ cd .. +$ cd gpcpgfh +$ ls +196159 jrr.jnj +$ cd .. +$ cd .. +$ cd .. +$ cd rqbnd +$ ls +97630 ddjrjp +56378 rsb +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +89238 bsnqsfm.mgf +dir dvsst +dir gpcpgfh +dir jjgpvcqv +dir mhrzj +164176 pnm.slh +dir tmh +dir vmwz +$ cd dvsst +$ ls +286924 dtqvbspj +252366 hcnqdmg.zst +266562 wgfdmgmh.ptw +$ cd .. +$ cd gpcpgfh +$ ls +91199 jrs.bdw +78761 rspd.vmj +dir tbrbw +dir vvm +dir wplf +$ cd tbrbw +$ ls +195696 bjd.csj +56063 lccnhn +193863 pnm.slh +121918 qpd.dtq +209757 rcsffv.gbt +dir rmqlpvq +$ cd rmqlpvq +$ ls +dir gjgfvt +255533 lhdqqbg.fgm +68413 qltvgnrp.gfd +dir wqfcnlzq +$ cd gjgfvt +$ ls +242867 zqbdmpb +$ cd .. +$ cd wqfcnlzq +$ ls +dir vhhscrvb +$ cd vhhscrvb +$ ls +62647 rcsffv.gbt +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd vvm +$ ls +281698 dscllv.qwl +14348 rmgpnprq +$ cd .. +$ cd wplf +$ ls +44465 jjgpvcqv +248434 vpsfbjh.zsj +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +dir dhfcbc +dir jjgpvcqv +dir ltclg +dir ptbsgmlr +$ cd dhfcbc +$ ls +224134 lccnhn +197124 tns +$ cd .. +$ cd jjgpvcqv +$ ls +126322 jrr.jnj +280287 jrs.bdw +$ cd .. +$ cd ltclg +$ ls +dir fdfn +47501 jrr.jnj +dir mgvdbtl +24374 mgvdbtl.gll +227751 pnm.slh +286088 wvsfr +$ cd fdfn +$ ls +32987 hmt +$ cd .. +$ cd mgvdbtl +$ ls +201629 pnm.slh +246591 whtcjvh +$ cd .. +$ cd .. +$ cd ptbsgmlr +$ ls +239257 rcsffv.gbt +$ cd .. +$ cd .. +$ cd mhrzj +$ ls +279222 mgvdbtl.rzf +214102 rvjnddbr +$ cd .. +$ cd tmh +$ ls +152958 rcsffv.gbt +$ cd .. +$ cd vmwz +$ ls +131525 bsnqsfm.djc +122342 jrs.bdw +$ cd .. +$ cd .. +$ cd mgvdbtl +$ ls +24916 tcsltrml +$ cd .. +$ cd qhv +$ ls +dir hncvrlbw +153239 jwdg.wbg +$ cd hncvrlbw +$ ls +178499 clmwn.ztj +297967 jrr.jnj +30359 sntbnf.whh +$ cd .. +$ cd .. +$ cd .. +$ cd ldmsq +$ ls +dir jngnzc +dir psgrjgr +dir rgwp +dir rtsmnzm +dir wsd +$ cd jngnzc +$ ls +dir dzlcq +dir gpcpgfh +dir rlwwwngc +dir swrlvd +$ cd dzlcq +$ ls +70984 lccnhn +$ cd .. +$ cd gpcpgfh +$ ls +288159 hztmtp.fpj +$ cd .. +$ cd rlwwwngc +$ ls +173335 bsnqsfm.rtr +292723 jrr.jnj +175123 lccnhn +$ cd .. +$ cd swrlvd +$ ls +69589 fwrt +$ cd .. +$ cd .. +$ cd psgrjgr +$ ls +283186 dtqvbspj.hjw +dir fcvqsp +104691 jrs.bdw +286657 lccnhn +258194 rcsffv.gbt +$ cd fcvqsp +$ ls +209758 fzqmqlvs.hsc +$ cd .. +$ cd .. +$ cd rgwp +$ ls +11060 nwg.qcg +$ cd .. +$ cd rtsmnzm +$ ls +dir rdv +dir sdwmbsz +dir tjwht +$ cd rdv +$ ls +189234 nngdwngf.jpm +102320 qbq +$ cd .. +$ cd sdwmbsz +$ ls +dir dfzw +dir jbnsvcv +dir jjgpvcqv +140827 jjgpvcqv.cvz +$ cd dfzw +$ ls +168631 dhbfr +$ cd .. +$ cd jbnsvcv +$ ls +dir bsnqsfm +20840 lsgnjrn +83537 lvtbqlh +dir qfmj +$ cd bsnqsfm +$ ls +74345 jrr.jnj +$ cd .. +$ cd qfmj +$ ls +dir bfvwng +dir jjgpvcqv +$ cd bfvwng +$ ls +dir qzdpp +$ cd qzdpp +$ ls +dir jjgpvcqv +$ cd jjgpvcqv +$ ls +207083 rchw.lgb +$ cd .. +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +273755 dqmb +$ cd .. +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +190922 dtqvbspj.rww +59784 lccnhn +293765 mwvpgtzm +dir vtbln +dir wph +$ cd vtbln +$ ls +19558 jrs.bdw +72791 lccnhn +262803 pnm.slh +40575 sbdz +$ cd .. +$ cd wph +$ ls +174151 jrr.jnj +$ cd .. +$ cd .. +$ cd .. +$ cd tjwht +$ ls +dir mgvdbtl +136586 rcsffv.gbt +$ cd mgvdbtl +$ ls +dir gtmbf +$ cd gtmbf +$ ls +61244 jvs.gvw +269474 rcsffv.gbt +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd wsd +$ ls +275247 dtqvbspj.mjl +dir gpcpgfh +dir jdnfsqzd +88516 jrr.jnj +77096 lccnhn +dir lspqh +dir pfcmb +120975 tqzmlsz +215518 zvzhjd.ggw +$ cd gpcpgfh +$ ls +217225 lccnhn +dir qtnqzql +$ cd qtnqzql +$ ls +242800 rzfvcjvh +$ cd .. +$ cd .. +$ cd jdnfsqzd +$ ls +293894 ppdh +310316 rcsffv.gbt +$ cd .. +$ cd lspqh +$ ls +dir pspghgw +$ cd pspghgw +$ ls +105894 gpcpgfh.zht +20657 nccmrdjv.tml +241440 nrb.zrj +$ cd .. +$ cd .. +$ cd pfcmb +$ ls +64751 cfnptz +dir dmlsqf +dir dtqvbspj +288252 nfcdscgz +309178 pnm.slh +$ cd dmlsqf +$ ls +82960 czhbvv.fvc +238189 dtqvbspj.mqp +232175 lccnhn +$ cd .. +$ cd dtqvbspj +$ ls +dir fpq +99045 jrs.bdw +$ cd fpq +$ ls +98034 bnbvjg.nfq +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd pqcndb +$ ls +dir dtqvbspj +dir fvrtmdg +dir gpcpgfh +dir jjgpvcqv +dir mgvdbtl +dir pftswtnl +302354 rcsffv.gbt +dir zwph +$ cd dtqvbspj +$ ls +134541 mgvdbtl.gbr +$ cd .. +$ cd fvrtmdg +$ ls +dir gpcpgfh +231704 gpcpgfh.cgh +304822 jrr.jnj +$ cd gpcpgfh +$ ls +64193 ztqztct.ctr +$ cd .. +$ cd .. +$ cd gpcpgfh +$ ls +dir cmg +129101 hqcjs.fsf +dir jjgpvcqv +dir lmb +dir lzgc +dir nqvzvfb +dir rbh +149226 tzgn.sqv +257657 zbjzcn +$ cd cmg +$ ls +54041 bbrbwdw.mtf +233793 dtqvbspj.hjj +227618 jjgpvcqv.sls +36553 rcsffv.gbt +dir vsjs +$ cd vsjs +$ ls +199262 bsnqsfm +dir dqpqvsfn +dir ghw +73538 jrs.bdw +20726 mtfzjhc +$ cd dqpqvsfn +$ ls +91215 ppfmvz +$ cd .. +$ cd ghw +$ ls +dir bwhn +307330 jrr.jnj +25726 pnm.slh +$ cd bwhn +$ ls +dir gpcpgfh +$ cd gpcpgfh +$ ls +61301 mhchvsnp.lpv +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +281936 zjfrwg +$ cd .. +$ cd lmb +$ ls +dir mmqr +$ cd mmqr +$ ls +60362 mbjdfmf.wfh +$ cd .. +$ cd .. +$ cd lzgc +$ ls +211543 rcsffv.gbt +$ cd .. +$ cd nqvzvfb +$ ls +288538 lccnhn +224852 rcsffv.gbt +$ cd .. +$ cd rbh +$ ls +dir cwgc +dir gpcpgfh +dir hdmmgms +dir jwqdv +75165 mgvdbtl.rdd +dir mzt +$ cd cwgc +$ ls +254910 ghsbvcw.wgh +$ cd .. +$ cd gpcpgfh +$ ls +8668 lccnhn +145750 mcpd +265522 rcsffv.gbt +$ cd .. +$ cd hdmmgms +$ ls +dir dtqvbspj +dir gpcpgfh +203642 jrs.bdw +19047 rcsffv.gbt +215131 tbdf +dir tgqbtw +$ cd dtqvbspj +$ ls +46484 hjztnq +14784 tmmf.ggs +$ cd .. +$ cd gpcpgfh +$ ls +123990 jrs.bdw +52381 mgvdbtl +130292 rrqp.pmz +$ cd .. +$ cd tgqbtw +$ ls +dir bsnqsfm +dir nnn +$ cd bsnqsfm +$ ls +279305 mgvdbtl.mhc +$ cd .. +$ cd nnn +$ ls +181320 jjgpvcqv.zcn +$ cd .. +$ cd .. +$ cd .. +$ cd jwqdv +$ ls +306471 jjgpvcqv.jbv +$ cd .. +$ cd mzt +$ ls +159120 wcfjbfsb.vlq +$ cd .. +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +dir drmmqldt +dir jjgpvcqv +235210 jjnbtgh +116214 lccnhn +dir mzj +dir qcclcdd +dir rtnnjct +dir trgbfqb +$ cd drmmqldt +$ ls +dir bsnqsfm +dir gpcpgfh +dir jjgpvcqv +$ cd bsnqsfm +$ ls +200217 gpcpgfh.bmf +$ cd .. +$ cd gpcpgfh +$ ls +183548 jjgpvcqv.cgs +119367 rcsffv.gbt +$ cd .. +$ cd jjgpvcqv +$ ls +dir bzhsjfq +dir lptnp +$ cd bzhsjfq +$ ls +37713 pnm.slh +$ cd .. +$ cd lptnp +$ ls +150154 jjgpvcqv.jpt +$ cd .. +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +dir csvpf +$ cd csvpf +$ ls +96915 bdsqr.ptg +15712 gpcpgfh.hbw +13419 pnm.slh +23191 vhzngpw.bdp +$ cd .. +$ cd .. +$ cd mzj +$ ls +216100 fblqpwgd.rmb +$ cd .. +$ cd qcclcdd +$ ls +67202 bdz.flj +51451 dtqvbspj +dir mgvdbtl +36642 rhc.qtg +252808 slqzl.hgz +$ cd mgvdbtl +$ ls +dir dtqvbspj +$ cd dtqvbspj +$ ls +142184 pnm.slh +$ cd .. +$ cd .. +$ cd .. +$ cd rtnnjct +$ ls +dir bsnqsfm +dir dtqvbspj +dir ftlr +dir grpln +dir wtjfbzjq +$ cd bsnqsfm +$ ls +dir gbp +$ cd gbp +$ ls +dir gpcpgfh +$ cd gpcpgfh +$ ls +157447 msdhpv +$ cd .. +$ cd .. +$ cd .. +$ cd dtqvbspj +$ ls +dir fbpz +dir mgvdbtl +$ cd fbpz +$ ls +118001 zzffss.qdv +$ cd .. +$ cd mgvdbtl +$ ls +dir gtbpnhhm +dir rvjdhdvf +$ cd gtbpnhhm +$ ls +115199 mgvdbtl.zhd +307710 pbqqz.dvg +$ cd .. +$ cd rvjdhdvf +$ ls +192704 lccnhn +49374 qsv.nzw +dir vnlq +$ cd vnlq +$ ls +dir zwtwvdb +$ cd zwtwvdb +$ ls +99356 cqfppfg.cwl +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd ftlr +$ ls +dir fdm +$ cd fdm +$ ls +dir pdzbthz +$ cd pdzbthz +$ ls +dir gmpzrfv +286299 gmvg +32579 jrr.jnj +$ cd gmpzrfv +$ ls +44930 tfwc.sjb +76143 wtwpz +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd grpln +$ ls +dir thsbgczd +dir vdmt +$ cd thsbgczd +$ ls +231385 lccnhn +$ cd .. +$ cd vdmt +$ ls +dir qzwzwlpr +$ cd qzwzwlpr +$ ls +119862 qbpglhp.pmz +$ cd .. +$ cd .. +$ cd .. +$ cd wtjfbzjq +$ ls +308656 cvjrn.mmz +107735 mgvdbtl.pjv +$ cd .. +$ cd .. +$ cd trgbfqb +$ ls +59890 jrr.jnj +dir mhhbp +$ cd mhhbp +$ ls +dir bsnqsfm +dir hvjtmr +$ cd bsnqsfm +$ ls +80555 trsl.zjm +$ cd .. +$ cd hvjtmr +$ ls +78682 cgjqlrw +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd mgvdbtl +$ ls +85693 bsnqsfm.jft +dir gpcpgfh +136814 gvfz +243282 jjgpvcqv.phc +23472 mrq +dir tdnhp +188849 ztrvjzw.gjj +$ cd gpcpgfh +$ ls +dir bfjb +172798 blt +dir dtqvbspj +dir lwtj +$ cd bfjb +$ ls +9385 fhgqhrnq +$ cd .. +$ cd dtqvbspj +$ ls +dir zrtpvzh +$ cd zrtpvzh +$ ls +115949 gjcpswqv.tqg +$ cd .. +$ cd .. +$ cd lwtj +$ ls +269246 dtqvbspj.tmv +106980 jrr.jnj +20735 ldjswqtb.plp +$ cd .. +$ cd .. +$ cd tdnhp +$ ls +25816 lccnhn +$ cd .. +$ cd .. +$ cd pftswtnl +$ ls +60146 blg.vhz +dir cjzl +dir mgvdbtl +165072 mgvdbtl.cvq +dir rdhdqvm +dir swgdh +dir tgwws +101085 wtvlsbbf +139565 zfhlb.fmg +$ cd cjzl +$ ls +51636 hmwmvgg +$ cd .. +$ cd mgvdbtl +$ ls +dir dtlr +118691 pjjfwhwj +74684 rcsffv.gbt +253814 rgmn.csn +$ cd dtlr +$ ls +43065 dtqvbspj +$ cd .. +$ cd .. +$ cd rdhdqvm +$ ls +103093 bsnqsfm.rjd +5514 lccnhn +$ cd .. +$ cd swgdh +$ ls +dir dwznjd +230643 jjgpvcqv +296232 ltnlhbln.bqp +dir mgvdbtl +dir nbpdfrv +199830 rcsffv.gbt +$ cd dwznjd +$ ls +138849 jrs.bdw +240327 mgvdbtl +$ cd .. +$ cd mgvdbtl +$ ls +293382 dgrzgpr +218657 jjgpvcqv.lwt +dir pbw +125455 rcsffv.gbt +$ cd pbw +$ ls +242621 tnt.zbl +$ cd .. +$ cd .. +$ cd nbpdfrv +$ ls +297826 nfqbq.zfg +183227 qvr +148665 rcsffv.gbt +$ cd .. +$ cd .. +$ cd tgwws +$ ls +dir bhr +dir gpcpgfh +$ cd bhr +$ ls +dir wfjfvb +$ cd wfjfvb +$ ls +dir jgfbpwjh +13720 lwnz +38140 wrgb.ntr +$ cd jgfbpwjh +$ ls +207048 cbtdqb +176591 mgvdbtl +311612 nwflw.mmp +92978 pwrrz +273467 rnzzs.wrr +dir vsmgcv +$ cd vsmgcv +$ ls +dir dpdmspz +$ cd dpdmspz +$ ls +dir bsnqsfm +$ cd bsnqsfm +$ ls +197093 wzqlhhpv.lgb +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd gpcpgfh +$ ls +98093 lccnhn +208835 llplrrr.jrp +$ cd .. +$ cd .. +$ cd .. +$ cd zwph +$ ls +dir cmznd +$ cd cmznd +$ ls +dir zhhm +$ cd zhhm +$ ls +204738 rjh.qjf +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd pwtqzwv +$ ls +21382 gbcccm.jdc +dir hthq +dir jcsmcf +dir jjgpvcqv +262556 mgvdbtl.vrm +dir twrjfd +dir zzclqz +$ cd hthq +$ ls +dir dtqvbspj +dir mgvdbtl +dir wgcss +$ cd dtqvbspj +$ ls +35525 gpcpgfh.wpc +4808 jjgpvcqv +dir lrvftwzb +dir nzvbpcwd +$ cd lrvftwzb +$ ls +92705 rcsffv.gbt +33209 wvthcng.qlf +$ cd .. +$ cd nzvbpcwd +$ ls +dir tzvclhw +$ cd tzvclhw +$ ls +251094 gpcpgfh.bpj +$ cd .. +$ cd .. +$ cd .. +$ cd mgvdbtl +$ ls +229319 hvzhcpr.dbc +301679 lrvlp.bnl +157154 pjq +129501 sgqsjl +$ cd .. +$ cd wgcss +$ ls +37019 fpmmqmv +286113 gpcpgfh.mrm +dir jjgpvcqv +132664 lccnhn +194995 pnm.slh +$ cd jjgpvcqv +$ ls +116833 pnm.slh +$ cd .. +$ cd .. +$ cd .. +$ cd jcsmcf +$ ls +146144 jjgpvcqv.jvj +$ cd .. +$ cd jjgpvcqv +$ ls +dir gdrqbn +dir nwbqdd +$ cd gdrqbn +$ ls +149865 bsnqsfm.zjh +1714 jjgpvcqv.lwq +$ cd .. +$ cd nwbqdd +$ ls +14359 bsnqsfm +77969 dpqt.lph +285861 dtqvbspj.svq +dir gpcpgfh +156597 hhsfwctl.hng +15497 mgvdbtl +$ cd gpcpgfh +$ ls +275833 gpcpgfh.hdd +$ cd .. +$ cd .. +$ cd .. +$ cd twrjfd +$ ls +302115 gpcpgfh.zcb +dir gqlqnpvm +20848 rcsffv.gbt +$ cd gqlqnpvm +$ ls +123135 gpcpgfh +57433 gpcpgfh.zfp +$ cd .. +$ cd .. +$ cd zzclqz +$ ls +217719 vcq.flg From 35fad0bd82c650a2939d9650e80797c9f9ffa973 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 7 Dec 2022 09:18:34 +0100 Subject: [PATCH 301/479] 2022: d07: ex1: add solution --- 2022/d07/ex1/ex1.py | 69 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100755 2022/d07/ex1/ex1.py diff --git a/2022/d07/ex1/ex1.py b/2022/d07/ex1/ex1.py new file mode 100755 index 0000000..43e49f1 --- /dev/null +++ b/2022/d07/ex1/ex1.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +import sys +from typing import Union + +FileSystem = dict[str, Union[int, "FileSystem"]] + + +def solve(input: list[str]) -> int: + def build_tree(input: list[str], i: int = 0) -> tuple[FileSystem, int]: + + fs: FileSystem = {} + + while i < len(input): + assert input[i][0] == "$" # Sanity check + command = input[i].split()[1:] + if command[0] == "ls": + while (i := i + 1) < len(input): + if input[i][0] == "$": + break + else: + type, name = input[i].split() + if type == "dir": + continue + fs[name] = int(type) + elif command[0] == "cd": + if command[1] == "..": + i += 1 + break + else: + fs[command[1]], i = build_tree(input, i + 1) + else: + assert False # Sanity check + + return fs, i + + def total_size( + fs: FileSystem, parent_path: str = "" + ) -> dict[str, tuple[int, bool]]: + sizes: dict[str, tuple[int, bool]] = {} + + for f, content in fs.items(): + path = f"{parent_path}/{f}" + if isinstance(content, int): + sizes[path] = content, False + elif isinstance(content, dict): + children_sizes = total_size(content, path) + total = sum(children_sizes[f"{path}/{c}"][0] for c in content.keys()) + sizes[path] = total, True + sizes.update(children_sizes) + else: + assert False # Sanity check + + return sizes + + fs, i = build_tree(input) + assert i == len(input) # Sanity check + sizes = total_size(fs) + THRESHOLD = 100000 + return sum(size for size, is_dir in sizes.values() if is_dir and size <= THRESHOLD) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 8d8feac39003b5c3024d072ba2d82d62817067ac Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 7 Dec 2022 09:18:41 +0100 Subject: [PATCH 302/479] 2022: d07: ex2: add input --- 2022/d07/ex2/input | 1010 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1010 insertions(+) create mode 100644 2022/d07/ex2/input diff --git a/2022/d07/ex2/input b/2022/d07/ex2/input new file mode 100644 index 0000000..a3077b9 --- /dev/null +++ b/2022/d07/ex2/input @@ -0,0 +1,1010 @@ +$ cd / +$ ls +dir bsnqsfm +dir dtqvbspj +dir hhhtrws +dir ldmsq +307337 pnm.slh +dir pqcndb +dir pwtqzwv +212421 zcrfndg.cms +$ cd bsnqsfm +$ ls +179236 lccnhn +$ cd .. +$ cd dtqvbspj +$ ls +221336 gdjfp.mfp +273114 jjgpvcqv.jlq +$ cd .. +$ cd hhhtrws +$ ls +dir gcbg +dir jjgpvcqv +dir mgvdbtl +1606 mgvdbtl.ztt +dir qhv +27538 wprqtd.wph +$ cd gcbg +$ ls +dir bgcwh +dir bsnqsfm +dir jjgpvcqv +186683 lccnhn +dir rqbnd +32944 zjfs.mdf +$ cd bgcwh +$ ls +211273 nvns +$ cd .. +$ cd bsnqsfm +$ ls +dir bsnqsfm +210022 dtqvbspj +dir gpcpgfh +189603 pnm.slh +199755 rcsffv.gbt +$ cd bsnqsfm +$ ls +292856 bsnqsfm.vww +$ cd .. +$ cd gpcpgfh +$ ls +177703 jrr.jnj +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +233963 bsnqsfm.fnn +127603 gpcpgfh.gtw +dir jjgpvcqv +48213 jrs.bdw +172974 pnm.slh +$ cd jjgpvcqv +$ ls +dir bqnctqvn +dir bsnqsfm +dir gpcpgfh +254570 qpmnqwvl +258040 rrvjrv.zbp +$ cd bqnctqvn +$ ls +106211 bsnqsfm.pql +299973 dtqvbspj +dir nzrst +$ cd nzrst +$ ls +dir whtfvrl +$ cd whtfvrl +$ ls +12412 vzdrqs.rwt +$ cd .. +$ cd .. +$ cd .. +$ cd bsnqsfm +$ ls +293832 bggllqhj.dvb +$ cd .. +$ cd gpcpgfh +$ ls +196159 jrr.jnj +$ cd .. +$ cd .. +$ cd .. +$ cd rqbnd +$ ls +97630 ddjrjp +56378 rsb +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +89238 bsnqsfm.mgf +dir dvsst +dir gpcpgfh +dir jjgpvcqv +dir mhrzj +164176 pnm.slh +dir tmh +dir vmwz +$ cd dvsst +$ ls +286924 dtqvbspj +252366 hcnqdmg.zst +266562 wgfdmgmh.ptw +$ cd .. +$ cd gpcpgfh +$ ls +91199 jrs.bdw +78761 rspd.vmj +dir tbrbw +dir vvm +dir wplf +$ cd tbrbw +$ ls +195696 bjd.csj +56063 lccnhn +193863 pnm.slh +121918 qpd.dtq +209757 rcsffv.gbt +dir rmqlpvq +$ cd rmqlpvq +$ ls +dir gjgfvt +255533 lhdqqbg.fgm +68413 qltvgnrp.gfd +dir wqfcnlzq +$ cd gjgfvt +$ ls +242867 zqbdmpb +$ cd .. +$ cd wqfcnlzq +$ ls +dir vhhscrvb +$ cd vhhscrvb +$ ls +62647 rcsffv.gbt +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd vvm +$ ls +281698 dscllv.qwl +14348 rmgpnprq +$ cd .. +$ cd wplf +$ ls +44465 jjgpvcqv +248434 vpsfbjh.zsj +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +dir dhfcbc +dir jjgpvcqv +dir ltclg +dir ptbsgmlr +$ cd dhfcbc +$ ls +224134 lccnhn +197124 tns +$ cd .. +$ cd jjgpvcqv +$ ls +126322 jrr.jnj +280287 jrs.bdw +$ cd .. +$ cd ltclg +$ ls +dir fdfn +47501 jrr.jnj +dir mgvdbtl +24374 mgvdbtl.gll +227751 pnm.slh +286088 wvsfr +$ cd fdfn +$ ls +32987 hmt +$ cd .. +$ cd mgvdbtl +$ ls +201629 pnm.slh +246591 whtcjvh +$ cd .. +$ cd .. +$ cd ptbsgmlr +$ ls +239257 rcsffv.gbt +$ cd .. +$ cd .. +$ cd mhrzj +$ ls +279222 mgvdbtl.rzf +214102 rvjnddbr +$ cd .. +$ cd tmh +$ ls +152958 rcsffv.gbt +$ cd .. +$ cd vmwz +$ ls +131525 bsnqsfm.djc +122342 jrs.bdw +$ cd .. +$ cd .. +$ cd mgvdbtl +$ ls +24916 tcsltrml +$ cd .. +$ cd qhv +$ ls +dir hncvrlbw +153239 jwdg.wbg +$ cd hncvrlbw +$ ls +178499 clmwn.ztj +297967 jrr.jnj +30359 sntbnf.whh +$ cd .. +$ cd .. +$ cd .. +$ cd ldmsq +$ ls +dir jngnzc +dir psgrjgr +dir rgwp +dir rtsmnzm +dir wsd +$ cd jngnzc +$ ls +dir dzlcq +dir gpcpgfh +dir rlwwwngc +dir swrlvd +$ cd dzlcq +$ ls +70984 lccnhn +$ cd .. +$ cd gpcpgfh +$ ls +288159 hztmtp.fpj +$ cd .. +$ cd rlwwwngc +$ ls +173335 bsnqsfm.rtr +292723 jrr.jnj +175123 lccnhn +$ cd .. +$ cd swrlvd +$ ls +69589 fwrt +$ cd .. +$ cd .. +$ cd psgrjgr +$ ls +283186 dtqvbspj.hjw +dir fcvqsp +104691 jrs.bdw +286657 lccnhn +258194 rcsffv.gbt +$ cd fcvqsp +$ ls +209758 fzqmqlvs.hsc +$ cd .. +$ cd .. +$ cd rgwp +$ ls +11060 nwg.qcg +$ cd .. +$ cd rtsmnzm +$ ls +dir rdv +dir sdwmbsz +dir tjwht +$ cd rdv +$ ls +189234 nngdwngf.jpm +102320 qbq +$ cd .. +$ cd sdwmbsz +$ ls +dir dfzw +dir jbnsvcv +dir jjgpvcqv +140827 jjgpvcqv.cvz +$ cd dfzw +$ ls +168631 dhbfr +$ cd .. +$ cd jbnsvcv +$ ls +dir bsnqsfm +20840 lsgnjrn +83537 lvtbqlh +dir qfmj +$ cd bsnqsfm +$ ls +74345 jrr.jnj +$ cd .. +$ cd qfmj +$ ls +dir bfvwng +dir jjgpvcqv +$ cd bfvwng +$ ls +dir qzdpp +$ cd qzdpp +$ ls +dir jjgpvcqv +$ cd jjgpvcqv +$ ls +207083 rchw.lgb +$ cd .. +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +273755 dqmb +$ cd .. +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +190922 dtqvbspj.rww +59784 lccnhn +293765 mwvpgtzm +dir vtbln +dir wph +$ cd vtbln +$ ls +19558 jrs.bdw +72791 lccnhn +262803 pnm.slh +40575 sbdz +$ cd .. +$ cd wph +$ ls +174151 jrr.jnj +$ cd .. +$ cd .. +$ cd .. +$ cd tjwht +$ ls +dir mgvdbtl +136586 rcsffv.gbt +$ cd mgvdbtl +$ ls +dir gtmbf +$ cd gtmbf +$ ls +61244 jvs.gvw +269474 rcsffv.gbt +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd wsd +$ ls +275247 dtqvbspj.mjl +dir gpcpgfh +dir jdnfsqzd +88516 jrr.jnj +77096 lccnhn +dir lspqh +dir pfcmb +120975 tqzmlsz +215518 zvzhjd.ggw +$ cd gpcpgfh +$ ls +217225 lccnhn +dir qtnqzql +$ cd qtnqzql +$ ls +242800 rzfvcjvh +$ cd .. +$ cd .. +$ cd jdnfsqzd +$ ls +293894 ppdh +310316 rcsffv.gbt +$ cd .. +$ cd lspqh +$ ls +dir pspghgw +$ cd pspghgw +$ ls +105894 gpcpgfh.zht +20657 nccmrdjv.tml +241440 nrb.zrj +$ cd .. +$ cd .. +$ cd pfcmb +$ ls +64751 cfnptz +dir dmlsqf +dir dtqvbspj +288252 nfcdscgz +309178 pnm.slh +$ cd dmlsqf +$ ls +82960 czhbvv.fvc +238189 dtqvbspj.mqp +232175 lccnhn +$ cd .. +$ cd dtqvbspj +$ ls +dir fpq +99045 jrs.bdw +$ cd fpq +$ ls +98034 bnbvjg.nfq +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd pqcndb +$ ls +dir dtqvbspj +dir fvrtmdg +dir gpcpgfh +dir jjgpvcqv +dir mgvdbtl +dir pftswtnl +302354 rcsffv.gbt +dir zwph +$ cd dtqvbspj +$ ls +134541 mgvdbtl.gbr +$ cd .. +$ cd fvrtmdg +$ ls +dir gpcpgfh +231704 gpcpgfh.cgh +304822 jrr.jnj +$ cd gpcpgfh +$ ls +64193 ztqztct.ctr +$ cd .. +$ cd .. +$ cd gpcpgfh +$ ls +dir cmg +129101 hqcjs.fsf +dir jjgpvcqv +dir lmb +dir lzgc +dir nqvzvfb +dir rbh +149226 tzgn.sqv +257657 zbjzcn +$ cd cmg +$ ls +54041 bbrbwdw.mtf +233793 dtqvbspj.hjj +227618 jjgpvcqv.sls +36553 rcsffv.gbt +dir vsjs +$ cd vsjs +$ ls +199262 bsnqsfm +dir dqpqvsfn +dir ghw +73538 jrs.bdw +20726 mtfzjhc +$ cd dqpqvsfn +$ ls +91215 ppfmvz +$ cd .. +$ cd ghw +$ ls +dir bwhn +307330 jrr.jnj +25726 pnm.slh +$ cd bwhn +$ ls +dir gpcpgfh +$ cd gpcpgfh +$ ls +61301 mhchvsnp.lpv +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +281936 zjfrwg +$ cd .. +$ cd lmb +$ ls +dir mmqr +$ cd mmqr +$ ls +60362 mbjdfmf.wfh +$ cd .. +$ cd .. +$ cd lzgc +$ ls +211543 rcsffv.gbt +$ cd .. +$ cd nqvzvfb +$ ls +288538 lccnhn +224852 rcsffv.gbt +$ cd .. +$ cd rbh +$ ls +dir cwgc +dir gpcpgfh +dir hdmmgms +dir jwqdv +75165 mgvdbtl.rdd +dir mzt +$ cd cwgc +$ ls +254910 ghsbvcw.wgh +$ cd .. +$ cd gpcpgfh +$ ls +8668 lccnhn +145750 mcpd +265522 rcsffv.gbt +$ cd .. +$ cd hdmmgms +$ ls +dir dtqvbspj +dir gpcpgfh +203642 jrs.bdw +19047 rcsffv.gbt +215131 tbdf +dir tgqbtw +$ cd dtqvbspj +$ ls +46484 hjztnq +14784 tmmf.ggs +$ cd .. +$ cd gpcpgfh +$ ls +123990 jrs.bdw +52381 mgvdbtl +130292 rrqp.pmz +$ cd .. +$ cd tgqbtw +$ ls +dir bsnqsfm +dir nnn +$ cd bsnqsfm +$ ls +279305 mgvdbtl.mhc +$ cd .. +$ cd nnn +$ ls +181320 jjgpvcqv.zcn +$ cd .. +$ cd .. +$ cd .. +$ cd jwqdv +$ ls +306471 jjgpvcqv.jbv +$ cd .. +$ cd mzt +$ ls +159120 wcfjbfsb.vlq +$ cd .. +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +dir drmmqldt +dir jjgpvcqv +235210 jjnbtgh +116214 lccnhn +dir mzj +dir qcclcdd +dir rtnnjct +dir trgbfqb +$ cd drmmqldt +$ ls +dir bsnqsfm +dir gpcpgfh +dir jjgpvcqv +$ cd bsnqsfm +$ ls +200217 gpcpgfh.bmf +$ cd .. +$ cd gpcpgfh +$ ls +183548 jjgpvcqv.cgs +119367 rcsffv.gbt +$ cd .. +$ cd jjgpvcqv +$ ls +dir bzhsjfq +dir lptnp +$ cd bzhsjfq +$ ls +37713 pnm.slh +$ cd .. +$ cd lptnp +$ ls +150154 jjgpvcqv.jpt +$ cd .. +$ cd .. +$ cd .. +$ cd jjgpvcqv +$ ls +dir csvpf +$ cd csvpf +$ ls +96915 bdsqr.ptg +15712 gpcpgfh.hbw +13419 pnm.slh +23191 vhzngpw.bdp +$ cd .. +$ cd .. +$ cd mzj +$ ls +216100 fblqpwgd.rmb +$ cd .. +$ cd qcclcdd +$ ls +67202 bdz.flj +51451 dtqvbspj +dir mgvdbtl +36642 rhc.qtg +252808 slqzl.hgz +$ cd mgvdbtl +$ ls +dir dtqvbspj +$ cd dtqvbspj +$ ls +142184 pnm.slh +$ cd .. +$ cd .. +$ cd .. +$ cd rtnnjct +$ ls +dir bsnqsfm +dir dtqvbspj +dir ftlr +dir grpln +dir wtjfbzjq +$ cd bsnqsfm +$ ls +dir gbp +$ cd gbp +$ ls +dir gpcpgfh +$ cd gpcpgfh +$ ls +157447 msdhpv +$ cd .. +$ cd .. +$ cd .. +$ cd dtqvbspj +$ ls +dir fbpz +dir mgvdbtl +$ cd fbpz +$ ls +118001 zzffss.qdv +$ cd .. +$ cd mgvdbtl +$ ls +dir gtbpnhhm +dir rvjdhdvf +$ cd gtbpnhhm +$ ls +115199 mgvdbtl.zhd +307710 pbqqz.dvg +$ cd .. +$ cd rvjdhdvf +$ ls +192704 lccnhn +49374 qsv.nzw +dir vnlq +$ cd vnlq +$ ls +dir zwtwvdb +$ cd zwtwvdb +$ ls +99356 cqfppfg.cwl +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd ftlr +$ ls +dir fdm +$ cd fdm +$ ls +dir pdzbthz +$ cd pdzbthz +$ ls +dir gmpzrfv +286299 gmvg +32579 jrr.jnj +$ cd gmpzrfv +$ ls +44930 tfwc.sjb +76143 wtwpz +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd grpln +$ ls +dir thsbgczd +dir vdmt +$ cd thsbgczd +$ ls +231385 lccnhn +$ cd .. +$ cd vdmt +$ ls +dir qzwzwlpr +$ cd qzwzwlpr +$ ls +119862 qbpglhp.pmz +$ cd .. +$ cd .. +$ cd .. +$ cd wtjfbzjq +$ ls +308656 cvjrn.mmz +107735 mgvdbtl.pjv +$ cd .. +$ cd .. +$ cd trgbfqb +$ ls +59890 jrr.jnj +dir mhhbp +$ cd mhhbp +$ ls +dir bsnqsfm +dir hvjtmr +$ cd bsnqsfm +$ ls +80555 trsl.zjm +$ cd .. +$ cd hvjtmr +$ ls +78682 cgjqlrw +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd mgvdbtl +$ ls +85693 bsnqsfm.jft +dir gpcpgfh +136814 gvfz +243282 jjgpvcqv.phc +23472 mrq +dir tdnhp +188849 ztrvjzw.gjj +$ cd gpcpgfh +$ ls +dir bfjb +172798 blt +dir dtqvbspj +dir lwtj +$ cd bfjb +$ ls +9385 fhgqhrnq +$ cd .. +$ cd dtqvbspj +$ ls +dir zrtpvzh +$ cd zrtpvzh +$ ls +115949 gjcpswqv.tqg +$ cd .. +$ cd .. +$ cd lwtj +$ ls +269246 dtqvbspj.tmv +106980 jrr.jnj +20735 ldjswqtb.plp +$ cd .. +$ cd .. +$ cd tdnhp +$ ls +25816 lccnhn +$ cd .. +$ cd .. +$ cd pftswtnl +$ ls +60146 blg.vhz +dir cjzl +dir mgvdbtl +165072 mgvdbtl.cvq +dir rdhdqvm +dir swgdh +dir tgwws +101085 wtvlsbbf +139565 zfhlb.fmg +$ cd cjzl +$ ls +51636 hmwmvgg +$ cd .. +$ cd mgvdbtl +$ ls +dir dtlr +118691 pjjfwhwj +74684 rcsffv.gbt +253814 rgmn.csn +$ cd dtlr +$ ls +43065 dtqvbspj +$ cd .. +$ cd .. +$ cd rdhdqvm +$ ls +103093 bsnqsfm.rjd +5514 lccnhn +$ cd .. +$ cd swgdh +$ ls +dir dwznjd +230643 jjgpvcqv +296232 ltnlhbln.bqp +dir mgvdbtl +dir nbpdfrv +199830 rcsffv.gbt +$ cd dwznjd +$ ls +138849 jrs.bdw +240327 mgvdbtl +$ cd .. +$ cd mgvdbtl +$ ls +293382 dgrzgpr +218657 jjgpvcqv.lwt +dir pbw +125455 rcsffv.gbt +$ cd pbw +$ ls +242621 tnt.zbl +$ cd .. +$ cd .. +$ cd nbpdfrv +$ ls +297826 nfqbq.zfg +183227 qvr +148665 rcsffv.gbt +$ cd .. +$ cd .. +$ cd tgwws +$ ls +dir bhr +dir gpcpgfh +$ cd bhr +$ ls +dir wfjfvb +$ cd wfjfvb +$ ls +dir jgfbpwjh +13720 lwnz +38140 wrgb.ntr +$ cd jgfbpwjh +$ ls +207048 cbtdqb +176591 mgvdbtl +311612 nwflw.mmp +92978 pwrrz +273467 rnzzs.wrr +dir vsmgcv +$ cd vsmgcv +$ ls +dir dpdmspz +$ cd dpdmspz +$ ls +dir bsnqsfm +$ cd bsnqsfm +$ ls +197093 wzqlhhpv.lgb +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd gpcpgfh +$ ls +98093 lccnhn +208835 llplrrr.jrp +$ cd .. +$ cd .. +$ cd .. +$ cd zwph +$ ls +dir cmznd +$ cd cmznd +$ ls +dir zhhm +$ cd zhhm +$ ls +204738 rjh.qjf +$ cd .. +$ cd .. +$ cd .. +$ cd .. +$ cd pwtqzwv +$ ls +21382 gbcccm.jdc +dir hthq +dir jcsmcf +dir jjgpvcqv +262556 mgvdbtl.vrm +dir twrjfd +dir zzclqz +$ cd hthq +$ ls +dir dtqvbspj +dir mgvdbtl +dir wgcss +$ cd dtqvbspj +$ ls +35525 gpcpgfh.wpc +4808 jjgpvcqv +dir lrvftwzb +dir nzvbpcwd +$ cd lrvftwzb +$ ls +92705 rcsffv.gbt +33209 wvthcng.qlf +$ cd .. +$ cd nzvbpcwd +$ ls +dir tzvclhw +$ cd tzvclhw +$ ls +251094 gpcpgfh.bpj +$ cd .. +$ cd .. +$ cd .. +$ cd mgvdbtl +$ ls +229319 hvzhcpr.dbc +301679 lrvlp.bnl +157154 pjq +129501 sgqsjl +$ cd .. +$ cd wgcss +$ ls +37019 fpmmqmv +286113 gpcpgfh.mrm +dir jjgpvcqv +132664 lccnhn +194995 pnm.slh +$ cd jjgpvcqv +$ ls +116833 pnm.slh +$ cd .. +$ cd .. +$ cd .. +$ cd jcsmcf +$ ls +146144 jjgpvcqv.jvj +$ cd .. +$ cd jjgpvcqv +$ ls +dir gdrqbn +dir nwbqdd +$ cd gdrqbn +$ ls +149865 bsnqsfm.zjh +1714 jjgpvcqv.lwq +$ cd .. +$ cd nwbqdd +$ ls +14359 bsnqsfm +77969 dpqt.lph +285861 dtqvbspj.svq +dir gpcpgfh +156597 hhsfwctl.hng +15497 mgvdbtl +$ cd gpcpgfh +$ ls +275833 gpcpgfh.hdd +$ cd .. +$ cd .. +$ cd .. +$ cd twrjfd +$ ls +302115 gpcpgfh.zcb +dir gqlqnpvm +20848 rcsffv.gbt +$ cd gqlqnpvm +$ ls +123135 gpcpgfh +57433 gpcpgfh.zfp +$ cd .. +$ cd .. +$ cd zzclqz +$ ls +217719 vcq.flg From 7dbf22de6b8b260440e15391f60e6366d4a8bc35 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 7 Dec 2022 09:18:47 +0100 Subject: [PATCH 303/479] 2022: d07: ex2: add solution --- 2022/d07/ex2/ex2.py | 70 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100755 2022/d07/ex2/ex2.py diff --git a/2022/d07/ex2/ex2.py b/2022/d07/ex2/ex2.py new file mode 100755 index 0000000..9886cf0 --- /dev/null +++ b/2022/d07/ex2/ex2.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +import sys +from typing import Union + +FileSystem = dict[str, Union[int, "FileSystem"]] + + +def solve(input: list[str]) -> int: + def build_tree(input: list[str], i: int = 0) -> tuple[FileSystem, int]: + + fs: FileSystem = {} + + while i < len(input): + assert input[i][0] == "$" # Sanity check + command = input[i].split()[1:] + if command[0] == "ls": + while (i := i + 1) < len(input): + if input[i][0] == "$": + break + else: + type, name = input[i].split() + if type == "dir": + continue + fs[name] = int(type) + elif command[0] == "cd": + if command[1] == "..": + i += 1 + break + else: + fs[command[1]], i = build_tree(input, i + 1) + else: + assert False # Sanity check + + return fs, i + + def total_size( + fs: FileSystem, parent_path: str = "" + ) -> dict[str, tuple[int, bool]]: + sizes: dict[str, tuple[int, bool]] = {} + + for f, content in fs.items(): + path = f"{parent_path}/{f}" + if isinstance(content, int): + sizes[path] = content, False + elif isinstance(content, dict): + children_sizes = total_size(content, path) + total = sum(children_sizes[f"{path}/{c}"][0] for c in content.keys()) + sizes[path] = total, True + sizes.update(children_sizes) + else: + assert False # Sanity check + + return sizes + + fs, i = build_tree(input) + assert i == len(input) # Sanity check + sizes = total_size(fs) + THRESHOLD = 30000000 - (70000000 - sizes["//"][0]) + assert THRESHOLD > 0 # Sanity check + return min(size for size, is_dir in sizes.values() if is_dir and size >= THRESHOLD) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From e75cb939d7f724983278ade6e2e41059dd285ee2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 8 Dec 2022 08:19:05 +0100 Subject: [PATCH 304/479] 2022: d08: ex1: add input --- 2022/d08/ex1/input | 99 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 2022/d08/ex1/input diff --git a/2022/d08/ex1/input b/2022/d08/ex1/input new file mode 100644 index 0000000..48e296f --- /dev/null +++ b/2022/d08/ex1/input @@ -0,0 +1,99 @@ +404310113342042430523206553054613026452223317713352040314520532034136044035422242052404520323121423 +120022131035104020413264056552251024207112052153646716635163015540126546334604634352130343204203212 +114444043404350333465355412140536532335724647116565610572546474626506052303052063065052530351012030 +212240414554223531015555065165021520410363021033163304514155663733352116600665403462501544352500033 +324144130111224105125305614015103771206061460425505011635353313773273343325122626415203015344311232 +113245430241150240464126012614135430370003075735010164413125456766205302613425655024334411031155403 +441245002130523346005210411662277072426351216071200446765701447237330324567025204602342520044502121 +214045553122025654652221354616163561012500762010384874262074144065234401637722263412266464251452314 +420554052436551160102504245073471242400253801258004372606111667766236046654353552356241642235535400 +230444034403653045355316273427144521155460537330375254634265217831710133466511570022515061342332314 +215330305636623403455371527067601715250678103470620507380025232122252031461570076036342312211025412 +152531154664324333510065716166433534816054420634864077383448250450766671674224724566465113516230555 +214332343546262452365454705617472281546633211772075171047360414071436550632720021764434561305210301 +111443005611044613477737043746056557178022072372401206038184673647422320773366100676006211551510212 +133313521334520014277727658110473505777283286103991788280475205774027243280366061162025220015443455 +155404252050544375401645717463634684248661783289138494563725362778686756122861113531553244022156404 +101264441110131756443257557872335606716942314559648922296471179061870856246756574324520340610552502 +552345216103355364312158072306454410946149736569151493634487672710443362287688034427626033035266435 +032116136355447236216431376728258285654613995348237354962282338329733408310145842020562245054642441 +224363655451243141363087456580326751652471257429153117112342588642859256252141665722503521125022565 +203656402177710126565314466702484652152875481365818345352121487714962821315157703464343750046056642 +556042122224622324270101114885994351144861589211656115175234527658398149331284812500044434453264665 +333402317273401421323318415855844499641764213948757537893227517242385296970317342824206711503004500 +341045445002443367084450562962259886574728664877676766689484955395194385797583863611332250124025511 +530441155216276525375870173389743919985448259629562325456237285529598688811050240824703721074602060 +320021441136216827813607342916845194696625696785568454728524752386544154132864251748117643644612016 +356236015127477502168551236473444979246675949449587984562945859468987964451443376640177554302403555 +521032161450418348764563917129159623593365988455562286236885389659621188427923285451742156213351116 +161327255665606701821864175493119539272489637754729983857664245665796727199928145136462257620362465 +324256011240774073378929732467468357478524626995373968674237767743387885552216853467388044247756643 +342275312602047038565615877434724873572784389557789777857693948752846554139723438258054200025014665 +051242516637708146638198373275222758924486548779744574439965559638384373152521363134036477637737533 +643152555635778437871298236855485688298578349488385645847564753765967563925377954286572876073532255 +052252355510464443878597562686999366353446874577654743895687373779864325297372128203202721414431575 +003626454683627045725543215594452394956436955758673339474559874959389629573279978978206522053161354 +627516237702078544682942119397343558584845947957956986767739349699889797692213624665730454802067156 +200457151510133551651137637224323537736454384779467644967339586954746668462789875763614758041306350 +335154370506881211537946276895249658859666595888979499974679997597784647296794417997582782381025574 +417013603706282285595672445598476844553485594594694865577988599545878778554434654896767653370600163 +151076753567166396584462282676939868463579768879699478585698835334464668886671938943507604626741055 +316424603540766436474549593426596456855354984858479546978868766769885893482223982736645038024543705 +004215748043040351658449499986735473677885875695647795765956883964888467568526739498861211513560376 +277541056808037332121324298298467888439897499685669789559864468637637659443647357982947036001076457 +301501750655275336942638945358964763536465468989488667796645858846573465972686416787340853151245644 +712676410408042175645992725856638455389978885467555675756857577896385395967245722641824067046404672 +127263578732604583334129426765554856475867757556696788664596649687355745252374587569983167874135470 +372567082480204357437552435378439546954796599589886886999448548554873566373887522667838861416626063 +504053336576743468622556295365645349984889785678558796559694969799447958394395964464961434514564147 +064634031154473874813798648457894764786965996797567598577449556796733655629459883126531875350855667 +400242382466736377478123774763774843994888788596767997699956676943467867843525339987287625323107646 +574363428370183567442332638863797996446594766875586998755697498794589458457898531351415551433522556 +412167557672308712367589426397979758975789888776586986996554696687355758873775853874897420702317101 +770303703378804536976332878328747387584568459887597696678765458466869646823658768383568726667515101 +452233157246118285247999798264378649666585777768676869779576767654376979948352929633336613662437752 +445720367378533569416697754293496373467957556998785966978548459859767957423835655379853826412537652 +743314715884636853952588482996464655775879867757788958998964888966363788982234644268286248732605364 +421252340411081749754123523897998635856478675875579877695848758757598799352859935972592464121200154 +240060534144421235633966383826944588955556569877797756857998594637769364656894472644372534212151333 +030406408132303595787173445575575686448657959549968444868588895645466777395756386243943041550563144 +273114334761050642652349846942498578754978859865947785499768464999467827979546133588431400553072571 +545140256541065084978642274659978546685549897854997987959494546787556536925383718147440765477035264 +213551156551872738118554524476466757347767578664548796858878373885346253453663631131187832513353720 +031302225003187455433275258559853476398764745884957978785699446894568423546775622669458815340346707 +622067430504086108575211657573256737949367744989999457768543933556446848583667956928715425470730162 +242111564658304088777519536233444248435478893367596684875833738467857765957226924427228481325217576 +364055473230737526383625952385867723976677963779587753646766774437577338682519314383352032477133503 +321304645532064452197673316923724578983475574649393989787463485775923766996461422676353215802454115 +233105015700144131749152169592849597799334664843639757588555464399727868723189114371617811204424461 +200116461554525361612654498296559659356483355845588365383658756592935783639172813284867400343573434 +063667611325433422432889612288938865635845895684777885359355942764253445159748552521586663111276320 +602227464555468655756429585352455445365885785394937349896765628578363566623445953670505237256637361 +565061226117741561827365137945864958743698627664964883854386585344264536463794276685706331233201162 +022104543457075344433186746554898622888662879483534875732366545699493494249416960261188772111451356 +436620604222365732527426815953936962792895744565572436255439745543587676567692850112721235162354066 +131524412733104587364628695894553856954929535227798584623638988936368718849285573225440174764501540 +542435561362065510830610739646131257342496749563278998673868857392617956152266780580611770145235126 +403602071007077303754367568233894922487258962426625788335236293726841614813262288087316403413301325 +653365633721421431240238511233988284565865357732839935658824268124333235971843281322245237465244640 +306442137750441441547377231538498282333378867895866774269433657996442236932105133474315101276433026 +026362613577242456258634050671963436933444863559863424588962566983574869370120588454323506304034454 +324415624033560610606167505705335537131257342423913353449125925341756615871358508731521557026114366 +444331064667665623244155236812366396427328522481655365283852878951317624280585607560532023416160531 +356100663130344012403254770320017162464663432371564992618187659799885888814177114132251720346235260 +335255502200627412653317161700362276552642826696514719212976746877872577501286045667131741121615252 +432342461115176570456177856545043415022291419917157172495246595828707718465323075462216735351424603 +052014513044443630413221560860665817858636725794462229844935048786680202681024216170152252502634130 +020320466436640542335164431658623622013245024685776848188641088056885388363367731111662103514422342 +243313636453126262451331254501288620001007675817755413767166283281358125642646705337503156330264143 +322052011503256425407127570260816542455843672731851386601352556410113100252536057366522542640013024 +122243505446640664755657664365330525660042002157156113773258264460845541635501120634115505113335223 +400325240315062161366031440416477741684364564857378773141186841270761406731633364031611642530523212 +033035153153462216052744630367426463087060858055232515783208471176613722677126341566006053644200442 +235202335236553544540304237444375273744171216804617062750281644425671760635002322246613220112112312 +424551125551101552103143451563560236361153202606118476772167626160624534653670012136420410040115003 +433115113101302300404521334255672566234211040710503455555073775502462316364453256460002143312311050 +113231445145014641142635155170110005103066306721236312425606163376276006132006331601341420241440202 +124001123533434316253543204160331101266365020140476416102251147360064153500112411356634011134351330 +004034442142153246064264662030666771573157310340000724745700036734054206654603230345313434140344030 +321402405400252420216445132115124427151235102635446313422013474177203430646340442422400002232222342 From d793a7441ce463b461df0f96867be67659f151f8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 8 Dec 2022 08:19:10 +0100 Subject: [PATCH 305/479] 2022: d08: ex1: add solution --- 2022/d08/ex1/ex1.py | 55 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100755 2022/d08/ex1/ex1.py diff --git a/2022/d08/ex1/ex1.py b/2022/d08/ex1/ex1.py new file mode 100755 index 0000000..204f855 --- /dev/null +++ b/2022/d08/ex1/ex1.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +import dataclasses +import sys +from collections.abc import Iterator + + +@dataclasses.dataclass +class Point: + x: int + y: int + + +def solve(input: list[list[int]]) -> int: + def up(p: Point) -> Iterator[Point]: + x = p.x + while (x := x - 1) >= 0: + yield Point(x, p.y) + + def down(p: Point) -> Iterator[Point]: + x = p.x + while (x := x + 1) < len(input): + yield Point(x, p.y) + + def left(p: Point) -> Iterator[Point]: + y = p.y + while (y := y - 1) >= 0: + yield Point(p.x, y) + + def right(p: Point) -> Iterator[Point]: + y = p.y + while (y := y + 1) < len(input[0]): + yield Point(p.x, y) + + def is_visible(p: Point) -> bool: + height = input[p.x][p.y] + for neighbours in (up, down, left, right): + if all(input[n.x][n.y] < height for n in neighbours(p)): + return True + return False + + visibility = [ + [is_visible(Point(x, y)) for y in range(len(input[x]))] + for x in range(len(input)) + ] + return sum(map(sum, visibility)) + + +def main() -> None: + input = [[int(c) for c in line] for line in sys.stdin.read().splitlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 6deca8b1d31f21d3a019f45b7f021d20dfe5f0b9 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 8 Dec 2022 08:19:23 +0100 Subject: [PATCH 306/479] 2022: d08: ex2: add input --- 2022/d08/ex2/input | 99 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 2022/d08/ex2/input diff --git a/2022/d08/ex2/input b/2022/d08/ex2/input new file mode 100644 index 0000000..48e296f --- /dev/null +++ b/2022/d08/ex2/input @@ -0,0 +1,99 @@ +404310113342042430523206553054613026452223317713352040314520532034136044035422242052404520323121423 +120022131035104020413264056552251024207112052153646716635163015540126546334604634352130343204203212 +114444043404350333465355412140536532335724647116565610572546474626506052303052063065052530351012030 +212240414554223531015555065165021520410363021033163304514155663733352116600665403462501544352500033 +324144130111224105125305614015103771206061460425505011635353313773273343325122626415203015344311232 +113245430241150240464126012614135430370003075735010164413125456766205302613425655024334411031155403 +441245002130523346005210411662277072426351216071200446765701447237330324567025204602342520044502121 +214045553122025654652221354616163561012500762010384874262074144065234401637722263412266464251452314 +420554052436551160102504245073471242400253801258004372606111667766236046654353552356241642235535400 +230444034403653045355316273427144521155460537330375254634265217831710133466511570022515061342332314 +215330305636623403455371527067601715250678103470620507380025232122252031461570076036342312211025412 +152531154664324333510065716166433534816054420634864077383448250450766671674224724566465113516230555 +214332343546262452365454705617472281546633211772075171047360414071436550632720021764434561305210301 +111443005611044613477737043746056557178022072372401206038184673647422320773366100676006211551510212 +133313521334520014277727658110473505777283286103991788280475205774027243280366061162025220015443455 +155404252050544375401645717463634684248661783289138494563725362778686756122861113531553244022156404 +101264441110131756443257557872335606716942314559648922296471179061870856246756574324520340610552502 +552345216103355364312158072306454410946149736569151493634487672710443362287688034427626033035266435 +032116136355447236216431376728258285654613995348237354962282338329733408310145842020562245054642441 +224363655451243141363087456580326751652471257429153117112342588642859256252141665722503521125022565 +203656402177710126565314466702484652152875481365818345352121487714962821315157703464343750046056642 +556042122224622324270101114885994351144861589211656115175234527658398149331284812500044434453264665 +333402317273401421323318415855844499641764213948757537893227517242385296970317342824206711503004500 +341045445002443367084450562962259886574728664877676766689484955395194385797583863611332250124025511 +530441155216276525375870173389743919985448259629562325456237285529598688811050240824703721074602060 +320021441136216827813607342916845194696625696785568454728524752386544154132864251748117643644612016 +356236015127477502168551236473444979246675949449587984562945859468987964451443376640177554302403555 +521032161450418348764563917129159623593365988455562286236885389659621188427923285451742156213351116 +161327255665606701821864175493119539272489637754729983857664245665796727199928145136462257620362465 +324256011240774073378929732467468357478524626995373968674237767743387885552216853467388044247756643 +342275312602047038565615877434724873572784389557789777857693948752846554139723438258054200025014665 +051242516637708146638198373275222758924486548779744574439965559638384373152521363134036477637737533 +643152555635778437871298236855485688298578349488385645847564753765967563925377954286572876073532255 +052252355510464443878597562686999366353446874577654743895687373779864325297372128203202721414431575 +003626454683627045725543215594452394956436955758673339474559874959389629573279978978206522053161354 +627516237702078544682942119397343558584845947957956986767739349699889797692213624665730454802067156 +200457151510133551651137637224323537736454384779467644967339586954746668462789875763614758041306350 +335154370506881211537946276895249658859666595888979499974679997597784647296794417997582782381025574 +417013603706282285595672445598476844553485594594694865577988599545878778554434654896767653370600163 +151076753567166396584462282676939868463579768879699478585698835334464668886671938943507604626741055 +316424603540766436474549593426596456855354984858479546978868766769885893482223982736645038024543705 +004215748043040351658449499986735473677885875695647795765956883964888467568526739498861211513560376 +277541056808037332121324298298467888439897499685669789559864468637637659443647357982947036001076457 +301501750655275336942638945358964763536465468989488667796645858846573465972686416787340853151245644 +712676410408042175645992725856638455389978885467555675756857577896385395967245722641824067046404672 +127263578732604583334129426765554856475867757556696788664596649687355745252374587569983167874135470 +372567082480204357437552435378439546954796599589886886999448548554873566373887522667838861416626063 +504053336576743468622556295365645349984889785678558796559694969799447958394395964464961434514564147 +064634031154473874813798648457894764786965996797567598577449556796733655629459883126531875350855667 +400242382466736377478123774763774843994888788596767997699956676943467867843525339987287625323107646 +574363428370183567442332638863797996446594766875586998755697498794589458457898531351415551433522556 +412167557672308712367589426397979758975789888776586986996554696687355758873775853874897420702317101 +770303703378804536976332878328747387584568459887597696678765458466869646823658768383568726667515101 +452233157246118285247999798264378649666585777768676869779576767654376979948352929633336613662437752 +445720367378533569416697754293496373467957556998785966978548459859767957423835655379853826412537652 +743314715884636853952588482996464655775879867757788958998964888966363788982234644268286248732605364 +421252340411081749754123523897998635856478675875579877695848758757598799352859935972592464121200154 +240060534144421235633966383826944588955556569877797756857998594637769364656894472644372534212151333 +030406408132303595787173445575575686448657959549968444868588895645466777395756386243943041550563144 +273114334761050642652349846942498578754978859865947785499768464999467827979546133588431400553072571 +545140256541065084978642274659978546685549897854997987959494546787556536925383718147440765477035264 +213551156551872738118554524476466757347767578664548796858878373885346253453663631131187832513353720 +031302225003187455433275258559853476398764745884957978785699446894568423546775622669458815340346707 +622067430504086108575211657573256737949367744989999457768543933556446848583667956928715425470730162 +242111564658304088777519536233444248435478893367596684875833738467857765957226924427228481325217576 +364055473230737526383625952385867723976677963779587753646766774437577338682519314383352032477133503 +321304645532064452197673316923724578983475574649393989787463485775923766996461422676353215802454115 +233105015700144131749152169592849597799334664843639757588555464399727868723189114371617811204424461 +200116461554525361612654498296559659356483355845588365383658756592935783639172813284867400343573434 +063667611325433422432889612288938865635845895684777885359355942764253445159748552521586663111276320 +602227464555468655756429585352455445365885785394937349896765628578363566623445953670505237256637361 +565061226117741561827365137945864958743698627664964883854386585344264536463794276685706331233201162 +022104543457075344433186746554898622888662879483534875732366545699493494249416960261188772111451356 +436620604222365732527426815953936962792895744565572436255439745543587676567692850112721235162354066 +131524412733104587364628695894553856954929535227798584623638988936368718849285573225440174764501540 +542435561362065510830610739646131257342496749563278998673868857392617956152266780580611770145235126 +403602071007077303754367568233894922487258962426625788335236293726841614813262288087316403413301325 +653365633721421431240238511233988284565865357732839935658824268124333235971843281322245237465244640 +306442137750441441547377231538498282333378867895866774269433657996442236932105133474315101276433026 +026362613577242456258634050671963436933444863559863424588962566983574869370120588454323506304034454 +324415624033560610606167505705335537131257342423913353449125925341756615871358508731521557026114366 +444331064667665623244155236812366396427328522481655365283852878951317624280585607560532023416160531 +356100663130344012403254770320017162464663432371564992618187659799885888814177114132251720346235260 +335255502200627412653317161700362276552642826696514719212976746877872577501286045667131741121615252 +432342461115176570456177856545043415022291419917157172495246595828707718465323075462216735351424603 +052014513044443630413221560860665817858636725794462229844935048786680202681024216170152252502634130 +020320466436640542335164431658623622013245024685776848188641088056885388363367731111662103514422342 +243313636453126262451331254501288620001007675817755413767166283281358125642646705337503156330264143 +322052011503256425407127570260816542455843672731851386601352556410113100252536057366522542640013024 +122243505446640664755657664365330525660042002157156113773258264460845541635501120634115505113335223 +400325240315062161366031440416477741684364564857378773141186841270761406731633364031611642530523212 +033035153153462216052744630367426463087060858055232515783208471176613722677126341566006053644200442 +235202335236553544540304237444375273744171216804617062750281644425671760635002322246613220112112312 +424551125551101552103143451563560236361153202606118476772167626160624534653670012136420410040115003 +433115113101302300404521334255672566234211040710503455555073775502462316364453256460002143312311050 +113231445145014641142635155170110005103066306721236312425606163376276006132006331601341420241440202 +124001123533434316253543204160331101266365020140476416102251147360064153500112411356634011134351330 +004034442142153246064264662030666771573157310340000724745700036734054206654603230345313434140344030 +321402405400252420216445132115124427151235102635446313422013474177203430646340442422400002232222342 From 7d160342d96c6185b685b811fe4a8fa9959ae9ad Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 8 Dec 2022 08:19:28 +0100 Subject: [PATCH 307/479] 2022: d08: ex2: add solution --- 2022/d08/ex2/ex2.py | 60 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100755 2022/d08/ex2/ex2.py diff --git a/2022/d08/ex2/ex2.py b/2022/d08/ex2/ex2.py new file mode 100755 index 0000000..ed6d9b4 --- /dev/null +++ b/2022/d08/ex2/ex2.py @@ -0,0 +1,60 @@ +#!/usr/bin/env python + +import dataclasses +import sys +from collections.abc import Iterator + + +@dataclasses.dataclass +class Point: + x: int + y: int + + +def solve(input: list[list[int]]) -> int: + def up(p: Point) -> Iterator[Point]: + x = p.x + while (x := x - 1) >= 0: + yield Point(x, p.y) + + def down(p: Point) -> Iterator[Point]: + x = p.x + while (x := x + 1) < len(input): + yield Point(x, p.y) + + def left(p: Point) -> Iterator[Point]: + y = p.y + while (y := y - 1) >= 0: + yield Point(p.x, y) + + def right(p: Point) -> Iterator[Point]: + y = p.y + while (y := y + 1) < len(input[0]): + yield Point(p.x, y) + + def visible_trees(p: Point, neighbours: Iterator[Point]) -> Iterator[Point]: + height = input[p.x][p.y] + for n in neighbours: + yield n + if height <= input[n.x][n.y]: + break + + def score(p: Point) -> int: + score = 1 + for neighbours in (up, down, left, right): + score *= len(list(visible_trees(p, neighbours(p)))) + return score + + scores = [ + [score(Point(x, y)) for y in range(len(input[x]))] for x in range(len(input)) + ] + return max(map(max, scores)) + + +def main() -> None: + input = [[int(c) for c in line] for line in sys.stdin.read().splitlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 9bbb3e0066d574ce38e5ce332d6f6f221e3f1afc Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 9 Dec 2022 10:40:45 +0100 Subject: [PATCH 308/479] 2022: d09: ex1: add input --- 2022/d09/ex1/input | 2000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2000 insertions(+) create mode 100644 2022/d09/ex1/input diff --git a/2022/d09/ex1/input b/2022/d09/ex1/input new file mode 100644 index 0000000..72de61f --- /dev/null +++ b/2022/d09/ex1/input @@ -0,0 +1,2000 @@ +U 1 +L 2 +U 2 +D 2 +L 2 +U 1 +D 1 +U 2 +D 1 +U 2 +D 1 +R 2 +U 2 +L 1 +U 2 +D 2 +R 1 +U 1 +R 2 +L 1 +R 2 +D 2 +R 2 +D 2 +U 1 +R 1 +D 2 +L 2 +D 1 +R 2 +D 2 +R 1 +L 2 +R 1 +L 2 +R 1 +U 1 +D 2 +L 1 +D 1 +R 1 +U 1 +D 2 +L 1 +U 1 +L 2 +R 1 +D 2 +U 1 +L 1 +D 1 +L 1 +R 2 +D 1 +L 1 +R 1 +L 2 +D 2 +U 2 +D 1 +R 2 +U 1 +L 1 +U 2 +L 1 +U 2 +R 2 +U 1 +D 1 +L 2 +R 2 +D 2 +L 1 +D 2 +R 2 +D 1 +L 1 +D 2 +L 1 +R 1 +L 1 +R 2 +U 1 +R 1 +D 1 +R 1 +D 2 +R 2 +D 2 +U 1 +L 1 +D 1 +R 1 +L 2 +D 1 +U 2 +D 1 +R 1 +D 2 +U 2 +D 1 +R 1 +D 1 +R 1 +U 2 +L 1 +U 1 +R 1 +L 2 +R 1 +L 1 +D 2 +L 2 +R 1 +D 3 +L 3 +U 1 +R 2 +U 1 +R 2 +L 1 +D 1 +L 3 +U 2 +L 3 +D 1 +U 2 +L 3 +U 1 +R 2 +L 1 +R 1 +L 2 +D 2 +R 3 +L 1 +U 1 +L 1 +R 1 +U 1 +D 3 +L 3 +D 2 +R 2 +L 2 +D 1 +U 2 +L 2 +U 1 +R 3 +D 3 +L 3 +R 2 +D 3 +L 3 +U 1 +D 3 +L 2 +R 2 +D 3 +R 2 +L 1 +U 3 +D 2 +R 2 +D 3 +U 1 +D 3 +R 3 +D 2 +U 1 +L 2 +D 2 +U 2 +R 1 +L 3 +U 2 +R 2 +U 1 +R 2 +D 1 +R 2 +D 3 +U 1 +L 1 +U 2 +L 1 +D 2 +R 1 +U 1 +D 1 +R 3 +U 3 +R 1 +U 1 +L 3 +D 2 +R 2 +U 1 +R 2 +D 2 +R 3 +L 2 +U 2 +R 1 +L 3 +U 2 +R 1 +D 3 +L 2 +U 2 +R 3 +U 3 +L 1 +R 3 +D 3 +L 2 +R 3 +D 2 +R 3 +U 3 +R 1 +U 2 +D 4 +L 3 +D 2 +L 4 +R 2 +D 4 +L 1 +R 3 +L 1 +D 4 +U 4 +D 1 +R 4 +U 2 +D 2 +R 1 +U 2 +D 1 +L 3 +D 2 +U 2 +L 1 +R 3 +L 3 +U 3 +L 2 +R 1 +D 2 +R 3 +L 2 +D 4 +U 2 +L 3 +R 3 +L 3 +U 4 +D 4 +L 1 +U 3 +R 4 +L 4 +D 4 +U 3 +R 4 +L 2 +D 1 +U 1 +L 4 +D 3 +U 3 +R 2 +D 3 +U 4 +L 2 +R 1 +L 2 +R 2 +U 3 +L 1 +D 4 +U 1 +L 4 +R 3 +L 3 +R 2 +D 4 +U 4 +L 4 +D 3 +R 1 +D 3 +R 4 +L 4 +R 2 +L 2 +D 2 +R 2 +L 2 +U 3 +R 3 +D 2 +R 4 +L 1 +R 2 +U 4 +L 2 +R 1 +U 2 +R 3 +D 2 +U 1 +R 4 +L 3 +U 3 +D 4 +U 1 +L 1 +R 1 +D 2 +R 1 +D 1 +L 2 +D 4 +U 4 +L 4 +U 3 +D 4 +U 4 +D 3 +U 3 +L 5 +U 4 +L 4 +U 5 +D 1 +L 5 +U 2 +D 4 +U 5 +L 4 +U 2 +D 4 +R 3 +L 5 +U 2 +L 1 +U 5 +L 4 +D 2 +U 5 +R 3 +D 2 +U 3 +L 3 +R 3 +D 5 +U 4 +D 5 +U 4 +R 1 +L 1 +U 3 +L 3 +R 4 +L 1 +U 2 +D 3 +U 5 +L 3 +R 5 +D 3 +U 4 +L 1 +U 3 +R 2 +L 2 +U 5 +D 3 +L 5 +D 1 +R 3 +L 5 +R 1 +D 2 +U 3 +D 2 +L 4 +D 4 +R 5 +L 5 +U 1 +L 5 +R 3 +L 3 +U 4 +R 3 +L 3 +R 1 +L 2 +D 1 +U 3 +L 5 +R 1 +L 5 +U 3 +R 4 +U 4 +D 3 +U 2 +L 5 +D 3 +L 3 +R 2 +D 2 +U 3 +D 3 +R 2 +D 3 +L 1 +R 1 +U 1 +L 3 +R 2 +U 3 +R 1 +D 5 +U 5 +L 5 +D 2 +U 4 +D 3 +U 3 +L 4 +D 3 +U 2 +R 1 +D 4 +L 3 +U 5 +D 2 +L 5 +R 4 +D 3 +L 4 +D 3 +R 4 +D 5 +R 2 +L 3 +D 5 +U 3 +R 4 +U 6 +L 5 +D 3 +U 4 +L 1 +U 5 +R 5 +D 3 +U 5 +D 5 +R 2 +D 2 +U 4 +D 2 +U 3 +R 6 +U 4 +L 2 +R 2 +U 3 +L 1 +U 5 +R 6 +L 1 +D 5 +R 5 +D 5 +L 2 +U 3 +L 4 +R 2 +U 3 +L 2 +U 2 +D 4 +L 4 +R 5 +L 6 +D 2 +L 4 +R 2 +D 4 +L 1 +D 6 +R 2 +U 5 +D 2 +L 6 +U 5 +L 4 +U 1 +D 3 +U 1 +L 5 +U 2 +R 6 +D 5 +U 4 +L 5 +U 1 +L 5 +U 2 +R 5 +U 2 +R 4 +D 4 +R 1 +D 6 +R 5 +L 5 +U 6 +D 2 +R 1 +L 4 +U 3 +D 6 +R 4 +L 3 +R 6 +U 2 +R 1 +U 4 +R 5 +U 1 +D 4 +U 1 +L 3 +D 2 +L 2 +D 2 +L 2 +U 6 +D 4 +L 5 +D 2 +U 1 +L 5 +D 2 +R 3 +L 2 +D 2 +U 4 +L 4 +U 6 +L 1 +R 7 +L 4 +U 1 +L 1 +U 6 +L 1 +D 2 +L 5 +R 3 +U 6 +L 6 +U 2 +D 4 +L 2 +R 6 +L 3 +D 4 +L 1 +R 6 +D 4 +U 2 +D 4 +R 2 +D 1 +U 3 +R 6 +U 4 +D 2 +L 6 +R 5 +L 3 +U 1 +L 3 +U 3 +L 7 +R 1 +L 4 +D 5 +U 6 +L 3 +U 2 +L 1 +D 2 +R 4 +D 7 +R 1 +D 5 +L 1 +D 2 +U 2 +R 1 +L 1 +U 2 +D 2 +R 4 +D 7 +L 7 +D 1 +L 4 +R 7 +U 3 +L 4 +R 3 +U 2 +R 5 +U 5 +L 5 +U 2 +L 7 +R 4 +U 2 +L 5 +R 4 +U 7 +L 7 +R 5 +L 6 +D 4 +L 1 +D 6 +L 5 +R 5 +L 7 +R 5 +D 4 +U 4 +L 5 +U 7 +D 6 +U 3 +L 5 +U 4 +D 1 +L 1 +D 7 +R 3 +D 7 +U 3 +D 7 +R 4 +U 5 +L 7 +R 4 +L 5 +R 1 +D 4 +L 3 +U 1 +R 3 +L 1 +U 4 +R 3 +L 5 +D 2 +R 2 +L 4 +D 4 +L 7 +R 7 +U 2 +D 7 +L 5 +U 3 +L 4 +U 7 +R 6 +D 3 +L 2 +R 7 +L 5 +U 6 +D 6 +L 2 +D 2 +L 5 +D 7 +U 5 +L 3 +D 4 +U 4 +L 4 +R 2 +D 8 +L 3 +R 2 +D 4 +L 4 +U 7 +R 8 +D 6 +R 7 +U 1 +R 6 +U 6 +R 4 +D 8 +L 3 +R 3 +D 2 +U 5 +D 8 +L 3 +D 5 +L 7 +R 5 +L 1 +D 4 +L 7 +U 7 +L 8 +D 7 +L 5 +U 3 +R 4 +U 3 +L 7 +R 8 +D 6 +R 2 +D 3 +R 1 +D 6 +U 8 +D 6 +L 2 +R 8 +D 4 +U 3 +D 5 +U 2 +L 3 +U 1 +R 7 +U 6 +D 5 +R 5 +U 4 +L 1 +D 3 +U 7 +L 8 +U 5 +D 5 +U 4 +D 3 +L 5 +D 5 +R 5 +D 3 +R 4 +U 4 +R 8 +L 4 +D 4 +L 2 +D 4 +R 7 +L 8 +R 7 +L 1 +D 3 +U 6 +R 5 +D 1 +U 4 +R 7 +U 1 +R 2 +L 8 +U 8 +D 2 +L 9 +U 9 +D 4 +U 8 +D 3 +R 1 +U 3 +D 1 +R 7 +L 2 +U 4 +L 4 +U 9 +L 7 +U 2 +L 4 +D 5 +R 8 +L 5 +R 4 +U 2 +L 5 +U 2 +D 1 +L 9 +R 5 +D 6 +U 3 +D 5 +U 2 +L 1 +R 7 +U 1 +L 7 +U 1 +L 5 +D 6 +R 6 +D 7 +U 6 +D 7 +L 7 +D 2 +L 6 +D 4 +U 7 +D 4 +L 8 +D 5 +R 7 +L 9 +D 9 +U 3 +D 2 +U 9 +R 4 +D 3 +U 9 +R 4 +D 6 +L 2 +D 1 +L 5 +U 2 +L 5 +D 1 +R 7 +L 9 +R 6 +D 8 +L 2 +R 5 +D 6 +L 9 +U 8 +R 2 +D 4 +R 5 +U 3 +D 4 +R 6 +D 5 +U 9 +D 6 +L 3 +D 6 +R 6 +D 5 +R 7 +U 5 +L 2 +U 2 +D 5 +U 4 +D 8 +R 6 +U 8 +D 2 +R 9 +U 6 +L 1 +U 6 +L 5 +U 10 +D 2 +U 6 +R 10 +L 7 +U 4 +R 2 +D 1 +U 3 +D 6 +L 10 +U 4 +L 5 +D 10 +R 1 +L 5 +R 5 +U 6 +R 1 +D 7 +L 7 +D 4 +L 4 +D 10 +U 1 +R 9 +L 7 +D 7 +L 6 +D 7 +U 7 +R 5 +L 6 +U 3 +L 1 +D 4 +L 1 +D 3 +U 10 +D 10 +L 3 +R 6 +U 4 +D 2 +L 4 +U 1 +R 9 +D 8 +U 7 +R 10 +U 10 +L 4 +U 1 +L 9 +R 7 +L 8 +R 10 +D 6 +U 1 +R 1 +D 10 +R 4 +L 6 +D 2 +U 9 +R 6 +L 4 +U 10 +R 10 +U 4 +D 8 +U 8 +L 9 +R 9 +D 7 +L 1 +D 6 +L 7 +U 4 +L 6 +R 9 +D 6 +L 5 +D 5 +L 5 +U 6 +R 1 +D 4 +R 6 +L 5 +U 9 +R 3 +D 3 +L 10 +D 6 +U 5 +D 6 +R 6 +D 7 +R 3 +D 2 +L 2 +D 9 +U 1 +D 1 +L 1 +D 3 +U 3 +R 4 +U 1 +L 9 +U 9 +R 4 +D 10 +U 2 +L 4 +U 3 +D 1 +R 10 +U 7 +R 5 +D 6 +L 2 +U 5 +L 5 +U 5 +L 4 +D 8 +R 7 +L 5 +R 6 +U 4 +L 7 +D 4 +R 9 +D 7 +R 7 +L 2 +D 8 +L 9 +D 2 +L 7 +U 10 +R 3 +U 5 +R 3 +D 9 +U 9 +D 11 +U 6 +R 3 +U 11 +D 11 +L 11 +U 6 +D 10 +R 9 +U 11 +R 6 +L 4 +R 5 +L 11 +D 9 +L 10 +R 4 +D 11 +R 2 +L 6 +R 3 +U 4 +L 10 +U 6 +D 9 +L 5 +U 3 +R 2 +U 5 +L 7 +U 1 +L 10 +U 9 +R 3 +D 5 +R 9 +U 6 +D 9 +L 6 +R 10 +D 10 +R 8 +D 7 +L 3 +D 4 +L 6 +R 2 +D 11 +U 5 +D 7 +L 1 +U 11 +L 11 +U 3 +D 2 +L 9 +R 8 +L 11 +R 2 +D 9 +U 3 +L 9 +U 6 +D 2 +L 10 +U 8 +L 5 +R 3 +U 3 +R 1 +L 7 +R 10 +L 2 +R 7 +U 5 +D 12 +L 11 +R 2 +L 10 +U 2 +D 3 +R 3 +U 6 +D 1 +L 8 +R 4 +L 5 +U 10 +R 12 +U 9 +R 12 +L 12 +R 6 +U 11 +D 1 +R 9 +U 2 +R 11 +L 1 +R 12 +U 10 +L 9 +U 12 +R 10 +U 12 +D 12 +U 2 +D 11 +L 12 +R 9 +U 3 +D 4 +L 6 +U 3 +R 10 +D 2 +U 11 +L 4 +R 11 +U 11 +R 1 +D 10 +R 6 +U 8 +L 3 +D 6 +R 1 +U 9 +L 3 +U 5 +D 4 +R 12 +U 11 +D 2 +U 10 +L 4 +D 9 +L 4 +U 10 +D 1 +R 1 +L 5 +R 2 +D 12 +R 5 +U 3 +L 11 +D 10 +L 11 +R 7 +L 10 +U 6 +R 12 +D 3 +R 10 +U 1 +L 2 +D 1 +R 1 +L 12 +U 4 +L 3 +R 6 +L 3 +D 6 +U 7 +R 10 +U 6 +D 6 +R 5 +D 10 +R 10 +D 8 +L 10 +U 11 +R 9 +L 4 +R 8 +U 1 +D 3 +U 7 +L 3 +U 10 +R 12 +U 10 +D 10 +U 9 +D 7 +R 4 +D 2 +R 9 +U 13 +R 6 +L 4 +R 9 +L 11 +U 6 +L 12 +D 9 +R 13 +L 2 +U 7 +D 10 +L 13 +D 4 +U 6 +L 8 +U 13 +R 3 +D 2 +L 3 +R 1 +U 1 +D 7 +L 5 +D 6 +R 1 +D 3 +R 5 +L 1 +D 3 +U 11 +L 1 +D 13 +R 5 +D 2 +L 8 +D 10 +R 1 +L 2 +D 2 +L 12 +R 11 +D 13 +R 7 +D 12 +L 2 +D 5 +L 9 +D 8 +L 3 +D 2 +U 4 +D 8 +R 7 +D 8 +U 8 +R 2 +U 10 +D 7 +L 9 +U 1 +L 10 +R 4 +U 1 +L 5 +R 5 +D 10 +R 2 +L 6 +R 4 +D 10 +L 7 +R 11 +L 11 +U 7 +L 1 +D 5 +U 4 +D 6 +R 4 +U 6 +D 7 +L 2 +D 1 +R 11 +U 11 +D 12 +U 4 +D 13 +R 3 +L 4 +R 3 +L 8 +R 4 +U 7 +L 2 +R 8 +L 13 +D 6 +U 11 +L 12 +U 1 +D 3 +U 7 +L 4 +R 5 +U 7 +D 1 +L 9 +U 2 +R 4 +D 9 +U 8 +R 2 +D 9 +L 8 +D 13 +U 13 +D 1 +U 9 +D 5 +L 1 +U 12 +D 2 +R 9 +L 7 +R 1 +L 3 +R 2 +D 12 +L 11 +D 4 +R 11 +U 5 +L 13 +R 2 +U 12 +L 9 +R 10 +U 3 +D 10 +R 8 +D 12 +U 6 +R 7 +D 11 +L 10 +U 14 +L 9 +U 12 +D 4 +U 3 +D 10 +R 6 +D 5 +R 1 +D 10 +U 13 +L 9 +R 7 +U 14 +D 10 +U 7 +D 13 +L 14 +D 14 +U 6 +D 14 +L 8 +R 2 +D 7 +U 14 +R 6 +L 14 +U 14 +R 6 +D 7 +R 7 +D 3 +U 10 +D 10 +R 7 +U 11 +R 3 +L 2 +R 12 +L 13 +R 3 +U 4 +D 1 +L 7 +U 9 +R 9 +U 9 +L 11 +U 7 +D 6 +R 7 +L 3 +D 5 +U 14 +R 8 +D 7 +L 6 +U 6 +R 11 +D 9 +R 6 +D 5 +L 5 +D 1 +L 10 +R 8 +L 15 +U 1 +D 14 +L 1 +R 5 +D 5 +L 3 +U 6 +R 6 +L 4 +D 3 +L 3 +D 4 +U 7 +L 10 +D 8 +R 13 +D 9 +R 15 +D 6 +U 10 +D 14 +L 10 +U 12 +D 13 +U 8 +L 13 +U 11 +D 13 +L 8 +R 12 +U 12 +D 14 +U 15 +L 1 +R 14 +U 15 +L 14 +U 4 +D 2 +L 2 +R 6 +D 15 +U 2 +R 5 +L 7 +U 8 +D 12 +R 2 +U 2 +R 11 +L 3 +U 15 +R 15 +D 1 +U 9 +R 5 +U 1 +R 15 +U 7 +D 8 +R 6 +U 7 +R 1 +U 5 +R 15 +U 9 +L 6 +U 10 +R 10 +D 2 +U 14 +D 13 +R 11 +L 14 +D 6 +U 6 +D 6 +U 10 +D 1 +U 10 +L 11 +D 13 +U 2 +L 14 +D 9 +R 14 +U 9 +L 8 +D 11 +U 3 +L 5 +U 8 +L 1 +U 12 +L 6 +R 5 +D 8 +R 5 +D 9 +U 14 +R 13 +U 6 +L 9 +R 7 +L 5 +U 9 +L 8 +D 9 +L 3 +R 4 +L 8 +D 1 +L 4 +R 6 +U 8 +L 5 +R 12 +U 7 +R 5 +D 8 +U 6 +R 11 +U 1 +D 9 +L 7 +R 10 +L 4 +R 1 +D 11 +R 1 +U 16 +L 6 +R 7 +D 3 +R 4 +U 13 +R 12 +D 1 +L 5 +D 2 +U 4 +D 11 +L 13 +D 4 +U 2 +D 14 +L 3 +U 1 +D 13 +R 14 +U 6 +R 8 +L 16 +U 9 +D 7 +U 15 +D 15 +L 11 +R 15 +L 4 +D 5 +U 3 +L 3 +D 8 +L 6 +U 15 +L 11 +R 14 +D 8 +U 10 +D 6 +R 1 +L 16 +D 16 +L 3 +U 10 +R 5 +L 16 +R 2 +U 15 +R 10 +U 11 +R 15 +D 16 +L 3 +U 15 +L 10 +R 12 +U 13 +R 3 +L 13 +D 15 +U 4 +R 8 +U 6 +L 10 +R 12 +U 1 +L 15 +D 5 +L 1 +U 9 +D 1 +R 16 +L 7 +U 13 +L 13 +U 6 +L 1 +R 14 +L 11 +U 16 +R 15 +L 10 +D 9 +R 9 +D 6 +U 16 +R 4 +U 1 +L 3 +R 16 +L 3 +U 6 +D 15 +R 13 +D 11 +U 15 +R 3 +L 15 +D 14 +U 10 +R 7 +U 4 +R 13 +L 11 +R 13 +L 11 +R 3 +L 5 +U 12 +L 9 +U 8 +D 2 +U 17 +D 3 +R 17 +U 14 +L 9 +R 10 +D 6 +L 5 +R 14 +L 8 +U 2 +D 16 +R 15 +D 12 +U 3 +L 4 +R 12 +U 16 +D 14 +L 12 +R 8 +D 4 +R 9 +U 12 +R 15 +U 6 +L 3 +D 17 +R 3 +U 6 +L 2 +R 2 +U 2 +D 17 +L 4 +R 8 +U 17 +R 16 +L 17 +U 5 +D 11 +U 8 +L 7 +U 3 +R 1 +D 15 +U 14 +L 4 +D 9 +U 15 +R 13 +L 2 +U 4 +R 17 +U 2 +L 13 +R 4 +U 8 +R 15 +U 8 +D 13 +U 10 +D 7 +U 7 +D 17 +R 16 +L 10 +U 10 +L 8 +R 9 +L 8 +R 1 +D 10 +U 17 +D 13 +U 10 +D 13 +L 14 +R 17 +D 5 +L 1 +U 17 +D 17 +L 13 +U 12 +R 10 +D 12 +R 15 +L 15 +U 11 +L 14 +D 15 +U 12 +D 7 +U 15 +L 1 +U 2 +R 18 +L 15 +U 7 +L 8 +R 3 +D 14 +R 7 +D 7 +U 6 +R 10 +L 9 +R 9 +D 17 +R 11 +D 4 +L 16 +U 12 +R 10 +L 4 +D 7 +U 18 +L 11 +U 3 +L 13 +U 5 +R 11 +D 16 +U 14 +D 1 +R 18 +D 4 +L 7 +U 2 +D 9 +L 5 +R 14 +U 18 +R 2 +U 7 +R 8 +U 9 +L 6 +R 12 +U 15 +R 1 +L 7 +D 3 +U 10 +R 5 +U 2 +L 8 +R 13 +L 14 +D 10 +L 10 +U 12 +R 5 +L 13 +D 8 +U 5 +D 17 +L 8 +D 8 +L 7 +U 5 +D 16 +R 9 +D 6 +U 11 +D 16 +U 15 +D 6 +L 4 +R 16 +D 8 +L 11 +U 13 +R 14 +L 12 +D 2 +U 16 +D 1 +L 12 +D 10 +R 1 +D 17 +L 8 +U 13 +R 10 +U 9 +D 4 +R 1 +U 17 +L 5 +D 15 +U 9 +R 15 +U 18 +L 15 +D 18 +U 15 +D 1 +L 9 +R 6 +L 15 +R 3 +D 19 +L 5 +D 10 +L 18 +D 11 +L 14 +D 11 +U 19 +D 5 +R 9 +L 18 +R 11 +D 3 +L 7 +R 4 +D 13 +L 9 +R 14 +D 14 +L 8 +U 10 +L 11 +U 4 +D 13 +R 13 +L 7 +R 7 +D 18 +U 2 +L 17 +D 16 +R 3 +U 12 +L 13 +U 5 +L 1 +U 9 +R 6 +D 14 +U 6 +R 3 +U 6 +R 7 +D 8 +U 11 +L 11 +R 7 +U 17 +D 2 +L 12 +U 18 +L 3 +U 14 +L 6 +R 10 +L 16 +U 19 +D 9 +R 13 +U 5 +R 5 +D 15 +R 1 +L 1 +U 5 +D 16 +L 5 +R 15 +L 14 +D 5 +R 9 +U 12 +L 9 +U 7 +R 16 +D 16 +R 10 +D 15 +R 16 +L 2 +U 13 +L 5 +D 19 +R 18 +D 19 +R 16 +D 12 +R 15 +D 12 +U 5 +L 3 +R 14 +D 7 +U 11 +R 10 +L 18 +D 9 +U 2 +D 19 +U 8 +D 19 +U 18 +R 11 +D 2 +R 8 +D 14 From 48b9633dfb52ce5f5bec9fb251b4f5c5213362bd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 9 Dec 2022 10:40:51 +0100 Subject: [PATCH 309/479] 2022: d09: ex1: add solution --- 2022/d09/ex1/ex1.py | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100755 2022/d09/ex1/ex1.py diff --git a/2022/d09/ex1/ex1.py b/2022/d09/ex1/ex1.py new file mode 100755 index 0000000..f98312e --- /dev/null +++ b/2022/d09/ex1/ex1.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python + +import dataclasses +import enum +import sys +from typing import NamedTuple + + +def sign(n: int) -> int: + if n > 0: + return 1 + elif n < 0: + return -1 + return 0 + + +class Direction(enum.Enum): + UP = "U" + DOWN = "D" + LEFT = "L" + RIGHT = "R" + + +@dataclasses.dataclass +class Move: + dir: Direction + len: int + + @classmethod + def from_input(cls, line: str) -> "Move": + d, l = line.split() + return cls(Direction(d), int(l)) + + +class Point(NamedTuple): + x: int + y: int + + def move(self, direction: Direction) -> "Point": + match direction: + case Direction.UP: + dx, dy = 1, 0 + case Direction.DOWN: + dx, dy = -1, 0 + case Direction.LEFT: + dx, dy = 0, -1 + case Direction.RIGHT: + dx, dy = 0, 1 + return Point(self.x + dx, self.y + dy) + + +@dataclasses.dataclass +class Rope: + points: list[Point] = dataclasses.field(init=False) + _tail_positions: set[Point] = dataclasses.field(init=False) + + def __init__(self, *, length: int = 2) -> None: + assert length > 0 + self.points = [Point(0, 0)] * length + self._tail_positions = {self.points[-1]} + + def move(self, move: Move) -> None: + for _ in range(move.len): + self.points[0] = self.points[0].move(move.dir) + for i in range(1, len(self.points)): + self.points[i] = self.__move_tail(self.points[i - 1], self.points[i]) + self._tail_positions.add(self.points[-1]) + + @staticmethod + def __move_tail(head: Point, tail: Point) -> Point: + delta_x, delta_y = head.x - tail.x, head.y - tail.y + + if abs(delta_x) <= 1 and abs(delta_y) <= 1: + return tail + + dx, dy = sign(delta_x), sign(delta_y) + return Point(tail.x + dx, tail.y + dy) + + +def solve(input: list[str]) -> int: + moves = map(Move.from_input, input) + rope = Rope(length=2) + + for move in moves: + rope.move(move) + + return len(rope._tail_positions) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From d1037cd7e56cded50986aec826062729e0f5378d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 9 Dec 2022 10:40:58 +0100 Subject: [PATCH 310/479] 2022: d09: ex2: add input --- 2022/d09/ex2/input | 2000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2000 insertions(+) create mode 100644 2022/d09/ex2/input diff --git a/2022/d09/ex2/input b/2022/d09/ex2/input new file mode 100644 index 0000000..72de61f --- /dev/null +++ b/2022/d09/ex2/input @@ -0,0 +1,2000 @@ +U 1 +L 2 +U 2 +D 2 +L 2 +U 1 +D 1 +U 2 +D 1 +U 2 +D 1 +R 2 +U 2 +L 1 +U 2 +D 2 +R 1 +U 1 +R 2 +L 1 +R 2 +D 2 +R 2 +D 2 +U 1 +R 1 +D 2 +L 2 +D 1 +R 2 +D 2 +R 1 +L 2 +R 1 +L 2 +R 1 +U 1 +D 2 +L 1 +D 1 +R 1 +U 1 +D 2 +L 1 +U 1 +L 2 +R 1 +D 2 +U 1 +L 1 +D 1 +L 1 +R 2 +D 1 +L 1 +R 1 +L 2 +D 2 +U 2 +D 1 +R 2 +U 1 +L 1 +U 2 +L 1 +U 2 +R 2 +U 1 +D 1 +L 2 +R 2 +D 2 +L 1 +D 2 +R 2 +D 1 +L 1 +D 2 +L 1 +R 1 +L 1 +R 2 +U 1 +R 1 +D 1 +R 1 +D 2 +R 2 +D 2 +U 1 +L 1 +D 1 +R 1 +L 2 +D 1 +U 2 +D 1 +R 1 +D 2 +U 2 +D 1 +R 1 +D 1 +R 1 +U 2 +L 1 +U 1 +R 1 +L 2 +R 1 +L 1 +D 2 +L 2 +R 1 +D 3 +L 3 +U 1 +R 2 +U 1 +R 2 +L 1 +D 1 +L 3 +U 2 +L 3 +D 1 +U 2 +L 3 +U 1 +R 2 +L 1 +R 1 +L 2 +D 2 +R 3 +L 1 +U 1 +L 1 +R 1 +U 1 +D 3 +L 3 +D 2 +R 2 +L 2 +D 1 +U 2 +L 2 +U 1 +R 3 +D 3 +L 3 +R 2 +D 3 +L 3 +U 1 +D 3 +L 2 +R 2 +D 3 +R 2 +L 1 +U 3 +D 2 +R 2 +D 3 +U 1 +D 3 +R 3 +D 2 +U 1 +L 2 +D 2 +U 2 +R 1 +L 3 +U 2 +R 2 +U 1 +R 2 +D 1 +R 2 +D 3 +U 1 +L 1 +U 2 +L 1 +D 2 +R 1 +U 1 +D 1 +R 3 +U 3 +R 1 +U 1 +L 3 +D 2 +R 2 +U 1 +R 2 +D 2 +R 3 +L 2 +U 2 +R 1 +L 3 +U 2 +R 1 +D 3 +L 2 +U 2 +R 3 +U 3 +L 1 +R 3 +D 3 +L 2 +R 3 +D 2 +R 3 +U 3 +R 1 +U 2 +D 4 +L 3 +D 2 +L 4 +R 2 +D 4 +L 1 +R 3 +L 1 +D 4 +U 4 +D 1 +R 4 +U 2 +D 2 +R 1 +U 2 +D 1 +L 3 +D 2 +U 2 +L 1 +R 3 +L 3 +U 3 +L 2 +R 1 +D 2 +R 3 +L 2 +D 4 +U 2 +L 3 +R 3 +L 3 +U 4 +D 4 +L 1 +U 3 +R 4 +L 4 +D 4 +U 3 +R 4 +L 2 +D 1 +U 1 +L 4 +D 3 +U 3 +R 2 +D 3 +U 4 +L 2 +R 1 +L 2 +R 2 +U 3 +L 1 +D 4 +U 1 +L 4 +R 3 +L 3 +R 2 +D 4 +U 4 +L 4 +D 3 +R 1 +D 3 +R 4 +L 4 +R 2 +L 2 +D 2 +R 2 +L 2 +U 3 +R 3 +D 2 +R 4 +L 1 +R 2 +U 4 +L 2 +R 1 +U 2 +R 3 +D 2 +U 1 +R 4 +L 3 +U 3 +D 4 +U 1 +L 1 +R 1 +D 2 +R 1 +D 1 +L 2 +D 4 +U 4 +L 4 +U 3 +D 4 +U 4 +D 3 +U 3 +L 5 +U 4 +L 4 +U 5 +D 1 +L 5 +U 2 +D 4 +U 5 +L 4 +U 2 +D 4 +R 3 +L 5 +U 2 +L 1 +U 5 +L 4 +D 2 +U 5 +R 3 +D 2 +U 3 +L 3 +R 3 +D 5 +U 4 +D 5 +U 4 +R 1 +L 1 +U 3 +L 3 +R 4 +L 1 +U 2 +D 3 +U 5 +L 3 +R 5 +D 3 +U 4 +L 1 +U 3 +R 2 +L 2 +U 5 +D 3 +L 5 +D 1 +R 3 +L 5 +R 1 +D 2 +U 3 +D 2 +L 4 +D 4 +R 5 +L 5 +U 1 +L 5 +R 3 +L 3 +U 4 +R 3 +L 3 +R 1 +L 2 +D 1 +U 3 +L 5 +R 1 +L 5 +U 3 +R 4 +U 4 +D 3 +U 2 +L 5 +D 3 +L 3 +R 2 +D 2 +U 3 +D 3 +R 2 +D 3 +L 1 +R 1 +U 1 +L 3 +R 2 +U 3 +R 1 +D 5 +U 5 +L 5 +D 2 +U 4 +D 3 +U 3 +L 4 +D 3 +U 2 +R 1 +D 4 +L 3 +U 5 +D 2 +L 5 +R 4 +D 3 +L 4 +D 3 +R 4 +D 5 +R 2 +L 3 +D 5 +U 3 +R 4 +U 6 +L 5 +D 3 +U 4 +L 1 +U 5 +R 5 +D 3 +U 5 +D 5 +R 2 +D 2 +U 4 +D 2 +U 3 +R 6 +U 4 +L 2 +R 2 +U 3 +L 1 +U 5 +R 6 +L 1 +D 5 +R 5 +D 5 +L 2 +U 3 +L 4 +R 2 +U 3 +L 2 +U 2 +D 4 +L 4 +R 5 +L 6 +D 2 +L 4 +R 2 +D 4 +L 1 +D 6 +R 2 +U 5 +D 2 +L 6 +U 5 +L 4 +U 1 +D 3 +U 1 +L 5 +U 2 +R 6 +D 5 +U 4 +L 5 +U 1 +L 5 +U 2 +R 5 +U 2 +R 4 +D 4 +R 1 +D 6 +R 5 +L 5 +U 6 +D 2 +R 1 +L 4 +U 3 +D 6 +R 4 +L 3 +R 6 +U 2 +R 1 +U 4 +R 5 +U 1 +D 4 +U 1 +L 3 +D 2 +L 2 +D 2 +L 2 +U 6 +D 4 +L 5 +D 2 +U 1 +L 5 +D 2 +R 3 +L 2 +D 2 +U 4 +L 4 +U 6 +L 1 +R 7 +L 4 +U 1 +L 1 +U 6 +L 1 +D 2 +L 5 +R 3 +U 6 +L 6 +U 2 +D 4 +L 2 +R 6 +L 3 +D 4 +L 1 +R 6 +D 4 +U 2 +D 4 +R 2 +D 1 +U 3 +R 6 +U 4 +D 2 +L 6 +R 5 +L 3 +U 1 +L 3 +U 3 +L 7 +R 1 +L 4 +D 5 +U 6 +L 3 +U 2 +L 1 +D 2 +R 4 +D 7 +R 1 +D 5 +L 1 +D 2 +U 2 +R 1 +L 1 +U 2 +D 2 +R 4 +D 7 +L 7 +D 1 +L 4 +R 7 +U 3 +L 4 +R 3 +U 2 +R 5 +U 5 +L 5 +U 2 +L 7 +R 4 +U 2 +L 5 +R 4 +U 7 +L 7 +R 5 +L 6 +D 4 +L 1 +D 6 +L 5 +R 5 +L 7 +R 5 +D 4 +U 4 +L 5 +U 7 +D 6 +U 3 +L 5 +U 4 +D 1 +L 1 +D 7 +R 3 +D 7 +U 3 +D 7 +R 4 +U 5 +L 7 +R 4 +L 5 +R 1 +D 4 +L 3 +U 1 +R 3 +L 1 +U 4 +R 3 +L 5 +D 2 +R 2 +L 4 +D 4 +L 7 +R 7 +U 2 +D 7 +L 5 +U 3 +L 4 +U 7 +R 6 +D 3 +L 2 +R 7 +L 5 +U 6 +D 6 +L 2 +D 2 +L 5 +D 7 +U 5 +L 3 +D 4 +U 4 +L 4 +R 2 +D 8 +L 3 +R 2 +D 4 +L 4 +U 7 +R 8 +D 6 +R 7 +U 1 +R 6 +U 6 +R 4 +D 8 +L 3 +R 3 +D 2 +U 5 +D 8 +L 3 +D 5 +L 7 +R 5 +L 1 +D 4 +L 7 +U 7 +L 8 +D 7 +L 5 +U 3 +R 4 +U 3 +L 7 +R 8 +D 6 +R 2 +D 3 +R 1 +D 6 +U 8 +D 6 +L 2 +R 8 +D 4 +U 3 +D 5 +U 2 +L 3 +U 1 +R 7 +U 6 +D 5 +R 5 +U 4 +L 1 +D 3 +U 7 +L 8 +U 5 +D 5 +U 4 +D 3 +L 5 +D 5 +R 5 +D 3 +R 4 +U 4 +R 8 +L 4 +D 4 +L 2 +D 4 +R 7 +L 8 +R 7 +L 1 +D 3 +U 6 +R 5 +D 1 +U 4 +R 7 +U 1 +R 2 +L 8 +U 8 +D 2 +L 9 +U 9 +D 4 +U 8 +D 3 +R 1 +U 3 +D 1 +R 7 +L 2 +U 4 +L 4 +U 9 +L 7 +U 2 +L 4 +D 5 +R 8 +L 5 +R 4 +U 2 +L 5 +U 2 +D 1 +L 9 +R 5 +D 6 +U 3 +D 5 +U 2 +L 1 +R 7 +U 1 +L 7 +U 1 +L 5 +D 6 +R 6 +D 7 +U 6 +D 7 +L 7 +D 2 +L 6 +D 4 +U 7 +D 4 +L 8 +D 5 +R 7 +L 9 +D 9 +U 3 +D 2 +U 9 +R 4 +D 3 +U 9 +R 4 +D 6 +L 2 +D 1 +L 5 +U 2 +L 5 +D 1 +R 7 +L 9 +R 6 +D 8 +L 2 +R 5 +D 6 +L 9 +U 8 +R 2 +D 4 +R 5 +U 3 +D 4 +R 6 +D 5 +U 9 +D 6 +L 3 +D 6 +R 6 +D 5 +R 7 +U 5 +L 2 +U 2 +D 5 +U 4 +D 8 +R 6 +U 8 +D 2 +R 9 +U 6 +L 1 +U 6 +L 5 +U 10 +D 2 +U 6 +R 10 +L 7 +U 4 +R 2 +D 1 +U 3 +D 6 +L 10 +U 4 +L 5 +D 10 +R 1 +L 5 +R 5 +U 6 +R 1 +D 7 +L 7 +D 4 +L 4 +D 10 +U 1 +R 9 +L 7 +D 7 +L 6 +D 7 +U 7 +R 5 +L 6 +U 3 +L 1 +D 4 +L 1 +D 3 +U 10 +D 10 +L 3 +R 6 +U 4 +D 2 +L 4 +U 1 +R 9 +D 8 +U 7 +R 10 +U 10 +L 4 +U 1 +L 9 +R 7 +L 8 +R 10 +D 6 +U 1 +R 1 +D 10 +R 4 +L 6 +D 2 +U 9 +R 6 +L 4 +U 10 +R 10 +U 4 +D 8 +U 8 +L 9 +R 9 +D 7 +L 1 +D 6 +L 7 +U 4 +L 6 +R 9 +D 6 +L 5 +D 5 +L 5 +U 6 +R 1 +D 4 +R 6 +L 5 +U 9 +R 3 +D 3 +L 10 +D 6 +U 5 +D 6 +R 6 +D 7 +R 3 +D 2 +L 2 +D 9 +U 1 +D 1 +L 1 +D 3 +U 3 +R 4 +U 1 +L 9 +U 9 +R 4 +D 10 +U 2 +L 4 +U 3 +D 1 +R 10 +U 7 +R 5 +D 6 +L 2 +U 5 +L 5 +U 5 +L 4 +D 8 +R 7 +L 5 +R 6 +U 4 +L 7 +D 4 +R 9 +D 7 +R 7 +L 2 +D 8 +L 9 +D 2 +L 7 +U 10 +R 3 +U 5 +R 3 +D 9 +U 9 +D 11 +U 6 +R 3 +U 11 +D 11 +L 11 +U 6 +D 10 +R 9 +U 11 +R 6 +L 4 +R 5 +L 11 +D 9 +L 10 +R 4 +D 11 +R 2 +L 6 +R 3 +U 4 +L 10 +U 6 +D 9 +L 5 +U 3 +R 2 +U 5 +L 7 +U 1 +L 10 +U 9 +R 3 +D 5 +R 9 +U 6 +D 9 +L 6 +R 10 +D 10 +R 8 +D 7 +L 3 +D 4 +L 6 +R 2 +D 11 +U 5 +D 7 +L 1 +U 11 +L 11 +U 3 +D 2 +L 9 +R 8 +L 11 +R 2 +D 9 +U 3 +L 9 +U 6 +D 2 +L 10 +U 8 +L 5 +R 3 +U 3 +R 1 +L 7 +R 10 +L 2 +R 7 +U 5 +D 12 +L 11 +R 2 +L 10 +U 2 +D 3 +R 3 +U 6 +D 1 +L 8 +R 4 +L 5 +U 10 +R 12 +U 9 +R 12 +L 12 +R 6 +U 11 +D 1 +R 9 +U 2 +R 11 +L 1 +R 12 +U 10 +L 9 +U 12 +R 10 +U 12 +D 12 +U 2 +D 11 +L 12 +R 9 +U 3 +D 4 +L 6 +U 3 +R 10 +D 2 +U 11 +L 4 +R 11 +U 11 +R 1 +D 10 +R 6 +U 8 +L 3 +D 6 +R 1 +U 9 +L 3 +U 5 +D 4 +R 12 +U 11 +D 2 +U 10 +L 4 +D 9 +L 4 +U 10 +D 1 +R 1 +L 5 +R 2 +D 12 +R 5 +U 3 +L 11 +D 10 +L 11 +R 7 +L 10 +U 6 +R 12 +D 3 +R 10 +U 1 +L 2 +D 1 +R 1 +L 12 +U 4 +L 3 +R 6 +L 3 +D 6 +U 7 +R 10 +U 6 +D 6 +R 5 +D 10 +R 10 +D 8 +L 10 +U 11 +R 9 +L 4 +R 8 +U 1 +D 3 +U 7 +L 3 +U 10 +R 12 +U 10 +D 10 +U 9 +D 7 +R 4 +D 2 +R 9 +U 13 +R 6 +L 4 +R 9 +L 11 +U 6 +L 12 +D 9 +R 13 +L 2 +U 7 +D 10 +L 13 +D 4 +U 6 +L 8 +U 13 +R 3 +D 2 +L 3 +R 1 +U 1 +D 7 +L 5 +D 6 +R 1 +D 3 +R 5 +L 1 +D 3 +U 11 +L 1 +D 13 +R 5 +D 2 +L 8 +D 10 +R 1 +L 2 +D 2 +L 12 +R 11 +D 13 +R 7 +D 12 +L 2 +D 5 +L 9 +D 8 +L 3 +D 2 +U 4 +D 8 +R 7 +D 8 +U 8 +R 2 +U 10 +D 7 +L 9 +U 1 +L 10 +R 4 +U 1 +L 5 +R 5 +D 10 +R 2 +L 6 +R 4 +D 10 +L 7 +R 11 +L 11 +U 7 +L 1 +D 5 +U 4 +D 6 +R 4 +U 6 +D 7 +L 2 +D 1 +R 11 +U 11 +D 12 +U 4 +D 13 +R 3 +L 4 +R 3 +L 8 +R 4 +U 7 +L 2 +R 8 +L 13 +D 6 +U 11 +L 12 +U 1 +D 3 +U 7 +L 4 +R 5 +U 7 +D 1 +L 9 +U 2 +R 4 +D 9 +U 8 +R 2 +D 9 +L 8 +D 13 +U 13 +D 1 +U 9 +D 5 +L 1 +U 12 +D 2 +R 9 +L 7 +R 1 +L 3 +R 2 +D 12 +L 11 +D 4 +R 11 +U 5 +L 13 +R 2 +U 12 +L 9 +R 10 +U 3 +D 10 +R 8 +D 12 +U 6 +R 7 +D 11 +L 10 +U 14 +L 9 +U 12 +D 4 +U 3 +D 10 +R 6 +D 5 +R 1 +D 10 +U 13 +L 9 +R 7 +U 14 +D 10 +U 7 +D 13 +L 14 +D 14 +U 6 +D 14 +L 8 +R 2 +D 7 +U 14 +R 6 +L 14 +U 14 +R 6 +D 7 +R 7 +D 3 +U 10 +D 10 +R 7 +U 11 +R 3 +L 2 +R 12 +L 13 +R 3 +U 4 +D 1 +L 7 +U 9 +R 9 +U 9 +L 11 +U 7 +D 6 +R 7 +L 3 +D 5 +U 14 +R 8 +D 7 +L 6 +U 6 +R 11 +D 9 +R 6 +D 5 +L 5 +D 1 +L 10 +R 8 +L 15 +U 1 +D 14 +L 1 +R 5 +D 5 +L 3 +U 6 +R 6 +L 4 +D 3 +L 3 +D 4 +U 7 +L 10 +D 8 +R 13 +D 9 +R 15 +D 6 +U 10 +D 14 +L 10 +U 12 +D 13 +U 8 +L 13 +U 11 +D 13 +L 8 +R 12 +U 12 +D 14 +U 15 +L 1 +R 14 +U 15 +L 14 +U 4 +D 2 +L 2 +R 6 +D 15 +U 2 +R 5 +L 7 +U 8 +D 12 +R 2 +U 2 +R 11 +L 3 +U 15 +R 15 +D 1 +U 9 +R 5 +U 1 +R 15 +U 7 +D 8 +R 6 +U 7 +R 1 +U 5 +R 15 +U 9 +L 6 +U 10 +R 10 +D 2 +U 14 +D 13 +R 11 +L 14 +D 6 +U 6 +D 6 +U 10 +D 1 +U 10 +L 11 +D 13 +U 2 +L 14 +D 9 +R 14 +U 9 +L 8 +D 11 +U 3 +L 5 +U 8 +L 1 +U 12 +L 6 +R 5 +D 8 +R 5 +D 9 +U 14 +R 13 +U 6 +L 9 +R 7 +L 5 +U 9 +L 8 +D 9 +L 3 +R 4 +L 8 +D 1 +L 4 +R 6 +U 8 +L 5 +R 12 +U 7 +R 5 +D 8 +U 6 +R 11 +U 1 +D 9 +L 7 +R 10 +L 4 +R 1 +D 11 +R 1 +U 16 +L 6 +R 7 +D 3 +R 4 +U 13 +R 12 +D 1 +L 5 +D 2 +U 4 +D 11 +L 13 +D 4 +U 2 +D 14 +L 3 +U 1 +D 13 +R 14 +U 6 +R 8 +L 16 +U 9 +D 7 +U 15 +D 15 +L 11 +R 15 +L 4 +D 5 +U 3 +L 3 +D 8 +L 6 +U 15 +L 11 +R 14 +D 8 +U 10 +D 6 +R 1 +L 16 +D 16 +L 3 +U 10 +R 5 +L 16 +R 2 +U 15 +R 10 +U 11 +R 15 +D 16 +L 3 +U 15 +L 10 +R 12 +U 13 +R 3 +L 13 +D 15 +U 4 +R 8 +U 6 +L 10 +R 12 +U 1 +L 15 +D 5 +L 1 +U 9 +D 1 +R 16 +L 7 +U 13 +L 13 +U 6 +L 1 +R 14 +L 11 +U 16 +R 15 +L 10 +D 9 +R 9 +D 6 +U 16 +R 4 +U 1 +L 3 +R 16 +L 3 +U 6 +D 15 +R 13 +D 11 +U 15 +R 3 +L 15 +D 14 +U 10 +R 7 +U 4 +R 13 +L 11 +R 13 +L 11 +R 3 +L 5 +U 12 +L 9 +U 8 +D 2 +U 17 +D 3 +R 17 +U 14 +L 9 +R 10 +D 6 +L 5 +R 14 +L 8 +U 2 +D 16 +R 15 +D 12 +U 3 +L 4 +R 12 +U 16 +D 14 +L 12 +R 8 +D 4 +R 9 +U 12 +R 15 +U 6 +L 3 +D 17 +R 3 +U 6 +L 2 +R 2 +U 2 +D 17 +L 4 +R 8 +U 17 +R 16 +L 17 +U 5 +D 11 +U 8 +L 7 +U 3 +R 1 +D 15 +U 14 +L 4 +D 9 +U 15 +R 13 +L 2 +U 4 +R 17 +U 2 +L 13 +R 4 +U 8 +R 15 +U 8 +D 13 +U 10 +D 7 +U 7 +D 17 +R 16 +L 10 +U 10 +L 8 +R 9 +L 8 +R 1 +D 10 +U 17 +D 13 +U 10 +D 13 +L 14 +R 17 +D 5 +L 1 +U 17 +D 17 +L 13 +U 12 +R 10 +D 12 +R 15 +L 15 +U 11 +L 14 +D 15 +U 12 +D 7 +U 15 +L 1 +U 2 +R 18 +L 15 +U 7 +L 8 +R 3 +D 14 +R 7 +D 7 +U 6 +R 10 +L 9 +R 9 +D 17 +R 11 +D 4 +L 16 +U 12 +R 10 +L 4 +D 7 +U 18 +L 11 +U 3 +L 13 +U 5 +R 11 +D 16 +U 14 +D 1 +R 18 +D 4 +L 7 +U 2 +D 9 +L 5 +R 14 +U 18 +R 2 +U 7 +R 8 +U 9 +L 6 +R 12 +U 15 +R 1 +L 7 +D 3 +U 10 +R 5 +U 2 +L 8 +R 13 +L 14 +D 10 +L 10 +U 12 +R 5 +L 13 +D 8 +U 5 +D 17 +L 8 +D 8 +L 7 +U 5 +D 16 +R 9 +D 6 +U 11 +D 16 +U 15 +D 6 +L 4 +R 16 +D 8 +L 11 +U 13 +R 14 +L 12 +D 2 +U 16 +D 1 +L 12 +D 10 +R 1 +D 17 +L 8 +U 13 +R 10 +U 9 +D 4 +R 1 +U 17 +L 5 +D 15 +U 9 +R 15 +U 18 +L 15 +D 18 +U 15 +D 1 +L 9 +R 6 +L 15 +R 3 +D 19 +L 5 +D 10 +L 18 +D 11 +L 14 +D 11 +U 19 +D 5 +R 9 +L 18 +R 11 +D 3 +L 7 +R 4 +D 13 +L 9 +R 14 +D 14 +L 8 +U 10 +L 11 +U 4 +D 13 +R 13 +L 7 +R 7 +D 18 +U 2 +L 17 +D 16 +R 3 +U 12 +L 13 +U 5 +L 1 +U 9 +R 6 +D 14 +U 6 +R 3 +U 6 +R 7 +D 8 +U 11 +L 11 +R 7 +U 17 +D 2 +L 12 +U 18 +L 3 +U 14 +L 6 +R 10 +L 16 +U 19 +D 9 +R 13 +U 5 +R 5 +D 15 +R 1 +L 1 +U 5 +D 16 +L 5 +R 15 +L 14 +D 5 +R 9 +U 12 +L 9 +U 7 +R 16 +D 16 +R 10 +D 15 +R 16 +L 2 +U 13 +L 5 +D 19 +R 18 +D 19 +R 16 +D 12 +R 15 +D 12 +U 5 +L 3 +R 14 +D 7 +U 11 +R 10 +L 18 +D 9 +U 2 +D 19 +U 8 +D 19 +U 18 +R 11 +D 2 +R 8 +D 14 From 420d37b25f7ad93b2bb15dbb85098cbd37a3ab22 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 9 Dec 2022 10:41:04 +0100 Subject: [PATCH 311/479] 2022: d09: ex2: add solution --- 2022/d09/ex2/ex2.py | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100755 2022/d09/ex2/ex2.py diff --git a/2022/d09/ex2/ex2.py b/2022/d09/ex2/ex2.py new file mode 100755 index 0000000..75124a1 --- /dev/null +++ b/2022/d09/ex2/ex2.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python + +import dataclasses +import enum +import sys +from typing import NamedTuple + + +def sign(n: int) -> int: + if n > 0: + return 1 + elif n < 0: + return -1 + return 0 + + +class Direction(enum.Enum): + UP = "U" + DOWN = "D" + LEFT = "L" + RIGHT = "R" + + +@dataclasses.dataclass +class Move: + dir: Direction + len: int + + @classmethod + def from_input(cls, line: str) -> "Move": + d, l = line.split() + return cls(Direction(d), int(l)) + + +class Point(NamedTuple): + x: int + y: int + + def move(self, direction: Direction) -> "Point": + match direction: + case Direction.UP: + dx, dy = 1, 0 + case Direction.DOWN: + dx, dy = -1, 0 + case Direction.LEFT: + dx, dy = 0, -1 + case Direction.RIGHT: + dx, dy = 0, 1 + return Point(self.x + dx, self.y + dy) + + +@dataclasses.dataclass +class Rope: + points: list[Point] = dataclasses.field(init=False) + _tail_positions: set[Point] = dataclasses.field(init=False) + + def __init__(self, *, length: int = 2) -> None: + assert length > 0 + self.points = [Point(0, 0)] * length + self._tail_positions = {self.points[-1]} + + def move(self, move: Move) -> None: + for _ in range(move.len): + self.points[0] = self.points[0].move(move.dir) + for i in range(1, len(self.points)): + self.points[i] = self.__move_tail(self.points[i - 1], self.points[i]) + self._tail_positions.add(self.points[-1]) + + @staticmethod + def __move_tail(head: Point, tail: Point) -> Point: + delta_x, delta_y = head.x - tail.x, head.y - tail.y + + if abs(delta_x) <= 1 and abs(delta_y) <= 1: + return tail + + dx, dy = sign(delta_x), sign(delta_y) + return Point(tail.x + dx, tail.y + dy) + + +def solve(input: list[str]) -> int: + moves = map(Move.from_input, input) + rope = Rope(length=10) + + for move in moves: + rope.move(move) + + return len(rope._tail_positions) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 340b0b4c6748162b8bda093c4857d0aeaa586863 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 10 Dec 2022 10:28:40 +0100 Subject: [PATCH 312/479] 2022: d10: ex1: add input --- 2022/d10/ex1/input | 143 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 2022/d10/ex1/input diff --git a/2022/d10/ex1/input b/2022/d10/ex1/input new file mode 100644 index 0000000..f93ec2c --- /dev/null +++ b/2022/d10/ex1/input @@ -0,0 +1,143 @@ +noop +noop +noop +addx 5 +addx 1 +addx 4 +addx 1 +noop +addx 4 +noop +addx 1 +addx 4 +addx 8 +addx -7 +addx 3 +addx 1 +noop +addx 4 +addx 2 +addx 5 +addx -1 +noop +addx -37 +noop +noop +addx 3 +addx 2 +addx 13 +addx 12 +addx -15 +addx -2 +addx 2 +addx -11 +addx 18 +addx 2 +addx -15 +addx 16 +addx 5 +addx 2 +addx 5 +noop +noop +noop +addx 3 +addx -2 +addx -38 +noop +addx 3 +addx 4 +noop +noop +noop +noop +noop +addx 5 +addx 5 +noop +noop +addx 21 +addx -17 +addx 6 +noop +noop +noop +noop +addx 5 +noop +noop +noop +noop +noop +addx 3 +addx 5 +addx -38 +noop +noop +addx 5 +addx -2 +addx 1 +addx 7 +noop +addx 22 +addx -18 +addx -11 +addx 27 +addx -13 +addx 2 +addx 5 +addx -8 +addx 9 +addx 2 +noop +addx 7 +noop +addx 1 +noop +addx -38 +noop +addx 2 +addx 5 +addx -3 +noop +addx 8 +addx 11 +addx -6 +noop +addx 24 +addx -31 +addx 10 +addx 2 +addx 5 +addx 3 +noop +addx 2 +addx -29 +addx 21 +addx 11 +addx 5 +addx -39 +addx 4 +addx -2 +addx 2 +addx 7 +noop +addx -1 +addx 2 +noop +addx 4 +noop +addx 1 +addx 2 +addx 5 +addx 2 +noop +noop +addx -6 +addx 9 +addx -18 +addx 25 +addx 3 +noop +addx -17 +noop From 9285442688749d1cdd9dcc12ea6113fbc59b96bc Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 10 Dec 2022 10:28:46 +0100 Subject: [PATCH 313/479] 2022: d10: ex1: add solution --- 2022/d10/ex1/ex1.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 2022/d10/ex1/ex1.py diff --git a/2022/d10/ex1/ex1.py b/2022/d10/ex1/ex1.py new file mode 100755 index 0000000..20f8fd5 --- /dev/null +++ b/2022/d10/ex1/ex1.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +import dataclasses +import sys +from collections.abc import Iterable, Iterator + + +@dataclasses.dataclass +class CPU: + x: int = dataclasses.field(default=1, init=False) + cycle: int = dataclasses.field(default=0, init=False) + + def execute(self, instructions: Iterable[str]) -> Iterator[int]: + for instr in instructions: + yield from self.execute_once(instr) + + def execute_once(self, instruction: str) -> Iterator[int]: + if instruction == "noop": + yield from self.__do_cycle() + else: + assert instruction.startswith("addx") + yield from self.__do_cycle(2) + self.x += int(instruction.split()[1]) + + def __do_cycle(self, cycles: int = 1) -> Iterator[int]: + for _ in range(cycles): + self.cycle += 1 + yield self.cycle + + +def solve(input: list[str]) -> int: + cpu = CPU() + return sum(cycle * cpu.x for cycle in cpu.execute(input) if (cycle % 40) == 20) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 96b1ebeb613f51dab4a608ebee46a3eb43449165 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 10 Dec 2022 10:28:55 +0100 Subject: [PATCH 314/479] 2022: d10: ex2: add input --- 2022/d10/ex2/input | 143 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 2022/d10/ex2/input diff --git a/2022/d10/ex2/input b/2022/d10/ex2/input new file mode 100644 index 0000000..f93ec2c --- /dev/null +++ b/2022/d10/ex2/input @@ -0,0 +1,143 @@ +noop +noop +noop +addx 5 +addx 1 +addx 4 +addx 1 +noop +addx 4 +noop +addx 1 +addx 4 +addx 8 +addx -7 +addx 3 +addx 1 +noop +addx 4 +addx 2 +addx 5 +addx -1 +noop +addx -37 +noop +noop +addx 3 +addx 2 +addx 13 +addx 12 +addx -15 +addx -2 +addx 2 +addx -11 +addx 18 +addx 2 +addx -15 +addx 16 +addx 5 +addx 2 +addx 5 +noop +noop +noop +addx 3 +addx -2 +addx -38 +noop +addx 3 +addx 4 +noop +noop +noop +noop +noop +addx 5 +addx 5 +noop +noop +addx 21 +addx -17 +addx 6 +noop +noop +noop +noop +addx 5 +noop +noop +noop +noop +noop +addx 3 +addx 5 +addx -38 +noop +noop +addx 5 +addx -2 +addx 1 +addx 7 +noop +addx 22 +addx -18 +addx -11 +addx 27 +addx -13 +addx 2 +addx 5 +addx -8 +addx 9 +addx 2 +noop +addx 7 +noop +addx 1 +noop +addx -38 +noop +addx 2 +addx 5 +addx -3 +noop +addx 8 +addx 11 +addx -6 +noop +addx 24 +addx -31 +addx 10 +addx 2 +addx 5 +addx 3 +noop +addx 2 +addx -29 +addx 21 +addx 11 +addx 5 +addx -39 +addx 4 +addx -2 +addx 2 +addx 7 +noop +addx -1 +addx 2 +noop +addx 4 +noop +addx 1 +addx 2 +addx 5 +addx 2 +noop +noop +addx -6 +addx 9 +addx -18 +addx 25 +addx 3 +noop +addx -17 +noop From c01254a5cadc7a6947ca4d9489db951ecf7c0fbf Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 10 Dec 2022 10:29:02 +0100 Subject: [PATCH 315/479] 2022: d10: ex2: add solution --- 2022/d10/ex2/ex2.py | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 2022/d10/ex2/ex2.py diff --git a/2022/d10/ex2/ex2.py b/2022/d10/ex2/ex2.py new file mode 100755 index 0000000..b7bc803 --- /dev/null +++ b/2022/d10/ex2/ex2.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +import dataclasses +import sys +from collections.abc import Iterable, Iterator + + +@dataclasses.dataclass +class CPU: + x: int = dataclasses.field(default=1, init=False) + cycle: int = dataclasses.field(default=0, init=False) + + def execute(self, instructions: Iterable[str]) -> Iterator[int]: + for instr in instructions: + yield from self.execute_once(instr) + + def execute_once(self, instruction: str) -> Iterator[int]: + if instruction == "noop": + yield from self.__do_cycle() + else: + assert instruction.startswith("addx") + yield from self.__do_cycle(2) + self.x += int(instruction.split()[1]) + + def __do_cycle(self, cycles: int = 1) -> Iterator[int]: + for _ in range(cycles): + self.cycle += 1 + yield self.cycle + + +@dataclasses.dataclass +class CRT: + width: int = dataclasses.field(default=40, init=False) + height: int = dataclasses.field(default=6, init=False) + pixels: list[list[bool]] = dataclasses.field(init=False) + + def __post_init__(self): + self.pixels = [[False for _ in range(self.width)] for _ in range(self.height)] + + def do_pixel(self, cycle: int, x_reg: int) -> None: + cycle -= 1 # Simpler modulo computation + x, y = cycle % self.width, cycle // self.width % self.height + self.pixels[y][x] = abs(x - x_reg) <= 1 + + def draw(self) -> str: + return "\n".join( + "".join("#" if pixel else " " for pixel in line) for line in self.pixels + ) + + +def solve(input: list[str]) -> str: + cpu = CPU() + crt = CRT() + for cycle in cpu.execute(input): + crt.do_pixel(cycle, cpu.x) + return crt.draw() + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 354d6087a65311ec88c2fefa9a4cd37d94721ba8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 11 Dec 2022 12:08:00 +0100 Subject: [PATCH 316/479] 2022: d11: ex1: add input --- 2022/d11/ex1/input | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 2022/d11/ex1/input diff --git a/2022/d11/ex1/input b/2022/d11/ex1/input new file mode 100644 index 0000000..0fa9bdd --- /dev/null +++ b/2022/d11/ex1/input @@ -0,0 +1,55 @@ +Monkey 0: + Starting items: 50, 70, 54, 83, 52, 78 + Operation: new = old * 3 + Test: divisible by 11 + If true: throw to monkey 2 + If false: throw to monkey 7 + +Monkey 1: + Starting items: 71, 52, 58, 60, 71 + Operation: new = old * old + Test: divisible by 7 + If true: throw to monkey 0 + If false: throw to monkey 2 + +Monkey 2: + Starting items: 66, 56, 56, 94, 60, 86, 73 + Operation: new = old + 1 + Test: divisible by 3 + If true: throw to monkey 7 + If false: throw to monkey 5 + +Monkey 3: + Starting items: 83, 99 + Operation: new = old + 8 + Test: divisible by 5 + If true: throw to monkey 6 + If false: throw to monkey 4 + +Monkey 4: + Starting items: 98, 98, 79 + Operation: new = old + 3 + Test: divisible by 17 + If true: throw to monkey 1 + If false: throw to monkey 0 + +Monkey 5: + Starting items: 76 + Operation: new = old + 4 + Test: divisible by 13 + If true: throw to monkey 6 + If false: throw to monkey 3 + +Monkey 6: + Starting items: 52, 51, 84, 54 + Operation: new = old * 17 + Test: divisible by 19 + If true: throw to monkey 4 + If false: throw to monkey 1 + +Monkey 7: + Starting items: 82, 86, 91, 79, 94, 92, 59, 94 + Operation: new = old + 7 + Test: divisible by 2 + If true: throw to monkey 5 + If false: throw to monkey 3 From cd577dc37d9578c9315dbbed3869c8785729c6e0 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 11 Dec 2022 12:08:05 +0100 Subject: [PATCH 317/479] 2022: d11: ex1: add solution --- 2022/d11/ex1/ex1.py | 93 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100755 2022/d11/ex1/ex1.py diff --git a/2022/d11/ex1/ex1.py b/2022/d11/ex1/ex1.py new file mode 100755 index 0000000..85f2344 --- /dev/null +++ b/2022/d11/ex1/ex1.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python + +import dataclasses +import sys +from collections import Counter, deque +from typing import Literal, Optional + + +@dataclasses.dataclass +class Operation: + lhs: Optional[int] + operator: Literal["+", "*"] + rhs: Optional[int] + + def __call__(self, old: int) -> int: + lhs = old if self.lhs is None else self.lhs + rhs = old if self.rhs is None else self.rhs + + if self.operator == "*": + return lhs * rhs + if self.operator == "+": + return lhs + rhs + assert False + + @classmethod + def from_input(cls, input: str) -> "Operation": + assert input.startswith(" Operation: new = ") + lhs, op, rhs = input.split()[-3:] + + assert op in ("+", "*") # Sanity check + + return cls( + None if lhs == "old" else int(lhs), + op, # type: ignore + None if rhs == "old" else int(rhs), + ) + + +@dataclasses.dataclass +class Monkey: + items: deque[int] + operation: Operation + test_divisor: int + transfer: dict[bool, int] + + @classmethod + def from_input(cls, input: list[str]) -> "Monkey": + # Sanity checks + assert input[0].startswith("Monkey ") + assert "divisible by" in input[3] + assert "true" in input[4] + assert "false" in input[5] + + items = deque( + int(n) for n in input[1].removeprefix(" Starting items: ").split(",") + ) + operation = Operation.from_input(input[2]) + divisor = int(input[3].split()[-1]) + transfer = { + True: int(input[4].split()[-1]), + False: int(input[5].split()[-1]), + } + return Monkey(items, operation, divisor, transfer) + + +def solve(input: list[str]) -> int: + def do_round(monkeys: list[Monkey], counts: dict[int, int]) -> None: + for i, monkey in enumerate(monkeys): + counts[i] += len(monkey.items) + while monkey.items: + item = monkey.items.popleft() + item = monkey.operation(item) + item //= 3 + target = monkey.transfer[(item % monkey.test_divisor) == 0] + monkeys[target].items.append(item) + + monkeys = [Monkey.from_input(monkey_spec.splitlines()) for monkey_spec in input] + counts: Counter[int] = Counter() + + for _ in range(20): + do_round(monkeys, counts) + + ((_, a), (_, b)) = counts.most_common(2) + return a * b + + +def main() -> None: + input = sys.stdin.read().split("\n\n") + print(solve(input)) + + +if __name__ == "__main__": + main() From a3951a5a4767cf6b15508e1b0133e8453b9ff04c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 11 Dec 2022 12:08:11 +0100 Subject: [PATCH 318/479] 2022: d11: ex2: add input --- 2022/d11/ex2/input | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 2022/d11/ex2/input diff --git a/2022/d11/ex2/input b/2022/d11/ex2/input new file mode 100644 index 0000000..0fa9bdd --- /dev/null +++ b/2022/d11/ex2/input @@ -0,0 +1,55 @@ +Monkey 0: + Starting items: 50, 70, 54, 83, 52, 78 + Operation: new = old * 3 + Test: divisible by 11 + If true: throw to monkey 2 + If false: throw to monkey 7 + +Monkey 1: + Starting items: 71, 52, 58, 60, 71 + Operation: new = old * old + Test: divisible by 7 + If true: throw to monkey 0 + If false: throw to monkey 2 + +Monkey 2: + Starting items: 66, 56, 56, 94, 60, 86, 73 + Operation: new = old + 1 + Test: divisible by 3 + If true: throw to monkey 7 + If false: throw to monkey 5 + +Monkey 3: + Starting items: 83, 99 + Operation: new = old + 8 + Test: divisible by 5 + If true: throw to monkey 6 + If false: throw to monkey 4 + +Monkey 4: + Starting items: 98, 98, 79 + Operation: new = old + 3 + Test: divisible by 17 + If true: throw to monkey 1 + If false: throw to monkey 0 + +Monkey 5: + Starting items: 76 + Operation: new = old + 4 + Test: divisible by 13 + If true: throw to monkey 6 + If false: throw to monkey 3 + +Monkey 6: + Starting items: 52, 51, 84, 54 + Operation: new = old * 17 + Test: divisible by 19 + If true: throw to monkey 4 + If false: throw to monkey 1 + +Monkey 7: + Starting items: 82, 86, 91, 79, 94, 92, 59, 94 + Operation: new = old + 7 + Test: divisible by 2 + If true: throw to monkey 5 + If false: throw to monkey 3 From 004a63212555bafd3b3530e3f2086edb733d871a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 11 Dec 2022 12:08:16 +0100 Subject: [PATCH 319/479] 2022: d11: ex2: add solution --- 2022/d11/ex2/ex2.py | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100755 2022/d11/ex2/ex2.py diff --git a/2022/d11/ex2/ex2.py b/2022/d11/ex2/ex2.py new file mode 100755 index 0000000..8188a58 --- /dev/null +++ b/2022/d11/ex2/ex2.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +import dataclasses +import math +import sys +from collections import Counter, deque +from typing import Literal, Optional + + +@dataclasses.dataclass +class Operation: + lhs: Optional[int] + operator: Literal["+", "*"] + rhs: Optional[int] + + def __call__(self, old: int) -> int: + lhs = old if self.lhs is None else self.lhs + rhs = old if self.rhs is None else self.rhs + + if self.operator == "*": + return lhs * rhs + if self.operator == "+": + return lhs + rhs + assert False + + @classmethod + def from_input(cls, input: str) -> "Operation": + assert input.startswith(" Operation: new = ") + lhs, op, rhs = input.split()[-3:] + + assert op in ("+", "*") # Sanity check + + return cls( + None if lhs == "old" else int(lhs), + op, # type: ignore + None if rhs == "old" else int(rhs), + ) + + +@dataclasses.dataclass +class Monkey: + items: deque[int] + operation: Operation + test_divisor: int + transfer: dict[bool, int] + + @classmethod + def from_input(cls, input: list[str]) -> "Monkey": + # Sanity checks + assert input[0].startswith("Monkey ") + assert "divisible by" in input[3] + assert "true" in input[4] + assert "false" in input[5] + + items = deque( + int(n) for n in input[1].removeprefix(" Starting items: ").split(",") + ) + operation = Operation.from_input(input[2]) + divisor = int(input[3].split()[-1]) + transfer = { + True: int(input[4].split()[-1]), + False: int(input[5].split()[-1]), + } + return Monkey(items, operation, divisor, transfer) + + +def solve(input: list[str]) -> int: + def do_round(monkeys: list[Monkey], counts: dict[int, int]) -> None: + modulo = math.prod(monkey.test_divisor for monkey in monkeys) + for i, monkey in enumerate(monkeys): + counts[i] += len(monkey.items) + while monkey.items: + item = monkey.items.popleft() + item = monkey.operation(item) + item %= modulo # Keep a reasonable range on this value + target = monkey.transfer[(item % monkey.test_divisor) == 0] + monkeys[target].items.append(item) + + monkeys = [Monkey.from_input(monkey_spec.splitlines()) for monkey_spec in input] + counts: Counter[int] = Counter() + + for _ in range(10_000): + do_round(monkeys, counts) + + ((_, a), (_, b)) = counts.most_common(2) + return a * b + + +def main() -> None: + input = sys.stdin.read().split("\n\n") + print(solve(input)) + + +if __name__ == "__main__": + main() From 50dd65e63bd547939487f66c342fad28f4115656 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 12 Dec 2022 16:14:39 +0100 Subject: [PATCH 320/479] 2022: d12: ex1: add input --- 2022/d12/ex1/input | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 2022/d12/ex1/input diff --git a/2022/d12/ex1/input b/2022/d12/ex1/input new file mode 100644 index 0000000..0c45648 --- /dev/null +++ b/2022/d12/ex1/input @@ -0,0 +1,41 @@ +abcccccccccccccccccccccccccccccccaaaaaaaaaaaaaaaaccaaaaaaaaccccccccccccccccccccccccccccccccccccaaaaaa +abcccccccccccccccccccccccccccccccaaaaaaaaaaaaaaaaaccaaaaaaccccccccccccccccccccccccccccccccccccccaaaaa +abcccccccccccccccccccccccccccccccccaaaaaaaacccaaaaccaaaaaaccccccccccccccccccccaaaccccccccccccccccaaaa +abcccccccccccccccccccccccccccccccccccaaaaaaaccaaccccaaaaaaccccccccccccccccccccaaaccccccccccccccccaaaa +abcccccccccccccccccccccccccccccaaacccaaaaaaaacccccccaaccaaccccccccccccccccccccaaaccccccccccccccccaaac +abcccccccccccccccccccccccccccccaaaaaaaaacaaaacccccccccccccccaccaaccccccccccccciiaaccaaaccccccccccaacc +abccccccccaaccccccccccccccccccaaaaaaaaaaccaaacccccccccccccccaaaaaccccccccacaiiiiijjaaaacccccccccccccc +abacccaaccaacccccccccccccccccaaaaaaaaaaccccacccccaaaaccccccccaaaaacccccccaaiiiiijjjjaaaccccccaacccccc +abacccaaaaaacccccccccccccccccaaaaaaaaccccccccccccaaaacccccccaaaaaacccccccaiiiioojjjjjacccaaaaaacccccc +abcccccaaaaaaacccccccccccccccccaaaaaaccccaaccccccaaaacccccccaaaaccccccccciiinnoooojjjjcccaaaaaaaccccc +abccccccaaaaaccccccccccccccccccaaaaaacccaaaaccccccaaacccccccccaaaccccccchiinnnooooojjjjcccaaaaaaacccc +abcccccaaaaacccccccccccccccccccaacccccccaaaaccccccccccccccccccccccccccchhiinnnuuoooojjjjkcaaaaaaacccc +abccccaaacaaccccccccccccccccccccccccccccaaaaccccccccccccccccccaaacccchhhhhnnntuuuoooojjkkkkaaaacccccc +abccccccccaacccccccccccccccccccccccccccccccccccccccccccccccccccaacchhhhhhnnnnttuuuuoookkkkkkkaacccccc +abcccccccccccccccccccaacaaccccccccccccccccccccccccccccccccccaacaahhhhhhnnnnntttxuuuoopppppkkkkacccccc +abcccccccccccccccccccaaaaacccccccccaccccccccccccccccccccccccaaaaahhhhmnnnnntttxxxuuupppppppkkkccccccc +abccccccccccccccccccccaaaaacccccaaaacccccccccccccccccccccccccaaaghhhmmmmttttttxxxxuuuuuupppkkkccccccc +abcccccccccccccccccccaaaaaaaccccaaaaaaccccccccccccccccccccccccaagggmmmmtttttttxxxxuuuuuuvppkkkccccccc +abcccccccccccccccccccaaaaaaaaaaacaaaaacccccccccccccccccccccccaaagggmmmttttxxxxxxxyyyyyvvvppkkkccccccc +abccccccccccccccccccccaaaaaaaaaaaaaaaccccccccccccccccccccaacaaaagggmmmtttxxxxxxxyyyyyyvvppplllccccccc +SbcccccccccccccccccccaaaaaaaaaacaccaaccccccccccccccccccccaaaaaccgggmmmsssxxxxEzzzyyyyvvvpplllcccccccc +abcccccccccccccccccccccaaaaaaccccccccccccccaacaaccccccccaaaaaccccgggmmmsssxxxxyyyyyvvvvqqplllcccccccc +abccccccccccccccccccccccaaaaaacccccccccccccaaaacccccccccaaaaaacccgggmmmmsssswwyyyyyvvvqqqlllccccccccc +abcccccccccccccccccccccaaaaaaaccccccccccccaaaaacccccccccccaaaaccccgggmmmmsswwyyyyyyyvvqqllllccccccccc +abcccccccccccccccccccccaaaccaaacccccccccccaaaaaaccccccccccaccccccccgggooosswwwywwyyyvvqqlllcccccccccc +abccccccccccccccccccccccacccccccccccccccccacaaaacccccccccccccccccccfffooosswwwwwwwwvvvqqqllcccccccccc +abccccccccccccccccccccccccccccccccccccccccccaacccccccccccccccccccccfffooosswwwwwrwwvvvqqqllcccccccccc +abccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffooossswwwrrrwvvvqqqmmcccccccccc +abccccaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffooosssrrrrrrrrqqqqmmmcccccccccc +abccccaaacaacccccaaccccaaaacccccccccccccccccccccccccccccccccccccccccffooossrrrrrnrrrqqqqmmmcccaaacccc +abcccccaaaaaccaaaaacccaaaaacccccccccccccccccccccccccccccccccccccccccfffoooorrnnnnnnmqqmmmmmcccaaacccc +abccaaaaaaaacccaaaaaccaaaaaaccccccccccccccccccccccccccccccccccccccccfffooonnnnnnnnnmmmmmmmcccaaaccccc +abcccaaaaacccccaaaaaccaaaaaaccccccaacccccccccccccccccccccccccccccccccfffoonnnnneddnmmmmmmccccaaaccccc +abccccaaaaacccaaaaacccaaaaaacccccaaaaaaccccccccccccccccccccaaccccccccffeeeeeeeeeddddddddccccaaaaccccc +abccccaacaaacccccaacccccaacccccccaaaaaaaccccccccccccccccaaaaaccccccccceeeeeeeeeedddddddddccaccaaccccc +abccccaacccccccccccccccccccccccccaaaaaaaccaaaccccccccccccaaaaaccccccccceeeeeeeeaaaaddddddcccccccccccc +abcccccccccccaaccccccccccccccccccccccaaaaaaaaacccccccccccaaaaacccccccccccccaaaacaaaacccccccccccccccaa +abccccccccaacaaacccccccccccccccccccccaaaaaaaacccccccccccaaaaaccccccccccccccaaaccaaaaccccccccccccccaaa +abccccccccaaaaacccccccccccccccccccccacaaaaaaccccccccccccccaaacccccccccccccccaccccaaacccccccccccacaaaa +abcccccccccaaaaaaccccccccccccccccaaaaaaaaaaacccccccccccccccccccccccccccccccccccccccacccccccccccaaaaaa +abcccccccaaaaaaaaccccccccccccccccaaaaaaaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa From 258472ef6ad04cd635baf0ae93483474863b27d3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 12 Dec 2022 16:14:46 +0100 Subject: [PATCH 321/479] 2022: d12: ex1: add solution --- 2022/d12/ex1/ex1.py | 84 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 2022/d12/ex1/ex1.py diff --git a/2022/d12/ex1/ex1.py b/2022/d12/ex1/ex1.py new file mode 100755 index 0000000..9e1c372 --- /dev/null +++ b/2022/d12/ex1/ex1.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python + +import dataclasses +import heapq +import sys +from collections.abc import Iterator +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +@dataclasses.dataclass +class HeightMap: + heights: list[list[int]] + start: Point + end: Point + + def reachable_neighbours(self, p: Point) -> Iterator[Point]: + reachable_height = self.heights[p.x][p.y] + 1 + for (dx, dy) in ((-1, 0), (1, 0), (0, -1), (0, 1)): + x, y = p.x + dx, p.y + dy + if x < 0 or x >= len(self.heights): + continue + if y < 0 or y >= len(self.heights[0]): + continue + if self.heights[x][y] > reachable_height: + continue + yield Point(x, y) + + +def solve(input: list[str]) -> int: + def to_height_map(input: list[str]) -> HeightMap: + start, end = None, None + heights = [[0 for _ in range(len(input[0]))] for _ in range(len(input))] + + for i, line in enumerate(input): + for j, c in enumerate(line): + height = ord(c) + if c == "S": + height = ord("a") + start = Point(i, j) + if c == "E": + height = ord("z") + end = Point(i, j) + heights[i][j] = height - ord("a") + + assert start is not None # Sanity check + assert end is not None # Sanity check + return HeightMap(heights, start, end) + + def djikstra(map: HeightMap) -> int: + # Priority queue of (distance, point) + queue = [(0, map.start)] + seen: set[Point] = set() + + while len(queue) > 0: + dist, p = heapq.heappop(queue) + if p == map.end: + return dist + # We must have seen p with a smaller distance before + if p in seen: + continue + # First time encountering p, must be the smallest distance to it + seen.add(p) + # Add all neighbours to be visited + for n in map.reachable_neighbours(p): + heapq.heappush(queue, (dist + 1, n)) + + assert False # Sanity check + + map = to_height_map(input) + return djikstra(map) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 532fb31b037fdacfda6f9e4c3380093ae3824cc2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 12 Dec 2022 16:14:52 +0100 Subject: [PATCH 322/479] 2022: d12: ex2: add input --- 2022/d12/ex2/input | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 2022/d12/ex2/input diff --git a/2022/d12/ex2/input b/2022/d12/ex2/input new file mode 100644 index 0000000..0c45648 --- /dev/null +++ b/2022/d12/ex2/input @@ -0,0 +1,41 @@ +abcccccccccccccccccccccccccccccccaaaaaaaaaaaaaaaaccaaaaaaaaccccccccccccccccccccccccccccccccccccaaaaaa +abcccccccccccccccccccccccccccccccaaaaaaaaaaaaaaaaaccaaaaaaccccccccccccccccccccccccccccccccccccccaaaaa +abcccccccccccccccccccccccccccccccccaaaaaaaacccaaaaccaaaaaaccccccccccccccccccccaaaccccccccccccccccaaaa +abcccccccccccccccccccccccccccccccccccaaaaaaaccaaccccaaaaaaccccccccccccccccccccaaaccccccccccccccccaaaa +abcccccccccccccccccccccccccccccaaacccaaaaaaaacccccccaaccaaccccccccccccccccccccaaaccccccccccccccccaaac +abcccccccccccccccccccccccccccccaaaaaaaaacaaaacccccccccccccccaccaaccccccccccccciiaaccaaaccccccccccaacc +abccccccccaaccccccccccccccccccaaaaaaaaaaccaaacccccccccccccccaaaaaccccccccacaiiiiijjaaaacccccccccccccc +abacccaaccaacccccccccccccccccaaaaaaaaaaccccacccccaaaaccccccccaaaaacccccccaaiiiiijjjjaaaccccccaacccccc +abacccaaaaaacccccccccccccccccaaaaaaaaccccccccccccaaaacccccccaaaaaacccccccaiiiioojjjjjacccaaaaaacccccc +abcccccaaaaaaacccccccccccccccccaaaaaaccccaaccccccaaaacccccccaaaaccccccccciiinnoooojjjjcccaaaaaaaccccc +abccccccaaaaaccccccccccccccccccaaaaaacccaaaaccccccaaacccccccccaaaccccccchiinnnooooojjjjcccaaaaaaacccc +abcccccaaaaacccccccccccccccccccaacccccccaaaaccccccccccccccccccccccccccchhiinnnuuoooojjjjkcaaaaaaacccc +abccccaaacaaccccccccccccccccccccccccccccaaaaccccccccccccccccccaaacccchhhhhnnntuuuoooojjkkkkaaaacccccc +abccccccccaacccccccccccccccccccccccccccccccccccccccccccccccccccaacchhhhhhnnnnttuuuuoookkkkkkkaacccccc +abcccccccccccccccccccaacaaccccccccccccccccccccccccccccccccccaacaahhhhhhnnnnntttxuuuoopppppkkkkacccccc +abcccccccccccccccccccaaaaacccccccccaccccccccccccccccccccccccaaaaahhhhmnnnnntttxxxuuupppppppkkkccccccc +abccccccccccccccccccccaaaaacccccaaaacccccccccccccccccccccccccaaaghhhmmmmttttttxxxxuuuuuupppkkkccccccc +abcccccccccccccccccccaaaaaaaccccaaaaaaccccccccccccccccccccccccaagggmmmmtttttttxxxxuuuuuuvppkkkccccccc +abcccccccccccccccccccaaaaaaaaaaacaaaaacccccccccccccccccccccccaaagggmmmttttxxxxxxxyyyyyvvvppkkkccccccc +abccccccccccccccccccccaaaaaaaaaaaaaaaccccccccccccccccccccaacaaaagggmmmtttxxxxxxxyyyyyyvvppplllccccccc +SbcccccccccccccccccccaaaaaaaaaacaccaaccccccccccccccccccccaaaaaccgggmmmsssxxxxEzzzyyyyvvvpplllcccccccc +abcccccccccccccccccccccaaaaaaccccccccccccccaacaaccccccccaaaaaccccgggmmmsssxxxxyyyyyvvvvqqplllcccccccc +abccccccccccccccccccccccaaaaaacccccccccccccaaaacccccccccaaaaaacccgggmmmmsssswwyyyyyvvvqqqlllccccccccc +abcccccccccccccccccccccaaaaaaaccccccccccccaaaaacccccccccccaaaaccccgggmmmmsswwyyyyyyyvvqqllllccccccccc +abcccccccccccccccccccccaaaccaaacccccccccccaaaaaaccccccccccaccccccccgggooosswwwywwyyyvvqqlllcccccccccc +abccccccccccccccccccccccacccccccccccccccccacaaaacccccccccccccccccccfffooosswwwwwwwwvvvqqqllcccccccccc +abccccccccccccccccccccccccccccccccccccccccccaacccccccccccccccccccccfffooosswwwwwrwwvvvqqqllcccccccccc +abccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffooossswwwrrrwvvvqqqmmcccccccccc +abccccaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccffooosssrrrrrrrrqqqqmmmcccccccccc +abccccaaacaacccccaaccccaaaacccccccccccccccccccccccccccccccccccccccccffooossrrrrrnrrrqqqqmmmcccaaacccc +abcccccaaaaaccaaaaacccaaaaacccccccccccccccccccccccccccccccccccccccccfffoooorrnnnnnnmqqmmmmmcccaaacccc +abccaaaaaaaacccaaaaaccaaaaaaccccccccccccccccccccccccccccccccccccccccfffooonnnnnnnnnmmmmmmmcccaaaccccc +abcccaaaaacccccaaaaaccaaaaaaccccccaacccccccccccccccccccccccccccccccccfffoonnnnneddnmmmmmmccccaaaccccc +abccccaaaaacccaaaaacccaaaaaacccccaaaaaaccccccccccccccccccccaaccccccccffeeeeeeeeeddddddddccccaaaaccccc +abccccaacaaacccccaacccccaacccccccaaaaaaaccccccccccccccccaaaaaccccccccceeeeeeeeeedddddddddccaccaaccccc +abccccaacccccccccccccccccccccccccaaaaaaaccaaaccccccccccccaaaaaccccccccceeeeeeeeaaaaddddddcccccccccccc +abcccccccccccaaccccccccccccccccccccccaaaaaaaaacccccccccccaaaaacccccccccccccaaaacaaaacccccccccccccccaa +abccccccccaacaaacccccccccccccccccccccaaaaaaaacccccccccccaaaaaccccccccccccccaaaccaaaaccccccccccccccaaa +abccccccccaaaaacccccccccccccccccccccacaaaaaaccccccccccccccaaacccccccccccccccaccccaaacccccccccccacaaaa +abcccccccccaaaaaaccccccccccccccccaaaaaaaaaaacccccccccccccccccccccccccccccccccccccccacccccccccccaaaaaa +abcccccccaaaaaaaaccccccccccccccccaaaaaaaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa From 51527eee9de32fb85d35cc8125752f3cb53b4b8c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 12 Dec 2022 16:14:58 +0100 Subject: [PATCH 323/479] 2022: d12: ex2: add solution --- 2022/d12/ex2/ex2.py | 96 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100755 2022/d12/ex2/ex2.py diff --git a/2022/d12/ex2/ex2.py b/2022/d12/ex2/ex2.py new file mode 100755 index 0000000..657f807 --- /dev/null +++ b/2022/d12/ex2/ex2.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python + +import dataclasses +import heapq +import sys +from collections.abc import Iterator +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +@dataclasses.dataclass +class HeightMap: + heights: list[list[int]] + start: Point + end: Point + + def reachable_neighbours(self, p: Point) -> Iterator[Point]: + reachable_height = self.heights[p.x][p.y] + 1 + for (dx, dy) in ((-1, 0), (1, 0), (0, -1), (0, 1)): + x, y = p.x + dx, p.y + dy + if x < 0 or x >= len(self.heights): + continue + if y < 0 or y >= len(self.heights[0]): + continue + if self.heights[x][y] > reachable_height: + continue + yield Point(x, y) + + +def solve(input: list[str]) -> int: + def to_height_map(input: list[str]) -> HeightMap: + start, end = None, None + heights = [[0 for _ in range(len(input[0]))] for _ in range(len(input))] + + for i, line in enumerate(input): + for j, c in enumerate(line): + height = ord(c) + if c == "S": + height = ord("a") + start = Point(i, j) + if c == "E": + height = ord("z") + end = Point(i, j) + heights[i][j] = height - ord("a") + + assert start is not None # Sanity check + assert end is not None # Sanity check + return HeightMap(heights, start, end) + + def djikstra(map: HeightMap) -> int: + # Priority queue of (distance, point) + queue = [(0, map.start)] + seen: set[Point] = set() + + while len(queue) > 0: + dist, p = heapq.heappop(queue) + if p == map.end: + return dist + # We must have seen p with a smaller distance before + if p in seen: + continue + # First time encountering p, must be the smallest distance to it + seen.add(p) + # Add all neighbours to be visited + for n in map.reachable_neighbours(p): + heapq.heappush(queue, (dist + 1, n)) + + # There is no solution, return value larger than the map + return len(map.heights) * len(map.heights[0]) + 1 + + def hike_distances(map: HeightMap) -> Iterator[int]: + starts = ( + Point(i, j) + for i in range(len(map.heights)) + for j in range(len(map.heights[0])) + if map.heights[i][j] == 0 + ) + for start in starts: + map.start = start + yield djikstra(map) + + map = to_height_map(input) + return min(hike_distances(map)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From aba5dfc57b70025e31a982d4ef1a9a3c100eb103 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 13 Dec 2022 10:03:17 +0100 Subject: [PATCH 324/479] 2022: d13: ex1: add input --- 2022/d13/ex1/input | 449 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 449 insertions(+) create mode 100644 2022/d13/ex1/input diff --git a/2022/d13/ex1/input b/2022/d13/ex1/input new file mode 100644 index 0000000..808ab84 --- /dev/null +++ b/2022/d13/ex1/input @@ -0,0 +1,449 @@ +[[[6,10,[],[8,1,6],6],[],[[1],7,1,0]],[9]] +[[[5]],[[[5],[7],[1],8],2,2,1]] + +[[[3,[2,1,4],2,[],[4]],[1,[]]]] +[[1,[],[[3,8,9],9,2,[3,6,5]],[2,[7,1,3,0,9]],9],[[[4],4,7,3,[7,5,1,10]],1,[[5,10,7],[5,3,2,1],[4,5,0,10,9],[2],7],[7,8,5,[10,4,10]]],[4]] + +[[3,8,0,6,[10,6,[10,0]]],[[[3,4],[7,9],[]],9],[10],[]] +[[1,10,2,3],[4],[]] + +[[1,0],[[[5,3],10,[],[4]]],[[],8,9],[[2],[[6,5,10]]],[[[2,10],2]]] +[[9,[0],[],5,6],[2],[],[1,[4,[7,4,3,8,0],[1,5,1,1],[3],7],[4,10,5,[4,10]]]] + +[[[[],2,[7,5,4,7,7],10],[[3],[2,8],1,6,[]],2],[[9,[3,6,5],[9,10,1,6]]],[],[[[3,10,5,6,0],[],[4,4,9,6,6],1,[8,4,7,1,0]]]] +[[1,[2,5,[10,6]],0,10],[[0,3]]] + +[[9],[3],[2,4]] +[[],[],[],[]] + +[[[3]],[[]],[[1,[],[6,8,5,8,8]]]] +[[],[[2,0,7],[]],[]] + +[[],[[[5,5,6,0,4],[6,0,8,2]],4],[[10,3,2,3]],[[[6]]],[[]]] +[[],[[7,1,[],[2,1],7],[[9],0,5],[10,[7,6,3,7],[9,3],9]],[],[[[9,4,9,4],[5,1,1,5]]],[10,5,7,0,[[3,8],[],2]]] + +[[[],[7,[],4,0,[7]],[1]],[[5,[8]]],[],[5]] +[[],[[[6,7,7],1,4,[7,6,6],0],[[2],9],[[3,4,5],2],[7],4],[[[9,1,4,0,3],[3,9,4]],[[7,8,7,10,1],9],[0],9,3],[[],[],[],[4],[[2,6,5],[5,4,8,7],[1],1]]] + +[[],[[],[9,[1,8,8,7,6],2],0,[[0,0,7],[1,5,2,8,4],[8,5],0],[]],[[[10],0],2,[9,[2,10,0,5],3],1]] +[[[6,5]],[[[3],[3,3,4,5]]]] + +[[3],[10],[[],[0,5,[2,2,4],8,[]],[[0,3],6,0],0]] +[[[],10,[[5,2,0]]],[10,2,9]] + +[[],[[0,10,1,9],[2,[9,9]],[0,8,10,6]],[0,3,6,[[5,5,0],9,4]],[[7,[3,7]],5,4,[[8,6,0,1,10],[],[0],[],10],7]] +[[],[8,1,1]] + +[[[2,[4,7,10]],3,1,[]],[],[[0,[6],4,1],2,[2,3,[5,7],9],9],[[8,[],[1],5],8,[[9],2,10,1],[[3,1],1],[[9,6,1,8]]],[3,3,4,3,[[],[10],1]]] +[[9,0,8,[[4,3,4,7,10],[8,9,6],2],[]],[9,[[1,0],9,7,9,[0,10,7]],[[8,10],[5,2,0]],4],[5,8,[7,[7,6,9,8,8]],[]],[2,[],2]] + +[[],[6,5]] +[[10,5,2],[[1,8]]] + +[[2,1],[9,[5]],[1,0,8,[]],[],[[4,5,[8,9,9],2,8],5,[0,[0,9],6,8],[],[3,10,4]]] +[[1,10],[]] + +[[[0,9,[4]],[[7,8,9,8],[7],10]],[9]] +[[[[8,7],[2,5],8,6,9],10,7,[10],1],[6,0,0,4,0]] + +[[[9,[3,4,10,8,0]],2],[[6,[0,6,10,9,10],0,[2,0,6,0],[4]],2,0],[[0],[[1,10,10]],[10,[6,5,2,9,9],[9],[8,8,7,1]],[5,5],6]] +[[[9],0,3,[[]],[[8,9,4]]],[]] + +[[9],[8],[[8,5,2,4]],[],[[10,3,[8,3,3,1]],[[],0,[5,8,3,6],[]],[3]]] +[[],[[[0],[],10,[4,9]]],[[[3,2,3,2],1]]] + +[[4,1,2,[[6],[8]],7],[7,0,[[7,5,3,10,7],[4,10,4,7,9]]],[0,[],[1,9],[8,2]],[7,3,[[4,3,4,0]],2,[8,[8,2,7],[3,2,0,4,6]]]] +[[],[]] + +[[3,8,8,[],[[6],[9,9,1,0,3],[6,4,3]]]] +[[7,[[7,7,0],5,[1],10,10]],[2,7,[],3,[[],[5,8,7]]],[],[0,1],[[9,2,[0,1],[4,8,3,6]],[5,2,5,6],[9,[5,1,6,1,4],[8,5,9,4,9],[8,8]]]] + +[[],[[8]],[8,[5,9,4,7],4,[8]],[2,[2,0],6,[[2,2,8],[9,7],10,5,[5,7]],[[9,6,0],7]]] +[[9,4],[[1,4,1,[6,9],5],4],[0,[9,7,[]]],[[[10,10],[9,2,7]],[0,6],[5,8],[]]] + +[[[6,[10],[7,4,9,3]],[[],[5,0],[5,1,2,10,3],[]],3,[],3],[[],[7,8,2,10,[8,3,4,2]],1,[7,[6,3,9,6],2,4],10],[[]],[[],[[6],[5],[7],[9]]],[10,7,6,8]] +[[],[[4,[5,1,9],6,10],[[3,8,3,5,9],9,[7,6,10,9],10],[[3,7,8],9,[],8]]] + +[[6,8,9,[[4,10,4,6,8]]],[],[[[],[7,6],8,[5,8,7,5],[7,3,0,1,1]],2,3],[5,10,[7,2,[5,5,2],[3],3]],[]] +[[],[1,9,8],[9],[7,[1],1]] + +[[],[4,[[9,7,10],6,7]]] +[[[[6]],[[],3,0]]] + +[[4,1],[],[5,3,3,[4]]] +[[[[10,7],10,[5,4,5,6,5],[8,2,5,4],[5]],[[8],[],9],[5,[2]]],[[[2,6,4],[1,5,4,10],[10,7],0,8],[6,6,[]],3,[[5,7,9,2],10],10]] + +[[4,7,0,2]] +[[4,[],[2],[5,4,0],4],[[],9,[[7,1],2,9]],[10,1,[0,5,[6,2,7,1]],[[8]],[[9,9,7,8],5]],[],[[[4]],3]] + +[[8,[],5,[[1],[3,5,7]]],[]] +[[[0],[5,5]]] + +[[[8,[0],[0,2,6,9]],10,[],1]] +[[8,4,0],[],[7,9,[[10,4],10,10,0],[],0],[],[3,5,3]] + +[[3,6,7],[4,5,6,[9,6],7]] +[[2],[[[6,6,4,5],[1,9]],[8,4,[5,5]],6,[3,[0,0,7],[3,9],[8,3,9],[2,0]]],[[[5,1,4,0,5],[10,5,9],3,2],[[4,0],[4,6],[4]]]] + +[[6,4],[],[[]],[[[],1,2,0,[10,2]],6,4,5]] +[[1,[[],[3],[1,5]],[10,[],[2,8,4,10],[9,2]],[7,4,3,5,0],0]] + +[[[[5,1,7],4],[]]] +[[[7,2,[]],[]],[[6],4,5,[[]],[[7,0,8],[0]]],[10,1,1,[[4,9],6,[10,2,3,9,0],[2,3,4,3]],3],[0,2,[7],5,2]] + +[[4,3,[1,[9,0,8,7],1],[[],[],4,[5,7,10,6],10]],[]] +[[1,[4,5,[6,0,9,4,9],[],[1]],3,9]] + +[[[],[6]]] +[[4,9,[3,[3,10,2,8],0,10,[2,3,2,10]],3,[2,[]]],[2,6],[],[6,0,5,[[6,1,3,5],5],[[3,8,1,9,10],[2],[1,4,10]]],[[[0,2],[7],[10,9,4,1],[4,2]],4,[]]] + +[[[4]],[6,[[4],[8],[2],[4,0]],[4,9,[3]],[[8,10,6,10],[9]],9]] +[[[],5,[8,10],[4,[4,6,7,4],6,[4,10,5,4],[8,10,4]],8],[[[3,4,1],[1,6,6]],4,[[6,9,9],7,[],0,[1,4,7,2,1]],10,[[7,1,2],[6,3,3,8,10]]],[[[2,9,0,4,5]],[[9,0],4,[8,7]],[5,[3,9,2,8],9,[1]]],[6]] + +[[[[8,10,10,1,7],[],1]]] +[[[3,3],[],[4],[]],[],[],[[],[7,8,3],10]] + +[[],[0]] +[[8,[]],[6,[[1,10,7]],[2]],[],[],[[1,[],1,10],3]] + +[[[6,7,4]],[2,5,[0,7,0,[],1],[10,4,[0,6],[5],[9]],[[5,7],[0,10,7,9]]],[[[1],6],[0,3,10]]] +[[[[9,0,1],7,[3,6,5,1],3,8],[[10,10],4,[4,8,1,10,2],[5,2,9]]]] + +[] +[[]] + +[[],[],[[[1,8,3],8,3,[9,6,1,9,1],1],[],2,4],[[0,[1,8]],8,[[5,0],[0,2,9],10,[5]],[[1],[],[9,2,1,0,7],6],5],[2,[5,7,8,[3],[1]],[[10,9,10],5,3]]] +[[2,10,6,4,[5,[]]],[0,[9,5,[2,6,10,3,8]],[]],[6,7,[[0,6,6],5,[4,3,0],[],3],6],[6,9,[[7,6,0,0,9],[9,10],7],[[],2],[4,2,7,[4],[4,6,2]]]] + +[[2,5,[[2,0,5,8]],[1,[0,0,10],9,6,[1,9,3]],[[8,2,0,8,8],[9,10,3,9,7],[0]]],[6,[3,[1,2,1,7,4],[6,10,10,1],[10,0,9,7,2],8],9,8,[[],2,8,8]],[],[]] +[[4,9,[[3,1,2,5,0],5,[9,0,9,7],[8,5,7]],8],[[],2,[],[3,8]],[0,8,1,[[7,5,7,1],7,[10,9],4,8]]] + +[[],[7]] +[[],[[3,[10,3,5,8]],[[0,9]],[[],10]],[[],0],[]] + +[[2,9,0],[8,5],[[1,[0,1],7]],[[8,[2,9,6,4],9,[8,4],4],7]] +[[[[6,5,5,5,8],[9,1,1,0],[],[1],[2,5,2,7,10]],10]] + +[[[[4,4,10,5],2,[]],[9],[[9,7],[2,0,1,1,5],0,10],10,5],[],[3,7,[9,9],4,2],[[[5,9],[],4],[[],[0,8]],[[10,4,6],7,3,[],[]]],[3,[0,2],[[0],7,[],6],3]] +[[],[9,[[6,3,2,8],[8],[2,8,0]]]] + +[[[9],[[3,9,8,1,0],[3,10,7]],[5,[10,10],5,[],[1,6]],[[6,0,0,10,10]]],[],[5,[9,[1,3],[4,9,0,10],[8,5],[10]],[]],[[2,8,[5,1,6,1,4],10],6,[[4,6,6],8,[4,8,10],[10]],10,2]] +[[[[8,9,0,0],1,10],4],[6,5,0,[5,[6,0,9],[3,9,5],10,[4,8,3,6]],[]]] + +[[[10],[5,[2,10,4],9,7,[6,5,10,7,6]],[9,[],[],[0,4]]]] +[[],[[9,[8],9],[[1,3,5],[5],[4,6,10,4],[7,8,10,9]],[[4,0,7,5],6,[]],[0]],[[[2,4,5,8]]],[5,[8],[[6,2,8,2,3]],[5,[],[2,0,4,1,4],[8]],6],[[8,0,6]]] + +[[[],9,[[5,4]],4],[]] +[[3],[[[4,5],[2,1,8,9],[9,9,2]],6],[1,[10,4]],[10,[3],[[9],2,[10,0,8,5],4],[],8],[2,9]] + +[[[2,5],7,8],[0,1,[],2]] +[[1,6],[[],9,7,0]] + +[[[5,1,[3,2,6]]],[10,1,9,1],[]] +[[8,10],[],[[[8,7]],[10,[0,3,9]]],[[8,[7,3,2],[7],[2,1],[1]]],[4,0,1]] + +[[[[2],[4],9,[0,1,0,1],6],[],[8,[4],5,9]],[]] +[[[5,[10,1]],[6,2,[6,4],[6,1],8]]] + +[[[5],[6,0],1],[[[8,7],[1,6]]],[0,9],[],[0,0,[9,0,[],3]]] +[[[[8,10,3,0],[4],[0],[5,2,7,2],[4,7,5,5,4]],[[4,10,9,9],[1,1,4,8,0],10,[2,10]]]] + +[[[[5,4,5,4,2]]],[8]] +[[[8,7,6],1,3,9,[[3,4,2,7],[],[10,10],[8,7,7,10,10]]],[5,8,3]] + +[[4,[0]],[5,[5,1,1],[[2,1,6,4],[8,1,8,6,6],[10],7,1]],[],[],[5,9,3,3]] +[[6,[1,[5,1,4,8],[],[6,0,4,0,7]],9,[[6,5],[4,5,8],[4,10,8,7],[3,0],6]],[[3],[],7,9,[[6,10,1,2]]],[[],5,[[7],3,10],3]] + +[[[0,[2],[8,4,4,2],[8,5,8,3,6]],[[6,4,0,8,1],[],4,[3,2]]]] +[[4],[[[6,0,1,3],[5,2,4,4],6],[[],1],[8,[]],7,[]]] + +[[[[0,0],[3,4]]],[]] +[[[9,[10,0,9,10]],2],[4,6,[[8]]]] + +[[],[[[8],[8,1,5],9,[9,0,1],[5,10,3,0]]],[]] +[[[1,[8,5],6,[]],[10,1,1,[2,10,4]],[],[8],[[4,10,6,3,0],[2,10],6,8,[0,10,10]]],[[[1,4,4,7,6]],9,8,[[6],4,[8,9],[0]],[[9],[4],3,3,[6,5,6,0,3]]]] + +[[9],[[10,[5,2,8,0],7,[9,7,6,2,1],[5]],[9,[5,3],[4,10],[5,4,6,9]],[5,[6,8,4,4,7],[0,9,5,4],[1,0],3]],[],[[8],[[5,7,0]]]] +[[[8],[],4,9,1],[[1,[5,6,3,1],[8,6,0,5,0]],8,2,[[7,5,1]],1],[[[10,6,4],[8,6,1,4,9]],[[]],9,[7,[9,4,6],8,[6,4],7],[8,3,9,[10,6]]],[[7,8,[2],[7],[6,4,9,3]],10,[4,8,[0,6,2,1],6]]] + +[[[4,1,6],3,[6,7]],[0,[6,0,[7,9,9],5],[10,2,[2,2,1,9],[4,0],[2,1]]],[[]]] +[[],[8,6,7,[9,[6,9,2,4,7],[10,0]],[]],[1,[5,3,10,[6],[8,6,3,6]],2,3],[[],[[9,3,10,0]],2,[[9,3,10,6],4],0],[[[0,5,10,9],6,[2],[1,2,2]]]] + +[[[[],[8,1,5],[1,6],[2]],8],[[]],[1,5,[6],[[]]]] +[[],[[],[5,9,[3],[0,6,5],5],10,4,[8,[],6]],[8,0,[[3,4,1,10]],0]] + +[[7,2],[],[[5,7,3],[],[[2,2],[],9,[2,6,7]]]] +[[[[2,9,2]]],[]] + +[[4,3,10],[0,[1,9,[1,10,5]],8,[[8,6],[3,1],[9,8],1,[4,8,4,5]],3],[[[2,2],[8,5,5,2,0],3,[5]],[1,[3,10]]],[8,[[],[3,8],1]],[[]]] +[[[4,5,[],[10,3,10,4,10],8],[9],2,4,6],[[6,[10]]]] + +[[[6],8,4,2],[1,[]],[[],10,[]]] +[[2,6,1],[[[7,6],7,[],[2,0],[3]]],[10],[[9],10,[7,3,[],9,7],6,9]] + +[[0,6,9,[[0,10,1]]],[[[],7,3],[]],[],[8,9,2],[1,[0,8,[9,8]],[[3]],[1,7,7,1,[5,4,4,10]]]] +[[7,8,[]],[4,[8,[6,3],6],0],[2,9,7,[10]],[5,[[],0,3,[9]]],[]] + +[[],[0,[7,6,[2,6],[7,2]],[4,3,6,7,8],7,1]] +[[[[3],7,[],2,[3,9,4]],[[0,4,10,8,0],0,9,[4,6,4,0],[4,6,2,8]],[[5],[2]],1,[]],[[3,7,6,7,10],[[10,3,9],[4,1,7],0],7,[0]],[3,7,6],[7,[8],7,[[0],5,9,9,1],0]] + +[3,2,7,8] +[3,2,7,8,2] + +[[[6,[10,3],0],4,[[1,7,9,9,10],1,3,[1,4,4,5]],[[8],[],9,9],[[6,8,9,7,3],9,[0],[2,7],0]],[3],[[10,[],6],[]],[[[9],10]]] +[[9],[10,7],[[0,[9,10,10],10],7,10]] + +[[8,9,2,[],[9,7]],[[2,[7,6,2,3],8,6],[[7,7,9,4,5],[],[6,2,7,2],4,2],10,4],[4],[]] +[[10,0,[[],9,0],[[7,3,7,1],8,[0,3,8,5]]],[9,[4,0,10,9]],[]] + +[[[[6,1,4,0,2],[4],[5,1,0]],[5,[1,7,2]],5,7,[[]]]] +[[],[[[],0,4],[[0,8,5,10]],[5],[4,8,10],6],[[5,10,[8,8,4,4],7,[6,8,10,7]],10,[],[[7,6],[1,8,10,10,0],2,[1],5]],[[6,[],0,2],0],[7,[[9,7,0,0,2],[3],0],9]] + +[[[[1,1,8,8],5,[1],[5,3,6],[1,7,7,10,7]],10],[[1,[8,0,5,4],8],[[],6,5]]] +[[],[5,[],[6,8,5,[4]],[[4],[7,8,10,4],[6],[4,5,0]]],[3,[[3],[6,0,7,1,6],3,8,[6,10]],8,7],[[4,5,[2,8],[]],9]] + +[[[7,0,7,3]],[],[6,1,[0],9]] +[[[8,10,9]],[7,[7,[],[9,3,6],[1,2,4,7]]],[0,2,[]]] + +[[[[4],[7,4,6,7,1],8,6,9],6],[4,[],[1,[6,7,5],[7,7,4],8],9],[[9,10,7]]] +[[[0,[],[0,2,10]],7],[6,1,[[4,0],2,4,[10,3,5],10],9,[4]],[0],[[[6,3,4,4]],[[],[10,10],[8],9],0],[]] + +[[[9,[1,2,6,6,2],[9,7,0,3,4],[5,9,10,4,0],5],7,[[5],0,[2,7,4]],[[9,6,10,5,10],8,5,[3]]]] +[[3,[4,1,7,5],[9,4,[2,6],[7,5]],[[9,0,6,6]],3],[[]],[],[5,[],9,8]] + +[[0,5,[[],[8],[2,5]],4],[[1,[8,3,10],[6,3,8,1],[4,10,6,5],[9]]]] +[[0,3,2,4,4],[1,[],[[2,8]]]] + +[[[[9],8],7,5,[0,[8,6]],[6,3,[10],[]]],[[1,[]],[[9,10]]],[[[10,2,10,5,5]],[],4],[[7],6]] +[[],[6,[],[],5,4],[[3,[1,5,10],7],[4,[6,4,4,0,5],[0,4,2,9]],[2,8,4,[6],[0]]],[[],[7,[4],[]]],[[],[[]],[[6,6,9],[9,5],8,[3,2,3]],[[8],6],10]] + +[[[],5,1],[[[2,1,3,10],4,[],[4,1,4],10],7],[8,5,[6]],[[],0,[4,[7,1,2,4]],1,1]] +[[[[0],1],[2,[4]],[[],9,[3,7,6,2],[5,10,7,0]]],[],[[[1]],[[0,5],[0,6]],[[1,10],[0,7],[6,9,4,10]],5,[[3,6,5]]],[]] + +[[[0,[0,6,7,6,3],2,[]]]] +[[7,5],[3,3,8,[8,[9,7],[2,2],[2,10,5,7],[7,1,8]]]] + +[[[6,[3,4,8],[4],[1,1,1],9],3,[[7,5],4,[9,8,0],[1,6,4,10,3]],[3]],[[3,[1,5,3,3,1],9,8],6,[0,[2,10,7,3]],[7,2,[6]]],[9,4,[],[[10,4,4,10,8],7,[3,2,0,1,0]]],[[4,9]]] +[[[[7,5,9],[1,3],1,0,8],[[10,2]],5,4],[[[],4,[],6,[0,3,1,6,10]],1,2]] + +[[9,9,[[],[7,5,4,3]]],[3,3,[],[4,[9,0,0,1]],8],[6],[[],6,[4,3,[],[1,7,6,9,6]]]] +[[10],[],[],[8],[9]] + +[[4],[[0,[10,1],[2,7,9,4,6],3],5],[[[1,4],[3,8,10,4],8,[7,8,1,4,8],[]],3]] +[[],[3],[1,[0,[2,7,0],2,8,[3,8,6,1,8]],9],[]] + +[[10],[],[[[3,9,9],[],[7,8,6,7,5],6],6,8,[4,[10,10,2,9,9],9,4,1]]] +[[6],[1,4,5,[[10,6],[],9,6]],[[0,[2,5],[5,9],7],[[0],3,1]],[[10],7],[[[8,4,2,7]],4,7]] + +[[[7],1,[],[[],5,1],4],[],[0],[2,[1,[0],5],3,8],[10,[7,9,4,[2,5,1,7]],0]] +[[[],4,9,[1]],[6,10,[[9,7],[4],[0,10,6]],[1,10],8]] + +[[[[],9,3,[5]],1,[4,[6,10,6,5,2],[],[6,7]],[10]],[2,[],4],[[10,8,0,[],2],[[],6,1,[5,6,8,7],[10,1,1]]],[[5,[2,9]],8,10,[7,10,[0,9],[8,5]]]] +[[[[6],0,8,2,[4,8,1,9]],[8,10,7],0],[4,[]],[9,2,[10,[]],6],[8,9,[5]],[]] + +[[[[],8],[1,[4],[8,1,8,4,0],[9,7,4,1]],10,8,[[3,1],[10,0,9,10,10]]],[[]],[6,8,[[10,3],8,6,[0,9,5]],3,[]],[[6,8],1,6,[[4,10],[],5],[[3,8,6,1,1],[10]]],[[],[[7,1,3,8],0,[]]]] +[[8,[[9,9,4]],[[6,4,8,10],1,[6]],3]] + +[[[[3,5],8,[0,0],2],[6,[2,5,5,7],[4,10],[6,6]],[[3,4,2,6]],[[1,7,2,6,0],[4],10,[9,2]],10]] +[[[[7,6,8,5,10],[7,0,9,8,9],5,[7,7],[2,8,1,0,5]]],[7],[],[[4,3,[2]]],[[[10,1],0,1],6]] + +[[0,[[10,7,8],3,9,[10,4,2,0]],[10,7]],[0,10],[[]],[[[6,9],9],10,6,5,4],[[[],6,9],4,2]] +[[[9],[[]]],[5,[8,9,[4,9,6,6,6],1,[]],[0]],[[],5,[7,7,7,3,0]],[[8],6,4,7,[[9,4,7,8]]],[[[10,6,0,6,3],9,[7,7]],[9,1,[],9],[[3,4,10,8],5,9,2,5]]] + +[[5],[]] +[[[10,[9,3,2],0,[7,10,8,0,1]]]] + +[[[[],0,0,8,[5]],[8],[0,[2,7],[10]]]] +[[[[10,7,1,8],8,[],1],4,10,2],[[[9,3,10]],5,[[3,5],[4],[]]],[1]] + +[[[3,[7,7,0],9],[5,[7,1],[4,5,1,1],8]],[[1],[7,5,1,9]],[[],[[5,10,0,1,5],3]]] +[[4,9,[5,[10,9,9,3,7],3,[4,1,3,3]],4,10],[],[[]],[[5,[10,3]],[[10,0,7],[2,1]],[8,[],4],4],[9,[0],[],[6,[1,9]],9]] + +[[[],8,4,[1]],[[[2,1,2,1],[10]],10,7,4],[[5,8,[8,3,1,5,1],[5,6,8]],[[2,10],[]]]] +[[[9,[2,4,9],[10,5],[],3],0,[0,[],4],[8],3],[],[9,[9],2],[],[]] + +[[10],[[]],[3,[],1,8,9],[0,[5,[8,7,8,6],8,[10,9,3,0]],[[],3,[8,1,7,8],2,7]]] +[[],[[4],3,[[8,8]],[],1],[],[4,0,4,[9,10]],[[9,[7,4,5],7],8,[6,[8,7,5,7,9]]]] + +[[[[3,1,9,7,2]],1,3],[3,1,[[],[10,7,1,5,1]],[[2,5],[1,9,9]]],[10],[],[[[5,8,8,4,3],0,[2],[5,9]],2,2,[]]] +[[[[7]],2]] + +[[7,[9,6],[[4,1,1,8],9,[]],[[],9],[0,0,[8,6,0,2]]],[[],[1]]] +[[4,7],[],[10,1,[9,0,[5,9],[0,5],7],[8,0,7],[[8,1,4,5],8]]] + +[[10,[[8,10,4]],9,[]],[],[[10],7],[3,4,5,10,[[6,4,8,7,9],3,[0,5]]]] +[[9,[6,[2,8,9],3,[2],[0,1,5,0]]],[5],[[[9,8,1,9,8],[],[9,4,8],1,6],4,[3]],[[8,10,3,3,10],8,1,4],[]] + +[[8],[[1,9,4],[9],0],[[],5,0],[3],[[9],3]] +[[0,5],[0,[[9,6,8]],8]] + +[[1,[],[[8,10,2,5],6,[5,0,7,2,8],2]],[]] +[[6,5,10,9,[5,7,8,[2,3,9,8,10]]]] + +[[],[8],[[4],[1,9,1,3],3]] +[[1,[[],[],10,[10,2],6],0,[]]] + +[[[],10,[[7],[1,0,9],7]]] +[[1,2],[],[[[4,10]]],[[1,[6,9,1,0],4,[7]],4,[[8,10,0,5,5],1,6,[8,7,10,0],[5]],7]] + +[[[],[5,9,[2,4,7,7],[10],7]]] +[[[1],2,[7,0,[7,9,3,5,10],6,[6,3,3,0]],[],[2,5]]] + +[[],[[9,4,[5,5],[]],5,2,[6,10,10,[0,1,3],10],6],[10,[[5,3,0],[],2],[[1]],4]] +[[[[4,6,9]]],[[10,0,[8,1,5,3,6],[],10],2],[8,[[2,3,10,5,10]],[[9,1,3,3,2]],[[7,2,8],1]],[]] + +[[],[[[],[],5,[1],[2,7,1,7,2]],7,9,[[6,2,3,4,0],8,2],2]] +[[],[4,2,5,[[1,3],1,[6,5],[3,5,7],[5,5,8,10,5]]],[],[]] + +[[7,[2,[4,0,6,6],0],3]] +[[3,3,[[1,5]]]] + +[[[[4],[5,5],[9,10,2,6],[4,2,1,4]],0,0,10,[[],[6],[3,4,4,2,6],[2,8],[]]]] +[[2,[[10],10,7,[],7],[[2,3,2,9],[2,2,8,6,2],[5,5,2,9,1]]],[[],2,8,1,[2,[4,5,9,5,1],8]],[[[]],6,[10,[6,5],[6,10,9,5,5],2]]] + +[[4,[9,[3,2,2],[3,2,2,10],3,[10,8,5,2]]]] +[[0,9,8,[[2,1],[0,7,2,9,4],[6]]],[[5,9,[3],7],0,7,[0,[8,1,2],[2,10,9,3,6]],7]] + +[[[1,[7,5],7],0],[2,0,4,1,7],[[2,9,4,[8,3,8],[2]]]] +[[],[[6,10],6,7],[0,9,6,4,[2,1,[5,1],[]]],[[],[[7],2,5,[6,0,6,2]],[[0,9,2,3],3]],[[[],10],0,6,8]] + +[[],[],[2],[[4,[10,10]],[1],[7,3,[9,9],0],[[3,7],10,[5,1],9]]] +[[7,[[6,9]],4,6,2],[[],[],[6,6]]] + +[[[10,5,10,7,7],4,3,1,3],[],[4]] +[[3,[5,2,7,[5],5],[[5]],0,2],[[],[[6,7,0],[0,8]],7,[2,0,8],[[0,2],[]]],[1,7,10,[7,3,1],[]],[4,[[9,1,10,7],[7,9,3]],[],[1,1,9,5]],[9,4,5,[[3,2,7,0],[1],7,4,6]]] + +[[[[3,4,4,8],[],[5,9,10,4,3],[1]]],[2],[4,3,[],[4],[[3,3],3,[8,8],[1,4,10],[3]]],[[[0,7,10],[10,9,3,0,10],6,7,6],0,[9,4,0,0,[9,10,0,7]],[6],[]]] +[[3,[[]],0,[5],4],[6,8,10,6,[[8,1,5,5,7],3,0,[],4]]] + +[[[5,4,5,8,1],6,[8,[],[0,6,0],[3,8,10,0]]]] +[[[[10,4,1,4],[2,5,9,2],[6,3,2,5,2],[],8],[10],2],[[2]]] + +[[[7,[7,10,2,7],[]],[4,7,[0,10,10],4,10],[],10],[3,4,9,[],2],[[8],9,[7,[8,7,2],[2,4,6],4,[8,4,6]]]] +[[6,6,[[3],[3],[1]],8],[[9,[8,8,3,9],10]],[[5,5,4,[]],9,[]],[8,[[3],6,6],[1,[3,7],0,9,0],[[],[],9,3],[2]],[[[3],[6,6,4,9,6],[7,5],[3],8]]] + +[[0,3,[7,10],[7,[7,1,5,4]]],[[7,7,10,[7,1,5]],[4,[2,3],[1],9,[]],4]] +[[4,[[3,6,10,8]],9,9],[[[6,0,9,7],[0,9,5,3],9]]] + +[[[4,1],[1,1,[6,5,7],3,[9]]],[8,8,0,[6]],[0,[[8,8,4,0,0],[8,9,1,8,8],[2]]]] +[[9,1],[5,1,[[7],[6,5],[],[7]],10,3],[2,3],[1,5,[],[]]] + +[[[[5,9,0,6]],[0,[9,9],0,[]],6],[[]],[[[6,4],10],10,0]] +[[],[[]],[[1,3,[7,8,6]],[[3]],8],[[[],[2,3,8,5,4]],8],[9,6,[5,[]],[9,[6,9,7,3]],9]] + +[[5,3,1],[2,5,[[],1,[1,10,9,0,7],[],[]]],[5],[3,10,[[8,4],[5,7]],5],[[5,8],[[1,6,4],10,6,3,[7,5,1,8,3]],[],[[],[3,7],2,[5,7],[10,7,3]],[[5,10],1,[5,8]]]] +[[[1,[5,0],0,0],10,7,[],3],[[[0,0,6,9,0],[10,4,9,0]],3],[8]] + +[[6,6,3,[6,0,10,[1,6,0,6],6]],[1,[[2,9,2,5,1],9],[6,[1],0,4,7]],[[[1,10,8]],[1,3,[2,1,10,0],10],0,8],[[[8,1,2,9,5],[4,6,10,8]],6,0,[],6]] +[[[[0,8,2,2],[9,1,5,8,6],8],1,0,[2,[0,4],[10]],[[9,4,2,3,3],[4,6,0],9,7]],[[6,[],0,[5,7,4]]]] + +[[[[2],[8,9,1,3,3],[3,8,5,6],[7,3],5],[10,5,[8,0,5,7,8]],[],3],[4,[[0,4,7,4],1,[8,0,7,3],9,[10]]]] +[[[[7,1,8,1]],10,[10,[1,8,1,5],[9,9,9],[5,10,10]],5,[]],[],[],[[10],[[0,1,8]],2,[[],9,[0],5,[]]]] + +[[0,0],[[],3,[[4,8,4,6],3,[1,5,0,0]]],[[],10],[[8,[5,8,7],8],2,0,[]],[8,5,[[],[]],2]] +[[10,[10],[],7,10],[[9,[10,6],2,4],[[6,9,6,0],4,7,1],[8,9,[]],[[5,3,10]],7],[8,[[5,1,1,1,5]],[[1,6,3,5]],[[4,5,7],[],3],[[7,1,5,4],[0,10,10],[1]]]] + +[[6,1],[],[4,[[9,10,7,8,2],[8,2],10],3,10,[[8,8,3],4,7,[2,1,5,5,3],[8,6,7,5,0]]]] +[[[0,[4],[4],[2,5,4,7,7],5],0,[]],[]] + +[[[],3,8,[[7,5,3,8,9],3,[8,10,4,7]]],[[[10],10,[0,9,3]],5,[[10,2,10,10,6],10,7,[7,4,7,9,9]]],[],[[7,[],5],9,[10,[4,9,0,2],[9]],[5,[1,10,2],[4,4],[8,2]],[[3,7,8],5,[9,2,5,5,5],[2,10,2]]],[[[9,9,9,10],[9],[10,10,9],[8]],8]] +[[],[[9,[10,7,7,4]],10],[[1,5,9,4],[[6,6,3,10],[],5],3,[[],9,[6,7,3],3,4],10],[[0,[6,8,10],10,[1]],[[2,2,5,5]]]] + +[[8,0,9],[0,1,[0,1,4],0],[3,4],[[[0,1]],1,[9,5,9],[5,[3],5,[3],[2,1,6]]]] +[[[[10,3,10,2],7,3],4,[[1,5,6,4,5],[9,4,6,9],3,[9]],[[1,5,7],[4,10,7],[4,2],10,[9,6,0]]]] + +[[5,5,[1,[9,6,9],4],1,0],[[[8,4],[6],5,[4,3,9,7],3]],[5,4,7,5,[]],[3,2]] +[[2],[9,[[3,7,1],[2,3,4,9],3,6,[1,2,9,0,4]],8]] + +[[1],[[2,[2,2],[3,3,1,3]],1,[[8],[0,5]],[7,8]],[[[10,5],3,[9,6],2,[9,6,8,6]]],[[4],9,5],[3]] +[[6,[],[4],[[3,0,9],[4,9],[4,4,6],0,10],9]] + +[[[8,7],2,[[]],6],[10,8],[1,3,8],[3],[4]] +[[7,[4,7,8,[0,2]],1],[[[10,9,9,6],9,[9],7,1],5,[[8],1,[10,4,10],6],9]] + +[[[[2,5,1,8,0],10,7,[5,4,10,0]],6,6,[[4,6,7,9],2,[],[6,10,7,9]]],[[8,[8,6,10,0],4,5],6,4,[[4,2,3],8,6,3,3],[[9],[1,4,7,5,5],[4],7]],[[],[6,2,[6,5,4,6]],10,8],[3,[4,8,[0,2,10,10,9],4],[6],[[]]],[[]]] +[[[[3,7,2],10,10],6,[1,4,0,0,[]],[[0,5]]],[[0,[5,2,1,0,10]],[2],[0,[7],8,3]]] + +[[],[6,5,3,6,[3,4,[7,2,9],0]],[3],[7,[[],4,[]],7,[]],[[[10,10,6],10],[[8],4,[9,9,0,10,7],4,4],9,[[1,8,10,7,4]],6]] +[[],[10,[6,2],[5,3],2],[4],[[7,[7]],8,[2,9,[10,2,0],2],[],[[7,1],1,9,[4,2]]]] + +[[[],8,[9,0]],[],[4,2,[1,[1,5,7,4]]],[1,4,0,[[],5,4,9,[10,9]]],[[],[4,10,[1,10]],9,[]]] +[[[[7],[7,0,10]],[3],[[]],[]],[[[6],[],[6,0],1,[9,5]],[10,[5],[],1],[[1,8],[],9,[7],[1,8,8,8]],[],[0]],[[[]]],[1,[],[6,[],7,[5,5,2],1],8]] + +[[8,[],7,[]],[5,6,[],9,[[7,9,9],1]],[3]] +[[[4,[3],[9,4,4,9],1,6],[10],2],[[0],[],[[2,3,7,2,3]],[[3,9],10,[4]]]] + +[[[[2,3,9,1,6],[10],[10]],[0,9,[0,4,10],7,[3,2,7]],5]] +[[[7,[9],5],4,10,[[3,9,8],[5,6,1,0,9],9,[]]],[1,[[7],[5,10]],8,[[4,8,5],2,9]]] + +[[[[3],9,2,8,[]],[10,[1,10,6],[10,7,9],4,[10]],[2,[3,6,9,6],[5,0],[3,5,10],8],4]] +[[7,[[10,10,3],1],4,[0,[8,9,6],9,[6,3,9,1,6]]],[]] + +[[[8,[3,1,3,2,3],5,10],[3,2],9],[8]] +[[4,7],[],[7,6,[[10,5,0,3,4],9],7,[[0,5,9,5],7,2,[5,8]]]] + +[[2,[],2],[2,[5,[2,2,10,2,4],[3,3,5,10],[6,1]],[6,[6]],2,8]] +[[[7,3,4],4,[[7],[10,6,9],[],[]],[[2,7,5],[8],[4,7,10,9,6],[]],[3,0,8]]] + +[6,4,3,7,0] +[6,4,3,7] + +[[[[0,2,5],9],1,8]] +[[[1,[4],[8,7,5,7,3]],10],[]] + +[[8,[5,[9,1,2],5,10]]] +[[[4],7,8]] + +[[7,[]]] +[[[[9,5],[2,10,6,7]],2,4,[],[10,6,8,3,8]],[[[]],9,[[2,9],10,3,6],[[1,10],[9]]]] + +[[5,[[1,7,9],10],8],[[6,[7,1,9,2],10,[5],[6,4,9]],[10]]] +[[[2,8,6,[]]]] + +[[9,8]] +[[3,9,[[0,2,0,3,3],[9,6,7,3,9],3,10,4]],[1,3,[[],[1,7,5],[8,4,8],0,[2,2]],9,6],[]] + +[[[],[[0,4,9]],[[1,10,9,8,7],6,[5,1,6,10],4]],[[[],[9,0,2],10],[3],9,[]],[2,6],[[],1,[9,8,[5,3],[],[4]],6,10]] +[[0]] + +[[1,3],[7,[],[[2,6,8,7,5],2,[],[7,0,6]]]] +[[[6,[],7,3],5,[2,[],[9,8,1,4],3]],[[[0,7]]],[10,[[6,0,1,7],[],[8,2,5],7],1],[]] + +[[[],[],5,[],[[8,5,10]]],[10,[[0,3],[1],[6,3,1],[5,4,1]],4,1],[1,[],[],[[3],1,[9],5]]] +[[[7,[4,10],10,[0,3,10],6],1]] + +[[[[3,4,6],7,[0,1,6,8,10],7],[[1,9,5,10]],9]] +[[[6,[2,7,5,9],0]]] + +[[8]] +[[[[1,0,6],2,[3,10,1,9]],6]] + +[[[7],0,[4,[4,0,7,8],[7,10,4,6,10],[]]]] +[[[10,7,[8,10,2,0,6]],6,[8,4,[8]],1,5],[8,[1,6],3]] + +[[8,[7]],[7,0,0,6],[[[4,8,9,7],8,[6,0,1,3],9],1,1,10,7],[2,[7,[4,9,2,9,4],5,[10,9,5,4]],[5,[10,3,6,7],[8],[4,6],[3,1,1,5]],9,4],[4,[[8,7,2,2,0]],[[3,10]],[],[10,0,7,8]]] +[[[[5,4,9,4,9]],[[7,6,2,8],[3,9,10],2,3,9],9,[[10,2,8,2,0]]],[9,[4,[1],9],4],[],[5,5]] + +[[[[8,2,4],[8,7,3]]],[7,[2,10,8,[7]]],[9,[[6,3]],[],8,6]] +[[[[],[0,1,0],[6,9,8,7,2]],[[3,1,0,10]]],[[6,[0,10],[],5,[4,2,1,6,5]],[]],[1],[3,[6,1,[6,7]],4],[[[],3,10,[10,1]],7]] + +[[[10,[1]],8,5,[]],[9]] +[[[3,[1],10],[10,9]],[10],[1,9,[[7,2,1,8,7],[]],3,0]] + +[[[],[[3,5,5,7,7],[9],2],[[10],0],8],[7,[[6,6,5,8],0,2,[4,7,3,5]]],[[1],2,[[2],[7,3,7]],6]] +[[],[3]] + +[[4,[],[[2],[6,7],0],4],[10,[[9,4,7,6,10],[0,0,1,10,6],6,1,3]]] +[[4,1,0,1],[],[],[[1],[],[[9,10,5,0],[10,7,4],[10,9,1,10,3]]]] + +[[[[4,8,8,0],[7],3,2],8,[[10,9,1]]]] +[[[1,6,[10,4,2]],1],[1,[4,[2,7],6,[7],2]],[3,9,10,9],[]] + +[[[[10,1,4,6,5],[2,8,10,6],3],2,2,[6,3],[[4]]],[4,[[7,6,8,0],[4,0,3],0,[10,9]],[3,8,10],1]] +[[[2,5]],[[5,[8,7,2,0],8,[9,1,5],[9,8,0]],10,10,[9,3,[10]],3],[[2,2,7,[3,10,7,10,8],7],8],[4,0,[6,2,10],[10,3,0,[4,6,5,4,2]]]] + +[[[],2],[0,6,[[2,7,7,2,4],[7,1]],6,2]] +[[3,[],[[10,2,1,5]]],[]] + +[[],[8,[[5,10,5]],9]] +[[[[2,8,4],[2,0],4,6,4],2,[[10,5,10],1,[10,9,1,1]]],[2,7],[],[[[3,1,4,8,4],4,[0,5,9,3],4,[]],[],[8,2]]] From 529a66e33b1201f22310f9c380536b03091eab12 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 13 Dec 2022 10:03:25 +0100 Subject: [PATCH 325/479] 2022: d13: ex1: add solution --- 2022/d13/ex1/ex1.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 2022/d13/ex1/ex1.py diff --git a/2022/d13/ex1/ex1.py b/2022/d13/ex1/ex1.py new file mode 100755 index 0000000..48fef3a --- /dev/null +++ b/2022/d13/ex1/ex1.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +import sys +from typing import Union + +Packet = Union[int, list["Packet"]] + + +def cmp_packet(lhs: Packet, rhs: Packet) -> int: + if isinstance(lhs, int) and isinstance(rhs, int): + return lhs - rhs + if isinstance(lhs, int): + lhs = [lhs] + if isinstance(rhs, int): + rhs = [rhs] + non_equal_cmp = (res for res in map(cmp_packet, lhs, rhs) if res != 0) + len_cmp = cmp_packet(len(lhs), len(rhs)) + return next(non_equal_cmp, len_cmp) + + +def solve(input: list[str]) -> int: + def to_packets(input: str) -> tuple[Packet, Packet]: + first, second = input.splitlines() + return eval(first), eval(second) # Secret best way to parse JSON + + return sum( + i + for i, packets in enumerate(input, start=1) + if cmp_packet(*to_packets(packets)) <= 0 + ) + + +def main() -> None: + input = sys.stdin.read().split("\n\n") + print(solve(input)) + + +if __name__ == "__main__": + main() From 0cf1acfecf8a5f0a84d7d5157f8d785cae066b13 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 13 Dec 2022 10:03:32 +0100 Subject: [PATCH 326/479] 2022: d13: ex2: add input --- 2022/d13/ex2/input | 449 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 449 insertions(+) create mode 100644 2022/d13/ex2/input diff --git a/2022/d13/ex2/input b/2022/d13/ex2/input new file mode 100644 index 0000000..808ab84 --- /dev/null +++ b/2022/d13/ex2/input @@ -0,0 +1,449 @@ +[[[6,10,[],[8,1,6],6],[],[[1],7,1,0]],[9]] +[[[5]],[[[5],[7],[1],8],2,2,1]] + +[[[3,[2,1,4],2,[],[4]],[1,[]]]] +[[1,[],[[3,8,9],9,2,[3,6,5]],[2,[7,1,3,0,9]],9],[[[4],4,7,3,[7,5,1,10]],1,[[5,10,7],[5,3,2,1],[4,5,0,10,9],[2],7],[7,8,5,[10,4,10]]],[4]] + +[[3,8,0,6,[10,6,[10,0]]],[[[3,4],[7,9],[]],9],[10],[]] +[[1,10,2,3],[4],[]] + +[[1,0],[[[5,3],10,[],[4]]],[[],8,9],[[2],[[6,5,10]]],[[[2,10],2]]] +[[9,[0],[],5,6],[2],[],[1,[4,[7,4,3,8,0],[1,5,1,1],[3],7],[4,10,5,[4,10]]]] + +[[[[],2,[7,5,4,7,7],10],[[3],[2,8],1,6,[]],2],[[9,[3,6,5],[9,10,1,6]]],[],[[[3,10,5,6,0],[],[4,4,9,6,6],1,[8,4,7,1,0]]]] +[[1,[2,5,[10,6]],0,10],[[0,3]]] + +[[9],[3],[2,4]] +[[],[],[],[]] + +[[[3]],[[]],[[1,[],[6,8,5,8,8]]]] +[[],[[2,0,7],[]],[]] + +[[],[[[5,5,6,0,4],[6,0,8,2]],4],[[10,3,2,3]],[[[6]]],[[]]] +[[],[[7,1,[],[2,1],7],[[9],0,5],[10,[7,6,3,7],[9,3],9]],[],[[[9,4,9,4],[5,1,1,5]]],[10,5,7,0,[[3,8],[],2]]] + +[[[],[7,[],4,0,[7]],[1]],[[5,[8]]],[],[5]] +[[],[[[6,7,7],1,4,[7,6,6],0],[[2],9],[[3,4,5],2],[7],4],[[[9,1,4,0,3],[3,9,4]],[[7,8,7,10,1],9],[0],9,3],[[],[],[],[4],[[2,6,5],[5,4,8,7],[1],1]]] + +[[],[[],[9,[1,8,8,7,6],2],0,[[0,0,7],[1,5,2,8,4],[8,5],0],[]],[[[10],0],2,[9,[2,10,0,5],3],1]] +[[[6,5]],[[[3],[3,3,4,5]]]] + +[[3],[10],[[],[0,5,[2,2,4],8,[]],[[0,3],6,0],0]] +[[[],10,[[5,2,0]]],[10,2,9]] + +[[],[[0,10,1,9],[2,[9,9]],[0,8,10,6]],[0,3,6,[[5,5,0],9,4]],[[7,[3,7]],5,4,[[8,6,0,1,10],[],[0],[],10],7]] +[[],[8,1,1]] + +[[[2,[4,7,10]],3,1,[]],[],[[0,[6],4,1],2,[2,3,[5,7],9],9],[[8,[],[1],5],8,[[9],2,10,1],[[3,1],1],[[9,6,1,8]]],[3,3,4,3,[[],[10],1]]] +[[9,0,8,[[4,3,4,7,10],[8,9,6],2],[]],[9,[[1,0],9,7,9,[0,10,7]],[[8,10],[5,2,0]],4],[5,8,[7,[7,6,9,8,8]],[]],[2,[],2]] + +[[],[6,5]] +[[10,5,2],[[1,8]]] + +[[2,1],[9,[5]],[1,0,8,[]],[],[[4,5,[8,9,9],2,8],5,[0,[0,9],6,8],[],[3,10,4]]] +[[1,10],[]] + +[[[0,9,[4]],[[7,8,9,8],[7],10]],[9]] +[[[[8,7],[2,5],8,6,9],10,7,[10],1],[6,0,0,4,0]] + +[[[9,[3,4,10,8,0]],2],[[6,[0,6,10,9,10],0,[2,0,6,0],[4]],2,0],[[0],[[1,10,10]],[10,[6,5,2,9,9],[9],[8,8,7,1]],[5,5],6]] +[[[9],0,3,[[]],[[8,9,4]]],[]] + +[[9],[8],[[8,5,2,4]],[],[[10,3,[8,3,3,1]],[[],0,[5,8,3,6],[]],[3]]] +[[],[[[0],[],10,[4,9]]],[[[3,2,3,2],1]]] + +[[4,1,2,[[6],[8]],7],[7,0,[[7,5,3,10,7],[4,10,4,7,9]]],[0,[],[1,9],[8,2]],[7,3,[[4,3,4,0]],2,[8,[8,2,7],[3,2,0,4,6]]]] +[[],[]] + +[[3,8,8,[],[[6],[9,9,1,0,3],[6,4,3]]]] +[[7,[[7,7,0],5,[1],10,10]],[2,7,[],3,[[],[5,8,7]]],[],[0,1],[[9,2,[0,1],[4,8,3,6]],[5,2,5,6],[9,[5,1,6,1,4],[8,5,9,4,9],[8,8]]]] + +[[],[[8]],[8,[5,9,4,7],4,[8]],[2,[2,0],6,[[2,2,8],[9,7],10,5,[5,7]],[[9,6,0],7]]] +[[9,4],[[1,4,1,[6,9],5],4],[0,[9,7,[]]],[[[10,10],[9,2,7]],[0,6],[5,8],[]]] + +[[[6,[10],[7,4,9,3]],[[],[5,0],[5,1,2,10,3],[]],3,[],3],[[],[7,8,2,10,[8,3,4,2]],1,[7,[6,3,9,6],2,4],10],[[]],[[],[[6],[5],[7],[9]]],[10,7,6,8]] +[[],[[4,[5,1,9],6,10],[[3,8,3,5,9],9,[7,6,10,9],10],[[3,7,8],9,[],8]]] + +[[6,8,9,[[4,10,4,6,8]]],[],[[[],[7,6],8,[5,8,7,5],[7,3,0,1,1]],2,3],[5,10,[7,2,[5,5,2],[3],3]],[]] +[[],[1,9,8],[9],[7,[1],1]] + +[[],[4,[[9,7,10],6,7]]] +[[[[6]],[[],3,0]]] + +[[4,1],[],[5,3,3,[4]]] +[[[[10,7],10,[5,4,5,6,5],[8,2,5,4],[5]],[[8],[],9],[5,[2]]],[[[2,6,4],[1,5,4,10],[10,7],0,8],[6,6,[]],3,[[5,7,9,2],10],10]] + +[[4,7,0,2]] +[[4,[],[2],[5,4,0],4],[[],9,[[7,1],2,9]],[10,1,[0,5,[6,2,7,1]],[[8]],[[9,9,7,8],5]],[],[[[4]],3]] + +[[8,[],5,[[1],[3,5,7]]],[]] +[[[0],[5,5]]] + +[[[8,[0],[0,2,6,9]],10,[],1]] +[[8,4,0],[],[7,9,[[10,4],10,10,0],[],0],[],[3,5,3]] + +[[3,6,7],[4,5,6,[9,6],7]] +[[2],[[[6,6,4,5],[1,9]],[8,4,[5,5]],6,[3,[0,0,7],[3,9],[8,3,9],[2,0]]],[[[5,1,4,0,5],[10,5,9],3,2],[[4,0],[4,6],[4]]]] + +[[6,4],[],[[]],[[[],1,2,0,[10,2]],6,4,5]] +[[1,[[],[3],[1,5]],[10,[],[2,8,4,10],[9,2]],[7,4,3,5,0],0]] + +[[[[5,1,7],4],[]]] +[[[7,2,[]],[]],[[6],4,5,[[]],[[7,0,8],[0]]],[10,1,1,[[4,9],6,[10,2,3,9,0],[2,3,4,3]],3],[0,2,[7],5,2]] + +[[4,3,[1,[9,0,8,7],1],[[],[],4,[5,7,10,6],10]],[]] +[[1,[4,5,[6,0,9,4,9],[],[1]],3,9]] + +[[[],[6]]] +[[4,9,[3,[3,10,2,8],0,10,[2,3,2,10]],3,[2,[]]],[2,6],[],[6,0,5,[[6,1,3,5],5],[[3,8,1,9,10],[2],[1,4,10]]],[[[0,2],[7],[10,9,4,1],[4,2]],4,[]]] + +[[[4]],[6,[[4],[8],[2],[4,0]],[4,9,[3]],[[8,10,6,10],[9]],9]] +[[[],5,[8,10],[4,[4,6,7,4],6,[4,10,5,4],[8,10,4]],8],[[[3,4,1],[1,6,6]],4,[[6,9,9],7,[],0,[1,4,7,2,1]],10,[[7,1,2],[6,3,3,8,10]]],[[[2,9,0,4,5]],[[9,0],4,[8,7]],[5,[3,9,2,8],9,[1]]],[6]] + +[[[[8,10,10,1,7],[],1]]] +[[[3,3],[],[4],[]],[],[],[[],[7,8,3],10]] + +[[],[0]] +[[8,[]],[6,[[1,10,7]],[2]],[],[],[[1,[],1,10],3]] + +[[[6,7,4]],[2,5,[0,7,0,[],1],[10,4,[0,6],[5],[9]],[[5,7],[0,10,7,9]]],[[[1],6],[0,3,10]]] +[[[[9,0,1],7,[3,6,5,1],3,8],[[10,10],4,[4,8,1,10,2],[5,2,9]]]] + +[] +[[]] + +[[],[],[[[1,8,3],8,3,[9,6,1,9,1],1],[],2,4],[[0,[1,8]],8,[[5,0],[0,2,9],10,[5]],[[1],[],[9,2,1,0,7],6],5],[2,[5,7,8,[3],[1]],[[10,9,10],5,3]]] +[[2,10,6,4,[5,[]]],[0,[9,5,[2,6,10,3,8]],[]],[6,7,[[0,6,6],5,[4,3,0],[],3],6],[6,9,[[7,6,0,0,9],[9,10],7],[[],2],[4,2,7,[4],[4,6,2]]]] + +[[2,5,[[2,0,5,8]],[1,[0,0,10],9,6,[1,9,3]],[[8,2,0,8,8],[9,10,3,9,7],[0]]],[6,[3,[1,2,1,7,4],[6,10,10,1],[10,0,9,7,2],8],9,8,[[],2,8,8]],[],[]] +[[4,9,[[3,1,2,5,0],5,[9,0,9,7],[8,5,7]],8],[[],2,[],[3,8]],[0,8,1,[[7,5,7,1],7,[10,9],4,8]]] + +[[],[7]] +[[],[[3,[10,3,5,8]],[[0,9]],[[],10]],[[],0],[]] + +[[2,9,0],[8,5],[[1,[0,1],7]],[[8,[2,9,6,4],9,[8,4],4],7]] +[[[[6,5,5,5,8],[9,1,1,0],[],[1],[2,5,2,7,10]],10]] + +[[[[4,4,10,5],2,[]],[9],[[9,7],[2,0,1,1,5],0,10],10,5],[],[3,7,[9,9],4,2],[[[5,9],[],4],[[],[0,8]],[[10,4,6],7,3,[],[]]],[3,[0,2],[[0],7,[],6],3]] +[[],[9,[[6,3,2,8],[8],[2,8,0]]]] + +[[[9],[[3,9,8,1,0],[3,10,7]],[5,[10,10],5,[],[1,6]],[[6,0,0,10,10]]],[],[5,[9,[1,3],[4,9,0,10],[8,5],[10]],[]],[[2,8,[5,1,6,1,4],10],6,[[4,6,6],8,[4,8,10],[10]],10,2]] +[[[[8,9,0,0],1,10],4],[6,5,0,[5,[6,0,9],[3,9,5],10,[4,8,3,6]],[]]] + +[[[10],[5,[2,10,4],9,7,[6,5,10,7,6]],[9,[],[],[0,4]]]] +[[],[[9,[8],9],[[1,3,5],[5],[4,6,10,4],[7,8,10,9]],[[4,0,7,5],6,[]],[0]],[[[2,4,5,8]]],[5,[8],[[6,2,8,2,3]],[5,[],[2,0,4,1,4],[8]],6],[[8,0,6]]] + +[[[],9,[[5,4]],4],[]] +[[3],[[[4,5],[2,1,8,9],[9,9,2]],6],[1,[10,4]],[10,[3],[[9],2,[10,0,8,5],4],[],8],[2,9]] + +[[[2,5],7,8],[0,1,[],2]] +[[1,6],[[],9,7,0]] + +[[[5,1,[3,2,6]]],[10,1,9,1],[]] +[[8,10],[],[[[8,7]],[10,[0,3,9]]],[[8,[7,3,2],[7],[2,1],[1]]],[4,0,1]] + +[[[[2],[4],9,[0,1,0,1],6],[],[8,[4],5,9]],[]] +[[[5,[10,1]],[6,2,[6,4],[6,1],8]]] + +[[[5],[6,0],1],[[[8,7],[1,6]]],[0,9],[],[0,0,[9,0,[],3]]] +[[[[8,10,3,0],[4],[0],[5,2,7,2],[4,7,5,5,4]],[[4,10,9,9],[1,1,4,8,0],10,[2,10]]]] + +[[[[5,4,5,4,2]]],[8]] +[[[8,7,6],1,3,9,[[3,4,2,7],[],[10,10],[8,7,7,10,10]]],[5,8,3]] + +[[4,[0]],[5,[5,1,1],[[2,1,6,4],[8,1,8,6,6],[10],7,1]],[],[],[5,9,3,3]] +[[6,[1,[5,1,4,8],[],[6,0,4,0,7]],9,[[6,5],[4,5,8],[4,10,8,7],[3,0],6]],[[3],[],7,9,[[6,10,1,2]]],[[],5,[[7],3,10],3]] + +[[[0,[2],[8,4,4,2],[8,5,8,3,6]],[[6,4,0,8,1],[],4,[3,2]]]] +[[4],[[[6,0,1,3],[5,2,4,4],6],[[],1],[8,[]],7,[]]] + +[[[[0,0],[3,4]]],[]] +[[[9,[10,0,9,10]],2],[4,6,[[8]]]] + +[[],[[[8],[8,1,5],9,[9,0,1],[5,10,3,0]]],[]] +[[[1,[8,5],6,[]],[10,1,1,[2,10,4]],[],[8],[[4,10,6,3,0],[2,10],6,8,[0,10,10]]],[[[1,4,4,7,6]],9,8,[[6],4,[8,9],[0]],[[9],[4],3,3,[6,5,6,0,3]]]] + +[[9],[[10,[5,2,8,0],7,[9,7,6,2,1],[5]],[9,[5,3],[4,10],[5,4,6,9]],[5,[6,8,4,4,7],[0,9,5,4],[1,0],3]],[],[[8],[[5,7,0]]]] +[[[8],[],4,9,1],[[1,[5,6,3,1],[8,6,0,5,0]],8,2,[[7,5,1]],1],[[[10,6,4],[8,6,1,4,9]],[[]],9,[7,[9,4,6],8,[6,4],7],[8,3,9,[10,6]]],[[7,8,[2],[7],[6,4,9,3]],10,[4,8,[0,6,2,1],6]]] + +[[[4,1,6],3,[6,7]],[0,[6,0,[7,9,9],5],[10,2,[2,2,1,9],[4,0],[2,1]]],[[]]] +[[],[8,6,7,[9,[6,9,2,4,7],[10,0]],[]],[1,[5,3,10,[6],[8,6,3,6]],2,3],[[],[[9,3,10,0]],2,[[9,3,10,6],4],0],[[[0,5,10,9],6,[2],[1,2,2]]]] + +[[[[],[8,1,5],[1,6],[2]],8],[[]],[1,5,[6],[[]]]] +[[],[[],[5,9,[3],[0,6,5],5],10,4,[8,[],6]],[8,0,[[3,4,1,10]],0]] + +[[7,2],[],[[5,7,3],[],[[2,2],[],9,[2,6,7]]]] +[[[[2,9,2]]],[]] + +[[4,3,10],[0,[1,9,[1,10,5]],8,[[8,6],[3,1],[9,8],1,[4,8,4,5]],3],[[[2,2],[8,5,5,2,0],3,[5]],[1,[3,10]]],[8,[[],[3,8],1]],[[]]] +[[[4,5,[],[10,3,10,4,10],8],[9],2,4,6],[[6,[10]]]] + +[[[6],8,4,2],[1,[]],[[],10,[]]] +[[2,6,1],[[[7,6],7,[],[2,0],[3]]],[10],[[9],10,[7,3,[],9,7],6,9]] + +[[0,6,9,[[0,10,1]]],[[[],7,3],[]],[],[8,9,2],[1,[0,8,[9,8]],[[3]],[1,7,7,1,[5,4,4,10]]]] +[[7,8,[]],[4,[8,[6,3],6],0],[2,9,7,[10]],[5,[[],0,3,[9]]],[]] + +[[],[0,[7,6,[2,6],[7,2]],[4,3,6,7,8],7,1]] +[[[[3],7,[],2,[3,9,4]],[[0,4,10,8,0],0,9,[4,6,4,0],[4,6,2,8]],[[5],[2]],1,[]],[[3,7,6,7,10],[[10,3,9],[4,1,7],0],7,[0]],[3,7,6],[7,[8],7,[[0],5,9,9,1],0]] + +[3,2,7,8] +[3,2,7,8,2] + +[[[6,[10,3],0],4,[[1,7,9,9,10],1,3,[1,4,4,5]],[[8],[],9,9],[[6,8,9,7,3],9,[0],[2,7],0]],[3],[[10,[],6],[]],[[[9],10]]] +[[9],[10,7],[[0,[9,10,10],10],7,10]] + +[[8,9,2,[],[9,7]],[[2,[7,6,2,3],8,6],[[7,7,9,4,5],[],[6,2,7,2],4,2],10,4],[4],[]] +[[10,0,[[],9,0],[[7,3,7,1],8,[0,3,8,5]]],[9,[4,0,10,9]],[]] + +[[[[6,1,4,0,2],[4],[5,1,0]],[5,[1,7,2]],5,7,[[]]]] +[[],[[[],0,4],[[0,8,5,10]],[5],[4,8,10],6],[[5,10,[8,8,4,4],7,[6,8,10,7]],10,[],[[7,6],[1,8,10,10,0],2,[1],5]],[[6,[],0,2],0],[7,[[9,7,0,0,2],[3],0],9]] + +[[[[1,1,8,8],5,[1],[5,3,6],[1,7,7,10,7]],10],[[1,[8,0,5,4],8],[[],6,5]]] +[[],[5,[],[6,8,5,[4]],[[4],[7,8,10,4],[6],[4,5,0]]],[3,[[3],[6,0,7,1,6],3,8,[6,10]],8,7],[[4,5,[2,8],[]],9]] + +[[[7,0,7,3]],[],[6,1,[0],9]] +[[[8,10,9]],[7,[7,[],[9,3,6],[1,2,4,7]]],[0,2,[]]] + +[[[[4],[7,4,6,7,1],8,6,9],6],[4,[],[1,[6,7,5],[7,7,4],8],9],[[9,10,7]]] +[[[0,[],[0,2,10]],7],[6,1,[[4,0],2,4,[10,3,5],10],9,[4]],[0],[[[6,3,4,4]],[[],[10,10],[8],9],0],[]] + +[[[9,[1,2,6,6,2],[9,7,0,3,4],[5,9,10,4,0],5],7,[[5],0,[2,7,4]],[[9,6,10,5,10],8,5,[3]]]] +[[3,[4,1,7,5],[9,4,[2,6],[7,5]],[[9,0,6,6]],3],[[]],[],[5,[],9,8]] + +[[0,5,[[],[8],[2,5]],4],[[1,[8,3,10],[6,3,8,1],[4,10,6,5],[9]]]] +[[0,3,2,4,4],[1,[],[[2,8]]]] + +[[[[9],8],7,5,[0,[8,6]],[6,3,[10],[]]],[[1,[]],[[9,10]]],[[[10,2,10,5,5]],[],4],[[7],6]] +[[],[6,[],[],5,4],[[3,[1,5,10],7],[4,[6,4,4,0,5],[0,4,2,9]],[2,8,4,[6],[0]]],[[],[7,[4],[]]],[[],[[]],[[6,6,9],[9,5],8,[3,2,3]],[[8],6],10]] + +[[[],5,1],[[[2,1,3,10],4,[],[4,1,4],10],7],[8,5,[6]],[[],0,[4,[7,1,2,4]],1,1]] +[[[[0],1],[2,[4]],[[],9,[3,7,6,2],[5,10,7,0]]],[],[[[1]],[[0,5],[0,6]],[[1,10],[0,7],[6,9,4,10]],5,[[3,6,5]]],[]] + +[[[0,[0,6,7,6,3],2,[]]]] +[[7,5],[3,3,8,[8,[9,7],[2,2],[2,10,5,7],[7,1,8]]]] + +[[[6,[3,4,8],[4],[1,1,1],9],3,[[7,5],4,[9,8,0],[1,6,4,10,3]],[3]],[[3,[1,5,3,3,1],9,8],6,[0,[2,10,7,3]],[7,2,[6]]],[9,4,[],[[10,4,4,10,8],7,[3,2,0,1,0]]],[[4,9]]] +[[[[7,5,9],[1,3],1,0,8],[[10,2]],5,4],[[[],4,[],6,[0,3,1,6,10]],1,2]] + +[[9,9,[[],[7,5,4,3]]],[3,3,[],[4,[9,0,0,1]],8],[6],[[],6,[4,3,[],[1,7,6,9,6]]]] +[[10],[],[],[8],[9]] + +[[4],[[0,[10,1],[2,7,9,4,6],3],5],[[[1,4],[3,8,10,4],8,[7,8,1,4,8],[]],3]] +[[],[3],[1,[0,[2,7,0],2,8,[3,8,6,1,8]],9],[]] + +[[10],[],[[[3,9,9],[],[7,8,6,7,5],6],6,8,[4,[10,10,2,9,9],9,4,1]]] +[[6],[1,4,5,[[10,6],[],9,6]],[[0,[2,5],[5,9],7],[[0],3,1]],[[10],7],[[[8,4,2,7]],4,7]] + +[[[7],1,[],[[],5,1],4],[],[0],[2,[1,[0],5],3,8],[10,[7,9,4,[2,5,1,7]],0]] +[[[],4,9,[1]],[6,10,[[9,7],[4],[0,10,6]],[1,10],8]] + +[[[[],9,3,[5]],1,[4,[6,10,6,5,2],[],[6,7]],[10]],[2,[],4],[[10,8,0,[],2],[[],6,1,[5,6,8,7],[10,1,1]]],[[5,[2,9]],8,10,[7,10,[0,9],[8,5]]]] +[[[[6],0,8,2,[4,8,1,9]],[8,10,7],0],[4,[]],[9,2,[10,[]],6],[8,9,[5]],[]] + +[[[[],8],[1,[4],[8,1,8,4,0],[9,7,4,1]],10,8,[[3,1],[10,0,9,10,10]]],[[]],[6,8,[[10,3],8,6,[0,9,5]],3,[]],[[6,8],1,6,[[4,10],[],5],[[3,8,6,1,1],[10]]],[[],[[7,1,3,8],0,[]]]] +[[8,[[9,9,4]],[[6,4,8,10],1,[6]],3]] + +[[[[3,5],8,[0,0],2],[6,[2,5,5,7],[4,10],[6,6]],[[3,4,2,6]],[[1,7,2,6,0],[4],10,[9,2]],10]] +[[[[7,6,8,5,10],[7,0,9,8,9],5,[7,7],[2,8,1,0,5]]],[7],[],[[4,3,[2]]],[[[10,1],0,1],6]] + +[[0,[[10,7,8],3,9,[10,4,2,0]],[10,7]],[0,10],[[]],[[[6,9],9],10,6,5,4],[[[],6,9],4,2]] +[[[9],[[]]],[5,[8,9,[4,9,6,6,6],1,[]],[0]],[[],5,[7,7,7,3,0]],[[8],6,4,7,[[9,4,7,8]]],[[[10,6,0,6,3],9,[7,7]],[9,1,[],9],[[3,4,10,8],5,9,2,5]]] + +[[5],[]] +[[[10,[9,3,2],0,[7,10,8,0,1]]]] + +[[[[],0,0,8,[5]],[8],[0,[2,7],[10]]]] +[[[[10,7,1,8],8,[],1],4,10,2],[[[9,3,10]],5,[[3,5],[4],[]]],[1]] + +[[[3,[7,7,0],9],[5,[7,1],[4,5,1,1],8]],[[1],[7,5,1,9]],[[],[[5,10,0,1,5],3]]] +[[4,9,[5,[10,9,9,3,7],3,[4,1,3,3]],4,10],[],[[]],[[5,[10,3]],[[10,0,7],[2,1]],[8,[],4],4],[9,[0],[],[6,[1,9]],9]] + +[[[],8,4,[1]],[[[2,1,2,1],[10]],10,7,4],[[5,8,[8,3,1,5,1],[5,6,8]],[[2,10],[]]]] +[[[9,[2,4,9],[10,5],[],3],0,[0,[],4],[8],3],[],[9,[9],2],[],[]] + +[[10],[[]],[3,[],1,8,9],[0,[5,[8,7,8,6],8,[10,9,3,0]],[[],3,[8,1,7,8],2,7]]] +[[],[[4],3,[[8,8]],[],1],[],[4,0,4,[9,10]],[[9,[7,4,5],7],8,[6,[8,7,5,7,9]]]] + +[[[[3,1,9,7,2]],1,3],[3,1,[[],[10,7,1,5,1]],[[2,5],[1,9,9]]],[10],[],[[[5,8,8,4,3],0,[2],[5,9]],2,2,[]]] +[[[[7]],2]] + +[[7,[9,6],[[4,1,1,8],9,[]],[[],9],[0,0,[8,6,0,2]]],[[],[1]]] +[[4,7],[],[10,1,[9,0,[5,9],[0,5],7],[8,0,7],[[8,1,4,5],8]]] + +[[10,[[8,10,4]],9,[]],[],[[10],7],[3,4,5,10,[[6,4,8,7,9],3,[0,5]]]] +[[9,[6,[2,8,9],3,[2],[0,1,5,0]]],[5],[[[9,8,1,9,8],[],[9,4,8],1,6],4,[3]],[[8,10,3,3,10],8,1,4],[]] + +[[8],[[1,9,4],[9],0],[[],5,0],[3],[[9],3]] +[[0,5],[0,[[9,6,8]],8]] + +[[1,[],[[8,10,2,5],6,[5,0,7,2,8],2]],[]] +[[6,5,10,9,[5,7,8,[2,3,9,8,10]]]] + +[[],[8],[[4],[1,9,1,3],3]] +[[1,[[],[],10,[10,2],6],0,[]]] + +[[[],10,[[7],[1,0,9],7]]] +[[1,2],[],[[[4,10]]],[[1,[6,9,1,0],4,[7]],4,[[8,10,0,5,5],1,6,[8,7,10,0],[5]],7]] + +[[[],[5,9,[2,4,7,7],[10],7]]] +[[[1],2,[7,0,[7,9,3,5,10],6,[6,3,3,0]],[],[2,5]]] + +[[],[[9,4,[5,5],[]],5,2,[6,10,10,[0,1,3],10],6],[10,[[5,3,0],[],2],[[1]],4]] +[[[[4,6,9]]],[[10,0,[8,1,5,3,6],[],10],2],[8,[[2,3,10,5,10]],[[9,1,3,3,2]],[[7,2,8],1]],[]] + +[[],[[[],[],5,[1],[2,7,1,7,2]],7,9,[[6,2,3,4,0],8,2],2]] +[[],[4,2,5,[[1,3],1,[6,5],[3,5,7],[5,5,8,10,5]]],[],[]] + +[[7,[2,[4,0,6,6],0],3]] +[[3,3,[[1,5]]]] + +[[[[4],[5,5],[9,10,2,6],[4,2,1,4]],0,0,10,[[],[6],[3,4,4,2,6],[2,8],[]]]] +[[2,[[10],10,7,[],7],[[2,3,2,9],[2,2,8,6,2],[5,5,2,9,1]]],[[],2,8,1,[2,[4,5,9,5,1],8]],[[[]],6,[10,[6,5],[6,10,9,5,5],2]]] + +[[4,[9,[3,2,2],[3,2,2,10],3,[10,8,5,2]]]] +[[0,9,8,[[2,1],[0,7,2,9,4],[6]]],[[5,9,[3],7],0,7,[0,[8,1,2],[2,10,9,3,6]],7]] + +[[[1,[7,5],7],0],[2,0,4,1,7],[[2,9,4,[8,3,8],[2]]]] +[[],[[6,10],6,7],[0,9,6,4,[2,1,[5,1],[]]],[[],[[7],2,5,[6,0,6,2]],[[0,9,2,3],3]],[[[],10],0,6,8]] + +[[],[],[2],[[4,[10,10]],[1],[7,3,[9,9],0],[[3,7],10,[5,1],9]]] +[[7,[[6,9]],4,6,2],[[],[],[6,6]]] + +[[[10,5,10,7,7],4,3,1,3],[],[4]] +[[3,[5,2,7,[5],5],[[5]],0,2],[[],[[6,7,0],[0,8]],7,[2,0,8],[[0,2],[]]],[1,7,10,[7,3,1],[]],[4,[[9,1,10,7],[7,9,3]],[],[1,1,9,5]],[9,4,5,[[3,2,7,0],[1],7,4,6]]] + +[[[[3,4,4,8],[],[5,9,10,4,3],[1]]],[2],[4,3,[],[4],[[3,3],3,[8,8],[1,4,10],[3]]],[[[0,7,10],[10,9,3,0,10],6,7,6],0,[9,4,0,0,[9,10,0,7]],[6],[]]] +[[3,[[]],0,[5],4],[6,8,10,6,[[8,1,5,5,7],3,0,[],4]]] + +[[[5,4,5,8,1],6,[8,[],[0,6,0],[3,8,10,0]]]] +[[[[10,4,1,4],[2,5,9,2],[6,3,2,5,2],[],8],[10],2],[[2]]] + +[[[7,[7,10,2,7],[]],[4,7,[0,10,10],4,10],[],10],[3,4,9,[],2],[[8],9,[7,[8,7,2],[2,4,6],4,[8,4,6]]]] +[[6,6,[[3],[3],[1]],8],[[9,[8,8,3,9],10]],[[5,5,4,[]],9,[]],[8,[[3],6,6],[1,[3,7],0,9,0],[[],[],9,3],[2]],[[[3],[6,6,4,9,6],[7,5],[3],8]]] + +[[0,3,[7,10],[7,[7,1,5,4]]],[[7,7,10,[7,1,5]],[4,[2,3],[1],9,[]],4]] +[[4,[[3,6,10,8]],9,9],[[[6,0,9,7],[0,9,5,3],9]]] + +[[[4,1],[1,1,[6,5,7],3,[9]]],[8,8,0,[6]],[0,[[8,8,4,0,0],[8,9,1,8,8],[2]]]] +[[9,1],[5,1,[[7],[6,5],[],[7]],10,3],[2,3],[1,5,[],[]]] + +[[[[5,9,0,6]],[0,[9,9],0,[]],6],[[]],[[[6,4],10],10,0]] +[[],[[]],[[1,3,[7,8,6]],[[3]],8],[[[],[2,3,8,5,4]],8],[9,6,[5,[]],[9,[6,9,7,3]],9]] + +[[5,3,1],[2,5,[[],1,[1,10,9,0,7],[],[]]],[5],[3,10,[[8,4],[5,7]],5],[[5,8],[[1,6,4],10,6,3,[7,5,1,8,3]],[],[[],[3,7],2,[5,7],[10,7,3]],[[5,10],1,[5,8]]]] +[[[1,[5,0],0,0],10,7,[],3],[[[0,0,6,9,0],[10,4,9,0]],3],[8]] + +[[6,6,3,[6,0,10,[1,6,0,6],6]],[1,[[2,9,2,5,1],9],[6,[1],0,4,7]],[[[1,10,8]],[1,3,[2,1,10,0],10],0,8],[[[8,1,2,9,5],[4,6,10,8]],6,0,[],6]] +[[[[0,8,2,2],[9,1,5,8,6],8],1,0,[2,[0,4],[10]],[[9,4,2,3,3],[4,6,0],9,7]],[[6,[],0,[5,7,4]]]] + +[[[[2],[8,9,1,3,3],[3,8,5,6],[7,3],5],[10,5,[8,0,5,7,8]],[],3],[4,[[0,4,7,4],1,[8,0,7,3],9,[10]]]] +[[[[7,1,8,1]],10,[10,[1,8,1,5],[9,9,9],[5,10,10]],5,[]],[],[],[[10],[[0,1,8]],2,[[],9,[0],5,[]]]] + +[[0,0],[[],3,[[4,8,4,6],3,[1,5,0,0]]],[[],10],[[8,[5,8,7],8],2,0,[]],[8,5,[[],[]],2]] +[[10,[10],[],7,10],[[9,[10,6],2,4],[[6,9,6,0],4,7,1],[8,9,[]],[[5,3,10]],7],[8,[[5,1,1,1,5]],[[1,6,3,5]],[[4,5,7],[],3],[[7,1,5,4],[0,10,10],[1]]]] + +[[6,1],[],[4,[[9,10,7,8,2],[8,2],10],3,10,[[8,8,3],4,7,[2,1,5,5,3],[8,6,7,5,0]]]] +[[[0,[4],[4],[2,5,4,7,7],5],0,[]],[]] + +[[[],3,8,[[7,5,3,8,9],3,[8,10,4,7]]],[[[10],10,[0,9,3]],5,[[10,2,10,10,6],10,7,[7,4,7,9,9]]],[],[[7,[],5],9,[10,[4,9,0,2],[9]],[5,[1,10,2],[4,4],[8,2]],[[3,7,8],5,[9,2,5,5,5],[2,10,2]]],[[[9,9,9,10],[9],[10,10,9],[8]],8]] +[[],[[9,[10,7,7,4]],10],[[1,5,9,4],[[6,6,3,10],[],5],3,[[],9,[6,7,3],3,4],10],[[0,[6,8,10],10,[1]],[[2,2,5,5]]]] + +[[8,0,9],[0,1,[0,1,4],0],[3,4],[[[0,1]],1,[9,5,9],[5,[3],5,[3],[2,1,6]]]] +[[[[10,3,10,2],7,3],4,[[1,5,6,4,5],[9,4,6,9],3,[9]],[[1,5,7],[4,10,7],[4,2],10,[9,6,0]]]] + +[[5,5,[1,[9,6,9],4],1,0],[[[8,4],[6],5,[4,3,9,7],3]],[5,4,7,5,[]],[3,2]] +[[2],[9,[[3,7,1],[2,3,4,9],3,6,[1,2,9,0,4]],8]] + +[[1],[[2,[2,2],[3,3,1,3]],1,[[8],[0,5]],[7,8]],[[[10,5],3,[9,6],2,[9,6,8,6]]],[[4],9,5],[3]] +[[6,[],[4],[[3,0,9],[4,9],[4,4,6],0,10],9]] + +[[[8,7],2,[[]],6],[10,8],[1,3,8],[3],[4]] +[[7,[4,7,8,[0,2]],1],[[[10,9,9,6],9,[9],7,1],5,[[8],1,[10,4,10],6],9]] + +[[[[2,5,1,8,0],10,7,[5,4,10,0]],6,6,[[4,6,7,9],2,[],[6,10,7,9]]],[[8,[8,6,10,0],4,5],6,4,[[4,2,3],8,6,3,3],[[9],[1,4,7,5,5],[4],7]],[[],[6,2,[6,5,4,6]],10,8],[3,[4,8,[0,2,10,10,9],4],[6],[[]]],[[]]] +[[[[3,7,2],10,10],6,[1,4,0,0,[]],[[0,5]]],[[0,[5,2,1,0,10]],[2],[0,[7],8,3]]] + +[[],[6,5,3,6,[3,4,[7,2,9],0]],[3],[7,[[],4,[]],7,[]],[[[10,10,6],10],[[8],4,[9,9,0,10,7],4,4],9,[[1,8,10,7,4]],6]] +[[],[10,[6,2],[5,3],2],[4],[[7,[7]],8,[2,9,[10,2,0],2],[],[[7,1],1,9,[4,2]]]] + +[[[],8,[9,0]],[],[4,2,[1,[1,5,7,4]]],[1,4,0,[[],5,4,9,[10,9]]],[[],[4,10,[1,10]],9,[]]] +[[[[7],[7,0,10]],[3],[[]],[]],[[[6],[],[6,0],1,[9,5]],[10,[5],[],1],[[1,8],[],9,[7],[1,8,8,8]],[],[0]],[[[]]],[1,[],[6,[],7,[5,5,2],1],8]] + +[[8,[],7,[]],[5,6,[],9,[[7,9,9],1]],[3]] +[[[4,[3],[9,4,4,9],1,6],[10],2],[[0],[],[[2,3,7,2,3]],[[3,9],10,[4]]]] + +[[[[2,3,9,1,6],[10],[10]],[0,9,[0,4,10],7,[3,2,7]],5]] +[[[7,[9],5],4,10,[[3,9,8],[5,6,1,0,9],9,[]]],[1,[[7],[5,10]],8,[[4,8,5],2,9]]] + +[[[[3],9,2,8,[]],[10,[1,10,6],[10,7,9],4,[10]],[2,[3,6,9,6],[5,0],[3,5,10],8],4]] +[[7,[[10,10,3],1],4,[0,[8,9,6],9,[6,3,9,1,6]]],[]] + +[[[8,[3,1,3,2,3],5,10],[3,2],9],[8]] +[[4,7],[],[7,6,[[10,5,0,3,4],9],7,[[0,5,9,5],7,2,[5,8]]]] + +[[2,[],2],[2,[5,[2,2,10,2,4],[3,3,5,10],[6,1]],[6,[6]],2,8]] +[[[7,3,4],4,[[7],[10,6,9],[],[]],[[2,7,5],[8],[4,7,10,9,6],[]],[3,0,8]]] + +[6,4,3,7,0] +[6,4,3,7] + +[[[[0,2,5],9],1,8]] +[[[1,[4],[8,7,5,7,3]],10],[]] + +[[8,[5,[9,1,2],5,10]]] +[[[4],7,8]] + +[[7,[]]] +[[[[9,5],[2,10,6,7]],2,4,[],[10,6,8,3,8]],[[[]],9,[[2,9],10,3,6],[[1,10],[9]]]] + +[[5,[[1,7,9],10],8],[[6,[7,1,9,2],10,[5],[6,4,9]],[10]]] +[[[2,8,6,[]]]] + +[[9,8]] +[[3,9,[[0,2,0,3,3],[9,6,7,3,9],3,10,4]],[1,3,[[],[1,7,5],[8,4,8],0,[2,2]],9,6],[]] + +[[[],[[0,4,9]],[[1,10,9,8,7],6,[5,1,6,10],4]],[[[],[9,0,2],10],[3],9,[]],[2,6],[[],1,[9,8,[5,3],[],[4]],6,10]] +[[0]] + +[[1,3],[7,[],[[2,6,8,7,5],2,[],[7,0,6]]]] +[[[6,[],7,3],5,[2,[],[9,8,1,4],3]],[[[0,7]]],[10,[[6,0,1,7],[],[8,2,5],7],1],[]] + +[[[],[],5,[],[[8,5,10]]],[10,[[0,3],[1],[6,3,1],[5,4,1]],4,1],[1,[],[],[[3],1,[9],5]]] +[[[7,[4,10],10,[0,3,10],6],1]] + +[[[[3,4,6],7,[0,1,6,8,10],7],[[1,9,5,10]],9]] +[[[6,[2,7,5,9],0]]] + +[[8]] +[[[[1,0,6],2,[3,10,1,9]],6]] + +[[[7],0,[4,[4,0,7,8],[7,10,4,6,10],[]]]] +[[[10,7,[8,10,2,0,6]],6,[8,4,[8]],1,5],[8,[1,6],3]] + +[[8,[7]],[7,0,0,6],[[[4,8,9,7],8,[6,0,1,3],9],1,1,10,7],[2,[7,[4,9,2,9,4],5,[10,9,5,4]],[5,[10,3,6,7],[8],[4,6],[3,1,1,5]],9,4],[4,[[8,7,2,2,0]],[[3,10]],[],[10,0,7,8]]] +[[[[5,4,9,4,9]],[[7,6,2,8],[3,9,10],2,3,9],9,[[10,2,8,2,0]]],[9,[4,[1],9],4],[],[5,5]] + +[[[[8,2,4],[8,7,3]]],[7,[2,10,8,[7]]],[9,[[6,3]],[],8,6]] +[[[[],[0,1,0],[6,9,8,7,2]],[[3,1,0,10]]],[[6,[0,10],[],5,[4,2,1,6,5]],[]],[1],[3,[6,1,[6,7]],4],[[[],3,10,[10,1]],7]] + +[[[10,[1]],8,5,[]],[9]] +[[[3,[1],10],[10,9]],[10],[1,9,[[7,2,1,8,7],[]],3,0]] + +[[[],[[3,5,5,7,7],[9],2],[[10],0],8],[7,[[6,6,5,8],0,2,[4,7,3,5]]],[[1],2,[[2],[7,3,7]],6]] +[[],[3]] + +[[4,[],[[2],[6,7],0],4],[10,[[9,4,7,6,10],[0,0,1,10,6],6,1,3]]] +[[4,1,0,1],[],[],[[1],[],[[9,10,5,0],[10,7,4],[10,9,1,10,3]]]] + +[[[[4,8,8,0],[7],3,2],8,[[10,9,1]]]] +[[[1,6,[10,4,2]],1],[1,[4,[2,7],6,[7],2]],[3,9,10,9],[]] + +[[[[10,1,4,6,5],[2,8,10,6],3],2,2,[6,3],[[4]]],[4,[[7,6,8,0],[4,0,3],0,[10,9]],[3,8,10],1]] +[[[2,5]],[[5,[8,7,2,0],8,[9,1,5],[9,8,0]],10,10,[9,3,[10]],3],[[2,2,7,[3,10,7,10,8],7],8],[4,0,[6,2,10],[10,3,0,[4,6,5,4,2]]]] + +[[[],2],[0,6,[[2,7,7,2,4],[7,1]],6,2]] +[[3,[],[[10,2,1,5]]],[]] + +[[],[8,[[5,10,5]],9]] +[[[[2,8,4],[2,0],4,6,4],2,[[10,5,10],1,[10,9,1,1]]],[2,7],[],[[[3,1,4,8,4],4,[0,5,9,3],4,[]],[],[8,2]]] From 1551c5ad8e801e833d34313f1049ea81ca75bb26 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 13 Dec 2022 10:03:37 +0100 Subject: [PATCH 327/479] 2022: d13: ex2: add solution --- 2022/d13/ex2/ex2.py | 52 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100755 2022/d13/ex2/ex2.py diff --git a/2022/d13/ex2/ex2.py b/2022/d13/ex2/ex2.py new file mode 100755 index 0000000..5400d83 --- /dev/null +++ b/2022/d13/ex2/ex2.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python + +import functools +import sys +from typing import Union + +Packet = Union[int, list["Packet"]] + + +def cmp_packet(lhs: Packet, rhs: Packet) -> int: + if isinstance(lhs, int) and isinstance(rhs, int): + return lhs - rhs + if isinstance(lhs, int): + lhs = [lhs] + if isinstance(rhs, int): + rhs = [rhs] + non_equal_cmp = (res for res in map(cmp_packet, lhs, rhs) if res != 0) + len_cmp = cmp_packet(len(lhs), len(rhs)) + return next(non_equal_cmp, len_cmp) + + +def solve(input: list[str]) -> int: + def to_packet(input: str) -> Packet: + # Sanity checks + assert "\n" not in input + assert input + + return eval(input) # Secret best way to parse JSON + + packets = [to_packet(line) for line in input if line] + packets.extend( + ( + [[2]], + [[6]], + ) + ) + packets.sort(key=functools.cmp_to_key(cmp_packet)) + + # Packets are 1-indexed + first = packets.index([[2]]) + 1 + second = packets.index([[6]]) + 1 + + return first * second + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 8db6023086c64e4ec14f519186bfc02bd138398b Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 14 Dec 2022 14:41:48 +0100 Subject: [PATCH 328/479] 2022: d14: ex1: add input --- 2022/d14/ex1/input | 144 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 2022/d14/ex1/input diff --git a/2022/d14/ex1/input b/2022/d14/ex1/input new file mode 100644 index 0000000..7bef215 --- /dev/null +++ b/2022/d14/ex1/input @@ -0,0 +1,144 @@ +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +510,167 -> 514,167 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +498,175 -> 498,176 -> 505,176 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +489,79 -> 493,79 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +483,85 -> 487,85 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +480,82 -> 484,82 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +494,144 -> 494,145 -> 504,145 -> 504,144 +486,54 -> 490,54 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +492,60 -> 496,60 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +497,147 -> 497,148 -> 513,148 -> 513,147 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +474,70 -> 478,70 +466,103 -> 466,104 -> 481,104 -> 481,103 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +471,85 -> 475,85 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +480,70 -> 484,70 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +468,70 -> 472,70 +480,60 -> 484,60 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +477,68 -> 481,68 +483,79 -> 487,79 +495,85 -> 499,85 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +474,82 -> 478,82 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +495,63 -> 499,63 +489,63 -> 493,63 +477,79 -> 481,79 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +501,170 -> 505,170 +497,147 -> 497,148 -> 513,148 -> 513,147 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +489,85 -> 493,85 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +471,68 -> 475,68 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +486,76 -> 490,76 +483,73 -> 487,73 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +466,103 -> 466,104 -> 481,104 -> 481,103 +504,167 -> 508,167 +507,170 -> 511,170 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +507,164 -> 511,164 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +474,66 -> 478,66 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +489,57 -> 493,57 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +480,76 -> 484,76 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +477,63 -> 481,63 +492,82 -> 496,82 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +513,170 -> 517,170 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +483,57 -> 487,57 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +498,175 -> 498,176 -> 505,176 +486,60 -> 490,60 +497,147 -> 497,148 -> 513,148 -> 513,147 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +486,82 -> 490,82 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +477,85 -> 481,85 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +483,63 -> 487,63 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +466,103 -> 466,104 -> 481,104 -> 481,103 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +494,144 -> 494,145 -> 504,145 -> 504,144 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +494,144 -> 494,145 -> 504,145 -> 504,144 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 From ff1de34ee55aeb5b7cdb81816a20699be9cc5b41 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 14 Dec 2022 14:41:54 +0100 Subject: [PATCH 329/479] 2022: d14: ex1: add solution --- 2022/d14/ex1/ex1.py | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100755 2022/d14/ex1/ex1.py diff --git a/2022/d14/ex1/ex1.py b/2022/d14/ex1/ex1.py new file mode 100755 index 0000000..7f2c7ad --- /dev/null +++ b/2022/d14/ex1/ex1.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +import dataclasses +import itertools +import sys +from collections.abc import Iterator +from typing import NamedTuple, Optional + + +def sign(n: int) -> int: + if n > 0: + return 1 + elif n < 0: + return -1 + return 0 + + +class Point(NamedTuple): + x: int + y: int + + @classmethod + def from_input(cls, input: str) -> "Point": + x, y = input.split(",") + return cls(int(x), int(y)) + + +@dataclasses.dataclass +class Line: + points: list[Point] + + @classmethod + def from_input(cls, input: str) -> "Line": + points = [Point.from_input(p) for p in input.split(" -> ")] + return cls(points) + + @property + def all_points(self) -> set[Point]: + res: set[Point] = set() + + for start, end in itertools.pairwise(self.points): + dx, dy = sign(end.x - start.x), sign(end.y - start.y) + res.add(start) + while start != end: + start = Point(start.x + dx, start.y + dy) + res.add(start) + + return res + + +def solve(input: list[str]) -> int: + lines = [Line.from_input(line) for line in input] + all_points = set.union(*(line.all_points for line in lines)) + max_height = max(p.y for p in all_points) + + def sand_candidates(p: Point) -> Iterator[Point]: + for dx, dy in ((0, 1), (-1, 1), (1, 1)): + yield Point(p.x + dx, p.y + dy) + + def add_sand(points: set[Point]) -> Optional[Point]: + start = Point(500, 0) + + assert start not in points # Sanity check + + while True: + # Steady state was reached + if start.y >= max_height: + return None + + viable_candidates = (p for p in sand_candidates(start) if p not in points) + candidate = next(viable_candidates, None) + # Sand can't fall any lower + if candidate is None: + break + start = candidate + + return start + + res = 0 + while True: + grain = add_sand(all_points) + if grain is None: + break + all_points.add(grain) + res += 1 + return res + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 7b56fdd70611618ed7a3108633e9b19dad334d30 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 14 Dec 2022 14:42:01 +0100 Subject: [PATCH 330/479] 2022: d14: ex2: add input --- 2022/d14/ex2/input | 144 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 2022/d14/ex2/input diff --git a/2022/d14/ex2/input b/2022/d14/ex2/input new file mode 100644 index 0000000..7bef215 --- /dev/null +++ b/2022/d14/ex2/input @@ -0,0 +1,144 @@ +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +510,167 -> 514,167 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +498,175 -> 498,176 -> 505,176 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +489,79 -> 493,79 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +483,85 -> 487,85 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +480,82 -> 484,82 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +494,144 -> 494,145 -> 504,145 -> 504,144 +486,54 -> 490,54 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +492,60 -> 496,60 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +497,147 -> 497,148 -> 513,148 -> 513,147 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +474,70 -> 478,70 +466,103 -> 466,104 -> 481,104 -> 481,103 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +471,85 -> 475,85 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +480,70 -> 484,70 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +468,70 -> 472,70 +480,60 -> 484,60 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +477,68 -> 481,68 +483,79 -> 487,79 +495,85 -> 499,85 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +474,82 -> 478,82 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +495,63 -> 499,63 +489,63 -> 493,63 +477,79 -> 481,79 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +501,170 -> 505,170 +497,147 -> 497,148 -> 513,148 -> 513,147 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +489,85 -> 493,85 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +471,68 -> 475,68 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +486,76 -> 490,76 +483,73 -> 487,73 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +466,103 -> 466,104 -> 481,104 -> 481,103 +504,167 -> 508,167 +507,170 -> 511,170 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +507,164 -> 511,164 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +474,66 -> 478,66 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +486,120 -> 486,122 -> 482,122 -> 482,128 -> 491,128 -> 491,122 -> 490,122 -> 490,120 +489,57 -> 493,57 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +480,76 -> 484,76 +488,36 -> 488,32 -> 488,36 -> 490,36 -> 490,26 -> 490,36 -> 492,36 -> 492,26 -> 492,36 -> 494,36 -> 494,32 -> 494,36 +477,63 -> 481,63 +492,82 -> 496,82 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +513,170 -> 517,170 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +483,57 -> 487,57 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +498,175 -> 498,176 -> 505,176 +486,60 -> 490,60 +497,147 -> 497,148 -> 513,148 -> 513,147 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +486,82 -> 490,82 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +477,85 -> 481,85 +493,23 -> 493,21 -> 493,23 -> 495,23 -> 495,18 -> 495,23 -> 497,23 -> 497,19 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,18 -> 501,23 -> 503,23 -> 503,15 -> 503,23 -> 505,23 -> 505,16 -> 505,23 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +483,63 -> 487,63 +513,151 -> 513,155 -> 510,155 -> 510,161 -> 519,161 -> 519,155 -> 515,155 -> 515,151 +466,103 -> 466,104 -> 481,104 -> 481,103 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +463,98 -> 463,97 -> 463,98 -> 465,98 -> 465,94 -> 465,98 -> 467,98 -> 467,94 -> 467,98 -> 469,98 -> 469,88 -> 469,98 -> 471,98 -> 471,90 -> 471,98 -> 473,98 -> 473,97 -> 473,98 -> 475,98 -> 475,95 -> 475,98 +494,144 -> 494,145 -> 504,145 -> 504,144 +493,39 -> 493,43 -> 489,43 -> 489,51 -> 501,51 -> 501,43 -> 496,43 -> 496,39 +490,131 -> 490,134 -> 482,134 -> 482,139 -> 501,139 -> 501,134 -> 495,134 -> 495,131 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 +494,144 -> 494,145 -> 504,145 -> 504,144 +476,117 -> 476,114 -> 476,117 -> 478,117 -> 478,110 -> 478,117 -> 480,117 -> 480,110 -> 480,117 -> 482,117 -> 482,114 -> 482,117 -> 484,117 -> 484,113 -> 484,117 -> 486,117 -> 486,113 -> 486,117 From 336a67a2ca4c5095ae019045ff87bd74fd02bbb4 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 14 Dec 2022 14:42:06 +0100 Subject: [PATCH 331/479] 2022: d14: ex2: add solution --- 2022/d14/ex2/ex2.py | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100755 2022/d14/ex2/ex2.py diff --git a/2022/d14/ex2/ex2.py b/2022/d14/ex2/ex2.py new file mode 100755 index 0000000..28dcd42 --- /dev/null +++ b/2022/d14/ex2/ex2.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +import dataclasses +import itertools +import sys +from collections.abc import Iterator +from typing import NamedTuple, Optional + + +def sign(n: int) -> int: + if n > 0: + return 1 + elif n < 0: + return -1 + return 0 + + +class Point(NamedTuple): + x: int + y: int + + @classmethod + def from_input(cls, input: str) -> "Point": + x, y = input.split(",") + return cls(int(x), int(y)) + + +@dataclasses.dataclass +class Line: + points: list[Point] + + @classmethod + def from_input(cls, input: str) -> "Line": + points = [Point.from_input(p) for p in input.split(" -> ")] + return cls(points) + + @property + def all_points(self) -> set[Point]: + res: set[Point] = set() + + for start, end in itertools.pairwise(self.points): + dx, dy = sign(end.x - start.x), sign(end.y - start.y) + res.add(start) + while start != end: + start = Point(start.x + dx, start.y + dy) + res.add(start) + + return res + + +def solve(input: list[str]) -> int: + lines = [Line.from_input(line) for line in input] + all_points = set.union(*(line.all_points for line in lines)) + floor = max(p.y for p in all_points) + 2 + + def sand_candidates(p: Point) -> Iterator[Point]: + for dx, dy in ((0, 1), (-1, 1), (1, 1)): + yield Point(p.x + dx, p.y + dy) + + def add_sand(points: set[Point]) -> Optional[Point]: + start = Point(500, 0) + + if start in points: + return None + + while True: + viable_candidates = (p for p in sand_candidates(start) if p not in points) + candidate = next(viable_candidates, None) + # Sand can't fall any lower + if candidate is None: + break + # Sand can't fall through the floor + if candidate.y == floor: + break + start = candidate + + return start + + res = 0 + while True: + grain = add_sand(all_points) + if grain is None: + break + all_points.add(grain) + res += 1 + return res + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From a996fee1d7c1030236f863eff023463d3133b541 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 15 Dec 2022 11:14:21 +0100 Subject: [PATCH 332/479] 2022: d15: ex1: add input --- 2022/d15/ex1/input | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 2022/d15/ex1/input diff --git a/2022/d15/ex1/input b/2022/d15/ex1/input new file mode 100644 index 0000000..26816fd --- /dev/null +++ b/2022/d15/ex1/input @@ -0,0 +1,33 @@ +Sensor at x=407069, y=1770807: closest beacon is at x=105942, y=2000000 +Sensor at x=2968955, y=2961853: closest beacon is at x=2700669, y=3091664 +Sensor at x=3069788, y=2289672: closest beacon is at x=3072064, y=2287523 +Sensor at x=2206, y=1896380: closest beacon is at x=105942, y=2000000 +Sensor at x=3010408, y=2580417: closest beacon is at x=2966207, y=2275132 +Sensor at x=2511130, y=2230361: closest beacon is at x=2966207, y=2275132 +Sensor at x=65435, y=2285654: closest beacon is at x=105942, y=2000000 +Sensor at x=2811709, y=3379959: closest beacon is at x=2801189, y=3200444 +Sensor at x=168413, y=3989039: closest beacon is at x=-631655, y=3592291 +Sensor at x=165506, y=2154294: closest beacon is at x=105942, y=2000000 +Sensor at x=2720578, y=3116882: closest beacon is at x=2700669, y=3091664 +Sensor at x=786521, y=1485720: closest beacon is at x=105942, y=2000000 +Sensor at x=82364, y=2011850: closest beacon is at x=105942, y=2000000 +Sensor at x=2764729, y=3156203: closest beacon is at x=2801189, y=3200444 +Sensor at x=1795379, y=1766882: closest beacon is at x=1616322, y=907350 +Sensor at x=2708986, y=3105910: closest beacon is at x=2700669, y=3091664 +Sensor at x=579597, y=439: closest beacon is at x=1616322, y=907350 +Sensor at x=2671201, y=2736834: closest beacon is at x=2700669, y=3091664 +Sensor at x=3901, y=2089464: closest beacon is at x=105942, y=2000000 +Sensor at x=144449, y=813212: closest beacon is at x=105942, y=2000000 +Sensor at x=3619265, y=3169784: closest beacon is at x=2801189, y=3200444 +Sensor at x=2239333, y=3878605: closest beacon is at x=2801189, y=3200444 +Sensor at x=2220630, y=2493371: closest beacon is at x=2966207, y=2275132 +Sensor at x=1148022, y=403837: closest beacon is at x=1616322, y=907350 +Sensor at x=996105, y=3077490: closest beacon is at x=2700669, y=3091664 +Sensor at x=3763069, y=3875159: closest beacon is at x=2801189, y=3200444 +Sensor at x=3994575, y=2268273: closest beacon is at x=3072064, y=2287523 +Sensor at x=3025257, y=2244500: closest beacon is at x=2966207, y=2275132 +Sensor at x=2721366, y=1657084: closest beacon is at x=2966207, y=2275132 +Sensor at x=3783491, y=1332930: closest beacon is at x=3072064, y=2287523 +Sensor at x=52706, y=2020407: closest beacon is at x=105942, y=2000000 +Sensor at x=2543090, y=47584: closest beacon is at x=3450858, y=-772833 +Sensor at x=3499766, y=2477193: closest beacon is at x=3072064, y=2287523 From 58f530c3d1199668aa515781f10b8fe5ce0385d8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 15 Dec 2022 11:14:33 +0100 Subject: [PATCH 333/479] 2022: d15: ex1: add solution --- 2022/d15/ex1/ex1.py | 98 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100755 2022/d15/ex1/ex1.py diff --git a/2022/d15/ex1/ex1.py b/2022/d15/ex1/ex1.py new file mode 100755 index 0000000..257cd60 --- /dev/null +++ b/2022/d15/ex1/ex1.py @@ -0,0 +1,98 @@ +#!/usr/bin/env python + +import dataclasses +import functools +import sys +from collections.abc import Iterable +from typing import NamedTuple, Optional + + +class Point(NamedTuple): + x: int + y: int + + @classmethod + def from_input(cls, input: str) -> "Point": + assert input.startswith("x=") # Sanity check + x, y = input.split(", ") + return cls(int(x.split("=")[-1]), int(y.split("=")[-1])) + + +class Interval(NamedTuple): + start: int + end: int + + def as_set(self) -> set[int]: + return set(range(self.start, self.end + 1)) + + +def merge_intervals(intervals: Iterable[Interval]) -> list[Interval]: + intervals = sorted(intervals) + + res = [intervals[0]] + for candidate in intervals[1:]: + # Range is inclusive in both end, so add 1 to end in case of near miss + if (res[-1].end + 1) >= candidate.start: + new_end = max(res[-1].end, candidate.end) + res[-1] = Interval(res[-1].start, new_end) + else: + res.append(candidate) + + return res + + +def distance(a: Point, b: Point) -> int: + return abs(a.x - b.x) + abs(a.y - b.y) + + +@dataclasses.dataclass +class SensorData: + pos: Point + beacon: Point + + @classmethod + def from_input(cls, input: str) -> "SensorData": + assert input.startswith("Sensor at x=") # Sanity check + + mid = input.index(":") + sensor, beacon = input[:mid], input[mid:] + return cls( + Point.from_input(sensor[sensor.index("x") :]), + Point.from_input(beacon[beacon.index("x") :]), + ) + + @functools.cached_property + def safe_range(self) -> int: + return distance(self.pos, self.beacon) + + def scan_row(self, row: int) -> Optional[Interval]: + distance = abs(row - self.pos.y) + dx = self.safe_range - distance + if dx < 0: + return None + return Interval(self.pos.x - dx, self.pos.x + dx) + + +def solve(input: list[str]) -> int: + def points_without_sos(data: list[SensorData], row: int) -> list[Interval]: + intervals = (d.scan_row(row) for d in data) + return merge_intervals(i for i in intervals if i is not None) + + data = [SensorData.from_input(line) for line in input] + beacons = {d.beacon for d in data} + + ROW = 2_000_000 + intervals = points_without_sos(data, ROW) + return len( + set.union(*(i.as_set() for i in intervals)) + - {b.x for b in beacons if b.y == ROW} + ) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 18f87be63cfa79adb4205aaee6aeadf10aceafe4 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 15 Dec 2022 11:14:46 +0100 Subject: [PATCH 334/479] 2022: d15: ex2: add input --- 2022/d15/ex2/input | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 2022/d15/ex2/input diff --git a/2022/d15/ex2/input b/2022/d15/ex2/input new file mode 100644 index 0000000..26816fd --- /dev/null +++ b/2022/d15/ex2/input @@ -0,0 +1,33 @@ +Sensor at x=407069, y=1770807: closest beacon is at x=105942, y=2000000 +Sensor at x=2968955, y=2961853: closest beacon is at x=2700669, y=3091664 +Sensor at x=3069788, y=2289672: closest beacon is at x=3072064, y=2287523 +Sensor at x=2206, y=1896380: closest beacon is at x=105942, y=2000000 +Sensor at x=3010408, y=2580417: closest beacon is at x=2966207, y=2275132 +Sensor at x=2511130, y=2230361: closest beacon is at x=2966207, y=2275132 +Sensor at x=65435, y=2285654: closest beacon is at x=105942, y=2000000 +Sensor at x=2811709, y=3379959: closest beacon is at x=2801189, y=3200444 +Sensor at x=168413, y=3989039: closest beacon is at x=-631655, y=3592291 +Sensor at x=165506, y=2154294: closest beacon is at x=105942, y=2000000 +Sensor at x=2720578, y=3116882: closest beacon is at x=2700669, y=3091664 +Sensor at x=786521, y=1485720: closest beacon is at x=105942, y=2000000 +Sensor at x=82364, y=2011850: closest beacon is at x=105942, y=2000000 +Sensor at x=2764729, y=3156203: closest beacon is at x=2801189, y=3200444 +Sensor at x=1795379, y=1766882: closest beacon is at x=1616322, y=907350 +Sensor at x=2708986, y=3105910: closest beacon is at x=2700669, y=3091664 +Sensor at x=579597, y=439: closest beacon is at x=1616322, y=907350 +Sensor at x=2671201, y=2736834: closest beacon is at x=2700669, y=3091664 +Sensor at x=3901, y=2089464: closest beacon is at x=105942, y=2000000 +Sensor at x=144449, y=813212: closest beacon is at x=105942, y=2000000 +Sensor at x=3619265, y=3169784: closest beacon is at x=2801189, y=3200444 +Sensor at x=2239333, y=3878605: closest beacon is at x=2801189, y=3200444 +Sensor at x=2220630, y=2493371: closest beacon is at x=2966207, y=2275132 +Sensor at x=1148022, y=403837: closest beacon is at x=1616322, y=907350 +Sensor at x=996105, y=3077490: closest beacon is at x=2700669, y=3091664 +Sensor at x=3763069, y=3875159: closest beacon is at x=2801189, y=3200444 +Sensor at x=3994575, y=2268273: closest beacon is at x=3072064, y=2287523 +Sensor at x=3025257, y=2244500: closest beacon is at x=2966207, y=2275132 +Sensor at x=2721366, y=1657084: closest beacon is at x=2966207, y=2275132 +Sensor at x=3783491, y=1332930: closest beacon is at x=3072064, y=2287523 +Sensor at x=52706, y=2020407: closest beacon is at x=105942, y=2000000 +Sensor at x=2543090, y=47584: closest beacon is at x=3450858, y=-772833 +Sensor at x=3499766, y=2477193: closest beacon is at x=3072064, y=2287523 From 9c35ca0630c8280d8cf604966a545181eae588bc Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 15 Dec 2022 11:15:06 +0100 Subject: [PATCH 335/479] 2022: d15: ex2: add solution --- 2022/d15/ex2/ex2.py | 112 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100755 2022/d15/ex2/ex2.py diff --git a/2022/d15/ex2/ex2.py b/2022/d15/ex2/ex2.py new file mode 100755 index 0000000..65dfca4 --- /dev/null +++ b/2022/d15/ex2/ex2.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python + +import dataclasses +import functools +import sys +from collections.abc import Iterable +from typing import NamedTuple, Optional + + +class Point(NamedTuple): + x: int + y: int + + @classmethod + def from_input(cls, input: str) -> "Point": + assert input.startswith("x=") # Sanity check + x, y = input.split(", ") + return cls(int(x.split("=")[-1]), int(y.split("=")[-1])) + + +class Interval(NamedTuple): + start: int + end: int + + def as_set(self) -> set[int]: + return set(range(self.start, self.end + 1)) + + +def merge_intervals(intervals: Iterable[Interval]) -> list[Interval]: + intervals = sorted(intervals) + + res = [intervals[0]] + for candidate in intervals[1:]: + # Range is inclusive in both end, so add 1 to end in case of near miss + if (res[-1].end + 1) >= candidate.start: + new_end = max(res[-1].end, candidate.end) + res[-1] = Interval(res[-1].start, new_end) + else: + res.append(candidate) + + return res + + +def distance(a: Point, b: Point) -> int: + return abs(a.x - b.x) + abs(a.y - b.y) + + +@dataclasses.dataclass +class SensorData: + pos: Point + beacon: Point + + @classmethod + def from_input(cls, input: str) -> "SensorData": + assert input.startswith("Sensor at x=") # Sanity check + + mid = input.index(":") + sensor, beacon = input[:mid], input[mid:] + return cls( + Point.from_input(sensor[sensor.index("x") :]), + Point.from_input(beacon[beacon.index("x") :]), + ) + + @functools.cached_property + def safe_range(self) -> int: + return distance(self.pos, self.beacon) + + def scan_row(self, row: int) -> Optional[Interval]: + distance = abs(row - self.pos.y) + dx = self.safe_range - distance + if dx < 0: + return None + return Interval(self.pos.x - dx, self.pos.x + dx) + + +def solve(input: list[str]) -> int: + def points_without_sos(data: list[SensorData], row: int) -> list[Interval]: + intervals = (d.scan_row(row) for d in data) + return merge_intervals(i for i in intervals if i is not None) + + def find_hole(intervals: list[Interval], max_coord: int) -> Optional[int]: + for i in intervals: + if i.start > 0: + return i.start - 1 + if i.end < max_coord: + return i.end + 1 + + return None + + def find_sos(data: list[SensorData], max_coord: int) -> Point: + for row in range(0, max_coord + 1): + intervals = points_without_sos(data, row) + if (hole := find_hole(intervals, max_coord)) is not None: + return Point(hole, row) + assert False # Sanity check + + def tuning_frequency(p: Point) -> int: + return p.x * 4000000 + p.y + + data = [SensorData.from_input(line) for line in input] + MAX_COORD = 4_000_000 + sos_beacon = find_sos(data, MAX_COORD) + return tuning_frequency(sos_beacon) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 9b7ecb60a813ebcaa89ec9a5edf1bee99df95685 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 16 Dec 2022 10:37:52 +0100 Subject: [PATCH 336/479] 2022: d16: ex1: add input --- 2022/d16/ex1/input | 61 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 2022/d16/ex1/input diff --git a/2022/d16/ex1/input b/2022/d16/ex1/input new file mode 100644 index 0000000..d44b9fe --- /dev/null +++ b/2022/d16/ex1/input @@ -0,0 +1,61 @@ +Valve WT has flow rate=0; tunnels lead to valves BD, FQ +Valve UG has flow rate=0; tunnels lead to valves FQ, YB +Valve FN has flow rate=0; tunnels lead to valves TV, GA +Valve RU has flow rate=11; tunnels lead to valves YZ, QS, BL, BT, WJ +Valve RH has flow rate=0; tunnels lead to valves AS, II +Valve FL has flow rate=0; tunnels lead to valves HR, PQ +Valve KQ has flow rate=18; tunnels lead to valves FR, BN +Valve PM has flow rate=25; tunnels lead to valves YZ, FR +Valve RQ has flow rate=0; tunnels lead to valves FQ, MW +Valve BL has flow rate=0; tunnels lead to valves RU, IR +Valve FF has flow rate=0; tunnels lead to valves QS, ED +Valve KP has flow rate=0; tunnels lead to valves QM, MA +Valve YB has flow rate=0; tunnels lead to valves UG, HR +Valve TV has flow rate=17; tunnels lead to valves BD, MT, FN +Valve HY has flow rate=0; tunnels lead to valves DW, IU +Valve KF has flow rate=0; tunnels lead to valves AA, HR +Valve YC has flow rate=0; tunnels lead to valves II, MA +Valve EE has flow rate=0; tunnels lead to valves AA, CD +Valve ED has flow rate=9; tunnels lead to valves HG, FF +Valve SA has flow rate=0; tunnels lead to valves MW, LS +Valve II has flow rate=20; tunnels lead to valves YC, CY, QP, RH +Valve BN has flow rate=0; tunnels lead to valves BT, KQ +Valve MO has flow rate=0; tunnels lead to valves XO, VI +Valve YZ has flow rate=0; tunnels lead to valves RU, PM +Valve WJ has flow rate=0; tunnels lead to valves RU, QP +Valve AW has flow rate=0; tunnels lead to valves HR, DW +Valve MJ has flow rate=0; tunnels lead to valves BP, AA +Valve DW has flow rate=4; tunnels lead to valves AU, CB, HY, GL, AW +Valve QM has flow rate=0; tunnels lead to valves KP, FQ +Valve LF has flow rate=5; tunnels lead to valves LS, QN, AU, BP, ZY +Valve QS has flow rate=0; tunnels lead to valves FF, RU +Valve BT has flow rate=0; tunnels lead to valves BN, RU +Valve VI has flow rate=22; tunnel leads to valve MO +Valve LS has flow rate=0; tunnels lead to valves LF, SA +Valve QD has flow rate=0; tunnels lead to valves HR, ZY +Valve HG has flow rate=0; tunnels lead to valves AS, ED +Valve BD has flow rate=0; tunnels lead to valves WT, TV +Valve CD has flow rate=0; tunnels lead to valves EE, MW +Valve QP has flow rate=0; tunnels lead to valves II, WJ +Valve MW has flow rate=7; tunnels lead to valves PQ, SA, CB, CD, RQ +Valve AU has flow rate=0; tunnels lead to valves DW, LF +Valve RR has flow rate=0; tunnels lead to valves AS, MA +Valve GA has flow rate=0; tunnels lead to valves FN, MA +Valve MT has flow rate=0; tunnels lead to valves CY, TV +Valve HR has flow rate=14; tunnels lead to valves KF, YB, QD, AW, FL +Valve AS has flow rate=16; tunnels lead to valves RR, RH, HG, IR +Valve CY has flow rate=0; tunnels lead to valves MT, II +Valve AA has flow rate=0; tunnels lead to valves OX, KF, GL, MJ, EE +Valve IU has flow rate=0; tunnels lead to valves XO, HY +Valve XO has flow rate=23; tunnels lead to valves IU, MO +Valve FR has flow rate=0; tunnels lead to valves KQ, PM +Valve CB has flow rate=0; tunnels lead to valves MW, DW +Valve ZY has flow rate=0; tunnels lead to valves QD, LF +Valve BP has flow rate=0; tunnels lead to valves LF, MJ +Valve QN has flow rate=0; tunnels lead to valves LF, FQ +Valve IR has flow rate=0; tunnels lead to valves AS, BL +Valve PQ has flow rate=0; tunnels lead to valves FL, MW +Valve GL has flow rate=0; tunnels lead to valves AA, DW +Valve OX has flow rate=0; tunnels lead to valves MA, AA +Valve MA has flow rate=10; tunnels lead to valves RR, YC, GA, OX, KP +Valve FQ has flow rate=12; tunnels lead to valves QN, WT, UG, RQ, QM From 22b823e283e1dcf6c6c772d6eb9ddc44fe792d79 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 16 Dec 2022 10:37:59 +0100 Subject: [PATCH 337/479] 2022: d16: ex1: add solution --- 2022/d16/ex1/ex1.py | 125 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100755 2022/d16/ex1/ex1.py diff --git a/2022/d16/ex1/ex1.py b/2022/d16/ex1/ex1.py new file mode 100755 index 0000000..00fd15d --- /dev/null +++ b/2022/d16/ex1/ex1.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python + +import dataclasses +import functools +import sys +from collections import defaultdict + + +@dataclasses.dataclass +class Valve: + flow: int + neighbours: set[str] + + +Graph = dict[str, Valve] +DistanceMatrix = dict[str, dict[str, int]] + +START_ROOM = "AA" + + +def solve(input: list[str]) -> int: + def to_graph(input: list[str]) -> Graph: + res = {} + + for line in input: + assert line.startswith("Valve ") # Sanity check + + name = line.split()[1] + flow = line.split("=")[1].split(";")[0] + neighbours = line.split(";")[1].replace(", ", " ").split()[4:] + + res[name] = Valve(int(flow), set(neighbours)) + + return res + + def useful_valves(g: Graph) -> set[str]: + return {k for k, v in g.items() if v.flow > 0} + + def floyd_warshall(g: Graph) -> DistanceMatrix: + points = list(g.keys()) + + res: DistanceMatrix = defaultdict(dict) + + for p in points: + for n in g[p].neighbours: + res[p][n] = 1 + + for p in points: + for i in points: + for j in points: + if (ip := res[i].get(p)) is None: + continue + if (pj := res[p].get(j)) is None: + continue + dist = ip + pj + if (ij := res[i].get(j)) is not None: + dist = min(dist, ij) + res[i][j] = dist + + return res + + def prune_distances(dist: DistanceMatrix, of_interest: set[str]) -> DistanceMatrix: + # Only keep non-zero valves for our visits + pruned = { + i: {j: dist for j, dist in line.items() if j in of_interest} + for i, line in dist.items() + if i in of_interest + } + # Explicitly add the starting room, in case it was pruned + pruned[START_ROOM] = { + n: dist for n, dist in dist[START_ROOM].items() if n in of_interest + } + return pruned + + def max_flow(g: Graph, dist: DistanceMatrix) -> int: + def pressure_per_minute(opened_valves: frozenset[str]) -> int: + return sum(g[valve].flow for valve in opened_valves) + + @functools.cache + def helper(start: str, time: int, opened_valves: frozenset[str]) -> int: + assert time >= 0 # Sanity check + if time == 0: + return 0 + + pressure = pressure_per_minute(opened_valves) + + # Base-case, don't do anything + best = pressure * time + + # Try to open the current valve if not done already + if start not in opened_valves: + best = max( + best, + helper(start, time - 1, opened_valves | {start}) + pressure, + ) + + # Try to go to each neighbour + for n, d in dist[start].items(): + if d >= time: + continue + best = max( + best, + helper(n, time - d, opened_valves) + pressure * d, + ) + + return best + + opened_valves = set() + # If starting room has no flow, consider it open to reduce search space + if g[START_ROOM].flow == 0: + opened_valves.add(START_ROOM) + return helper(START_ROOM, 30, frozenset(opened_valves)) + + graph = to_graph(input) + dist = prune_distances(floyd_warshall(graph), useful_valves(graph)) + return max_flow(graph, dist) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 7f36b288e34401ab4a87e54a378f473ea0c6a654 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 16 Dec 2022 10:38:04 +0100 Subject: [PATCH 338/479] 2022: d16: ex2: add input --- 2022/d16/ex2/input | 61 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 2022/d16/ex2/input diff --git a/2022/d16/ex2/input b/2022/d16/ex2/input new file mode 100644 index 0000000..d44b9fe --- /dev/null +++ b/2022/d16/ex2/input @@ -0,0 +1,61 @@ +Valve WT has flow rate=0; tunnels lead to valves BD, FQ +Valve UG has flow rate=0; tunnels lead to valves FQ, YB +Valve FN has flow rate=0; tunnels lead to valves TV, GA +Valve RU has flow rate=11; tunnels lead to valves YZ, QS, BL, BT, WJ +Valve RH has flow rate=0; tunnels lead to valves AS, II +Valve FL has flow rate=0; tunnels lead to valves HR, PQ +Valve KQ has flow rate=18; tunnels lead to valves FR, BN +Valve PM has flow rate=25; tunnels lead to valves YZ, FR +Valve RQ has flow rate=0; tunnels lead to valves FQ, MW +Valve BL has flow rate=0; tunnels lead to valves RU, IR +Valve FF has flow rate=0; tunnels lead to valves QS, ED +Valve KP has flow rate=0; tunnels lead to valves QM, MA +Valve YB has flow rate=0; tunnels lead to valves UG, HR +Valve TV has flow rate=17; tunnels lead to valves BD, MT, FN +Valve HY has flow rate=0; tunnels lead to valves DW, IU +Valve KF has flow rate=0; tunnels lead to valves AA, HR +Valve YC has flow rate=0; tunnels lead to valves II, MA +Valve EE has flow rate=0; tunnels lead to valves AA, CD +Valve ED has flow rate=9; tunnels lead to valves HG, FF +Valve SA has flow rate=0; tunnels lead to valves MW, LS +Valve II has flow rate=20; tunnels lead to valves YC, CY, QP, RH +Valve BN has flow rate=0; tunnels lead to valves BT, KQ +Valve MO has flow rate=0; tunnels lead to valves XO, VI +Valve YZ has flow rate=0; tunnels lead to valves RU, PM +Valve WJ has flow rate=0; tunnels lead to valves RU, QP +Valve AW has flow rate=0; tunnels lead to valves HR, DW +Valve MJ has flow rate=0; tunnels lead to valves BP, AA +Valve DW has flow rate=4; tunnels lead to valves AU, CB, HY, GL, AW +Valve QM has flow rate=0; tunnels lead to valves KP, FQ +Valve LF has flow rate=5; tunnels lead to valves LS, QN, AU, BP, ZY +Valve QS has flow rate=0; tunnels lead to valves FF, RU +Valve BT has flow rate=0; tunnels lead to valves BN, RU +Valve VI has flow rate=22; tunnel leads to valve MO +Valve LS has flow rate=0; tunnels lead to valves LF, SA +Valve QD has flow rate=0; tunnels lead to valves HR, ZY +Valve HG has flow rate=0; tunnels lead to valves AS, ED +Valve BD has flow rate=0; tunnels lead to valves WT, TV +Valve CD has flow rate=0; tunnels lead to valves EE, MW +Valve QP has flow rate=0; tunnels lead to valves II, WJ +Valve MW has flow rate=7; tunnels lead to valves PQ, SA, CB, CD, RQ +Valve AU has flow rate=0; tunnels lead to valves DW, LF +Valve RR has flow rate=0; tunnels lead to valves AS, MA +Valve GA has flow rate=0; tunnels lead to valves FN, MA +Valve MT has flow rate=0; tunnels lead to valves CY, TV +Valve HR has flow rate=14; tunnels lead to valves KF, YB, QD, AW, FL +Valve AS has flow rate=16; tunnels lead to valves RR, RH, HG, IR +Valve CY has flow rate=0; tunnels lead to valves MT, II +Valve AA has flow rate=0; tunnels lead to valves OX, KF, GL, MJ, EE +Valve IU has flow rate=0; tunnels lead to valves XO, HY +Valve XO has flow rate=23; tunnels lead to valves IU, MO +Valve FR has flow rate=0; tunnels lead to valves KQ, PM +Valve CB has flow rate=0; tunnels lead to valves MW, DW +Valve ZY has flow rate=0; tunnels lead to valves QD, LF +Valve BP has flow rate=0; tunnels lead to valves LF, MJ +Valve QN has flow rate=0; tunnels lead to valves LF, FQ +Valve IR has flow rate=0; tunnels lead to valves AS, BL +Valve PQ has flow rate=0; tunnels lead to valves FL, MW +Valve GL has flow rate=0; tunnels lead to valves AA, DW +Valve OX has flow rate=0; tunnels lead to valves MA, AA +Valve MA has flow rate=10; tunnels lead to valves RR, YC, GA, OX, KP +Valve FQ has flow rate=12; tunnels lead to valves QN, WT, UG, RQ, QM From 10d563b35752f5cd67eff9e2116f15d99cb8adea Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 16 Dec 2022 10:38:09 +0100 Subject: [PATCH 339/479] 2022: d16: ex2: add solution --- 2022/d16/ex2/ex2.py | 128 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100755 2022/d16/ex2/ex2.py diff --git a/2022/d16/ex2/ex2.py b/2022/d16/ex2/ex2.py new file mode 100755 index 0000000..b1912d2 --- /dev/null +++ b/2022/d16/ex2/ex2.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python + +import dataclasses +import functools +import sys +from collections import defaultdict + + +@dataclasses.dataclass +class Valve: + flow: int + neighbours: set[str] + + +Graph = dict[str, Valve] +DistanceMatrix = dict[str, dict[str, int]] + +START_ROOM = "AA" + + +def solve(input: list[str]) -> int: + def to_graph(input: list[str]) -> Graph: + res = {} + + for line in input: + assert line.startswith("Valve ") # Sanity check + + name = line.split()[1] + flow = line.split("=")[1].split(";")[0] + neighbours = line.split(";")[1].replace(", ", " ").split()[4:] + + res[name] = Valve(int(flow), set(neighbours)) + + return res + + def useful_valves(g: Graph) -> set[str]: + return {k for k, v in g.items() if v.flow > 0} + + def floyd_warshall(g: Graph) -> DistanceMatrix: + points = list(g.keys()) + + res: DistanceMatrix = defaultdict(dict) + + for p in points: + for n in g[p].neighbours: + res[p][n] = 1 + + for p in points: + for i in points: + for j in points: + if (ip := res[i].get(p)) is None: + continue + if (pj := res[p].get(j)) is None: + continue + dist = ip + pj + if (ij := res[i].get(j)) is not None: + dist = min(dist, ij) + res[i][j] = dist + + return res + + def prune_distances(dist: DistanceMatrix, of_interest: set[str]) -> DistanceMatrix: + # Only keep non-zero valves for our visits + pruned = { + i: {j: dist for j, dist in line.items() if j in of_interest} + for i, line in dist.items() + if i in of_interest + } + # Explicitly add the starting room, in case it was pruned + pruned[START_ROOM] = { + n: dist for n, dist in dist[START_ROOM].items() if n in of_interest + } + return pruned + + def max_flow(g: Graph, dist: DistanceMatrix) -> int: + def pressure_per_minute(opened_valves: frozenset[str]) -> int: + return sum(g[valve].flow for valve in opened_valves) + + @functools.cache + def helper( + start: str, time: int, opened_valves: frozenset[str] + ) -> tuple[int, frozenset[str]]: + assert time >= 0 # Sanity check + if time == 0: + return 0, opened_valves + + pressure = pressure_per_minute(opened_valves) + + # Base-case, don't do anything + best = pressure * time, opened_valves + + # Try to open the current valve if not done already + if start not in opened_valves: + score, valves = helper(start, time - 1, opened_valves | {start}) + score += pressure + best = max(best, (score, valves)) + + # Try to go to each neighbour + for n, d in dist[start].items(): + if d >= time: + continue + score, valves = helper(n, time - d, opened_valves) + score += pressure * d + best = max(best, (score, valves)) + + return best + + opened_valves = set() + # If starting room has no flow, consider it open to reduce search space + if g[START_ROOM].flow == 0: + opened_valves.add(START_ROOM) + score, valves = helper(START_ROOM, 26, frozenset(opened_valves)) + elephant_score, _ = helper(START_ROOM, 26, valves) + elephant_score -= pressure_per_minute(valves) * 26 # Don't double count + return score + elephant_score + + graph = to_graph(input) + dist = prune_distances(floyd_warshall(graph), useful_valves(graph)) + return max_flow(graph, dist) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From cc4910cca9a6ab9240ec3cc5288a18fe5d3add96 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 17 Dec 2022 12:52:18 +0100 Subject: [PATCH 340/479] 2022: d17: ex1: add input --- 2022/d17/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2022/d17/ex1/input diff --git a/2022/d17/ex1/input b/2022/d17/ex1/input new file mode 100644 index 0000000..61c138e --- /dev/null +++ b/2022/d17/ex1/input @@ -0,0 +1 @@ +>>><<<>><<<>>><<<>>><<<>><<><>>><<>>><>><<<>>><<><>>><<<<>>>><>><<>>>><>>>><<<<>>>><<<>>><>><<>><<<>><<<<><<>><<><<<>><<>>><<<>>>><>>><>><><<<<><>><><<>>>><<><<<<><<<><<>>>><<><<>><<<<>>>><>>>><>><><<<>>>><>>>><>><<>>>><>>>><<><<<<>><<>>>><>>><>><>><<>><<<<>>>><<<>><<<><><<<<>><<><<<<><<<><<<<>>>><<><<<>>><<>><>><<><<<<>>>><<<>>>><<<<>><<<<>><<>>>><<><>><>>>><<<<>>>><<>>><<<><<<<>>><>><<<>>><<<>>>><<<>>>><>>>><>>><<<<>>>><<<>>><<<<>>><><<>>><<<>>>><<<>>>><>>>><<<<>><<>>><<<<><>>>><><<<<>>><<<<>>>><<<>>>><<>>><>><<>><<>><<>>><<>>>><>>><<<><<<>><<<<>>><<<>>><<<><>>><<<<><>><<<>>>><><<<<><<>><<<<>><<<>>><>><<><><<<>><<<>>><<>>>><<>><><<>>>><<<<>>><<<>><<<<>><<><<<>>>><>>><>><<<>>>><<<>>><>><<<<><><<>><<<>><<<<>>>><<<<>>><<<<>><>>>><>>><>>><<>>><<<<>><<><<<<>>>><<<<>>>><<<><<>><><<<>>><>><<>><<<>>><>>><<<<>><>><><<><>><>>><>>>><<<>>><<<<>>>><<<>>>><<<>><<<<>>>><<<>>><><<>>><>>><<<>>><<<<><>>>><<<><>>>><>>><<>>><>><<<<>>><<>><<<<>><<>>>><<<><<><><<<>><<<<>>><<<><<<<>>>><<<<>>>><<<<>><<>>><<<><<<<><<<>>><><<<<><>><<><<<<>>><<>><>><<<><<<>>><<>><<<<><<<>><<<<>>><<>>><<<>>>><<<>><<<>>>><><<>><>>><<<>><><>><<>>><<<<>>><<>>>><>><<><<<>>>><<<>>><<>><<<<>>><<<<><<<<><<>>>><>><><<<>>>><<<<>><<<<>><>><<>><<<>><><<<<>>>><<<<>>>><<<>>>><>><<>><<<><<<<>><<<<><<<><<<>>><<<>><>>><<>><<><<>><<>><<><<<><<<<>>>><<<><>>>><<>><<>>><>>><<>>><><<>>><<<>>>><<<<>>>><><<<>>><<>>>><<<<><>>><>><<>><<<><><>>><<<>>>><>>><<><>>><<>>><<<>>><<<><<<>>><<<<><<<<>>>><<<>>>><<<<>>>><<<>>><<>><<>>><<<<>><><<<><<><<<>>>><<<<>>><>><<<<><<<>>>><<<<>>>><<<>><>>>><<<><<<<>>>><>>>><<>>>><<<><<<<><<>><>>>><<<>>>><<<<>>><>>>><<<><<>>><<>><<<>><>><<<>>><<>>>><<>>><<>>>><<><<>>>><<<<>>><<<<>>><<<>>><>><<><<<<>>>><<<>>><><<<<>>><<>>><<>><<<>><<<<><><<<<>>>><<<><<>>>><<<>>>><>><<<>>>><>>>><><<<<>><<<>>><>>><>>><<<>><<<<><>>><<>>><<<>>>><>>>><><<<<>>>><<>>><>>><<<<><<>>><<<><<<>>>><<<<><><<<<><<<<>><<<><>><<<<>>><>><<><<>>><<<>>><<<<>><<<>>><<<>>>><<<<>>><>><>><<<<>>>><>>><<<<>>><<>>><>><<<><>>>><<<<><<<>><><<<<>><<<<>>>><>><>><>>>><<<>>>><<>>>><<<>>><<<<>>>><<<<>>>><<><><<<>>><<>>><<<<>>>><<<<><<>>>><<<><<<<>>>><<>><<<>><<><>><<<<>>><<<<>>><<<<>>><<>>>><<<<>><<>>><<>>><>>>><<<>>>><<>>><<<<><<<>>><<<<><<><<>>><<>>>><<<<>>><<>>><<<<>>>><<<<>>><<<<><>><<<>>>><<<<>><<<>>><<<><<>>>><>>><<>>><>>>><<<><<<<><<<><<<>>>><<>>>><>>><>>>><<>>>><<<<>>>><>><<<<><<<>>>><><<>>>><<><<<>><<<<>>>><<<<><<<><<<<>>>><>><><<<<>><<<<>>><<>><<>>><>>><<<>>>><<<<>>><<<<>>><<>>>><<>><>><<<<>>>><<<>><<>><><><<>><<<<>>><<><<<<><><<<>>>><<<<>>><<<<>>>><<<>>><<<<><<<<>>><<><<><<>>><<<><<>><>>>><<<>><<>>><<<<>>>><>>>><<<>>>><<<<>><<><<<>>>><<<>>><>>>><<<<>>>><<<<><<>>><<<<>>>><<>>>><<<<><<<<>>><<>>><><<<<><<>>><>>>><<><<<>>>><>>><<<>><<<>><<<<>><>>>><<<>><<<<><>>>><<<>><<<<>>>><<<<>><<<<>><<>>><>>>><<>>><<<<><<>><>><<<<>>>><<<<>>>><<>><<<<><<<<><<>><><<>>>><<<<>>><<<<>><<<<>><<<<>><<<<>>><<<<>>><<<<><<<>>><><>>>><<>><>>><<>>><<<>>><<><>>>><<<<>>><<<>><<<<>>><<<>>><<>><<>><><<>><<>><<>>>><>>><<<>>>><<<<>>>><<<>><>>>><<<>>><<<><<>>>><<<>><<<<>><<<>>><<<<>><<><<<>>>><<>><>>>><<<<><>>>><<><<<<>><<>>><<>><<<<>>>><<>>><<>><<>>><>>>><<<>><<<><>><<<<>>><<<>>><<><<>>>><<<><>>>><>><<<>><><<<<>><<<<>>>><<<<>><><<<>>>><><<<<>>>><<>>><>>>><<>><>><<<><>><<<>>>><>><<<><<><><<<>>><<>><<<<>><<<>>><<>><<><>><<<<>>>><<<<>><<>>>><<<>><<><>>>><<<<>>>><>>><<>>><><<<<>><<>><>>>><<<<>>>><><<>>>><>>>><<<<>>>><<<<><>><><<<>>>><>>><<><><<<><<<<>>>><<<<>><<<>>>><<<<>>>><<<<>><<>>>><>><>>>><<<<><<>><<<><<<>>>><<<>>><<>>>><>><<<<>><<<>>>><<>>>><<<<>>>><<<<><<<>><>><><><<<><<<><<<><<<<>>><<>>><<>>><<<>><<<><<<<><<>>>><>><>><<<>>><<<<>>>><<<<>>><<<<>>><<<>>>><<>><<>><>><<>>><<>>>><<<<>>>><>>>><><><<<<><<<<>><<<><<<>>><<>>><<<>>>><<>>>><<>>><<<<>>>><<<><<<<>>><<<<><<>>>><<<<>>><>><><<>>><>>>><>>><<<>><<<<>><<<>>>><<>><<<>>>><<<><<<<>>><<<<><<<><<<>><<<>>>><<>>><>><<<<>>><<<>><>>>><<><><<<><><<<>>>><<<>><<><<<>>>><<<>>>><>>>><<<>>><<<>>><<<<>><<>><>><<>><>>><<><>><>>>><<<><<<><<<><<<<>><<>>>><>>>><>>><<<<><<<<>>>><<><<<>>><<<>>>><<<>>><<>>>><<>><><<<>><<<<>>>><<<<><<>><>><<<>><><<>><<<<>>><>>>><<<>><<<>><<<>>><<><<<><>><><><<>><<<>>><<<><<<><>>>><>>>><>>><<<<>>>><><<<<>>><<>><<<<>><<>>><>>>><<>>><>>>><<<>>>><<<>>>><<<<>>><<<<>><<<>>><<<>><<<>>><<<<>>><<>>>><<>>>><<<<>>>><<<<>><<<>>><<<<>>><>>>><<<<><<<<>><<<<>>>><>>><<<>><<>>>><<><<>><<<>>><<<<><<<<>>>><<<<><<<>>>><<<<>>><><<<<><<<<>><><<<>>>><>><<<<>><><>><<<>>>><><<>>>><><<<>>>><>>><<<<>>>><<<<>>><<<<>><<>>>><>>>><>>><<<><<>>>><<<<><<<<>><><>><<<>><<><<<<>>><<<<>>>><<<>><>><<>>><<<>>><<<<>>><<<><>>><<<>>><<<>><<<>>>><<<>><<>>>><<<<>>><<<<>><<<><>><<<>><><<<>><<<<><><>><<<><>><><<<>>><>>>><>>>><<<>><<<>>>><<<>>><<<<>>><<<>>>><<>>>><>><<><<<>><<>>>><>>>><<>><<<<><<<>><<>><<<><<>>>><<<<><<<>>>><<><<>>>><<><>>><><<>>><<<><<><<<<>>><<>>><>>>><><>>><<<<>><<>><<>>>><<<<>>><<<>>><<><<<><<<<>>><<>>><>><>>>><<><<<>>><<<<>>>><<>><<<<>><>>><<<>>><<>>>><<<>><<><<<>>><><<>>><<><<>>><>>>><<<<>>>><<<<>>>><<<>>>><<<<>>>><><<<<>>><>>><<<<>>><<>><<<>>>><>>>><><<<>><<>><<<>>><<<<>>><<<>>>><><<<<>>>><<><<>>><<<<>>>><<>>><<<<><>>><<<>>><<><<><<<>><>>>><<<>>>><<<>><<<>><<>>><<>>>><<<><>>>><<<<>>><<<<>><<>><<<>>><<<<>><<<<>>>><<>><<>><<<<>>>><>>>><<<>><>>><><>>><>>>><<<>>>><<>><<<>><<>><>>>><<<>>>><<<<><>>><<><<><>>>><<>>>><>>><<<<>>>><>>>><<<><<<><>>><<<>>><>>><<<>><<<<>>><>>>><<><<<<><<<>>>><<<<><<<<>><<>>><<<<><<<<>>><<>>><<<>>>><<>>>><<<>>>><<>><<>>><<<>>><<>>><>>><<>><<>><<<<><<>>>><<<>>>><<<>><<<<>>>><<>>>><>>>><>><>>>><><<<>>>><<<>>><><<<<>>><<<>><<<>><<<<>><<<>>>><<<<>>>><>>>><>><<<><><>>><>>>><<<<>>>><<<>>>><<>><>>>><<<<><<<>>>><>><<<>><<<<>>>><>>><<<<>>><<<<>><<<>>><<<<>>>><<>>><<>><<<>>><>><<>>>><<<<>>><<<<>>><<<<><<<<>>>><<<<><<<<>><>>><><<<>>><<<<>><<<<>>>><<<>>><>>><>>><<<>>><>>>><>><<>><<<<><<><>>>><<<<>>>><<<<>>>><<<>>>><><<<<>>>><<>>><<<>>>><<>>>><<<>>>><<<>><<<>><<>><<>>>><>>><>>>><<<<>>><<<>><<>>>><>>>><<<><<><<<>><<<<>>>><<<><<<<>><<><<<>><<<<><>><<<<><<>>>><>>>><<><<<<>><<>><<<>>>><<>>>><<<<>>><<><<<>>>><<<<>>>><<<>>><>>>><<>>><<<<>>><<<<>>><<<<>>>><<>>>><<>>>><<<<>>>><<>>>><<>>><>><<<<>>><>>>><>><<>>><<<<>><<<>><<><<>>>><<<>><<>><>><<<>>>><<><<><<><<><<>>>><<<>><<>>>><>>><<<<><<><>>><<<><<<<>>>><<<>>><<<<>><>>>><>><<<>>><<<>>><<>><<<><<<<>>>><<<><<><<<>>><<<<>><>>><>>><<<<>>><><<<<>><<>>>><>><<>>><<><<>>><<<<>>>><>><<<><<<>>>><<<>>>><<<>><<<>>>><<><<<<><<<<>><<>>>><>>><>>><<<<>><>><>><<<>>><<>><><>>><<<<><<<<>>>><>>><<<><<><>>><<<<>>>><><>><<<><<<>>><>>><<>><<>>>><><>><>><<<>><<>>>><<<>><<<<>>>><<<>><<>>><<<<>>>><<<<><<<>><<<><>>>><<<<>>>><<<>><<<><<<>><>>>><>>><<><>><<>>>><<<<><><<>>><<<<>>><<<<>>><<>>><<>><<<<>>>><<<<>>>><><><<>><>>>><<>>><<<<>>>><<>><<<>><<<<>>><<>>><><<>><<>><<<>>>><>><<><<<<>><<<>><<<>>>><>><<<<>><><>>>><<<<>><<<>>><<<<>><<<>><><>>>><<>><>>>><<<<>>>><<<<>>><<<<><<<<><<>>><<<<>>><<<<>>><<<<>>>><>><<><<>><<>>>><<<<>>><<<<>><<<>><>>><<<<><<>>><<<>>>><<><<<>>>><<><>><<><><<<><<<<>>><>>><<>>>><<<<><<>><>>>><<>>>><<<<>>>><<<<>>><><<<<>>>><<>><<>><<<>>>><<>>><>>><>>>><<<<>>><<>>><><>>><<><>>>><<<<>>><<<>><<>><>>>><<><<<>>><<<>>>><<<>>>><<>>>><<<<>>>><<<<><<>>><<>>>><<>>>><<><<<>><<<<><<<<>><<>>>><<><<<<>>><<<><<<<>>><<<>>>><<>>><>><<>>><>>><<>><>>><>>>><<>><<<><<>>>><>>>><<<><>>>><<<<>>>><<<<><><>>><<<>>>><><>>>><<<>><>>><<<>>>><<><<><<<<>>>><>>><<<>><<<><>><<<><><<<>>>><<>><<><<<>>>><<<>>><<<>>>><<<>>>><<<><<>><<<>><><<<>>>><<<<>>><<>><>>>><>><<>>>><<<><<>><<<><<<>>>><<<<><<<<><><<<>>>><><<<<><<<>>>><<<<>><<>><><<<>>><>><<<<>><<<>>>><>>>><<<>>><<<<><<<>>><<>>>><<<<>><<<<>>><><<><<<<><<>><>>><>><>><<<<>>>><><<>>><<<<>>>><<<<>>>><<<>><><<<<>><>>>><<>>><<<<>>><<<>>>><<>>>><<<<><<<<>>><<<>>><<>>>><<<>>>><<<>>>><<<<><<<<>>><<>>>><>>><>><<>><<<>><<<>><>><<>><<><<<<>>>><<<>><<>><<<<>>><<<><><>><<<><<>><<<<>><<>>>><<><<<<>><<<<>>><<<<>>>><<<<>><<<<>><<<>>><>>>><<<>>><<<<>>>><><<<>>><<>>>><<<><<<>><<>>><>>><<>>><>>><<>>><<<><<<>>>><<>><<>><<>>><<>><<<>>>><<<>>>><<<>>><<<><><>>>><<<<><<<>>><<<><>><<<<>>>><<<>><<<<>>><<<>><><<<>><<<<>>><<<><<<>>>><><<<<>>><<<>><<<>><<<<>>><<<<>>><<<<>>>><<>>>><<<<>>><>><<<><<<><>><<<>>><<<>><<<<>><<<<><<><>>>><<><<<>>><<<<>>>><<>><>>>><<<<>>>><<><<<<>><<<<>>><<<>>>><>>>><>><<>><<<><><<<<>>>><><>>><<<>>><<<<>>><<<<>>>><<><<<>>><<>>>><<<><>><><<<<>>>><<<<>>>><<<>>><<<>>>><<>>>><<<>>>><<<>>><>><<<<>><><>><<<<>>>><>>>><<<>><<>>>><<><<<<>>><>>><<<>>>><<<<><<><>>><<<<><<<<>>><<>><><<<<>>>><<<>><>>>><>>>><<>><<<>>>><<<<>>><<<>>>><<<>>>><<>>><<<>>><<<<>><<<<>><>>><<>>><<>>>><<<<>>>><>>><>><<><>>><<<><<>>>><><<<>>><<<><<>>>><<<>>><><<<<>>><<><>>><<>>><>>>><><>><<>>><<>>>><<>>>><<<<>>><>><><<<<>>>><<<<>>><><<>><<<<>><<>><<<>>><<<<>>><<<>>><<<<>><><<<><<<>>>><>>>><<<<>><<<>>><<<><<><<<><>><><<<>>>><<<<>>><<<<>>><<<<><<<>>>><<<<>>>><<<>>><>><><<>><<<>><<><<<<>><<><<<>>><<>>><<>>>><<>>>><><>>>><<<>>>><<<<><<>><<<<>>>><<<>><<<<>><><>>><<<<>>>><<>>><<<>><<<>>><<>>>><<<><<<<>><<>><<<>><<>>>><<>><<<<>>><>>><>><>>>><<<>>><<>>><<<>><<>>><<<<><<<><<>>><<<<>>><>><><<<<><>><>>><>><<><<<<><<>>><>><>><<>>><<>>><>>><<<<>>><<<<>>><<><>><<<<>>><<<<><<>><<<><><>>><>>><<<<>>><<<><<<>><<><>>>><<>><<>><<<<><<<<>><<>>>><>><<><<<>>>><<<>>>><<><<<<>>>><<<>><<<>>>><<<><>>>><<<>><<>><<<>><<<<>>>><<<>>><<<>><<<>>>><<<>>><<>>><<<<>>>><>>>><<>>>><><<<<>><<><<><<>><>>><<>>>><<>>><<<<><<><>><<<<><>><<<<><<<<>><<>>><<<<><>>>><>><<<>>>><<<<>>>><<>><<<<>>><<>>>><<>>><<<<>><<<><<<<>><<<>>><<<>>>><<<>><>><<>>>><<><<><>><>>><>><<<>>><<>>><<<><<<<>>>><<<<>>><<<<>>><<>>><<<<>>>><<><><><>><<>>><<<>>><<<<><>>><>><>><<<<><<<<>><<<<>>><>>>><<<>>><<<>>>><<<>>>><<<<>>>><>>><<<<>>>><><<<><<>>><<<<>>><<>><<>><<<<>>>><<>><><<<<>><<<>>><<<>>><<<<>><<<>>>><<<<>>>><>>><>>>><<>>><<><<><<<>>><<<><<<><>>>><<<<><<>>><<<>><<<<><<<>>><><<<<>>>><<>>>><>>><>><>>>><<<<><<<><<<><<><<>>>><<>>><>>>><<<><<>>><<<>><<><<<><<<><<<>><>>><<<>><>>><<>><>><<<<>>>><<<<>>>><><<<<><<><<<<>>>><>>><<<>>>><>>>><<<>>><<<>>>><<<>>><<<>>>><>>><<<>><>>><<>>>><><<<>><<<><>>>><<<>>>><<<<><<<>>>><>>><<<>><<>><<<<>><<<><<>>><<<>>>><>>>><<<<>>><<<>><>>>><><<<<><<>>>><>>>><<<><<>>>><<<<>>><>>><>>>><><<>>>><<><><><<>><<>>><<<><<>>>><<><<>><<>>>><<<>>>><<><<><<>>><<<>><<<>>>><><<<>>>><<<<><>>>><<<>>><<>><>>>><<<<><<>>><<><>>< From 4b7ee749a0a4a11a4c6af2f3d91f6dbe27e1bca2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 17 Dec 2022 12:52:24 +0100 Subject: [PATCH 341/479] 2022: d17: ex1: add solution --- 2022/d17/ex1/ex1.py | 127 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100755 2022/d17/ex1/ex1.py diff --git a/2022/d17/ex1/ex1.py b/2022/d17/ex1/ex1.py new file mode 100755 index 0000000..01d1864 --- /dev/null +++ b/2022/d17/ex1/ex1.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python + +import enum +import itertools +import sys +from collections.abc import Iterator +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + def __add__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x + other.x, self.y + other.y) + + def __sub__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x - other.x, self.y - other.y) + + +def translate(points: set[Point], delta: Point) -> set[Point]: + return {p + delta for p in points} + + +class Rock(str, enum.Enum): + LINE = "####" + PLUS = ".#.\n###\n.#." + CORNER = "..#\n..#\n###" + VERTICAL_LINE = "#\n#\n#\n#" + SQUARE = "##\n##" + + @classmethod + def stream(cls) -> Iterator["Rock"]: + yield from itertools.cycle(iter(cls)) + + def to_points(self) -> set[Point]: + res: set[Point] = set() + + for y, line in enumerate(reversed(self.splitlines())): + for x, c in enumerate(line): + if c == ".": + continue + res.add(Point(x, y)) + + return res + + +class JetStream(str, enum.Enum): + LEFT = "<" + RIGHT = ">" + + @classmethod + def stream(cls, jet_pattern: str) -> Iterator["JetStream"]: + yield from itertools.cycle(map(cls, jet_pattern)) + + def as_delta(self) -> Point: + if self == self.LEFT: + return Point(-1, 0) + if self == self.RIGHT: + return Point(1, 0) + assert False # Sanity check + + +def solve(input: list[str]) -> int: + assert len(input) == 1 # Sanity check + + rocks = Rock.stream() + jet_stream = JetStream.stream(input[0]) + + fallen_stack: set[Point] = set() + max_height = 0 + + LEFT_WALL = -1 + RIGHT_WALL = 7 + FLOOR = 0 + + def step(rock: set[Point]) -> tuple[set[Point], bool]: + jet = next(jet_stream) + + # Check if it can be pushed by the jet, or if it hits an obstacle + pushed_rock = translate(rock, jet.as_delta()) + if not (fallen_stack & pushed_rock) and all( + LEFT_WALL < p.x < RIGHT_WALL for p in pushed_rock + ): + rock = pushed_rock + + # Check if it can go down + fallen_rock = translate(rock, Point(0, -1)) + + if not (fallen_stack & fallen_rock) and all(p.y > FLOOR for p in fallen_rock): + return fallen_rock, True + return rock, False + + def simulate_rock_fall() -> None: + nonlocal max_height + + rock = next(rocks).to_points() + + # Align 2 units away from LEFT_WALL and 3 higher than + # current stack + rock = translate(rock, Point(2, max_height + 3 + 1)) + + while True: + rock, keep_going = step(rock) + if not keep_going: + break + + fallen_stack.update(rock) + max_height = max(max_height, max(p.y for p in rock)) + + for _ in range(2022): + simulate_rock_fall() + + return max_height + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From d2fd3abe247a0f1d21ce0de2f5e83e11be7f6efb Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 17 Dec 2022 12:52:29 +0100 Subject: [PATCH 342/479] 2022: d17: ex2: add input --- 2022/d17/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2022/d17/ex2/input diff --git a/2022/d17/ex2/input b/2022/d17/ex2/input new file mode 100644 index 0000000..61c138e --- /dev/null +++ b/2022/d17/ex2/input @@ -0,0 +1 @@ +>>><<<>><<<>>><<<>>><<<>><<><>>><<>>><>><<<>>><<><>>><<<<>>>><>><<>>>><>>>><<<<>>>><<<>>><>><<>><<<>><<<<><<>><<><<<>><<>>><<<>>>><>>><>><><<<<><>><><<>>>><<><<<<><<<><<>>>><<><<>><<<<>>>><>>>><>><><<<>>>><>>>><>><<>>>><>>>><<><<<<>><<>>>><>>><>><>><<>><<<<>>>><<<>><<<><><<<<>><<><<<<><<<><<<<>>>><<><<<>>><<>><>><<><<<<>>>><<<>>>><<<<>><<<<>><<>>>><<><>><>>>><<<<>>>><<>>><<<><<<<>>><>><<<>>><<<>>>><<<>>>><>>>><>>><<<<>>>><<<>>><<<<>>><><<>>><<<>>>><<<>>>><>>>><<<<>><<>>><<<<><>>>><><<<<>>><<<<>>>><<<>>>><<>>><>><<>><<>><<>>><<>>>><>>><<<><<<>><<<<>>><<<>>><<<><>>><<<<><>><<<>>>><><<<<><<>><<<<>><<<>>><>><<><><<<>><<<>>><<>>>><<>><><<>>>><<<<>>><<<>><<<<>><<><<<>>>><>>><>><<<>>>><<<>>><>><<<<><><<>><<<>><<<<>>>><<<<>>><<<<>><>>>><>>><>>><<>>><<<<>><<><<<<>>>><<<<>>>><<<><<>><><<<>>><>><<>><<<>>><>>><<<<>><>><><<><>><>>><>>>><<<>>><<<<>>>><<<>>>><<<>><<<<>>>><<<>>><><<>>><>>><<<>>><<<<><>>>><<<><>>>><>>><<>>><>><<<<>>><<>><<<<>><<>>>><<<><<><><<<>><<<<>>><<<><<<<>>>><<<<>>>><<<<>><<>>><<<><<<<><<<>>><><<<<><>><<><<<<>>><<>><>><<<><<<>>><<>><<<<><<<>><<<<>>><<>>><<<>>>><<<>><<<>>>><><<>><>>><<<>><><>><<>>><<<<>>><<>>>><>><<><<<>>>><<<>>><<>><<<<>>><<<<><<<<><<>>>><>><><<<>>>><<<<>><<<<>><>><<>><<<>><><<<<>>>><<<<>>>><<<>>>><>><<>><<<><<<<>><<<<><<<><<<>>><<<>><>>><<>><<><<>><<>><<><<<><<<<>>>><<<><>>>><<>><<>>><>>><<>>><><<>>><<<>>>><<<<>>>><><<<>>><<>>>><<<<><>>><>><<>><<<><><>>><<<>>>><>>><<><>>><<>>><<<>>><<<><<<>>><<<<><<<<>>>><<<>>>><<<<>>>><<<>>><<>><<>>><<<<>><><<<><<><<<>>>><<<<>>><>><<<<><<<>>>><<<<>>>><<<>><>>>><<<><<<<>>>><>>>><<>>>><<<><<<<><<>><>>>><<<>>>><<<<>>><>>>><<<><<>>><<>><<<>><>><<<>>><<>>>><<>>><<>>>><<><<>>>><<<<>>><<<<>>><<<>>><>><<><<<<>>>><<<>>><><<<<>>><<>>><<>><<<>><<<<><><<<<>>>><<<><<>>>><<<>>>><>><<<>>>><>>>><><<<<>><<<>>><>>><>>><<<>><<<<><>>><<>>><<<>>>><>>>><><<<<>>>><<>>><>>><<<<><<>>><<<><<<>>>><<<<><><<<<><<<<>><<<><>><<<<>>><>><<><<>>><<<>>><<<<>><<<>>><<<>>>><<<<>>><>><>><<<<>>>><>>><<<<>>><<>>><>><<<><>>>><<<<><<<>><><<<<>><<<<>>>><>><>><>>>><<<>>>><<>>>><<<>>><<<<>>>><<<<>>>><<><><<<>>><<>>><<<<>>>><<<<><<>>>><<<><<<<>>>><<>><<<>><<><>><<<<>>><<<<>>><<<<>>><<>>>><<<<>><<>>><<>>><>>>><<<>>>><<>>><<<<><<<>>><<<<><<><<>>><<>>>><<<<>>><<>>><<<<>>>><<<<>>><<<<><>><<<>>>><<<<>><<<>>><<<><<>>>><>>><<>>><>>>><<<><<<<><<<><<<>>>><<>>>><>>><>>>><<>>>><<<<>>>><>><<<<><<<>>>><><<>>>><<><<<>><<<<>>>><<<<><<<><<<<>>>><>><><<<<>><<<<>>><<>><<>>><>>><<<>>>><<<<>>><<<<>>><<>>>><<>><>><<<<>>>><<<>><<>><><><<>><<<<>>><<><<<<><><<<>>>><<<<>>><<<<>>>><<<>>><<<<><<<<>>><<><<><<>>><<<><<>><>>>><<<>><<>>><<<<>>>><>>>><<<>>>><<<<>><<><<<>>>><<<>>><>>>><<<<>>>><<<<><<>>><<<<>>>><<>>>><<<<><<<<>>><<>>><><<<<><<>>><>>>><<><<<>>>><>>><<<>><<<>><<<<>><>>>><<<>><<<<><>>>><<<>><<<<>>>><<<<>><<<<>><<>>><>>>><<>>><<<<><<>><>><<<<>>>><<<<>>>><<>><<<<><<<<><<>><><<>>>><<<<>>><<<<>><<<<>><<<<>><<<<>>><<<<>>><<<<><<<>>><><>>>><<>><>>><<>>><<<>>><<><>>>><<<<>>><<<>><<<<>>><<<>>><<>><<>><><<>><<>><<>>>><>>><<<>>>><<<<>>>><<<>><>>>><<<>>><<<><<>>>><<<>><<<<>><<<>>><<<<>><<><<<>>>><<>><>>>><<<<><>>>><<><<<<>><<>>><<>><<<<>>>><<>>><<>><<>>><>>>><<<>><<<><>><<<<>>><<<>>><<><<>>>><<<><>>>><>><<<>><><<<<>><<<<>>>><<<<>><><<<>>>><><<<<>>>><<>>><>>>><<>><>><<<><>><<<>>>><>><<<><<><><<<>>><<>><<<<>><<<>>><<>><<><>><<<<>>>><<<<>><<>>>><<<>><<><>>>><<<<>>>><>>><<>>><><<<<>><<>><>>>><<<<>>>><><<>>>><>>>><<<<>>>><<<<><>><><<<>>>><>>><<><><<<><<<<>>>><<<<>><<<>>>><<<<>>>><<<<>><<>>>><>><>>>><<<<><<>><<<><<<>>>><<<>>><<>>>><>><<<<>><<<>>>><<>>>><<<<>>>><<<<><<<>><>><><><<<><<<><<<><<<<>>><<>>><<>>><<<>><<<><<<<><<>>>><>><>><<<>>><<<<>>>><<<<>>><<<<>>><<<>>>><<>><<>><>><<>>><<>>>><<<<>>>><>>>><><><<<<><<<<>><<<><<<>>><<>>><<<>>>><<>>>><<>>><<<<>>>><<<><<<<>>><<<<><<>>>><<<<>>><>><><<>>><>>>><>>><<<>><<<<>><<<>>>><<>><<<>>>><<<><<<<>>><<<<><<<><<<>><<<>>>><<>>><>><<<<>>><<<>><>>>><<><><<<><><<<>>>><<<>><<><<<>>>><<<>>>><>>>><<<>>><<<>>><<<<>><<>><>><<>><>>><<><>><>>>><<<><<<><<<><<<<>><<>>>><>>>><>>><<<<><<<<>>>><<><<<>>><<<>>>><<<>>><<>>>><<>><><<<>><<<<>>>><<<<><<>><>><<<>><><<>><<<<>>><>>>><<<>><<<>><<<>>><<><<<><>><><><<>><<<>>><<<><<<><>>>><>>>><>>><<<<>>>><><<<<>>><<>><<<<>><<>>><>>>><<>>><>>>><<<>>>><<<>>>><<<<>>><<<<>><<<>>><<<>><<<>>><<<<>>><<>>>><<>>>><<<<>>>><<<<>><<<>>><<<<>>><>>>><<<<><<<<>><<<<>>>><>>><<<>><<>>>><<><<>><<<>>><<<<><<<<>>>><<<<><<<>>>><<<<>>><><<<<><<<<>><><<<>>>><>><<<<>><><>><<<>>>><><<>>>><><<<>>>><>>><<<<>>>><<<<>>><<<<>><<>>>><>>>><>>><<<><<>>>><<<<><<<<>><><>><<<>><<><<<<>>><<<<>>>><<<>><>><<>>><<<>>><<<<>>><<<><>>><<<>>><<<>><<<>>>><<<>><<>>>><<<<>>><<<<>><<<><>><<<>><><<<>><<<<><><>><<<><>><><<<>>><>>>><>>>><<<>><<<>>>><<<>>><<<<>>><<<>>>><<>>>><>><<><<<>><<>>>><>>>><<>><<<<><<<>><<>><<<><<>>>><<<<><<<>>>><<><<>>>><<><>>><><<>>><<<><<><<<<>>><<>>><>>>><><>>><<<<>><<>><<>>>><<<<>>><<<>>><<><<<><<<<>>><<>>><>><>>>><<><<<>>><<<<>>>><<>><<<<>><>>><<<>>><<>>>><<<>><<><<<>>><><<>>><<><<>>><>>>><<<<>>>><<<<>>>><<<>>>><<<<>>>><><<<<>>><>>><<<<>>><<>><<<>>>><>>>><><<<>><<>><<<>>><<<<>>><<<>>>><><<<<>>>><<><<>>><<<<>>>><<>>><<<<><>>><<<>>><<><<><<<>><>>>><<<>>>><<<>><<<>><<>>><<>>>><<<><>>>><<<<>>><<<<>><<>><<<>>><<<<>><<<<>>>><<>><<>><<<<>>>><>>>><<<>><>>><><>>><>>>><<<>>>><<>><<<>><<>><>>>><<<>>>><<<<><>>><<><<><>>>><<>>>><>>><<<<>>>><>>>><<<><<<><>>><<<>>><>>><<<>><<<<>>><>>>><<><<<<><<<>>>><<<<><<<<>><<>>><<<<><<<<>>><<>>><<<>>>><<>>>><<<>>>><<>><<>>><<<>>><<>>><>>><<>><<>><<<<><<>>>><<<>>>><<<>><<<<>>>><<>>>><>>>><>><>>>><><<<>>>><<<>>><><<<<>>><<<>><<<>><<<<>><<<>>>><<<<>>>><>>>><>><<<><><>>><>>>><<<<>>>><<<>>>><<>><>>>><<<<><<<>>>><>><<<>><<<<>>>><>>><<<<>>><<<<>><<<>>><<<<>>>><<>>><<>><<<>>><>><<>>>><<<<>>><<<<>>><<<<><<<<>>>><<<<><<<<>><>>><><<<>>><<<<>><<<<>>>><<<>>><>>><>>><<<>>><>>>><>><<>><<<<><<><>>>><<<<>>>><<<<>>>><<<>>>><><<<<>>>><<>>><<<>>>><<>>>><<<>>>><<<>><<<>><<>><<>>>><>>><>>>><<<<>>><<<>><<>>>><>>>><<<><<><<<>><<<<>>>><<<><<<<>><<><<<>><<<<><>><<<<><<>>>><>>>><<><<<<>><<>><<<>>>><<>>>><<<<>>><<><<<>>>><<<<>>>><<<>>><>>>><<>>><<<<>>><<<<>>><<<<>>>><<>>>><<>>>><<<<>>>><<>>>><<>>><>><<<<>>><>>>><>><<>>><<<<>><<<>><<><<>>>><<<>><<>><>><<<>>>><<><<><<><<><<>>>><<<>><<>>>><>>><<<<><<><>>><<<><<<<>>>><<<>>><<<<>><>>>><>><<<>>><<<>>><<>><<<><<<<>>>><<<><<><<<>>><<<<>><>>><>>><<<<>>><><<<<>><<>>>><>><<>>><<><<>>><<<<>>>><>><<<><<<>>>><<<>>>><<<>><<<>>>><<><<<<><<<<>><<>>>><>>><>>><<<<>><>><>><<<>>><<>><><>>><<<<><<<<>>>><>>><<<><<><>>><<<<>>>><><>><<<><<<>>><>>><<>><<>>>><><>><>><<<>><<>>>><<<>><<<<>>>><<<>><<>>><<<<>>>><<<<><<<>><<<><>>>><<<<>>>><<<>><<<><<<>><>>>><>>><<><>><<>>>><<<<><><<>>><<<<>>><<<<>>><<>>><<>><<<<>>>><<<<>>>><><><<>><>>>><<>>><<<<>>>><<>><<<>><<<<>>><<>>><><<>><<>><<<>>>><>><<><<<<>><<<>><<<>>>><>><<<<>><><>>>><<<<>><<<>>><<<<>><<<>><><>>>><<>><>>>><<<<>>>><<<<>>><<<<><<<<><<>>><<<<>>><<<<>>><<<<>>>><>><<><<>><<>>>><<<<>>><<<<>><<<>><>>><<<<><<>>><<<>>>><<><<<>>>><<><>><<><><<<><<<<>>><>>><<>>>><<<<><<>><>>>><<>>>><<<<>>>><<<<>>><><<<<>>>><<>><<>><<<>>>><<>>><>>><>>>><<<<>>><<>>><><>>><<><>>>><<<<>>><<<>><<>><>>>><<><<<>>><<<>>>><<<>>>><<>>>><<<<>>>><<<<><<>>><<>>>><<>>>><<><<<>><<<<><<<<>><<>>>><<><<<<>>><<<><<<<>>><<<>>>><<>>><>><<>>><>>><<>><>>><>>>><<>><<<><<>>>><>>>><<<><>>>><<<<>>>><<<<><><>>><<<>>>><><>>>><<<>><>>><<<>>>><<><<><<<<>>>><>>><<<>><<<><>><<<><><<<>>>><<>><<><<<>>>><<<>>><<<>>>><<<>>>><<<><<>><<<>><><<<>>>><<<<>>><<>><>>>><>><<>>>><<<><<>><<<><<<>>>><<<<><<<<><><<<>>>><><<<<><<<>>>><<<<>><<>><><<<>>><>><<<<>><<<>>>><>>>><<<>>><<<<><<<>>><<>>>><<<<>><<<<>>><><<><<<<><<>><>>><>><>><<<<>>>><><<>>><<<<>>>><<<<>>>><<<>><><<<<>><>>>><<>>><<<<>>><<<>>>><<>>>><<<<><<<<>>><<<>>><<>>>><<<>>>><<<>>>><<<<><<<<>>><<>>>><>>><>><<>><<<>><<<>><>><<>><<><<<<>>>><<<>><<>><<<<>>><<<><><>><<<><<>><<<<>><<>>>><<><<<<>><<<<>>><<<<>>>><<<<>><<<<>><<<>>><>>>><<<>>><<<<>>>><><<<>>><<>>>><<<><<<>><<>>><>>><<>>><>>><<>>><<<><<<>>>><<>><<>><<>>><<>><<<>>>><<<>>>><<<>>><<<><><>>>><<<<><<<>>><<<><>><<<<>>>><<<>><<<<>>><<<>><><<<>><<<<>>><<<><<<>>>><><<<<>>><<<>><<<>><<<<>>><<<<>>><<<<>>>><<>>>><<<<>>><>><<<><<<><>><<<>>><<<>><<<<>><<<<><<><>>>><<><<<>>><<<<>>>><<>><>>>><<<<>>>><<><<<<>><<<<>>><<<>>>><>>>><>><<>><<<><><<<<>>>><><>>><<<>>><<<<>>><<<<>>>><<><<<>>><<>>>><<<><>><><<<<>>>><<<<>>>><<<>>><<<>>>><<>>>><<<>>>><<<>>><>><<<<>><><>><<<<>>>><>>>><<<>><<>>>><<><<<<>>><>>><<<>>>><<<<><<><>>><<<<><<<<>>><<>><><<<<>>>><<<>><>>>><>>>><<>><<<>>>><<<<>>><<<>>>><<<>>>><<>>><<<>>><<<<>><<<<>><>>><<>>><<>>>><<<<>>>><>>><>><<><>>><<<><<>>>><><<<>>><<<><<>>>><<<>>><><<<<>>><<><>>><<>>><>>>><><>><<>>><<>>>><<>>>><<<<>>><>><><<<<>>>><<<<>>><><<>><<<<>><<>><<<>>><<<<>>><<<>>><<<<>><><<<><<<>>>><>>>><<<<>><<<>>><<<><<><<<><>><><<<>>>><<<<>>><<<<>>><<<<><<<>>>><<<<>>>><<<>>><>><><<>><<<>><<><<<<>><<><<<>>><<>>><<>>>><<>>>><><>>>><<<>>>><<<<><<>><<<<>>>><<<>><<<<>><><>>><<<<>>>><<>>><<<>><<<>>><<>>>><<<><<<<>><<>><<<>><<>>>><<>><<<<>>><>>><>><>>>><<<>>><<>>><<<>><<>>><<<<><<<><<>>><<<<>>><>><><<<<><>><>>><>><<><<<<><<>>><>><>><<>>><<>>><>>><<<<>>><<<<>>><<><>><<<<>>><<<<><<>><<<><><>>><>>><<<<>>><<<><<<>><<><>>>><<>><<>><<<<><<<<>><<>>>><>><<><<<>>>><<<>>>><<><<<<>>>><<<>><<<>>>><<<><>>>><<<>><<>><<<>><<<<>>>><<<>>><<<>><<<>>>><<<>>><<>>><<<<>>>><>>>><<>>>><><<<<>><<><<><<>><>>><<>>>><<>>><<<<><<><>><<<<><>><<<<><<<<>><<>>><<<<><>>>><>><<<>>>><<<<>>>><<>><<<<>>><<>>>><<>>><<<<>><<<><<<<>><<<>>><<<>>>><<<>><>><<>>>><<><<><>><>>><>><<<>>><<>>><<<><<<<>>>><<<<>>><<<<>>><<>>><<<<>>>><<><><><>><<>>><<<>>><<<<><>>><>><>><<<<><<<<>><<<<>>><>>>><<<>>><<<>>>><<<>>>><<<<>>>><>>><<<<>>>><><<<><<>>><<<<>>><<>><<>><<<<>>>><<>><><<<<>><<<>>><<<>>><<<<>><<<>>>><<<<>>>><>>><>>>><<>>><<><<><<<>>><<<><<<><>>>><<<<><<>>><<<>><<<<><<<>>><><<<<>>>><<>>>><>>><>><>>>><<<<><<<><<<><<><<>>>><<>>><>>>><<<><<>>><<<>><<><<<><<<><<<>><>>><<<>><>>><<>><>><<<<>>>><<<<>>>><><<<<><<><<<<>>>><>>><<<>>>><>>>><<<>>><<<>>>><<<>>><<<>>>><>>><<<>><>>><<>>>><><<<>><<<><>>>><<<>>>><<<<><<<>>>><>>><<<>><<>><<<<>><<<><<>>><<<>>>><>>>><<<<>>><<<>><>>>><><<<<><<>>>><>>>><<<><<>>>><<<<>>><>>><>>>><><<>>>><<><><><<>><<>>><<<><<>>>><<><<>><<>>>><<<>>>><<><<><<>>><<<>><<<>>>><><<<>>>><<<<><>>>><<<>>><<>><>>>><<<<><<>>><<><>>< From d2aad80116b17b98e95f7e0143c56fcf6d4352ec Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 17 Dec 2022 12:52:34 +0100 Subject: [PATCH 343/479] 2022: d17: ex2: add solution --- 2022/d17/ex2/ex2.py | 157 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100755 2022/d17/ex2/ex2.py diff --git a/2022/d17/ex2/ex2.py b/2022/d17/ex2/ex2.py new file mode 100755 index 0000000..e906f69 --- /dev/null +++ b/2022/d17/ex2/ex2.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python + +import enum +import itertools +import sys +from collections.abc import Iterator +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + def __add__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x + other.x, self.y + other.y) + + def __sub__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x - other.x, self.y - other.y) + + +def translate(points: set[Point], delta: Point) -> set[Point]: + return {p + delta for p in points} + + +class Rock(str, enum.Enum): + LINE = "####" + PLUS = ".#.\n###\n.#." + CORNER = "..#\n..#\n###" + VERTICAL_LINE = "#\n#\n#\n#" + SQUARE = "##\n##" + + @classmethod + def stream(cls) -> Iterator["Rock"]: + yield from itertools.cycle(iter(cls)) + + def to_points(self) -> set[Point]: + res: set[Point] = set() + + for y, line in enumerate(reversed(self.splitlines())): + for x, c in enumerate(line): + if c == ".": + continue + res.add(Point(x, y)) + + return res + + +class JetStream(str, enum.Enum): + LEFT = "<" + RIGHT = ">" + + @classmethod + def stream(cls, jet_pattern: str) -> Iterator["JetStream"]: + yield from itertools.cycle(map(cls, jet_pattern)) + + def as_delta(self) -> Point: + if self == self.LEFT: + return Point(-1, 0) + if self == self.RIGHT: + return Point(1, 0) + assert False # Sanity check + + +def solve(input: list[str]) -> int: + fallen_stack: set[Point] = set() + max_height = 0 + + LEFT_WALL = -1 + RIGHT_WALL = 7 + FLOOR = 0 + + rocks = list(iter(Rock)) + jet_stream = [JetStream(c) for c in input[0]] + + t = 0 + jet_index = 0 + rock_index = 0 + + def step(rock: set[Point], jet: JetStream) -> tuple[set[Point], bool]: + # Check if it can be pushed by the jet, or if it hits an obstacle + pushed_rock = translate(rock, jet.as_delta()) + if not (fallen_stack & pushed_rock) and all( + LEFT_WALL < p.x < RIGHT_WALL for p in pushed_rock + ): + rock = pushed_rock + + # Check if it can go down + fallen_rock = translate(rock, Point(0, -1)) + + if not (fallen_stack & fallen_rock) and all(p.y > FLOOR for p in fallen_rock): + return fallen_rock, True + return rock, False + + def simulate_rock_fall() -> None: + nonlocal max_height + nonlocal jet_index + nonlocal rock_index + + rock = rocks[rock_index].to_points() + + # Align 2 units away from LEFT_WALL and 3 higher than + # current stack + rock = translate(rock, Point(2, max_height + 3 + 1)) + + while True: + rock, keep_going = step(rock, jet_stream[jet_index]) + jet_index = (jet_index + 1) % len(jet_stream) + if not keep_going: + break + + fallen_stack.update(rock) + max_height = max(max_height, max(p.y for p in rock)) + rock_index = (rock_index + 1) % len(rocks) + + StackStateHash = tuple[int, int, frozenset[Point]] + + def stack_state_hash() -> StackStateHash: + top = frozenset( + Point(p.x, p.y - max_height) + for p in fallen_stack + if p.y >= (max_height - 50) # Cut-off point chosen arbitrarily... + ) + return rock_index, jet_index, top + + assert len(input) == 1 # Sanity check + + cache: dict[StackStateHash, tuple[int, int]] = {} + added_height = 0 + + END_OF_SIMULATION = 1_000_000_000_000 + while t < END_OF_SIMULATION: + simulate_rock_fall() + t += 1 + stack_hash = stack_state_hash() + if stack_hash in cache: + previous_t, previous_height = cache[stack_hash] + cycle_length = t - previous_t + num_cycles = (END_OF_SIMULATION - t) // cycle_length + added_height += num_cycles * (max_height - previous_height) + t += num_cycles * cycle_length + else: + cache[stack_hash] = t, max_height + + return max_height + added_height + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From ca6a3885b094ce7dea074026edf6d4adcfbce02b Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 18 Dec 2022 12:44:35 +0100 Subject: [PATCH 344/479] 2022: d18: ex1: add input --- 2022/d18/ex1/input | 2145 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2145 insertions(+) create mode 100644 2022/d18/ex1/input diff --git a/2022/d18/ex1/input b/2022/d18/ex1/input new file mode 100644 index 0000000..ad808d2 --- /dev/null +++ b/2022/d18/ex1/input @@ -0,0 +1,2145 @@ +5,7,4 +11,12,17 +18,8,10 +8,11,17 +14,8,17 +9,2,8 +12,13,16 +4,7,5 +5,15,5 +5,15,13 +11,13,3 +18,11,6 +13,6,18 +2,6,11 +7,5,15 +12,17,12 +7,3,9 +15,6,6 +7,1,10 +12,15,5 +11,16,4 +9,18,12 +5,2,9 +10,1,8 +2,11,6 +10,7,3 +10,3,14 +3,12,5 +15,5,6 +5,3,11 +4,9,4 +1,11,10 +17,9,12 +17,13,12 +5,10,15 +2,10,6 +7,1,6 +13,17,11 +7,4,4 +12,4,12 +13,10,16 +4,14,6 +11,15,5 +13,4,5 +9,18,13 +14,4,8 +14,15,6 +11,16,8 +4,13,7 +3,7,6 +9,18,10 +6,6,16 +8,3,5 +16,15,7 +14,6,17 +3,10,8 +8,2,12 +17,12,12 +10,8,1 +8,4,5 +12,3,6 +7,17,4 +7,4,5 +13,8,3 +8,8,2 +10,5,2 +15,10,3 +5,6,15 +13,14,4 +1,11,12 +8,7,18 +4,11,17 +2,13,8 +3,6,13 +9,16,5 +6,16,11 +4,9,16 +10,18,11 +2,14,11 +15,16,5 +11,7,17 +2,10,14 +16,5,9 +12,2,5 +6,4,14 +8,9,17 +13,18,10 +14,16,6 +7,6,15 +2,11,13 +18,7,7 +4,9,3 +3,10,10 +3,12,13 +17,9,9 +11,15,15 +2,7,12 +4,5,12 +14,10,4 +8,8,3 +16,11,13 +15,6,4 +14,8,3 +10,18,7 +14,7,6 +14,12,17 +13,15,3 +3,11,14 +8,13,2 +5,7,15 +2,7,9 +16,9,15 +2,12,9 +3,13,4 +8,2,10 +9,15,4 +17,10,12 +11,5,15 +4,3,7 +6,12,3 +8,16,6 +18,11,9 +3,15,10 +9,6,2 +5,16,6 +11,12,2 +10,3,6 +8,16,13 +9,5,4 +8,2,7 +11,16,13 +7,4,9 +14,15,4 +10,14,3 +9,4,15 +5,10,3 +4,4,6 +15,16,11 +6,10,16 +14,13,11 +8,10,1 +5,10,4 +4,11,3 +17,10,13 +3,6,12 +11,11,3 +14,8,4 +14,16,10 +13,10,4 +7,7,3 +10,1,9 +16,14,11 +14,13,4 +16,7,13 +4,7,3 +3,12,12 +8,18,11 +10,6,1 +10,6,2 +6,6,6 +11,16,10 +10,15,16 +5,12,5 +5,15,6 +6,3,12 +6,12,17 +9,6,17 +10,8,2 +16,7,8 +14,16,11 +14,4,13 +6,17,10 +3,7,8 +10,4,3 +9,2,10 +17,10,14 +7,11,2 +12,16,6 +7,16,9 +5,9,15 +12,3,5 +14,14,14 +14,15,7 +14,13,6 +12,7,18 +14,13,5 +8,7,3 +16,7,11 +16,6,14 +7,7,16 +13,5,12 +12,7,3 +10,16,14 +7,18,12 +5,12,17 +6,10,2 +12,16,4 +11,12,18 +8,17,8 +14,11,17 +15,3,8 +10,6,17 +3,5,12 +7,6,16 +1,10,11 +13,16,14 +5,4,8 +13,14,15 +13,5,6 +7,2,13 +15,12,11 +2,14,8 +14,13,14 +15,16,8 +12,4,16 +8,14,4 +9,3,15 +13,16,9 +12,9,16 +3,13,14 +11,2,14 +10,17,11 +12,2,10 +2,10,15 +18,12,9 +7,3,8 +11,3,14 +8,4,6 +12,4,3 +11,2,12 +16,4,8 +6,11,2 +4,10,12 +9,8,2 +4,16,7 +8,17,12 +11,5,17 +13,6,3 +2,6,9 +4,10,15 +15,14,5 +11,2,5 +14,12,14 +9,2,12 +15,15,8 +14,10,15 +11,18,13 +14,9,16 +16,5,10 +2,12,11 +16,8,8 +7,5,4 +8,7,16 +10,14,16 +5,14,13 +6,14,6 +14,9,17 +4,12,6 +4,6,16 +5,11,3 +9,12,17 +13,11,16 +15,8,4 +4,8,3 +17,11,9 +17,10,11 +9,10,18 +6,14,4 +18,11,7 +5,5,5 +2,5,11 +4,10,10 +12,16,12 +3,4,7 +15,12,14 +16,8,11 +3,5,11 +16,6,6 +8,16,8 +8,16,12 +6,13,16 +17,11,7 +10,3,7 +6,3,13 +8,4,15 +17,13,8 +17,9,10 +15,12,15 +14,5,6 +13,11,1 +14,16,12 +5,17,11 +14,9,4 +12,2,9 +1,10,12 +12,7,16 +16,8,7 +4,13,4 +3,15,13 +7,12,17 +3,14,10 +16,10,15 +1,10,8 +4,7,14 +10,2,6 +5,8,16 +12,17,11 +9,13,16 +9,16,14 +13,12,15 +9,11,2 +8,17,6 +17,12,10 +8,14,3 +12,14,4 +5,12,4 +16,13,7 +11,8,2 +10,5,4 +11,10,17 +14,15,10 +8,9,3 +10,16,6 +3,9,5 +4,10,3 +15,14,4 +10,16,4 +7,3,6 +14,3,11 +2,8,12 +9,17,7 +8,14,15 +5,4,6 +7,3,12 +9,8,1 +13,7,15 +5,11,16 +10,10,17 +16,8,15 +13,13,15 +14,4,7 +6,11,17 +9,15,17 +8,5,15 +10,9,17 +4,7,12 +10,1,13 +4,3,9 +8,4,3 +8,5,13 +14,12,12 +10,13,15 +17,8,8 +2,11,8 +12,14,14 +3,12,11 +11,18,11 +3,10,12 +11,3,11 +5,11,2 +12,9,18 +10,2,12 +14,15,12 +2,11,11 +16,13,8 +11,12,16 +3,3,11 +4,15,14 +9,10,17 +4,4,10 +6,2,11 +5,15,14 +13,10,15 +3,4,10 +12,17,9 +17,8,9 +6,4,7 +2,12,5 +5,14,5 +6,7,16 +12,1,11 +16,4,11 +8,3,9 +13,13,5 +4,13,3 +8,17,11 +11,2,10 +2,8,10 +14,5,13 +15,9,13 +16,10,12 +6,16,7 +17,6,13 +4,5,7 +12,10,2 +6,8,16 +17,5,11 +6,15,11 +5,11,17 +18,11,11 +8,8,0 +15,7,4 +4,14,5 +11,16,11 +9,4,16 +11,1,13 +6,13,4 +8,5,3 +4,11,5 +10,15,4 +9,1,10 +11,5,3 +6,9,17 +6,11,3 +14,14,3 +9,14,16 +8,10,2 +13,3,13 +7,12,14 +4,4,13 +6,3,10 +14,6,3 +16,8,13 +2,9,9 +13,15,5 +15,16,10 +11,4,5 +15,9,16 +12,12,2 +10,3,9 +15,11,6 +4,7,11 +6,2,8 +9,14,5 +7,8,3 +4,3,10 +14,4,14 +2,10,10 +4,4,14 +16,7,15 +7,13,4 +11,11,18 +15,4,6 +13,4,4 +10,14,4 +7,17,10 +15,13,5 +16,12,6 +5,9,17 +16,14,10 +11,4,14 +6,14,15 +6,6,5 +10,2,11 +7,8,16 +7,14,16 +2,9,14 +4,5,13 +13,13,16 +9,7,16 +10,16,12 +7,14,4 +13,9,1 +2,8,13 +9,8,16 +11,17,10 +7,8,17 +3,14,12 +4,7,6 +10,18,13 +9,14,3 +3,11,10 +6,6,2 +17,6,8 +4,14,11 +13,5,15 +15,14,14 +13,4,15 +9,3,12 +15,4,10 +6,16,6 +15,15,11 +8,2,9 +4,11,16 +18,10,11 +15,5,5 +2,9,12 +6,16,12 +7,16,14 +12,14,3 +6,4,15 +10,17,10 +15,6,5 +10,16,15 +16,6,11 +4,5,8 +16,12,15 +8,16,14 +5,8,3 +16,12,7 +11,7,18 +11,7,3 +13,4,8 +3,8,9 +15,6,15 +10,12,17 +3,13,12 +14,13,3 +10,18,10 +12,16,7 +16,7,6 +9,4,4 +14,12,4 +17,13,9 +10,17,7 +5,5,15 +4,12,14 +5,4,13 +14,16,13 +2,6,6 +3,4,13 +9,13,2 +14,2,7 +4,5,11 +7,3,5 +17,9,13 +6,5,2 +7,16,13 +3,10,13 +11,2,9 +11,16,5 +14,5,10 +2,10,7 +15,6,11 +4,12,13 +5,11,15 +7,9,18 +9,8,18 +7,9,17 +12,17,13 +17,11,8 +12,1,9 +10,9,2 +15,9,6 +4,7,10 +14,12,3 +11,11,2 +8,17,7 +13,2,7 +8,5,16 +3,6,7 +15,8,15 +15,15,6 +5,3,13 +4,8,4 +11,16,6 +16,15,12 +7,16,6 +17,9,6 +12,6,3 +5,6,7 +13,14,16 +13,3,14 +15,9,3 +8,15,16 +7,10,3 +4,9,13 +16,9,7 +17,8,12 +9,17,10 +12,9,2 +8,15,5 +16,9,10 +16,5,11 +13,10,3 +8,1,11 +15,4,12 +13,16,6 +4,14,8 +4,6,13 +6,12,4 +11,3,13 +9,14,15 +13,5,13 +3,8,13 +1,8,7 +4,7,4 +14,9,2 +3,10,15 +5,12,16 +2,7,11 +5,9,3 +7,17,7 +11,16,14 +13,8,2 +13,2,8 +4,7,7 +12,17,10 +7,2,8 +5,15,11 +16,11,12 +16,15,9 +17,10,7 +16,6,4 +3,8,15 +6,4,8 +4,6,14 +7,17,6 +15,7,7 +12,15,15 +16,5,15 +9,17,6 +13,15,14 +5,17,10 +7,15,12 +12,7,2 +7,3,14 +12,14,16 +4,10,2 +3,7,11 +16,4,9 +9,18,11 +4,13,5 +8,12,13 +13,10,1 +7,1,11 +12,16,10 +9,8,17 +5,16,10 +13,13,3 +4,7,13 +15,14,15 +7,16,8 +9,10,16 +15,7,5 +17,6,10 +16,6,15 +8,9,18 +14,17,11 +15,14,10 +9,8,3 +8,16,5 +16,9,13 +11,15,16 +2,7,14 +5,16,8 +17,5,10 +15,10,4 +16,12,12 +14,17,12 +7,2,9 +11,17,7 +6,8,3 +14,15,15 +14,15,9 +15,14,8 +14,4,5 +5,4,12 +15,3,12 +6,16,10 +7,8,18 +14,14,4 +11,18,10 +16,6,8 +4,14,9 +9,1,8 +7,15,14 +2,13,10 +11,4,4 +3,15,11 +8,8,1 +14,10,16 +15,7,13 +11,2,6 +18,6,7 +11,9,16 +12,8,15 +11,15,3 +6,6,4 +3,5,8 +3,13,13 +16,12,8 +12,5,3 +6,15,15 +13,9,15 +9,18,9 +11,17,4 +13,6,14 +10,10,18 +8,15,15 +6,5,4 +6,15,6 +4,14,12 +11,9,17 +14,6,7 +1,9,7 +6,8,2 +8,2,11 +1,11,11 +14,16,8 +16,5,8 +9,6,4 +5,16,9 +11,1,9 +13,5,11 +14,17,10 +18,9,12 +5,3,7 +11,5,16 +9,2,7 +13,4,10 +10,2,7 +13,7,16 +8,3,13 +11,4,6 +15,9,4 +6,8,1 +2,12,10 +7,14,5 +6,4,12 +12,5,14 +9,2,11 +11,17,9 +15,7,15 +5,9,4 +1,12,10 +18,8,11 +4,8,14 +13,10,2 +5,8,17 +10,16,9 +14,7,14 +14,2,12 +5,3,14 +17,12,9 +11,17,11 +15,12,13 +3,7,13 +10,10,3 +15,13,9 +10,3,11 +14,11,3 +16,6,10 +13,4,13 +15,13,12 +9,17,5 +8,12,3 +11,9,1 +5,3,8 +9,16,12 +9,11,17 +7,9,15 +3,8,12 +4,12,5 +16,9,14 +12,2,8 +3,12,9 +5,6,13 +5,15,9 +11,6,15 +12,15,4 +3,11,9 +12,8,1 +14,8,14 +15,10,14 +8,4,4 +3,14,8 +11,8,17 +12,8,3 +6,3,6 +8,6,2 +17,13,6 +14,4,6 +8,1,10 +12,4,9 +15,15,12 +11,6,13 +12,4,4 +5,14,12 +7,6,3 +7,13,5 +2,9,11 +10,4,6 +16,7,7 +9,15,3 +14,14,15 +13,2,10 +8,8,17 +11,15,4 +11,3,10 +16,9,6 +9,15,16 +3,16,11 +13,10,14 +3,9,4 +10,16,5 +13,2,11 +17,9,8 +16,8,5 +2,12,12 +13,15,9 +10,3,10 +17,8,5 +6,8,17 +2,12,13 +12,2,6 +2,9,6 +5,5,4 +10,5,15 +6,3,7 +8,13,15 +2,9,13 +12,17,6 +14,10,2 +14,17,9 +12,13,3 +12,11,16 +12,2,7 +9,10,2 +15,10,5 +12,16,14 +6,17,11 +13,4,9 +4,15,6 +15,11,3 +12,15,6 +4,14,13 +10,17,15 +13,16,12 +8,9,1 +3,6,6 +5,5,13 +9,6,16 +16,12,5 +13,16,13 +9,9,17 +5,4,9 +9,17,8 +2,11,9 +4,14,10 +9,3,6 +7,17,9 +15,14,6 +13,5,3 +8,15,14 +17,12,4 +11,17,12 +14,5,5 +16,10,4 +4,5,5 +6,8,5 +2,13,7 +8,10,18 +15,6,10 +1,8,9 +17,7,5 +9,5,17 +12,14,13 +9,2,9 +11,7,2 +10,11,17 +1,9,10 +15,15,13 +11,13,16 +4,3,11 +8,3,15 +7,10,2 +7,7,4 +10,8,17 +17,11,12 +2,11,5 +8,15,7 +1,11,8 +18,12,8 +12,15,13 +4,5,10 +6,4,16 +7,9,2 +17,10,9 +9,15,14 +9,14,2 +14,3,13 +17,9,7 +14,15,13 +12,13,17 +11,3,4 +11,3,7 +8,17,9 +13,10,18 +12,12,15 +9,4,13 +15,5,7 +1,5,8 +8,17,14 +9,7,3 +16,11,9 +16,6,12 +2,9,8 +9,16,13 +11,6,3 +5,7,14 +5,9,5 +3,4,8 +11,4,3 +13,15,8 +7,4,15 +16,9,4 +4,2,9 +16,9,5 +3,12,15 +4,15,8 +16,11,5 +10,7,2 +11,15,6 +10,12,3 +8,7,14 +5,6,3 +12,5,4 +6,17,8 +3,16,10 +9,1,7 +15,10,15 +6,3,5 +2,7,10 +6,12,16 +7,15,13 +16,6,7 +4,4,9 +6,9,16 +12,5,16 +10,10,2 +3,11,5 +11,2,11 +9,3,4 +6,15,4 +3,9,14 +7,5,16 +7,15,5 +6,17,12 +14,11,14 +10,1,10 +5,12,15 +6,6,14 +11,16,7 +16,8,14 +12,15,14 +17,13,7 +5,15,12 +14,7,4 +1,12,9 +12,6,16 +8,11,2 +4,6,11 +17,14,8 +8,6,3 +12,4,15 +16,12,11 +11,12,3 +16,12,13 +11,17,13 +11,1,10 +4,12,7 +11,2,8 +14,5,11 +13,17,7 +11,9,3 +7,6,2 +12,4,5 +8,4,7 +11,1,11 +18,10,6 +12,7,17 +7,16,10 +5,8,4 +3,10,6 +8,12,16 +7,11,3 +3,10,5 +14,14,6 +12,19,10 +10,5,16 +13,2,12 +13,16,7 +7,14,7 +16,7,9 +10,3,4 +17,6,6 +16,10,8 +6,3,8 +12,13,4 +10,14,15 +1,9,11 +4,12,15 +17,7,7 +5,12,8 +6,11,1 +9,4,14 +17,12,7 +9,11,1 +14,15,5 +11,13,17 +12,9,17 +3,7,14 +17,8,11 +7,2,6 +10,18,8 +7,4,8 +7,3,13 +6,5,3 +14,7,3 +15,5,10 +1,10,9 +3,4,9 +18,10,10 +8,12,2 +7,12,16 +18,9,11 +7,2,11 +4,5,14 +2,9,10 +9,3,5 +2,14,6 +2,8,6 +15,4,9 +4,14,16 +11,4,7 +4,4,15 +13,11,2 +12,3,14 +17,6,7 +14,3,7 +6,5,6 +15,11,15 +5,5,14 +2,13,9 +13,14,14 +15,5,9 +8,13,18 +10,13,2 +8,16,16 +13,12,3 +6,17,9 +11,14,16 +15,4,7 +5,10,2 +5,4,11 +5,3,9 +18,7,8 +9,7,17 +4,3,8 +10,16,11 +18,7,9 +9,17,9 +10,2,13 +17,5,8 +12,4,11 +12,15,16 +8,7,17 +17,6,12 +12,3,8 +9,5,3 +12,16,13 +10,17,5 +4,16,10 +7,4,13 +12,4,14 +4,11,2 +11,3,15 +5,9,2 +9,12,2 +14,7,5 +2,12,7 +17,5,9 +5,3,10 +3,11,7 +9,14,17 +12,9,3 +6,2,6 +4,5,9 +11,3,6 +4,17,10 +10,17,14 +13,3,10 +5,15,7 +18,13,9 +2,10,9 +3,12,14 +3,13,8 +16,5,7 +4,13,10 +11,8,1 +5,12,3 +3,13,9 +11,14,3 +10,15,15 +9,11,18 +12,6,17 +13,8,17 +8,14,2 +6,7,5 +6,17,7 +5,10,16 +14,16,9 +13,16,11 +18,9,8 +14,11,16 +8,15,4 +8,2,13 +3,9,11 +6,14,14 +15,3,11 +14,4,9 +10,11,2 +13,9,17 +9,13,3 +6,8,4 +15,5,4 +17,11,11 +2,10,13 +12,10,16 +17,10,10 +17,8,14 +12,11,2 +4,14,14 +15,10,16 +6,7,15 +12,14,15 +8,14,17 +6,13,17 +7,11,17 +7,18,10 +6,10,17 +17,9,15 +5,13,3 +3,7,9 +9,5,16 +7,14,6 +17,11,13 +8,2,8 +5,6,4 +13,1,10 +1,12,7 +5,14,15 +16,9,11 +10,15,14 +18,10,7 +14,16,7 +9,5,14 +16,15,11 +7,14,15 +10,3,13 +13,13,4 +14,3,10 +12,14,2 +13,6,6 +13,16,5 +16,10,3 +4,12,8 +14,17,7 +1,9,8 +12,8,17 +17,15,10 +8,18,7 +10,5,6 +13,4,6 +13,11,3 +10,5,17 +17,8,7 +7,2,12 +4,10,17 +1,9,9 +5,7,6 +4,5,6 +14,5,3 +12,3,9 +10,18,12 +11,1,12 +8,3,7 +7,10,17 +7,3,15 +12,18,12 +9,4,7 +5,2,11 +8,16,11 +13,5,4 +11,13,15 +14,6,8 +16,6,9 +7,15,8 +9,16,8 +4,9,15 +7,7,17 +5,5,3 +10,16,10 +8,11,18 +16,4,12 +9,11,4 +13,5,8 +9,17,12 +13,6,2 +16,11,14 +7,12,3 +11,4,15 +7,3,4 +8,4,11 +15,6,13 +13,12,16 +9,9,1 +6,5,17 +5,4,5 +7,14,2 +10,12,2 +11,6,5 +13,13,2 +6,7,2 +7,13,15 +11,2,13 +6,2,10 +10,15,3 +7,4,16 +13,4,12 +13,6,17 +16,10,11 +15,12,4 +5,14,9 +5,15,10 +16,14,7 +7,12,15 +10,6,15 +3,9,15 +9,17,11 +4,11,14 +17,7,11 +5,8,15 +9,7,2 +9,6,14 +6,4,6 +9,16,10 +15,11,5 +8,14,6 +7,14,14 +10,17,6 +14,5,15 +2,14,7 +14,9,3 +14,3,6 +4,3,12 +4,13,15 +8,12,17 +12,6,1 +5,12,7 +7,17,12 +17,6,11 +13,9,18 +15,8,5 +3,9,13 +6,13,2 +7,17,11 +7,18,8 +14,10,12 +9,13,17 +8,4,13 +6,9,4 +4,6,6 +10,2,10 +11,10,2 +6,9,3 +16,5,5 +11,19,10 +4,7,15 +2,12,8 +3,12,6 +15,6,12 +14,14,5 +15,13,13 +13,4,7 +16,5,12 +2,10,8 +14,8,15 +15,9,5 +13,16,8 +12,16,5 +7,13,17 +10,17,12 +15,5,14 +13,12,2 +2,13,5 +15,14,12 +6,6,15 +16,7,12 +5,16,12 +13,11,15 +13,3,12 +14,15,11 +3,4,11 +12,1,8 +13,9,4 +13,4,16 +13,11,4 +6,3,14 +4,11,15 +12,5,15 +3,7,7 +9,2,15 +11,15,17 +15,3,10 +18,7,12 +4,15,10 +15,16,7 +6,11,15 +10,7,17 +9,18,7 +7,16,7 +15,13,6 +14,11,4 +14,5,9 +12,17,8 +17,12,11 +5,11,4 +14,6,13 +16,14,12 +17,12,8 +11,14,15 +4,11,6 +13,16,10 +10,6,3 +10,16,13 +2,6,10 +14,8,5 +6,15,7 +17,7,14 +8,13,3 +12,12,18 +2,8,8 +5,5,11 +6,5,5 +12,3,7 +5,12,2 +10,14,17 +2,5,9 +14,12,16 +4,11,4 +8,16,15 +7,6,17 +4,6,15 +12,6,15 +5,12,6 +10,12,16 +10,4,15 +5,13,5 +13,3,7 +3,12,7 +11,9,2 +13,2,13 +14,5,12 +12,13,14 +16,7,14 +17,6,9 +12,3,11 +9,4,3 +1,7,12 +3,6,14 +13,15,11 +13,2,9 +13,3,5 +15,11,12 +15,5,8 +5,13,15 +3,14,9 +18,12,6 +15,15,10 +14,5,7 +9,13,15 +17,10,6 +6,10,15 +10,2,5 +4,15,11 +11,17,8 +12,12,17 +13,6,12 +5,10,17 +16,7,10 +14,6,4 +13,17,12 +11,8,18 +18,6,11 +8,13,16 +3,5,6 +10,17,13 +9,10,3 +4,13,12 +5,16,13 +7,4,6 +7,9,3 +13,4,14 +9,10,1 +14,17,8 +8,3,14 +15,3,5 +3,10,7 +12,12,1 +13,6,16 +16,9,12 +7,17,13 +9,9,2 +13,15,6 +12,12,3 +11,13,14 +15,9,15 +3,7,4 +5,14,6 +9,5,2 +13,18,9 +16,11,6 +3,6,9 +9,5,15 +1,10,6 +2,13,12 +5,13,4 +12,2,11 +12,15,12 +9,3,16 +5,7,16 +3,9,6 +4,8,12 +11,9,18 +16,15,10 +15,4,14 +13,10,17 +6,7,3 +8,16,9 +1,10,10 +4,13,14 +6,10,18 +10,5,3 +8,16,7 +7,16,15 +4,15,7 +18,9,9 +4,8,15 +9,15,15 +2,11,7 +3,7,5 +7,17,8 +11,13,5 +8,18,8 +12,7,15 +4,3,14 +13,7,3 +13,17,13 +16,6,13 +8,16,10 +12,3,4 +14,13,7 +16,8,3 +8,6,4 +5,14,14 +12,18,11 +7,3,7 +4,15,12 +5,14,7 +14,14,10 +3,11,11 +7,15,4 +2,8,11 +3,12,8 +12,10,3 +16,14,13 +15,13,7 +7,8,6 +14,2,9 +15,16,9 +13,12,6 +6,14,11 +6,13,5 +9,3,14 +9,7,1 +15,8,16 +16,13,11 +16,6,16 +13,15,4 +12,6,12 +14,3,8 +15,13,11 +16,10,9 +7,7,15 +4,3,5 +4,16,8 +12,6,4 +14,14,7 +15,13,4 +14,5,16 +13,6,4 +1,13,11 +14,13,15 +6,15,9 +15,12,17 +10,4,16 +6,10,3 +3,14,11 +17,11,6 +13,7,4 +16,14,9 +6,2,9 +4,13,13 +3,9,7 +11,16,9 +7,1,7 +11,5,4 +11,4,16 +6,6,17 +6,12,2 +9,15,5 +7,15,11 +8,14,5 +3,5,14 +14,13,16 +15,11,2 +9,2,13 +9,11,3 +17,12,6 +6,15,13 +6,12,15 +3,4,12 +14,11,6 +12,18,9 +4,9,7 +6,2,13 +7,10,1 +8,15,8 +2,11,12 +16,10,5 +15,6,3 +10,13,1 +3,8,11 +3,8,7 +7,2,10 +6,9,15 +15,16,6 +10,16,7 +7,5,3 +2,7,8 +12,1,12 +13,3,9 +13,12,17 +10,3,12 +4,14,7 +1,9,12 +8,5,2 +5,4,7 +5,2,7 +6,16,8 +12,5,7 +5,5,6 +11,3,5 +8,6,17 +12,2,12 +8,17,13 +16,11,7 +4,10,14 +11,5,5 +6,16,13 +10,4,5 +15,11,9 +8,6,16 +11,18,12 +9,2,3 +6,5,14 +17,12,13 +11,11,17 +12,16,15 +15,7,14 +10,9,16 +10,13,3 +12,3,13 +6,14,13 +15,4,8 +6,13,15 +13,15,12 +3,5,7 +8,11,15 +13,17,10 +8,4,8 +1,9,6 +14,7,16 +9,9,16 +17,7,13 +10,11,3 +4,6,5 +8,1,13 +12,11,17 +4,10,16 +4,9,2 +4,2,10 +4,8,6 +15,5,11 +15,14,7 +7,3,11 +4,5,15 +11,2,7 +11,5,14 +9,6,18 +6,6,13 +8,7,1 +4,12,4 +6,4,4 +16,13,10 +3,14,6 +18,10,12 +11,16,3 +7,4,14 +11,8,4 +8,11,3 +10,9,19 +16,15,8 +5,14,3 +11,4,2 +17,8,10 +15,6,14 +12,1,10 +10,13,14 +13,15,13 +12,15,7 +12,4,13 +3,5,13 +11,15,11 +1,12,8 +15,5,13 +5,5,12 +6,13,3 +12,18,10 +8,17,10 +12,9,15 +15,13,10 +12,11,3 +10,3,3 +13,16,3 +3,8,6 +15,15,14 +8,13,4 +10,13,4 +10,8,3 +5,5,10 +8,1,8 +11,3,9 +8,4,16 +8,3,10 +14,2,11 +5,13,14 +2,11,10 +10,6,5 +11,11,4 +9,2,6 +9,9,18 +7,15,15 +16,8,4 +15,11,14 +14,12,6 +16,14,6 +11,18,8 +17,10,15 +7,12,2 +3,7,12 +13,3,8 +9,17,14 +17,13,11 +2,4,10 +11,17,6 +3,5,9 +12,3,12 +15,6,7 +3,13,6 +16,10,16 +4,8,16 +6,5,15 +14,6,6 +14,6,14 +9,2,5 +9,17,13 +14,12,5 +14,12,15 +2,9,5 +10,3,15 +4,15,13 +14,10,3 +10,6,4 +14,7,12 +6,4,13 +5,6,16 +7,6,5 +13,6,7 +5,1,9 +9,2,14 +13,4,11 +16,12,14 +17,11,14 +16,6,5 +9,3,13 +17,9,14 +12,10,17 +6,4,3 +12,10,4 +6,16,5 +8,3,8 +15,8,3 +1,13,10 +6,17,13 +17,14,11 +9,16,6 +12,4,6 +12,17,5 +3,10,4 +11,12,1 +8,3,4 +3,5,10 +14,7,15 +5,6,14 +6,15,14 +7,16,5 +8,1,7 +5,12,12 +7,14,3 +12,2,14 +10,6,16 +11,4,13 +18,9,13 +17,8,6 +6,16,9 +7,3,10 +5,10,14 +9,4,6 +10,4,17 +13,3,4 +7,18,9 +7,8,1 +4,4,8 +8,13,17 +4,9,5 +18,10,8 +7,2,7 +14,7,2 +2,11,14 +4,4,7 +4,7,16 +10,17,9 +7,15,3 +17,9,11 +14,5,14 +16,9,8 +16,13,9 +9,15,11 +2,5,10 +5,2,13 +4,13,11 +17,7,10 +11,4,12 +13,9,16 +11,13,4 +12,3,10 +15,4,11 +10,9,18 +13,14,17 +12,5,5 +11,15,14 +16,8,6 +5,13,16 +5,4,15 +5,14,10 +6,6,3 +12,1,7 +7,11,16 +10,5,18 +12,9,1 +10,1,12 +5,16,14 +4,6,7 +19,11,9 +13,12,14 +16,11,15 +15,14,11 +14,8,13 +18,8,7 +6,4,9 +6,14,3 +14,4,10 +9,9,3 +18,9,7 +9,12,1 +17,10,8 +12,16,11 +4,3,6 +12,8,2 +11,6,2 +6,3,11 +3,13,11 +11,17,14 +11,5,2 +4,8,5 +1,8,8 +15,11,17 +18,7,11 +6,15,12 +6,13,14 +13,3,11 +7,8,4 +5,8,14 +16,10,14 +2,10,11 +17,8,13 +13,9,5 +11,14,6 +9,11,16 +2,7,7 +15,10,6 +16,7,5 +10,3,8 +16,11,8 +10,16,8 +3,9,9 +6,13,7 +6,11,16 +7,1,9 +4,15,5 +17,7,12 +7,15,7 +11,14,17 +15,15,9 +12,8,16 +15,15,7 +14,9,15 +4,4,4 +3,13,10 +5,16,7 +14,4,11 +8,9,16 +7,18,6 +4,6,12 +7,5,5 +6,2,7 +2,13,11 +10,4,12 +15,11,16 +4,6,3 +4,9,12 +4,6,4 +6,11,4 +0,11,10 +5,17,12 +7,10,18 +11,18,9 +17,14,10 +5,13,7 +13,11,13 +16,13,6 +7,11,5 +5,16,11 +6,15,8 +12,15,17 +10,18,5 +9,5,13 +7,8,2 +13,11,17 +11,10,1 +5,1,10 +1,13,9 +15,12,6 +4,4,12 +10,2,8 +4,15,9 +7,12,18 +4,14,15 +18,11,10 +18,8,9 +8,13,14 +12,2,13 +17,13,5 +5,3,12 +14,8,2 +14,3,9 +5,7,5 +12,0,9 +5,2,10 +15,3,9 +18,11,12 +7,15,6 +7,2,5 +6,14,16 +16,14,8 +7,5,2 +4,10,5 +14,3,12 +13,15,16 +15,12,3 +7,5,14 +6,10,5 +13,14,3 +8,18,9 +17,7,6 +11,7,15 +2,8,14 +10,7,1 +13,9,2 +11,3,8 +9,5,1 +14,6,16 +9,14,4 +7,7,1 +15,5,12 +14,2,8 +11,14,4 +3,10,11 +14,11,15 +4,8,8 +11,14,5 +8,11,1 +8,15,2 +13,17,9 +3,14,7 +15,11,13 +8,3,6 +15,7,16 +10,1,11 +18,8,12 +10,15,2 +16,4,14 +6,18,9 +7,10,14 +15,7,6 +16,12,10 +14,8,16 +3,6,8 +8,5,6 +3,11,8 +6,5,16 +9,15,12 +6,11,14 +5,15,8 +5,14,4 +15,2,9 +17,6,14 +8,6,5 +14,15,14 +6,15,10 +15,9,14 +15,8,13 +12,17,7 +8,14,13 +10,4,4 +7,10,16 +11,6,17 +12,6,2 +13,8,15 +13,4,3 +8,9,2 +16,9,9 +17,7,9 +9,1,11 +14,10,6 +17,7,8 +8,3,16 +15,14,9 +17,13,10 +15,8,14 +1,7,8 +16,14,14 +15,8,10 +10,4,10 +10,2,4 +11,10,3 +4,17,9 +7,13,3 +15,13,14 +3,9,10 +3,6,11 +3,11,6 +7,12,1 +15,14,13 +7,16,12 +15,6,9 +4,10,11 +9,3,10 +7,10,15 +11,6,16 +7,13,14 +6,11,5 +6,7,14 +10,11,16 +14,6,5 +13,14,6 +3,12,16 +10,10,1 +2,9,7 +13,7,17 +16,11,4 +12,8,18 +10,10,0 +5,8,5 +9,7,4 +16,10,7 +9,16,9 +16,15,6 +8,14,14 +11,6,6 +14,15,8 +9,15,8 +6,7,4 +5,6,5 +5,10,5 +17,11,5 +3,8,4 +17,11,10 +9,16,2 +4,12,11 +11,14,2 +12,11,4 +14,4,12 +9,12,16 +12,7,4 +16,8,10 +13,18,6 +15,12,16 +7,4,3 +13,15,10 +8,14,16 +1,7,11 +8,16,4 +14,6,15 +10,0,11 +6,16,15 +15,9,7 +6,9,2 +10,13,16 +5,14,11 +2,13,6 +16,10,6 +13,8,16 +4,6,8 +11,3,17 +5,11,6 +7,4,10 +14,9,6 +4,14,4 +12,13,15 +6,2,12 +14,16,5 +10,15,8 +8,2,14 +16,13,12 +18,11,8 +17,5,12 +7,13,16 +12,12,16 +9,16,7 +7,10,4 +7,16,11 +12,13,2 +14,16,4 +15,8,7 +12,10,5 +4,9,14 +5,13,10 +3,7,15 +13,17,8 +11,16,12 +13,12,4 +10,5,14 +13,15,7 +5,10,6 +1,7,10 +8,3,11 +3,10,3 +7,12,4 +5,12,14 +11,4,8 +9,10,15 +6,5,10 +12,14,11 +5,7,3 +12,14,5 +4,4,11 +7,11,18 +6,1,10 +5,5,16 +9,3,8 +13,6,15 +10,17,8 +4,6,9 +7,12,13 +8,5,4 +1,8,10 +15,4,13 +5,4,10 +13,5,14 +16,13,14 +13,15,15 +15,17,10 +3,13,7 +13,18,8 +18,9,10 +12,15,9 +3,11,4 +13,13,11 +7,4,7 +16,5,6 +1,12,12 +16,13,13 +10,3,5 +8,18,10 +4,16,11 +5,18,10 +15,7,3 +3,8,14 +9,16,3 +12,11,1 +16,8,9 +11,18,7 +17,9,5 +7,7,2 +1,5,10 +16,4,10 +7,1,8 +17,14,7 +2,7,13 +1,8,12 +4,2,8 +10,15,5 +15,13,15 +10,7,16 +7,16,4 +14,5,4 +16,4,6 +4,16,6 +14,10,5 +14,8,6 +17,11,4 +8,2,15 +12,16,9 +10,8,0 +3,16,7 +4,10,6 +13,13,14 +13,13,12 +6,7,17 +3,6,5 +6,8,14 From eb007342f2b3d1f7a0e0facbf718f181291d2090 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 18 Dec 2022 12:44:40 +0100 Subject: [PATCH 345/479] 2022: d18: ex1: add solution --- 2022/d18/ex1/ex1.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100755 2022/d18/ex1/ex1.py diff --git a/2022/d18/ex1/ex1.py b/2022/d18/ex1/ex1.py new file mode 100755 index 0000000..71a8734 --- /dev/null +++ b/2022/d18/ex1/ex1.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +import sys +from collections.abc import Iterator +from typing import NamedTuple + + +class Point3(NamedTuple): + x: int + y: int + z: int + + @classmethod + def from_input(cls, input: str) -> "Point3": + x, y, z = map(int, input.split(",")) + return cls(x, y, z) + + @classmethod + def neighbours(cls, p: "Point3") -> Iterator["Point3"]: + for dx, dy, dz in ( + (0, 0, -1), + (0, 0, 1), + (0, -1, 0), + (0, 1, 0), + (-1, 0, 0), + (1, 0, 0), + ): + yield cls(p.x + dx, p.y + dy, p.z + dz) + + +def solve(input: list[str]) -> int: + cubes = {Point3.from_input(line) for line in input} + + return sum(1 for p in cubes for n in Point3.neighbours(p) if n not in cubes) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 5fc8c07cfd85eb0eb5413d75a12cbc25355c1bbe Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 18 Dec 2022 12:44:45 +0100 Subject: [PATCH 346/479] 2022: d18: ex2: add input --- 2022/d18/ex2/input | 2145 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2145 insertions(+) create mode 100644 2022/d18/ex2/input diff --git a/2022/d18/ex2/input b/2022/d18/ex2/input new file mode 100644 index 0000000..ad808d2 --- /dev/null +++ b/2022/d18/ex2/input @@ -0,0 +1,2145 @@ +5,7,4 +11,12,17 +18,8,10 +8,11,17 +14,8,17 +9,2,8 +12,13,16 +4,7,5 +5,15,5 +5,15,13 +11,13,3 +18,11,6 +13,6,18 +2,6,11 +7,5,15 +12,17,12 +7,3,9 +15,6,6 +7,1,10 +12,15,5 +11,16,4 +9,18,12 +5,2,9 +10,1,8 +2,11,6 +10,7,3 +10,3,14 +3,12,5 +15,5,6 +5,3,11 +4,9,4 +1,11,10 +17,9,12 +17,13,12 +5,10,15 +2,10,6 +7,1,6 +13,17,11 +7,4,4 +12,4,12 +13,10,16 +4,14,6 +11,15,5 +13,4,5 +9,18,13 +14,4,8 +14,15,6 +11,16,8 +4,13,7 +3,7,6 +9,18,10 +6,6,16 +8,3,5 +16,15,7 +14,6,17 +3,10,8 +8,2,12 +17,12,12 +10,8,1 +8,4,5 +12,3,6 +7,17,4 +7,4,5 +13,8,3 +8,8,2 +10,5,2 +15,10,3 +5,6,15 +13,14,4 +1,11,12 +8,7,18 +4,11,17 +2,13,8 +3,6,13 +9,16,5 +6,16,11 +4,9,16 +10,18,11 +2,14,11 +15,16,5 +11,7,17 +2,10,14 +16,5,9 +12,2,5 +6,4,14 +8,9,17 +13,18,10 +14,16,6 +7,6,15 +2,11,13 +18,7,7 +4,9,3 +3,10,10 +3,12,13 +17,9,9 +11,15,15 +2,7,12 +4,5,12 +14,10,4 +8,8,3 +16,11,13 +15,6,4 +14,8,3 +10,18,7 +14,7,6 +14,12,17 +13,15,3 +3,11,14 +8,13,2 +5,7,15 +2,7,9 +16,9,15 +2,12,9 +3,13,4 +8,2,10 +9,15,4 +17,10,12 +11,5,15 +4,3,7 +6,12,3 +8,16,6 +18,11,9 +3,15,10 +9,6,2 +5,16,6 +11,12,2 +10,3,6 +8,16,13 +9,5,4 +8,2,7 +11,16,13 +7,4,9 +14,15,4 +10,14,3 +9,4,15 +5,10,3 +4,4,6 +15,16,11 +6,10,16 +14,13,11 +8,10,1 +5,10,4 +4,11,3 +17,10,13 +3,6,12 +11,11,3 +14,8,4 +14,16,10 +13,10,4 +7,7,3 +10,1,9 +16,14,11 +14,13,4 +16,7,13 +4,7,3 +3,12,12 +8,18,11 +10,6,1 +10,6,2 +6,6,6 +11,16,10 +10,15,16 +5,12,5 +5,15,6 +6,3,12 +6,12,17 +9,6,17 +10,8,2 +16,7,8 +14,16,11 +14,4,13 +6,17,10 +3,7,8 +10,4,3 +9,2,10 +17,10,14 +7,11,2 +12,16,6 +7,16,9 +5,9,15 +12,3,5 +14,14,14 +14,15,7 +14,13,6 +12,7,18 +14,13,5 +8,7,3 +16,7,11 +16,6,14 +7,7,16 +13,5,12 +12,7,3 +10,16,14 +7,18,12 +5,12,17 +6,10,2 +12,16,4 +11,12,18 +8,17,8 +14,11,17 +15,3,8 +10,6,17 +3,5,12 +7,6,16 +1,10,11 +13,16,14 +5,4,8 +13,14,15 +13,5,6 +7,2,13 +15,12,11 +2,14,8 +14,13,14 +15,16,8 +12,4,16 +8,14,4 +9,3,15 +13,16,9 +12,9,16 +3,13,14 +11,2,14 +10,17,11 +12,2,10 +2,10,15 +18,12,9 +7,3,8 +11,3,14 +8,4,6 +12,4,3 +11,2,12 +16,4,8 +6,11,2 +4,10,12 +9,8,2 +4,16,7 +8,17,12 +11,5,17 +13,6,3 +2,6,9 +4,10,15 +15,14,5 +11,2,5 +14,12,14 +9,2,12 +15,15,8 +14,10,15 +11,18,13 +14,9,16 +16,5,10 +2,12,11 +16,8,8 +7,5,4 +8,7,16 +10,14,16 +5,14,13 +6,14,6 +14,9,17 +4,12,6 +4,6,16 +5,11,3 +9,12,17 +13,11,16 +15,8,4 +4,8,3 +17,11,9 +17,10,11 +9,10,18 +6,14,4 +18,11,7 +5,5,5 +2,5,11 +4,10,10 +12,16,12 +3,4,7 +15,12,14 +16,8,11 +3,5,11 +16,6,6 +8,16,8 +8,16,12 +6,13,16 +17,11,7 +10,3,7 +6,3,13 +8,4,15 +17,13,8 +17,9,10 +15,12,15 +14,5,6 +13,11,1 +14,16,12 +5,17,11 +14,9,4 +12,2,9 +1,10,12 +12,7,16 +16,8,7 +4,13,4 +3,15,13 +7,12,17 +3,14,10 +16,10,15 +1,10,8 +4,7,14 +10,2,6 +5,8,16 +12,17,11 +9,13,16 +9,16,14 +13,12,15 +9,11,2 +8,17,6 +17,12,10 +8,14,3 +12,14,4 +5,12,4 +16,13,7 +11,8,2 +10,5,4 +11,10,17 +14,15,10 +8,9,3 +10,16,6 +3,9,5 +4,10,3 +15,14,4 +10,16,4 +7,3,6 +14,3,11 +2,8,12 +9,17,7 +8,14,15 +5,4,6 +7,3,12 +9,8,1 +13,7,15 +5,11,16 +10,10,17 +16,8,15 +13,13,15 +14,4,7 +6,11,17 +9,15,17 +8,5,15 +10,9,17 +4,7,12 +10,1,13 +4,3,9 +8,4,3 +8,5,13 +14,12,12 +10,13,15 +17,8,8 +2,11,8 +12,14,14 +3,12,11 +11,18,11 +3,10,12 +11,3,11 +5,11,2 +12,9,18 +10,2,12 +14,15,12 +2,11,11 +16,13,8 +11,12,16 +3,3,11 +4,15,14 +9,10,17 +4,4,10 +6,2,11 +5,15,14 +13,10,15 +3,4,10 +12,17,9 +17,8,9 +6,4,7 +2,12,5 +5,14,5 +6,7,16 +12,1,11 +16,4,11 +8,3,9 +13,13,5 +4,13,3 +8,17,11 +11,2,10 +2,8,10 +14,5,13 +15,9,13 +16,10,12 +6,16,7 +17,6,13 +4,5,7 +12,10,2 +6,8,16 +17,5,11 +6,15,11 +5,11,17 +18,11,11 +8,8,0 +15,7,4 +4,14,5 +11,16,11 +9,4,16 +11,1,13 +6,13,4 +8,5,3 +4,11,5 +10,15,4 +9,1,10 +11,5,3 +6,9,17 +6,11,3 +14,14,3 +9,14,16 +8,10,2 +13,3,13 +7,12,14 +4,4,13 +6,3,10 +14,6,3 +16,8,13 +2,9,9 +13,15,5 +15,16,10 +11,4,5 +15,9,16 +12,12,2 +10,3,9 +15,11,6 +4,7,11 +6,2,8 +9,14,5 +7,8,3 +4,3,10 +14,4,14 +2,10,10 +4,4,14 +16,7,15 +7,13,4 +11,11,18 +15,4,6 +13,4,4 +10,14,4 +7,17,10 +15,13,5 +16,12,6 +5,9,17 +16,14,10 +11,4,14 +6,14,15 +6,6,5 +10,2,11 +7,8,16 +7,14,16 +2,9,14 +4,5,13 +13,13,16 +9,7,16 +10,16,12 +7,14,4 +13,9,1 +2,8,13 +9,8,16 +11,17,10 +7,8,17 +3,14,12 +4,7,6 +10,18,13 +9,14,3 +3,11,10 +6,6,2 +17,6,8 +4,14,11 +13,5,15 +15,14,14 +13,4,15 +9,3,12 +15,4,10 +6,16,6 +15,15,11 +8,2,9 +4,11,16 +18,10,11 +15,5,5 +2,9,12 +6,16,12 +7,16,14 +12,14,3 +6,4,15 +10,17,10 +15,6,5 +10,16,15 +16,6,11 +4,5,8 +16,12,15 +8,16,14 +5,8,3 +16,12,7 +11,7,18 +11,7,3 +13,4,8 +3,8,9 +15,6,15 +10,12,17 +3,13,12 +14,13,3 +10,18,10 +12,16,7 +16,7,6 +9,4,4 +14,12,4 +17,13,9 +10,17,7 +5,5,15 +4,12,14 +5,4,13 +14,16,13 +2,6,6 +3,4,13 +9,13,2 +14,2,7 +4,5,11 +7,3,5 +17,9,13 +6,5,2 +7,16,13 +3,10,13 +11,2,9 +11,16,5 +14,5,10 +2,10,7 +15,6,11 +4,12,13 +5,11,15 +7,9,18 +9,8,18 +7,9,17 +12,17,13 +17,11,8 +12,1,9 +10,9,2 +15,9,6 +4,7,10 +14,12,3 +11,11,2 +8,17,7 +13,2,7 +8,5,16 +3,6,7 +15,8,15 +15,15,6 +5,3,13 +4,8,4 +11,16,6 +16,15,12 +7,16,6 +17,9,6 +12,6,3 +5,6,7 +13,14,16 +13,3,14 +15,9,3 +8,15,16 +7,10,3 +4,9,13 +16,9,7 +17,8,12 +9,17,10 +12,9,2 +8,15,5 +16,9,10 +16,5,11 +13,10,3 +8,1,11 +15,4,12 +13,16,6 +4,14,8 +4,6,13 +6,12,4 +11,3,13 +9,14,15 +13,5,13 +3,8,13 +1,8,7 +4,7,4 +14,9,2 +3,10,15 +5,12,16 +2,7,11 +5,9,3 +7,17,7 +11,16,14 +13,8,2 +13,2,8 +4,7,7 +12,17,10 +7,2,8 +5,15,11 +16,11,12 +16,15,9 +17,10,7 +16,6,4 +3,8,15 +6,4,8 +4,6,14 +7,17,6 +15,7,7 +12,15,15 +16,5,15 +9,17,6 +13,15,14 +5,17,10 +7,15,12 +12,7,2 +7,3,14 +12,14,16 +4,10,2 +3,7,11 +16,4,9 +9,18,11 +4,13,5 +8,12,13 +13,10,1 +7,1,11 +12,16,10 +9,8,17 +5,16,10 +13,13,3 +4,7,13 +15,14,15 +7,16,8 +9,10,16 +15,7,5 +17,6,10 +16,6,15 +8,9,18 +14,17,11 +15,14,10 +9,8,3 +8,16,5 +16,9,13 +11,15,16 +2,7,14 +5,16,8 +17,5,10 +15,10,4 +16,12,12 +14,17,12 +7,2,9 +11,17,7 +6,8,3 +14,15,15 +14,15,9 +15,14,8 +14,4,5 +5,4,12 +15,3,12 +6,16,10 +7,8,18 +14,14,4 +11,18,10 +16,6,8 +4,14,9 +9,1,8 +7,15,14 +2,13,10 +11,4,4 +3,15,11 +8,8,1 +14,10,16 +15,7,13 +11,2,6 +18,6,7 +11,9,16 +12,8,15 +11,15,3 +6,6,4 +3,5,8 +3,13,13 +16,12,8 +12,5,3 +6,15,15 +13,9,15 +9,18,9 +11,17,4 +13,6,14 +10,10,18 +8,15,15 +6,5,4 +6,15,6 +4,14,12 +11,9,17 +14,6,7 +1,9,7 +6,8,2 +8,2,11 +1,11,11 +14,16,8 +16,5,8 +9,6,4 +5,16,9 +11,1,9 +13,5,11 +14,17,10 +18,9,12 +5,3,7 +11,5,16 +9,2,7 +13,4,10 +10,2,7 +13,7,16 +8,3,13 +11,4,6 +15,9,4 +6,8,1 +2,12,10 +7,14,5 +6,4,12 +12,5,14 +9,2,11 +11,17,9 +15,7,15 +5,9,4 +1,12,10 +18,8,11 +4,8,14 +13,10,2 +5,8,17 +10,16,9 +14,7,14 +14,2,12 +5,3,14 +17,12,9 +11,17,11 +15,12,13 +3,7,13 +10,10,3 +15,13,9 +10,3,11 +14,11,3 +16,6,10 +13,4,13 +15,13,12 +9,17,5 +8,12,3 +11,9,1 +5,3,8 +9,16,12 +9,11,17 +7,9,15 +3,8,12 +4,12,5 +16,9,14 +12,2,8 +3,12,9 +5,6,13 +5,15,9 +11,6,15 +12,15,4 +3,11,9 +12,8,1 +14,8,14 +15,10,14 +8,4,4 +3,14,8 +11,8,17 +12,8,3 +6,3,6 +8,6,2 +17,13,6 +14,4,6 +8,1,10 +12,4,9 +15,15,12 +11,6,13 +12,4,4 +5,14,12 +7,6,3 +7,13,5 +2,9,11 +10,4,6 +16,7,7 +9,15,3 +14,14,15 +13,2,10 +8,8,17 +11,15,4 +11,3,10 +16,9,6 +9,15,16 +3,16,11 +13,10,14 +3,9,4 +10,16,5 +13,2,11 +17,9,8 +16,8,5 +2,12,12 +13,15,9 +10,3,10 +17,8,5 +6,8,17 +2,12,13 +12,2,6 +2,9,6 +5,5,4 +10,5,15 +6,3,7 +8,13,15 +2,9,13 +12,17,6 +14,10,2 +14,17,9 +12,13,3 +12,11,16 +12,2,7 +9,10,2 +15,10,5 +12,16,14 +6,17,11 +13,4,9 +4,15,6 +15,11,3 +12,15,6 +4,14,13 +10,17,15 +13,16,12 +8,9,1 +3,6,6 +5,5,13 +9,6,16 +16,12,5 +13,16,13 +9,9,17 +5,4,9 +9,17,8 +2,11,9 +4,14,10 +9,3,6 +7,17,9 +15,14,6 +13,5,3 +8,15,14 +17,12,4 +11,17,12 +14,5,5 +16,10,4 +4,5,5 +6,8,5 +2,13,7 +8,10,18 +15,6,10 +1,8,9 +17,7,5 +9,5,17 +12,14,13 +9,2,9 +11,7,2 +10,11,17 +1,9,10 +15,15,13 +11,13,16 +4,3,11 +8,3,15 +7,10,2 +7,7,4 +10,8,17 +17,11,12 +2,11,5 +8,15,7 +1,11,8 +18,12,8 +12,15,13 +4,5,10 +6,4,16 +7,9,2 +17,10,9 +9,15,14 +9,14,2 +14,3,13 +17,9,7 +14,15,13 +12,13,17 +11,3,4 +11,3,7 +8,17,9 +13,10,18 +12,12,15 +9,4,13 +15,5,7 +1,5,8 +8,17,14 +9,7,3 +16,11,9 +16,6,12 +2,9,8 +9,16,13 +11,6,3 +5,7,14 +5,9,5 +3,4,8 +11,4,3 +13,15,8 +7,4,15 +16,9,4 +4,2,9 +16,9,5 +3,12,15 +4,15,8 +16,11,5 +10,7,2 +11,15,6 +10,12,3 +8,7,14 +5,6,3 +12,5,4 +6,17,8 +3,16,10 +9,1,7 +15,10,15 +6,3,5 +2,7,10 +6,12,16 +7,15,13 +16,6,7 +4,4,9 +6,9,16 +12,5,16 +10,10,2 +3,11,5 +11,2,11 +9,3,4 +6,15,4 +3,9,14 +7,5,16 +7,15,5 +6,17,12 +14,11,14 +10,1,10 +5,12,15 +6,6,14 +11,16,7 +16,8,14 +12,15,14 +17,13,7 +5,15,12 +14,7,4 +1,12,9 +12,6,16 +8,11,2 +4,6,11 +17,14,8 +8,6,3 +12,4,15 +16,12,11 +11,12,3 +16,12,13 +11,17,13 +11,1,10 +4,12,7 +11,2,8 +14,5,11 +13,17,7 +11,9,3 +7,6,2 +12,4,5 +8,4,7 +11,1,11 +18,10,6 +12,7,17 +7,16,10 +5,8,4 +3,10,6 +8,12,16 +7,11,3 +3,10,5 +14,14,6 +12,19,10 +10,5,16 +13,2,12 +13,16,7 +7,14,7 +16,7,9 +10,3,4 +17,6,6 +16,10,8 +6,3,8 +12,13,4 +10,14,15 +1,9,11 +4,12,15 +17,7,7 +5,12,8 +6,11,1 +9,4,14 +17,12,7 +9,11,1 +14,15,5 +11,13,17 +12,9,17 +3,7,14 +17,8,11 +7,2,6 +10,18,8 +7,4,8 +7,3,13 +6,5,3 +14,7,3 +15,5,10 +1,10,9 +3,4,9 +18,10,10 +8,12,2 +7,12,16 +18,9,11 +7,2,11 +4,5,14 +2,9,10 +9,3,5 +2,14,6 +2,8,6 +15,4,9 +4,14,16 +11,4,7 +4,4,15 +13,11,2 +12,3,14 +17,6,7 +14,3,7 +6,5,6 +15,11,15 +5,5,14 +2,13,9 +13,14,14 +15,5,9 +8,13,18 +10,13,2 +8,16,16 +13,12,3 +6,17,9 +11,14,16 +15,4,7 +5,10,2 +5,4,11 +5,3,9 +18,7,8 +9,7,17 +4,3,8 +10,16,11 +18,7,9 +9,17,9 +10,2,13 +17,5,8 +12,4,11 +12,15,16 +8,7,17 +17,6,12 +12,3,8 +9,5,3 +12,16,13 +10,17,5 +4,16,10 +7,4,13 +12,4,14 +4,11,2 +11,3,15 +5,9,2 +9,12,2 +14,7,5 +2,12,7 +17,5,9 +5,3,10 +3,11,7 +9,14,17 +12,9,3 +6,2,6 +4,5,9 +11,3,6 +4,17,10 +10,17,14 +13,3,10 +5,15,7 +18,13,9 +2,10,9 +3,12,14 +3,13,8 +16,5,7 +4,13,10 +11,8,1 +5,12,3 +3,13,9 +11,14,3 +10,15,15 +9,11,18 +12,6,17 +13,8,17 +8,14,2 +6,7,5 +6,17,7 +5,10,16 +14,16,9 +13,16,11 +18,9,8 +14,11,16 +8,15,4 +8,2,13 +3,9,11 +6,14,14 +15,3,11 +14,4,9 +10,11,2 +13,9,17 +9,13,3 +6,8,4 +15,5,4 +17,11,11 +2,10,13 +12,10,16 +17,10,10 +17,8,14 +12,11,2 +4,14,14 +15,10,16 +6,7,15 +12,14,15 +8,14,17 +6,13,17 +7,11,17 +7,18,10 +6,10,17 +17,9,15 +5,13,3 +3,7,9 +9,5,16 +7,14,6 +17,11,13 +8,2,8 +5,6,4 +13,1,10 +1,12,7 +5,14,15 +16,9,11 +10,15,14 +18,10,7 +14,16,7 +9,5,14 +16,15,11 +7,14,15 +10,3,13 +13,13,4 +14,3,10 +12,14,2 +13,6,6 +13,16,5 +16,10,3 +4,12,8 +14,17,7 +1,9,8 +12,8,17 +17,15,10 +8,18,7 +10,5,6 +13,4,6 +13,11,3 +10,5,17 +17,8,7 +7,2,12 +4,10,17 +1,9,9 +5,7,6 +4,5,6 +14,5,3 +12,3,9 +10,18,12 +11,1,12 +8,3,7 +7,10,17 +7,3,15 +12,18,12 +9,4,7 +5,2,11 +8,16,11 +13,5,4 +11,13,15 +14,6,8 +16,6,9 +7,15,8 +9,16,8 +4,9,15 +7,7,17 +5,5,3 +10,16,10 +8,11,18 +16,4,12 +9,11,4 +13,5,8 +9,17,12 +13,6,2 +16,11,14 +7,12,3 +11,4,15 +7,3,4 +8,4,11 +15,6,13 +13,12,16 +9,9,1 +6,5,17 +5,4,5 +7,14,2 +10,12,2 +11,6,5 +13,13,2 +6,7,2 +7,13,15 +11,2,13 +6,2,10 +10,15,3 +7,4,16 +13,4,12 +13,6,17 +16,10,11 +15,12,4 +5,14,9 +5,15,10 +16,14,7 +7,12,15 +10,6,15 +3,9,15 +9,17,11 +4,11,14 +17,7,11 +5,8,15 +9,7,2 +9,6,14 +6,4,6 +9,16,10 +15,11,5 +8,14,6 +7,14,14 +10,17,6 +14,5,15 +2,14,7 +14,9,3 +14,3,6 +4,3,12 +4,13,15 +8,12,17 +12,6,1 +5,12,7 +7,17,12 +17,6,11 +13,9,18 +15,8,5 +3,9,13 +6,13,2 +7,17,11 +7,18,8 +14,10,12 +9,13,17 +8,4,13 +6,9,4 +4,6,6 +10,2,10 +11,10,2 +6,9,3 +16,5,5 +11,19,10 +4,7,15 +2,12,8 +3,12,6 +15,6,12 +14,14,5 +15,13,13 +13,4,7 +16,5,12 +2,10,8 +14,8,15 +15,9,5 +13,16,8 +12,16,5 +7,13,17 +10,17,12 +15,5,14 +13,12,2 +2,13,5 +15,14,12 +6,6,15 +16,7,12 +5,16,12 +13,11,15 +13,3,12 +14,15,11 +3,4,11 +12,1,8 +13,9,4 +13,4,16 +13,11,4 +6,3,14 +4,11,15 +12,5,15 +3,7,7 +9,2,15 +11,15,17 +15,3,10 +18,7,12 +4,15,10 +15,16,7 +6,11,15 +10,7,17 +9,18,7 +7,16,7 +15,13,6 +14,11,4 +14,5,9 +12,17,8 +17,12,11 +5,11,4 +14,6,13 +16,14,12 +17,12,8 +11,14,15 +4,11,6 +13,16,10 +10,6,3 +10,16,13 +2,6,10 +14,8,5 +6,15,7 +17,7,14 +8,13,3 +12,12,18 +2,8,8 +5,5,11 +6,5,5 +12,3,7 +5,12,2 +10,14,17 +2,5,9 +14,12,16 +4,11,4 +8,16,15 +7,6,17 +4,6,15 +12,6,15 +5,12,6 +10,12,16 +10,4,15 +5,13,5 +13,3,7 +3,12,7 +11,9,2 +13,2,13 +14,5,12 +12,13,14 +16,7,14 +17,6,9 +12,3,11 +9,4,3 +1,7,12 +3,6,14 +13,15,11 +13,2,9 +13,3,5 +15,11,12 +15,5,8 +5,13,15 +3,14,9 +18,12,6 +15,15,10 +14,5,7 +9,13,15 +17,10,6 +6,10,15 +10,2,5 +4,15,11 +11,17,8 +12,12,17 +13,6,12 +5,10,17 +16,7,10 +14,6,4 +13,17,12 +11,8,18 +18,6,11 +8,13,16 +3,5,6 +10,17,13 +9,10,3 +4,13,12 +5,16,13 +7,4,6 +7,9,3 +13,4,14 +9,10,1 +14,17,8 +8,3,14 +15,3,5 +3,10,7 +12,12,1 +13,6,16 +16,9,12 +7,17,13 +9,9,2 +13,15,6 +12,12,3 +11,13,14 +15,9,15 +3,7,4 +5,14,6 +9,5,2 +13,18,9 +16,11,6 +3,6,9 +9,5,15 +1,10,6 +2,13,12 +5,13,4 +12,2,11 +12,15,12 +9,3,16 +5,7,16 +3,9,6 +4,8,12 +11,9,18 +16,15,10 +15,4,14 +13,10,17 +6,7,3 +8,16,9 +1,10,10 +4,13,14 +6,10,18 +10,5,3 +8,16,7 +7,16,15 +4,15,7 +18,9,9 +4,8,15 +9,15,15 +2,11,7 +3,7,5 +7,17,8 +11,13,5 +8,18,8 +12,7,15 +4,3,14 +13,7,3 +13,17,13 +16,6,13 +8,16,10 +12,3,4 +14,13,7 +16,8,3 +8,6,4 +5,14,14 +12,18,11 +7,3,7 +4,15,12 +5,14,7 +14,14,10 +3,11,11 +7,15,4 +2,8,11 +3,12,8 +12,10,3 +16,14,13 +15,13,7 +7,8,6 +14,2,9 +15,16,9 +13,12,6 +6,14,11 +6,13,5 +9,3,14 +9,7,1 +15,8,16 +16,13,11 +16,6,16 +13,15,4 +12,6,12 +14,3,8 +15,13,11 +16,10,9 +7,7,15 +4,3,5 +4,16,8 +12,6,4 +14,14,7 +15,13,4 +14,5,16 +13,6,4 +1,13,11 +14,13,15 +6,15,9 +15,12,17 +10,4,16 +6,10,3 +3,14,11 +17,11,6 +13,7,4 +16,14,9 +6,2,9 +4,13,13 +3,9,7 +11,16,9 +7,1,7 +11,5,4 +11,4,16 +6,6,17 +6,12,2 +9,15,5 +7,15,11 +8,14,5 +3,5,14 +14,13,16 +15,11,2 +9,2,13 +9,11,3 +17,12,6 +6,15,13 +6,12,15 +3,4,12 +14,11,6 +12,18,9 +4,9,7 +6,2,13 +7,10,1 +8,15,8 +2,11,12 +16,10,5 +15,6,3 +10,13,1 +3,8,11 +3,8,7 +7,2,10 +6,9,15 +15,16,6 +10,16,7 +7,5,3 +2,7,8 +12,1,12 +13,3,9 +13,12,17 +10,3,12 +4,14,7 +1,9,12 +8,5,2 +5,4,7 +5,2,7 +6,16,8 +12,5,7 +5,5,6 +11,3,5 +8,6,17 +12,2,12 +8,17,13 +16,11,7 +4,10,14 +11,5,5 +6,16,13 +10,4,5 +15,11,9 +8,6,16 +11,18,12 +9,2,3 +6,5,14 +17,12,13 +11,11,17 +12,16,15 +15,7,14 +10,9,16 +10,13,3 +12,3,13 +6,14,13 +15,4,8 +6,13,15 +13,15,12 +3,5,7 +8,11,15 +13,17,10 +8,4,8 +1,9,6 +14,7,16 +9,9,16 +17,7,13 +10,11,3 +4,6,5 +8,1,13 +12,11,17 +4,10,16 +4,9,2 +4,2,10 +4,8,6 +15,5,11 +15,14,7 +7,3,11 +4,5,15 +11,2,7 +11,5,14 +9,6,18 +6,6,13 +8,7,1 +4,12,4 +6,4,4 +16,13,10 +3,14,6 +18,10,12 +11,16,3 +7,4,14 +11,8,4 +8,11,3 +10,9,19 +16,15,8 +5,14,3 +11,4,2 +17,8,10 +15,6,14 +12,1,10 +10,13,14 +13,15,13 +12,15,7 +12,4,13 +3,5,13 +11,15,11 +1,12,8 +15,5,13 +5,5,12 +6,13,3 +12,18,10 +8,17,10 +12,9,15 +15,13,10 +12,11,3 +10,3,3 +13,16,3 +3,8,6 +15,15,14 +8,13,4 +10,13,4 +10,8,3 +5,5,10 +8,1,8 +11,3,9 +8,4,16 +8,3,10 +14,2,11 +5,13,14 +2,11,10 +10,6,5 +11,11,4 +9,2,6 +9,9,18 +7,15,15 +16,8,4 +15,11,14 +14,12,6 +16,14,6 +11,18,8 +17,10,15 +7,12,2 +3,7,12 +13,3,8 +9,17,14 +17,13,11 +2,4,10 +11,17,6 +3,5,9 +12,3,12 +15,6,7 +3,13,6 +16,10,16 +4,8,16 +6,5,15 +14,6,6 +14,6,14 +9,2,5 +9,17,13 +14,12,5 +14,12,15 +2,9,5 +10,3,15 +4,15,13 +14,10,3 +10,6,4 +14,7,12 +6,4,13 +5,6,16 +7,6,5 +13,6,7 +5,1,9 +9,2,14 +13,4,11 +16,12,14 +17,11,14 +16,6,5 +9,3,13 +17,9,14 +12,10,17 +6,4,3 +12,10,4 +6,16,5 +8,3,8 +15,8,3 +1,13,10 +6,17,13 +17,14,11 +9,16,6 +12,4,6 +12,17,5 +3,10,4 +11,12,1 +8,3,4 +3,5,10 +14,7,15 +5,6,14 +6,15,14 +7,16,5 +8,1,7 +5,12,12 +7,14,3 +12,2,14 +10,6,16 +11,4,13 +18,9,13 +17,8,6 +6,16,9 +7,3,10 +5,10,14 +9,4,6 +10,4,17 +13,3,4 +7,18,9 +7,8,1 +4,4,8 +8,13,17 +4,9,5 +18,10,8 +7,2,7 +14,7,2 +2,11,14 +4,4,7 +4,7,16 +10,17,9 +7,15,3 +17,9,11 +14,5,14 +16,9,8 +16,13,9 +9,15,11 +2,5,10 +5,2,13 +4,13,11 +17,7,10 +11,4,12 +13,9,16 +11,13,4 +12,3,10 +15,4,11 +10,9,18 +13,14,17 +12,5,5 +11,15,14 +16,8,6 +5,13,16 +5,4,15 +5,14,10 +6,6,3 +12,1,7 +7,11,16 +10,5,18 +12,9,1 +10,1,12 +5,16,14 +4,6,7 +19,11,9 +13,12,14 +16,11,15 +15,14,11 +14,8,13 +18,8,7 +6,4,9 +6,14,3 +14,4,10 +9,9,3 +18,9,7 +9,12,1 +17,10,8 +12,16,11 +4,3,6 +12,8,2 +11,6,2 +6,3,11 +3,13,11 +11,17,14 +11,5,2 +4,8,5 +1,8,8 +15,11,17 +18,7,11 +6,15,12 +6,13,14 +13,3,11 +7,8,4 +5,8,14 +16,10,14 +2,10,11 +17,8,13 +13,9,5 +11,14,6 +9,11,16 +2,7,7 +15,10,6 +16,7,5 +10,3,8 +16,11,8 +10,16,8 +3,9,9 +6,13,7 +6,11,16 +7,1,9 +4,15,5 +17,7,12 +7,15,7 +11,14,17 +15,15,9 +12,8,16 +15,15,7 +14,9,15 +4,4,4 +3,13,10 +5,16,7 +14,4,11 +8,9,16 +7,18,6 +4,6,12 +7,5,5 +6,2,7 +2,13,11 +10,4,12 +15,11,16 +4,6,3 +4,9,12 +4,6,4 +6,11,4 +0,11,10 +5,17,12 +7,10,18 +11,18,9 +17,14,10 +5,13,7 +13,11,13 +16,13,6 +7,11,5 +5,16,11 +6,15,8 +12,15,17 +10,18,5 +9,5,13 +7,8,2 +13,11,17 +11,10,1 +5,1,10 +1,13,9 +15,12,6 +4,4,12 +10,2,8 +4,15,9 +7,12,18 +4,14,15 +18,11,10 +18,8,9 +8,13,14 +12,2,13 +17,13,5 +5,3,12 +14,8,2 +14,3,9 +5,7,5 +12,0,9 +5,2,10 +15,3,9 +18,11,12 +7,15,6 +7,2,5 +6,14,16 +16,14,8 +7,5,2 +4,10,5 +14,3,12 +13,15,16 +15,12,3 +7,5,14 +6,10,5 +13,14,3 +8,18,9 +17,7,6 +11,7,15 +2,8,14 +10,7,1 +13,9,2 +11,3,8 +9,5,1 +14,6,16 +9,14,4 +7,7,1 +15,5,12 +14,2,8 +11,14,4 +3,10,11 +14,11,15 +4,8,8 +11,14,5 +8,11,1 +8,15,2 +13,17,9 +3,14,7 +15,11,13 +8,3,6 +15,7,16 +10,1,11 +18,8,12 +10,15,2 +16,4,14 +6,18,9 +7,10,14 +15,7,6 +16,12,10 +14,8,16 +3,6,8 +8,5,6 +3,11,8 +6,5,16 +9,15,12 +6,11,14 +5,15,8 +5,14,4 +15,2,9 +17,6,14 +8,6,5 +14,15,14 +6,15,10 +15,9,14 +15,8,13 +12,17,7 +8,14,13 +10,4,4 +7,10,16 +11,6,17 +12,6,2 +13,8,15 +13,4,3 +8,9,2 +16,9,9 +17,7,9 +9,1,11 +14,10,6 +17,7,8 +8,3,16 +15,14,9 +17,13,10 +15,8,14 +1,7,8 +16,14,14 +15,8,10 +10,4,10 +10,2,4 +11,10,3 +4,17,9 +7,13,3 +15,13,14 +3,9,10 +3,6,11 +3,11,6 +7,12,1 +15,14,13 +7,16,12 +15,6,9 +4,10,11 +9,3,10 +7,10,15 +11,6,16 +7,13,14 +6,11,5 +6,7,14 +10,11,16 +14,6,5 +13,14,6 +3,12,16 +10,10,1 +2,9,7 +13,7,17 +16,11,4 +12,8,18 +10,10,0 +5,8,5 +9,7,4 +16,10,7 +9,16,9 +16,15,6 +8,14,14 +11,6,6 +14,15,8 +9,15,8 +6,7,4 +5,6,5 +5,10,5 +17,11,5 +3,8,4 +17,11,10 +9,16,2 +4,12,11 +11,14,2 +12,11,4 +14,4,12 +9,12,16 +12,7,4 +16,8,10 +13,18,6 +15,12,16 +7,4,3 +13,15,10 +8,14,16 +1,7,11 +8,16,4 +14,6,15 +10,0,11 +6,16,15 +15,9,7 +6,9,2 +10,13,16 +5,14,11 +2,13,6 +16,10,6 +13,8,16 +4,6,8 +11,3,17 +5,11,6 +7,4,10 +14,9,6 +4,14,4 +12,13,15 +6,2,12 +14,16,5 +10,15,8 +8,2,14 +16,13,12 +18,11,8 +17,5,12 +7,13,16 +12,12,16 +9,16,7 +7,10,4 +7,16,11 +12,13,2 +14,16,4 +15,8,7 +12,10,5 +4,9,14 +5,13,10 +3,7,15 +13,17,8 +11,16,12 +13,12,4 +10,5,14 +13,15,7 +5,10,6 +1,7,10 +8,3,11 +3,10,3 +7,12,4 +5,12,14 +11,4,8 +9,10,15 +6,5,10 +12,14,11 +5,7,3 +12,14,5 +4,4,11 +7,11,18 +6,1,10 +5,5,16 +9,3,8 +13,6,15 +10,17,8 +4,6,9 +7,12,13 +8,5,4 +1,8,10 +15,4,13 +5,4,10 +13,5,14 +16,13,14 +13,15,15 +15,17,10 +3,13,7 +13,18,8 +18,9,10 +12,15,9 +3,11,4 +13,13,11 +7,4,7 +16,5,6 +1,12,12 +16,13,13 +10,3,5 +8,18,10 +4,16,11 +5,18,10 +15,7,3 +3,8,14 +9,16,3 +12,11,1 +16,8,9 +11,18,7 +17,9,5 +7,7,2 +1,5,10 +16,4,10 +7,1,8 +17,14,7 +2,7,13 +1,8,12 +4,2,8 +10,15,5 +15,13,15 +10,7,16 +7,16,4 +14,5,4 +16,4,6 +4,16,6 +14,10,5 +14,8,6 +17,11,4 +8,2,15 +12,16,9 +10,8,0 +3,16,7 +4,10,6 +13,13,14 +13,13,12 +6,7,17 +3,6,5 +6,8,14 From 43d4b031f5ed509066fda3c0ae2d94cc49a2f99c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 18 Dec 2022 12:44:49 +0100 Subject: [PATCH 347/479] 2022: d18: ex2: add solution --- 2022/d18/ex2/ex2.py | 118 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100755 2022/d18/ex2/ex2.py diff --git a/2022/d18/ex2/ex2.py b/2022/d18/ex2/ex2.py new file mode 100755 index 0000000..57f8b5a --- /dev/null +++ b/2022/d18/ex2/ex2.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections.abc import Iterator +from typing import NamedTuple + + +class Point3(NamedTuple): + x: int + y: int + z: int + + @classmethod + def from_input(cls, input: str) -> "Point3": + x, y, z = map(int, input.split(",")) + return cls(x, y, z) + + @classmethod + def neighbours(cls, p: "Point3") -> Iterator["Point3"]: + for dx, dy, dz in ( + (0, 0, -1), + (0, 0, 1), + (0, -1, 0), + (0, 1, 0), + (-1, 0, 0), + (1, 0, 0), + ): + yield cls(p.x + dx, p.y + dy, p.z + dz) + + +def solve(input: list[str]) -> int: + def compute_unreachable(cubes: set[Point3]) -> set[Point3]: + def explore(p: Point3, can_reach_out: dict[Point3, bool]) -> bool: + seen: set[Point3] = set() + queue: list[Point3] = [p] + while queue: + p = queue.pop() + if p in seen: + continue + if p in can_reach_out: + if can_reach_out[p]: + return True + continue # Don't go through walls + seen.add(p) + queue.extend(Point3.neighbours(p)) + return False + + minx, maxx = min(p.x for p in cubes), max(p.x for p in cubes) + miny, maxy = min(p.y for p in cubes), max(p.y for p in cubes) + minz, maxz = min(p.z for p in cubes), max(p.z for p in cubes) + + can_reach_out = {p: False for p in cubes} + can_reach_out |= { + Point3(x, y, z): True + for x, (y, z) in zip( + itertools.repeat(minx - 1), + itertools.product(range(miny, maxy + 1), range(minz, maxz + 1)), + ) + } + can_reach_out |= { + Point3(x, y, z): True + for x, (y, z) in zip( + itertools.repeat(maxx + 1), + itertools.product(range(miny, maxy + 1), range(minz, maxz + 1)), + ) + } + can_reach_out |= { + Point3(x, y, z): True + for y, (x, z) in zip( + itertools.repeat(miny - 1), + itertools.product(range(minx, maxx + 1), range(minz, maxz + 1)), + ) + } + can_reach_out |= { + Point3(x, y, z): True + for y, (x, z) in zip( + itertools.repeat(maxy + 1), + itertools.product(range(minx, maxx + 1), range(minz, maxz + 1)), + ) + } + can_reach_out |= { + Point3(x, y, z): True + for z, (x, y) in zip( + itertools.repeat(minz - 1), + itertools.product(range(minx, maxx + 1), range(miny, maxy + 1)), + ) + } + can_reach_out |= { + Point3(x, y, z): True + for z, (x, y) in zip( + itertools.repeat(maxz + 1), + itertools.product(range(minx, maxx + 1), range(miny, maxy + 1)), + ) + } + + for x, y, z in itertools.product( + range(minx, maxx + 1), + range(miny, maxy + 1), + range(minz, maxz + 1), + ): + p = Point3(x, y, z) + can_reach_out[p] = explore(p, can_reach_out) + return {p for p, can_reach in can_reach_out.items() if not can_reach} + + cubes = {Point3.from_input(line) for line in input} + unreachable = compute_unreachable(cubes) + + return sum(1 for p in cubes for n in Point3.neighbours(p) if n not in unreachable) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From d8b22599cf2051c38fd0cfe1154d38176de1850e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 19 Dec 2022 12:20:39 +0100 Subject: [PATCH 348/479] 2022: d19: ex1: add input --- 2022/d19/ex1/input | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 2022/d19/ex1/input diff --git a/2022/d19/ex1/input b/2022/d19/ex1/input new file mode 100644 index 0000000..2c1044f --- /dev/null +++ b/2022/d19/ex1/input @@ -0,0 +1,30 @@ +Blueprint 1: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 12 clay. Each geode robot costs 4 ore and 19 obsidian. +Blueprint 2: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 11 clay. Each geode robot costs 4 ore and 12 obsidian. +Blueprint 3: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 18 clay. Each geode robot costs 2 ore and 11 obsidian. +Blueprint 4: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 15 clay. Each geode robot costs 4 ore and 20 obsidian. +Blueprint 5: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 16 clay. Each geode robot costs 4 ore and 17 obsidian. +Blueprint 6: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 19 clay. Each geode robot costs 2 ore and 12 obsidian. +Blueprint 7: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 9 clay. Each geode robot costs 2 ore and 10 obsidian. +Blueprint 8: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 5 clay. Each geode robot costs 3 ore and 7 obsidian. +Blueprint 9: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 11 clay. Each geode robot costs 4 ore and 8 obsidian. +Blueprint 10: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 16 clay. Each geode robot costs 2 ore and 15 obsidian. +Blueprint 11: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 20 clay. Each geode robot costs 2 ore and 19 obsidian. +Blueprint 12: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 16 clay. Each geode robot costs 3 ore and 20 obsidian. +Blueprint 13: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 20 clay. Each geode robot costs 3 ore and 14 obsidian. +Blueprint 14: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 4 ore and 20 clay. Each geode robot costs 2 ore and 15 obsidian. +Blueprint 15: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 4 ore and 15 clay. Each geode robot costs 3 ore and 12 obsidian. +Blueprint 16: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 17 clay. Each geode robot costs 3 ore and 19 obsidian. +Blueprint 17: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 14 clay. Each geode robot costs 4 ore and 9 obsidian. +Blueprint 18: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 6 clay. Each geode robot costs 3 ore and 16 obsidian. +Blueprint 19: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 6 clay. Each geode robot costs 2 ore and 14 obsidian. +Blueprint 20: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 4 ore and 11 clay. Each geode robot costs 3 ore and 15 obsidian. +Blueprint 21: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 18 clay. Each geode robot costs 4 ore and 19 obsidian. +Blueprint 22: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 15 clay. Each geode robot costs 2 ore and 20 obsidian. +Blueprint 23: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 5 clay. Each geode robot costs 2 ore and 10 obsidian. +Blueprint 24: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 10 clay. Each geode robot costs 2 ore and 14 obsidian. +Blueprint 25: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 7 clay. Each geode robot costs 4 ore and 13 obsidian. +Blueprint 26: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 20 clay. Each geode robot costs 2 ore and 20 obsidian. +Blueprint 27: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 18 clay. Each geode robot costs 2 ore and 19 obsidian. +Blueprint 28: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 10 clay. Each geode robot costs 2 ore and 7 obsidian. +Blueprint 29: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 15 clay. Each geode robot costs 3 ore and 7 obsidian. +Blueprint 30: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 20 clay. Each geode robot costs 4 ore and 18 obsidian. From b1ef193da95ae30cda4fd2f10aa21e687da4a371 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 19 Dec 2022 12:20:44 +0100 Subject: [PATCH 349/479] 2022: d19: ex1: add solution --- 2022/d19/ex1/ex1.py | 186 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100755 2022/d19/ex1/ex1.py diff --git a/2022/d19/ex1/ex1.py b/2022/d19/ex1/ex1.py new file mode 100755 index 0000000..9b663a7 --- /dev/null +++ b/2022/d19/ex1/ex1.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python + +import dataclasses +import enum +import itertools +import sys +from collections import deque +from collections.abc import Iterable, Iterator, Mapping +from typing import NamedTuple, Optional, TypeVar + +T = TypeVar("T") + + +def grouper(iterable: Iterable[T], n: int) -> Iterator[tuple[T, ...]]: + "Collect data into non-overlapping fixed-length chunks or blocks" + args = [iter(iterable)] * n + return zip(*args, strict=True) + + +class Resource(str, enum.Enum): + GEODE = "geode" + OBSIDIAN = "obsidian" + CLAY = "clay" + ORE = "ore" + + +class ResourceCost(Mapping[Resource, int]): + _dict: dict[Resource, int] + _hash: Optional[int] + + def __init__(self, init: Mapping[Resource, int] = {}, /) -> None: + self._dict = {res: init.get(res, 0) for res in Resource} + self._hash = None + + assert all(self._dict[res] >= 0 for res in Resource) # Sanity check + + def __getitem__(self, key: Resource, /) -> int: + return self._dict[key] + + def __iter__(self) -> Iterator[Resource]: + return iter(Resource) # Always use same Resource iteration order + + def __len__(self) -> int: + return len(self._dict) + + def __hash__(self) -> int: + if self._hash is None: + self._hash = hash(tuple(sorted(self._dict))) + return self._hash + + def __add__(self, other): + if not isinstance(other, ResourceCost): + return NotImplemented + return ResourceCost({res: self[res] + other[res] for res in Resource}) + + def __sub__(self, other): + if not isinstance(other, ResourceCost): + return NotImplemented + return ResourceCost({res: self[res] - other[res] for res in Resource}) + + def __repr__(self) -> str: + return repr(self._dict) + + def has_enough(self, costs: "ResourceCost") -> bool: + return all(self[res] >= costs[res] for res in Resource) + + +@dataclasses.dataclass +class Blueprint: + construction_costs: dict[Resource, ResourceCost] + + @classmethod + def from_input(cls, input: str) -> "Blueprint": + assert input.startswith("Blueprint ") # Sanity check + + raw_costs = input.split(": ")[1].split(". ") + costs: dict[Resource, ResourceCost] = {} + for raw in map(str.split, raw_costs): + ressource = Resource(raw[1]) + costs[ressource] = ResourceCost( + { + Resource(r.removesuffix(".")): int(c) + for c, r in grouper((w for w in raw[4:] if w != "and"), 2) + } + ) + + return cls(costs) + + def maximize_geodes(self, run_time: int) -> int: + class QueueNode(NamedTuple): + time: int + robots: ResourceCost + inventory: ResourceCost + total_mined: ResourceCost + + def prune_queue(queue: Iterable[QueueNode]) -> deque[QueueNode]: + def priority_key(node: QueueNode) -> int: + MULTIPLIERS = { + Resource.GEODE: 1_000_000, + Resource.OBSIDIAN: 10_000, + Resource.CLAY: 100, + Resource.ORE: 1, + } + return sum( + node.total_mined[res] * mul for res, mul in MULTIPLIERS.items() + ) + + MAX_QUEUE = 1000 # Chosen arbitrarily + return deque(sorted(queue, key=priority_key, reverse=True)[:MAX_QUEUE]) + + def do_build(node: QueueNode, robot_type: Optional[Resource]) -> QueueNode: + costs = ( + self.construction_costs[robot_type] + if robot_type is not None + else ResourceCost() + ) + assert node.inventory.has_enough(costs) # Sanity check + new_robots = node.robots + ( + ResourceCost({robot_type: 1}) + if robot_type is not None + else ResourceCost() + ) + new_inventory = node.inventory + node.robots - costs + new_total_mined = node.total_mined + node.robots + return QueueNode(node.time + 1, new_robots, new_inventory, new_total_mined) + + max_geode = 0 + + queue: deque[QueueNode] = deque( + # Starting conditions + [ + QueueNode( + 0, ResourceCost({Resource.ORE: 1}), ResourceCost(), ResourceCost() + ) + ] + ) + dfs_depth = 0 + while queue: + node = queue.popleft() + + if node.time > dfs_depth: + # An awful hack to reduce the search space and prioritize geodes + queue = prune_queue(queue) + dfs_depth = node.time + + if node.time == run_time: + max_geode = max(max_geode, node.total_mined[Resource.GEODE]) + continue + + # Try building a robot + for robot_type in itertools.chain(Resource): + costs = self.construction_costs[robot_type] + # Don't build robots we can't afford + if not node.inventory.has_enough(costs): + continue + # Don't build robots when already producing more than enough + if robot_type != Resource.GEODE and all( + c[robot_type] <= node.robots[robot_type] + for c in self.construction_costs.values() + ): + continue + queue.append(do_build(node, robot_type)) + # Try not building anything + queue.append(do_build(node, None)) + + return max_geode + + +def solve(input: list[str]) -> int: + blueprints = [Blueprint.from_input(line) for line in input] + + TIME = 24 + + return sum( + i * blueprint.maximize_geodes(TIME) + for i, blueprint in enumerate(blueprints, start=1) + ) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 97222c32ab01394ed7ff29183059f3eb0cc88782 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 19 Dec 2022 12:20:49 +0100 Subject: [PATCH 350/479] 2022: d19: ex2: add input --- 2022/d19/ex2/input | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 2022/d19/ex2/input diff --git a/2022/d19/ex2/input b/2022/d19/ex2/input new file mode 100644 index 0000000..2c1044f --- /dev/null +++ b/2022/d19/ex2/input @@ -0,0 +1,30 @@ +Blueprint 1: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 12 clay. Each geode robot costs 4 ore and 19 obsidian. +Blueprint 2: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 11 clay. Each geode robot costs 4 ore and 12 obsidian. +Blueprint 3: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 18 clay. Each geode robot costs 2 ore and 11 obsidian. +Blueprint 4: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 15 clay. Each geode robot costs 4 ore and 20 obsidian. +Blueprint 5: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 16 clay. Each geode robot costs 4 ore and 17 obsidian. +Blueprint 6: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 19 clay. Each geode robot costs 2 ore and 12 obsidian. +Blueprint 7: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 9 clay. Each geode robot costs 2 ore and 10 obsidian. +Blueprint 8: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 5 clay. Each geode robot costs 3 ore and 7 obsidian. +Blueprint 9: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 11 clay. Each geode robot costs 4 ore and 8 obsidian. +Blueprint 10: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 16 clay. Each geode robot costs 2 ore and 15 obsidian. +Blueprint 11: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 20 clay. Each geode robot costs 2 ore and 19 obsidian. +Blueprint 12: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 16 clay. Each geode robot costs 3 ore and 20 obsidian. +Blueprint 13: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 20 clay. Each geode robot costs 3 ore and 14 obsidian. +Blueprint 14: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 4 ore and 20 clay. Each geode robot costs 2 ore and 15 obsidian. +Blueprint 15: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 4 ore and 15 clay. Each geode robot costs 3 ore and 12 obsidian. +Blueprint 16: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 17 clay. Each geode robot costs 3 ore and 19 obsidian. +Blueprint 17: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 14 clay. Each geode robot costs 4 ore and 9 obsidian. +Blueprint 18: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 6 clay. Each geode robot costs 3 ore and 16 obsidian. +Blueprint 19: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 6 clay. Each geode robot costs 2 ore and 14 obsidian. +Blueprint 20: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 4 ore and 11 clay. Each geode robot costs 3 ore and 15 obsidian. +Blueprint 21: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 18 clay. Each geode robot costs 4 ore and 19 obsidian. +Blueprint 22: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 15 clay. Each geode robot costs 2 ore and 20 obsidian. +Blueprint 23: Each ore robot costs 4 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 5 clay. Each geode robot costs 2 ore and 10 obsidian. +Blueprint 24: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 10 clay. Each geode robot costs 2 ore and 14 obsidian. +Blueprint 25: Each ore robot costs 4 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 7 clay. Each geode robot costs 4 ore and 13 obsidian. +Blueprint 26: Each ore robot costs 3 ore. Each clay robot costs 3 ore. Each obsidian robot costs 2 ore and 20 clay. Each geode robot costs 2 ore and 20 obsidian. +Blueprint 27: Each ore robot costs 2 ore. Each clay robot costs 3 ore. Each obsidian robot costs 3 ore and 18 clay. Each geode robot costs 2 ore and 19 obsidian. +Blueprint 28: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 3 ore and 10 clay. Each geode robot costs 2 ore and 7 obsidian. +Blueprint 29: Each ore robot costs 3 ore. Each clay robot costs 4 ore. Each obsidian robot costs 2 ore and 15 clay. Each geode robot costs 3 ore and 7 obsidian. +Blueprint 30: Each ore robot costs 2 ore. Each clay robot costs 4 ore. Each obsidian robot costs 4 ore and 20 clay. Each geode robot costs 4 ore and 18 obsidian. From 5cd4f7dfd7ca0e8bc0c34a67ed7fca8633790ced Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 19 Dec 2022 12:20:55 +0100 Subject: [PATCH 351/479] 2022: d19: ex2: add solution --- 2022/d19/ex2/ex2.py | 184 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100755 2022/d19/ex2/ex2.py diff --git a/2022/d19/ex2/ex2.py b/2022/d19/ex2/ex2.py new file mode 100755 index 0000000..778763d --- /dev/null +++ b/2022/d19/ex2/ex2.py @@ -0,0 +1,184 @@ +#!/usr/bin/env python + +import dataclasses +import enum +import itertools +import math +import sys +from collections import deque +from collections.abc import Iterable, Iterator, Mapping +from typing import NamedTuple, Optional, TypeVar + +T = TypeVar("T") + + +def grouper(iterable: Iterable[T], n: int) -> Iterator[tuple[T, ...]]: + "Collect data into non-overlapping fixed-length chunks or blocks" + args = [iter(iterable)] * n + return zip(*args, strict=True) + + +class Resource(str, enum.Enum): + GEODE = "geode" + OBSIDIAN = "obsidian" + CLAY = "clay" + ORE = "ore" + + +class ResourceCost(Mapping[Resource, int]): + _dict: dict[Resource, int] + _hash: Optional[int] + + def __init__(self, init: Mapping[Resource, int] = {}, /) -> None: + self._dict = {res: init.get(res, 0) for res in Resource} + self._hash = None + + assert all(self._dict[res] >= 0 for res in Resource) # Sanity check + + def __getitem__(self, key: Resource, /) -> int: + return self._dict[key] + + def __iter__(self) -> Iterator[Resource]: + return iter(Resource) # Always use same Resource iteration order + + def __len__(self) -> int: + return len(self._dict) + + def __hash__(self) -> int: + if self._hash is None: + self._hash = hash(tuple(sorted(self._dict))) + return self._hash + + def __add__(self, other): + if not isinstance(other, ResourceCost): + return NotImplemented + return ResourceCost({res: self[res] + other[res] for res in Resource}) + + def __sub__(self, other): + if not isinstance(other, ResourceCost): + return NotImplemented + return ResourceCost({res: self[res] - other[res] for res in Resource}) + + def __repr__(self) -> str: + return repr(self._dict) + + def has_enough(self, costs: "ResourceCost") -> bool: + return all(self[res] >= costs[res] for res in Resource) + + +@dataclasses.dataclass +class Blueprint: + construction_costs: dict[Resource, ResourceCost] + + @classmethod + def from_input(cls, input: str) -> "Blueprint": + assert input.startswith("Blueprint ") # Sanity check + + raw_costs = input.split(": ")[1].split(". ") + costs: dict[Resource, ResourceCost] = {} + for raw in map(str.split, raw_costs): + ressource = Resource(raw[1]) + costs[ressource] = ResourceCost( + { + Resource(r.removesuffix(".")): int(c) + for c, r in grouper((w for w in raw[4:] if w != "and"), 2) + } + ) + + return cls(costs) + + def maximize_geodes(self, run_time: int) -> int: + class QueueNode(NamedTuple): + time: int + robots: ResourceCost + inventory: ResourceCost + total_mined: ResourceCost + + def prune_queue(queue: Iterable[QueueNode]) -> deque[QueueNode]: + def priority_key(node: QueueNode) -> int: + MULTIPLIERS = { + Resource.GEODE: 1_000_000, + Resource.OBSIDIAN: 10_000, + Resource.CLAY: 100, + Resource.ORE: 1, + } + return sum( + node.total_mined[res] * mul for res, mul in MULTIPLIERS.items() + ) + + MAX_QUEUE = 10_000 # Chosen arbitrarily + return deque(sorted(queue, key=priority_key, reverse=True)[:MAX_QUEUE]) + + def do_build(node: QueueNode, robot_type: Optional[Resource]) -> QueueNode: + costs = ( + self.construction_costs[robot_type] + if robot_type is not None + else ResourceCost() + ) + assert node.inventory.has_enough(costs) # Sanity check + new_robots = node.robots + ( + ResourceCost({robot_type: 1}) + if robot_type is not None + else ResourceCost() + ) + new_inventory = node.inventory + node.robots - costs + new_total_mined = node.total_mined + node.robots + return QueueNode(node.time + 1, new_robots, new_inventory, new_total_mined) + + max_geode = 0 + + queue: deque[QueueNode] = deque( + # Starting conditions + [ + QueueNode( + 0, ResourceCost({Resource.ORE: 1}), ResourceCost(), ResourceCost() + ) + ] + ) + dfs_depth = 0 + while queue: + node = queue.popleft() + + if node.time > dfs_depth: + # An awful hack to reduce the search space and prioritize geodes + queue = prune_queue(queue) + dfs_depth = node.time + + if node.time == run_time: + max_geode = max(max_geode, node.total_mined[Resource.GEODE]) + continue + + # Try building a robot + for robot_type in itertools.chain(Resource): + costs = self.construction_costs[robot_type] + # Don't build robots we can't afford + if not node.inventory.has_enough(costs): + continue + # Don't build robots when already producing more than enough + if robot_type != Resource.GEODE and all( + c[robot_type] <= node.robots[robot_type] + for c in self.construction_costs.values() + ): + continue + queue.append(do_build(node, robot_type)) + # Try not building anything + queue.append(do_build(node, None)) + + return max_geode + + +def solve(input: list[str]) -> int: + blueprints = [Blueprint.from_input(line) for line in input] + + TIME = 32 + + return math.prod(blueprint.maximize_geodes(TIME) for blueprint in blueprints[:3]) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From c7ffb3be1036d814b468c511330ba21eb975495c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 20 Dec 2022 13:44:51 +0100 Subject: [PATCH 352/479] 2022: d20: ex1: add input --- 2022/d20/ex1/input | 5000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 5000 insertions(+) create mode 100644 2022/d20/ex1/input diff --git a/2022/d20/ex1/input b/2022/d20/ex1/input new file mode 100644 index 0000000..f9edce3 --- /dev/null +++ b/2022/d20/ex1/input @@ -0,0 +1,5000 @@ +3711 +-1434 +1793 +611 +9745 +6977 +7163 +8640 +-3210 +-6021 +-3404 +-6977 +-5746 +8756 +5559 +-9619 +-1866 +-9562 +7336 +-3121 +-2412 +-7053 +-6967 +-4095 +7454 +3949 +1055 +7965 +1308 +4022 +359 +-6990 +1006 +-8119 +-7148 +-5458 +-6618 +9992 +-3646 +1793 +4309 +-6088 +6522 +-5626 +773 +6529 +-5447 +7121 +63 +-7056 +-4580 +-5384 +-7206 +5015 +-5324 +2437 +-931 +-3531 +-5958 +-8531 +0 +9725 +3551 +9580 +9777 +4239 +-3800 +-3889 +4798 +1715 +-1807 +448 +-3838 +5468 +3435 +4854 +9925 +-2548 +-4662 +1641 +1823 +-3224 +359 +8642 +-8134 +8477 +397 +6050 +-6056 +-2329 +247 +2919 +-8241 +-8198 +-7070 +508 +3345 +-7737 +-3458 +-5900 +-2956 +9992 +-3929 +-1389 +7747 +5159 +-9927 +8393 +5146 +4737 +-7176 +8154 +477 +8966 +-8203 +-5948 +-1525 +-6351 +4007 +8372 +-8985 +388 +6133 +518 +1267 +9773 +2714 +4947 +2161 +1223 +-5259 +6322 +-5186 +3864 +-5344 +-2420 +-1242 +6960 +-2377 +8871 +1518 +-9880 +3367 +6834 +-3829 +7001 +941 +5185 +3002 +-3084 +-7070 +-4173 +9754 +900 +6195 +2130 +-5964 +-7878 +-3 +7151 +5948 +7665 +7895 +-9371 +327 +4869 +152 +-6958 +-6296 +8194 +8123 +7439 +-2254 +-16 +-751 +-6009 +-3955 +9470 +-7791 +4588 +-5378 +9495 +2220 +-1858 +1527 +1963 +9943 +-7271 +-8554 +4164 +152 +1492 +-8801 +-4645 +2536 +1122 +9611 +5725 +9810 +8110 +3892 +-1580 +7627 +1540 +4122 +-7754 +-2150 +9716 +7127 +9455 +-6339 +-5646 +-2025 +-2586 +5523 +2424 +-6795 +5478 +242 +9484 +-1920 +3024 +9282 +3932 +-7070 +-3920 +-7596 +227 +4513 +1143 +2130 +-2601 +1074 +-4291 +5726 +230 +8708 +3423 +-8941 +1027 +-3335 +2054 +-1598 +4935 +9076 +9098 +-9976 +-1600 +-9612 +-7150 +9448 +-3430 +6262 +-5112 +-9738 +8903 +6967 +3989 +7919 +-9361 +-8157 +2838 +6866 +9267 +-4897 +-8796 +-6670 +-2613 +997 +995 +6519 +-5600 +-1548 +8620 +-3014 +-1061 +3967 +192 +583 +-3798 +-2890 +-2239 +6047 +6233 +-5972 +1568 +875 +9710 +1915 +8620 +7033 +232 +3833 +-1292 +-5711 +-6597 +-715 +-4065 +-8022 +1581 +-7646 +3755 +7937 +1949 +-4269 +7803 +-5900 +-3000 +-2908 +8306 +-5777 +649 +-6533 +7804 +-1301 +-8806 +4138 +4022 +2923 +9501 +3746 +-1680 +1029 +-2401 +8457 +-3335 +1826 +9502 +2492 +-895 +-8447 +6751 +-4796 +-2519 +-2649 +5269 +5864 +-176 +-5903 +-9547 +7806 +-3982 +9102 +2374 +-8895 +5452 +-5065 +-6263 +6123 +4055 +9971 +-195 +959 +-2045 +-3237 +-9170 +-7621 +-1455 +-7843 +8085 +5801 +-646 +7119 +-1301 +301 +7729 +3904 +-4593 +7799 +4339 +7264 +611 +2734 +6154 +3862 +2713 +-9613 +-866 +3188 +9082 +-2484 +6786 +-522 +8062 +-234 +-7845 +-9660 +1297 +5789 +-2066 +7857 +-933 +-2178 +7206 +-6504 +4055 +-4807 +-8287 +-8065 +3043 +-9367 +-7066 +2888 +-547 +-7988 +3681 +2135 +-7083 +-4887 +9593 +629 +-9389 +4778 +-8152 +4703 +4526 +5965 +5523 +-970 +1699 +-4042 +-650 +-8718 +-2099 +-2156 +-4250 +4823 +-1267 +1054 +9660 +-1510 +9011 +6465 +-8139 +-769 +4040 +3500 +3360 +-7299 +3766 +635 +-7621 +5493 +8574 +-7727 +-4625 +-2266 +1380 +7632 +-4705 +6430 +8313 +2205 +4779 +-9803 +6928 +9110 +-6164 +-6503 +6285 +-4434 +-38 +4934 +-5710 +7322 +-8140 +-5492 +-1237 +-8029 +-281 +274 +6660 +7603 +-6250 +-107 +2023 +553 +-1339 +6742 +-9890 +3069 +8624 +-8671 +4634 +506 +-5903 +7875 +-8332 +-8603 +-9607 +-433 +-7442 +-5899 +-8164 +4245 +-811 +-9127 +-7596 +-4576 +-9453 +-6504 +-2406 +7283 +5984 +7702 +2991 +-8341 +-5793 +-2952 +-9463 +867 +1082 +8990 +4741 +-6387 +-67 +3772 +3932 +2446 +9514 +4070 +7338 +-4634 +-8774 +579 +-7621 +-3342 +9672 +4092 +-422 +-6056 +4502 +-281 +-2633 +1616 +7322 +1641 +-1866 +2188 +-9607 +-4265 +-3395 +2112 +7505 +-3274 +3926 +5881 +192 +9355 +-8975 +-9799 +5615 +4961 +5862 +-8966 +9161 +-6568 +7096 +-9547 +5168 +4871 +5105 +7509 +-405 +8359 +-61 +5177 +-9230 +4772 +-4277 +8922 +6834 +-1224 +-8463 +-9651 +7449 +-3979 +2919 +5817 +-168 +-6770 +-2367 +2220 +-2373 +-1798 +-6918 +-2319 +-9646 +3677 +3783 +-824 +-5958 +991 +9581 +626 +-5542 +-168 +-4514 +8471 +9315 +-5256 +8625 +1951 +8054 +1467 +-1692 +7030 +-9811 +4351 +-4503 +-3983 +3625 +5593 +9576 +7627 +-2095 +4053 +-458 +-522 +-1838 +-6086 +-7957 +-3073 +-7032 +-2301 +-1879 +-8940 +-3929 +-5143 +9198 +5136 +-3503 +-221 +569 +3258 +8969 +5137 +4466 +1198 +-1875 +-7001 +-8401 +-9628 +-4376 +6368 +6899 +-6998 +-6268 +-5578 +850 +7758 +-2836 +-3617 +5199 +5857 +-915 +-4008 +9964 +-2042 +-4576 +702 +4350 +-7378 +388 +-5676 +-2485 +2237 +-8245 +-3345 +3039 +-9985 +626 +-6423 +9599 +-8799 +1249 +-9322 +-6598 +5068 +-3124 +-4186 +1393 +7608 +-4406 +-7980 +-588 +-6723 +28 +-6056 +1908 +-7477 +-2009 +-4253 +8781 +7499 +4501 +1728 +5461 +604 +-735 +9829 +-2972 +9601 +-7072 +6440 +-9937 +-3971 +6880 +2082 +9716 +6638 +1172 +14 +5047 +-7490 +-9798 +4022 +6741 +5366 +-8177 +4941 +1765 +9473 +-8059 +-9316 +9990 +-4018 +-6433 +-7806 +-3095 +-2871 +3495 +-7505 +9062 +-6506 +4805 +6931 +9992 +-5401 +5894 +5628 +2473 +1826 +-257 +-5631 +1538 +5608 +-7503 +6411 +-9362 +-3265 +-6574 +-4470 +-7029 +1915 +-9432 +-1257 +1948 +1131 +-3303 +5011 +517 +-6743 +-599 +-6787 +-359 +9250 +-7051 +993 +5770 +9742 +-1802 +2514 +5247 +8838 +-3919 +-5189 +8633 +1211 +2514 +-2848 +415 +7978 +-8183 +6431 +4257 +-3348 +2552 +4703 +372 +73 +2872 +9685 +7138 +-1985 +479 +8810 +7952 +-8495 +2764 +-945 +3249 +1141 +-3655 +-1048 +1503 +-5303 +518 +3755 +-5365 +-7401 +-5034 +7222 +7108 +1213 +5847 +-8774 +7389 +7066 +3532 +8243 +-8940 +-5596 +-2759 +-396 +262 +2765 +6705 +-1114 +2942 +8483 +7333 +639 +8388 +-2879 +6452 +-1414 +3180 +-9251 +-8615 +7207 +323 +5863 +9321 +8551 +415 +3285 +9107 +-2295 +-4844 +1194 +3020 +7871 +6974 +-3971 +-1879 +730 +6215 +5238 +2375 +-2887 +-7060 +3696 +2288 +7999 +1008 +-2604 +-12 +1572 +-9604 +-6650 +4753 +5562 +-8574 +6115 +-5266 +-3122 +4575 +6406 +-9340 +-3121 +5 +-7167 +2984 +5484 +6640 +-2095 +-582 +-1572 +-3949 +-3198 +-2734 +-678 +-7252 +-931 +5301 +357 +9194 +-3664 +3194 +1949 +-409 +3983 +5376 +691 +7083 +-4065 +-3167 +-1577 +7589 +6096 +-2066 +9945 +423 +-1591 +7136 +3371 +-8023 +8236 +-2649 +584 +-9400 +4925 +3767 +-330 +5121 +-7338 +-4365 +8840 +6691 +1018 +1092 +5364 +7778 +-690 +-176 +5411 +5873 +4854 +-8838 +-4143 +-4521 +-1137 +-9568 +3975 +-2602 +-7136 +676 +626 +4196 +5565 +3024 +1623 +-1081 +-8027 +-8253 +-8941 +7800 +4077 +-4431 +8085 +2124 +-2527 +8478 +4817 +-6855 +-5003 +9819 +-4330 +5057 +7358 +915 +-5578 +9566 +7048 +1831 +-3216 +-9236 +-4071 +-7120 +8054 +9425 +2345 +1313 +6317 +7739 +-8791 +-7157 +3937 +2519 +-4901 +1980 +644 +2935 +7185 +4961 +5301 +9346 +6224 +-990 +4575 +-1129 +-633 +773 +1058 +7851 +3763 +1464 +2571 +-9677 +-5903 +-9733 +-9637 +-6130 +-906 +-7169 +-7492 +7623 +5015 +8791 +-5596 +997 +1729 +5803 +-9880 +-1827 +-7477 +-3695 +-1855 +-5844 +951 +-1308 +-9072 +-2121 +851 +889 +-4721 +-1702 +-3080 +3897 +3588 +4934 +-9203 +1391 +1157 +5174 +8574 +-5977 +-5997 +7825 +-215 +675 +-5499 +433 +2487 +-1054 +-8648 +6515 +8334 +6210 +-9425 +-7491 +5792 +1169 +9664 +-2879 +-6345 +-477 +-6811 +9285 +-4518 +-4570 +-4393 +-4295 +-4784 +-7331 +-5499 +7942 +-8716 +-8666 +3618 +-3329 +-5269 +5158 +-3111 +1364 +5881 +946 +-5567 +-4697 +-3771 +-4498 +9075 +6550 +6940 +4231 +-6577 +-3060 +-2420 +522 +7435 +190 +6505 +-3623 +-7004 +-781 +-3727 +-1146 +5944 +8825 +-1895 +-4140 +9279 +-3614 +7233 +7233 +-4876 +891 +-9660 +-7910 +5322 +-7419 +-8810 +-1475 +5454 +1586 +-6445 +-7575 +-6967 +-3111 +-719 +691 +2533 +-8488 +8141 +5978 +-7069 +-7577 +-7817 +-2433 +-234 +-5006 +-4003 +-2207 +3983 +-9447 +5253 +7489 +-8276 +6165 +9979 +-761 +-1920 +413 +1216 +7524 +3485 +5748 +1027 +-3944 +9178 +-7503 +-5183 +-5837 +155 +-2172 +-5760 +-1392 +9780 +8117 +2990 +-8109 +-957 +2716 +9952 +7231 +-7349 +-4267 +-7922 +4495 +-4294 +-3036 +-287 +-9228 +7448 +928 +-7979 +5085 +-1548 +4251 +-2890 +-2962 +6705 +1865 +7988 +3426 +102 +-3580 +-7268 +-4071 +-9380 +-2991 +-1534 +6295 +-5009 +-9790 +3014 +2060 +4993 +601 +232 +613 +2734 +-40 +-2889 +9221 +4125 +6276 +2558 +5630 +2566 +-1528 +-4939 +5724 +2481 +-1730 +9748 +-1866 +3285 +5422 +-4484 +6903 +-6205 +8041 +954 +-4355 +-7368 +47 +4682 +-1781 +2929 +-178 +-6152 +-4825 +-1403 +7060 +8230 +-657 +5159 +-2642 +9824 +-8739 +7726 +3024 +1888 +-4570 +-654 +8662 +-5534 +9430 +-2901 +4911 +9268 +6763 +-8092 +5680 +6795 +-6934 +8951 +2452 +3868 +6988 +1226 +9773 +-2945 +-1756 +31 +946 +8195 +3345 +4145 +-2351 +5770 +1478 +7702 +-2846 +-8432 +-5033 +388 +3749 +4955 +-811 +-648 +-2751 +-6161 +-6176 +-4548 +-3406 +-810 +9895 +382 +2810 +-9821 +-1580 +-3165 +9123 +-8168 +4994 +-9169 +-3531 +6951 +-8312 +-3920 +-8401 +4685 +-7347 +-4143 +-7456 +-3073 +-1941 +-2991 +4869 +-6238 +6053 +-3146 +5455 +-6707 +1663 +-114 +-7397 +9291 +1172 +-8819 +5199 +6567 +7041 +7861 +4052 +-7495 +2556 +901 +-4955 +7329 +-5239 +8633 +9411 +5767 +-777 +1517 +-5687 +8028 +-1506 +1432 +-8671 +-9602 +-9926 +6289 +2770 +3899 +-1985 +-6435 +1308 +4040 +1702 +6436 +9203 +4439 +4933 +-5098 +6578 +-2578 +-1598 +-8105 +1420 +-4571 +9726 +6471 +-3754 +2803 +-2198 +-7789 +4853 +-9174 +5407 +9303 +8929 +-5515 +5213 +8664 +1607 +-2957 +1508 +5715 +520 +7462 +-1092 +-9948 +2012 +7736 +83 +-7140 +9862 +7104 +-6979 +-4954 +-5495 +2038 +-7918 +-4301 +-6187 +-8581 +6051 +-427 +-5738 +-578 +-817 +7352 +7795 +-8735 +7438 +-7993 +-8979 +-4552 +4229 +-8688 +1793 +-5668 +1564 +-3500 +-6301 +1308 +5024 +-8677 +-4795 +8150 +-7918 +-9138 +-1180 +9949 +-8946 +7380 +9611 +-7456 +4467 +7861 +-6337 +6298 +704 +-9424 +-2188 +7978 +8708 +-3897 +-1362 +-6442 +791 +-2555 +-6936 +-6423 +7779 +247 +-3367 +-7323 +572 +8727 +5136 +3959 +6906 +-7768 +-7490 +-5764 +-3187 +8153 +-5600 +8718 +-2676 +9779 +3775 +4165 +-9733 +2578 +-5150 +3895 +-2995 +-4395 +-1078 +-5606 +-106 +-7329 +7919 +-5115 +-4576 +-1007 +-7252 +-2660 +-4746 +8157 +3002 +3461 +-2312 +3932 +-1453 +1116 +4999 +-4006 +-5515 +-8769 +8151 +5342 +-1580 +-8360 +7336 +6060 +-844 +-6322 +9271 +-1793 +3328 +9739 +-7769 +-4358 +8013 +5338 +-1836 +-1932 +-8203 +2327 +4772 +5916 +-6560 +7310 +-4777 +-1817 +-3026 +-9075 +-6937 +-2349 +-5038 +7001 +-2188 +-8514 +-8613 +5247 +-6890 +-6351 +-3838 +3862 +959 +8729 +1297 +-1434 +3892 +2047 +4772 +-7940 +-2907 +8729 +-3819 +-8460 +-4148 +-4066 +-2949 +5188 +9412 +-2941 +-6577 +6215 +-3020 +4706 +1032 +-2383 +-2734 +-5579 +2679 +8955 +-3422 +-2527 +7233 +785 +-8288 +4941 +-7461 +-7259 +456 +-8232 +-8613 +-6083 +1704 +-533 +-234 +7362 +7963 +-4624 +9350 +9198 +946 +-8642 +4059 +3193 +5086 +5931 +8908 +-7621 +2815 +-741 +1908 +8890 +-7620 +1459 +6457 +3098 +5798 +-346 +9476 +-3788 +863 +3556 +-8979 +-6777 +9094 +-8241 +-4222 +1875 +1308 +-9602 +7322 +2813 +1263 +9743 +2222 +-2897 +186 +9558 +8959 +4196 +4176 +-7421 +7865 +-3310 +8362 +-8613 +-9418 +-4799 +4309 +3833 +-2002 +8791 +8850 +9209 +7499 +-8241 +227 +-9930 +4991 +-6118 +-7477 +-715 +6846 +8163 +-405 +639 +830 +4358 +5483 +-8983 +-9280 +4070 +-5828 +8089 +-5130 +-8810 +994 +2356 +-6221 +-7004 +4040 +2643 +639 +-1866 +-6144 +8729 +9640 +2229 +4235 +-9832 +3328 +4302 +-1901 +8797 +6283 +8117 +-6187 +6379 +-2329 +3047 +-5100 +-7039 +4432 +-2977 +8236 +725 +-3940 +-7074 +5675 +-127 +-8878 +3756 +-4256 +-9781 +-4558 +1413 +-1584 +2923 +3914 +7147 +7898 +7352 +4653 +2716 +-2646 +9501 +2693 +306 +6686 +6662 +275 +1164 +9551 +4809 +-1166 +7722 +-5783 +-1873 +-9438 +4060 +4964 +8362 +2887 +-3940 +4197 +-7487 +-3368 +-6171 +-5689 +-6376 +2061 +-7964 +-2173 +-9072 +-2135 +-2431 +2661 +-8884 +-3187 +-3510 +4696 +9542 +-2736 +8965 +361 +5894 +8633 +8613 +-8133 +-2879 +-7268 +6414 +472 +4374 +-1616 +9391 +-5978 +8220 +-7802 +-3430 +5602 +-2340 +6895 +-2646 +7340 +107 +132 +1517 +7864 +2965 +-1605 +-110 +-6702 +-2420 +-8328 +-190 +-6763 +6352 +8838 +4350 +6964 +-2613 +-5781 +9831 +1938 +1488 +1855 +-2949 +-5636 +1622 +-8554 +-6176 +2979 +-653 +5301 +-2144 +5602 +-8316 +-8354 +-817 +-3630 +-7349 +-5499 +-5802 +6500 +6893 +-1159 +8479 +-2002 +9323 +9266 +-3913 +3346 +9689 +1321 +2558 +-1544 +7047 +-1339 +8322 +-9569 +-871 +-3874 +6131 +3755 +4839 +528 +-4204 +752 +-6077 +7576 +-1045 +7089 +3607 +9492 +7307 +-313 +-4180 +-1160 +-3207 +-2103 +-6985 +959 +-7866 +-6754 +4712 +-1075 +8241 +9902 +1436 +3711 +-2977 +-3892 +-797 +-9172 +-3459 +-8232 +5843 +4467 +3975 +5879 +4063 +9368 +-6155 +-3247 +6558 +-135 +-8502 +-477 +7083 +-4005 +-5114 +-1755 +-8152 +5694 +4325 +3436 +-3618 +2813 +958 +-2412 +-8794 +-5081 +6283 +-9030 +5614 +-7782 +-565 +-8149 +-8951 +5175 +5953 +7645 +-4826 +-5308 +6622 +8943 +-2938 +3367 +9211 +6032 +-4557 +-3387 +-907 +-2430 +4954 +1793 +5628 +1082 +802 +3895 +2580 +-8234 +8441 +6922 +8542 +-3113 +-8637 +967 +716 +-7922 +5300 +8591 +2166 +7623 +-6808 +7972 +-352 +-2300 +-9504 +-7517 +-5075 +-9860 +1211 +4060 +-6032 +-3681 +1622 +-6721 +-682 +8062 +-6863 +-7887 +-6064 +628 +3655 +6701 +-7062 +-9087 +277 +7999 +-7752 +-1146 +-5231 +-1085 +5949 +-6936 +-2145 +8143 +7645 +-2950 +487 +1545 +1869 +644 +8545 +-7474 +-2000 +-6263 +9780 +-7036 +-2411 +-7168 +1850 +7438 +7262 +-7496 +-220 +-533 +-479 +5533 +-608 +9674 +-9293 +7025 +-7095 +-4817 +-5576 +9153 +806 +2449 +6917 +-6775 +-660 +-7557 +2991 +-4429 +9016 +-1180 +6302 +273 +-4345 +-3834 +-1906 +2112 +-6212 +4007 +-4470 +9113 +-5014 +2229 +-2932 +3556 +4485 +-7576 +-5948 +4590 +2233 +2863 +-287 +-4003 +-755 +-403 +-6405 +6060 +8959 +-4838 +8542 +451 +-9672 +-3945 +-558 +-7749 +1601 +-8366 +-5948 +-6254 +39 +9074 +4744 +-8902 +7417 +3622 +-9992 +-7554 +4716 +1656 +5159 +6357 +-5841 +6505 +2423 +-2698 +-2158 +-4620 +6534 +4974 +-9850 +7907 +5801 +-8139 +9608 +-7577 +-4187 +-5570 +-8215 +8954 +8372 +360 +3959 +2345 +-3704 +7468 +-5020 +5177 +-7190 +7524 +-3550 +-7623 +6446 +-6391 +-6825 +-8839 +-5170 +-7494 +-9758 +6238 +7207 +-3040 +1029 +-4408 +9329 +-5948 +8426 +5816 +6906 +6470 +7767 +-8469 +7361 +-1143 +-5375 +-8240 +-3650 +1527 +4497 +-5609 +1908 +-3535 +-3217 +3047 +-220 +-650 +4181 +3937 +5420 +4848 +-898 +1010 +-7881 +-6337 +-2855 +2566 +1214 +5965 +1231 +5314 +8349 +-5545 +-9122 +2664 +9161 +-391 +-4283 +4736 +2276 +3028 +-5188 +7980 +-3036 +-6295 +5288 +-4550 +-8187 +439 +-2936 +-4736 +-7031 +-4395 +-2364 +-7351 +2375 +7800 +-915 +4830 +-6033 +-7933 +8608 +-9429 +1434 +9930 +-4902 +2130 +1909 +1331 +6352 +5587 +9930 +-4736 +-3318 +2919 +9074 +-930 +3941 +-2698 +-1403 +-7737 +4388 +-8833 +-3409 +4270 +-2209 +4291 +5736 +-715 +-9515 +-2239 +-7557 +9492 +-9353 +9075 +-3210 +8271 +-8173 +9949 +3625 +9358 +2261 +-3718 +-1929 +-3618 +1154 +953 +807 +8908 +-2107 +7958 +-3932 +-3036 +-1080 +2979 +-4214 +3814 +-7258 +1499 +5625 +-6319 +4924 +3347 +8243 +-6647 +-6224 +-6703 +520 +43 +-167 +-2371 +-8324 +5110 +-7776 +-1231 +-5208 +-8637 +6766 +2868 +1973 +3711 +3755 +5001 +-950 +3745 +-4733 +423 +2772 +5879 +7519 +-6609 +4934 +436 +-9374 +-8251 +-3960 +-9546 +3024 +4938 +8149 +-5117 +5633 +-2145 +-5386 +5105 +-5984 +-1901 +-5474 +-8025 +-2252 +9515 +8463 +-1732 +-2329 +8890 +1771 +9328 +-2055 +-9811 +-4256 +-3665 +1586 +3478 +7715 +6890 +-3399 +-6469 +370 +4096 +-2600 +-1814 +2251 +-650 +-1233 +-1161 +-1129 +4697 +8631 +-5222 +-9094 +-542 +8372 +-780 +2145 +3780 +1711 +1572 +5047 +8128 +6623 +-6337 +-5834 +-3732 +5350 +3711 +-4193 +-3368 +-9222 +1569 +-4442 +-1435 +3301 +-729 +-3080 +2619 +-8748 +-3332 +5711 +-3320 +2666 +4597 +-6284 +-1093 +7417 +1752 +-2594 +8567 +-1120 +-6944 +-2017 +9082 +2923 +-5826 +-9911 +-5378 +-9792 +6069 +5466 +-1965 +3114 +-8119 +-6646 +5417 +-7994 +8123 +-673 +-9587 +3543 +2589 +-7870 +-9234 +3017 +-8353 +2334 +-1901 +3077 +534 +8141 +-1182 +9574 +-7204 +6395 +-7045 +6195 +-6989 +-7672 +6003 +-4186 +5582 +7821 +-4574 +-2207 +1622 +8871 +9524 +-8405 +4542 +-6345 +242 +-714 +9107 +8268 +-5949 +4461 +6246 +9919 +7915 +-8774 +6125 +-5086 +538 +-5576 +4871 +6860 +5448 +-2441 +2580 +6271 +4956 +1752 +914 +-5674 +-8769 +-2380 +-4071 +-904 +-6494 +6389 +6803 +2734 +-4498 +-3465 +-5033 +-8775 +-8762 +6997 +4167 +-4373 +-4576 +8162 +-3335 +2820 +8131 +5433 +-3523 +-7007 +6838 +-6322 +2629 +4871 +410 +-7183 +-4704 +7533 +7811 +2846 +-8900 +-100 +256 +1195 +-2941 +-5500 +-2464 +-7054 +6763 +2242 +-7181 +7498 +4579 +4057 +-1755 +598 +-9175 +8969 +-6861 +2390 +3025 +9110 +7125 +-6981 +188 +1540 +-9285 +5767 +-2449 +5322 +6931 +-6169 +-9993 +4197 +-3137 +1023 +9198 +541 +-7206 +-3881 +-8590 +-3920 +-7195 +2936 +5571 +7357 +-2762 +4133 +6666 +-5533 +-1348 +2196 +-7205 +6516 +9091 +4284 +-2301 +-1703 +4531 +9663 +-5671 +8875 +5557 +-8853 +3010 +7194 +8495 +4059 +7608 +6860 +-3618 +-4817 +-4746 +-587 +-3859 +4325 +-7401 +-6954 +-4521 +-4434 +-6104 +-9332 +-8786 +4645 +-3046 +4657 +-8469 +-1029 +-9524 +9618 +-7342 +-4630 +6788 +-3654 +1217 +-1508 +7795 +-1538 +-8312 +-1120 +1998 +-592 +2437 +6283 +-7983 +-8975 +-3036 +-9966 +5230 +2846 +7489 +3209 +7409 +-1146 +409 +2155 +-6112 +2449 +7149 +1329 +-2107 +-2566 +-8379 +4055 +-8095 +-8501 +1973 +6311 +3401 +9205 +-4526 +5131 +-3571 +5166 +-2343 +3995 +473 +-2761 +-650 +-8800 +-518 +8478 +4057 +3589 +-8341 +-3516 +-2857 +-4299 +-4453 +-8707 +7126 +7871 +8617 +6951 +1616 +9419 +-2936 +-2830 +5247 +8246 +3068 +-8857 +619 +-4148 +-1671 +-7225 +2728 +1634 +-3571 +3932 +537 +7664 +-2909 +-3800 +5159 +860 +-3512 +-3920 +-2465 +-9509 +-5113 +3904 +-4578 +-9127 +-1728 +-4723 +-9168 +9581 +5131 +-1941 +6446 +-4217 +9664 +7469 +-8232 +-3020 +9123 +-8645 +-3945 +9171 +-5911 +9486 +-2439 +9507 +2043 +-7798 +-7075 +-1423 +9277 +2166 +-9687 +-1633 +9328 +-9408 +-8369 +433 +7104 +-2938 +1559 +4031 +-4198 +5979 +-4133 +4741 +-1551 +1353 +-1862 +-5933 +7182 +-1165 +-8022 +5769 +6813 +-8025 +-4434 +2395 +5146 +5198 +-9599 +8893 +8262 +-7215 +-6913 +-1340 +-6440 +2398 +-1200 +7524 +-2312 +-5765 +6544 +-8288 +991 +4830 +3163 +1003 +6134 +-5392 +-1357 +-7066 +3893 +-1895 +-3339 +7736 +8626 +5853 +-6612 +7338 +8162 +6818 +-8803 +-4281 +-5225 +-7338 +-3502 +9162 +-9241 +9953 +5131 +-2890 +952 +-1807 +1283 +4598 +4712 +3783 +-7005 +8959 +-4733 +-9182 +-5578 +-3762 +9551 +-7893 +7450 +6625 +-6646 +1973 +3947 +-7119 +2519 +-6703 +2229 +-5364 +50 +8851 +8939 +-8783 +-2290 +643 +6226 +-5118 +7454 +-1339 +8708 +155 +5362 +8047 +-8460 +3824 +368 +-6965 +8867 +-1307 +4278 +1081 +-5529 +7592 +6414 +-1746 +-6641 +-8615 +9526 +7850 +2975 +1214 +-7266 +1152 +-8198 +1709 +-3617 +1425 +7628 +-5134 +7700 +5482 +5695 +168 +7188 +5174 +-4843 +5255 +518 +2700 +-6937 +-2887 +9321 +-3650 +-6854 +4593 +9 +5152 +480 +3703 +-1715 +6795 +-9719 +-4287 +7937 +-2294 +1323 +-2890 +7589 +4845 +4125 +-6913 +-2356 +-6927 +4040 +7067 +-1616 +4991 +-6537 +-1280 +7839 +6563 +-5760 +-1766 +6457 +-7474 +5439 +-6071 +-2705 +-7253 +-4164 +-2500 +403 +-5848 +-3856 +-9992 +-7626 +-6402 +5723 +1284 +-4348 +-2114 +-6032 +-3 +-5416 +4169 +-662 +1468 +4693 +7841 +-2769 +-6751 +4374 +7389 +1883 +6340 +6810 +8289 +3285 +-8211 +-167 +1796 +9945 +-9524 +-9017 +-4255 +7264 +3503 +-1526 +2928 +8875 +-6763 +-4083 +5863 +8834 +5621 +8255 +-2158 +-7769 +-3717 +4901 +1538 +-1434 +8472 +-5598 +-1261 +5675 +-754 +-931 +-1901 +-7157 +6669 +-3863 +-1438 +-664 +-6124 +598 +-9003 +6166 +-3982 +-8594 +-2845 +5794 +5777 +-7119 +-1588 +5767 +-4003 +1531 +7322 +-3597 +-9055 +-2693 +-2058 +-167 +1659 +4994 +-6157 +3135 +8650 +6220 +-3913 +-6056 +5259 +7231 +-6255 +5338 +5187 +8141 +-120 +6504 +-5344 +2047 +-3320 +-8460 +3601 +3146 +4270 +-8320 +-1281 +-811 +9000 +3214 +8782 +3501 +-2271 +6033 +4988 +8709 +6515 +5789 +2338 +2152 +8514 +-3982 +1118 +7722 +3914 +-3758 +1761 +1284 +5219 +-5122 +-1838 +469 +8922 +-573 +-1176 +1604 +1898 +-6004 +7937 +946 +-4073 +-1269 +7336 +614 +-2682 +-7762 +5772 +8469 +-8060 +-9560 +3525 +-8267 +-2290 +6290 +3168 +-1866 +7087 +-1598 +-9598 +691 +3209 +-7582 +2480 +-2957 +4883 +-6918 +7976 +-4909 +1254 +5553 +7045 +3859 +1722 +-6531 +3812 +-7621 +4079 +8469 +-3634 +2473 +5227 +7107 +1860 +2645 +-2438 +-9280 +7479 +-7211 +4265 +-4160 +-2786 +-4710 +-6715 +1223 +-8126 +4131 +-1813 +-3427 +2127 +670 +-8035 +-239 +-4981 +-5324 +-6034 +5878 +373 +-7190 +626 +-22 +-787 +5019 +6240 +-9743 +2713 +67 +-3618 +-7955 +3247 +1761 +4961 +-2816 +2651 +-6263 +6573 +-3003 +-2916 +7722 +-1671 +-795 +7744 +6905 +-6131 +5301 +5010 +9177 +-9865 +-4300 +4031 +3464 +-6336 +-3719 +3608 +5159 +-6726 +2249 +-3830 +469 +-6086 +7014 +4604 +-580 +5963 +5712 +7170 +4087 +-4010 +7126 +-8848 +-6064 +-301 +-5902 +4778 +9222 +-3073 +8966 +3755 +-2718 +9517 +3371 +-6361 +-5823 +-5505 +9916 +4070 +-4737 +1531 +-8308 +-3571 +-1358 +2647 +-1724 +8741 +-6100 +-4690 +377 +-7146 +-7534 +-8811 +5259 +-8401 +6380 +-6185 +-6360 +3433 +-5500 +8430 +5094 +-2528 +8430 +-3570 +-4707 +-8325 +-6003 +-1397 +-728 +-3897 +-6658 +-2092 +-327 +-1984 +8470 +-443 +-1634 +2753 +-4145 +-7519 +4234 +-9899 +4187 +1908 +7894 +2533 +-1176 +2425 +537 +-5595 +4060 +-5490 +1143 +3745 +-4360 +-3688 +3401 +6889 +-2419 +5531 +-547 +-7342 +2923 +5768 +1376 +4218 +2311 +8533 +1376 +-9373 +1908 +4308 +-5868 +-7164 +6257 +3724 +7865 +4513 +663 +1356 +8542 +4370 +9277 +2944 +8922 +-8175 +6229 +7956 +-3329 +990 +-5721 +6544 +-5600 +-6034 +-7294 +6685 +9139 +2896 +1058 +3946 +8867 +5602 +-2971 +-2559 +1826 +-3284 +-1634 +7801 +935 +-4849 +-433 +8277 +-6979 +-4969 +-6671 +-6856 +-494 +-1580 +-1650 +-4152 +-8479 +1603 +-7935 +2611 +-1722 +-5828 +-7620 +-8946 +-8503 +5102 +4924 +-1696 +1304 +965 +-7001 +-7626 +-481 +-2692 +9266 +-8157 +7627 +-1428 +8470 +-4699 +-2025 +-7671 +9161 +-8223 +9787 +5455 +5406 +6469 +-9623 +397 +1392 +3235 +-9334 +1526 +-7079 +-8386 +-7554 +-8552 +-4066 +-4173 +6491 +-2830 +-7169 +-9470 +5241 +1320 +4475 +1549 +3663 +7499 +285 +-3187 +5950 +7880 +5425 +6290 +-5341 +-2294 +-2211 +6874 +1496 +-3550 +-8098 +-1497 +-4825 +244 +6046 +-8990 +5748 +-2577 +2047 +-2367 +-4738 +-3859 +9728 +-6940 +4934 +6976 +-613 +-3787 +5448 +5151 +1577 +-610 +1887 +1141 +-7215 +9350 +-6039 +233 +-4032 +752 +-6626 +-7298 +8154 +5046 +-3435 +410 +-205 +8084 +1482 +-567 +-5146 +2195 +-1616 +-9568 +-1932 +8123 +-2577 +6457 +-5534 +-9613 +1807 +7327 +8326 +-9821 +-3317 +4474 +6903 +5858 +7628 +2451 +-9216 +4054 +-8360 +3285 +-9167 +6677 +6616 +2388 +-9814 +1792 +-2698 +1066 +3631 +-9798 +-1029 +-4472 +9146 +-3913 +9184 +-1012 +-329 +-5072 +6397 +-6086 +9384 +-9429 +9668 +-8345 +9925 +5668 +-1072 +1331 +7795 +2607 +7207 +-409 +8709 +1872 +-474 +8430 +9382 +4041 +-2452 +-1321 +-3514 +-4313 +-8611 +7966 +3646 +-475 +519 +9502 +-7020 +2859 +-5680 +-5534 +4422 +9234 +806 +-1340 +4359 +2797 +-7003 +-7446 +-5524 +-6757 +-5527 +-2845 +-6225 +-7372 +-2706 +3600 +6084 +-6990 +7162 +-6463 +5947 +-6839 +9393 +3123 +7712 +-9115 +-1123 +5136 +-9797 +-3232 +-2011 +7475 +1883 +472 +9346 +-5920 +-2689 +4245 +5487 +-7532 +-2104 +4363 +-4576 +5725 +-38 +9919 +-3170 +3167 +3813 +-8637 +2863 +-4169 +2344 +-6671 +-7458 +7944 +-6070 +5953 +-3387 +6412 +5411 +-2163 +7001 +8345 +-8359 +9917 +3030 +8362 +-3503 +-8662 +3443 +-1110 +977 +8875 +-2534 +-1029 +-5655 +-8343 +5298 +-6490 +3532 +1726 +-4936 +-7225 +-933 +-5982 +9410 +-7010 +-2295 +-1328 +-7150 +-5851 +1957 +-5305 +-8407 +-4053 +3030 +9112 +-4985 +951 +3980 +-5868 +769 +6853 +-5005 +-1887 +-1368 +1354 +8595 +-3544 +-9491 +2620 +-1363 +6029 +-1077 +2868 +1792 +608 +2222 +-1566 +-2250 +4991 +-6997 +9627 +-2085 +4162 +1635 +6411 +2075 +5777 +3755 +-2957 +-5324 +-7051 +5803 +1297 +-8539 +-6268 +2393 +3618 +-9088 +2543 +1614 +3179 +-2580 +6889 +-6258 +-6816 +1031 +-7401 +4166 +791 +5658 +9780 +-8274 +2010 +7739 +4559 +7438 +-7629 +-8302 +5158 +-2480 +-8152 +7406 +102 +7185 +-2453 +-8276 +7848 +1988 +-6575 +-5983 +7999 +2776 +635 +-931 +5980 +-7074 +-4219 +-9930 +-485 +-3434 +-4939 +7942 +-1771 +4142 +-5492 +2229 +7903 +5777 +705 +-3096 +2628 +-6433 +9 +8781 +6347 +-4818 +-1714 +-4477 +5203 +-5401 +-4347 +-4119 +4712 +1194 +-144 +-4588 +-8469 +-7993 +-7413 +-3052 +4991 +-5887 +-5397 +-1563 +-5308 +-3198 +-8715 +7937 +-9481 +5878 +4399 +1887 +-5114 +-9811 +-2145 +-8784 +-6393 +-2971 +1095 +-7974 +-9086 +-7544 +-6573 +787 +5910 +6660 +-365 +8141 +114 +7389 +-4337 +3525 +-2689 +4379 +-2871 +-8268 +8735 +6919 +7549 +-7761 +5087 +2668 +-4217 +-8774 +-8409 +6745 +1449 +1662 +-7558 +-8671 +-9414 +-3750 +-561 +-1241 +4689 +7931 +-4065 +5166 +-3274 +6673 +8352 +-4688 +7915 +-3184 +-4741 +9572 +-5050 +-5034 +3532 +-2673 +3883 +-7511 +-7190 +-60 +-8766 +7163 +3898 +6651 +-555 +1726 +-9646 +-811 +-5002 +-2815 +1622 +-2620 +-2368 +-9447 +8756 +-9952 +-5853 +8528 +3145 +-5680 +-6095 +-5515 +941 +7245 +4929 +-239 +-5846 +6410 +476 +1936 +8842 +4469 +-3571 +-7265 +8626 +-3483 +6123 +1908 +4479 +7106 +1196 +3887 +-2431 +-6787 +-4408 +9476 +4022 +4294 +5842 +-474 +1100 +6951 +-9156 +-4066 +2251 +-6005 +5668 +4060 +348 +5166 +-9081 +3653 +-3142 +-4817 +1188 +-9529 +-3042 +-9710 +2676 +-4186 +8583 +5716 +-12 +-143 +8139 +751 +5495 +2224 +8704 +-5143 +-7357 +4585 +8390 +-7962 +7310 +-6057 +-2890 +-8650 +3975 +-3913 +-7553 +-6829 +1055 +629 +-8611 +8704 +2935 +7627 +-9636 +8237 +4830 +7730 +-7655 +3693 +744 +-6423 +1973 +-4760 +-3551 +6505 +-9297 +-7125 +8391 +-2273 +9608 +-3999 +-6216 +6055 +8592 +-1582 +-8419 +8289 +2493 +-9850 +-2918 +-6064 +-9897 +-7001 +-6319 +-5396 +495 +9351 +9646 +3328 +-9086 +-3388 +6552 +-7472 +-9380 +-2095 +1908 +-15 +9725 +9769 +-4410 +-8460 +7601 +4976 +1524 +-4765 +806 +6520 +-8086 +-4407 +-892 +-1562 +-8212 +8102 +-234 +6233 +-1020 +5582 +4988 +-6551 +-1241 +9351 +-5714 +-5747 +-7899 +-9870 +-2890 +-3913 +2511 +7825 +-1465 +-5458 +7473 +4096 +-4430 +-4939 +476 +7030 +-2994 +-8146 +-7263 +661 +1232 +-2233 +-6533 +97 +7162 +4189 +-135 +-5844 +5187 +1278 +-963 +-9151 +-1673 +-5986 +2161 +6311 +-8801 +9912 +9777 +9154 +-9145 +2647 +7626 +8937 +1228 +-8757 +-5173 +-7789 +-9764 +1054 +2556 +7067 +9098 +-3105 +9155 +-7274 +-9837 +4657 +-2534 +3569 +-8219 +7542 +5177 +5297 +9 +-3614 +-215 +-5086 +1871 +962 +4432 +2925 +4003 +-1554 +8430 +5935 +-2406 +1796 +-2107 +-8534 +8139 +1049 +1320 +8646 +-6546 +-437 +-9202 +-433 +9581 +3458 +-7286 +-9449 +-9657 +2075 +3302 +5266 +7683 +4946 +8426 +1947 +360 +-6902 +6245 +-866 +-1621 +-2173 +8955 +8710 +314 +-708 +-5663 +-6808 +9355 +-68 +2935 +-1510 +8228 +7839 +-7523 +3423 +-8753 +8567 +5802 +-6835 +769 +2358 +9338 +5767 +3977 +2902 +-5747 +7700 +7081 +-29 +-5149 +-3788 +-9280 +-3283 +3759 +1970 +-7950 +-6991 +3768 +-4724 +-7381 +-5308 +5825 +-6835 +-2815 +-2030 +423 +2965 +-7233 +3751 +6165 +-2705 +8908 +9410 +101 +-4065 +3175 +7406 +4580 +1003 +1225 +914 +-1582 +628 +-4472 +-4724 +3553 +-573 +6519 +-1624 +1698 +-2144 +-2145 +-3654 +-1112 +8042 +3814 +7047 +2061 +-8355 +-7476 +5177 +1823 +-8537 +-6779 +2619 +-7861 +8423 +5891 +4934 +7204 +4092 +-3393 +8747 +-3929 +-9623 +7446 +8513 +6929 +-4579 +-1702 +-1920 +-12 +-5849 +-459 +-7169 +-5275 +-4636 +1706 +-9933 +-2960 +3171 +-775 +8709 +-6770 +8710 +1223 +-1340 +4201 +5 +569 +5769 +2578 +-6729 +-2294 +-4822 +410 +-9339 +-7782 +4289 +6685 +6810 +-6170 +5866 +-577 +3689 +-7195 +-1000 +-8000 +8157 +5716 +168 +830 +-1232 +4460 +7608 +-6435 +-6784 +1686 +7150 +-4131 +5333 +-4720 +3959 +9200 +7104 +-2494 +-4581 +6774 +-6573 +5625 +-7150 +-6763 +-9054 +1119 +534 +3436 +-5378 +469 +883 +5733 +4060 +9775 +-546 +-5342 +-3241 +-6049 +3551 +613 +-3809 +9220 +9641 +3302 +7151 +5485 +7589 +-1614 +7608 +9161 +-776 +1159 +-898 +-2281 +-9803 +6657 +-2738 +-9169 +9559 +-9988 +-8287 +-2465 +-6784 +4699 +-2248 +9748 +9285 +7934 +-1879 +951 +-6856 +-6395 +5238 +9321 +1907 +2224 +7492 +6763 +-3537 +4542 +-3745 +2845 +795 +8610 +-6154 +-2281 +6673 +-5500 +-8564 +1464 +9495 +-6511 +4007 +-8979 +7972 +-3088 +-4897 +2649 +-5127 +4395 +-5982 +-5977 +8188 +-1231 +8271 +-7132 +7672 +6311 +9110 +1601 +9709 +-4707 +-4006 +-3198 +8426 +-437 +5109 +-7887 +8085 +9072 +-1263 +-1442 +-9811 +6380 +-3528 +-9507 +9884 +2764 +-3473 +-1566 +1908 +941 +3985 +4703 +4803 +2484 +-7762 +-2736 +-5747 +-2480 +3963 +-4081 +-7381 +-7367 +6805 +2246 +-3010 +6502 +-327 +5263 +-4033 +9856 +6298 +1000 +-7181 +6709 +-4583 +-3584 +-9489 +8991 +4118 +8583 +5733 +5599 +-9838 +7618 +2313 +1813 +-9951 +-9479 +-1321 +-7598 +-62 +627 +3480 +1482 +7999 +-3747 +-144 +-786 +7262 +8504 +7449 +3339 +-374 +-1770 +-680 +-722 +-910 +-4837 +-3611 +-9607 +-3482 +487 +802 +80 +-930 +5868 +-5337 +9476 +5802 +2038 +1908 +9911 +-4279 +-1844 +5455 +-2526 +-251 +-4003 +5528 +-7980 +4138 +7806 +-3170 +-8211 +6040 +-4919 +-8188 +-8887 +-5141 +-8314 +4735 +-530 +-6726 +-9667 +8545 +-2938 +-896 +7339 +7149 +-9895 +1032 +-3531 +629 +6338 +6242 +6686 +-547 +-8140 +3389 +6257 +-1592 +2880 +-8616 +-7776 +9782 +-3096 +-2782 +-591 +-141 +-2319 +2643 +-4291 +6268 +-930 +-8837 +2633 +-7724 +6508 +3380 +9037 +1058 +5999 +-3332 +-3600 +595 +-1582 +2278 +-7792 +-1286 +-7070 +-6626 +3242 +7627 +-8094 +-6461 +2143 +2943 +-6940 +-8144 +-4895 +-9651 +1092 +-5428 +9241 +8066 +-5982 +7136 +-775 +2327 +9695 +-5762 +-4360 +-1920 +-2490 +-9470 +-2195 +8062 +7295 +-372 +5405 +-7791 +-2780 +7207 +121 +-239 +-4231 +6238 +-3224 +-3968 +-5143 +-4095 +-3286 +9273 +-4470 +-8594 +-7749 +-5780 +4032 +-6339 +-5143 +8210 +-4990 +1081 +399 +5863 +8150 +8608 +9171 +9506 +875 +1074 +8483 +-6503 +-437 +292 +-6444 +-6610 +5314 +8228 +7464 +4752 +5686 +-7086 +4661 +-220 +-1814 +7483 +-6797 +-9674 +-9325 +-7157 +8430 +-6296 +9172 +2451 +-9236 +-8870 +3809 +-3494 +-735 +-4751 +7119 +7438 +-6212 +-871 +7069 +-5384 +-2793 +4954 +-7490 +-4323 +-8174 +-3823 +2321 +519 +-2038 +9470 +-2941 +-7074 +3711 +-8241 +-7258 +8782 +-5081 +-9083 +4639 +7489 +-3732 +-2181 +-7835 +-3341 +6892 +9551 +8925 +7295 +6627 +-1837 +1055 +-9241 +-6009 +4286 +-4300 +378 +-8197 +-8710 +-9750 +3949 +3866 +6834 +-580 +5241 +-4842 +3772 +-2092 +-533 +-811 +-8206 +7739 +6060 +1677 +2910 +7435 +23 +-6320 +-7394 +8574 +687 +-4875 +-8854 +959 +-2586 +9601 +-7146 +-2762 +4427 +-7854 +-7832 +-4081 +-9363 +-9236 +9177 +-7276 +-1722 +952 +8924 +2639 +1718 +-93 +5959 +-786 +9945 +-5826 +-5072 +-659 +7855 +5622 +9846 +-5239 +-8027 +-2448 +-8157 +-495 +1538 +-4131 +-5333 +1869 +7090 +5832 +-1673 +6269 +-4200 +1353 +-3005 +-8393 +8355 +4075 +-6743 +-6274 +8182 +-4634 +2222 +1872 +275 +-3038 +1292 +4072 +9271 +-8496 +9112 +-5147 +-5094 +-1612 +-5341 +-8152 +39 +3195 +-5501 +-1730 +-8789 +-5308 +-8719 +7067 +-2301 +-1562 +-1006 +5338 +-6030 +6606 +1788 +-3425 +4830 +-9875 +-1768 +-8536 +6050 +-3149 +-2359 +4954 +-2114 +3963 +8483 +9831 +-2682 +-8462 +7841 +7867 +-5677 +-4377 +-1422 +-5122 +-963 +-9438 +8089 +-437 +8220 +-4649 +6452 +6173 +9228 +-8940 +-4299 +-5817 +-3198 +6337 +3500 +-4969 +9140 +255 +-2446 +8430 +7293 +2613 +-7794 +9691 +-4005 +-3919 +-7951 +-3466 +8101 +2032 +-5441 +-3461 +1308 +-6062 +-3060 +6327 +-2367 +-5094 +7138 +-6990 +4311 +-4164 +3171 +4171 +-671 +-5435 +7043 +9538 +1129 +-8941 +-6074 +-9688 +537 +-4430 +-5736 +-4552 +3123 +5628 +9868 +-9236 +-3874 +6055 +7942 +-4969 +456 +-8152 +4749 +-8110 +7627 +2154 +-957 +4164 +-5518 +5562 +-7600 +4555 +-6871 +-2872 +-5113 +3443 +6616 +-5458 +4588 +-3727 +-9475 +-5747 +-1884 +-4395 +-6573 +3709 +-3342 +-6778 +-7442 +5863 +-2314 +266 +1416 +9556 +-372 +1367 +9685 +7530 +-469 +7347 +-7394 +5818 +9458 +-3570 +4845 +-7970 +-1256 +-1392 +2275 +-1549 +638 +-5780 +2260 +-518 +-3263 +8545 +2180 +6446 +-578 +4028 +3809 +-4355 +-4817 +-1639 +7996 +9686 +9349 +-5350 +3576 +6887 +-9882 +-7678 +-3043 +-7461 +-9222 +-3719 +2798 +888 +973 +2590 +-7413 +-6795 +1612 +-5578 +-4300 +-8836 +-9389 +-7854 +5060 +350 +2909 +-522 +3826 +-8945 +-8266 +6101 +8293 +2705 +9681 +2296 +1842 +2751 +-8481 +4294 +4476 +5350 +-5375 +-9285 +-7728 +1627 +8595 +8104 +4377 +-4297 +-6918 +7004 +1983 +-7789 +-2207 +8214 +4805 +-4117 +6897 +-8960 +9827 +-4581 +-6721 +-8463 +-9431 +4651 +5950 +3700 +-6331 +8650 +737 +95 +8727 +-2251 +-2681 +575 +8270 +-3165 +-8784 +4432 +-6903 +3526 +-2018 +-6389 +-4297 +-2293 +3704 +7895 +-7621 +-1895 +2073 +-5006 +-362 +6357 +6677 +-5364 +2845 +285 +96 +-844 +-1665 +4701 +691 +-5141 +5553 +5726 +-9912 +8854 +-4507 +6931 +691 +-2204 +-2635 +7844 +-2374 +-4171 +-4696 +2484 +2768 +2789 +-2207 +-3890 +5031 +4536 +5653 +-1598 +-5903 +4333 +9642 +5884 +1548 +3553 +-1502 +-8632 +-1177 +7762 +9907 +-664 +-6873 +-7575 +2248 +-4472 +-144 +5562 +-8300 +4405 +2388 +-6690 +-484 +-5576 +9349 +7804 +-3772 +-7790 +-8897 +2352 +3701 +9413 +85 +-7309 +6235 +-2995 +-6693 +3039 +2887 +7319 +3544 +571 +-2328 +-8807 +-106 +-5515 +9689 +-6405 +5553 +-9 +-1333 +-5687 +9927 +-7997 +-7310 +8762 +-5132 +8741 +-265 +-2735 +-5887 +-2353 +-3111 +1104 +1483 +655 +7575 +3192 +-8138 +-6806 +7207 +9448 +2508 +-9599 +2802 +-8801 +-8858 +-278 +199 +6609 +5675 +5010 +7510 +-6521 +-3929 From 2c0fbf53c3cf440234f5c3783310a886758d6213 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 20 Dec 2022 13:44:56 +0100 Subject: [PATCH 353/479] 2022: d20: ex1: add solution --- 2022/d20/ex1/ex1.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100755 2022/d20/ex1/ex1.py diff --git a/2022/d20/ex1/ex1.py b/2022/d20/ex1/ex1.py new file mode 100755 index 0000000..aba905b --- /dev/null +++ b/2022/d20/ex1/ex1.py @@ -0,0 +1,34 @@ +#!/usr/bin/env python + +import sys +from collections import deque + + +def solve(input: list[int]) -> int: + def mix(file: list[int]) -> list[int]: + shuffled = deque(enumerate(file)) + + for i, n in enumerate(file): + item = shuffled.index((i, n)) + shuffled.remove((i, n)) + # Moving the item to the left means moving the collection to the left + shuffled.rotate(-n) + shuffled.insert(item, (i, n)) + + return [n for _, n in shuffled] + + def coordinates(file: list[int]) -> tuple[int, int, int]: + zero_index = file.index(0) + indices = map(lambda n: n + zero_index, [1000, 2000, 3000]) + return tuple(map(lambda n: file[n % len(file)], indices)) # type: ignore + + return sum(coordinates(mix(input))) + + +def main() -> None: + input = [int(n) for n in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From 815b5a028fb6c4ee86b6e2bfee565053e67a344c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 20 Dec 2022 13:45:02 +0100 Subject: [PATCH 354/479] 2022: d20: ex2: add input --- 2022/d20/ex2/input | 5000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 5000 insertions(+) create mode 100644 2022/d20/ex2/input diff --git a/2022/d20/ex2/input b/2022/d20/ex2/input new file mode 100644 index 0000000..f9edce3 --- /dev/null +++ b/2022/d20/ex2/input @@ -0,0 +1,5000 @@ +3711 +-1434 +1793 +611 +9745 +6977 +7163 +8640 +-3210 +-6021 +-3404 +-6977 +-5746 +8756 +5559 +-9619 +-1866 +-9562 +7336 +-3121 +-2412 +-7053 +-6967 +-4095 +7454 +3949 +1055 +7965 +1308 +4022 +359 +-6990 +1006 +-8119 +-7148 +-5458 +-6618 +9992 +-3646 +1793 +4309 +-6088 +6522 +-5626 +773 +6529 +-5447 +7121 +63 +-7056 +-4580 +-5384 +-7206 +5015 +-5324 +2437 +-931 +-3531 +-5958 +-8531 +0 +9725 +3551 +9580 +9777 +4239 +-3800 +-3889 +4798 +1715 +-1807 +448 +-3838 +5468 +3435 +4854 +9925 +-2548 +-4662 +1641 +1823 +-3224 +359 +8642 +-8134 +8477 +397 +6050 +-6056 +-2329 +247 +2919 +-8241 +-8198 +-7070 +508 +3345 +-7737 +-3458 +-5900 +-2956 +9992 +-3929 +-1389 +7747 +5159 +-9927 +8393 +5146 +4737 +-7176 +8154 +477 +8966 +-8203 +-5948 +-1525 +-6351 +4007 +8372 +-8985 +388 +6133 +518 +1267 +9773 +2714 +4947 +2161 +1223 +-5259 +6322 +-5186 +3864 +-5344 +-2420 +-1242 +6960 +-2377 +8871 +1518 +-9880 +3367 +6834 +-3829 +7001 +941 +5185 +3002 +-3084 +-7070 +-4173 +9754 +900 +6195 +2130 +-5964 +-7878 +-3 +7151 +5948 +7665 +7895 +-9371 +327 +4869 +152 +-6958 +-6296 +8194 +8123 +7439 +-2254 +-16 +-751 +-6009 +-3955 +9470 +-7791 +4588 +-5378 +9495 +2220 +-1858 +1527 +1963 +9943 +-7271 +-8554 +4164 +152 +1492 +-8801 +-4645 +2536 +1122 +9611 +5725 +9810 +8110 +3892 +-1580 +7627 +1540 +4122 +-7754 +-2150 +9716 +7127 +9455 +-6339 +-5646 +-2025 +-2586 +5523 +2424 +-6795 +5478 +242 +9484 +-1920 +3024 +9282 +3932 +-7070 +-3920 +-7596 +227 +4513 +1143 +2130 +-2601 +1074 +-4291 +5726 +230 +8708 +3423 +-8941 +1027 +-3335 +2054 +-1598 +4935 +9076 +9098 +-9976 +-1600 +-9612 +-7150 +9448 +-3430 +6262 +-5112 +-9738 +8903 +6967 +3989 +7919 +-9361 +-8157 +2838 +6866 +9267 +-4897 +-8796 +-6670 +-2613 +997 +995 +6519 +-5600 +-1548 +8620 +-3014 +-1061 +3967 +192 +583 +-3798 +-2890 +-2239 +6047 +6233 +-5972 +1568 +875 +9710 +1915 +8620 +7033 +232 +3833 +-1292 +-5711 +-6597 +-715 +-4065 +-8022 +1581 +-7646 +3755 +7937 +1949 +-4269 +7803 +-5900 +-3000 +-2908 +8306 +-5777 +649 +-6533 +7804 +-1301 +-8806 +4138 +4022 +2923 +9501 +3746 +-1680 +1029 +-2401 +8457 +-3335 +1826 +9502 +2492 +-895 +-8447 +6751 +-4796 +-2519 +-2649 +5269 +5864 +-176 +-5903 +-9547 +7806 +-3982 +9102 +2374 +-8895 +5452 +-5065 +-6263 +6123 +4055 +9971 +-195 +959 +-2045 +-3237 +-9170 +-7621 +-1455 +-7843 +8085 +5801 +-646 +7119 +-1301 +301 +7729 +3904 +-4593 +7799 +4339 +7264 +611 +2734 +6154 +3862 +2713 +-9613 +-866 +3188 +9082 +-2484 +6786 +-522 +8062 +-234 +-7845 +-9660 +1297 +5789 +-2066 +7857 +-933 +-2178 +7206 +-6504 +4055 +-4807 +-8287 +-8065 +3043 +-9367 +-7066 +2888 +-547 +-7988 +3681 +2135 +-7083 +-4887 +9593 +629 +-9389 +4778 +-8152 +4703 +4526 +5965 +5523 +-970 +1699 +-4042 +-650 +-8718 +-2099 +-2156 +-4250 +4823 +-1267 +1054 +9660 +-1510 +9011 +6465 +-8139 +-769 +4040 +3500 +3360 +-7299 +3766 +635 +-7621 +5493 +8574 +-7727 +-4625 +-2266 +1380 +7632 +-4705 +6430 +8313 +2205 +4779 +-9803 +6928 +9110 +-6164 +-6503 +6285 +-4434 +-38 +4934 +-5710 +7322 +-8140 +-5492 +-1237 +-8029 +-281 +274 +6660 +7603 +-6250 +-107 +2023 +553 +-1339 +6742 +-9890 +3069 +8624 +-8671 +4634 +506 +-5903 +7875 +-8332 +-8603 +-9607 +-433 +-7442 +-5899 +-8164 +4245 +-811 +-9127 +-7596 +-4576 +-9453 +-6504 +-2406 +7283 +5984 +7702 +2991 +-8341 +-5793 +-2952 +-9463 +867 +1082 +8990 +4741 +-6387 +-67 +3772 +3932 +2446 +9514 +4070 +7338 +-4634 +-8774 +579 +-7621 +-3342 +9672 +4092 +-422 +-6056 +4502 +-281 +-2633 +1616 +7322 +1641 +-1866 +2188 +-9607 +-4265 +-3395 +2112 +7505 +-3274 +3926 +5881 +192 +9355 +-8975 +-9799 +5615 +4961 +5862 +-8966 +9161 +-6568 +7096 +-9547 +5168 +4871 +5105 +7509 +-405 +8359 +-61 +5177 +-9230 +4772 +-4277 +8922 +6834 +-1224 +-8463 +-9651 +7449 +-3979 +2919 +5817 +-168 +-6770 +-2367 +2220 +-2373 +-1798 +-6918 +-2319 +-9646 +3677 +3783 +-824 +-5958 +991 +9581 +626 +-5542 +-168 +-4514 +8471 +9315 +-5256 +8625 +1951 +8054 +1467 +-1692 +7030 +-9811 +4351 +-4503 +-3983 +3625 +5593 +9576 +7627 +-2095 +4053 +-458 +-522 +-1838 +-6086 +-7957 +-3073 +-7032 +-2301 +-1879 +-8940 +-3929 +-5143 +9198 +5136 +-3503 +-221 +569 +3258 +8969 +5137 +4466 +1198 +-1875 +-7001 +-8401 +-9628 +-4376 +6368 +6899 +-6998 +-6268 +-5578 +850 +7758 +-2836 +-3617 +5199 +5857 +-915 +-4008 +9964 +-2042 +-4576 +702 +4350 +-7378 +388 +-5676 +-2485 +2237 +-8245 +-3345 +3039 +-9985 +626 +-6423 +9599 +-8799 +1249 +-9322 +-6598 +5068 +-3124 +-4186 +1393 +7608 +-4406 +-7980 +-588 +-6723 +28 +-6056 +1908 +-7477 +-2009 +-4253 +8781 +7499 +4501 +1728 +5461 +604 +-735 +9829 +-2972 +9601 +-7072 +6440 +-9937 +-3971 +6880 +2082 +9716 +6638 +1172 +14 +5047 +-7490 +-9798 +4022 +6741 +5366 +-8177 +4941 +1765 +9473 +-8059 +-9316 +9990 +-4018 +-6433 +-7806 +-3095 +-2871 +3495 +-7505 +9062 +-6506 +4805 +6931 +9992 +-5401 +5894 +5628 +2473 +1826 +-257 +-5631 +1538 +5608 +-7503 +6411 +-9362 +-3265 +-6574 +-4470 +-7029 +1915 +-9432 +-1257 +1948 +1131 +-3303 +5011 +517 +-6743 +-599 +-6787 +-359 +9250 +-7051 +993 +5770 +9742 +-1802 +2514 +5247 +8838 +-3919 +-5189 +8633 +1211 +2514 +-2848 +415 +7978 +-8183 +6431 +4257 +-3348 +2552 +4703 +372 +73 +2872 +9685 +7138 +-1985 +479 +8810 +7952 +-8495 +2764 +-945 +3249 +1141 +-3655 +-1048 +1503 +-5303 +518 +3755 +-5365 +-7401 +-5034 +7222 +7108 +1213 +5847 +-8774 +7389 +7066 +3532 +8243 +-8940 +-5596 +-2759 +-396 +262 +2765 +6705 +-1114 +2942 +8483 +7333 +639 +8388 +-2879 +6452 +-1414 +3180 +-9251 +-8615 +7207 +323 +5863 +9321 +8551 +415 +3285 +9107 +-2295 +-4844 +1194 +3020 +7871 +6974 +-3971 +-1879 +730 +6215 +5238 +2375 +-2887 +-7060 +3696 +2288 +7999 +1008 +-2604 +-12 +1572 +-9604 +-6650 +4753 +5562 +-8574 +6115 +-5266 +-3122 +4575 +6406 +-9340 +-3121 +5 +-7167 +2984 +5484 +6640 +-2095 +-582 +-1572 +-3949 +-3198 +-2734 +-678 +-7252 +-931 +5301 +357 +9194 +-3664 +3194 +1949 +-409 +3983 +5376 +691 +7083 +-4065 +-3167 +-1577 +7589 +6096 +-2066 +9945 +423 +-1591 +7136 +3371 +-8023 +8236 +-2649 +584 +-9400 +4925 +3767 +-330 +5121 +-7338 +-4365 +8840 +6691 +1018 +1092 +5364 +7778 +-690 +-176 +5411 +5873 +4854 +-8838 +-4143 +-4521 +-1137 +-9568 +3975 +-2602 +-7136 +676 +626 +4196 +5565 +3024 +1623 +-1081 +-8027 +-8253 +-8941 +7800 +4077 +-4431 +8085 +2124 +-2527 +8478 +4817 +-6855 +-5003 +9819 +-4330 +5057 +7358 +915 +-5578 +9566 +7048 +1831 +-3216 +-9236 +-4071 +-7120 +8054 +9425 +2345 +1313 +6317 +7739 +-8791 +-7157 +3937 +2519 +-4901 +1980 +644 +2935 +7185 +4961 +5301 +9346 +6224 +-990 +4575 +-1129 +-633 +773 +1058 +7851 +3763 +1464 +2571 +-9677 +-5903 +-9733 +-9637 +-6130 +-906 +-7169 +-7492 +7623 +5015 +8791 +-5596 +997 +1729 +5803 +-9880 +-1827 +-7477 +-3695 +-1855 +-5844 +951 +-1308 +-9072 +-2121 +851 +889 +-4721 +-1702 +-3080 +3897 +3588 +4934 +-9203 +1391 +1157 +5174 +8574 +-5977 +-5997 +7825 +-215 +675 +-5499 +433 +2487 +-1054 +-8648 +6515 +8334 +6210 +-9425 +-7491 +5792 +1169 +9664 +-2879 +-6345 +-477 +-6811 +9285 +-4518 +-4570 +-4393 +-4295 +-4784 +-7331 +-5499 +7942 +-8716 +-8666 +3618 +-3329 +-5269 +5158 +-3111 +1364 +5881 +946 +-5567 +-4697 +-3771 +-4498 +9075 +6550 +6940 +4231 +-6577 +-3060 +-2420 +522 +7435 +190 +6505 +-3623 +-7004 +-781 +-3727 +-1146 +5944 +8825 +-1895 +-4140 +9279 +-3614 +7233 +7233 +-4876 +891 +-9660 +-7910 +5322 +-7419 +-8810 +-1475 +5454 +1586 +-6445 +-7575 +-6967 +-3111 +-719 +691 +2533 +-8488 +8141 +5978 +-7069 +-7577 +-7817 +-2433 +-234 +-5006 +-4003 +-2207 +3983 +-9447 +5253 +7489 +-8276 +6165 +9979 +-761 +-1920 +413 +1216 +7524 +3485 +5748 +1027 +-3944 +9178 +-7503 +-5183 +-5837 +155 +-2172 +-5760 +-1392 +9780 +8117 +2990 +-8109 +-957 +2716 +9952 +7231 +-7349 +-4267 +-7922 +4495 +-4294 +-3036 +-287 +-9228 +7448 +928 +-7979 +5085 +-1548 +4251 +-2890 +-2962 +6705 +1865 +7988 +3426 +102 +-3580 +-7268 +-4071 +-9380 +-2991 +-1534 +6295 +-5009 +-9790 +3014 +2060 +4993 +601 +232 +613 +2734 +-40 +-2889 +9221 +4125 +6276 +2558 +5630 +2566 +-1528 +-4939 +5724 +2481 +-1730 +9748 +-1866 +3285 +5422 +-4484 +6903 +-6205 +8041 +954 +-4355 +-7368 +47 +4682 +-1781 +2929 +-178 +-6152 +-4825 +-1403 +7060 +8230 +-657 +5159 +-2642 +9824 +-8739 +7726 +3024 +1888 +-4570 +-654 +8662 +-5534 +9430 +-2901 +4911 +9268 +6763 +-8092 +5680 +6795 +-6934 +8951 +2452 +3868 +6988 +1226 +9773 +-2945 +-1756 +31 +946 +8195 +3345 +4145 +-2351 +5770 +1478 +7702 +-2846 +-8432 +-5033 +388 +3749 +4955 +-811 +-648 +-2751 +-6161 +-6176 +-4548 +-3406 +-810 +9895 +382 +2810 +-9821 +-1580 +-3165 +9123 +-8168 +4994 +-9169 +-3531 +6951 +-8312 +-3920 +-8401 +4685 +-7347 +-4143 +-7456 +-3073 +-1941 +-2991 +4869 +-6238 +6053 +-3146 +5455 +-6707 +1663 +-114 +-7397 +9291 +1172 +-8819 +5199 +6567 +7041 +7861 +4052 +-7495 +2556 +901 +-4955 +7329 +-5239 +8633 +9411 +5767 +-777 +1517 +-5687 +8028 +-1506 +1432 +-8671 +-9602 +-9926 +6289 +2770 +3899 +-1985 +-6435 +1308 +4040 +1702 +6436 +9203 +4439 +4933 +-5098 +6578 +-2578 +-1598 +-8105 +1420 +-4571 +9726 +6471 +-3754 +2803 +-2198 +-7789 +4853 +-9174 +5407 +9303 +8929 +-5515 +5213 +8664 +1607 +-2957 +1508 +5715 +520 +7462 +-1092 +-9948 +2012 +7736 +83 +-7140 +9862 +7104 +-6979 +-4954 +-5495 +2038 +-7918 +-4301 +-6187 +-8581 +6051 +-427 +-5738 +-578 +-817 +7352 +7795 +-8735 +7438 +-7993 +-8979 +-4552 +4229 +-8688 +1793 +-5668 +1564 +-3500 +-6301 +1308 +5024 +-8677 +-4795 +8150 +-7918 +-9138 +-1180 +9949 +-8946 +7380 +9611 +-7456 +4467 +7861 +-6337 +6298 +704 +-9424 +-2188 +7978 +8708 +-3897 +-1362 +-6442 +791 +-2555 +-6936 +-6423 +7779 +247 +-3367 +-7323 +572 +8727 +5136 +3959 +6906 +-7768 +-7490 +-5764 +-3187 +8153 +-5600 +8718 +-2676 +9779 +3775 +4165 +-9733 +2578 +-5150 +3895 +-2995 +-4395 +-1078 +-5606 +-106 +-7329 +7919 +-5115 +-4576 +-1007 +-7252 +-2660 +-4746 +8157 +3002 +3461 +-2312 +3932 +-1453 +1116 +4999 +-4006 +-5515 +-8769 +8151 +5342 +-1580 +-8360 +7336 +6060 +-844 +-6322 +9271 +-1793 +3328 +9739 +-7769 +-4358 +8013 +5338 +-1836 +-1932 +-8203 +2327 +4772 +5916 +-6560 +7310 +-4777 +-1817 +-3026 +-9075 +-6937 +-2349 +-5038 +7001 +-2188 +-8514 +-8613 +5247 +-6890 +-6351 +-3838 +3862 +959 +8729 +1297 +-1434 +3892 +2047 +4772 +-7940 +-2907 +8729 +-3819 +-8460 +-4148 +-4066 +-2949 +5188 +9412 +-2941 +-6577 +6215 +-3020 +4706 +1032 +-2383 +-2734 +-5579 +2679 +8955 +-3422 +-2527 +7233 +785 +-8288 +4941 +-7461 +-7259 +456 +-8232 +-8613 +-6083 +1704 +-533 +-234 +7362 +7963 +-4624 +9350 +9198 +946 +-8642 +4059 +3193 +5086 +5931 +8908 +-7621 +2815 +-741 +1908 +8890 +-7620 +1459 +6457 +3098 +5798 +-346 +9476 +-3788 +863 +3556 +-8979 +-6777 +9094 +-8241 +-4222 +1875 +1308 +-9602 +7322 +2813 +1263 +9743 +2222 +-2897 +186 +9558 +8959 +4196 +4176 +-7421 +7865 +-3310 +8362 +-8613 +-9418 +-4799 +4309 +3833 +-2002 +8791 +8850 +9209 +7499 +-8241 +227 +-9930 +4991 +-6118 +-7477 +-715 +6846 +8163 +-405 +639 +830 +4358 +5483 +-8983 +-9280 +4070 +-5828 +8089 +-5130 +-8810 +994 +2356 +-6221 +-7004 +4040 +2643 +639 +-1866 +-6144 +8729 +9640 +2229 +4235 +-9832 +3328 +4302 +-1901 +8797 +6283 +8117 +-6187 +6379 +-2329 +3047 +-5100 +-7039 +4432 +-2977 +8236 +725 +-3940 +-7074 +5675 +-127 +-8878 +3756 +-4256 +-9781 +-4558 +1413 +-1584 +2923 +3914 +7147 +7898 +7352 +4653 +2716 +-2646 +9501 +2693 +306 +6686 +6662 +275 +1164 +9551 +4809 +-1166 +7722 +-5783 +-1873 +-9438 +4060 +4964 +8362 +2887 +-3940 +4197 +-7487 +-3368 +-6171 +-5689 +-6376 +2061 +-7964 +-2173 +-9072 +-2135 +-2431 +2661 +-8884 +-3187 +-3510 +4696 +9542 +-2736 +8965 +361 +5894 +8633 +8613 +-8133 +-2879 +-7268 +6414 +472 +4374 +-1616 +9391 +-5978 +8220 +-7802 +-3430 +5602 +-2340 +6895 +-2646 +7340 +107 +132 +1517 +7864 +2965 +-1605 +-110 +-6702 +-2420 +-8328 +-190 +-6763 +6352 +8838 +4350 +6964 +-2613 +-5781 +9831 +1938 +1488 +1855 +-2949 +-5636 +1622 +-8554 +-6176 +2979 +-653 +5301 +-2144 +5602 +-8316 +-8354 +-817 +-3630 +-7349 +-5499 +-5802 +6500 +6893 +-1159 +8479 +-2002 +9323 +9266 +-3913 +3346 +9689 +1321 +2558 +-1544 +7047 +-1339 +8322 +-9569 +-871 +-3874 +6131 +3755 +4839 +528 +-4204 +752 +-6077 +7576 +-1045 +7089 +3607 +9492 +7307 +-313 +-4180 +-1160 +-3207 +-2103 +-6985 +959 +-7866 +-6754 +4712 +-1075 +8241 +9902 +1436 +3711 +-2977 +-3892 +-797 +-9172 +-3459 +-8232 +5843 +4467 +3975 +5879 +4063 +9368 +-6155 +-3247 +6558 +-135 +-8502 +-477 +7083 +-4005 +-5114 +-1755 +-8152 +5694 +4325 +3436 +-3618 +2813 +958 +-2412 +-8794 +-5081 +6283 +-9030 +5614 +-7782 +-565 +-8149 +-8951 +5175 +5953 +7645 +-4826 +-5308 +6622 +8943 +-2938 +3367 +9211 +6032 +-4557 +-3387 +-907 +-2430 +4954 +1793 +5628 +1082 +802 +3895 +2580 +-8234 +8441 +6922 +8542 +-3113 +-8637 +967 +716 +-7922 +5300 +8591 +2166 +7623 +-6808 +7972 +-352 +-2300 +-9504 +-7517 +-5075 +-9860 +1211 +4060 +-6032 +-3681 +1622 +-6721 +-682 +8062 +-6863 +-7887 +-6064 +628 +3655 +6701 +-7062 +-9087 +277 +7999 +-7752 +-1146 +-5231 +-1085 +5949 +-6936 +-2145 +8143 +7645 +-2950 +487 +1545 +1869 +644 +8545 +-7474 +-2000 +-6263 +9780 +-7036 +-2411 +-7168 +1850 +7438 +7262 +-7496 +-220 +-533 +-479 +5533 +-608 +9674 +-9293 +7025 +-7095 +-4817 +-5576 +9153 +806 +2449 +6917 +-6775 +-660 +-7557 +2991 +-4429 +9016 +-1180 +6302 +273 +-4345 +-3834 +-1906 +2112 +-6212 +4007 +-4470 +9113 +-5014 +2229 +-2932 +3556 +4485 +-7576 +-5948 +4590 +2233 +2863 +-287 +-4003 +-755 +-403 +-6405 +6060 +8959 +-4838 +8542 +451 +-9672 +-3945 +-558 +-7749 +1601 +-8366 +-5948 +-6254 +39 +9074 +4744 +-8902 +7417 +3622 +-9992 +-7554 +4716 +1656 +5159 +6357 +-5841 +6505 +2423 +-2698 +-2158 +-4620 +6534 +4974 +-9850 +7907 +5801 +-8139 +9608 +-7577 +-4187 +-5570 +-8215 +8954 +8372 +360 +3959 +2345 +-3704 +7468 +-5020 +5177 +-7190 +7524 +-3550 +-7623 +6446 +-6391 +-6825 +-8839 +-5170 +-7494 +-9758 +6238 +7207 +-3040 +1029 +-4408 +9329 +-5948 +8426 +5816 +6906 +6470 +7767 +-8469 +7361 +-1143 +-5375 +-8240 +-3650 +1527 +4497 +-5609 +1908 +-3535 +-3217 +3047 +-220 +-650 +4181 +3937 +5420 +4848 +-898 +1010 +-7881 +-6337 +-2855 +2566 +1214 +5965 +1231 +5314 +8349 +-5545 +-9122 +2664 +9161 +-391 +-4283 +4736 +2276 +3028 +-5188 +7980 +-3036 +-6295 +5288 +-4550 +-8187 +439 +-2936 +-4736 +-7031 +-4395 +-2364 +-7351 +2375 +7800 +-915 +4830 +-6033 +-7933 +8608 +-9429 +1434 +9930 +-4902 +2130 +1909 +1331 +6352 +5587 +9930 +-4736 +-3318 +2919 +9074 +-930 +3941 +-2698 +-1403 +-7737 +4388 +-8833 +-3409 +4270 +-2209 +4291 +5736 +-715 +-9515 +-2239 +-7557 +9492 +-9353 +9075 +-3210 +8271 +-8173 +9949 +3625 +9358 +2261 +-3718 +-1929 +-3618 +1154 +953 +807 +8908 +-2107 +7958 +-3932 +-3036 +-1080 +2979 +-4214 +3814 +-7258 +1499 +5625 +-6319 +4924 +3347 +8243 +-6647 +-6224 +-6703 +520 +43 +-167 +-2371 +-8324 +5110 +-7776 +-1231 +-5208 +-8637 +6766 +2868 +1973 +3711 +3755 +5001 +-950 +3745 +-4733 +423 +2772 +5879 +7519 +-6609 +4934 +436 +-9374 +-8251 +-3960 +-9546 +3024 +4938 +8149 +-5117 +5633 +-2145 +-5386 +5105 +-5984 +-1901 +-5474 +-8025 +-2252 +9515 +8463 +-1732 +-2329 +8890 +1771 +9328 +-2055 +-9811 +-4256 +-3665 +1586 +3478 +7715 +6890 +-3399 +-6469 +370 +4096 +-2600 +-1814 +2251 +-650 +-1233 +-1161 +-1129 +4697 +8631 +-5222 +-9094 +-542 +8372 +-780 +2145 +3780 +1711 +1572 +5047 +8128 +6623 +-6337 +-5834 +-3732 +5350 +3711 +-4193 +-3368 +-9222 +1569 +-4442 +-1435 +3301 +-729 +-3080 +2619 +-8748 +-3332 +5711 +-3320 +2666 +4597 +-6284 +-1093 +7417 +1752 +-2594 +8567 +-1120 +-6944 +-2017 +9082 +2923 +-5826 +-9911 +-5378 +-9792 +6069 +5466 +-1965 +3114 +-8119 +-6646 +5417 +-7994 +8123 +-673 +-9587 +3543 +2589 +-7870 +-9234 +3017 +-8353 +2334 +-1901 +3077 +534 +8141 +-1182 +9574 +-7204 +6395 +-7045 +6195 +-6989 +-7672 +6003 +-4186 +5582 +7821 +-4574 +-2207 +1622 +8871 +9524 +-8405 +4542 +-6345 +242 +-714 +9107 +8268 +-5949 +4461 +6246 +9919 +7915 +-8774 +6125 +-5086 +538 +-5576 +4871 +6860 +5448 +-2441 +2580 +6271 +4956 +1752 +914 +-5674 +-8769 +-2380 +-4071 +-904 +-6494 +6389 +6803 +2734 +-4498 +-3465 +-5033 +-8775 +-8762 +6997 +4167 +-4373 +-4576 +8162 +-3335 +2820 +8131 +5433 +-3523 +-7007 +6838 +-6322 +2629 +4871 +410 +-7183 +-4704 +7533 +7811 +2846 +-8900 +-100 +256 +1195 +-2941 +-5500 +-2464 +-7054 +6763 +2242 +-7181 +7498 +4579 +4057 +-1755 +598 +-9175 +8969 +-6861 +2390 +3025 +9110 +7125 +-6981 +188 +1540 +-9285 +5767 +-2449 +5322 +6931 +-6169 +-9993 +4197 +-3137 +1023 +9198 +541 +-7206 +-3881 +-8590 +-3920 +-7195 +2936 +5571 +7357 +-2762 +4133 +6666 +-5533 +-1348 +2196 +-7205 +6516 +9091 +4284 +-2301 +-1703 +4531 +9663 +-5671 +8875 +5557 +-8853 +3010 +7194 +8495 +4059 +7608 +6860 +-3618 +-4817 +-4746 +-587 +-3859 +4325 +-7401 +-6954 +-4521 +-4434 +-6104 +-9332 +-8786 +4645 +-3046 +4657 +-8469 +-1029 +-9524 +9618 +-7342 +-4630 +6788 +-3654 +1217 +-1508 +7795 +-1538 +-8312 +-1120 +1998 +-592 +2437 +6283 +-7983 +-8975 +-3036 +-9966 +5230 +2846 +7489 +3209 +7409 +-1146 +409 +2155 +-6112 +2449 +7149 +1329 +-2107 +-2566 +-8379 +4055 +-8095 +-8501 +1973 +6311 +3401 +9205 +-4526 +5131 +-3571 +5166 +-2343 +3995 +473 +-2761 +-650 +-8800 +-518 +8478 +4057 +3589 +-8341 +-3516 +-2857 +-4299 +-4453 +-8707 +7126 +7871 +8617 +6951 +1616 +9419 +-2936 +-2830 +5247 +8246 +3068 +-8857 +619 +-4148 +-1671 +-7225 +2728 +1634 +-3571 +3932 +537 +7664 +-2909 +-3800 +5159 +860 +-3512 +-3920 +-2465 +-9509 +-5113 +3904 +-4578 +-9127 +-1728 +-4723 +-9168 +9581 +5131 +-1941 +6446 +-4217 +9664 +7469 +-8232 +-3020 +9123 +-8645 +-3945 +9171 +-5911 +9486 +-2439 +9507 +2043 +-7798 +-7075 +-1423 +9277 +2166 +-9687 +-1633 +9328 +-9408 +-8369 +433 +7104 +-2938 +1559 +4031 +-4198 +5979 +-4133 +4741 +-1551 +1353 +-1862 +-5933 +7182 +-1165 +-8022 +5769 +6813 +-8025 +-4434 +2395 +5146 +5198 +-9599 +8893 +8262 +-7215 +-6913 +-1340 +-6440 +2398 +-1200 +7524 +-2312 +-5765 +6544 +-8288 +991 +4830 +3163 +1003 +6134 +-5392 +-1357 +-7066 +3893 +-1895 +-3339 +7736 +8626 +5853 +-6612 +7338 +8162 +6818 +-8803 +-4281 +-5225 +-7338 +-3502 +9162 +-9241 +9953 +5131 +-2890 +952 +-1807 +1283 +4598 +4712 +3783 +-7005 +8959 +-4733 +-9182 +-5578 +-3762 +9551 +-7893 +7450 +6625 +-6646 +1973 +3947 +-7119 +2519 +-6703 +2229 +-5364 +50 +8851 +8939 +-8783 +-2290 +643 +6226 +-5118 +7454 +-1339 +8708 +155 +5362 +8047 +-8460 +3824 +368 +-6965 +8867 +-1307 +4278 +1081 +-5529 +7592 +6414 +-1746 +-6641 +-8615 +9526 +7850 +2975 +1214 +-7266 +1152 +-8198 +1709 +-3617 +1425 +7628 +-5134 +7700 +5482 +5695 +168 +7188 +5174 +-4843 +5255 +518 +2700 +-6937 +-2887 +9321 +-3650 +-6854 +4593 +9 +5152 +480 +3703 +-1715 +6795 +-9719 +-4287 +7937 +-2294 +1323 +-2890 +7589 +4845 +4125 +-6913 +-2356 +-6927 +4040 +7067 +-1616 +4991 +-6537 +-1280 +7839 +6563 +-5760 +-1766 +6457 +-7474 +5439 +-6071 +-2705 +-7253 +-4164 +-2500 +403 +-5848 +-3856 +-9992 +-7626 +-6402 +5723 +1284 +-4348 +-2114 +-6032 +-3 +-5416 +4169 +-662 +1468 +4693 +7841 +-2769 +-6751 +4374 +7389 +1883 +6340 +6810 +8289 +3285 +-8211 +-167 +1796 +9945 +-9524 +-9017 +-4255 +7264 +3503 +-1526 +2928 +8875 +-6763 +-4083 +5863 +8834 +5621 +8255 +-2158 +-7769 +-3717 +4901 +1538 +-1434 +8472 +-5598 +-1261 +5675 +-754 +-931 +-1901 +-7157 +6669 +-3863 +-1438 +-664 +-6124 +598 +-9003 +6166 +-3982 +-8594 +-2845 +5794 +5777 +-7119 +-1588 +5767 +-4003 +1531 +7322 +-3597 +-9055 +-2693 +-2058 +-167 +1659 +4994 +-6157 +3135 +8650 +6220 +-3913 +-6056 +5259 +7231 +-6255 +5338 +5187 +8141 +-120 +6504 +-5344 +2047 +-3320 +-8460 +3601 +3146 +4270 +-8320 +-1281 +-811 +9000 +3214 +8782 +3501 +-2271 +6033 +4988 +8709 +6515 +5789 +2338 +2152 +8514 +-3982 +1118 +7722 +3914 +-3758 +1761 +1284 +5219 +-5122 +-1838 +469 +8922 +-573 +-1176 +1604 +1898 +-6004 +7937 +946 +-4073 +-1269 +7336 +614 +-2682 +-7762 +5772 +8469 +-8060 +-9560 +3525 +-8267 +-2290 +6290 +3168 +-1866 +7087 +-1598 +-9598 +691 +3209 +-7582 +2480 +-2957 +4883 +-6918 +7976 +-4909 +1254 +5553 +7045 +3859 +1722 +-6531 +3812 +-7621 +4079 +8469 +-3634 +2473 +5227 +7107 +1860 +2645 +-2438 +-9280 +7479 +-7211 +4265 +-4160 +-2786 +-4710 +-6715 +1223 +-8126 +4131 +-1813 +-3427 +2127 +670 +-8035 +-239 +-4981 +-5324 +-6034 +5878 +373 +-7190 +626 +-22 +-787 +5019 +6240 +-9743 +2713 +67 +-3618 +-7955 +3247 +1761 +4961 +-2816 +2651 +-6263 +6573 +-3003 +-2916 +7722 +-1671 +-795 +7744 +6905 +-6131 +5301 +5010 +9177 +-9865 +-4300 +4031 +3464 +-6336 +-3719 +3608 +5159 +-6726 +2249 +-3830 +469 +-6086 +7014 +4604 +-580 +5963 +5712 +7170 +4087 +-4010 +7126 +-8848 +-6064 +-301 +-5902 +4778 +9222 +-3073 +8966 +3755 +-2718 +9517 +3371 +-6361 +-5823 +-5505 +9916 +4070 +-4737 +1531 +-8308 +-3571 +-1358 +2647 +-1724 +8741 +-6100 +-4690 +377 +-7146 +-7534 +-8811 +5259 +-8401 +6380 +-6185 +-6360 +3433 +-5500 +8430 +5094 +-2528 +8430 +-3570 +-4707 +-8325 +-6003 +-1397 +-728 +-3897 +-6658 +-2092 +-327 +-1984 +8470 +-443 +-1634 +2753 +-4145 +-7519 +4234 +-9899 +4187 +1908 +7894 +2533 +-1176 +2425 +537 +-5595 +4060 +-5490 +1143 +3745 +-4360 +-3688 +3401 +6889 +-2419 +5531 +-547 +-7342 +2923 +5768 +1376 +4218 +2311 +8533 +1376 +-9373 +1908 +4308 +-5868 +-7164 +6257 +3724 +7865 +4513 +663 +1356 +8542 +4370 +9277 +2944 +8922 +-8175 +6229 +7956 +-3329 +990 +-5721 +6544 +-5600 +-6034 +-7294 +6685 +9139 +2896 +1058 +3946 +8867 +5602 +-2971 +-2559 +1826 +-3284 +-1634 +7801 +935 +-4849 +-433 +8277 +-6979 +-4969 +-6671 +-6856 +-494 +-1580 +-1650 +-4152 +-8479 +1603 +-7935 +2611 +-1722 +-5828 +-7620 +-8946 +-8503 +5102 +4924 +-1696 +1304 +965 +-7001 +-7626 +-481 +-2692 +9266 +-8157 +7627 +-1428 +8470 +-4699 +-2025 +-7671 +9161 +-8223 +9787 +5455 +5406 +6469 +-9623 +397 +1392 +3235 +-9334 +1526 +-7079 +-8386 +-7554 +-8552 +-4066 +-4173 +6491 +-2830 +-7169 +-9470 +5241 +1320 +4475 +1549 +3663 +7499 +285 +-3187 +5950 +7880 +5425 +6290 +-5341 +-2294 +-2211 +6874 +1496 +-3550 +-8098 +-1497 +-4825 +244 +6046 +-8990 +5748 +-2577 +2047 +-2367 +-4738 +-3859 +9728 +-6940 +4934 +6976 +-613 +-3787 +5448 +5151 +1577 +-610 +1887 +1141 +-7215 +9350 +-6039 +233 +-4032 +752 +-6626 +-7298 +8154 +5046 +-3435 +410 +-205 +8084 +1482 +-567 +-5146 +2195 +-1616 +-9568 +-1932 +8123 +-2577 +6457 +-5534 +-9613 +1807 +7327 +8326 +-9821 +-3317 +4474 +6903 +5858 +7628 +2451 +-9216 +4054 +-8360 +3285 +-9167 +6677 +6616 +2388 +-9814 +1792 +-2698 +1066 +3631 +-9798 +-1029 +-4472 +9146 +-3913 +9184 +-1012 +-329 +-5072 +6397 +-6086 +9384 +-9429 +9668 +-8345 +9925 +5668 +-1072 +1331 +7795 +2607 +7207 +-409 +8709 +1872 +-474 +8430 +9382 +4041 +-2452 +-1321 +-3514 +-4313 +-8611 +7966 +3646 +-475 +519 +9502 +-7020 +2859 +-5680 +-5534 +4422 +9234 +806 +-1340 +4359 +2797 +-7003 +-7446 +-5524 +-6757 +-5527 +-2845 +-6225 +-7372 +-2706 +3600 +6084 +-6990 +7162 +-6463 +5947 +-6839 +9393 +3123 +7712 +-9115 +-1123 +5136 +-9797 +-3232 +-2011 +7475 +1883 +472 +9346 +-5920 +-2689 +4245 +5487 +-7532 +-2104 +4363 +-4576 +5725 +-38 +9919 +-3170 +3167 +3813 +-8637 +2863 +-4169 +2344 +-6671 +-7458 +7944 +-6070 +5953 +-3387 +6412 +5411 +-2163 +7001 +8345 +-8359 +9917 +3030 +8362 +-3503 +-8662 +3443 +-1110 +977 +8875 +-2534 +-1029 +-5655 +-8343 +5298 +-6490 +3532 +1726 +-4936 +-7225 +-933 +-5982 +9410 +-7010 +-2295 +-1328 +-7150 +-5851 +1957 +-5305 +-8407 +-4053 +3030 +9112 +-4985 +951 +3980 +-5868 +769 +6853 +-5005 +-1887 +-1368 +1354 +8595 +-3544 +-9491 +2620 +-1363 +6029 +-1077 +2868 +1792 +608 +2222 +-1566 +-2250 +4991 +-6997 +9627 +-2085 +4162 +1635 +6411 +2075 +5777 +3755 +-2957 +-5324 +-7051 +5803 +1297 +-8539 +-6268 +2393 +3618 +-9088 +2543 +1614 +3179 +-2580 +6889 +-6258 +-6816 +1031 +-7401 +4166 +791 +5658 +9780 +-8274 +2010 +7739 +4559 +7438 +-7629 +-8302 +5158 +-2480 +-8152 +7406 +102 +7185 +-2453 +-8276 +7848 +1988 +-6575 +-5983 +7999 +2776 +635 +-931 +5980 +-7074 +-4219 +-9930 +-485 +-3434 +-4939 +7942 +-1771 +4142 +-5492 +2229 +7903 +5777 +705 +-3096 +2628 +-6433 +9 +8781 +6347 +-4818 +-1714 +-4477 +5203 +-5401 +-4347 +-4119 +4712 +1194 +-144 +-4588 +-8469 +-7993 +-7413 +-3052 +4991 +-5887 +-5397 +-1563 +-5308 +-3198 +-8715 +7937 +-9481 +5878 +4399 +1887 +-5114 +-9811 +-2145 +-8784 +-6393 +-2971 +1095 +-7974 +-9086 +-7544 +-6573 +787 +5910 +6660 +-365 +8141 +114 +7389 +-4337 +3525 +-2689 +4379 +-2871 +-8268 +8735 +6919 +7549 +-7761 +5087 +2668 +-4217 +-8774 +-8409 +6745 +1449 +1662 +-7558 +-8671 +-9414 +-3750 +-561 +-1241 +4689 +7931 +-4065 +5166 +-3274 +6673 +8352 +-4688 +7915 +-3184 +-4741 +9572 +-5050 +-5034 +3532 +-2673 +3883 +-7511 +-7190 +-60 +-8766 +7163 +3898 +6651 +-555 +1726 +-9646 +-811 +-5002 +-2815 +1622 +-2620 +-2368 +-9447 +8756 +-9952 +-5853 +8528 +3145 +-5680 +-6095 +-5515 +941 +7245 +4929 +-239 +-5846 +6410 +476 +1936 +8842 +4469 +-3571 +-7265 +8626 +-3483 +6123 +1908 +4479 +7106 +1196 +3887 +-2431 +-6787 +-4408 +9476 +4022 +4294 +5842 +-474 +1100 +6951 +-9156 +-4066 +2251 +-6005 +5668 +4060 +348 +5166 +-9081 +3653 +-3142 +-4817 +1188 +-9529 +-3042 +-9710 +2676 +-4186 +8583 +5716 +-12 +-143 +8139 +751 +5495 +2224 +8704 +-5143 +-7357 +4585 +8390 +-7962 +7310 +-6057 +-2890 +-8650 +3975 +-3913 +-7553 +-6829 +1055 +629 +-8611 +8704 +2935 +7627 +-9636 +8237 +4830 +7730 +-7655 +3693 +744 +-6423 +1973 +-4760 +-3551 +6505 +-9297 +-7125 +8391 +-2273 +9608 +-3999 +-6216 +6055 +8592 +-1582 +-8419 +8289 +2493 +-9850 +-2918 +-6064 +-9897 +-7001 +-6319 +-5396 +495 +9351 +9646 +3328 +-9086 +-3388 +6552 +-7472 +-9380 +-2095 +1908 +-15 +9725 +9769 +-4410 +-8460 +7601 +4976 +1524 +-4765 +806 +6520 +-8086 +-4407 +-892 +-1562 +-8212 +8102 +-234 +6233 +-1020 +5582 +4988 +-6551 +-1241 +9351 +-5714 +-5747 +-7899 +-9870 +-2890 +-3913 +2511 +7825 +-1465 +-5458 +7473 +4096 +-4430 +-4939 +476 +7030 +-2994 +-8146 +-7263 +661 +1232 +-2233 +-6533 +97 +7162 +4189 +-135 +-5844 +5187 +1278 +-963 +-9151 +-1673 +-5986 +2161 +6311 +-8801 +9912 +9777 +9154 +-9145 +2647 +7626 +8937 +1228 +-8757 +-5173 +-7789 +-9764 +1054 +2556 +7067 +9098 +-3105 +9155 +-7274 +-9837 +4657 +-2534 +3569 +-8219 +7542 +5177 +5297 +9 +-3614 +-215 +-5086 +1871 +962 +4432 +2925 +4003 +-1554 +8430 +5935 +-2406 +1796 +-2107 +-8534 +8139 +1049 +1320 +8646 +-6546 +-437 +-9202 +-433 +9581 +3458 +-7286 +-9449 +-9657 +2075 +3302 +5266 +7683 +4946 +8426 +1947 +360 +-6902 +6245 +-866 +-1621 +-2173 +8955 +8710 +314 +-708 +-5663 +-6808 +9355 +-68 +2935 +-1510 +8228 +7839 +-7523 +3423 +-8753 +8567 +5802 +-6835 +769 +2358 +9338 +5767 +3977 +2902 +-5747 +7700 +7081 +-29 +-5149 +-3788 +-9280 +-3283 +3759 +1970 +-7950 +-6991 +3768 +-4724 +-7381 +-5308 +5825 +-6835 +-2815 +-2030 +423 +2965 +-7233 +3751 +6165 +-2705 +8908 +9410 +101 +-4065 +3175 +7406 +4580 +1003 +1225 +914 +-1582 +628 +-4472 +-4724 +3553 +-573 +6519 +-1624 +1698 +-2144 +-2145 +-3654 +-1112 +8042 +3814 +7047 +2061 +-8355 +-7476 +5177 +1823 +-8537 +-6779 +2619 +-7861 +8423 +5891 +4934 +7204 +4092 +-3393 +8747 +-3929 +-9623 +7446 +8513 +6929 +-4579 +-1702 +-1920 +-12 +-5849 +-459 +-7169 +-5275 +-4636 +1706 +-9933 +-2960 +3171 +-775 +8709 +-6770 +8710 +1223 +-1340 +4201 +5 +569 +5769 +2578 +-6729 +-2294 +-4822 +410 +-9339 +-7782 +4289 +6685 +6810 +-6170 +5866 +-577 +3689 +-7195 +-1000 +-8000 +8157 +5716 +168 +830 +-1232 +4460 +7608 +-6435 +-6784 +1686 +7150 +-4131 +5333 +-4720 +3959 +9200 +7104 +-2494 +-4581 +6774 +-6573 +5625 +-7150 +-6763 +-9054 +1119 +534 +3436 +-5378 +469 +883 +5733 +4060 +9775 +-546 +-5342 +-3241 +-6049 +3551 +613 +-3809 +9220 +9641 +3302 +7151 +5485 +7589 +-1614 +7608 +9161 +-776 +1159 +-898 +-2281 +-9803 +6657 +-2738 +-9169 +9559 +-9988 +-8287 +-2465 +-6784 +4699 +-2248 +9748 +9285 +7934 +-1879 +951 +-6856 +-6395 +5238 +9321 +1907 +2224 +7492 +6763 +-3537 +4542 +-3745 +2845 +795 +8610 +-6154 +-2281 +6673 +-5500 +-8564 +1464 +9495 +-6511 +4007 +-8979 +7972 +-3088 +-4897 +2649 +-5127 +4395 +-5982 +-5977 +8188 +-1231 +8271 +-7132 +7672 +6311 +9110 +1601 +9709 +-4707 +-4006 +-3198 +8426 +-437 +5109 +-7887 +8085 +9072 +-1263 +-1442 +-9811 +6380 +-3528 +-9507 +9884 +2764 +-3473 +-1566 +1908 +941 +3985 +4703 +4803 +2484 +-7762 +-2736 +-5747 +-2480 +3963 +-4081 +-7381 +-7367 +6805 +2246 +-3010 +6502 +-327 +5263 +-4033 +9856 +6298 +1000 +-7181 +6709 +-4583 +-3584 +-9489 +8991 +4118 +8583 +5733 +5599 +-9838 +7618 +2313 +1813 +-9951 +-9479 +-1321 +-7598 +-62 +627 +3480 +1482 +7999 +-3747 +-144 +-786 +7262 +8504 +7449 +3339 +-374 +-1770 +-680 +-722 +-910 +-4837 +-3611 +-9607 +-3482 +487 +802 +80 +-930 +5868 +-5337 +9476 +5802 +2038 +1908 +9911 +-4279 +-1844 +5455 +-2526 +-251 +-4003 +5528 +-7980 +4138 +7806 +-3170 +-8211 +6040 +-4919 +-8188 +-8887 +-5141 +-8314 +4735 +-530 +-6726 +-9667 +8545 +-2938 +-896 +7339 +7149 +-9895 +1032 +-3531 +629 +6338 +6242 +6686 +-547 +-8140 +3389 +6257 +-1592 +2880 +-8616 +-7776 +9782 +-3096 +-2782 +-591 +-141 +-2319 +2643 +-4291 +6268 +-930 +-8837 +2633 +-7724 +6508 +3380 +9037 +1058 +5999 +-3332 +-3600 +595 +-1582 +2278 +-7792 +-1286 +-7070 +-6626 +3242 +7627 +-8094 +-6461 +2143 +2943 +-6940 +-8144 +-4895 +-9651 +1092 +-5428 +9241 +8066 +-5982 +7136 +-775 +2327 +9695 +-5762 +-4360 +-1920 +-2490 +-9470 +-2195 +8062 +7295 +-372 +5405 +-7791 +-2780 +7207 +121 +-239 +-4231 +6238 +-3224 +-3968 +-5143 +-4095 +-3286 +9273 +-4470 +-8594 +-7749 +-5780 +4032 +-6339 +-5143 +8210 +-4990 +1081 +399 +5863 +8150 +8608 +9171 +9506 +875 +1074 +8483 +-6503 +-437 +292 +-6444 +-6610 +5314 +8228 +7464 +4752 +5686 +-7086 +4661 +-220 +-1814 +7483 +-6797 +-9674 +-9325 +-7157 +8430 +-6296 +9172 +2451 +-9236 +-8870 +3809 +-3494 +-735 +-4751 +7119 +7438 +-6212 +-871 +7069 +-5384 +-2793 +4954 +-7490 +-4323 +-8174 +-3823 +2321 +519 +-2038 +9470 +-2941 +-7074 +3711 +-8241 +-7258 +8782 +-5081 +-9083 +4639 +7489 +-3732 +-2181 +-7835 +-3341 +6892 +9551 +8925 +7295 +6627 +-1837 +1055 +-9241 +-6009 +4286 +-4300 +378 +-8197 +-8710 +-9750 +3949 +3866 +6834 +-580 +5241 +-4842 +3772 +-2092 +-533 +-811 +-8206 +7739 +6060 +1677 +2910 +7435 +23 +-6320 +-7394 +8574 +687 +-4875 +-8854 +959 +-2586 +9601 +-7146 +-2762 +4427 +-7854 +-7832 +-4081 +-9363 +-9236 +9177 +-7276 +-1722 +952 +8924 +2639 +1718 +-93 +5959 +-786 +9945 +-5826 +-5072 +-659 +7855 +5622 +9846 +-5239 +-8027 +-2448 +-8157 +-495 +1538 +-4131 +-5333 +1869 +7090 +5832 +-1673 +6269 +-4200 +1353 +-3005 +-8393 +8355 +4075 +-6743 +-6274 +8182 +-4634 +2222 +1872 +275 +-3038 +1292 +4072 +9271 +-8496 +9112 +-5147 +-5094 +-1612 +-5341 +-8152 +39 +3195 +-5501 +-1730 +-8789 +-5308 +-8719 +7067 +-2301 +-1562 +-1006 +5338 +-6030 +6606 +1788 +-3425 +4830 +-9875 +-1768 +-8536 +6050 +-3149 +-2359 +4954 +-2114 +3963 +8483 +9831 +-2682 +-8462 +7841 +7867 +-5677 +-4377 +-1422 +-5122 +-963 +-9438 +8089 +-437 +8220 +-4649 +6452 +6173 +9228 +-8940 +-4299 +-5817 +-3198 +6337 +3500 +-4969 +9140 +255 +-2446 +8430 +7293 +2613 +-7794 +9691 +-4005 +-3919 +-7951 +-3466 +8101 +2032 +-5441 +-3461 +1308 +-6062 +-3060 +6327 +-2367 +-5094 +7138 +-6990 +4311 +-4164 +3171 +4171 +-671 +-5435 +7043 +9538 +1129 +-8941 +-6074 +-9688 +537 +-4430 +-5736 +-4552 +3123 +5628 +9868 +-9236 +-3874 +6055 +7942 +-4969 +456 +-8152 +4749 +-8110 +7627 +2154 +-957 +4164 +-5518 +5562 +-7600 +4555 +-6871 +-2872 +-5113 +3443 +6616 +-5458 +4588 +-3727 +-9475 +-5747 +-1884 +-4395 +-6573 +3709 +-3342 +-6778 +-7442 +5863 +-2314 +266 +1416 +9556 +-372 +1367 +9685 +7530 +-469 +7347 +-7394 +5818 +9458 +-3570 +4845 +-7970 +-1256 +-1392 +2275 +-1549 +638 +-5780 +2260 +-518 +-3263 +8545 +2180 +6446 +-578 +4028 +3809 +-4355 +-4817 +-1639 +7996 +9686 +9349 +-5350 +3576 +6887 +-9882 +-7678 +-3043 +-7461 +-9222 +-3719 +2798 +888 +973 +2590 +-7413 +-6795 +1612 +-5578 +-4300 +-8836 +-9389 +-7854 +5060 +350 +2909 +-522 +3826 +-8945 +-8266 +6101 +8293 +2705 +9681 +2296 +1842 +2751 +-8481 +4294 +4476 +5350 +-5375 +-9285 +-7728 +1627 +8595 +8104 +4377 +-4297 +-6918 +7004 +1983 +-7789 +-2207 +8214 +4805 +-4117 +6897 +-8960 +9827 +-4581 +-6721 +-8463 +-9431 +4651 +5950 +3700 +-6331 +8650 +737 +95 +8727 +-2251 +-2681 +575 +8270 +-3165 +-8784 +4432 +-6903 +3526 +-2018 +-6389 +-4297 +-2293 +3704 +7895 +-7621 +-1895 +2073 +-5006 +-362 +6357 +6677 +-5364 +2845 +285 +96 +-844 +-1665 +4701 +691 +-5141 +5553 +5726 +-9912 +8854 +-4507 +6931 +691 +-2204 +-2635 +7844 +-2374 +-4171 +-4696 +2484 +2768 +2789 +-2207 +-3890 +5031 +4536 +5653 +-1598 +-5903 +4333 +9642 +5884 +1548 +3553 +-1502 +-8632 +-1177 +7762 +9907 +-664 +-6873 +-7575 +2248 +-4472 +-144 +5562 +-8300 +4405 +2388 +-6690 +-484 +-5576 +9349 +7804 +-3772 +-7790 +-8897 +2352 +3701 +9413 +85 +-7309 +6235 +-2995 +-6693 +3039 +2887 +7319 +3544 +571 +-2328 +-8807 +-106 +-5515 +9689 +-6405 +5553 +-9 +-1333 +-5687 +9927 +-7997 +-7310 +8762 +-5132 +8741 +-265 +-2735 +-5887 +-2353 +-3111 +1104 +1483 +655 +7575 +3192 +-8138 +-6806 +7207 +9448 +2508 +-9599 +2802 +-8801 +-8858 +-278 +199 +6609 +5675 +5010 +7510 +-6521 +-3929 From 8d2b7be327c5fde2441a6281d49d9a896e0bb9f3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 20 Dec 2022 13:45:09 +0100 Subject: [PATCH 355/479] 2022: d20: ex2: add solution --- 2022/d20/ex2/ex2.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100755 2022/d20/ex2/ex2.py diff --git a/2022/d20/ex2/ex2.py b/2022/d20/ex2/ex2.py new file mode 100755 index 0000000..e6accd4 --- /dev/null +++ b/2022/d20/ex2/ex2.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +import sys +from collections import deque + + +def solve(input: list[int]) -> int: + def mix(file: list[int], rounds: int) -> list[int]: + shuffled = deque(enumerate(file)) + + for _ in range(rounds): + for i, n in enumerate(file): + item = shuffled.index((i, n)) + shuffled.remove((i, n)) + # Moving the item to the left means moving the collection to the left + shuffled.rotate(-n) + shuffled.insert(item, (i, n)) + + return [n for _, n in shuffled] + + def coordinates(file: list[int]) -> tuple[int, int, int]: + zero_index = file.index(0) + indices = map(lambda n: n + zero_index, [1000, 2000, 3000]) + return tuple(map(lambda n: file[n % len(file)], indices)) # type: ignore + + file = [n * 811589153 for n in input] + file = mix(file, 10) + return sum(coordinates(file)) + + +def main() -> None: + input = [int(n) for n in sys.stdin.readlines()] + print(solve(input)) + + +if __name__ == "__main__": + main() From c7f7e2a590f1dd8b7ac14689f3ffb396fa8fbbfa Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 21 Dec 2022 12:54:28 +0100 Subject: [PATCH 356/479] 2022: d21: ex1: add input --- 2022/d21/ex1/input | 2293 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2293 insertions(+) create mode 100644 2022/d21/ex1/input diff --git a/2022/d21/ex1/input b/2022/d21/ex1/input new file mode 100644 index 0000000..78a6d25 --- /dev/null +++ b/2022/d21/ex1/input @@ -0,0 +1,2293 @@ +jtrg: gcpq - fvjz +vjhv: 4 +fcmd: 5 +djgl: gwjr - vbpp +snzw: 2 +lswd: bcnm * vdhw +lqvp: 5 +qwqj: 3 +zrrv: 4 +hpnm: 5 +wsfb: pmhj + ftds +wpqh: 2 +mjhb: drbf - lhtt +vmnt: 4 +tqlp: 1 +jddv: mllh + zwmz +lnqh: mwzc + fdwf +pmnp: dnhl * cjbb +nznb: 10 +pbzf: 2 +mwsh: dhff * ddzt +znwg: fvtf * pvfj +nnbp: mbzc * smhz +hlbq: 4 +fqcp: 11 +jzhn: 2 +jlbj: dnth + jjlw +nhdh: wdhl - zsgd +qvmh: 13 +ffng: 3 +jsld: 2 +cshh: nrdq + sbsn +jrcq: 2 +bsmt: 4 +wfhb: 10 +cmzv: 3 +plrf: 4 +mmtl: 1 +pqlw: 5 +tstp: 4 +vgjv: 6 +rncj: ctft + lslz +stfq: rnjg * vqsf +rcnd: djgl * qmfb +sntt: jhrb / hqcg +fbdq: 2 +stcn: tjjp + bdgs +lmcz: wmfn + gmhc +zfwp: dcst + dmlt +cssc: 1 +cwfs: 2 +qcts: nswn + gjgd +nwsf: 1 +dmwq: 13 +mdfc: 2 +qswf: 2 +jzjq: bfdb * qssl +cntb: 4 +lsgz: 5 +gnfh: fbqz * zptq +zpcm: brlb + bsmt +wjdr: 3 +grfq: 5 +fbqz: 2 +nswn: sqlp / jctd +rszm: 2 +dzpm: gmzt * nbsz +qvbz: 1 +lclw: zglp * gwdq +fqhc: rncj * hfvv +wzhg: 2 +fvzr: nrvw + gnfh +bznd: 7 +qvgj: 11 +qqjs: wrnn * vprv +swmz: 5 +vnsd: 16 +htdp: hcwn * vfmg +schl: sprf - bqbp +qgrh: 2 +mmlz: 5 +qhvj: 4 +smvn: 2 +cjcv: hvdv * dnfb +hgdg: sqbl / lvsn +lbbz: gdhl - dvhb +tnwh: znff / cppg +cctm: hnbf + rrzz +mtlr: 4 +fnnb: wpbs + vntw +ffdv: 2 +zcjd: 4 +zhzr: 2 +hcwn: tqcc / jlwh +zbsr: 3 +fncf: 4 +wdvc: 2 +nstj: gglr * ffvv +dvbq: qlvv / vnhv +lpss: 4 +pnlj: 5 +fjwm: pljt + wsrf +gwgw: 2 +ndfw: dppd + wssb +tqql: 6 +prsm: trpd + rcnn +hltd: mdcm + jpjh +lmgz: wzhg * bchn +ptws: lfvh + gflw +pwjw: nvsc * gjrw +qqzg: 2 +btpq: wscz + drtm +lbfr: hfqg / lzhw +jzjc: 4 +gpsw: jszl * fcbh +pjzl: 5 +lshr: 5 +dtww: jvqv * blhs +gvsq: gdds * nvgv +ttwt: 7 +frng: jrhh * bwdw +qdtc: qqnz * jwmz +smws: btmm + svdl +dwcm: hpnm * jdth +zbwr: fnhz * lvhl +crjp: zcgw * hnzn +pdfd: fhts * ddwq +tgvm: rsmh / ffpn +jtrd: twrw * nhgm +fhrq: 15 +hqbg: hhwc * vsmf +wssb: rtgm + tgvj +dhff: mjft * ddwd +zczs: 3 +jswv: fhls * clvh +cqdv: nfrj * pznq +blrq: 3 +qrgm: rgsj - zgpd +drlt: 10 +tnbr: bfwf + qltm +cvtg: 5 +qzbq: hqrp + psbt +hncw: 3 +mzsm: zqnb - tqcj +gbgs: vrfn * lcwj +lhcz: njrl * rztm +gsrm: chbh * dgdl +pwzq: fpdt * rznb +mbqh: tbrt * blrq +fnbb: tcdt + wjtw +gwdv: 8 +fhdf: 2 +sqrc: lhcz - vqnp +rrsb: jzhn * jgqm +wcwq: vmtp - wwzs +hgvf: ndws + dtdv +htvl: 7 +bssv: 3 +csdm: 4 +zqgl: 3 +tcgc: 3 +gqvf: gzdz * gtss +stjc: 3 +vnmt: hvbs - tvtw +cszm: bvmr * hrsr +hglr: 1 +zbnp: 4 +qtwt: 4 +thfd: qwjw + lpvz +wrwh: dwzn / vcms +wdwf: 4 +swfz: nvsl + jqrs +bwdw: msdh / nvtf +qrqq: 19 +pzhz: gjgl + gvjb +nztv: 2 +lcws: 2 +mfmn: 3 +cqwh: blbl + jplh +ltcd: pshp * pnlj +dlbb: 5 +bshq: 8 +tjpt: srpd * srrg +hqcg: 2 +thgf: fssb / zfnh +zfbv: 2 +http: vssf - nbcv +fhcq: rplb - sfnm +pvcr: 4 +hzvl: 5 +flzl: 2 +cqpp: rmmj * pmdg +cgqp: 2 +fqbg: cmzv * ncjl +tshv: flbg * vlgh +qwrp: lqhf * lttb +bvmr: 2 +ppnj: 16 +jsrq: 3 +qnbf: jrcq * mmgn +hgnn: 2 +jtgb: 5 +hmtz: ffdv * vwng +lnjz: dfbw + nhjb +vmbv: lnpp * cmgr +jvgr: mrzm + jjmh +gtss: 3 +fpcp: lczq / zgrr +jlfc: lstv * vfgh +wqjd: lprt + jrdc +gvsb: tpch + jhrw +lpfq: wzgj + bplr +mzhb: 7 +nwcb: 2 +lszb: 4 +wgzs: 5 +gthh: dsbq + nbgd +jrvt: 2 +zmnt: 2 +rczp: mqjn * lbmp +cpmj: 11 +gdsh: rqdt + wmbb +gcvh: ndtg * tllz +jbrw: fgtb + hsnt +dzwf: 6 +tqlq: 1 +bplh: 2 +fmmv: 13 +lhmd: 2 +qwqh: 2 +qdwc: fhdf * jcvn +btmm: trnr + nljg +pzqc: 4 +wrqm: 3 +szct: ffsw + nwzz +gpjb: 5 +htcs: lnbn - qwbp +zwsn: 2 +jcmn: pvrq + jtmh +qzmg: cwqt - hhlw +nmzp: 4 +ffhm: tgvm * rnrq +mcrc: 3 +ndrn: 2 +rggc: tgcr + wfwp +bsmg: gjjq / fmnl +grwz: bfch * mfvl +cbnr: plls - nclc +ddlg: dmtw + sjnq +jfqf: pcbc * fnnb +hwlp: fzrg * bmbg +sbsn: vdct + bdss +nprn: rbwt + snss +spjm: pppj * pbzf +trpd: 18 +phrl: 5 +njfq: 5 +dzqb: sqzm * rhjz +bldh: snqq * tlvz +djcd: vsqb * ddvz +lqtl: cqdq - bftl +bhcq: rzwg * gvjp +bgsg: 10 +qprs: 1 +plls: 10 +bjmj: 2 +tfbz: 2 +fzdd: 14 +hqhc: pfsm * jfct +rdlc: 2 +zfnh: 2 +pwcm: wqws + qphw +qrjm: bpjc * qcrz +mnzp: jwvj + wgzs +zghq: pljc + vprr +dnfb: zdwz * qfmz +znth: 3 +rlwz: 2 +ggbr: 16 +hrdf: 5 +pghp: 1 +rqvf: 3 +jbmb: 14 +tjbr: pmwb * nshg +hsfj: 2 +ljzn: hsct + ctnr +rgtm: 5 +nlwj: zllm * rzqg +swsq: sghd * nbcm +bdrv: 18 +whpf: 14 +fnnh: 5 +bsfs: 4 +rtlz: dddq + jmpb +nhgm: 5 +ndws: 1 +nqlc: 7 +dsvw: hjfc + zhnq +fngh: 5 +rljz: 2 +ddzs: 2 +ghfp: zfbv * lwzr +hqrp: 2 +lbrp: qjfv * plsf +qlft: 4 +fbrc: 18 +ddwq: lclw - hvqg +pbtv: jsrg + wwpz +fgbd: hjjh * fdhf +tmqt: gvsb + dnnl +mvfn: ggbr + thqt +gmhc: 19 +tglv: zsrc * sdgj +hwdn: 3 +pdpz: lzvh + nvfn +blhs: jbdm / qvqb +ztvc: 7 +zpjn: nsmz * smvn +sjpc: 2 +gflw: zqmw + fgqc +tdvj: 2 +jhhj: 5 +plmg: bgsg + bnfs +vzvj: 3 +rplb: vnff / drlr +mvfr: phqs + rggc +jrdc: 2 +vldl: glww + tlfz +jmdl: 3 +nvnp: 4 +swgs: 5 +pmwb: qlvb + wzzz +rhqq: 2 +fgqc: dncf + tqsn +bcbr: 5 +mwtd: 8 +nprt: 2 +ljzs: 6 +wnnp: 2 +czdw: fvhf * btpl +tlhj: 11 +rqff: 3 +vhrw: dwvz * trjz +jsft: gccz * prvd +zjzm: wzsf / bpll +dwwj: qnww / mmcf +vgqz: jcmn + mrqz +pchw: ghmt * znql +jrqb: gqzb + ndhv +dgdl: tstw + zvfn +pcbc: 3 +vqnp: fqbg * nqtd +qmdd: 2 +wctc: 2 +cpmt: 2 +tgdp: mfvn * rvhr +cdnp: vwnl + bhfp +qqpp: rtlz * fhgh +dsrp: nrwz * fzpf +mndv: 2 +rgjj: lmgz - gggw +tbbv: lntf / hzbf +lnbn: flvv * ddlg +qfmz: jswv + qbjn +zclw: 4 +qhtd: pwrp * hqwh +jzcz: 2 +qsgm: qthv * nmzp +lzvq: nfpz + jddv +bnjm: hfrm + hwlp +njvp: 3 +cctv: njhw * jcbs +lfgr: tjpz + tbhc +cmgr: 3 +lrpg: jhsm * vlzc +nsvp: 4 +gdhl: nbpt * rclq +hwzd: ndsq + lsmv +gsfg: 5 +hfqg: mbqh + mbhw +ttbz: 2 +mjbw: 7 +svdn: bczr * mpmg +vhdl: mmzz - whqt +bgrr: zbnf + snqg +nwmc: mfjn + spjm +cfhf: 3 +lrwn: 4 +qvrz: 6 +tjhv: 7 +lhww: 5 +htcc: nwrh / htmh +qjdt: sdgq + humn +jcll: rhqq * bfct +rzgp: ggsz * zcrr +nbgd: vvsd + gcll +jlwh: 2 +vwwh: 1 +czdb: 2 +gbbs: 3 +flfj: 3 +rttt: dfmf * gcrf +twqq: dsvd * vzrl +stgf: 3 +frpq: 5 +gwhh: 2 +mrzm: jbln + ljzn +smbv: 16 +zglp: vcwt + mmhz +nzlm: 4 +mbhw: jbrw + jvgr +vlzc: wbtj + sqhb +bvwd: 3 +qgsf: trwl * qvrt +brlb: qsfp * sqhd +smch: 3 +fgvp: 12 +sbdv: 2 +hcdp: tlgh * jppq +lszn: 9 +dqtl: pnwd + zzss +fmwj: jtqt - gfpq +wcfl: 4 +tdmq: 2 +vqvv: 2 +jqdf: 1 +vffn: 5 +hbhj: zlwm * jdqp +mwzc: 19 +gbsz: npcg * cvtg +whzh: 2 +rhjz: 7 +lfwn: 5 +jtzh: 1 +hbbj: rqcn * pdwm +djlq: ncrq - ccpq +zqbp: wmvj + pdpf +bwnt: 3 +ntrn: 6 +nfmg: vblt * tgdp +ccvm: 20 +fdhf: 2 +hqjt: fwsq - pmrv +bmwj: 2 +svvr: 2 +jzmc: 3 +jrrn: tfjh * hwnm +msmz: pdcq + ffhm +blth: 3 +dmgj: bwdq * cctw +njng: 3 +bpjc: 13 +ztfc: fwqn + hqww +fsgw: gvgr - mdfc +lgpd: 1 +jmlj: 3 +zbvf: ffbn * qmvv +njjd: gcgw * lqpg +gplr: ngdz * vffp +pgrm: 18 +mjqb: 5 +cmtl: qsqt * wdvc +bqvs: 2 +lllf: 2 +pznq: 3 +wbpz: cghq * tglv +fbmm: lpgn + pjrs +pljc: rcwv / vnmz +cmgq: bjcj + jzbn +fmvc: 2 +rstf: 20 +zlwm: 5 +gzmh: lswd + zrvt +btpr: 3 +tpfh: 5 +vfsz: 18 +qwjw: 5 +hnzn: mmtl + tjtv +rgcg: 8 +jdbg: 3 +tvng: 2 +nvbz: 2 +rzwg: 5 +bftl: 4 +dnnl: jvjc + fnzz +jdth: 11 +qhdq: 2 +hpdp: phrl * nptm +jndt: 1 +wsbm: spzh + hstn +shfg: zgrn * qcwb +zthv: 4 +qjvv: lmgg + dgjp +tlwh: 2 +qzfr: 1 +jbhd: frdt + ppnj +jhsm: 11 +bgwg: lwcv * bqlz +qfth: 3 +wzpd: mgqp * hvns +htzw: 2 +mbbn: bvwd * htvl +dppd: nptj * bwmz +qhdd: 5 +dbrb: dhwd * qsjh +vbhd: wpgg * jrtg +mccw: czdb * fvzq +ljnc: 2 +dcst: vvcs * fgqh +qqnz: qhgw - djct +nvsc: qwrp - wvnh +cbhp: 5 +tqsz: zbnp * tpwq +cmgf: 2 +lcwj: hzth + spzs +zmwj: pwlh * tfjl +sfnm: bzrh * bgns +sdfm: 2 +qcrz: 2 +mjcw: 9 +dvdh: ctts * qcts +rfql: vpjv / mzjh +bnbz: ggmn + pghp +mhmd: 2 +bplr: 5 +jhcs: 2 +fhls: 2 +wcwg: 2 +jngd: 3 +twvm: 7 +mfvl: vncn * zccc +sgcz: hrgv * tvdc +jjcl: wjdr * zbqp +fnzz: 6 +tjjp: tnch + gqvf +qdwh: jchm * ndrn +gtbb: cqcw + tdrm +bdgs: tmfw * wbqr +swjl: ghnb + pbtv +dsqj: vlsh + hmvc +pvfj: 7 +snrn: 19 +vnzw: lcgc + tjpt +bdsm: 5 +zbhr: zggg - vfbj +mvhp: svjl * bfgq +vfgh: gvmv / cccv +psqm: 1 +jtvb: cmtl + sdfm +qdsd: tsmb * lrps +jzdl: 11 +zbnf: lzsb / bshq +rwsz: flrm * htnj +wddq: qpzz * jngw +nczg: rvgj + ztjj +bzrh: 16 +qpqn: cfsr * qbqq +lwzr: jtrd - qhsf +cfsr: 7 +vzvr: nrzg * qzbq +zrgn: rjnp + jrqb +tgml: 1 +zjzn: 4 +rznb: 3 +nzsw: 3 +pgqj: 3 +vmss: 2 +mhgw: 13 +rtnd: 4 +jthr: 2 +tstw: 12 +qvcb: 4 +pbhl: psmj * mbbp +jcvg: mbfh + svjg +prqt: rcnd / ncnr +rgsj: 17 +nlrv: zbsr * mdhh +chdg: 5 +mcbm: 6 +ntps: 3 +dfdj: wcnm + qvlz +zmvl: 3 +zgbr: gcqd * lbrp +trjc: 20 +nfrq: wcwg * bssv +qtjq: 2 +qnww: vfqv + rgnc +vbsh: 3 +jwvj: 2 +qpzz: 2 +gdjt: dqrj * lwgv +lzsg: 3 +drww: 11 +rlln: 2 +frmj: qdwc + bldh +bfgq: ztpf + hwfm +pnwd: mndv * jchz +dptr: ttgv * jtst +nzmf: bvhz * vlvl +czjc: 2 +tbcs: lggq * vmlh +sstp: qrjm * vfdb +cmqq: 2 +nbzg: 6 +cpfr: gzmh + chct +lhrp: qfvw * snzw +nnlw: 4 +mvls: 3 +ghrg: qpqn / cmpg +tjpz: hqwt * wsbm +psgm: jjcl + llsh +czfb: 3 +wfwp: mmlz + lrjp +dgdf: sstp + nvnm +tttc: 7 +vdct: 7 +mstt: fwvh * cptm +rlzt: wjgb * tsrb +rlbv: 10 +mjnb: crnp + zvlq +qlgr: 11 +mjnr: 3 +rtzs: 4 +lhlv: fqww * rldr +ptmr: 2 +nglm: 2 +mtdz: njjd * gfbg +wfpc: gsgr * zdzt +jtnd: 5 +gvzz: 10 +lqhf: 19 +rbrh: 4 +qhgz: phgs * lnqg +wzjl: 12 +svdl: ztzb * fmwj +vmmw: 2 +ttmm: 2 +vvzh: dlbn + dwcm +qfbb: 3 +lntf: lnts / hfff +hwnh: 2 +rtgm: 17 +zrsg: 3 +zzss: vmnt + zqgl +thht: 10 +tvdp: trnv * zfvm +bhpv: 2 +tshn: qdwh + djcd +thhg: 9 +whqt: fqcp * vvzh +ttml: 9 +mcsn: 16 +prvw: 3 +nrzm: 14 +mqmf: 3 +qftq: 2 +pshp: 5 +sqqh: 12 +whcc: 7 +cjqf: mjfd * qlwh +jchz: 5 +dggs: 4 +swgn: dlww / tvrv +zvvp: 3 +gtmc: qtwt + wscl +msmh: 3 +tgvj: twrz + trjc +ptrf: mtlh + ttwt +zmfw: 2 +mzhg: 3 +chgl: 2 +rcwv: http + trqf +tbgz: zclw * hcdp +svbc: dzsb * vcbb +sltd: 16 +nhjb: wlch * zbns +mbhg: prbw * htzw +bqfj: rmlg + tqpm +jswp: 10 +wndm: lqfp + qrzq +qszr: lwbr * mzsm +gwjr: mwtd + nhdb +dddq: bpdt * dqtl +gqst: 2 +mhbp: 3 +vmgn: cnhm * vzvj +mwtb: lqtl + pzml +djnb: 3 +mgwj: zfwc * vbzp +qvlz: cbrz / swgs +dmlt: tvng * pvjr +vljz: vjwv + zsth +ppjm: jmdf / qphn +ggsz: 3 +fllf: vtns + rrsb +fbct: 3 +rcnn: 1 +frch: gpsw + blpf +nshg: 3 +ghpd: 8 +dwcv: 3 +hhwc: 2 +btvv: dpgr * hgvf +ftfn: dfzf + vcsb +mtvr: 1 +bjvn: vsbt + tqsl +wbtw: dhbb + msmz +fbpq: vgrh + dqwz +rspd: dfdj + snjb +bdmd: cnrb * pcjl +zjmz: zflw + npvm +qjss: 2 +mfjn: 3 +bpdt: 2 +rgnc: 4 +tlgh: 3 +wvnh: wljd + cntb +jftd: qwqh * mmtv +svtt: bcbr * hrdf +zcsq: 2 +cmpb: 2 +lsmv: fldl * jwnv +cfbh: 4 +fnzp: hwdq + gqrz +jrhz: wshh * bqwf +cwff: fpcg / vcdp +tqsn: jsss - jndt +wsnp: 10 +mbfh: 10 +nnzh: 2 +vvpr: mmdc + qdtc +wnbs: 2 +jwgn: 5 +cdhw: tbvt * cmqq +hrgv: jjqs - ghfp +gggw: 1 +zbmw: nlmg + npbq +hzth: 5 +sfpd: jrhz / nqgr +pbbm: 2 +pqjr: vjhv * ngln +dvhb: pptt * jcvg +hbrf: rznw + brph +zbqp: 5 +jrfd: 2 +ttzm: 4 +tzbd: 5 +qthh: 12 +zbzs: 4 +qhdn: fgss - glfv +qcrr: cpjl + slnc +frdt: wwbb + zwsh +hzjl: qtct * wmtz +vdbw: hltd * rjlb +snqq: thfd + cwjn +nvtf: zlgj * jjfq +rldr: npcc + rjrg +pjlr: whvr + vmdp +qlvv: qlth + wtfl +mdhq: tlbj + tbgz +drpf: 2 +dsvd: 2 +mmgn: vtqs + wbjg +fwmd: 13 +rfnb: 4 +ftjn: 2 +ttrt: 1 +tzns: cnml * fwbj +sszm: 2 +jmmd: mlns * ggsd +jngw: 3 +ghdl: qlhz * wcsm +rmfn: vmhp + brbj +tdrm: jrlv * zjjb +vvsd: hdnj * jrdn +pptt: 14 +wbqh: drzr - nnbp +dvrq: mbsq + hjnp +hmvc: jbnl + lzvq +djct: dzwf * dlnv +rcdr: 4 +glhf: 2 +nclj: 1 +qlth: mzhg * pnzd +gzhh: 7 +jvcd: 2 +mzjh: 2 +psjs: 4 +rtmp: lllf * zsfr +tfqd: vqmz / tdmq +wbjg: fqhc + dnwp +hgcs: fzhc + fmdt +pnrf: 4 +rjnp: jgnp + mcdl +pmml: 14 +nvst: 7 +ztgn: 2 +ptcd: mswn * rdlc +nwrh: vbhd + srjq +spdf: 2 +szwt: 10 +nlws: tftg + ldsb +lnpp: lrhs + rqzs +dwzn: vdbw * jrfd +nqgr: 3 +dpqs: 8 +trqs: rtgq + pgpt +hfvt: 3 +rqrt: 3 +fnzf: rlwz * sqdw +ccpq: 9 +bpzr: 10 +tllz: 2 +tsrb: jhhj * bplh +rlvs: wlcs + clbs +bzhc: 6 +sqhb: zzsb * qvgj +qbcp: 2 +trjz: rzgp + bjtr +plnr: 8 +wlrd: trhr * bzsh +rptt: 2 +fwht: 2 +cctw: 3 +zhjr: ptjl * zgmn +gmhb: wvtt * msmh +tjlr: fhjl + wndm +vjwv: zwcn * fllz +twrz: 2 +whbr: 5 +wrmm: qqjs / wwfm +mgvp: fncf * rlln +tclr: rfst * wcgv +wmvj: 2 +wsrf: 3 +czdz: 3 +djvs: qswt * cwhz +fmcj: 14 +gvgr: jrsq * znjl +tcpp: qvbz + ddng +nptj: 2 +vdfv: dggn * zghq +lggq: 3 +vvcs: drtr + fqvf +hrsr: czjc * fzdd +spzs: dmwq + cvnp +tdwc: 3 +hvsq: mhbp * hdqh +hlhc: cwbv + bcsh +ndwd: dpwm * dsrm +mwjm: 1 +fhbt: vbnh * sbdv +dhbb: ttmm * svbc +jmjc: 2 +lvhn: 4 +cjfr: 5 +fzrg: 2 +lslz: sfwp * nnlw +nfmq: wnbs * mfqd +qwzc: 6 +fnjc: fmgv * shfg +wjpl: hbbj + wnnp +bjtr: 1 +cbts: 6 +pzml: gqqs * vrds +cprd: cvsc * gzrf +zrpj: swsq / jncf +rcjj: tbbv * bvhw +bwdq: 3 +dfmf: ljzs + wpqh +cpjl: 5 +hgbc: jhpl + fhbh +qswt: 9 +tbvd: 3 +smht: nzsw * ntgm +wfvc: 1 +fwqn: gjnn + mrhn +rjsh: zljs / gjbl +ljnh: jshp + mdqz +qlvb: rqff * wctc +zzdc: gvhl + dsrp +pbsz: gbbs + zjzn +hzbf: 2 +rbgn: 6 +vvpd: vghv * jsld +bmbg: 4 +gjrw: 5 +fqrw: 16 +mdfm: 3 +zdzt: 3 +jpll: fvzr * vmcp +cnrb: 2 +vcwt: bslp * qjss +sgzq: ptcd + vsch +wscc: 7 +nbqw: qhfc + pfft +zftd: ztnz + lshr +lwbr: 2 +mjqh: mwjd + tpfh +vntw: hvsq * bmbp +jmdf: wsfb + dhvj +mlns: cgsl / cwfs +qbqq: 2 +sghd: 2 +wlsv: 5 +mrqz: dwcz * zqwg +pgmf: pwzq * qzmg +bqlz: rbgn + qrqq +ndml: sqqh + jbtv +lwqj: ndfc + qfsd +thzq: 7 +bcsh: gwbb * zmpt +jfnd: mlzr - lcvq +nwps: mnrv + nhdh +bghq: 7 +ncnr: 2 +rvhr: 2 +wdls: bdsm + vhpb +rpcj: 5 +wzgj: thhg * qfbb +crpn: gtqg + fdrw +ptsg: pwcf * cfbh +llbs: rgns - tcmn +bcbv: 1 +dwpb: 2 +lqhz: plrf * zfsz +jncf: 2 +jbnl: sqnc - djvs +znhf: rczp * nglm +fwwb: lhrp + schl +wpbs: 1 +wrsm: hlhc * njzm +fbpg: 2 +hhnt: tgpw + fnmz +fmdt: mjlm + ntrn +spvg: rghc * jrrn +wlwf: rstf + clgp +whlv: 3 +ttgd: 5 +ssss: 3 +vdff: 5 +jzdr: tdpv - vnsd +pcfz: zcjd + whcc +gprb: 3 +hfcp: fhpp + qdct +zzsb: 4 +frhj: vnwn * fnnh +tqpm: vvbs / tfbz +jhrv: ptzt * stgf +hzbl: 2 +zgqv: mtml + wfvc +jgqm: jhrv + qhph +npcg: 3 +wcnm: 10 +vssf: qvbr / chgl +tgcb: mqbj * qmdd +mbbp: sqsc * gpbt +wvtt: zczs * qzjd +gnjb: lnwq * qjbw +lbmp: 2 +lzhw: 2 +dsrm: 18 +lcmq: 2 +hsct: zhww * htww +qmjd: 3 +flvv: 2 +jctd: 2 +ffbn: 3 +nbcm: cjfr * jfcn +fvgl: 4 +bnfs: 1 +mwrv: 2 +bzpj: 3 +zqhv: zghv * qmtw +jfnq: 3 +vcpt: 6 +fztq: 2 +wfbt: 2 +dfbw: bbhh + gdjt +vspm: wfpc / zsnb +nrzg: 2 +tvmq: 5 +lljt: nvcw * hsjl +dvjd: dzfw * wsnp +qdct: ztgn * njfq +wvrf: 6 +dzsb: 2 +srhh: 12 +jcjv: cjcv + lzcp +zrbq: 3 +hbbr: czfb * mzhb +qjhl: sljw * jpbw +qltm: rlbv * zjfb +npbq: jlmf + fhdb +spwv: 2 +wvrz: rpln + fwmd +lhgf: 3 +gfbg: jhrs * bsfs +lsqd: 3 +srzc: fhcw * fsfp +ldmm: 10 +cppg: 2 +vdpj: clls * mhhg +btdb: wqhm * pgrm +lrzt: 4 +lnsm: 7 +sfww: 3 +jjbq: 7 +qfvw: zcsq * ljnh +bspf: 2 +smnt: 3 +jjlw: fgwm * htjn +tvhp: 3 +qrrh: zzcd + gwrv +mbsq: 1 +cqcw: 9 +bnrc: 1 +gvsn: 2 +tvdc: 11 +pshs: 4 +lhcp: 3 +cghq: wlrd - rlvs +tjjg: nfmq * mjvj +hhlw: 4 +fzhc: fhvr + fnzp +zjfb: ltsl + tzbd +gbqg: 2 +mmgf: nstj * gcjf +dpfg: pfsj * vwvj +bfws: stcn + nndc +qdlh: 2 +fdnv: vmbv - mjnb +ddqd: 2 +htms: qvjr * sglf +cnrr: 6 +ptsz: 5 +hsjl: 6 +vvlm: 2 +hrwz: 4 +dspv: 3 +fhbh: gplr * mdrb +zgrr: 2 +fdrw: lsqd * qvcb +gbtb: 2 +mszz: 5 +vmdp: cncm * tlhf +bfch: 2 +ztnz: 1 +rsmh: gfnr + snll +zmvd: 18 +ctnr: 10 +hqzd: swjl - fvrn +rclq: fcmc + dvtg +bqdg: bqdt - hgnn +ntzw: wscc + nbzg +dnwp: zfsh * szbm +fhts: 11 +qqgf: 3 +mrnd: vwwh + cdhw +rgns: vmsg + flvh +fdwf: qdsd / lbbb +szlw: 7 +pqqt: 4 +dbrv: 4 +zrvt: wrwh * gmhb +tljd: 2 +zncn: mbdv - cwff +gnvq: qqzg * ppjm +zbst: fnzf - pqlw +jszl: 4 +mmzg: 2 +zfvm: 5 +ptqf: 4 +tzfm: 1 +bldl: crjp / hlls +htnj: 19 +cpwn: 9 +mmtv: pstr + rlqb +chtq: 3 +fhdb: 14 +pmdg: 4 +jbtv: fmmv - hwdn +lnwq: 7 +lrps: 10 +btpl: 11 +lnts: nqjg + brrf +cwhz: 3 +vnwn: scvz + qjwp +gglr: 3 +qtgc: 5 +cdrc: 4 +drlr: 2 +vvvf: 2 +qmtw: 2 +clds: 2 +mcqd: nlrs / mmzg +mswn: rtzs + pjhq +jrhh: 2 +lqpg: 4 +thqt: 8 +ddvz: rfpc + ztfc +nsdg: 4 +twsf: rplv + jzdl +wscz: 3 +hfvv: 2 +slnc: htcc + mvsw +bpss: 16 +fwsr: 3 +cnml: wdhs * hjqq +nfrj: svdn + tnbr +rqzs: nvzh + mvhp +ptjl: 3 +vttc: jbmb - jtzh +qpvl: ghgl + thgf +wwbb: 12 +vblt: 2 +mtml: 6 +whgj: 5 +vwng: 14 +fgnt: 15 +pcdg: 19 +wnvd: mqlm - lvpq +pcvj: gmfw + cpwn +zjjb: 2 +glbh: 11 +cmmv: fhcq * ljss +rqdt: lrpr + bqdg +zvfn: rpcj * thzq +lljs: tjhd * tdvj +tvrv: 2 +jfcp: 5 +nqjg: hbrf * zjnr +fwnj: frng + wqzm +hpnb: 3 +rvcm: 3 +fhcw: 5 +mvnq: 4 +jtnp: 4 +cnhm: clzw / fwht +zfwc: 11 +zwmz: 3 +snjb: 10 +sqzm: 17 +sgpt: 3 +vgtn: wcbw * cdgm +wzsf: nwmc * zpsw +bbhh: swfz - wpmd +rrnh: pjlr * zqbp +gcgw: 2 +qzmb: 3 +dtmr: 3 +jwlg: qcrr / rbws +zwms: jmlj * qhvj +dqrj: fjwm * ffng +mpft: lbfr - qpfn +ggqn: 6 +mqlm: gwgj * qjgv +htgm: nfhs * gbtb +lltz: lrwp * tnsw +ljhw: 5 +wqws: 1 +fgnq: lgpd + lhvb +hpzb: ljhw * mnzp +gqlc: 4 +ggbs: 5 +jhrw: swmz + qhct +fscd: 13 +wlcs: gsrm + wcgz +tnsw: 2 +fvjz: tvdp + mjlg +jgnp: 12 +tvnl: 15 +tmjt: 7 +cznl: 11 +lfvh: pbcs / qqbp +pmhj: 14 +pmvr: tfdg + mbhg +njvg: zpnj * mcjc +gzdz: jqjv - rszm +rqcn: 3 +pmrv: btdb - pwcm +nfpz: qbvt * fbdq +rplv: 1 +ngdz: 2 +gmzt: 2 +clbs: hqzd * bspf +hvqg: dsvw * smch +rlqb: 2 +fzlp: 2 +ztzb: 2 +jqrs: scbm * vgjv +hvlz: bpss + djlq +ghmt: zpwb * njng +ztjj: 4 +prvd: nzlm + fgnt +bqlg: 2 +rmsf: 9 +dmcc: frhj * dwcv +scbm: 11 +sdcp: 12 +gsff: pjgf - hjvv +ndtg: lwwp / ddft +sqsc: 2 +wgqb: 1 +pwrp: mtdz + qswq +jbhh: rqvb + tgpj +zsfr: grww - bhcq +cdfn: gwdv * nnbt +fqql: hncw * nnjf +tfwc: 3 +gzrf: btgp / npgl +sdgq: gdqn * hpdp +dlww: fvgd + fwwb +tqsl: lflb * qrqm +cqdq: dtlh * qqgf +drtr: 3 +qsfp: 3 +lczq: jmcg + gvnp +lzhl: 5 +mtrp: mhvr / jdmv +tfjp: 17 +zgnh: bgrr * ngvn +zcgw: hrwz + plnr +qhsf: 6 +gjbl: 2 +zggg: rjsh / nwcb +tpch: 5 +tvtw: 2 +snvq: tnwh + qhjp +fllz: 11 +vfqv: gnjb + hmtz +gwgj: swgn - fllf +ldsb: 4 +lcjl: gsrs * ngjt +qjsb: tjlr / rfhc +sqlp: lnjz * tljd +lnwn: qqdl * lgnj +ddzt: qhdn + ztvc +njwf: pbpg * ztzt +cqtd: cpmt * mjmt +qhgw: tshn / dmgj +fzpf: wjjm + tgrt +zhnq: lljt / wvrf +qbrv: 3 +dwcz: 6 +fhql: 3 +wwzs: 5 +bczr: pdfm * dnqz +ggsd: 4 +jcvn: nbqw * brnt +vpsn: 4 +wwwh: cznl * frpq +qhfc: hgdg * zjbl +hfrm: 18 +npvg: 6 +vcbn: dpct * tpvb +njbj: hbqc / sfww +wwpz: pvcr * rdff +nsmz: mdbv + jzjc +jlnp: 11 +ljss: 2 +bfct: 3 +pgwv: ftfn + cqpp +jpgt: 2 +blbl: ssss * lspg +wtfl: fwnj + frmj +dfzf: jswh + dzjc +mggd: nzsm * ptjt +gwmv: 15 +zmqm: 13 +bcnm: hgpb * lrpg +brnt: 2 +ngvn: spsz + wzlh +hwdq: ttml + jmcc +gqqs: bscz * wbtr +dlbn: whpf * vtjl +ztzt: pdpz + mjhb +pbjp: czfp + pqjr +mtlh: lpfq / ntpq +hzrb: zqlr - nfzj +nfzj: qsgm + mdgw +ttpt: zmvd * jblr +wtsz: 3 +wjgb: tqlq + ggqn +vdhw: pdfd + jmmd +dhjz: fqql + zhzr +jzhs: qzfr + gpcq +dsbq: lhlv * mdfm +grvn: 7 +rtjl: 3 +cbjb: 8 +wshh: dbrv + lpfh +jplh: jgmw + dphd +lzcp: bglm * fmfw +fcbh: wdsr * ljnc +nfqj: 2 +ggmn: jtvb / wdwf +ccbw: jpll / dnvt +zrdc: gtng * glbh +zgzl: 3 +bslp: lbqq + fmcj +vsqb: mfff * hzbl +fnmz: mgwj * zrsg +qlhz: 3 +phqs: zrrv * ccvm +ghnb: mpfp + qblt +zdlz: dndl + jlnp +ndfc: 3 +pbcs: zbfl * ggcg +qqzv: fmvc * zncr +ffbd: drjt - lnwn +bwpf: ghpd * sctd +dpct: tsjj + nclj +hjsn: 17 +vmlh: mslh + pfvl +qdcm: 3 +nthl: dggs * qjsb +crnp: rnjd * jllm +qfdf: pbhl - fnrq +jgmw: 5 +rjrg: 15 +tjrg: 3 +dppc: 7 +zhvn: lszb * drww +mmdc: slwm / fmpc +fgfh: 2 +nqps: jfcp * nggv +jjfq: 4 +mcjc: fpcp + wqjd +szdl: 2 +fvhf: 2 +drhf: 3 +dhvj: tvhp * qrgm +gcll: cjnc + prqt +rmmj: 5 +zqlr: nszv + grvn +jjqs: sglz * cdjn +mglc: qwww * gzww +rcvg: ttzm + cdnp +tbhc: 11 +nnbt: 2 +tdpv: znth * htcs +jnbq: 9 +zbbs: bsmg + nbvf +vfnv: 2 +gcqd: vvvf * jsrp +jpjh: hbhj * btvs +jqqg: bcbv + grwz +jblr: nsrb * rvcm +npnw: fmhw / mgqv +fssh: 2 +zjzr: hjvw * lvwc +jmcg: 1 +szvm: mcpz * pmqp +bdss: nlws + vjhs +wcgz: zbvf * sqpr +dtwp: vfsz + hfnn +shtd: ndfw + jzsd +tbrt: bjvn * tfwc +fssb: jwlg * jthr +nrdq: dsqj * wnps +jjmh: tgcb + dzpm +jrnd: 18 +ddph: sdcp + gwgw +lpgm: tjhv + hzjl +cwjn: 4 +qzjd: zbwr - ntnv +qwdl: sgcz + hgbc +qswq: 3 +hqwt: 2 +zgmn: fgbd + rdbg +psbt: zpcm - gbqg +vjjz: jwgd + szrj +ntgm: gtwc * nlwj +mmhz: nqps * htgm +ntcc: cvmw * rljz +jpgh: mvfr + twsf +gdmt: wtfw * jjlj +sqdw: qrcv + fzpw +hbqc: zgqv * mfmn +vrfn: 3 +whvf: sffg + vcbn +zncr: lpds + wlpg +bscz: 4 +nvnm: zjzm + fhbt +hntc: nczg * mmwt +vghv: gtmc + qmjd +rznw: 13 +zjnr: 7 +gldd: rmsf - pzmg +hjsv: 5 +lbbb: 2 +gvjp: 2 +pcgt: wjml * mhmd +pstr: 11 +rnfm: 3 +bvhw: 5 +vbnh: 4 +dtlh: sfpd * gwhh +ffpn: pshs + rlbf +nglr: mtvr + vjjz +vmtp: 20 +fzpw: tjmq * bwnt +szbm: 2 +mcth: 2 +csmq: mdhq + mccw +sqdr: 2 +vcmp: trqs * wjhg +fsfp: wrsm + wllh +lvwc: 4 +lvsn: 3 +czct: bjdf * ntps +dvmt: fgnq * sdbb +dtdv: rmjr * nlpm +fhjl: bdrv + szlw +tgcr: 10 +brph: mpcn + zjch +bzsh: qwdl + mwsh +gfnr: fhsh + prvl +blpf: nznb * qtgc +fldl: 4 +dgjp: lvhn * cbjb +njzm: 2 +fmpc: 3 +pdwm: 3 +vtqs: jfnq * gcgc +qjwp: nprt * jwgn +ncjl: 3 +clpz: nzmf * rgjj +jljs: ntbz + hzvl +ghjw: vnzw + svsh +dnvt: 4 +dmtz: 20 +gsrs: spvg / jhcs +szrj: 4 +ncrq: gtcb * swpl +wtmq: 17 +sbjd: 2 +cncm: 2 +dvtg: 3 +fqww: 5 +nzcj: 2 +tnvb: 2 +fqzp: tmjn + czbg +lhtt: 4 +vlsd: njgb + tcpp +zpcz: 2 +qsjh: 2 +bjcj: mqms / rblt +ltlr: spwv * ptrf +vmvw: 2 +qthv: 3 +njgb: ddph + zrdc +vqsf: tnvb + lgsp +mjfd: 7 +cptm: bdmd + jvjb +cjbb: 3 +qjqd: pwzw * jbhh +jstm: 3 +pnvs: 9 +qhrj: mznz * fsdr +rrpw: sntt + nwsf +bpll: 2 +hfnn: 11 +lptc: 7 +fmfw: 2 +djhm: 2 +mvlw: pwjw + nmmt +mnrv: 5 +wcbw: drfr + qjhl +cqmv: jjbq * mvhz +hvjt: mtrp * zmvl +sffg: hntc - tdwj +tsmb: jvcd * cbhp +thlt: 3 +wzml: 2 +bvhz: 2 +phgs: 3 +wnft: hpnb * hfgp +mfvn: lmhb + cctm +qvjr: 2 +tnch: dpfg - ptqf +cdjn: qhdq + jbhw +jrsq: 3 +vnwc: mvnq + vpbg +cmsq: 5 +lmth: gtbb * ddqd +spsz: dppc * vjdp +bzmp: whgj * ghrg +mjlg: nntg + qvmh +rmjr: 3 +wdsr: lmth / hllp +trwl: bbmm + cmmv +wggw: vlvv + crll +zqvb: hzhq * jhdr +fmlb: 4 +fsdr: fvgl * pbjp +dmtw: 10 +nndc: ttpt + lbbz +brqf: ljmq + pmnp +cvnp: jdbg * tbvd +fwvh: 3 +bfdb: 11 +hlls: 4 +fwbj: 5 +jvcb: 4 +mwbv: jsft / nbmb +trqf: 12 +glww: pbbm * dwwj +svhq: vltb + wzpd +hjnp: 6 +pfpz: lvfr * gbpm +lfvb: 2 +qhct: cmpb + hjsv +mjvj: 13 +tlbj: jtgb * brqf +cgsl: hbrc * zhcn +ntcg: ldmm + tbcs +vjdp: mszz * szwt +zbns: qpvl - cjld +qwww: 20 +zgpd: 4 +mdcm: qhrj + vmgn +ztfz: 6 +clgp: 10 +zsth: vzvr * nnzl +tqcj: 3 +fhpp: 1 +hzfc: 5 +jzsd: 4 +rblt: 2 +bqbp: 13 +bqcm: fbpg * rfql +dpld: 2 +jhdr: jzcz * cqwh +tzng: 12 +shnj: hpzb * grfq +lwgv: 4 +jsrg: zmfw * gjmm +zhcn: 2 +lstv: 2 +gcpq: zjmz / nfrq +gpbt: 9 +gjgl: fwwf * prvw +ldch: mggd * whlv +lflb: 4 +qvrt: 2 +psmj: chjp - ptws +qblt: vhrj * lfwn +ptzt: 3 +mdbv: 9 +rbwt: 3 +rpln: 7 +rlbf: 2 +fhgh: wzjl + dzqb +rjbf: 3 +pwss: 3 +mdzz: cgqp * svhq +rdbg: dbrb / mwrv +prbw: 3 +fwwf: 2 +dnqs: jpvz + qhtd +nzsr: 2 +mcnw: smws / mqmf +jpvz: zpmt * tbsc +dzht: 7 +lrwp: 3 +gjmm: 12 +cmpg: 2 +zccc: 5 +gjgd: bfws * ddzs +gfpq: zbmw / ncpg +mjmt: glrg * jsrq +zdwz: 2 +jllm: 6 +lwcv: 2 +bpzz: jpts * cmsq +vftq: shnj - jrnd +vlvv: lhmd * pmml +zmpt: 4 +zhww: 11 +jmpb: 3 +lpgn: 5 +cvmw: bbnp * ptmr +njhw: 3 +zpsw: 4 +gvhl: hrnd + qqpp +hjqq: 2 +jpdq: 3 +nszv: fscd * qlft +glgs: rjtw + vmvw +wfgq: fbrc + qthh +wcdr: 2 +wjhg: dgdf + hvlz +qnbb: gpsl / ngdp +qnsz: rwpv + nghz +snqg: 4 +dggn: 4 +sqbl: mjnr * jhvn +hsnt: rwzn + thzn +zsgd: zgzl * nfqj +cbmq: 14 +gqrz: qwzc + dtwp +htmh: 4 +fgtb: sbhb * ghdl +lmwt: lzhl + tpdz +tpwq: 17 +zpnj: 2 +vjrj: bzpj * mvls +lttb: 2 +jdmv: 2 +jbbm: 5 +qsbt: nglr + scjp +chct: vcmp * fnjc +wtfw: 2 +tgbl: 5 +fgwm: 2 +zjch: shtd + vdpj +qjfv: 5 +btzb: 5 +rnjg: 3 +nlpm: 2 +mpcn: sgqz * bmwj +gsgr: ntcc / vpsn +ndhv: ntzm / lfvb +cvsc: 2 +thzn: tpnn - tjbr +rrzz: 9 +btvh: nvst + pnrf +fhjw: tgml + btpq +gvjb: lptc * svvr +lbns: gpsn + wnft +jbdm: mcbm * fjrl +vvss: fzlp * sqrc +jqgl: 4 +wbtj: glgs + bzwc +pnzd: bwpf + mqrg +qvbr: jcdv + cmqc +pfft: 3 +jjlj: 5 +gcrf: 8 +ddft: 2 +tmgs: cprd + wbpz +wpml: 3 +ljmq: 14 +fwtz: 3 +bglm: 7 +gwrv: wtsz * hdwb +lzsb: vvpd * rzrv +qlwh: 2 +srrg: 4 +pwzl: jzwn * pwss +zbth: 1 +bmbp: 2 +lflt: lrzt + btzb +trnv: zppz / vbsh +srvs: 17 +ntnv: cszm * nwps +fqgf: 4 +pppj: 5 +wftw: qnbf + bldl +vnff: vvpr + njwf +gtng: 3 +vbpp: 4 +nghz: lbns * ljrs +gvgb: cbmq / wcdr +pwlh: 4 +pwzw: 4 +vvmp: dwpb * zbzs +wmtz: jwqz * dpld +lzvh: chtq * jpqs +fgss: nnzh * gwmv +ctts: zzdc + vljz +tsjj: 12 +gcgc: 19 +msdv: 3 +gzww: fngh + sgpt +qssl: 2 +mjgs: 10 +vltb: pcdg * gprb +vlsh: 14 +tcdt: jtrg / bznd +gbpm: gdmt - qzmb +tqcc: zfwp + snrn +hjjh: tmjt * mcqd +twrw: 5 +znjl: 3 +dndl: 2 +jvqv: 18 +gccz: 2 +qpfn: snlj * fvgh +flrm: 2 +wdhs: fbct * lhgf +nqjw: 2 +zsnb: 3 +cmqc: tqsz * jswp +bbhm: 18 +mpfp: lnsm * hfvt +tlvz: wdls - nzcj +lnzn: 16 +wqzm: ptsz * qbmq +crll: tzns / qgrh +htww: 9 +dtqt: 2 +jzwn: 2 +hdqh: jvcb + czdz +fhvr: 15 +btgp: nztv * cpfr +njrz: djtd + twvm +gwdq: 4 +nbcv: mglc + dmcc +vvbs: tfqd - vnwc +vffp: 4 +jtzr: 3 +jqjv: njvg - drlt +tfdg: 1 +jvjc: 5 +sdgj: mcrc * gbgs +tcmn: 5 +qfsd: 18 +ffvv: 2 +jrdn: brts + qbrv +mgfs: trzc + vhwv +mjlm: fgvp * vmss +mllh: nrzm * vqvv +pfsj: 3 +rrfv: pgzz + psqm +fvtf: 11 +mhvr: vnmt * qswf +tgrt: sltd * cqmv +wjml: tvmq + wrmm +wbtr: 3 +tlhf: 3 +cccv: 2 +cjld: tstc + lmwt +dqwz: 5 +nvgv: 13 +rdff: zhjr / rjbf +cbrz: mbbn * lhww +mswc: 2 +bqdt: mwjm + hqgc +tpdz: gldd + hfws +hllp: 2 +tvrz: pfpz * fhrq +smhz: 3 +fdcl: 5 +hfws: drpf * wrmz +wcgv: 4 +qmvv: wsgw * bngr +zzcd: 4 +pdcq: dspv * tnhj +dzfw: 5 +lsct: svlt * mtlr +rmlg: 2 +znff: vqzj * pcfz +tgpj: 5 +mrhn: 1 +tfjh: glth + hfcp +jpqs: 5 +mtbp: 3 +lpzj: 3 +jdgg: jtnp * sjpc +qhph: lcjl / ttbz +vbzp: 11 +sqpr: wpml * cmgq +zpwb: 7 +phnp: rbtv + wcfl +bchn: sgzq / nprn +dphd: 3 +lffw: msdv * czrh +mmwt: 7 +pfsm: 3 +tbsc: jmdl + fqrw +rnrq: 4 +nzsm: 3 +trjj: 5 +drbf: znhf * psjs +fpcg: tqql * zbhr +ggps: wbrr + fqzp +zgwl: fhql * blth +ncpg: 3 +qphw: 10 +mfff: 7 +bqwf: 3 +cwqt: dfjw + rtmp +lgnj: 7 +jtqt: szvm * dvdh +wwfm: 3 +pfhq: bfqr * wvff +hvdv: 2 +wgmt: gvzz + nthl +lvhl: vvss / hrwc +glfv: 6 +wsgw: mnqq - tqlp +nggv: 2 +gpsn: jqdf + ztfz +tfjl: 4 +zppz: mtbp * whvf +mrdm: jrvt * srhh +bwzr: chdg * qhdd +nlmg: qfdf * qgtn +wzlh: zqvb + rcjj +btwt: ggps + qsbt +pdpf: 9 +qhjp: 1 +wqdw: dnqs * tmgs +bgns: nchh * mjqh +ntpq: 2 +dnqz: 2 +bbmm: czln * qjvv +bhbq: mjgs * zqhv +rhjr: 2 +nchh: 4 +hstn: 3 +hjvv: 1 +dncf: 17 +vncn: 7 +rztm: 19 +hdnj: pqqt + hqhc +ztpf: wnmv * psgm +bjdf: 5 +tcqh: 2 +ghgl: mhss + vdnc +pcjl: 4 +prvl: tcgc + rtnd +zghv: rspd * fssh +mcpz: 3 +fvgd: ddqf / mgfs +mcdl: bqfj * tcqh +wmbb: lnzn - pjzl +vtjl: 2 +rjtw: 5 +zpmt: jcjv + qpmr +hrnd: dptr * vlsd +nczf: 2 +zfsh: pfhq - vhrw +pvjr: clpz / rptt +zptq: fbpq + wnrh +qmfb: 2 +clvh: 5 +vcbb: 4 +hvbs: bbhm + gbsz +sglf: 11 +gwbb: 2 +zvmr: 18 +fmnw: jfnd / bwlr +swpl: 2 +tpvb: 2 +fvgh: lljs / ftjn +tbvt: 11 +mmzz: qjdt / lzsg +nclc: 3 +qvqb: 2 +mpmg: 2 +wpgg: lwqj + wddq +qjbw: 2 +gvnp: lffw + bqlg +cwbv: fhjw * cdbt +zwcn: rrpw * jlbj +mqjn: 3 +lpfh: 15 +pmqp: zgbr + zgnh +snss: 3 +mdqz: rttt - phnp +hvns: 2 +bwmz: 8 +clls: fwsr * wrqm +fqvf: 4 +tpmj: 4 +mnqq: bhpv * nlrv +gjnn: 15 +hgpb: dvmt + gqlc +tmjn: 4 +nvfn: qftq * gvgb +wqhm: 3 +mfqd: 3 +rjlb: 2 +rbws: 2 +gdds: 2 +drzr: vdff * wjpl +pwzr: 3 +bngr: 2 +bssz: 9 +zjbl: 2 +scvz: gzhh * qdcm +vhrj: blfd / nzsr +mlzr: fnbb * vldl +mslh: 17 +lrhs: hhnt * qtjq +dnth: 19 +hfff: 2 +jcbs: 5 +fcmc: tvnl + tshv +pljt: 4 +shdh: 2 +nvsl: mdzz + wbqh +lztr: dtqt * jlfc +lqfp: 2 +nmmt: ltlr + ntcg +mdrb: qjqd / cdrc +jwgd: 3 +mdhh: 2 +llsh: 6 +fdzt: ttgd + hglr +msdh: tmqt * flzl +nqtd: 3 +dzjc: 5 +wvff: 5 +splz: 11 +mmpn: 2 +gtcb: ggbs * jzmc +qpmr: dtww + wvrz +jmcc: pchw - btvh +nnjf: 3 +cdgm: 11 +jlmf: 3 +fmnl: 3 +hvmb: 10 +wghc: rgtm * jbbm +vsbt: jtnd * djnb +jcdv: wnvd * glhf +dpwm: 6 +lbqq: 5 +vprv: wzml + fbmm +chbh: svtt + bwzr +czln: sqrh + nvbz +cjnc: 18 +plsf: lfgr + tclr +vgrh: 4 +sgqz: mwbv * djhm +jvjb: lflt * qlgr +zfsz: whzh + nqlc +ltsl: 1 +mvhz: 5 +czfp: 1 +rghc: 2 +vtns: zrgn + lpfj +nptm: 4 +qwbp: pbsz + rbrh +vhpb: 8 +gzjw: 18 +tlfz: 7 +pjhq: 2 +jwqz: 4 +ptjt: 3 +pgzz: wlwf - rgcg +zljs: wgmt + czdw +fnhz: jzhs * pnvs +fgqh: jtzr + rfnb +brts: 8 +mgqv: 2 +flbg: btwt + vcpt +zfwf: 2 +wnmv: 3 +zrwh: 10 +qcwb: 2 +gfwv: 2 +pwcf: 2 +mqhj: 3 +hqwh: mvfn + lgjg +bzwc: hbbr + njbj +sbhb: 14 +pwww: 4 +jppq: 4 +djvn: 3 +jhvn: cdfn + wdlz +lmhb: lrwn * lltz +rwpv: mwtb * shdh +vnmz: 5 +wbrr: 12 +tjhd: qnbb + bpzr +lcgc: gplp * wbvj +mmcf: 2 +gdqn: hzfc * gsff +vprr: vftq + tpmj +mhhg: jngd * jstm +lhvb: 5 +vqzj: 2 +fmgv: lztr + cqdv +hfgp: 2 +hdwb: 11 +vpbg: 7 +nbpt: 10 +czbg: 4 +dlnv: mhgw * tlwh +jhqp: jqqg + llbs +bwlr: 3 +vmhp: njvp + mrdm +qrqm: 11 +hbrc: mvmf + wwwh +lgjg: fqgf + hwzd +ddng: 6 +gjjq: vdfv - srzc +wnps: 2 +nvcw: vfnv * lrtp +zbfl: 4 +rnjd: pzhz + hvjt +hjvw: 8 +nfhs: lfgh / fgfh +svlt: 7 +hqww: 2 +hnbf: 20 +vfdb: 13 +jtst: 10 +drtm: rnfm * brrd +jzbn: ffbd * lpzj +fmhw: mcth * jhqp +lmgg: ndml - zbth +mqbj: gqst * qszr +tjtv: 6 +wntd: vspm * gsfg +tnhj: 5 +gpcq: fmlb * hlbq +vsmf: mjbw * splz +sqhd: 3 +jrtg: 2 +glrg: 7 +vdnc: fztq * zbst +drfr: 3 +lpfj: vjrj + ldch +nnzl: cpmj + ndwd +lpds: rtjl * bnbz +nvzh: npnw * vjwq +vqmz: jzdr * nczf +qqbp: 4 +wmfn: hgcs / jmjc +jpts: 6 +qgtn: 2 +ntbz: 6 +mjft: 4 +dvzb: wntd - gvsq +mwjd: wfbt * qwqj +vlvl: 3 +zsrc: zvmr + ccbw +root: mcnw + wqdw +trzc: 1 +sprf: fcmd * jftd +ngln: 4 +mgqp: 16 +humn: 3803 +zllm: 2 +czrh: 3 +btvs: gnvq + smht +ctft: 15 +jrwj: 6 +fpdt: 17 +blsf: wfhb * lwbw +srjq: rsrw * clds +gplp: 3 +nfgj: jnnn + zwms +qqdl: 2 +vjwq: 3 +jchm: mmgf + fmnw +wmnp: 5 +njrl: 7 +slwm: bhbq - vgtn +wdhl: prsm * spdf +qvvp: rcvg + tzfm +npcc: 4 +ggcg: tzng + crpn +lcvq: lpgm * qrrh +zqwg: 3 +svjl: 4 +gtwc: 2 +gmfw: 4 +jhpl: rmfn + cssc +qbvt: wgqb + gdsh +zgrn: 4 +ljrs: zmnt * jzjq +pvrq: fsgw + pcgt +mvsw: 3 +trhr: bnjm + fwtz +ngjt: 2 +hwnm: 2 +clzw: hqjt + mvlw +srpd: 4 +lgsp: 5 +tpnn: tvrz + btvv +rzrv: 4 +gcjf: 20 +lrtp: mrnd + vvmp +lwwp: mmpn * jljs +nntg: 10 +htjn: tdwc * djvn +sglz: flfj * zgwl +rpsz: 2 +qsph: 7 +ddwd: nsvp * jrwj +jwmz: wlsv * drhf +hzjp: 3 +zvlq: bzmp * gfwv +wpmd: 10 +bbnp: lnqh / dtmr +lfgh: zdlz + pcvj +tjmq: 3 +spzh: 16 +jsrp: dvbq + rvwq +nhdb: plmg + sbjd +pjgf: lpss * zwsn +hwfm: rpsz + mgvp +dvbt: rlzt / sqdr +trnr: dvzb + htdp +rtgq: pgbr + njrz +gtqg: whbr * wmnp +znql: 2 +vwnl: bghq * blls +jcgv: 11 +jbhw: 5 +pgbr: 4 +gvmv: wftw * sszm +lvfr: smnt + jqgl +lspg: wrnd / qbcp +vrds: 8 +qrzq: lhcp * tgbl +rzcv: 5 +wzzz: jbhd + zfwf +dpgr: 7 +tncv: lnbt + qsng +zlgj: 2 +dnhl: 11 +vjhs: 1 +hfgn: 4 +rfst: 4 +tftg: 3 +sqrh: 5 +wlpg: gpjb * hsfj +nlrs: nqjw * dzht +gqzb: 1 +zqnb: gvsn * btfd +nwzz: jfqf * lcmq +wrmz: 8 +cdbt: 3 +zgdn: 5 +hjfc: tjrg * tfjp +zflw: mstt + hqbg +pjrs: 2 +ndsq: 1 +jsss: 8 +vnhv: 2 +qbjn: mswc * qfth +rfpc: zjzr + lszn +jtmh: csdm * czct +vfmg: 2 +wjjm: pgmf / pwzl +drjt: vttc + bpzz +ffsw: hzjp * zbbs +lprt: pmvr + rdpc +lvpq: szdl * cshh +qsqt: 11 +fnrq: nfmg + csmq +snlj: 2 +qsng: 6 +bfqr: rcdr + ntzw +fvrn: qhgz + qqzv +wnrh: 7 +chhz: 2 +mqrg: nfgj * rqrt +vhwv: cfhf + bzhc +jshp: bssz * qvrz +svjg: fdcl + bnrc +vsch: npvg * ffdw +rvgj: 18 +mznz: nsdg * bjmj +btfd: pzqc + qsph +rvwq: jdgg * lsct +hrwc: 4 +wdlz: 3 +ffdw: 5 +brbj: tlhj + jcgv +mbzc: 2 +vzrl: 4 +wscl: blsf + zpjn +ddqf: qgsf - qnsz +wrnn: 2 +blfd: tjjg + rwsz +tstc: hvmb + jpdq +nbsz: srvs * brbb +pwzz: 2 +rzqg: 4 +brbb: 7 +qtlq: thht + mqhj +fhsh: 3 +sqnc: dvjd + dvbt +vfbj: vvlm + tstp +svsh: bgwg - qtlq +grww: thlt * wtmq +fwsq: wggw * brgc +lrjp: 2 +wbqr: 10 +ttgv: 3 +qtct: 2 +sljw: jcll + ttrt +nrwz: 3 +pzmg: 2 +nbvf: wcwq * tncv +jfcn: htms / pwzz +cpzn: 3 +vlgh: 2 +nbmb: 2 +jhrs: 2 +glth: cjqf + stfq +vwvj: 7 +jpbw: 4 +nljg: rrnh * jpgt +brrf: gthh + bqcm +snll: zmwj + smbv +cwqj: rzcv * cnrr +wjtw: ltcd * cbnr +tmfw: 2 +wcsm: rqvf * hnqr +ntzm: hfgn * zftd +jnnn: 1 +jbln: vgqz + frch +lpvz: ptsg * pwww +qphn: 2 +vmcp: 4 +qjgv: btpr + pwzr +djtd: 6 +wllh: vffn * hjsn +fvzq: rrfv + qvvp +pgpt: stjc * rhjr +jdqp: 2 +whvr: zthv + pgqj +gtlc: rjzj * gzjw +jwnv: 3 +qrcv: 14 +rwzn: vhdl * znwg +lrpr: 3 +mhss: ghjw - wghc +zqmw: 4 +rbtv: dhjz + hwnh +hzhq: cqtd + dlbb +pdfm: zrpj + fbpt +jrlv: 4 +zcrr: 2 +mbdv: mpft * bqvs +wrnd: cmgf * dvrq +bfwf: zgdn * pgwv +blls: 2 +jhrb: 20 +wljd: 8 +nsrb: 5 +sjnq: jnbq - zpcz +nrvw: zmqm + mcsn +tgpw: zncn / mjqb +grqn: 1 +brrd: 3 +brgc: 2 +rdpc: 2 +dhwd: zhvn + cctv +sctd: 5 +wlch: 2 +rfhc: 2 +npgl: 2 +vpjv: jpgh * chhz +sdbb: 3 +lwbw: 2 +zwsh: 1 +fbpt: 18 +vcdp: 2 +gpsl: lmcz * lcws +mdgw: 4 +sfwp: qdlh * nvnp +jswh: 1 +vcsb: 1 +vcms: 4 +chjp: szct / mjcw +hnqr: 3 +dfjw: zrwh * fdzt +scjp: 3 +dwvz: 2 +dgjh: 10 +mvmf: wbtw * cbts +lnqg: vmmw * hzrb +jfct: 3 +ftds: grqn + gcvh +mqms: lqhz + dpqs +fjrl: 4 +pbpg: 7 +tdwj: wfgq - tttc +vmsg: 13 +flvh: 10 +qbmq: lsgz * twqq +pfvl: 14 +lnbt: 15 +wbvj: 9 +npvm: gtlc + fdnv +rjzj: dmtz + zrbq +bhfp: qprs + dgjh +rsrw: trjj * lqvp +hqgc: cpzn * zvvp +rqvb: cwqj + snvq +ngdp: 2 From c3a95724073ca1b7f493bba12b495864c3bca091 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 21 Dec 2022 12:54:33 +0100 Subject: [PATCH 357/479] 2022: d21: ex1: add solution --- 2022/d21/ex1/ex1.py | 80 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100755 2022/d21/ex1/ex1.py diff --git a/2022/d21/ex1/ex1.py b/2022/d21/ex1/ex1.py new file mode 100755 index 0000000..e9c4727 --- /dev/null +++ b/2022/d21/ex1/ex1.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python + +import dataclasses +import enum +import operator +import sys +from typing import Optional + + +class Operator(str, enum.Enum): + ADD = "+" + SUB = "-" + MUL = "*" + DIV = "/" + + def __call__(self, lhs: int, rhs: int) -> int: + OPERATIONS = { + self.ADD: operator.add, + self.SUB: operator.sub, + self.MUL: operator.mul, + self.DIV: operator.floordiv, + } + return OPERATIONS[self](lhs, rhs) + + +class Monkey: + def get_value(self, monkeys: dict[str, "Monkey"]) -> int: + raise NotImplementedError + + +@dataclasses.dataclass +class YellerMonkey(Monkey): + value: int + + def get_value(self, monkeys: dict[str, "Monkey"]) -> int: + return self.value + + +@dataclasses.dataclass +class MathMonkey(Monkey): + lhs: str + op: Operator + rhs: str + _value: Optional[int] = dataclasses.field(default=None, init=False) + + def get_value(self, monkeys: dict[str, "Monkey"]) -> int: + if self._value is None: + self._value = self.op( + monkeys[self.lhs].get_value(monkeys), + monkeys[self.rhs].get_value(monkeys), + ) + return self._value + + +def solve(input: list[str]) -> int: + def parse_monkey(input: str) -> tuple[str, Monkey]: + name, value = input.split(": ") + + monkey: Monkey + match value.split(): + case [lhs, op, rhs]: + monkey = MathMonkey(lhs, Operator(op), rhs) + case [n]: + monkey = YellerMonkey(int(n)) + case _: + assert False # Sanity check + + return name, monkey + + monkeys = dict(map(parse_monkey, input)) + return monkeys["root"].get_value(monkeys) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 6055c7ac235cf5ad5c5c37b5085f499fc2e350bd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 21 Dec 2022 12:54:39 +0100 Subject: [PATCH 358/479] 2022: d21: ex2: add input --- 2022/d21/ex2/input | 2293 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 2293 insertions(+) create mode 100644 2022/d21/ex2/input diff --git a/2022/d21/ex2/input b/2022/d21/ex2/input new file mode 100644 index 0000000..78a6d25 --- /dev/null +++ b/2022/d21/ex2/input @@ -0,0 +1,2293 @@ +jtrg: gcpq - fvjz +vjhv: 4 +fcmd: 5 +djgl: gwjr - vbpp +snzw: 2 +lswd: bcnm * vdhw +lqvp: 5 +qwqj: 3 +zrrv: 4 +hpnm: 5 +wsfb: pmhj + ftds +wpqh: 2 +mjhb: drbf - lhtt +vmnt: 4 +tqlp: 1 +jddv: mllh + zwmz +lnqh: mwzc + fdwf +pmnp: dnhl * cjbb +nznb: 10 +pbzf: 2 +mwsh: dhff * ddzt +znwg: fvtf * pvfj +nnbp: mbzc * smhz +hlbq: 4 +fqcp: 11 +jzhn: 2 +jlbj: dnth + jjlw +nhdh: wdhl - zsgd +qvmh: 13 +ffng: 3 +jsld: 2 +cshh: nrdq + sbsn +jrcq: 2 +bsmt: 4 +wfhb: 10 +cmzv: 3 +plrf: 4 +mmtl: 1 +pqlw: 5 +tstp: 4 +vgjv: 6 +rncj: ctft + lslz +stfq: rnjg * vqsf +rcnd: djgl * qmfb +sntt: jhrb / hqcg +fbdq: 2 +stcn: tjjp + bdgs +lmcz: wmfn + gmhc +zfwp: dcst + dmlt +cssc: 1 +cwfs: 2 +qcts: nswn + gjgd +nwsf: 1 +dmwq: 13 +mdfc: 2 +qswf: 2 +jzjq: bfdb * qssl +cntb: 4 +lsgz: 5 +gnfh: fbqz * zptq +zpcm: brlb + bsmt +wjdr: 3 +grfq: 5 +fbqz: 2 +nswn: sqlp / jctd +rszm: 2 +dzpm: gmzt * nbsz +qvbz: 1 +lclw: zglp * gwdq +fqhc: rncj * hfvv +wzhg: 2 +fvzr: nrvw + gnfh +bznd: 7 +qvgj: 11 +qqjs: wrnn * vprv +swmz: 5 +vnsd: 16 +htdp: hcwn * vfmg +schl: sprf - bqbp +qgrh: 2 +mmlz: 5 +qhvj: 4 +smvn: 2 +cjcv: hvdv * dnfb +hgdg: sqbl / lvsn +lbbz: gdhl - dvhb +tnwh: znff / cppg +cctm: hnbf + rrzz +mtlr: 4 +fnnb: wpbs + vntw +ffdv: 2 +zcjd: 4 +zhzr: 2 +hcwn: tqcc / jlwh +zbsr: 3 +fncf: 4 +wdvc: 2 +nstj: gglr * ffvv +dvbq: qlvv / vnhv +lpss: 4 +pnlj: 5 +fjwm: pljt + wsrf +gwgw: 2 +ndfw: dppd + wssb +tqql: 6 +prsm: trpd + rcnn +hltd: mdcm + jpjh +lmgz: wzhg * bchn +ptws: lfvh + gflw +pwjw: nvsc * gjrw +qqzg: 2 +btpq: wscz + drtm +lbfr: hfqg / lzhw +jzjc: 4 +gpsw: jszl * fcbh +pjzl: 5 +lshr: 5 +dtww: jvqv * blhs +gvsq: gdds * nvgv +ttwt: 7 +frng: jrhh * bwdw +qdtc: qqnz * jwmz +smws: btmm + svdl +dwcm: hpnm * jdth +zbwr: fnhz * lvhl +crjp: zcgw * hnzn +pdfd: fhts * ddwq +tgvm: rsmh / ffpn +jtrd: twrw * nhgm +fhrq: 15 +hqbg: hhwc * vsmf +wssb: rtgm + tgvj +dhff: mjft * ddwd +zczs: 3 +jswv: fhls * clvh +cqdv: nfrj * pznq +blrq: 3 +qrgm: rgsj - zgpd +drlt: 10 +tnbr: bfwf + qltm +cvtg: 5 +qzbq: hqrp + psbt +hncw: 3 +mzsm: zqnb - tqcj +gbgs: vrfn * lcwj +lhcz: njrl * rztm +gsrm: chbh * dgdl +pwzq: fpdt * rznb +mbqh: tbrt * blrq +fnbb: tcdt + wjtw +gwdv: 8 +fhdf: 2 +sqrc: lhcz - vqnp +rrsb: jzhn * jgqm +wcwq: vmtp - wwzs +hgvf: ndws + dtdv +htvl: 7 +bssv: 3 +csdm: 4 +zqgl: 3 +tcgc: 3 +gqvf: gzdz * gtss +stjc: 3 +vnmt: hvbs - tvtw +cszm: bvmr * hrsr +hglr: 1 +zbnp: 4 +qtwt: 4 +thfd: qwjw + lpvz +wrwh: dwzn / vcms +wdwf: 4 +swfz: nvsl + jqrs +bwdw: msdh / nvtf +qrqq: 19 +pzhz: gjgl + gvjb +nztv: 2 +lcws: 2 +mfmn: 3 +cqwh: blbl + jplh +ltcd: pshp * pnlj +dlbb: 5 +bshq: 8 +tjpt: srpd * srrg +hqcg: 2 +thgf: fssb / zfnh +zfbv: 2 +http: vssf - nbcv +fhcq: rplb - sfnm +pvcr: 4 +hzvl: 5 +flzl: 2 +cqpp: rmmj * pmdg +cgqp: 2 +fqbg: cmzv * ncjl +tshv: flbg * vlgh +qwrp: lqhf * lttb +bvmr: 2 +ppnj: 16 +jsrq: 3 +qnbf: jrcq * mmgn +hgnn: 2 +jtgb: 5 +hmtz: ffdv * vwng +lnjz: dfbw + nhjb +vmbv: lnpp * cmgr +jvgr: mrzm + jjmh +gtss: 3 +fpcp: lczq / zgrr +jlfc: lstv * vfgh +wqjd: lprt + jrdc +gvsb: tpch + jhrw +lpfq: wzgj + bplr +mzhb: 7 +nwcb: 2 +lszb: 4 +wgzs: 5 +gthh: dsbq + nbgd +jrvt: 2 +zmnt: 2 +rczp: mqjn * lbmp +cpmj: 11 +gdsh: rqdt + wmbb +gcvh: ndtg * tllz +jbrw: fgtb + hsnt +dzwf: 6 +tqlq: 1 +bplh: 2 +fmmv: 13 +lhmd: 2 +qwqh: 2 +qdwc: fhdf * jcvn +btmm: trnr + nljg +pzqc: 4 +wrqm: 3 +szct: ffsw + nwzz +gpjb: 5 +htcs: lnbn - qwbp +zwsn: 2 +jcmn: pvrq + jtmh +qzmg: cwqt - hhlw +nmzp: 4 +ffhm: tgvm * rnrq +mcrc: 3 +ndrn: 2 +rggc: tgcr + wfwp +bsmg: gjjq / fmnl +grwz: bfch * mfvl +cbnr: plls - nclc +ddlg: dmtw + sjnq +jfqf: pcbc * fnnb +hwlp: fzrg * bmbg +sbsn: vdct + bdss +nprn: rbwt + snss +spjm: pppj * pbzf +trpd: 18 +phrl: 5 +njfq: 5 +dzqb: sqzm * rhjz +bldh: snqq * tlvz +djcd: vsqb * ddvz +lqtl: cqdq - bftl +bhcq: rzwg * gvjp +bgsg: 10 +qprs: 1 +plls: 10 +bjmj: 2 +tfbz: 2 +fzdd: 14 +hqhc: pfsm * jfct +rdlc: 2 +zfnh: 2 +pwcm: wqws + qphw +qrjm: bpjc * qcrz +mnzp: jwvj + wgzs +zghq: pljc + vprr +dnfb: zdwz * qfmz +znth: 3 +rlwz: 2 +ggbr: 16 +hrdf: 5 +pghp: 1 +rqvf: 3 +jbmb: 14 +tjbr: pmwb * nshg +hsfj: 2 +ljzn: hsct + ctnr +rgtm: 5 +nlwj: zllm * rzqg +swsq: sghd * nbcm +bdrv: 18 +whpf: 14 +fnnh: 5 +bsfs: 4 +rtlz: dddq + jmpb +nhgm: 5 +ndws: 1 +nqlc: 7 +dsvw: hjfc + zhnq +fngh: 5 +rljz: 2 +ddzs: 2 +ghfp: zfbv * lwzr +hqrp: 2 +lbrp: qjfv * plsf +qlft: 4 +fbrc: 18 +ddwq: lclw - hvqg +pbtv: jsrg + wwpz +fgbd: hjjh * fdhf +tmqt: gvsb + dnnl +mvfn: ggbr + thqt +gmhc: 19 +tglv: zsrc * sdgj +hwdn: 3 +pdpz: lzvh + nvfn +blhs: jbdm / qvqb +ztvc: 7 +zpjn: nsmz * smvn +sjpc: 2 +gflw: zqmw + fgqc +tdvj: 2 +jhhj: 5 +plmg: bgsg + bnfs +vzvj: 3 +rplb: vnff / drlr +mvfr: phqs + rggc +jrdc: 2 +vldl: glww + tlfz +jmdl: 3 +nvnp: 4 +swgs: 5 +pmwb: qlvb + wzzz +rhqq: 2 +fgqc: dncf + tqsn +bcbr: 5 +mwtd: 8 +nprt: 2 +ljzs: 6 +wnnp: 2 +czdw: fvhf * btpl +tlhj: 11 +rqff: 3 +vhrw: dwvz * trjz +jsft: gccz * prvd +zjzm: wzsf / bpll +dwwj: qnww / mmcf +vgqz: jcmn + mrqz +pchw: ghmt * znql +jrqb: gqzb + ndhv +dgdl: tstw + zvfn +pcbc: 3 +vqnp: fqbg * nqtd +qmdd: 2 +wctc: 2 +cpmt: 2 +tgdp: mfvn * rvhr +cdnp: vwnl + bhfp +qqpp: rtlz * fhgh +dsrp: nrwz * fzpf +mndv: 2 +rgjj: lmgz - gggw +tbbv: lntf / hzbf +lnbn: flvv * ddlg +qfmz: jswv + qbjn +zclw: 4 +qhtd: pwrp * hqwh +jzcz: 2 +qsgm: qthv * nmzp +lzvq: nfpz + jddv +bnjm: hfrm + hwlp +njvp: 3 +cctv: njhw * jcbs +lfgr: tjpz + tbhc +cmgr: 3 +lrpg: jhsm * vlzc +nsvp: 4 +gdhl: nbpt * rclq +hwzd: ndsq + lsmv +gsfg: 5 +hfqg: mbqh + mbhw +ttbz: 2 +mjbw: 7 +svdn: bczr * mpmg +vhdl: mmzz - whqt +bgrr: zbnf + snqg +nwmc: mfjn + spjm +cfhf: 3 +lrwn: 4 +qvrz: 6 +tjhv: 7 +lhww: 5 +htcc: nwrh / htmh +qjdt: sdgq + humn +jcll: rhqq * bfct +rzgp: ggsz * zcrr +nbgd: vvsd + gcll +jlwh: 2 +vwwh: 1 +czdb: 2 +gbbs: 3 +flfj: 3 +rttt: dfmf * gcrf +twqq: dsvd * vzrl +stgf: 3 +frpq: 5 +gwhh: 2 +mrzm: jbln + ljzn +smbv: 16 +zglp: vcwt + mmhz +nzlm: 4 +mbhw: jbrw + jvgr +vlzc: wbtj + sqhb +bvwd: 3 +qgsf: trwl * qvrt +brlb: qsfp * sqhd +smch: 3 +fgvp: 12 +sbdv: 2 +hcdp: tlgh * jppq +lszn: 9 +dqtl: pnwd + zzss +fmwj: jtqt - gfpq +wcfl: 4 +tdmq: 2 +vqvv: 2 +jqdf: 1 +vffn: 5 +hbhj: zlwm * jdqp +mwzc: 19 +gbsz: npcg * cvtg +whzh: 2 +rhjz: 7 +lfwn: 5 +jtzh: 1 +hbbj: rqcn * pdwm +djlq: ncrq - ccpq +zqbp: wmvj + pdpf +bwnt: 3 +ntrn: 6 +nfmg: vblt * tgdp +ccvm: 20 +fdhf: 2 +hqjt: fwsq - pmrv +bmwj: 2 +svvr: 2 +jzmc: 3 +jrrn: tfjh * hwnm +msmz: pdcq + ffhm +blth: 3 +dmgj: bwdq * cctw +njng: 3 +bpjc: 13 +ztfc: fwqn + hqww +fsgw: gvgr - mdfc +lgpd: 1 +jmlj: 3 +zbvf: ffbn * qmvv +njjd: gcgw * lqpg +gplr: ngdz * vffp +pgrm: 18 +mjqb: 5 +cmtl: qsqt * wdvc +bqvs: 2 +lllf: 2 +pznq: 3 +wbpz: cghq * tglv +fbmm: lpgn + pjrs +pljc: rcwv / vnmz +cmgq: bjcj + jzbn +fmvc: 2 +rstf: 20 +zlwm: 5 +gzmh: lswd + zrvt +btpr: 3 +tpfh: 5 +vfsz: 18 +qwjw: 5 +hnzn: mmtl + tjtv +rgcg: 8 +jdbg: 3 +tvng: 2 +nvbz: 2 +rzwg: 5 +bftl: 4 +dnnl: jvjc + fnzz +jdth: 11 +qhdq: 2 +hpdp: phrl * nptm +jndt: 1 +wsbm: spzh + hstn +shfg: zgrn * qcwb +zthv: 4 +qjvv: lmgg + dgjp +tlwh: 2 +qzfr: 1 +jbhd: frdt + ppnj +jhsm: 11 +bgwg: lwcv * bqlz +qfth: 3 +wzpd: mgqp * hvns +htzw: 2 +mbbn: bvwd * htvl +dppd: nptj * bwmz +qhdd: 5 +dbrb: dhwd * qsjh +vbhd: wpgg * jrtg +mccw: czdb * fvzq +ljnc: 2 +dcst: vvcs * fgqh +qqnz: qhgw - djct +nvsc: qwrp - wvnh +cbhp: 5 +tqsz: zbnp * tpwq +cmgf: 2 +lcwj: hzth + spzs +zmwj: pwlh * tfjl +sfnm: bzrh * bgns +sdfm: 2 +qcrz: 2 +mjcw: 9 +dvdh: ctts * qcts +rfql: vpjv / mzjh +bnbz: ggmn + pghp +mhmd: 2 +bplr: 5 +jhcs: 2 +fhls: 2 +wcwg: 2 +jngd: 3 +twvm: 7 +mfvl: vncn * zccc +sgcz: hrgv * tvdc +jjcl: wjdr * zbqp +fnzz: 6 +tjjp: tnch + gqvf +qdwh: jchm * ndrn +gtbb: cqcw + tdrm +bdgs: tmfw * wbqr +swjl: ghnb + pbtv +dsqj: vlsh + hmvc +pvfj: 7 +snrn: 19 +vnzw: lcgc + tjpt +bdsm: 5 +zbhr: zggg - vfbj +mvhp: svjl * bfgq +vfgh: gvmv / cccv +psqm: 1 +jtvb: cmtl + sdfm +qdsd: tsmb * lrps +jzdl: 11 +zbnf: lzsb / bshq +rwsz: flrm * htnj +wddq: qpzz * jngw +nczg: rvgj + ztjj +bzrh: 16 +qpqn: cfsr * qbqq +lwzr: jtrd - qhsf +cfsr: 7 +vzvr: nrzg * qzbq +zrgn: rjnp + jrqb +tgml: 1 +zjzn: 4 +rznb: 3 +nzsw: 3 +pgqj: 3 +vmss: 2 +mhgw: 13 +rtnd: 4 +jthr: 2 +tstw: 12 +qvcb: 4 +pbhl: psmj * mbbp +jcvg: mbfh + svjg +prqt: rcnd / ncnr +rgsj: 17 +nlrv: zbsr * mdhh +chdg: 5 +mcbm: 6 +ntps: 3 +dfdj: wcnm + qvlz +zmvl: 3 +zgbr: gcqd * lbrp +trjc: 20 +nfrq: wcwg * bssv +qtjq: 2 +qnww: vfqv + rgnc +vbsh: 3 +jwvj: 2 +qpzz: 2 +gdjt: dqrj * lwgv +lzsg: 3 +drww: 11 +rlln: 2 +frmj: qdwc + bldh +bfgq: ztpf + hwfm +pnwd: mndv * jchz +dptr: ttgv * jtst +nzmf: bvhz * vlvl +czjc: 2 +tbcs: lggq * vmlh +sstp: qrjm * vfdb +cmqq: 2 +nbzg: 6 +cpfr: gzmh + chct +lhrp: qfvw * snzw +nnlw: 4 +mvls: 3 +ghrg: qpqn / cmpg +tjpz: hqwt * wsbm +psgm: jjcl + llsh +czfb: 3 +wfwp: mmlz + lrjp +dgdf: sstp + nvnm +tttc: 7 +vdct: 7 +mstt: fwvh * cptm +rlzt: wjgb * tsrb +rlbv: 10 +mjnb: crnp + zvlq +qlgr: 11 +mjnr: 3 +rtzs: 4 +lhlv: fqww * rldr +ptmr: 2 +nglm: 2 +mtdz: njjd * gfbg +wfpc: gsgr * zdzt +jtnd: 5 +gvzz: 10 +lqhf: 19 +rbrh: 4 +qhgz: phgs * lnqg +wzjl: 12 +svdl: ztzb * fmwj +vmmw: 2 +ttmm: 2 +vvzh: dlbn + dwcm +qfbb: 3 +lntf: lnts / hfff +hwnh: 2 +rtgm: 17 +zrsg: 3 +zzss: vmnt + zqgl +thht: 10 +tvdp: trnv * zfvm +bhpv: 2 +tshn: qdwh + djcd +thhg: 9 +whqt: fqcp * vvzh +ttml: 9 +mcsn: 16 +prvw: 3 +nrzm: 14 +mqmf: 3 +qftq: 2 +pshp: 5 +sqqh: 12 +whcc: 7 +cjqf: mjfd * qlwh +jchz: 5 +dggs: 4 +swgn: dlww / tvrv +zvvp: 3 +gtmc: qtwt + wscl +msmh: 3 +tgvj: twrz + trjc +ptrf: mtlh + ttwt +zmfw: 2 +mzhg: 3 +chgl: 2 +rcwv: http + trqf +tbgz: zclw * hcdp +svbc: dzsb * vcbb +sltd: 16 +nhjb: wlch * zbns +mbhg: prbw * htzw +bqfj: rmlg + tqpm +jswp: 10 +wndm: lqfp + qrzq +qszr: lwbr * mzsm +gwjr: mwtd + nhdb +dddq: bpdt * dqtl +gqst: 2 +mhbp: 3 +vmgn: cnhm * vzvj +mwtb: lqtl + pzml +djnb: 3 +mgwj: zfwc * vbzp +qvlz: cbrz / swgs +dmlt: tvng * pvjr +vljz: vjwv + zsth +ppjm: jmdf / qphn +ggsz: 3 +fllf: vtns + rrsb +fbct: 3 +rcnn: 1 +frch: gpsw + blpf +nshg: 3 +ghpd: 8 +dwcv: 3 +hhwc: 2 +btvv: dpgr * hgvf +ftfn: dfzf + vcsb +mtvr: 1 +bjvn: vsbt + tqsl +wbtw: dhbb + msmz +fbpq: vgrh + dqwz +rspd: dfdj + snjb +bdmd: cnrb * pcjl +zjmz: zflw + npvm +qjss: 2 +mfjn: 3 +bpdt: 2 +rgnc: 4 +tlgh: 3 +wvnh: wljd + cntb +jftd: qwqh * mmtv +svtt: bcbr * hrdf +zcsq: 2 +cmpb: 2 +lsmv: fldl * jwnv +cfbh: 4 +fnzp: hwdq + gqrz +jrhz: wshh * bqwf +cwff: fpcg / vcdp +tqsn: jsss - jndt +wsnp: 10 +mbfh: 10 +nnzh: 2 +vvpr: mmdc + qdtc +wnbs: 2 +jwgn: 5 +cdhw: tbvt * cmqq +hrgv: jjqs - ghfp +gggw: 1 +zbmw: nlmg + npbq +hzth: 5 +sfpd: jrhz / nqgr +pbbm: 2 +pqjr: vjhv * ngln +dvhb: pptt * jcvg +hbrf: rznw + brph +zbqp: 5 +jrfd: 2 +ttzm: 4 +tzbd: 5 +qthh: 12 +zbzs: 4 +qhdn: fgss - glfv +qcrr: cpjl + slnc +frdt: wwbb + zwsh +hzjl: qtct * wmtz +vdbw: hltd * rjlb +snqq: thfd + cwjn +nvtf: zlgj * jjfq +rldr: npcc + rjrg +pjlr: whvr + vmdp +qlvv: qlth + wtfl +mdhq: tlbj + tbgz +drpf: 2 +dsvd: 2 +mmgn: vtqs + wbjg +fwmd: 13 +rfnb: 4 +ftjn: 2 +ttrt: 1 +tzns: cnml * fwbj +sszm: 2 +jmmd: mlns * ggsd +jngw: 3 +ghdl: qlhz * wcsm +rmfn: vmhp + brbj +tdrm: jrlv * zjjb +vvsd: hdnj * jrdn +pptt: 14 +wbqh: drzr - nnbp +dvrq: mbsq + hjnp +hmvc: jbnl + lzvq +djct: dzwf * dlnv +rcdr: 4 +glhf: 2 +nclj: 1 +qlth: mzhg * pnzd +gzhh: 7 +jvcd: 2 +mzjh: 2 +psjs: 4 +rtmp: lllf * zsfr +tfqd: vqmz / tdmq +wbjg: fqhc + dnwp +hgcs: fzhc + fmdt +pnrf: 4 +rjnp: jgnp + mcdl +pmml: 14 +nvst: 7 +ztgn: 2 +ptcd: mswn * rdlc +nwrh: vbhd + srjq +spdf: 2 +szwt: 10 +nlws: tftg + ldsb +lnpp: lrhs + rqzs +dwzn: vdbw * jrfd +nqgr: 3 +dpqs: 8 +trqs: rtgq + pgpt +hfvt: 3 +rqrt: 3 +fnzf: rlwz * sqdw +ccpq: 9 +bpzr: 10 +tllz: 2 +tsrb: jhhj * bplh +rlvs: wlcs + clbs +bzhc: 6 +sqhb: zzsb * qvgj +qbcp: 2 +trjz: rzgp + bjtr +plnr: 8 +wlrd: trhr * bzsh +rptt: 2 +fwht: 2 +cctw: 3 +zhjr: ptjl * zgmn +gmhb: wvtt * msmh +tjlr: fhjl + wndm +vjwv: zwcn * fllz +twrz: 2 +whbr: 5 +wrmm: qqjs / wwfm +mgvp: fncf * rlln +tclr: rfst * wcgv +wmvj: 2 +wsrf: 3 +czdz: 3 +djvs: qswt * cwhz +fmcj: 14 +gvgr: jrsq * znjl +tcpp: qvbz + ddng +nptj: 2 +vdfv: dggn * zghq +lggq: 3 +vvcs: drtr + fqvf +hrsr: czjc * fzdd +spzs: dmwq + cvnp +tdwc: 3 +hvsq: mhbp * hdqh +hlhc: cwbv + bcsh +ndwd: dpwm * dsrm +mwjm: 1 +fhbt: vbnh * sbdv +dhbb: ttmm * svbc +jmjc: 2 +lvhn: 4 +cjfr: 5 +fzrg: 2 +lslz: sfwp * nnlw +nfmq: wnbs * mfqd +qwzc: 6 +fnjc: fmgv * shfg +wjpl: hbbj + wnnp +bjtr: 1 +cbts: 6 +pzml: gqqs * vrds +cprd: cvsc * gzrf +zrpj: swsq / jncf +rcjj: tbbv * bvhw +bwdq: 3 +dfmf: ljzs + wpqh +cpjl: 5 +hgbc: jhpl + fhbh +qswt: 9 +tbvd: 3 +smht: nzsw * ntgm +wfvc: 1 +fwqn: gjnn + mrhn +rjsh: zljs / gjbl +ljnh: jshp + mdqz +qlvb: rqff * wctc +zzdc: gvhl + dsrp +pbsz: gbbs + zjzn +hzbf: 2 +rbgn: 6 +vvpd: vghv * jsld +bmbg: 4 +gjrw: 5 +fqrw: 16 +mdfm: 3 +zdzt: 3 +jpll: fvzr * vmcp +cnrb: 2 +vcwt: bslp * qjss +sgzq: ptcd + vsch +wscc: 7 +nbqw: qhfc + pfft +zftd: ztnz + lshr +lwbr: 2 +mjqh: mwjd + tpfh +vntw: hvsq * bmbp +jmdf: wsfb + dhvj +mlns: cgsl / cwfs +qbqq: 2 +sghd: 2 +wlsv: 5 +mrqz: dwcz * zqwg +pgmf: pwzq * qzmg +bqlz: rbgn + qrqq +ndml: sqqh + jbtv +lwqj: ndfc + qfsd +thzq: 7 +bcsh: gwbb * zmpt +jfnd: mlzr - lcvq +nwps: mnrv + nhdh +bghq: 7 +ncnr: 2 +rvhr: 2 +wdls: bdsm + vhpb +rpcj: 5 +wzgj: thhg * qfbb +crpn: gtqg + fdrw +ptsg: pwcf * cfbh +llbs: rgns - tcmn +bcbv: 1 +dwpb: 2 +lqhz: plrf * zfsz +jncf: 2 +jbnl: sqnc - djvs +znhf: rczp * nglm +fwwb: lhrp + schl +wpbs: 1 +wrsm: hlhc * njzm +fbpg: 2 +hhnt: tgpw + fnmz +fmdt: mjlm + ntrn +spvg: rghc * jrrn +wlwf: rstf + clgp +whlv: 3 +ttgd: 5 +ssss: 3 +vdff: 5 +jzdr: tdpv - vnsd +pcfz: zcjd + whcc +gprb: 3 +hfcp: fhpp + qdct +zzsb: 4 +frhj: vnwn * fnnh +tqpm: vvbs / tfbz +jhrv: ptzt * stgf +hzbl: 2 +zgqv: mtml + wfvc +jgqm: jhrv + qhph +npcg: 3 +wcnm: 10 +vssf: qvbr / chgl +tgcb: mqbj * qmdd +mbbp: sqsc * gpbt +wvtt: zczs * qzjd +gnjb: lnwq * qjbw +lbmp: 2 +lzhw: 2 +dsrm: 18 +lcmq: 2 +hsct: zhww * htww +qmjd: 3 +flvv: 2 +jctd: 2 +ffbn: 3 +nbcm: cjfr * jfcn +fvgl: 4 +bnfs: 1 +mwrv: 2 +bzpj: 3 +zqhv: zghv * qmtw +jfnq: 3 +vcpt: 6 +fztq: 2 +wfbt: 2 +dfbw: bbhh + gdjt +vspm: wfpc / zsnb +nrzg: 2 +tvmq: 5 +lljt: nvcw * hsjl +dvjd: dzfw * wsnp +qdct: ztgn * njfq +wvrf: 6 +dzsb: 2 +srhh: 12 +jcjv: cjcv + lzcp +zrbq: 3 +hbbr: czfb * mzhb +qjhl: sljw * jpbw +qltm: rlbv * zjfb +npbq: jlmf + fhdb +spwv: 2 +wvrz: rpln + fwmd +lhgf: 3 +gfbg: jhrs * bsfs +lsqd: 3 +srzc: fhcw * fsfp +ldmm: 10 +cppg: 2 +vdpj: clls * mhhg +btdb: wqhm * pgrm +lrzt: 4 +lnsm: 7 +sfww: 3 +jjbq: 7 +qfvw: zcsq * ljnh +bspf: 2 +smnt: 3 +jjlw: fgwm * htjn +tvhp: 3 +qrrh: zzcd + gwrv +mbsq: 1 +cqcw: 9 +bnrc: 1 +gvsn: 2 +tvdc: 11 +pshs: 4 +lhcp: 3 +cghq: wlrd - rlvs +tjjg: nfmq * mjvj +hhlw: 4 +fzhc: fhvr + fnzp +zjfb: ltsl + tzbd +gbqg: 2 +mmgf: nstj * gcjf +dpfg: pfsj * vwvj +bfws: stcn + nndc +qdlh: 2 +fdnv: vmbv - mjnb +ddqd: 2 +htms: qvjr * sglf +cnrr: 6 +ptsz: 5 +hsjl: 6 +vvlm: 2 +hrwz: 4 +dspv: 3 +fhbh: gplr * mdrb +zgrr: 2 +fdrw: lsqd * qvcb +gbtb: 2 +mszz: 5 +vmdp: cncm * tlhf +bfch: 2 +ztnz: 1 +rsmh: gfnr + snll +zmvd: 18 +ctnr: 10 +hqzd: swjl - fvrn +rclq: fcmc + dvtg +bqdg: bqdt - hgnn +ntzw: wscc + nbzg +dnwp: zfsh * szbm +fhts: 11 +qqgf: 3 +mrnd: vwwh + cdhw +rgns: vmsg + flvh +fdwf: qdsd / lbbb +szlw: 7 +pqqt: 4 +dbrv: 4 +zrvt: wrwh * gmhb +tljd: 2 +zncn: mbdv - cwff +gnvq: qqzg * ppjm +zbst: fnzf - pqlw +jszl: 4 +mmzg: 2 +zfvm: 5 +ptqf: 4 +tzfm: 1 +bldl: crjp / hlls +htnj: 19 +cpwn: 9 +mmtv: pstr + rlqb +chtq: 3 +fhdb: 14 +pmdg: 4 +jbtv: fmmv - hwdn +lnwq: 7 +lrps: 10 +btpl: 11 +lnts: nqjg + brrf +cwhz: 3 +vnwn: scvz + qjwp +gglr: 3 +qtgc: 5 +cdrc: 4 +drlr: 2 +vvvf: 2 +qmtw: 2 +clds: 2 +mcqd: nlrs / mmzg +mswn: rtzs + pjhq +jrhh: 2 +lqpg: 4 +thqt: 8 +ddvz: rfpc + ztfc +nsdg: 4 +twsf: rplv + jzdl +wscz: 3 +hfvv: 2 +slnc: htcc + mvsw +bpss: 16 +fwsr: 3 +cnml: wdhs * hjqq +nfrj: svdn + tnbr +rqzs: nvzh + mvhp +ptjl: 3 +vttc: jbmb - jtzh +qpvl: ghgl + thgf +wwbb: 12 +vblt: 2 +mtml: 6 +whgj: 5 +vwng: 14 +fgnt: 15 +pcdg: 19 +wnvd: mqlm - lvpq +pcvj: gmfw + cpwn +zjjb: 2 +glbh: 11 +cmmv: fhcq * ljss +rqdt: lrpr + bqdg +zvfn: rpcj * thzq +lljs: tjhd * tdvj +tvrv: 2 +jfcp: 5 +nqjg: hbrf * zjnr +fwnj: frng + wqzm +hpnb: 3 +rvcm: 3 +fhcw: 5 +mvnq: 4 +jtnp: 4 +cnhm: clzw / fwht +zfwc: 11 +zwmz: 3 +snjb: 10 +sqzm: 17 +sgpt: 3 +vgtn: wcbw * cdgm +wzsf: nwmc * zpsw +bbhh: swfz - wpmd +rrnh: pjlr * zqbp +gcgw: 2 +qzmb: 3 +dtmr: 3 +jwlg: qcrr / rbws +zwms: jmlj * qhvj +dqrj: fjwm * ffng +mpft: lbfr - qpfn +ggqn: 6 +mqlm: gwgj * qjgv +htgm: nfhs * gbtb +lltz: lrwp * tnsw +ljhw: 5 +wqws: 1 +fgnq: lgpd + lhvb +hpzb: ljhw * mnzp +gqlc: 4 +ggbs: 5 +jhrw: swmz + qhct +fscd: 13 +wlcs: gsrm + wcgz +tnsw: 2 +fvjz: tvdp + mjlg +jgnp: 12 +tvnl: 15 +tmjt: 7 +cznl: 11 +lfvh: pbcs / qqbp +pmhj: 14 +pmvr: tfdg + mbhg +njvg: zpnj * mcjc +gzdz: jqjv - rszm +rqcn: 3 +pmrv: btdb - pwcm +nfpz: qbvt * fbdq +rplv: 1 +ngdz: 2 +gmzt: 2 +clbs: hqzd * bspf +hvqg: dsvw * smch +rlqb: 2 +fzlp: 2 +ztzb: 2 +jqrs: scbm * vgjv +hvlz: bpss + djlq +ghmt: zpwb * njng +ztjj: 4 +prvd: nzlm + fgnt +bqlg: 2 +rmsf: 9 +dmcc: frhj * dwcv +scbm: 11 +sdcp: 12 +gsff: pjgf - hjvv +ndtg: lwwp / ddft +sqsc: 2 +wgqb: 1 +pwrp: mtdz + qswq +jbhh: rqvb + tgpj +zsfr: grww - bhcq +cdfn: gwdv * nnbt +fqql: hncw * nnjf +tfwc: 3 +gzrf: btgp / npgl +sdgq: gdqn * hpdp +dlww: fvgd + fwwb +tqsl: lflb * qrqm +cqdq: dtlh * qqgf +drtr: 3 +qsfp: 3 +lczq: jmcg + gvnp +lzhl: 5 +mtrp: mhvr / jdmv +tfjp: 17 +zgnh: bgrr * ngvn +zcgw: hrwz + plnr +qhsf: 6 +gjbl: 2 +zggg: rjsh / nwcb +tpch: 5 +tvtw: 2 +snvq: tnwh + qhjp +fllz: 11 +vfqv: gnjb + hmtz +gwgj: swgn - fllf +ldsb: 4 +lcjl: gsrs * ngjt +qjsb: tjlr / rfhc +sqlp: lnjz * tljd +lnwn: qqdl * lgnj +ddzt: qhdn + ztvc +njwf: pbpg * ztzt +cqtd: cpmt * mjmt +qhgw: tshn / dmgj +fzpf: wjjm + tgrt +zhnq: lljt / wvrf +qbrv: 3 +dwcz: 6 +fhql: 3 +wwzs: 5 +bczr: pdfm * dnqz +ggsd: 4 +jcvn: nbqw * brnt +vpsn: 4 +wwwh: cznl * frpq +qhfc: hgdg * zjbl +hfrm: 18 +npvg: 6 +vcbn: dpct * tpvb +njbj: hbqc / sfww +wwpz: pvcr * rdff +nsmz: mdbv + jzjc +jlnp: 11 +ljss: 2 +bfct: 3 +pgwv: ftfn + cqpp +jpgt: 2 +blbl: ssss * lspg +wtfl: fwnj + frmj +dfzf: jswh + dzjc +mggd: nzsm * ptjt +gwmv: 15 +zmqm: 13 +bcnm: hgpb * lrpg +brnt: 2 +ngvn: spsz + wzlh +hwdq: ttml + jmcc +gqqs: bscz * wbtr +dlbn: whpf * vtjl +ztzt: pdpz + mjhb +pbjp: czfp + pqjr +mtlh: lpfq / ntpq +hzrb: zqlr - nfzj +nfzj: qsgm + mdgw +ttpt: zmvd * jblr +wtsz: 3 +wjgb: tqlq + ggqn +vdhw: pdfd + jmmd +dhjz: fqql + zhzr +jzhs: qzfr + gpcq +dsbq: lhlv * mdfm +grvn: 7 +rtjl: 3 +cbjb: 8 +wshh: dbrv + lpfh +jplh: jgmw + dphd +lzcp: bglm * fmfw +fcbh: wdsr * ljnc +nfqj: 2 +ggmn: jtvb / wdwf +ccbw: jpll / dnvt +zrdc: gtng * glbh +zgzl: 3 +bslp: lbqq + fmcj +vsqb: mfff * hzbl +fnmz: mgwj * zrsg +qlhz: 3 +phqs: zrrv * ccvm +ghnb: mpfp + qblt +zdlz: dndl + jlnp +ndfc: 3 +pbcs: zbfl * ggcg +qqzv: fmvc * zncr +ffbd: drjt - lnwn +bwpf: ghpd * sctd +dpct: tsjj + nclj +hjsn: 17 +vmlh: mslh + pfvl +qdcm: 3 +nthl: dggs * qjsb +crnp: rnjd * jllm +qfdf: pbhl - fnrq +jgmw: 5 +rjrg: 15 +tjrg: 3 +dppc: 7 +zhvn: lszb * drww +mmdc: slwm / fmpc +fgfh: 2 +nqps: jfcp * nggv +jjfq: 4 +mcjc: fpcp + wqjd +szdl: 2 +fvhf: 2 +drhf: 3 +dhvj: tvhp * qrgm +gcll: cjnc + prqt +rmmj: 5 +zqlr: nszv + grvn +jjqs: sglz * cdjn +mglc: qwww * gzww +rcvg: ttzm + cdnp +tbhc: 11 +nnbt: 2 +tdpv: znth * htcs +jnbq: 9 +zbbs: bsmg + nbvf +vfnv: 2 +gcqd: vvvf * jsrp +jpjh: hbhj * btvs +jqqg: bcbv + grwz +jblr: nsrb * rvcm +npnw: fmhw / mgqv +fssh: 2 +zjzr: hjvw * lvwc +jmcg: 1 +szvm: mcpz * pmqp +bdss: nlws + vjhs +wcgz: zbvf * sqpr +dtwp: vfsz + hfnn +shtd: ndfw + jzsd +tbrt: bjvn * tfwc +fssb: jwlg * jthr +nrdq: dsqj * wnps +jjmh: tgcb + dzpm +jrnd: 18 +ddph: sdcp + gwgw +lpgm: tjhv + hzjl +cwjn: 4 +qzjd: zbwr - ntnv +qwdl: sgcz + hgbc +qswq: 3 +hqwt: 2 +zgmn: fgbd + rdbg +psbt: zpcm - gbqg +vjjz: jwgd + szrj +ntgm: gtwc * nlwj +mmhz: nqps * htgm +ntcc: cvmw * rljz +jpgh: mvfr + twsf +gdmt: wtfw * jjlj +sqdw: qrcv + fzpw +hbqc: zgqv * mfmn +vrfn: 3 +whvf: sffg + vcbn +zncr: lpds + wlpg +bscz: 4 +nvnm: zjzm + fhbt +hntc: nczg * mmwt +vghv: gtmc + qmjd +rznw: 13 +zjnr: 7 +gldd: rmsf - pzmg +hjsv: 5 +lbbb: 2 +gvjp: 2 +pcgt: wjml * mhmd +pstr: 11 +rnfm: 3 +bvhw: 5 +vbnh: 4 +dtlh: sfpd * gwhh +ffpn: pshs + rlbf +nglr: mtvr + vjjz +vmtp: 20 +fzpw: tjmq * bwnt +szbm: 2 +mcth: 2 +csmq: mdhq + mccw +sqdr: 2 +vcmp: trqs * wjhg +fsfp: wrsm + wllh +lvwc: 4 +lvsn: 3 +czct: bjdf * ntps +dvmt: fgnq * sdbb +dtdv: rmjr * nlpm +fhjl: bdrv + szlw +tgcr: 10 +brph: mpcn + zjch +bzsh: qwdl + mwsh +gfnr: fhsh + prvl +blpf: nznb * qtgc +fldl: 4 +dgjp: lvhn * cbjb +njzm: 2 +fmpc: 3 +pdwm: 3 +vtqs: jfnq * gcgc +qjwp: nprt * jwgn +ncjl: 3 +clpz: nzmf * rgjj +jljs: ntbz + hzvl +ghjw: vnzw + svsh +dnvt: 4 +dmtz: 20 +gsrs: spvg / jhcs +szrj: 4 +ncrq: gtcb * swpl +wtmq: 17 +sbjd: 2 +cncm: 2 +dvtg: 3 +fqww: 5 +nzcj: 2 +tnvb: 2 +fqzp: tmjn + czbg +lhtt: 4 +vlsd: njgb + tcpp +zpcz: 2 +qsjh: 2 +bjcj: mqms / rblt +ltlr: spwv * ptrf +vmvw: 2 +qthv: 3 +njgb: ddph + zrdc +vqsf: tnvb + lgsp +mjfd: 7 +cptm: bdmd + jvjb +cjbb: 3 +qjqd: pwzw * jbhh +jstm: 3 +pnvs: 9 +qhrj: mznz * fsdr +rrpw: sntt + nwsf +bpll: 2 +hfnn: 11 +lptc: 7 +fmfw: 2 +djhm: 2 +mvlw: pwjw + nmmt +mnrv: 5 +wcbw: drfr + qjhl +cqmv: jjbq * mvhz +hvjt: mtrp * zmvl +sffg: hntc - tdwj +tsmb: jvcd * cbhp +thlt: 3 +wzml: 2 +bvhz: 2 +phgs: 3 +wnft: hpnb * hfgp +mfvn: lmhb + cctm +qvjr: 2 +tnch: dpfg - ptqf +cdjn: qhdq + jbhw +jrsq: 3 +vnwc: mvnq + vpbg +cmsq: 5 +lmth: gtbb * ddqd +spsz: dppc * vjdp +bzmp: whgj * ghrg +mjlg: nntg + qvmh +rmjr: 3 +wdsr: lmth / hllp +trwl: bbmm + cmmv +wggw: vlvv + crll +zqvb: hzhq * jhdr +fmlb: 4 +fsdr: fvgl * pbjp +dmtw: 10 +nndc: ttpt + lbbz +brqf: ljmq + pmnp +cvnp: jdbg * tbvd +fwvh: 3 +bfdb: 11 +hlls: 4 +fwbj: 5 +jvcb: 4 +mwbv: jsft / nbmb +trqf: 12 +glww: pbbm * dwwj +svhq: vltb + wzpd +hjnp: 6 +pfpz: lvfr * gbpm +lfvb: 2 +qhct: cmpb + hjsv +mjvj: 13 +tlbj: jtgb * brqf +cgsl: hbrc * zhcn +ntcg: ldmm + tbcs +vjdp: mszz * szwt +zbns: qpvl - cjld +qwww: 20 +zgpd: 4 +mdcm: qhrj + vmgn +ztfz: 6 +clgp: 10 +zsth: vzvr * nnzl +tqcj: 3 +fhpp: 1 +hzfc: 5 +jzsd: 4 +rblt: 2 +bqbp: 13 +bqcm: fbpg * rfql +dpld: 2 +jhdr: jzcz * cqwh +tzng: 12 +shnj: hpzb * grfq +lwgv: 4 +jsrg: zmfw * gjmm +zhcn: 2 +lstv: 2 +gcpq: zjmz / nfrq +gpbt: 9 +gjgl: fwwf * prvw +ldch: mggd * whlv +lflb: 4 +qvrt: 2 +psmj: chjp - ptws +qblt: vhrj * lfwn +ptzt: 3 +mdbv: 9 +rbwt: 3 +rpln: 7 +rlbf: 2 +fhgh: wzjl + dzqb +rjbf: 3 +pwss: 3 +mdzz: cgqp * svhq +rdbg: dbrb / mwrv +prbw: 3 +fwwf: 2 +dnqs: jpvz + qhtd +nzsr: 2 +mcnw: smws / mqmf +jpvz: zpmt * tbsc +dzht: 7 +lrwp: 3 +gjmm: 12 +cmpg: 2 +zccc: 5 +gjgd: bfws * ddzs +gfpq: zbmw / ncpg +mjmt: glrg * jsrq +zdwz: 2 +jllm: 6 +lwcv: 2 +bpzz: jpts * cmsq +vftq: shnj - jrnd +vlvv: lhmd * pmml +zmpt: 4 +zhww: 11 +jmpb: 3 +lpgn: 5 +cvmw: bbnp * ptmr +njhw: 3 +zpsw: 4 +gvhl: hrnd + qqpp +hjqq: 2 +jpdq: 3 +nszv: fscd * qlft +glgs: rjtw + vmvw +wfgq: fbrc + qthh +wcdr: 2 +wjhg: dgdf + hvlz +qnbb: gpsl / ngdp +qnsz: rwpv + nghz +snqg: 4 +dggn: 4 +sqbl: mjnr * jhvn +hsnt: rwzn + thzn +zsgd: zgzl * nfqj +cbmq: 14 +gqrz: qwzc + dtwp +htmh: 4 +fgtb: sbhb * ghdl +lmwt: lzhl + tpdz +tpwq: 17 +zpnj: 2 +vjrj: bzpj * mvls +lttb: 2 +jdmv: 2 +jbbm: 5 +qsbt: nglr + scjp +chct: vcmp * fnjc +wtfw: 2 +tgbl: 5 +fgwm: 2 +zjch: shtd + vdpj +qjfv: 5 +btzb: 5 +rnjg: 3 +nlpm: 2 +mpcn: sgqz * bmwj +gsgr: ntcc / vpsn +ndhv: ntzm / lfvb +cvsc: 2 +thzn: tpnn - tjbr +rrzz: 9 +btvh: nvst + pnrf +fhjw: tgml + btpq +gvjb: lptc * svvr +lbns: gpsn + wnft +jbdm: mcbm * fjrl +vvss: fzlp * sqrc +jqgl: 4 +wbtj: glgs + bzwc +pnzd: bwpf + mqrg +qvbr: jcdv + cmqc +pfft: 3 +jjlj: 5 +gcrf: 8 +ddft: 2 +tmgs: cprd + wbpz +wpml: 3 +ljmq: 14 +fwtz: 3 +bglm: 7 +gwrv: wtsz * hdwb +lzsb: vvpd * rzrv +qlwh: 2 +srrg: 4 +pwzl: jzwn * pwss +zbth: 1 +bmbp: 2 +lflt: lrzt + btzb +trnv: zppz / vbsh +srvs: 17 +ntnv: cszm * nwps +fqgf: 4 +pppj: 5 +wftw: qnbf + bldl +vnff: vvpr + njwf +gtng: 3 +vbpp: 4 +nghz: lbns * ljrs +gvgb: cbmq / wcdr +pwlh: 4 +pwzw: 4 +vvmp: dwpb * zbzs +wmtz: jwqz * dpld +lzvh: chtq * jpqs +fgss: nnzh * gwmv +ctts: zzdc + vljz +tsjj: 12 +gcgc: 19 +msdv: 3 +gzww: fngh + sgpt +qssl: 2 +mjgs: 10 +vltb: pcdg * gprb +vlsh: 14 +tcdt: jtrg / bznd +gbpm: gdmt - qzmb +tqcc: zfwp + snrn +hjjh: tmjt * mcqd +twrw: 5 +znjl: 3 +dndl: 2 +jvqv: 18 +gccz: 2 +qpfn: snlj * fvgh +flrm: 2 +wdhs: fbct * lhgf +nqjw: 2 +zsnb: 3 +cmqc: tqsz * jswp +bbhm: 18 +mpfp: lnsm * hfvt +tlvz: wdls - nzcj +lnzn: 16 +wqzm: ptsz * qbmq +crll: tzns / qgrh +htww: 9 +dtqt: 2 +jzwn: 2 +hdqh: jvcb + czdz +fhvr: 15 +btgp: nztv * cpfr +njrz: djtd + twvm +gwdq: 4 +nbcv: mglc + dmcc +vvbs: tfqd - vnwc +vffp: 4 +jtzr: 3 +jqjv: njvg - drlt +tfdg: 1 +jvjc: 5 +sdgj: mcrc * gbgs +tcmn: 5 +qfsd: 18 +ffvv: 2 +jrdn: brts + qbrv +mgfs: trzc + vhwv +mjlm: fgvp * vmss +mllh: nrzm * vqvv +pfsj: 3 +rrfv: pgzz + psqm +fvtf: 11 +mhvr: vnmt * qswf +tgrt: sltd * cqmv +wjml: tvmq + wrmm +wbtr: 3 +tlhf: 3 +cccv: 2 +cjld: tstc + lmwt +dqwz: 5 +nvgv: 13 +rdff: zhjr / rjbf +cbrz: mbbn * lhww +mswc: 2 +bqdt: mwjm + hqgc +tpdz: gldd + hfws +hllp: 2 +tvrz: pfpz * fhrq +smhz: 3 +fdcl: 5 +hfws: drpf * wrmz +wcgv: 4 +qmvv: wsgw * bngr +zzcd: 4 +pdcq: dspv * tnhj +dzfw: 5 +lsct: svlt * mtlr +rmlg: 2 +znff: vqzj * pcfz +tgpj: 5 +mrhn: 1 +tfjh: glth + hfcp +jpqs: 5 +mtbp: 3 +lpzj: 3 +jdgg: jtnp * sjpc +qhph: lcjl / ttbz +vbzp: 11 +sqpr: wpml * cmgq +zpwb: 7 +phnp: rbtv + wcfl +bchn: sgzq / nprn +dphd: 3 +lffw: msdv * czrh +mmwt: 7 +pfsm: 3 +tbsc: jmdl + fqrw +rnrq: 4 +nzsm: 3 +trjj: 5 +drbf: znhf * psjs +fpcg: tqql * zbhr +ggps: wbrr + fqzp +zgwl: fhql * blth +ncpg: 3 +qphw: 10 +mfff: 7 +bqwf: 3 +cwqt: dfjw + rtmp +lgnj: 7 +jtqt: szvm * dvdh +wwfm: 3 +pfhq: bfqr * wvff +hvdv: 2 +wgmt: gvzz + nthl +lvhl: vvss / hrwc +glfv: 6 +wsgw: mnqq - tqlp +nggv: 2 +gpsn: jqdf + ztfz +tfjl: 4 +zppz: mtbp * whvf +mrdm: jrvt * srhh +bwzr: chdg * qhdd +nlmg: qfdf * qgtn +wzlh: zqvb + rcjj +btwt: ggps + qsbt +pdpf: 9 +qhjp: 1 +wqdw: dnqs * tmgs +bgns: nchh * mjqh +ntpq: 2 +dnqz: 2 +bbmm: czln * qjvv +bhbq: mjgs * zqhv +rhjr: 2 +nchh: 4 +hstn: 3 +hjvv: 1 +dncf: 17 +vncn: 7 +rztm: 19 +hdnj: pqqt + hqhc +ztpf: wnmv * psgm +bjdf: 5 +tcqh: 2 +ghgl: mhss + vdnc +pcjl: 4 +prvl: tcgc + rtnd +zghv: rspd * fssh +mcpz: 3 +fvgd: ddqf / mgfs +mcdl: bqfj * tcqh +wmbb: lnzn - pjzl +vtjl: 2 +rjtw: 5 +zpmt: jcjv + qpmr +hrnd: dptr * vlsd +nczf: 2 +zfsh: pfhq - vhrw +pvjr: clpz / rptt +zptq: fbpq + wnrh +qmfb: 2 +clvh: 5 +vcbb: 4 +hvbs: bbhm + gbsz +sglf: 11 +gwbb: 2 +zvmr: 18 +fmnw: jfnd / bwlr +swpl: 2 +tpvb: 2 +fvgh: lljs / ftjn +tbvt: 11 +mmzz: qjdt / lzsg +nclc: 3 +qvqb: 2 +mpmg: 2 +wpgg: lwqj + wddq +qjbw: 2 +gvnp: lffw + bqlg +cwbv: fhjw * cdbt +zwcn: rrpw * jlbj +mqjn: 3 +lpfh: 15 +pmqp: zgbr + zgnh +snss: 3 +mdqz: rttt - phnp +hvns: 2 +bwmz: 8 +clls: fwsr * wrqm +fqvf: 4 +tpmj: 4 +mnqq: bhpv * nlrv +gjnn: 15 +hgpb: dvmt + gqlc +tmjn: 4 +nvfn: qftq * gvgb +wqhm: 3 +mfqd: 3 +rjlb: 2 +rbws: 2 +gdds: 2 +drzr: vdff * wjpl +pwzr: 3 +bngr: 2 +bssz: 9 +zjbl: 2 +scvz: gzhh * qdcm +vhrj: blfd / nzsr +mlzr: fnbb * vldl +mslh: 17 +lrhs: hhnt * qtjq +dnth: 19 +hfff: 2 +jcbs: 5 +fcmc: tvnl + tshv +pljt: 4 +shdh: 2 +nvsl: mdzz + wbqh +lztr: dtqt * jlfc +lqfp: 2 +nmmt: ltlr + ntcg +mdrb: qjqd / cdrc +jwgd: 3 +mdhh: 2 +llsh: 6 +fdzt: ttgd + hglr +msdh: tmqt * flzl +nqtd: 3 +dzjc: 5 +wvff: 5 +splz: 11 +mmpn: 2 +gtcb: ggbs * jzmc +qpmr: dtww + wvrz +jmcc: pchw - btvh +nnjf: 3 +cdgm: 11 +jlmf: 3 +fmnl: 3 +hvmb: 10 +wghc: rgtm * jbbm +vsbt: jtnd * djnb +jcdv: wnvd * glhf +dpwm: 6 +lbqq: 5 +vprv: wzml + fbmm +chbh: svtt + bwzr +czln: sqrh + nvbz +cjnc: 18 +plsf: lfgr + tclr +vgrh: 4 +sgqz: mwbv * djhm +jvjb: lflt * qlgr +zfsz: whzh + nqlc +ltsl: 1 +mvhz: 5 +czfp: 1 +rghc: 2 +vtns: zrgn + lpfj +nptm: 4 +qwbp: pbsz + rbrh +vhpb: 8 +gzjw: 18 +tlfz: 7 +pjhq: 2 +jwqz: 4 +ptjt: 3 +pgzz: wlwf - rgcg +zljs: wgmt + czdw +fnhz: jzhs * pnvs +fgqh: jtzr + rfnb +brts: 8 +mgqv: 2 +flbg: btwt + vcpt +zfwf: 2 +wnmv: 3 +zrwh: 10 +qcwb: 2 +gfwv: 2 +pwcf: 2 +mqhj: 3 +hqwh: mvfn + lgjg +bzwc: hbbr + njbj +sbhb: 14 +pwww: 4 +jppq: 4 +djvn: 3 +jhvn: cdfn + wdlz +lmhb: lrwn * lltz +rwpv: mwtb * shdh +vnmz: 5 +wbrr: 12 +tjhd: qnbb + bpzr +lcgc: gplp * wbvj +mmcf: 2 +gdqn: hzfc * gsff +vprr: vftq + tpmj +mhhg: jngd * jstm +lhvb: 5 +vqzj: 2 +fmgv: lztr + cqdv +hfgp: 2 +hdwb: 11 +vpbg: 7 +nbpt: 10 +czbg: 4 +dlnv: mhgw * tlwh +jhqp: jqqg + llbs +bwlr: 3 +vmhp: njvp + mrdm +qrqm: 11 +hbrc: mvmf + wwwh +lgjg: fqgf + hwzd +ddng: 6 +gjjq: vdfv - srzc +wnps: 2 +nvcw: vfnv * lrtp +zbfl: 4 +rnjd: pzhz + hvjt +hjvw: 8 +nfhs: lfgh / fgfh +svlt: 7 +hqww: 2 +hnbf: 20 +vfdb: 13 +jtst: 10 +drtm: rnfm * brrd +jzbn: ffbd * lpzj +fmhw: mcth * jhqp +lmgg: ndml - zbth +mqbj: gqst * qszr +tjtv: 6 +wntd: vspm * gsfg +tnhj: 5 +gpcq: fmlb * hlbq +vsmf: mjbw * splz +sqhd: 3 +jrtg: 2 +glrg: 7 +vdnc: fztq * zbst +drfr: 3 +lpfj: vjrj + ldch +nnzl: cpmj + ndwd +lpds: rtjl * bnbz +nvzh: npnw * vjwq +vqmz: jzdr * nczf +qqbp: 4 +wmfn: hgcs / jmjc +jpts: 6 +qgtn: 2 +ntbz: 6 +mjft: 4 +dvzb: wntd - gvsq +mwjd: wfbt * qwqj +vlvl: 3 +zsrc: zvmr + ccbw +root: mcnw + wqdw +trzc: 1 +sprf: fcmd * jftd +ngln: 4 +mgqp: 16 +humn: 3803 +zllm: 2 +czrh: 3 +btvs: gnvq + smht +ctft: 15 +jrwj: 6 +fpdt: 17 +blsf: wfhb * lwbw +srjq: rsrw * clds +gplp: 3 +nfgj: jnnn + zwms +qqdl: 2 +vjwq: 3 +jchm: mmgf + fmnw +wmnp: 5 +njrl: 7 +slwm: bhbq - vgtn +wdhl: prsm * spdf +qvvp: rcvg + tzfm +npcc: 4 +ggcg: tzng + crpn +lcvq: lpgm * qrrh +zqwg: 3 +svjl: 4 +gtwc: 2 +gmfw: 4 +jhpl: rmfn + cssc +qbvt: wgqb + gdsh +zgrn: 4 +ljrs: zmnt * jzjq +pvrq: fsgw + pcgt +mvsw: 3 +trhr: bnjm + fwtz +ngjt: 2 +hwnm: 2 +clzw: hqjt + mvlw +srpd: 4 +lgsp: 5 +tpnn: tvrz + btvv +rzrv: 4 +gcjf: 20 +lrtp: mrnd + vvmp +lwwp: mmpn * jljs +nntg: 10 +htjn: tdwc * djvn +sglz: flfj * zgwl +rpsz: 2 +qsph: 7 +ddwd: nsvp * jrwj +jwmz: wlsv * drhf +hzjp: 3 +zvlq: bzmp * gfwv +wpmd: 10 +bbnp: lnqh / dtmr +lfgh: zdlz + pcvj +tjmq: 3 +spzh: 16 +jsrp: dvbq + rvwq +nhdb: plmg + sbjd +pjgf: lpss * zwsn +hwfm: rpsz + mgvp +dvbt: rlzt / sqdr +trnr: dvzb + htdp +rtgq: pgbr + njrz +gtqg: whbr * wmnp +znql: 2 +vwnl: bghq * blls +jcgv: 11 +jbhw: 5 +pgbr: 4 +gvmv: wftw * sszm +lvfr: smnt + jqgl +lspg: wrnd / qbcp +vrds: 8 +qrzq: lhcp * tgbl +rzcv: 5 +wzzz: jbhd + zfwf +dpgr: 7 +tncv: lnbt + qsng +zlgj: 2 +dnhl: 11 +vjhs: 1 +hfgn: 4 +rfst: 4 +tftg: 3 +sqrh: 5 +wlpg: gpjb * hsfj +nlrs: nqjw * dzht +gqzb: 1 +zqnb: gvsn * btfd +nwzz: jfqf * lcmq +wrmz: 8 +cdbt: 3 +zgdn: 5 +hjfc: tjrg * tfjp +zflw: mstt + hqbg +pjrs: 2 +ndsq: 1 +jsss: 8 +vnhv: 2 +qbjn: mswc * qfth +rfpc: zjzr + lszn +jtmh: csdm * czct +vfmg: 2 +wjjm: pgmf / pwzl +drjt: vttc + bpzz +ffsw: hzjp * zbbs +lprt: pmvr + rdpc +lvpq: szdl * cshh +qsqt: 11 +fnrq: nfmg + csmq +snlj: 2 +qsng: 6 +bfqr: rcdr + ntzw +fvrn: qhgz + qqzv +wnrh: 7 +chhz: 2 +mqrg: nfgj * rqrt +vhwv: cfhf + bzhc +jshp: bssz * qvrz +svjg: fdcl + bnrc +vsch: npvg * ffdw +rvgj: 18 +mznz: nsdg * bjmj +btfd: pzqc + qsph +rvwq: jdgg * lsct +hrwc: 4 +wdlz: 3 +ffdw: 5 +brbj: tlhj + jcgv +mbzc: 2 +vzrl: 4 +wscl: blsf + zpjn +ddqf: qgsf - qnsz +wrnn: 2 +blfd: tjjg + rwsz +tstc: hvmb + jpdq +nbsz: srvs * brbb +pwzz: 2 +rzqg: 4 +brbb: 7 +qtlq: thht + mqhj +fhsh: 3 +sqnc: dvjd + dvbt +vfbj: vvlm + tstp +svsh: bgwg - qtlq +grww: thlt * wtmq +fwsq: wggw * brgc +lrjp: 2 +wbqr: 10 +ttgv: 3 +qtct: 2 +sljw: jcll + ttrt +nrwz: 3 +pzmg: 2 +nbvf: wcwq * tncv +jfcn: htms / pwzz +cpzn: 3 +vlgh: 2 +nbmb: 2 +jhrs: 2 +glth: cjqf + stfq +vwvj: 7 +jpbw: 4 +nljg: rrnh * jpgt +brrf: gthh + bqcm +snll: zmwj + smbv +cwqj: rzcv * cnrr +wjtw: ltcd * cbnr +tmfw: 2 +wcsm: rqvf * hnqr +ntzm: hfgn * zftd +jnnn: 1 +jbln: vgqz + frch +lpvz: ptsg * pwww +qphn: 2 +vmcp: 4 +qjgv: btpr + pwzr +djtd: 6 +wllh: vffn * hjsn +fvzq: rrfv + qvvp +pgpt: stjc * rhjr +jdqp: 2 +whvr: zthv + pgqj +gtlc: rjzj * gzjw +jwnv: 3 +qrcv: 14 +rwzn: vhdl * znwg +lrpr: 3 +mhss: ghjw - wghc +zqmw: 4 +rbtv: dhjz + hwnh +hzhq: cqtd + dlbb +pdfm: zrpj + fbpt +jrlv: 4 +zcrr: 2 +mbdv: mpft * bqvs +wrnd: cmgf * dvrq +bfwf: zgdn * pgwv +blls: 2 +jhrb: 20 +wljd: 8 +nsrb: 5 +sjnq: jnbq - zpcz +nrvw: zmqm + mcsn +tgpw: zncn / mjqb +grqn: 1 +brrd: 3 +brgc: 2 +rdpc: 2 +dhwd: zhvn + cctv +sctd: 5 +wlch: 2 +rfhc: 2 +npgl: 2 +vpjv: jpgh * chhz +sdbb: 3 +lwbw: 2 +zwsh: 1 +fbpt: 18 +vcdp: 2 +gpsl: lmcz * lcws +mdgw: 4 +sfwp: qdlh * nvnp +jswh: 1 +vcsb: 1 +vcms: 4 +chjp: szct / mjcw +hnqr: 3 +dfjw: zrwh * fdzt +scjp: 3 +dwvz: 2 +dgjh: 10 +mvmf: wbtw * cbts +lnqg: vmmw * hzrb +jfct: 3 +ftds: grqn + gcvh +mqms: lqhz + dpqs +fjrl: 4 +pbpg: 7 +tdwj: wfgq - tttc +vmsg: 13 +flvh: 10 +qbmq: lsgz * twqq +pfvl: 14 +lnbt: 15 +wbvj: 9 +npvm: gtlc + fdnv +rjzj: dmtz + zrbq +bhfp: qprs + dgjh +rsrw: trjj * lqvp +hqgc: cpzn * zvvp +rqvb: cwqj + snvq +ngdp: 2 From 786f88c00135b012524f301b41c99d3e46e1d399 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 21 Dec 2022 12:54:43 +0100 Subject: [PATCH 359/479] 2022: d21: ex2: add solution --- 2022/d21/ex2/ex2.py | 167 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100755 2022/d21/ex2/ex2.py diff --git a/2022/d21/ex2/ex2.py b/2022/d21/ex2/ex2.py new file mode 100755 index 0000000..386a187 --- /dev/null +++ b/2022/d21/ex2/ex2.py @@ -0,0 +1,167 @@ +#!/usr/bin/env python + +import dataclasses +import enum +import operator +import sys +from typing import Optional, Union + +Num = Union[int, "MathObserver"] + + +class Operator(str, enum.Enum): + ADD = "+" + SUB = "-" + MUL = "*" + DIV = "/" + + def __call__(self, lhs: Num, rhs: Num) -> Num: + OPERATIONS = { + self.ADD: operator.add, + self.SUB: operator.sub, + self.MUL: operator.mul, + self.DIV: operator.floordiv, + } + return OPERATIONS[self](lhs, rhs) + + def reverse(self, lhs: Num, rhs: Num) -> Num: + OPERATIONS = { + self.ADD: Operator.SUB, + self.SUB: Operator.ADD, + self.MUL: Operator.DIV, + self.DIV: Operator.MUL, + } + return OPERATIONS[self](lhs, rhs) + + +@dataclasses.dataclass +class MathObserver: + _operations: list[tuple[Operator, int, bool]] = dataclasses.field( + default_factory=list + ) + _target: Optional[int] = dataclasses.field(default=None, init=False) + + def __add__(self, rhs: int) -> "MathObserver": + return MathObserver(self._operations + [(Operator.ADD, rhs, False)]) + + def __radd__(self, lhs: int) -> "MathObserver": + return MathObserver(self._operations + [(Operator.ADD, lhs, False)]) + + def __mul__(self, rhs: int) -> "MathObserver": + return MathObserver(self._operations + [(Operator.MUL, rhs, False)]) + + def __rmul__(self, lhs: int) -> "MathObserver": + return MathObserver(self._operations + [(Operator.MUL, lhs, False)]) + + def __sub__(self, rhs: int) -> "MathObserver": + return MathObserver(self._operations + [(Operator.SUB, rhs, False)]) + + def __rsub__(self, lhs: int) -> "MathObserver": + return MathObserver(self._operations + [(Operator.SUB, lhs, True)]) + + def __floordiv__(self, rhs: int) -> "MathObserver": + return MathObserver(self._operations + [(Operator.DIV, rhs, False)]) + + def __rfloordiv__(self, lhs: int) -> "MathObserver": + return MathObserver(self._operations + [(Operator.DIV, lhs, True)]) + + def __eq__(self, rhs: object) -> bool: + return self._record_eq(rhs) + + def __req__(self, lhs: object) -> bool: + return self._record_eq(lhs) + + def _record_eq(self, value: object) -> bool: + # Sanity checks + assert isinstance(value, int) + assert self._target is None + self._target = value + return True + + def resolve(self) -> int: + assert self._target is not None # Sanity check + target: int = self._target + + for op, n, is_assymetric_rhs in reversed(self._operations): + if is_assymetric_rhs: + target = op(n, target) # type: ignore + else: + target = op.reverse(target, n) # type: ignore + + return target + + +class Monkey: + def get_value(self, monkeys: dict[str, "Monkey"]) -> Num: + raise NotImplementedError + + +@dataclasses.dataclass +class YellerMonkey(Monkey): + value: int + + def get_value(self, monkeys: dict[str, "Monkey"]) -> int: + return self.value + + +@dataclasses.dataclass +class MathMonkey(Monkey): + lhs: str + op: Operator + rhs: str + _value: Optional[Num] = dataclasses.field(default=None, init=False) + + def get_value(self, monkeys: dict[str, "Monkey"]) -> Num: + if self._value is None: + self._value = self.op( + monkeys[self.lhs].get_value(monkeys), + monkeys[self.rhs].get_value(monkeys), + ) + return self._value + + +class Human(Monkey): + def get_value(self, monkeys: dict[str, "Monkey"]) -> MathObserver: + return MathObserver() + + +def solve(input: list[str]) -> int: + def parse_monkey(input: str) -> tuple[str, Monkey]: + name, value = input.split(": ") + + monkey: Monkey + match value.split(): + case [lhs, op, rhs]: + monkey = MathMonkey(lhs, Operator(op), rhs) + case [n]: + monkey = YellerMonkey(int(n)) + case _: + assert False # Sanity check + + return name, monkey + + monkeys = dict(map(parse_monkey, input)) + + monkeys["humn"] = Human() + + root = monkeys["root"] + assert isinstance(root, MathMonkey) # Sanity check + + lhs, rhs = monkeys[root.lhs], monkeys[root.rhs] + assert lhs.get_value(monkeys) == rhs.get_value(monkeys) + + for monkey in (lhs, rhs): + value = monkey.get_value(monkeys) + if not isinstance(value, MathObserver): + continue + return value.resolve() + assert False # Sanity check + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 17f2ffb0effb2c49ea9e838204fd88b5d4318085 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 22 Dec 2022 16:23:23 +0100 Subject: [PATCH 360/479] 2022: d22: ex1: add input --- 2022/d22/ex1/input | 202 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 2022/d22/ex1/input diff --git a/2022/d22/ex1/input b/2022/d22/ex1/input new file mode 100644 index 0000000..c2ac1ec --- /dev/null +++ b/2022/d22/ex1/input @@ -0,0 +1,202 @@ + ........#........#...............................#.#.......#.....#...............................#.. + .#...........................#....##...........................#...#....#.#......#.#................ + ....#.#....................#.#....###...#..##.....#...............#................#..#............. + ............#...............................#.#..#.............##...#..................##.#......... + .....#.#..#........#...........#..#....#....#................................#..#..............#.... + .................##.#.....#.....#.......................#...............#.###......#...........#.... + ..............#.#..#....#............##.......#....#........#..#......#.................##........#. + ........#.#.....................#....#.....................#...........#.......#..........#......... + .....#..#.......#...........#.......#.#....#...........#.#......#........#................#......... + ..#......................................#........#..#.......................#..##.............##... + ....##....................#....#.................#...#.........#..#.....#.........#...#........#...# + .........#........#................#...#..............................#....###...#.#..........#..... + ............................##.............#....#......................#.#.......................#.. + ............#..#.....#................##.........#..............#..#....#..##....................... + ............#..#...#..#...........#.......#.........................#.........#............#.#...... + .......#.....#.....#........#...#...............................................#......#...#..#..... + .#...#....#.....#.#.#...#................................#...#...................................... + #.........#.........#..........................###............#.#.#.................#.....#......... + ...........#......#..........#........#..........................#......#...........#.#.....#....... + ....#...#..........#...#.....................##.........#.##..#............................##....... + ............................#.......##...........#......#.........................#...........#.#... + ..#..................#..#.........#........................#.......................#.........#.#...# + .....#..................##........................#................##..........#........#........... + ...............#.............#..#..##....#.........#..#.......................#..#...#........#..... + .....#..........#...#.....#...........................#...............#....#.......#...##..#.....#.. + .............##......#.......##...#..........#..................##..............#...............#... + .....................##.#..##..........#............................#..#......##.....#.#....#.....#. + .#........##.........#......#..............#.....#.......#...#.........##.....#.#........#....#..... + .............#......#...........#.....#.#...................................#...#................... + .#.......#.................#.........#...........#..#........#....#...........#..................... + ...........#................#.....#.................##......................#.......#..#.....#...... + ..............#............#.....#.....................#............................#..........#.... + ......#....#..........................#..#....................#............#.........##..#..#...#... + ........#.................................#...#............................#...................#.... + ..........................#...#....#............#.......................#........#........###...#.#. + ........#......#.#.....................#.......................#...#........#.........#.....#....... + .........#...............#....#.........................#............#......#........#........#.#... + .......#..................#....................#.....#..#................................#.......... + ......................#........................#....#..##..#.......#.....#.......................... + ...#......#......#................#..................#............#..........#.#................#... + ....#.#.#..#.....................................#.................................#..........#..... + ...................#...#....#.....#.........................#.....#..................#.#...........# + .........#......#......#......#...........#......#...........#........#.#..#..##..#.....##...#....#. + ....................#.............#...#.#.....#..................#....#.......#...........#....#.... + .................#...............................##...............#........#.#...#..#.#.........#... + ..............#.............#....#......#....................................#..#................... + .......#...#....................#......#..#.......##........#..........#............#...#........... + #..#..........##.........##...#.............................#.......#..#...........................# + ..........#...........#......#..#...........#.....#...#.##.....#.....#...........#........#......#.. + #........#........................................#.#...........#..........#.#....#................. + ...............#.....#....#...........#..#........ + ....#.............#.......#....................... + .#.......................#.................#...... + ..#....#.....#..........#..#........#............. + .......#...#.........#.....#....#..........#...... + #.........#....#......................#........... + ..#......................#...........#............ + ......#..........................##.....#.....#... + ........#............#.....................#...... + .......#............#...........................#. + .#..........#..................................... + ..#....#.....#...................................# + #......###..........#............................. + ........................##...#.........##......... + .......#..........#.......##...................... + ..................#....#.....................#.... + ............#..................................... + ............#..........#.......................... + ...#....................................#......... + ....#.................................#........... + .#.#............#..............#........#......#.. + .....#......#............#.....................#.. + ...#......#..#..#....#............#..........#.... + .....................#.#.....#..#..#....#....#..#. + .....##..................#.........#.............. + ...............#............................#.#... + ..........#............#.#.#........#............. + ..........#..##....##..........#.#.......#.#.#.... + .........#..#........#......#..................... + ....#...#..........................#...#......#... + .....#.......#..........#......#.......#.......... + ......#.....#.#............#.........#.........##. + .....#..#........#.........#........#...........#. + ...........#.............#...................#.... + ...........#.....#.#.................#.#.........# + .##.......#.#................#.#..#..............# + ....#.....#.......................##............#. + ......#...#........#.........#...#..........#..... + ..#................#....#..#..........#...##...... + .#..#...............#...........#................. + ........#....#...#...##..........#................ + ..#.........#.#.............................#..... + ......#............#............#................. + ..###......#......##.....................#..#..... + .............##...........................#..#.... + .........#....#.##........................#....... + .....................#........#............#...... + .....#...............#.............#...##.#.#..... + ......#....#.#......#.............#...##....#..#.. + ..................##..##.#........................ +................##........#.........#........#..........................#..................#........ +...........#............#.............#........#...#....#...#.................#..............#...... +....#.......#.#............#.#....#.......#..............#......................#...#.#............. +....#....#........#..#.....#..#..#.....#.....#.........#............#...#..............#...........# +..............#....#.....#.#.#....#..........#......#............#......#...........#...#..#....###. +...........#.....#..........#...#..##........#....#...................................#..#.......... +............#..............#....#...#..#.............#.#......#..........#........#.........#....... +.....##..............................###..........#................#.#........#..................... +.......................#..........##..........#..........................#..#......#.........#....#. +..............#..............#.#....#.......#................#.....#....#...#..#...#............#... +......................................#.#.............#..........................#..........##...... +........#.....#..#........#..........#....#...........................#...........#................. +.....................#...............................#...##.#.....................#................. +.........#...#..#.....................#................................#.....#................#..... +........##......................##...#............................................#..........#..#... +.....................#.......#........#....#..........#.##........#........................#........ +...................#.................#...#.###..........................#.............#............. +............#...#.....#........#................#........#............#...#...............#...#.#..# +#.....................#.....#..#.#......#.....#.............#.#...........#.#......#.#..........#..# +.................#......................##.........#..........###......###.........#................ +.#..............##..#............#..........#..#............................##..##.................. +.........#......#........#....#.##...........#...#...................#.#..........#...........#....# +........................#....#....................#...#..............#.............##.#.......#.#... +..............#.......#............##.................#.....#.....#.#................#.......#..#... +.................#.#.....#..........#..........................#...............#..........#......... +..##...........#..#......#..................#.......#....##.#................#.#...#................ +#................#.......................#.......#....#....##........#.......#...........#.#........ +..............................................................#..............#.....##............... +......#......###..............................#...#....#..........#..#.#............................ +............#.........#..............#...#......#..........................#........#..............# +.......#.#.............#.....#......................#.............#..........#............#...#.#... +...........#...........##..##.....#...............#....#...#....#............................#.#..#. +.......#..#..#.#..#....#.#.......##...........#.#.#..#.............................................. +............#.............#.##..........#.#......................#...#.##...........#.......#.#...#. +....#...............##....#.........#...........#.#......#....#....#..#......#..#.###.#.#.....#..... +....#.#.......#.#...........#............................#..........#...#.#.#.......#............... +...........................#.#.#..#..................#..................#..#...#..#...#..#....#..... +..##...................................#..........#.......#.....#...#..#............................ +.......#..##........#.#.#........................................#...........#..................#... +#.#..#.......#..........#....#.............#..........#.......#.#.#....#........#..................# +..#......................#....#..#..#....#...............#.....................#............##...... +..#......#.#..#........................................#....................#............#.#.....#.. +...#.#.............................................#...............#................................ +...#..#..#............##........................#...#.#.........##...................#.............. +............................#...............#..................#.......#.........#..............#... +...............#...#....................#......#............#....#...........#...................... +....#..................#......#..............................#..#....##...#..........#.............. +..........................#..#....................#..............##.#......##..............#........ +........................................................#.....................................#..... +......##..........#..#...............#.......#....#.....#..#.........................#...#.......... +.....#......##.............#..#...............#... +.....#..................#.#....#.............#.... +..........#.......#.#.......#..................... +...#............#.........#...#.................## +.............##....................#.............. +.............#.....................#.......#..#... +......#..##....##.........#..............#......#. +.#.##..............#........#......#.#..#........# +...#.................#.....#..#.................#. +..............#.#.........#........#.............. +.....#...#...............#....#........#..#...#... +...#.................#..#......#......##.#......#. +..##..#...........#............................... +...#...#........#.........#....#....#.#........#.. +.#.........#.........................#...#........ +..........#....#..#.................#..#.......... +#...#......................................#...... +..........#........##....#........#....#.......... +..#........##..........#...#..........#.......#... +.#.#...........#.....#......#..#...#......#....... +................##...........#......#............. +##....#.........#...............#....##........... +............................#.#................... +..........#...........................#.#...##.... +............#....................#...........#.... +#........#.............#....#.................#... +...#........................#............#........ +..........#...#..........................##....... +.......#..##....#.......#........#.#.............. +..........#.....##.....#....#...........#......... +..##..#..#........................#...#........... +.........................#....#.....#......#...... +.......#.#.#.................#.................#.. +...#......................#.....#................. +.....#......#.......#..#.....#.................... +..........#...........#...............#........... +........#...........#.........#....##.........#... +........#.#........#..........#................... +................#.......#...##..#................. +...#.#....#.#....#...#......##........#...#....... +.................#.........#.#....#.#.....#....... +............#.....................#...#........... +........#.......#...#........#...........#........ +.......#............#...#.#.................#..#.. +..................#.............#..............#.. +.................#.........#...........#.......... +........##.#...............#...................... +....#.......#..............#..#.....#............. +..#......#..........#...........................#. +........#........#.......#.....#...#.............. + +26R47R4R17L43L25L43L44R10R16L33L39L5L3R43L6L20R19R21R36R9L48R25L44R22R42R20L15R11R18L32L1R44L7R22L22L8R44L25R11L26L19L25R43R14R4R38R23R23R44R26L22L34R48R33R44L6L40R6R43R21R36L3L5L33L42R29R46R26L19L36L23L27L43R31L8R33L21R39R50L43R40R13L35R27L5R9R3R48R16L26R5R21R43L4L35L12L12L37L1L42R34R35R28R9L19L10L1R38R49R38L38L15L20R32R8R42R40R4L40L4L11L14L2L12R33L16R39R25R21R32L8L23R15L37L16L25R6R32L12R34L5L12R48R25L17L15R35R8R2L35L47L49L21L48R46L23R16R32L39L25R19L23L2R5R8L11L39L42L6L12R27L32L14L1R28L6L44R44L43R47R10R40L14R1R19R34L30R43L8L33L2R22R28R23R19R6L30L45L32L20L33L18R8R38R11L41L38L34R24L31R22R29R6L49L10L44R34L23L17R19R39L37L31R40L19R25R32L46L27L17R11R45R2R23L30R2L48R21L1R46R29L4R26L7R19R9R35L30R39L23R38R8R17R7L17L36L14L7R49L34L43R28R23R31L23R38R44R32L23R45L2L19L28L14L25L6L43L28R24L25R10L31R3L1L14L20L48R39R33L34L35L13R7R9R14R30R16L48L40L20L18R7R13L7L2L48L32R30L28L32R26L36R41L29L25L2L7R49L36R42R26L37R31R24R29L21L3L10L30R9R26R32R44R35L24R43R22R12L31R25R34R28L34L36L22L40L9L25R34L11R8R12R45L40R2L26R9L37L30L34R33R12R25L6L7R37L33L9R38L14R25R8L43R37R34L7L34R43R46L47L11L23L1L11R47R14L31R31R6R26R6L18L6L12L27L17R31L19R7L5L25L24R45L12L40L36L13R49R48L12L28L35L17R24L29R29L45R32L38L6L27R48L27R37L5R8L6R1R46R9L2L47L2R37R21R36R49R12R34L44L49R1R20R20R34R5R7R31L32R42R6R25L18L19L6L1L36L50L4L48R37L49R39L16R9R50R11L15R43R27L22R40R10R6R50L46L2R6R39L16L14L1L22L50R27L32R13R44R37R47L19R46R6R43L5L21L39R6L4R45R1L2L5R42R35L32L1L26L43R26L19R38R1R24R26L12L25R46R28R19R30R46R12R50L49R25L4L29R47R42L22L29R42L6R30L18R15R25L31L13L34R40R42L38L18R40L26R10R39L30R7R12L29R15R28L6L40L33L29R6L8L11L42L25L12R14L33R16L42L14R38L30L8L33R34L40L25R17R29L19L47R29L12L17R12L47R19R37R30R48L45R14L48R5R31R20L39R20R24R46R42L21L4R14R3L46R32R15L45L47R24L16R40R33L50L21R12R20R43L47R14L47R30R33R27R48R44L3L45R19L34L25L13R24R38R28L37R34L44R45L15R36R41R12R44R15L28R7L8L22R16R36R3L18R34R34L47R1R24L8R27L50L24L26L34R45R43R23R34L33L5L10R41L25R11L4R50R31R18L9R41L43R30R17L7L31L45R17R8R21R32R18R47R50R11R2L24R38L34R27L19R50L5L35R16L50R41L30L14L27R39L42R34R18L36L17L42L36L28L20L43L48R24R33R32R20L48L16R33L50L29R36L26L49R27R47R4L36L12R45R15L18R41R39L30R44L30R16R38R8R8L29L49L38L50R49R44R7L23R30R21L35L45R22R11R19R45L46L37R36L20L6L27R18L16R46L39L6L15L19R15L11L39R4R42R23R11R44L1R44L23R15L22R40L12R1R41L36L43L41R20R49L50R18R1R43R11L35R45L10L16R27R17L30R14R24R20L21R30L41R25R7R47R15R7R46R44R19R28L49L32R43R1L33L48L46L15R20R3L33L38R39R8R26R16L4L49R36R40R15L36L16L39R30R3L33L14R25L27R41L43R26R46R25L3L47R10L38L31R11R49L1R40R8R13L39L23R31R30R21L5L48R7L33L35L37L43L18R38L8L18R14R29R13L36L44L23L40L38R7R13R48R28R41R8L48L2L40L11R33L17R20R16R21L33L31L50L31R31R23L39L19R6R33R37L49L38R25L35L21R50R33R21R34R20R2L45R36R11R29L3L30R13R25L38L13L30L31R10R3L14R26L5R15R36R22R12L7R45L3L10R19L10R21R45R1R21L6R22L48R27L16L22R28R49L32L21R6R32R2R27R45R5R4R35R45L44L32L8L31R45L38R1L28L17L21L25R34R45R38L11R23L25L32L3R25L24L6L45L25R30L39R20R34L29R33R28R18R9L47L48L49L26R30L39R47R6L21R14L10R23R39L39R36R27R31R18L24L12L5R16R45L29L4R38L19L37R38L37R33R11L2R11R43R32L8L35L41L13L35R20L43L17R23R42L35L16R23R12L6R36R25L33L5R28L32R5R32L26R14L40L27L8L16L21R31R43L21R5R16R1R21R44R45R5R49R45L44R19L11R4L22R45R48R12R34R43R46L19R49R24R7L15R26R18R37L8R11R14L1R2L49R3L50R46R4L14R9R40L23L49R41L49R46R7R10L25R44L8R35L18L24L36L4R33L16R25R50R20R20R19R33R7R37R20R40R14R15R30R26R41R42R8R14R12R35L23L28L6R34L33L48L9L31R7L42L13L26L32L42L9R6R23R35R41L9R37R9L46R28R12L16R39L23L9L15R4R9R38R36R5R2L23L47R8R16L40R22R39R19L40R42L23L9L50R11L34L41L1R29L1R14L18L13R30R36L1L49R34R40R27L43L25R26L13R22R41R15R36R44R39L1R34R7L11L7R23L4L5R48L9R4R3L36L1R4L47L14L16L42L22R50L39L44L1R7R13L21L14R38R36L47R26L36R31R36L41R22L16L18R10R26R9R49R18R33R7R32R9R24R22L7R20L30L1L50L11R14R15R42L34R5L36R16R4L32L42L35L34R44L18L4R47L15R20L44L32R21L47L4L34R12L40L15L1L14L41R27L30L11L17L36L4R5R4L49R33R32L43R1L5R11L4L4L27R17L1L42L3R2L21L15R9L44R25L36R9L18L17R44L14L24L3R25R25L10R20L37R11R19L18R17R17L5L26R12L9L32R47L41L16R41L10R40R25R27R10R43L21L43L14R48R33L39L41L30R11L8L18L10R12R39L49R8R4R10R12L41L39R9L38L18L7R46L32L26L28R27L10R19R22R36R45R30L26L4L38L9R16R45L1L38R43L29L34R11L48R33L32R11R14L47L4L30R46R25L3L10R30L12L36R38L40R21L28R23L13R42R16L18L24R26L10L5L12R10L11R8R25L36L19L42R48L25R1R21L34L37R23R40L28R48R33L49R1L35R10L1L23R31L41L23R5R36L10L32L3L47R40L17L9L31R11R16R4L32L4L47L12L24L10R11R43L15L15L31L32L30R18L44R30R45L19L29R27R19L37R27L24L16R4R4R43R41R48L44R44L15L5R11R32R43R6R18L17R29L24L3L46R40L10L16R6R7R6R21R34R19R7R35L4L33R21L1R16R14R37L2R28R38R29L8R40R14R46L14L24L32L49R5R22L2L48L6R35R4L29R21R37L36R41L11R17R2L17L36L9R14L27R29L44L5R11R40L27L32L32R37R43L39L1L27L8L1R29L28L36R16L18R2R19R41R46R47L6R18L16R28L2R8R48L31L31L45R37L34R32L42L27R43R43L5L11R21L31L18L26R36L8L4L50R18L46L10R16L16L27R37L30L48R40R31L9R7L32R5R43R28R18L22R6L11L32L46L32L4R23L43R50L5R25R19L12R43L47L12L39L28R5R7L31R32R13L1R13L27R45R14R32R24L4R33L27L49L16L28L6R42L9R8R15L16L3R10L17L30L6R17R22R47R48L13L17R21L5R7R30R34L47L3R50R40R12L33L4L22R24L19L48L33L5R19R22R12L26R10R42L21L10R9R21L22R26L32L3R48L42L50L40R1R25R40R24L40R25L42R49R38R43L46R34R11L30R10R1R11L32L22R17R31L20R21L46R32L17L2R17L49R19L1R28L48R21L23R20R12L13R39R31R45L16R28R10R8R33L9L21R35R19L20L41R39L45L24L13R37R7R2R14R33R21L24R48R32R41L48L47L24L9R1R35R48R2L6L8L29L28R12R5L47R6L22L47L38L32L30R21L2R9R1L46L12R28L9R1R38L22L23L45L26R15R20R43L27L50L48L24L42R42R25L16R8L6R11L37L7L24R16R35L20R41R6L4R47L9L15L23R41L16R4R18L31L1R24L28R26L34R11L15R28L33R11R47R36L21R29L31L34L16L46R35L13R20L39L11L6R50L27L30L25R37R46L37L42L36L12R4R7R1R11R50R45L9R10L31R39R41L33R18R14R43L18R23L31L14L13L37L29L29L31L38R17L14L7L5L5R16R6R43L3R31L18L32L2L18R11L10R2R5R2R35R48R12R15L48R25R10L27R23L17L13L42R34R36R17R25L36L17L12L9L3L50L15L2L22L50R45L43L13L39 From 15a33215f33a7f9a4624bed5b8dc83e5c1392b51 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 22 Dec 2022 16:23:29 +0100 Subject: [PATCH 361/479] 2022: d22: ex1: add solution --- 2022/d22/ex1/ex1.py | 133 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100755 2022/d22/ex1/ex1.py diff --git a/2022/d22/ex1/ex1.py b/2022/d22/ex1/ex1.py new file mode 100755 index 0000000..d66184e --- /dev/null +++ b/2022/d22/ex1/ex1.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python + +import enum +import itertools +import sys +from collections.abc import Iterable, Iterator +from typing import NamedTuple, TypeVar, Union + +T = TypeVar("T") + + +def take(n: int, iterable: Iterable[T]) -> Iterator[T]: + return itertools.islice(iterable, n) + + +class Point(NamedTuple): + x: int + y: int + + def __add__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x + other.x, self.y + other.y) + + def __sub__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x - other.x, self.y - other.y) + + +class Tile(str, enum.Enum): + AIR = "." + WALL = "#" + + +class Direction(enum.IntEnum): + EAST = 0 + SOUTH = 1 + WEST = 2 + NORTH = 3 + + def turn(self, rot: "Rotation") -> "Direction": + if rot == Rotation.LEFT: + return Direction((self - 1 + 4) % 4) + if rot == Rotation.RIGHT: + return Direction((self + 1) % 4) + assert False # Sanity check + + def to_delta(self) -> Point: + match self: + case Direction.NORTH: + return Point(-1, 0) + case Direction.SOUTH: + return Point(1, 0) + case Direction.EAST: + return Point(0, 1) + case Direction.WEST: + return Point(0, -1) + + +class Rotation(str, enum.Enum): + LEFT = "L" + RIGHT = "R" + + +Map = dict[Point, Tile] + + +def solve(input: list[str]) -> int: + def parse_map(input: list[str]) -> tuple[Point, Map]: + res: Map = {} + + for i, line in enumerate(input, start=1): + for j, c in enumerate(line, start=1): + if c == " ": + continue + res[Point(i, j)] = Tile(c) + + return min(p for p in res.keys()), res + + def parse_instruction(input: str) -> list[Union[Rotation, int]]: + res: list[Union[Rotation, int]] = [] + i = 0 + while i < len(input): + # Parse direction + if input[i] in list(Rotation): + res.append(Rotation(input[i])) + i += 1 + continue + # Parse int + j = i + 1 + while j < len(input) and input[j] not in list(Rotation): + j += 1 + res.append(int(input[i:j])) + i = j + + return res + + def points_along(start: Point, map: Map, dir: Direction) -> Iterator[Point]: + delta = dir.to_delta() + while True: + start = start + delta + # Wrap around if about to go out-of-bounds + if start not in map: + while (new_start := start - delta) in map: + start = new_start + yield start + + assert input[-2] == "" # Sanity check + + facing = Direction.EAST + start, map = parse_map(input[:-2]) + instructions = parse_instruction(input[-1]) + + for instr in instructions: + if isinstance(instr, Rotation): + facing = facing.turn(instr) + continue + for p in take(instr, points_along(start, map, facing)): + if map[p] == Tile.WALL: + break + start = p + + return 1000 * start.x + 4 * start.y + facing + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From bf7ed284c9380c8689d4ef8503d713432a9bcd14 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 22 Dec 2022 16:23:36 +0100 Subject: [PATCH 362/479] 2022: d22: ex2: add input --- 2022/d22/ex2/input | 202 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 2022/d22/ex2/input diff --git a/2022/d22/ex2/input b/2022/d22/ex2/input new file mode 100644 index 0000000..c2ac1ec --- /dev/null +++ b/2022/d22/ex2/input @@ -0,0 +1,202 @@ + ........#........#...............................#.#.......#.....#...............................#.. + .#...........................#....##...........................#...#....#.#......#.#................ + ....#.#....................#.#....###...#..##.....#...............#................#..#............. + ............#...............................#.#..#.............##...#..................##.#......... + .....#.#..#........#...........#..#....#....#................................#..#..............#.... + .................##.#.....#.....#.......................#...............#.###......#...........#.... + ..............#.#..#....#............##.......#....#........#..#......#.................##........#. + ........#.#.....................#....#.....................#...........#.......#..........#......... + .....#..#.......#...........#.......#.#....#...........#.#......#........#................#......... + ..#......................................#........#..#.......................#..##.............##... + ....##....................#....#.................#...#.........#..#.....#.........#...#........#...# + .........#........#................#...#..............................#....###...#.#..........#..... + ............................##.............#....#......................#.#.......................#.. + ............#..#.....#................##.........#..............#..#....#..##....................... + ............#..#...#..#...........#.......#.........................#.........#............#.#...... + .......#.....#.....#........#...#...............................................#......#...#..#..... + .#...#....#.....#.#.#...#................................#...#...................................... + #.........#.........#..........................###............#.#.#.................#.....#......... + ...........#......#..........#........#..........................#......#...........#.#.....#....... + ....#...#..........#...#.....................##.........#.##..#............................##....... + ............................#.......##...........#......#.........................#...........#.#... + ..#..................#..#.........#........................#.......................#.........#.#...# + .....#..................##........................#................##..........#........#........... + ...............#.............#..#..##....#.........#..#.......................#..#...#........#..... + .....#..........#...#.....#...........................#...............#....#.......#...##..#.....#.. + .............##......#.......##...#..........#..................##..............#...............#... + .....................##.#..##..........#............................#..#......##.....#.#....#.....#. + .#........##.........#......#..............#.....#.......#...#.........##.....#.#........#....#..... + .............#......#...........#.....#.#...................................#...#................... + .#.......#.................#.........#...........#..#........#....#...........#..................... + ...........#................#.....#.................##......................#.......#..#.....#...... + ..............#............#.....#.....................#............................#..........#.... + ......#....#..........................#..#....................#............#.........##..#..#...#... + ........#.................................#...#............................#...................#.... + ..........................#...#....#............#.......................#........#........###...#.#. + ........#......#.#.....................#.......................#...#........#.........#.....#....... + .........#...............#....#.........................#............#......#........#........#.#... + .......#..................#....................#.....#..#................................#.......... + ......................#........................#....#..##..#.......#.....#.......................... + ...#......#......#................#..................#............#..........#.#................#... + ....#.#.#..#.....................................#.................................#..........#..... + ...................#...#....#.....#.........................#.....#..................#.#...........# + .........#......#......#......#...........#......#...........#........#.#..#..##..#.....##...#....#. + ....................#.............#...#.#.....#..................#....#.......#...........#....#.... + .................#...............................##...............#........#.#...#..#.#.........#... + ..............#.............#....#......#....................................#..#................... + .......#...#....................#......#..#.......##........#..........#............#...#........... + #..#..........##.........##...#.............................#.......#..#...........................# + ..........#...........#......#..#...........#.....#...#.##.....#.....#...........#........#......#.. + #........#........................................#.#...........#..........#.#....#................. + ...............#.....#....#...........#..#........ + ....#.............#.......#....................... + .#.......................#.................#...... + ..#....#.....#..........#..#........#............. + .......#...#.........#.....#....#..........#...... + #.........#....#......................#........... + ..#......................#...........#............ + ......#..........................##.....#.....#... + ........#............#.....................#...... + .......#............#...........................#. + .#..........#..................................... + ..#....#.....#...................................# + #......###..........#............................. + ........................##...#.........##......... + .......#..........#.......##...................... + ..................#....#.....................#.... + ............#..................................... + ............#..........#.......................... + ...#....................................#......... + ....#.................................#........... + .#.#............#..............#........#......#.. + .....#......#............#.....................#.. + ...#......#..#..#....#............#..........#.... + .....................#.#.....#..#..#....#....#..#. + .....##..................#.........#.............. + ...............#............................#.#... + ..........#............#.#.#........#............. + ..........#..##....##..........#.#.......#.#.#.... + .........#..#........#......#..................... + ....#...#..........................#...#......#... + .....#.......#..........#......#.......#.......... + ......#.....#.#............#.........#.........##. + .....#..#........#.........#........#...........#. + ...........#.............#...................#.... + ...........#.....#.#.................#.#.........# + .##.......#.#................#.#..#..............# + ....#.....#.......................##............#. + ......#...#........#.........#...#..........#..... + ..#................#....#..#..........#...##...... + .#..#...............#...........#................. + ........#....#...#...##..........#................ + ..#.........#.#.............................#..... + ......#............#............#................. + ..###......#......##.....................#..#..... + .............##...........................#..#.... + .........#....#.##........................#....... + .....................#........#............#...... + .....#...............#.............#...##.#.#..... + ......#....#.#......#.............#...##....#..#.. + ..................##..##.#........................ +................##........#.........#........#..........................#..................#........ +...........#............#.............#........#...#....#...#.................#..............#...... +....#.......#.#............#.#....#.......#..............#......................#...#.#............. +....#....#........#..#.....#..#..#.....#.....#.........#............#...#..............#...........# +..............#....#.....#.#.#....#..........#......#............#......#...........#...#..#....###. +...........#.....#..........#...#..##........#....#...................................#..#.......... +............#..............#....#...#..#.............#.#......#..........#........#.........#....... +.....##..............................###..........#................#.#........#..................... +.......................#..........##..........#..........................#..#......#.........#....#. +..............#..............#.#....#.......#................#.....#....#...#..#...#............#... +......................................#.#.............#..........................#..........##...... +........#.....#..#........#..........#....#...........................#...........#................. +.....................#...............................#...##.#.....................#................. +.........#...#..#.....................#................................#.....#................#..... +........##......................##...#............................................#..........#..#... +.....................#.......#........#....#..........#.##........#........................#........ +...................#.................#...#.###..........................#.............#............. +............#...#.....#........#................#........#............#...#...............#...#.#..# +#.....................#.....#..#.#......#.....#.............#.#...........#.#......#.#..........#..# +.................#......................##.........#..........###......###.........#................ +.#..............##..#............#..........#..#............................##..##.................. +.........#......#........#....#.##...........#...#...................#.#..........#...........#....# +........................#....#....................#...#..............#.............##.#.......#.#... +..............#.......#............##.................#.....#.....#.#................#.......#..#... +.................#.#.....#..........#..........................#...............#..........#......... +..##...........#..#......#..................#.......#....##.#................#.#...#................ +#................#.......................#.......#....#....##........#.......#...........#.#........ +..............................................................#..............#.....##............... +......#......###..............................#...#....#..........#..#.#............................ +............#.........#..............#...#......#..........................#........#..............# +.......#.#.............#.....#......................#.............#..........#............#...#.#... +...........#...........##..##.....#...............#....#...#....#............................#.#..#. +.......#..#..#.#..#....#.#.......##...........#.#.#..#.............................................. +............#.............#.##..........#.#......................#...#.##...........#.......#.#...#. +....#...............##....#.........#...........#.#......#....#....#..#......#..#.###.#.#.....#..... +....#.#.......#.#...........#............................#..........#...#.#.#.......#............... +...........................#.#.#..#..................#..................#..#...#..#...#..#....#..... +..##...................................#..........#.......#.....#...#..#............................ +.......#..##........#.#.#........................................#...........#..................#... +#.#..#.......#..........#....#.............#..........#.......#.#.#....#........#..................# +..#......................#....#..#..#....#...............#.....................#............##...... +..#......#.#..#........................................#....................#............#.#.....#.. +...#.#.............................................#...............#................................ +...#..#..#............##........................#...#.#.........##...................#.............. +............................#...............#..................#.......#.........#..............#... +...............#...#....................#......#............#....#...........#...................... +....#..................#......#..............................#..#....##...#..........#.............. +..........................#..#....................#..............##.#......##..............#........ +........................................................#.....................................#..... +......##..........#..#...............#.......#....#.....#..#.........................#...#.......... +.....#......##.............#..#...............#... +.....#..................#.#....#.............#.... +..........#.......#.#.......#..................... +...#............#.........#...#.................## +.............##....................#.............. +.............#.....................#.......#..#... +......#..##....##.........#..............#......#. +.#.##..............#........#......#.#..#........# +...#.................#.....#..#.................#. +..............#.#.........#........#.............. +.....#...#...............#....#........#..#...#... +...#.................#..#......#......##.#......#. +..##..#...........#............................... +...#...#........#.........#....#....#.#........#.. +.#.........#.........................#...#........ +..........#....#..#.................#..#.......... +#...#......................................#...... +..........#........##....#........#....#.......... +..#........##..........#...#..........#.......#... +.#.#...........#.....#......#..#...#......#....... +................##...........#......#............. +##....#.........#...............#....##........... +............................#.#................... +..........#...........................#.#...##.... +............#....................#...........#.... +#........#.............#....#.................#... +...#........................#............#........ +..........#...#..........................##....... +.......#..##....#.......#........#.#.............. +..........#.....##.....#....#...........#......... +..##..#..#........................#...#........... +.........................#....#.....#......#...... +.......#.#.#.................#.................#.. +...#......................#.....#................. +.....#......#.......#..#.....#.................... +..........#...........#...............#........... +........#...........#.........#....##.........#... +........#.#........#..........#................... +................#.......#...##..#................. +...#.#....#.#....#...#......##........#...#....... +.................#.........#.#....#.#.....#....... +............#.....................#...#........... +........#.......#...#........#...........#........ +.......#............#...#.#.................#..#.. +..................#.............#..............#.. +.................#.........#...........#.......... +........##.#...............#...................... +....#.......#..............#..#.....#............. +..#......#..........#...........................#. +........#........#.......#.....#...#.............. + +26R47R4R17L43L25L43L44R10R16L33L39L5L3R43L6L20R19R21R36R9L48R25L44R22R42R20L15R11R18L32L1R44L7R22L22L8R44L25R11L26L19L25R43R14R4R38R23R23R44R26L22L34R48R33R44L6L40R6R43R21R36L3L5L33L42R29R46R26L19L36L23L27L43R31L8R33L21R39R50L43R40R13L35R27L5R9R3R48R16L26R5R21R43L4L35L12L12L37L1L42R34R35R28R9L19L10L1R38R49R38L38L15L20R32R8R42R40R4L40L4L11L14L2L12R33L16R39R25R21R32L8L23R15L37L16L25R6R32L12R34L5L12R48R25L17L15R35R8R2L35L47L49L21L48R46L23R16R32L39L25R19L23L2R5R8L11L39L42L6L12R27L32L14L1R28L6L44R44L43R47R10R40L14R1R19R34L30R43L8L33L2R22R28R23R19R6L30L45L32L20L33L18R8R38R11L41L38L34R24L31R22R29R6L49L10L44R34L23L17R19R39L37L31R40L19R25R32L46L27L17R11R45R2R23L30R2L48R21L1R46R29L4R26L7R19R9R35L30R39L23R38R8R17R7L17L36L14L7R49L34L43R28R23R31L23R38R44R32L23R45L2L19L28L14L25L6L43L28R24L25R10L31R3L1L14L20L48R39R33L34L35L13R7R9R14R30R16L48L40L20L18R7R13L7L2L48L32R30L28L32R26L36R41L29L25L2L7R49L36R42R26L37R31R24R29L21L3L10L30R9R26R32R44R35L24R43R22R12L31R25R34R28L34L36L22L40L9L25R34L11R8R12R45L40R2L26R9L37L30L34R33R12R25L6L7R37L33L9R38L14R25R8L43R37R34L7L34R43R46L47L11L23L1L11R47R14L31R31R6R26R6L18L6L12L27L17R31L19R7L5L25L24R45L12L40L36L13R49R48L12L28L35L17R24L29R29L45R32L38L6L27R48L27R37L5R8L6R1R46R9L2L47L2R37R21R36R49R12R34L44L49R1R20R20R34R5R7R31L32R42R6R25L18L19L6L1L36L50L4L48R37L49R39L16R9R50R11L15R43R27L22R40R10R6R50L46L2R6R39L16L14L1L22L50R27L32R13R44R37R47L19R46R6R43L5L21L39R6L4R45R1L2L5R42R35L32L1L26L43R26L19R38R1R24R26L12L25R46R28R19R30R46R12R50L49R25L4L29R47R42L22L29R42L6R30L18R15R25L31L13L34R40R42L38L18R40L26R10R39L30R7R12L29R15R28L6L40L33L29R6L8L11L42L25L12R14L33R16L42L14R38L30L8L33R34L40L25R17R29L19L47R29L12L17R12L47R19R37R30R48L45R14L48R5R31R20L39R20R24R46R42L21L4R14R3L46R32R15L45L47R24L16R40R33L50L21R12R20R43L47R14L47R30R33R27R48R44L3L45R19L34L25L13R24R38R28L37R34L44R45L15R36R41R12R44R15L28R7L8L22R16R36R3L18R34R34L47R1R24L8R27L50L24L26L34R45R43R23R34L33L5L10R41L25R11L4R50R31R18L9R41L43R30R17L7L31L45R17R8R21R32R18R47R50R11R2L24R38L34R27L19R50L5L35R16L50R41L30L14L27R39L42R34R18L36L17L42L36L28L20L43L48R24R33R32R20L48L16R33L50L29R36L26L49R27R47R4L36L12R45R15L18R41R39L30R44L30R16R38R8R8L29L49L38L50R49R44R7L23R30R21L35L45R22R11R19R45L46L37R36L20L6L27R18L16R46L39L6L15L19R15L11L39R4R42R23R11R44L1R44L23R15L22R40L12R1R41L36L43L41R20R49L50R18R1R43R11L35R45L10L16R27R17L30R14R24R20L21R30L41R25R7R47R15R7R46R44R19R28L49L32R43R1L33L48L46L15R20R3L33L38R39R8R26R16L4L49R36R40R15L36L16L39R30R3L33L14R25L27R41L43R26R46R25L3L47R10L38L31R11R49L1R40R8R13L39L23R31R30R21L5L48R7L33L35L37L43L18R38L8L18R14R29R13L36L44L23L40L38R7R13R48R28R41R8L48L2L40L11R33L17R20R16R21L33L31L50L31R31R23L39L19R6R33R37L49L38R25L35L21R50R33R21R34R20R2L45R36R11R29L3L30R13R25L38L13L30L31R10R3L14R26L5R15R36R22R12L7R45L3L10R19L10R21R45R1R21L6R22L48R27L16L22R28R49L32L21R6R32R2R27R45R5R4R35R45L44L32L8L31R45L38R1L28L17L21L25R34R45R38L11R23L25L32L3R25L24L6L45L25R30L39R20R34L29R33R28R18R9L47L48L49L26R30L39R47R6L21R14L10R23R39L39R36R27R31R18L24L12L5R16R45L29L4R38L19L37R38L37R33R11L2R11R43R32L8L35L41L13L35R20L43L17R23R42L35L16R23R12L6R36R25L33L5R28L32R5R32L26R14L40L27L8L16L21R31R43L21R5R16R1R21R44R45R5R49R45L44R19L11R4L22R45R48R12R34R43R46L19R49R24R7L15R26R18R37L8R11R14L1R2L49R3L50R46R4L14R9R40L23L49R41L49R46R7R10L25R44L8R35L18L24L36L4R33L16R25R50R20R20R19R33R7R37R20R40R14R15R30R26R41R42R8R14R12R35L23L28L6R34L33L48L9L31R7L42L13L26L32L42L9R6R23R35R41L9R37R9L46R28R12L16R39L23L9L15R4R9R38R36R5R2L23L47R8R16L40R22R39R19L40R42L23L9L50R11L34L41L1R29L1R14L18L13R30R36L1L49R34R40R27L43L25R26L13R22R41R15R36R44R39L1R34R7L11L7R23L4L5R48L9R4R3L36L1R4L47L14L16L42L22R50L39L44L1R7R13L21L14R38R36L47R26L36R31R36L41R22L16L18R10R26R9R49R18R33R7R32R9R24R22L7R20L30L1L50L11R14R15R42L34R5L36R16R4L32L42L35L34R44L18L4R47L15R20L44L32R21L47L4L34R12L40L15L1L14L41R27L30L11L17L36L4R5R4L49R33R32L43R1L5R11L4L4L27R17L1L42L3R2L21L15R9L44R25L36R9L18L17R44L14L24L3R25R25L10R20L37R11R19L18R17R17L5L26R12L9L32R47L41L16R41L10R40R25R27R10R43L21L43L14R48R33L39L41L30R11L8L18L10R12R39L49R8R4R10R12L41L39R9L38L18L7R46L32L26L28R27L10R19R22R36R45R30L26L4L38L9R16R45L1L38R43L29L34R11L48R33L32R11R14L47L4L30R46R25L3L10R30L12L36R38L40R21L28R23L13R42R16L18L24R26L10L5L12R10L11R8R25L36L19L42R48L25R1R21L34L37R23R40L28R48R33L49R1L35R10L1L23R31L41L23R5R36L10L32L3L47R40L17L9L31R11R16R4L32L4L47L12L24L10R11R43L15L15L31L32L30R18L44R30R45L19L29R27R19L37R27L24L16R4R4R43R41R48L44R44L15L5R11R32R43R6R18L17R29L24L3L46R40L10L16R6R7R6R21R34R19R7R35L4L33R21L1R16R14R37L2R28R38R29L8R40R14R46L14L24L32L49R5R22L2L48L6R35R4L29R21R37L36R41L11R17R2L17L36L9R14L27R29L44L5R11R40L27L32L32R37R43L39L1L27L8L1R29L28L36R16L18R2R19R41R46R47L6R18L16R28L2R8R48L31L31L45R37L34R32L42L27R43R43L5L11R21L31L18L26R36L8L4L50R18L46L10R16L16L27R37L30L48R40R31L9R7L32R5R43R28R18L22R6L11L32L46L32L4R23L43R50L5R25R19L12R43L47L12L39L28R5R7L31R32R13L1R13L27R45R14R32R24L4R33L27L49L16L28L6R42L9R8R15L16L3R10L17L30L6R17R22R47R48L13L17R21L5R7R30R34L47L3R50R40R12L33L4L22R24L19L48L33L5R19R22R12L26R10R42L21L10R9R21L22R26L32L3R48L42L50L40R1R25R40R24L40R25L42R49R38R43L46R34R11L30R10R1R11L32L22R17R31L20R21L46R32L17L2R17L49R19L1R28L48R21L23R20R12L13R39R31R45L16R28R10R8R33L9L21R35R19L20L41R39L45L24L13R37R7R2R14R33R21L24R48R32R41L48L47L24L9R1R35R48R2L6L8L29L28R12R5L47R6L22L47L38L32L30R21L2R9R1L46L12R28L9R1R38L22L23L45L26R15R20R43L27L50L48L24L42R42R25L16R8L6R11L37L7L24R16R35L20R41R6L4R47L9L15L23R41L16R4R18L31L1R24L28R26L34R11L15R28L33R11R47R36L21R29L31L34L16L46R35L13R20L39L11L6R50L27L30L25R37R46L37L42L36L12R4R7R1R11R50R45L9R10L31R39R41L33R18R14R43L18R23L31L14L13L37L29L29L31L38R17L14L7L5L5R16R6R43L3R31L18L32L2L18R11L10R2R5R2R35R48R12R15L48R25R10L27R23L17L13L42R34R36R17R25L36L17L12L9L3L50L15L2L22L50R45L43L13L39 From 23a88b18afc825130ffcea8ea9681293943ae297 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 22 Dec 2022 16:23:41 +0100 Subject: [PATCH 363/479] 2022: d22: ex2: add solution --- 2022/d22/ex2/ex2.py | 230 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100755 2022/d22/ex2/ex2.py diff --git a/2022/d22/ex2/ex2.py b/2022/d22/ex2/ex2.py new file mode 100755 index 0000000..9a4f2cb --- /dev/null +++ b/2022/d22/ex2/ex2.py @@ -0,0 +1,230 @@ +#!/usr/bin/env python + +import enum +import itertools +import sys +from collections.abc import Iterable, Iterator +from typing import NamedTuple, TypeVar, Union + +T = TypeVar("T") + + +def take(n: int, iterable: Iterable[T]) -> Iterator[T]: + return itertools.islice(iterable, n) + + +class Point(NamedTuple): + x: int + y: int + + def __add__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x + other.x, self.y + other.y) + + def __sub__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x - other.x, self.y - other.y) + + +class Tile(str, enum.Enum): + AIR = "." + WALL = "#" + + +class Direction(enum.IntEnum): + EAST = 0 + SOUTH = 1 + WEST = 2 + NORTH = 3 + + def turn(self, rot: "Rotation") -> "Direction": + if rot == Rotation.LEFT: + return Direction((self - 1 + 4) % 4) + if rot == Rotation.RIGHT: + return Direction((self + 1) % 4) + assert False # Sanity check + + def to_delta(self) -> Point: + match self: + case Direction.NORTH: + return Point(-1, 0) + case Direction.SOUTH: + return Point(1, 0) + case Direction.EAST: + return Point(0, 1) + case Direction.WEST: + return Point(0, -1) + + +class Rotation(str, enum.Enum): + LEFT = "L" + RIGHT = "R" + + +class CubeFace(enum.IntEnum): + # A B + # C + # D E + # F + A = enum.auto() + B = enum.auto() + C = enum.auto() + D = enum.auto() + E = enum.auto() + F = enum.auto() + + def minmax(self) -> tuple[Point, Point]: + match self: + case CubeFace.A: + return Point(1, 51), Point(50, 100) + case CubeFace.B: + return Point(1, 101), Point(50, 150) + case CubeFace.C: + return Point(51, 51), Point(100, 100) + case CubeFace.D: + return Point(101, 1), Point(150, 50) + case CubeFace.E: + return Point(101, 51), Point(150, 100) + case CubeFace.F: + return Point(151, 1), Point(200, 50) + + def belongs(self, p: Point) -> bool: + (minx, miny), (maxx, maxy) = self.minmax() + return (minx <= p.x <= maxx) and (miny <= p.y <= maxy) + + @classmethod + def from_point(cls, p: Point) -> "CubeFace": + return next(f for f in cls if f.belongs(p)) + + def walk_along(self, p: Point, dir: Direction) -> tuple[Point, Direction]: + assert self.belongs(p) # Sanity check + new_p = p + dir.to_delta() + if self.belongs(new_p): + return new_p, dir + return self._do_wrap(p, dir) + + def _do_wrap(self, p: Point, dir: Direction) -> tuple[Point, Direction]: + match (self, dir): + case CubeFace.A, Direction.EAST: # A -> B + return p + dir.to_delta(), dir + case CubeFace.A, Direction.SOUTH: # A -> C + return p + dir.to_delta(), dir + case CubeFace.A, Direction.WEST: # A -> D + return Point(151 - p.x, 1), Direction.EAST + case CubeFace.A, Direction.NORTH: # A -> F + return Point(100 + p.y, 1), Direction.EAST + + case CubeFace.B, Direction.EAST: # B -> E + return Point(151 - p.x, 100), Direction.WEST + case CubeFace.B, Direction.SOUTH: # B -> C + return Point(p.y - 50, 100), Direction.WEST + case CubeFace.B, Direction.WEST: # B -> A + return p + dir.to_delta(), dir + case CubeFace.B, Direction.NORTH: # B -> F + return Point(200, p.y - 100), Direction.NORTH + + case CubeFace.C, Direction.EAST: # C -> B + return Point(50, p.x + 50), Direction.NORTH + case CubeFace.C, Direction.SOUTH: # C -> E + return p + dir.to_delta(), dir + case CubeFace.C, Direction.WEST: # C -> D + return Point(101, p.x - 50), Direction.SOUTH + case CubeFace.C, Direction.NORTH: # C -> A + return p + dir.to_delta(), dir + + case CubeFace.D, Direction.EAST: # D -> E + return p + dir.to_delta(), dir + case CubeFace.D, Direction.SOUTH: # D -> F + return p + dir.to_delta(), dir + case CubeFace.D, Direction.WEST: # D -> A + return Point(151 - p.x, 51), Direction.EAST + case CubeFace.D, Direction.NORTH: # D -> C + return Point(50 + p.y, 51), Direction.EAST + + case CubeFace.E, Direction.EAST: # E -> B + return Point(151 - p.x, 150), Direction.WEST + case CubeFace.E, Direction.SOUTH: # E -> F + return Point(100 + p.y, 50), Direction.WEST + case CubeFace.E, Direction.WEST: # E -> D + return p + dir.to_delta(), dir + case CubeFace.E, Direction.NORTH: # E -> C + return p + dir.to_delta(), dir + + case CubeFace.F, Direction.EAST: # F -> E + return Point(150, p.x - 100), Direction.NORTH + case CubeFace.F, Direction.SOUTH: # F -> B + return Point(1, 100 + p.y), Direction.SOUTH + case CubeFace.F, Direction.WEST: # F -> A + return Point(1, p.x - 100), Direction.SOUTH + case CubeFace.F, Direction.NORTH: # F -> D + return p + dir.to_delta(), dir + + assert False + + +Map = dict[Point, Tile] + + +def solve(input: list[str]) -> int: + def parse_map(input: list[str]) -> tuple[Point, Map]: + res: Map = {} + + for i, line in enumerate(input, start=1): + for j, c in enumerate(line, start=1): + if c == " ": + continue + res[Point(i, j)] = Tile(c) + + return min(p for p in res.keys()), res + + def parse_instruction(input: str) -> list[Union[Rotation, int]]: + res: list[Union[Rotation, int]] = [] + i = 0 + while i < len(input): + # Parse direction + if input[i] in list(Rotation): + res.append(Rotation(input[i])) + i += 1 + continue + # Parse int + j = i + 1 + while j < len(input) and input[j] not in list(Rotation): + j += 1 + res.append(int(input[i:j])) + i = j + + return res + + def points_along(start: Point, dir: Direction) -> Iterator[tuple[Point, Direction]]: + while True: + start, dir = CubeFace.from_point(start).walk_along(start, dir) + yield start, dir + + assert input[-2] == "" # Sanity check + + facing = Direction.EAST + start, map = parse_map(input[:-2]) + instructions = parse_instruction(input[-1]) + + for instr in instructions: + if isinstance(instr, Rotation): + facing = facing.turn(instr) + continue + for p, new_facing in take(instr, points_along(start, facing)): + if map[p] == Tile.WALL: + break + start = p + facing = new_facing + + return 1000 * start.x + 4 * start.y + facing + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 0bed52bf640639ea98e4e091a1db5078c9f56f25 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 23 Dec 2022 10:00:19 +0100 Subject: [PATCH 364/479] 2022: d23: ex1: add input --- 2022/d23/ex1/input | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 2022/d23/ex1/input diff --git a/2022/d23/ex1/input b/2022/d23/ex1/input new file mode 100644 index 0000000..4ef812b --- /dev/null +++ b/2022/d23/ex1/input @@ -0,0 +1,73 @@ +.....##.##...####.##..#.#......######.#.########.##.#.##.#.####.#####..#. +...#.##...##.#####.....##.##.......#####.#.......#...###.#.##.#.######.## +.#.#...#.###..#...#...#..###..#.#..#....#.####..#....###....#.###...#..#. +...#.###.#..##.#.#.##.#.#..##......#.#.##.#....###...#......#.##.##.#.#.. +##.......####......####.#....#...##....#.####.#..###...#.....####.#.###.# +#..#..##.#..##...#.#.##.###.#..#...#.##..##..#.##.....#...#.##....#.#.#.# +##.#....###.#...#.#.#...#..#...####..#..#.#.#...##......#......###.#.#... +#####.##.#...##.###.##.#.####...#....###..#...#........####.#..#.#..##.#. +#....#.#.##.#.####...##..##....#...###...#.####..###..##.##.###.#....#.## +..#..##.........#..##..#.#.###..#..#.##.#.#.....#.###.#.#....##.#.#..##.# +#####.#...###.#..##.###..#..##...#.####.#..#......###..##..##..#.#.#.#.## +##..#####.###....#....#.....##.#.###.##...##.##.....#.....#..#..##....#.. +.#.##.#.#.##....#...#.#.#.#.#.####..##.#...##.....#.###.##.....##...###.# +###....#.#.#.##..##..#.##....#..##..####.#.#....#.....#.###.#....#####.## +#...#..#.....##.#.###.###.#...#.##.####.......####.#.#.#....#####.#.#.#.. +#.###..#.#.#.##...###..##.######.....##.###..##..##.##..###..#....##..#.. +##.....##.###..#...#######.####.#..#..##..#....#..#......#..#.##.......#. +##.#.#.#.#.#....##..#...##..###.....#.####.###.##..#######..##.##..####.# +#.##.##########..###.#...#..##....##.#....#...####.##...#.#.###.#.#..##.# +#####..#.#.##....##.##..###.#####.##..######.###..#..##.#..#.#....#.#.#.# +#.####..###..#..#.#.#..##....#..##.##.##.###....#..##.#.....##...#.#####. +.##...#.#..#.#.#.....#.#....###.....##.#.#.##..##.#.##.#.##.#####.###...# +#.#.##.####....#.#.###..#...#..##...#.#####.#..######.#..#..#..#.##..#### +####..###.##......#.######.#.##..###....####.###.#.#..###.#......#....#.# +.#.....#.###.##....###..#..####.###..##.#.#...###..#.####.##..#.#.#.....# +.#...#.#.#.#...#.#.#.....#..##.#####.##.###.#..##.##.##.#...#...#.#.##### +#####..#....#.###..#.##..##....#..#...###.#.#.###.###.###..#.....###.###. +.####.###.....#..##.....##......##....#...##..#.#..####..#.#.###...#..#.. +.#.##.#.##...#.##.###..#..##...#....##..#.###.#.#.#..##...##....###.#.#.# +...#.#...###.#....#.#.##.........#..##.#...####...#.#..#####.##.###...### +.###..###.#.#..##.###.#####...##.######.###..##.###.###.#.##..#####.##..# +.#..#####..#.####.##.##.##..##.#.#.......#..#..#.##.#.####...##..###.##.# +######.#..###.#.###.#..#..##...#.#...##.#.#.###.##......####..#####.##..# +..###.#....#.##.####..#..#...#..#####...###....####..#.#....#.#.##...##.. +#..##........#....#..#...##.######..#.###.####..#.#.....##..##...####..#. +#.#.#.#.#..#.###..##..#..###.#..##.##...###.....##.#..#####.##...#.#..#.# +....##.....#.##.##..###..#..#.#...#.####.###.######.#....#.####.###....## +#.####...#.##...###.##.#...##....#..##.##...#.#..##.##.#...####..###...#. +.#...#..##.#.#.#.#.#..#.######.....#..#...#.##....##..###..####....###... +#.###...##....#.####....##.#...###...##......##.###.#...###.##.#......##. +#..#...#..##..#..#..####.#.#.#.####....##.............##.###.#..########. +.#..##..#.#.....######.#.#...#.#####..##.###....#.#.#..##....#.#######.## +#...##..#.##..##.#.#..#...##.##.#.#.#.#..#.#.##...###...#######...#.#.#.. +##..###..#..##.##...##.#....##.#...#..###..#..##......#.#..##.###...##... +#....#.###..#..#..#...#.###..#.#.#..##..#.###.###.....#..#..#########.#.# +.##...###.##..###.#...#..#.#.###..#.#..#.#..##.#..#..#..#.#.####..###.### +...##....###.#.##...##.###...#..#.#..###...##..###...##.#.#........###### +.###..#.#####..#..##..###.##.###.###.##.#..#......####..##......#..##.##. +.###.....###.#####.##..########..####.####.#.########.##.#.###.##.#.#.##. +####..###..#.#######.###.#.....#..#.#.#...###..#.###.#####..##.###..#..## +.###.####.##..####.#.#.######.##.#.#..###.#....#.#...##.#.###...#.##.#.## +##..#.#.#####.##.##..###.#..#..#.....#.....#...##...#.#..#.####..#####... +#.###.#.##..##..#########.....##.##.#...##......#.#....#....###..###..##. +##.#.........##....#.##.#.####.#.##.##......##..##..#..##..#####.#..#.... +..#.##.####.#.###.###..#.#.####.#...##....###....######.##.#..##.###.##.. +##..#..#.#######.#...#..###..#.####.###...##.....####.#.#.#.#########..#. +....##.#..#..##..#..##.#.#####..##.....##..##.##....#.#....#...#..#.#...# +#....#.##.#..#..#..##....##..####.#..#..#........#.#...#....#####...##..# +###..#.#..#...#.###.#...##.##..#...#.####.###..#.#.#...##.###.##.#.#.#..# +..#....####....#.#.####..##.##.#.##.#..#.#..###.#.#...###.#.#...###..#..# +###....#......#..#.....#..#........#.###.#.#.###.#.##.....#####.#..###.#. +...###.##...#.###.....#.#..##.....#..#.####.#....##...........##..#...#.# +...#....####.#.##.#.##.#..##.....##..#####...#..#...##.....###....######. +#...#.#.#.#..#.##...#...#.....###.#...#####.#.#..#..##.#.##.##.###.....## +###..##.####..#.#........#.###.......#.....######.#.###..##...#...#.###.. +..###.#.#......##.###..#..#..##.###..###.#.#.....##..##.#.#..######.####. +..###........###.#..#....#..#.###.#....#...#.#.##.......#..##.#..#..##.## +###...#.###.#.######.###...#..#..#.#...#.##..#.#..#....######.##.##.....# +#...##..##...#...###....###..#.#.######.####.#.##.#.##..##...####..###.## +....##.#.#..#..#..#...###...#..###.#..####.#.##....#.########...#.####..# +.#..#.#.###..#.##.###...######.....###.#..###.##..##...#.#.##.##...###### +###.#.#######.#.##.#..##....##.###.#.......#.##.#.##.#.....#...#.##..##.. +#.##.#.##..##.#.#..##...##.#..####...##.#.....#.##.###...#..##...#....#.. From e796cc3342aff0ce8b82222568fec6de6382d3f1 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 23 Dec 2022 10:00:24 +0100 Subject: [PATCH 365/479] 2022: d23: ex1: add solution --- 2022/d23/ex1/ex1.py | 105 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100755 2022/d23/ex1/ex1.py diff --git a/2022/d23/ex1/ex1.py b/2022/d23/ex1/ex1.py new file mode 100755 index 0000000..296a7b0 --- /dev/null +++ b/2022/d23/ex1/ex1.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import defaultdict, deque +from collections.abc import Iterator, Sequence +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + def __add__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x + other.x, self.y + other.y) + + def __sub__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x - other.x, self.y - other.y) + + +ElfMap = set[Point] + + +def neighbours(p: Point) -> Iterator[Point]: + for dx, dy in itertools.product(range(-1, 1 + 1), repeat=2): + if dx == 0 and dy == 0: + continue + yield p + Point(dx, dy) + + +class MoveCandidate(NamedTuple): + dir: Point + empties: set[Point] + + +MOVES = [ + # North + MoveCandidate(Point(-1, 0), {Point(-1, -1), Point(-1, 0), Point(-1, 1)}), + # South + MoveCandidate(Point(1, 0), {Point(1, -1), Point(1, 0), Point(1, 1)}), + # West + MoveCandidate(Point(0, -1), {Point(-1, -1), Point(0, -1), Point(1, -1)}), + # East + MoveCandidate(Point(0, 1), {Point(-1, 1), Point(0, 1), Point(1, 1)}), +] + + +def solve(input: list[str]) -> int: + def to_map(input: list[str]) -> ElfMap: + res: ElfMap = set() + for x, line in enumerate(input): + for y, c in enumerate(line): + if c != "#": + continue + res.add(Point(x, y)) + return res + + def do_round(map: ElfMap, moves: Sequence[MoveCandidate]) -> ElfMap: + move: dict[Point, Point] = {elf: elf for elf in map} + dest_count: dict[Point, int] = defaultdict(int) + # Consider destinations all at once + for elf in map: + if not any(n in map for n in neighbours(elf)): + continue + for candidate in iter(moves): + if any((elf + delta) in map for delta in candidate.empties): + continue + dest = elf + candidate.dir + move[elf] = dest + dest_count[dest] += 1 + break + # Only move elves that don't overlap + res: ElfMap = set() + for elf, dest in move.items(): + if dest_count[dest] > 1: + res.add(elf) + else: + res.add(dest) + assert len(res) == len(map) # Sanity check + return res + + def count_empty(map: ElfMap) -> int: + height = max(p.x for p in map) - min(p.x for p in map) + 1 + width = max(p.y for p in map) - min(p.y for p in map) + 1 + return (height * width) - len(map) + + map = to_map(input) + moves = deque(MOVES) + for _ in range(10): + map = do_round(map, moves) + moves.rotate(-1) + return count_empty(map) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 384d9dcd5077d1998cca905c4482ad8e050d2ac5 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 23 Dec 2022 10:00:30 +0100 Subject: [PATCH 366/479] 2022: d23: ex2: add input --- 2022/d23/ex2/input | 73 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 2022/d23/ex2/input diff --git a/2022/d23/ex2/input b/2022/d23/ex2/input new file mode 100644 index 0000000..4ef812b --- /dev/null +++ b/2022/d23/ex2/input @@ -0,0 +1,73 @@ +.....##.##...####.##..#.#......######.#.########.##.#.##.#.####.#####..#. +...#.##...##.#####.....##.##.......#####.#.......#...###.#.##.#.######.## +.#.#...#.###..#...#...#..###..#.#..#....#.####..#....###....#.###...#..#. +...#.###.#..##.#.#.##.#.#..##......#.#.##.#....###...#......#.##.##.#.#.. +##.......####......####.#....#...##....#.####.#..###...#.....####.#.###.# +#..#..##.#..##...#.#.##.###.#..#...#.##..##..#.##.....#...#.##....#.#.#.# +##.#....###.#...#.#.#...#..#...####..#..#.#.#...##......#......###.#.#... +#####.##.#...##.###.##.#.####...#....###..#...#........####.#..#.#..##.#. +#....#.#.##.#.####...##..##....#...###...#.####..###..##.##.###.#....#.## +..#..##.........#..##..#.#.###..#..#.##.#.#.....#.###.#.#....##.#.#..##.# +#####.#...###.#..##.###..#..##...#.####.#..#......###..##..##..#.#.#.#.## +##..#####.###....#....#.....##.#.###.##...##.##.....#.....#..#..##....#.. +.#.##.#.#.##....#...#.#.#.#.#.####..##.#...##.....#.###.##.....##...###.# +###....#.#.#.##..##..#.##....#..##..####.#.#....#.....#.###.#....#####.## +#...#..#.....##.#.###.###.#...#.##.####.......####.#.#.#....#####.#.#.#.. +#.###..#.#.#.##...###..##.######.....##.###..##..##.##..###..#....##..#.. +##.....##.###..#...#######.####.#..#..##..#....#..#......#..#.##.......#. +##.#.#.#.#.#....##..#...##..###.....#.####.###.##..#######..##.##..####.# +#.##.##########..###.#...#..##....##.#....#...####.##...#.#.###.#.#..##.# +#####..#.#.##....##.##..###.#####.##..######.###..#..##.#..#.#....#.#.#.# +#.####..###..#..#.#.#..##....#..##.##.##.###....#..##.#.....##...#.#####. +.##...#.#..#.#.#.....#.#....###.....##.#.#.##..##.#.##.#.##.#####.###...# +#.#.##.####....#.#.###..#...#..##...#.#####.#..######.#..#..#..#.##..#### +####..###.##......#.######.#.##..###....####.###.#.#..###.#......#....#.# +.#.....#.###.##....###..#..####.###..##.#.#...###..#.####.##..#.#.#.....# +.#...#.#.#.#...#.#.#.....#..##.#####.##.###.#..##.##.##.#...#...#.#.##### +#####..#....#.###..#.##..##....#..#...###.#.#.###.###.###..#.....###.###. +.####.###.....#..##.....##......##....#...##..#.#..####..#.#.###...#..#.. +.#.##.#.##...#.##.###..#..##...#....##..#.###.#.#.#..##...##....###.#.#.# +...#.#...###.#....#.#.##.........#..##.#...####...#.#..#####.##.###...### +.###..###.#.#..##.###.#####...##.######.###..##.###.###.#.##..#####.##..# +.#..#####..#.####.##.##.##..##.#.#.......#..#..#.##.#.####...##..###.##.# +######.#..###.#.###.#..#..##...#.#...##.#.#.###.##......####..#####.##..# +..###.#....#.##.####..#..#...#..#####...###....####..#.#....#.#.##...##.. +#..##........#....#..#...##.######..#.###.####..#.#.....##..##...####..#. +#.#.#.#.#..#.###..##..#..###.#..##.##...###.....##.#..#####.##...#.#..#.# +....##.....#.##.##..###..#..#.#...#.####.###.######.#....#.####.###....## +#.####...#.##...###.##.#...##....#..##.##...#.#..##.##.#...####..###...#. +.#...#..##.#.#.#.#.#..#.######.....#..#...#.##....##..###..####....###... +#.###...##....#.####....##.#...###...##......##.###.#...###.##.#......##. +#..#...#..##..#..#..####.#.#.#.####....##.............##.###.#..########. +.#..##..#.#.....######.#.#...#.#####..##.###....#.#.#..##....#.#######.## +#...##..#.##..##.#.#..#...##.##.#.#.#.#..#.#.##...###...#######...#.#.#.. +##..###..#..##.##...##.#....##.#...#..###..#..##......#.#..##.###...##... +#....#.###..#..#..#...#.###..#.#.#..##..#.###.###.....#..#..#########.#.# +.##...###.##..###.#...#..#.#.###..#.#..#.#..##.#..#..#..#.#.####..###.### +...##....###.#.##...##.###...#..#.#..###...##..###...##.#.#........###### +.###..#.#####..#..##..###.##.###.###.##.#..#......####..##......#..##.##. +.###.....###.#####.##..########..####.####.#.########.##.#.###.##.#.#.##. +####..###..#.#######.###.#.....#..#.#.#...###..#.###.#####..##.###..#..## +.###.####.##..####.#.#.######.##.#.#..###.#....#.#...##.#.###...#.##.#.## +##..#.#.#####.##.##..###.#..#..#.....#.....#...##...#.#..#.####..#####... +#.###.#.##..##..#########.....##.##.#...##......#.#....#....###..###..##. +##.#.........##....#.##.#.####.#.##.##......##..##..#..##..#####.#..#.... +..#.##.####.#.###.###..#.#.####.#...##....###....######.##.#..##.###.##.. +##..#..#.#######.#...#..###..#.####.###...##.....####.#.#.#.#########..#. +....##.#..#..##..#..##.#.#####..##.....##..##.##....#.#....#...#..#.#...# +#....#.##.#..#..#..##....##..####.#..#..#........#.#...#....#####...##..# +###..#.#..#...#.###.#...##.##..#...#.####.###..#.#.#...##.###.##.#.#.#..# +..#....####....#.#.####..##.##.#.##.#..#.#..###.#.#...###.#.#...###..#..# +###....#......#..#.....#..#........#.###.#.#.###.#.##.....#####.#..###.#. +...###.##...#.###.....#.#..##.....#..#.####.#....##...........##..#...#.# +...#....####.#.##.#.##.#..##.....##..#####...#..#...##.....###....######. +#...#.#.#.#..#.##...#...#.....###.#...#####.#.#..#..##.#.##.##.###.....## +###..##.####..#.#........#.###.......#.....######.#.###..##...#...#.###.. +..###.#.#......##.###..#..#..##.###..###.#.#.....##..##.#.#..######.####. +..###........###.#..#....#..#.###.#....#...#.#.##.......#..##.#..#..##.## +###...#.###.#.######.###...#..#..#.#...#.##..#.#..#....######.##.##.....# +#...##..##...#...###....###..#.#.######.####.#.##.#.##..##...####..###.## +....##.#.#..#..#..#...###...#..###.#..####.#.##....#.########...#.####..# +.#..#.#.###..#.##.###...######.....###.#..###.##..##...#.#.##.##...###### +###.#.#######.#.##.#..##....##.###.#.......#.##.#.##.#.....#...#.##..##.. +#.##.#.##..##.#.#..##...##.#..####...##.#.....#.##.###...#..##...#....#.. From aa26b736440b8a8290bc45f2e396428ea1cd220f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 23 Dec 2022 10:00:35 +0100 Subject: [PATCH 367/479] 2022: d23: ex2: add solution --- 2022/d23/ex2/ex2.py | 102 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100755 2022/d23/ex2/ex2.py diff --git a/2022/d23/ex2/ex2.py b/2022/d23/ex2/ex2.py new file mode 100755 index 0000000..26eae2e --- /dev/null +++ b/2022/d23/ex2/ex2.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python + +import itertools +import sys +from collections import defaultdict, deque +from collections.abc import Iterator, Sequence +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + def __add__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x + other.x, self.y + other.y) + + def __sub__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x - other.x, self.y - other.y) + + +ElfMap = set[Point] + + +def neighbours(p: Point) -> Iterator[Point]: + for dx, dy in itertools.product(range(-1, 1 + 1), repeat=2): + if dx == 0 and dy == 0: + continue + yield p + Point(dx, dy) + + +class MoveCandidate(NamedTuple): + dir: Point + empties: set[Point] + + +MOVES = [ + # North + MoveCandidate(Point(-1, 0), {Point(-1, -1), Point(-1, 0), Point(-1, 1)}), + # South + MoveCandidate(Point(1, 0), {Point(1, -1), Point(1, 0), Point(1, 1)}), + # West + MoveCandidate(Point(0, -1), {Point(-1, -1), Point(0, -1), Point(1, -1)}), + # East + MoveCandidate(Point(0, 1), {Point(-1, 1), Point(0, 1), Point(1, 1)}), +] + + +def solve(input: list[str]) -> int: + def to_map(input: list[str]) -> ElfMap: + res: ElfMap = set() + for x, line in enumerate(input): + for y, c in enumerate(line): + if c != "#": + continue + res.add(Point(x, y)) + return res + + def do_round(map: ElfMap, moves: Sequence[MoveCandidate]) -> ElfMap: + move: dict[Point, Point] = {elf: elf for elf in map} + dest_count: dict[Point, int] = defaultdict(int) + # Consider destinations all at once + for elf in map: + if not any(n in map for n in neighbours(elf)): + continue + for candidate in iter(moves): + if any((elf + delta) in map for delta in candidate.empties): + continue + dest = elf + candidate.dir + move[elf] = dest + dest_count[dest] += 1 + break + # Only move elves that don't overlap + res: ElfMap = set() + for elf, dest in move.items(): + if dest_count[dest] > 1: + res.add(elf) + else: + res.add(dest) + assert len(res) == len(map) # Sanity check + return res + + map = to_map(input) + moves = deque(MOVES) + i = 1 + while (new_map := do_round(map, moves)) != map: + map = new_map + moves.rotate(-1) + i += 1 + return i + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 0f1454045d5d4049dcd194a6a9e02fff77e958c8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 24 Dec 2022 14:53:14 +0100 Subject: [PATCH 368/479] 2022: d24: ex1: add input --- 2022/d24/ex1/input | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 2022/d24/ex1/input diff --git a/2022/d24/ex1/input b/2022/d24/ex1/input new file mode 100644 index 0000000..f64ff83 --- /dev/null +++ b/2022/d24/ex1/input @@ -0,0 +1,22 @@ +#.###################################################################################################################################################### +#^>^^<><^>^^v>vv^v^>>^<>^v^>>v>v><^..>v>>>>^>>.v>.v><<.^>>^^^>v>>^.>vv<<.<^v>^v<>^^.^.<<>^<^>.>vvv><^<^>v.^<># +#<..v<<^^.^^v<<>>v>>.<>>^vv^^v>v^>>>v^vv<<><>>v.>.v>.<..v>^^>^<><>vv>>v>.><.<v^vv<>vvvvv^<^v>.# +#<>>^v^v>v>.^v<>vvv>>^<<^>>v^^^.<<<.>>v.>.v^.>>>^><>v>>v^<.v^<.vv^>^v<><>>v^^<^>..<<^<<<^<^>^<>v>vvv>>^<<>><><<^^.<v># +#>.<<<^..>><>v>^vv>vv^^>>.><^>><^.^<>^v>.<^<>>>^>>^><^><^.^>.><><><^>^>>^>>>^<.>>^<^>vv<^v^>.>^>>vv.^<>>^>>>><>.^.>v<.^<>v^>v>^^>>v<><># +#>>v<^v^<^^><>><>.>v^v>^v.>v^.>>.><><<>^><<>^>^v>v^^^>>^v<<<>vv>>v<^^^<<<<>v<^>>.^v>><.v^<.>>vv>v><><.^^^v><.<^>>><# +#>>vv<^vv<<>^v<^v.>>v<><>.>^.^....<<^<.>^^^<><>.>^<>>^^><>>v^vv^<>v^^^^v.<><^><^v<<.v>>><>>><.v>v>>^.^>^># +#>^v>v^vv^.^<<<^><>v^<.>>^^^<^<^>.>>^<<.^>><<.>^^.vv>.vv><^^.<<v..<^<.vvv<..v>.>>^v<^^<^v^>^.<<^^.^^<>v<<<v>><># +#<^>>^>><<>v.v>.vvv><^>v..<<<>>><^v><^>..<^^v>.<<>.v..^<.^vv.>^><>vv><<>v^>v>><^^>^>><^>.>^^<<><><^.>^v<>v^.>v><>>.v^..v># +#<.<<<^><><^<<^>><..>^<<<>^.<>>v..v^^<<<.><.^.<^>^vvv^^^^>v>^>>>>v<><>v.<>>^.<>v^<.^vv>v^.><<^vv<>><>v><^v>>^^^.v^v>v>^v^>.v<<^>.^v^>vv<# +#<<>^^.^>v.<>>^>^.<<^>^><<>v^.><<<.^^^<<^><<^^>.>vv>^>^^v<.^>.^>^<^>^.<>^v.^^^.v>^.^v^<<<><<>v.>>>>^..v>^^vv^v>># +#<^.<^^><>^^^<<>>^>.^^^<^<^<^^<^v.^^v>^v<>.^v^^<<..v<^<>>^<..<^.>>^>.^v.>>v^.v..v.<^vvv^v<><><<^v^v.^^<<>^vv>^^>v>^v<<^>^<^.^# +#<^^v^v>^<^><>v><.>^>^..v^>^v^>^><>v<^v^<v>^vv<^v.<><>vv>>>>v<>^vv<^v<>^^.v>>^^<<.<^>^>>vv>vv^>^v<<>.>^>^v># +#<<>>>.<<>^>>v>^<^v>><<^v<><<.^<^<>>><^v>>v>^<^vv.<^^^.vv^<<<>^^>v>^v.>^^v>v.<>vvv><v>^v.^>vv<>^>.>.v^v.v^vv^<.<>.>vv>^>v^<.<# +#>^<^<<.<<..>>.>^^v>>v>^^>^^>>>v>v^<>v>>^>vvv>><>>vv>.>^.^<>.>^.v<>^^<^v^>>.>v.v<><<<>^<<^>^>^>^.vv..<>v<^># +#..v<<^v^^>^>^<^v^v^^v>><^><<^v.<.vv^v<<>^v<<^v^v^^.>^>v<^^v...>>vv.<^v>v^<<^v^>v<^>v^<>.>v^^^^.^<>^^.^><.<.>>.><.# +#v^v<<^v^>>^vv.v>>v>.vv^>>vv.>v>>>^.>>><.^.^<><>^vv<^<>><^v^>>.<>v<>v<....^^><.<^^>v^v>v<<>>^<>.v.<.vv<.>^.^v^>.># +#<v>>^>.>^^^<.>>^<><>>.>^v^<.v^^.^<<^>^.^v^^v<>>.>.<>.^.v>.^><^>v>v<>.^v<><.<<.><<^v<><><^>v^...v<<^^<^>v>^^vv^^vvv>^>v>>.>>v^^.vv>^# +#>v<>^v><>^>>><<^.^v<v<>>>.^v><^v<<>v<^^.<.><>^<><.v>><^>^>>.<>vvvv.^^v<<>^<>>><>>^v.<^>.^>><<>v<.<^<^>v^^>v^.><# +#>vv^<^.<^>v^v^<><>v<>>v^<>^>>>^v^>v<<^.^>v^v^<^<^^>^^^vv^.<><>><^v.<^<.<>.>^<^<^<>v<^.^vv><.v<^>># +#>v^.v>^v<>>v^>>>^^^^>.v<<^>^v>.^^>^>v^<^v^^<^^v>v>.v^^v><^^.><^^>>v>v^v><>vv><>^vvv>>v>>^v^^<^>>v^<^vv^<^^^^vv<>^^>v^v<><<<<# +######################################################################################################################################################.# From 3389478097816a5bf097f4c2c8bd3605ce29c129 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 24 Dec 2022 14:53:27 +0100 Subject: [PATCH 369/479] 2022: d24: ex1: add solution --- 2022/d24/ex1/ex1.py | 147 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100755 2022/d24/ex1/ex1.py diff --git a/2022/d24/ex1/ex1.py b/2022/d24/ex1/ex1.py new file mode 100755 index 0000000..079de0e --- /dev/null +++ b/2022/d24/ex1/ex1.py @@ -0,0 +1,147 @@ +#!/usr/bin/env python + +import dataclasses +import enum +import sys +from collections import defaultdict, deque +from collections.abc import Iterator +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + def __add__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x + other.x, self.y + other.y) + + def __sub__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x - other.x, self.y - other.y) + + +class Direction(str, enum.Enum): + UP = "^" + DOWN = "v" + LEFT = "<" + RIGHT = ">" + + def to_delta(self) -> Point: + match self: + case Direction.UP: + return Point(-1, 0) + case Direction.DOWN: + return Point(1, 0) + case Direction.LEFT: + return Point(0, -1) + case Direction.RIGHT: + return Point(0, 1) + + +@dataclasses.dataclass +class ValleyMap: + start: Point + goal: Point + valley_corners: tuple[Point, Point] + tornadoes: dict[Point, Direction] + + @classmethod + def from_input(cls, input: list[str]) -> "ValleyMap": + tornadoes: dict[Point, Direction] = {} + for x, line in enumerate(input, start=1): + for y, c in enumerate(line, start=1): + if c in ("#", "."): + continue + tornadoes[Point(x, y)] = Direction(c) + return cls( + # Start position is always above the upper left corner of valley + start=Point(1, 2), + # Goal position is always under the lower left corner of valley + goal=Point(len(input), len(input[0]) - 1), + # Valley is surrounded by walls, except entrance and exit + valley_corners=(Point(2, 2), Point(len(input) - 1, len(input[0]) - 1)), + tornadoes=tornadoes, + ) + + def _is_in_valley(self, p: Point) -> bool: + # Valley also includes start/end + if p in (self.start, self.goal): + return True + # Otherwise, just do a bounds check for inside the walls + ((minx, miny), (maxx, maxy)) = self.valley_corners + return (minx <= p.x <= maxx) and (miny <= p.y <= maxy) + + def _wrap_tornado(self, p: Point) -> Point: + if self._is_in_valley(p): + return p + x, y = p + h = self.valley_corners[1].x - self.valley_corners[0].x + 1 + w = self.valley_corners[1].y - self.valley_corners[0].y + 1 + if x == 1: + x += h + if y == 1: + y += w + if x > self.valley_corners[1].x: + x -= h + if y > self.valley_corners[1].y: + y -= w + return Point(x, y) + + def navigate(self) -> int: + TornadoesMap = dict[Point, list[Direction]] + + def move_tornadoes(map: TornadoesMap) -> dict[Point, list[Direction]]: + res: dict[Point, list[Direction]] = defaultdict(list) + for p, tornadoes in map.items(): + for t in tornadoes: + new_pos = self._wrap_tornado(p + t.to_delta()) + res[new_pos].append(t) + return dict(res) + + def moves(p: Point) -> Iterator[Point]: + yield p + for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)): + yield p + Point(dx, dy) + + # Do a BFS to find the fastest route + queue: deque[tuple[int, Point]] = deque([(0, self.start)]) + seen: set[tuple[int, Point]] = set() + tornado_history = [{p: [t] for p, t in self.tornadoes.items()}] + while queue: + dist, pos = queue.popleft() + # If goal found, return total distance + if pos == self.goal: + return dist + # Check that we don't do redundant work + if (dist, pos) in seen: + continue + seen.add((dist, pos)) + if len(tornado_history) <= (dist + 1): + tornado_history.append(move_tornadoes(tornado_history[-1])) + for new_pos in moves(pos): + # Can't move into the walls, but can move in start/end + if not self._is_in_valley(new_pos): + continue + # Can't occupy same space as tornadoes + if new_pos in tornado_history[dist + 1]: + continue + # Enqueue this move to the search space + queue.append((dist + 1, new_pos)) + assert False # Sanity check + + +def solve(input: list[str]) -> int: + valley = ValleyMap.from_input(input) + return valley.navigate() + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 83bbd2c36c6b12eb7b917337699117729405601a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 24 Dec 2022 14:54:21 +0100 Subject: [PATCH 370/479] 2022: d24: ex2: add input --- 2022/d24/ex2/input | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 2022/d24/ex2/input diff --git a/2022/d24/ex2/input b/2022/d24/ex2/input new file mode 100644 index 0000000..f64ff83 --- /dev/null +++ b/2022/d24/ex2/input @@ -0,0 +1,22 @@ +#.###################################################################################################################################################### +#^>^^<><^>^^v>vv^v^>>^<>^v^>>v>v><^..>v>>>>^>>.v>.v><<.^>>^^^>v>>^.>vv<<.<^v>^v<>^^.^.<<>^<^>.>vvv><^<^>v.^<># +#<..v<<^^.^^v<<>>v>>.<>>^vv^^v>v^>>>v^vv<<><>>v.>.v>.<..v>^^>^<><>vv>>v>.><.<v^vv<>vvvvv^<^v>.# +#<>>^v^v>v>.^v<>vvv>>^<<^>>v^^^.<<<.>>v.>.v^.>>>^><>v>>v^<.v^<.vv^>^v<><>>v^^<^>..<<^<<<^<^>^<>v>vvv>>^<<>><><<^^.<v># +#>.<<<^..>><>v>^vv>vv^^>>.><^>><^.^<>^v>.<^<>>>^>>^><^><^.^>.><><><^>^>>^>>>^<.>>^<^>vv<^v^>.>^>>vv.^<>>^>>>><>.^.>v<.^<>v^>v>^^>>v<><># +#>>v<^v^<^^><>><>.>v^v>^v.>v^.>>.><><<>^><<>^>^v>v^^^>>^v<<<>vv>>v<^^^<<<<>v<^>>.^v>><.v^<.>>vv>v><><.^^^v><.<^>>><# +#>>vv<^vv<<>^v<^v.>>v<><>.>^.^....<<^<.>^^^<><>.>^<>>^^><>>v^vv^<>v^^^^v.<><^><^v<<.v>>><>>><.v>v>>^.^>^># +#>^v>v^vv^.^<<<^><>v^<.>>^^^<^<^>.>>^<<.^>><<.>^^.vv>.vv><^^.<<v..<^<.vvv<..v>.>>^v<^^<^v^>^.<<^^.^^<>v<<<v>><># +#<^>>^>><<>v.v>.vvv><^>v..<<<>>><^v><^>..<^^v>.<<>.v..^<.^vv.>^><>vv><<>v^>v>><^^>^>><^>.>^^<<><><^.>^v<>v^.>v><>>.v^..v># +#<.<<<^><><^<<^>><..>^<<<>^.<>>v..v^^<<<.><.^.<^>^vvv^^^^>v>^>>>>v<><>v.<>>^.<>v^<.^vv>v^.><<^vv<>><>v><^v>>^^^.v^v>v>^v^>.v<<^>.^v^>vv<# +#<<>^^.^>v.<>>^>^.<<^>^><<>v^.><<<.^^^<<^><<^^>.>vv>^>^^v<.^>.^>^<^>^.<>^v.^^^.v>^.^v^<<<><<>v.>>>>^..v>^^vv^v>># +#<^.<^^><>^^^<<>>^>.^^^<^<^<^^<^v.^^v>^v<>.^v^^<<..v<^<>>^<..<^.>>^>.^v.>>v^.v..v.<^vvv^v<><><<^v^v.^^<<>^vv>^^>v>^v<<^>^<^.^# +#<^^v^v>^<^><>v><.>^>^..v^>^v^>^><>v<^v^<v>^vv<^v.<><>vv>>>>v<>^vv<^v<>^^.v>>^^<<.<^>^>>vv>vv^>^v<<>.>^>^v># +#<<>>>.<<>^>>v>^<^v>><<^v<><<.^<^<>>><^v>>v>^<^vv.<^^^.vv^<<<>^^>v>^v.>^^v>v.<>vvv><v>^v.^>vv<>^>.>.v^v.v^vv^<.<>.>vv>^>v^<.<# +#>^<^<<.<<..>>.>^^v>>v>^^>^^>>>v>v^<>v>>^>vvv>><>>vv>.>^.^<>.>^.v<>^^<^v^>>.>v.v<><<<>^<<^>^>^>^.vv..<>v<^># +#..v<<^v^^>^>^<^v^v^^v>><^><<^v.<.vv^v<<>^v<<^v^v^^.>^>v<^^v...>>vv.<^v>v^<<^v^>v<^>v^<>.>v^^^^.^<>^^.^><.<.>>.><.# +#v^v<<^v^>>^vv.v>>v>.vv^>>vv.>v>>>^.>>><.^.^<><>^vv<^<>><^v^>>.<>v<>v<....^^><.<^^>v^v>v<<>>^<>.v.<.vv<.>^.^v^>.># +#<v>>^>.>^^^<.>>^<><>>.>^v^<.v^^.^<<^>^.^v^^v<>>.>.<>.^.v>.^><^>v>v<>.^v<><.<<.><<^v<><><^>v^...v<<^^<^>v>^^vv^^vvv>^>v>>.>>v^^.vv>^# +#>v<>^v><>^>>><<^.^v<v<>>>.^v><^v<<>v<^^.<.><>^<><.v>><^>^>>.<>vvvv.^^v<<>^<>>><>>^v.<^>.^>><<>v<.<^<^>v^^>v^.><# +#>vv^<^.<^>v^v^<><>v<>>v^<>^>>>^v^>v<<^.^>v^v^<^<^^>^^^vv^.<><>><^v.<^<.<>.>^<^<^<>v<^.^vv><.v<^>># +#>v^.v>^v<>>v^>>>^^^^>.v<<^>^v>.^^>^>v^<^v^^<^^v>v>.v^^v><^^.><^^>>v>v^v><>vv><>^vvv>>v>>^v^^<^>>v^<^vv^<^^^^vv<>^^>v^v<><<<<# +######################################################################################################################################################.# From 5254f96e151a86adcef9405c31d6f602c0f8f37f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 24 Dec 2022 14:54:26 +0100 Subject: [PATCH 371/479] 2022: d24: ex2: add solution --- 2022/d24/ex2/ex2.py | 164 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100755 2022/d24/ex2/ex2.py diff --git a/2022/d24/ex2/ex2.py b/2022/d24/ex2/ex2.py new file mode 100755 index 0000000..46b4dc0 --- /dev/null +++ b/2022/d24/ex2/ex2.py @@ -0,0 +1,164 @@ +#!/usr/bin/env python + +import dataclasses +import enum +import sys +from collections import defaultdict, deque +from collections.abc import Iterator +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + def __add__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x + other.x, self.y + other.y) + + def __sub__(self, other): + if not isinstance(other, Point): + return NotImplemented + return Point(self.x - other.x, self.y - other.y) + + +class Direction(str, enum.Enum): + UP = "^" + DOWN = "v" + LEFT = "<" + RIGHT = ">" + + def to_delta(self) -> Point: + match self: + case Direction.UP: + return Point(-1, 0) + case Direction.DOWN: + return Point(1, 0) + case Direction.LEFT: + return Point(0, -1) + case Direction.RIGHT: + return Point(0, 1) + + +@dataclasses.dataclass +class ValleyMap: + start: Point + goal: Point + valley_corners: tuple[Point, Point] + tornadoes: dict[Point, Direction] + + @classmethod + def from_input(cls, input: list[str]) -> "ValleyMap": + tornadoes: dict[Point, Direction] = {} + for x, line in enumerate(input, start=1): + for y, c in enumerate(line, start=1): + if c in ("#", "."): + continue + tornadoes[Point(x, y)] = Direction(c) + return cls( + # Start position is always above the upper left corner of valley + start=Point(1, 2), + # Goal position is always under the lower left corner of valley + goal=Point(len(input), len(input[0]) - 1), + # Valley is surrounded by walls, except entrance and exit + valley_corners=(Point(2, 2), Point(len(input) - 1, len(input[0]) - 1)), + tornadoes=tornadoes, + ) + + def _is_in_valley(self, p: Point) -> bool: + # Valley also includes start/end + if p in (self.start, self.goal): + return True + # Otherwise, just do a bounds check for inside the walls + ((minx, miny), (maxx, maxy)) = self.valley_corners + return (minx <= p.x <= maxx) and (miny <= p.y <= maxy) + + def _wrap_tornado(self, p: Point) -> Point: + if self._is_in_valley(p): + return p + x, y = p + h = self.valley_corners[1].x - self.valley_corners[0].x + 1 + w = self.valley_corners[1].y - self.valley_corners[0].y + 1 + if x == 1: + x += h + if y == 1: + y += w + if x > self.valley_corners[1].x: + x -= h + if y > self.valley_corners[1].y: + y -= w + return Point(x, y) + + def navigate(self) -> int: + TornadoesMap = dict[Point, list[Direction]] + + def move_tornadoes(map: TornadoesMap) -> dict[Point, list[Direction]]: + res: dict[Point, list[Direction]] = defaultdict(list) + for p, tornadoes in map.items(): + for t in tornadoes: + new_pos = self._wrap_tornado(p + t.to_delta()) + res[new_pos].append(t) + return dict(res) + + def moves(p: Point) -> Iterator[Point]: + yield p + for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)): + yield p + Point(dx, dy) + + def bfs( + start: Point, goal: Point, tornadoes: TornadoesMap + ) -> tuple[int, TornadoesMap]: + # Do a BFS to find the fastest route + queue: deque[tuple[int, Point]] = deque([(0, start)]) + seen: set[tuple[int, Point]] = set() + tornado_history = [tornadoes] + while queue: + dist, pos = queue.popleft() + # If goal found, return total distance + if pos == goal: + return dist, tornado_history[dist] + # Check that we don't do redundant work + if (dist, pos) in seen: + continue + seen.add((dist, pos)) + if len(tornado_history) <= (dist + 1): + tornado_history.append(move_tornadoes(tornado_history[-1])) + for new_pos in moves(pos): + # Can't move into the walls, but can move in start/end + if not self._is_in_valley(new_pos): + continue + # Can't occupy same space as tornadoes + if new_pos in tornado_history[dist + 1]: + continue + # Enqueue this move to the search space + queue.append((dist + 1, new_pos)) + assert False # Sanity check + + tornadoes = {p: [t] for p, t in self.tornadoes.items()} + total = 0 + for start, end in ( + # First travel + (self.start, self.goal), + # Back for snacks + (self.goal, self.start), + # Second travel + (self.start, self.goal), + ): + dist, tornadoes = bfs(start, end, tornadoes) + total += dist + return total + + +def solve(input: list[str]) -> int: + valley = ValleyMap.from_input(input) + return valley.navigate() + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From d20e79e2b00c1e975e6b2d5dab6a3cfbf66be3dc Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 25 Dec 2022 11:24:20 +0100 Subject: [PATCH 372/479] 2022: d25: ex1: add input --- 2022/d25/ex1/input | 125 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 2022/d25/ex1/input diff --git a/2022/d25/ex1/input b/2022/d25/ex1/input new file mode 100644 index 0000000..0f32655 --- /dev/null +++ b/2022/d25/ex1/input @@ -0,0 +1,125 @@ +2112 +1=210=2 +1---22==12012-2=2= +1=1 +21=-0 +2-2=02-11== +210=- +202=11=-=12-2= +1-=01-=-1=- +1==1=20=1=12-0=2-2 +10==0==222=-1 +1100-20-= +1=0==01-0=-1-00-201= +100=-222 +21--20-==01-01-022 +2100-1=2-==11 +1=-0=21=2=1112102- +2==02220200=-100 +1= +1=12----0==121 +221=== +10--21-21-2010 +120-000122-20122-= +1-2=01020-=--2 +100-0-12=0101=1==2 +220=-2-011-=12=0 +1=-=0022000-2==- +10=-01 +1-00-02122000=- +1===000=0 +1111 +122--=-0-2--001=0 +1==020--22 +1020-=2-1-1=010=0 +1=-=-=02-= +2-10211-1===1 +1-12-=1-11-2002 +10110- +11=1=0- +12- +102-2=22=2-=-022 +1=-2-0=2--= +2=21=2=0-= +2=-2212= +1=-110222=-1-2==-1 +11122 +1=- +2=01-1=- +1=2=10-202==0===-0= +2--- +1===20=--1 +1-==--1==-2-1=-2=0 +10=-= +1-1=2= +110 +121==0 +22000=20= +1-1=-0-2 +20-2-21=0022-22100 +1=010-=21-=12-1 +22021000222 +10=20=2-111 +12--20=2-20 +100-==2-=10=2-1- +1120012 +1=1202---01-1201= +200 +100=0 +1=10=01-2-=20=01= +1-=--22 +1-0121-==10 +110=1-1 +2-210-=0=10=1- +111-=0-=0=2--- +1=1210==1=-1=11-- +10-01222=011=0=0= +2120 +12-11-=212 +1==11-2-210----2 +12 +2012=-100-02-0-121- +11-2021220-=0 +12-0-00-222 +21-1==22021- +20-0 +1011-=1-10-= +2-00-0 +20-2=1 +1102-=1-==211 +1102-2 +21= +10100-1-1 +1=2-1-0 +1--2===0 +1-=01=2=- +10-1=-202==01-1 +1-01112=2010=-=101 +211==0-0===0==1- +1==220 +1-=1= +1-0110-12 +21-== +21202011--0- +2-2 +2= +200-=-2--1102100-0 +1-00=2-12 +1=-0--=-220212 +1-=210-= +12110-00212--= +20=1 +21=2=0=00 +1=22--=2==20-= +111-1-0211-=000=01 +2-12 +10-2-120===22 +21-00 +1=2 +1-=2- +1=-2--100202-= +2=101122 +11=21----1-- +1--- +12-12 +1=2=0--01=---212 From bc91ad5dadd85ecb5338deab5708fdc3eeda4a5d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 25 Dec 2022 11:24:28 +0100 Subject: [PATCH 373/479] 2022: d25: ex1: add solution --- 2022/d25/ex1/ex1.py | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100755 2022/d25/ex1/ex1.py diff --git a/2022/d25/ex1/ex1.py b/2022/d25/ex1/ex1.py new file mode 100755 index 0000000..59686b9 --- /dev/null +++ b/2022/d25/ex1/ex1.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: list[str]) -> str: + def from_snafu(input: str) -> int: + res = 0 + for c in input: + if c == "=": + n = -2 + elif c == "-": + n = -1 + else: + n = int(c) + res = res * 5 + n + return res + + def to_snafu(input: int) -> str: + # Base case + if not input: + return "0" + + DIGITS = { + 2: "2", + 1: "1", + 0: "0", + -1: "-", + -2: "=", + } + + digits: list[int] = [] + while input: + input, d = divmod(input, 5) + if d not in DIGITS: + d -= 5 + input += 1 + digits.append(d) + return "".join(DIGITS[c] for c in reversed(digits)) + + return to_snafu(sum(map(from_snafu, input))) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From a843028f15f9161afb8ba84734d465bae7b1eed3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 25 Dec 2022 11:25:20 +0100 Subject: [PATCH 374/479] 2022: d25: ex2: add input --- 2022/d25/ex2/input | 125 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 2022/d25/ex2/input diff --git a/2022/d25/ex2/input b/2022/d25/ex2/input new file mode 100644 index 0000000..0f32655 --- /dev/null +++ b/2022/d25/ex2/input @@ -0,0 +1,125 @@ +2112 +1=210=2 +1---22==12012-2=2= +1=1 +21=-0 +2-2=02-11== +210=- +202=11=-=12-2= +1-=01-=-1=- +1==1=20=1=12-0=2-2 +10==0==222=-1 +1100-20-= +1=0==01-0=-1-00-201= +100=-222 +21--20-==01-01-022 +2100-1=2-==11 +1=-0=21=2=1112102- +2==02220200=-100 +1= +1=12----0==121 +221=== +10--21-21-2010 +120-000122-20122-= +1-2=01020-=--2 +100-0-12=0101=1==2 +220=-2-011-=12=0 +1=-=0022000-2==- +10=-01 +1-00-02122000=- +1===000=0 +1111 +122--=-0-2--001=0 +1==020--22 +1020-=2-1-1=010=0 +1=-=-=02-= +2-10211-1===1 +1-12-=1-11-2002 +10110- +11=1=0- +12- +102-2=22=2-=-022 +1=-2-0=2--= +2=21=2=0-= +2=-2212= +1=-110222=-1-2==-1 +11122 +1=- +2=01-1=- +1=2=10-202==0===-0= +2--- +1===20=--1 +1-==--1==-2-1=-2=0 +10=-= +1-1=2= +110 +121==0 +22000=20= +1-1=-0-2 +20-2-21=0022-22100 +1=010-=21-=12-1 +22021000222 +10=20=2-111 +12--20=2-20 +100-==2-=10=2-1- +1120012 +1=1202---01-1201= +200 +100=0 +1=10=01-2-=20=01= +1-=--22 +1-0121-==10 +110=1-1 +2-210-=0=10=1- +111-=0-=0=2--- +1=1210==1=-1=11-- +10-01222=011=0=0= +2120 +12-11-=212 +1==11-2-210----2 +12 +2012=-100-02-0-121- +11-2021220-=0 +12-0-00-222 +21-1==22021- +20-0 +1011-=1-10-= +2-00-0 +20-2=1 +1102-=1-==211 +1102-2 +21= +10100-1-1 +1=2-1-0 +1--2===0 +1-=01=2=- +10-1=-202==01-1 +1-01112=2010=-=101 +211==0-0===0==1- +1==220 +1-=1= +1-0110-12 +21-== +21202011--0- +2-2 +2= +200-=-2--1102100-0 +1-00=2-12 +1=-0--=-220212 +1-=210-= +12110-00212--= +20=1 +21=2=0=00 +1=22--=2==20-= +111-1-0211-=000=01 +2-12 +10-2-120===22 +21-00 +1=2 +1-=2- +1=-2--100202-= +2=101122 +11=21----1-- +1--- +12-12 +1=2=0--01=---212 From 9a3109466b7d4e9400643e807e88ca01885ed115 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 25 Dec 2022 11:25:25 +0100 Subject: [PATCH 375/479] 2022: d25: ex2: add solution --- 2022/d25/ex2/ex2.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 2022/d25/ex2/ex2.py diff --git a/2022/d25/ex2/ex2.py b/2022/d25/ex2/ex2.py new file mode 100755 index 0000000..918e0ec --- /dev/null +++ b/2022/d25/ex2/ex2.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python + + +def main() -> None: + print("There is no part two...") + + +if __name__ == "__main__": + main() From d392ae4f4a178dff7931f0374051d0863c72073f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 1 Dec 2023 19:24:35 +0000 Subject: [PATCH 376/479] nix: use 'main' branch for 'flake-utils' --- flake.lock | 2 +- flake.nix | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flake.lock b/flake.lock index 3b08152..7d3c551 100644 --- a/flake.lock +++ b/flake.lock @@ -27,7 +27,7 @@ }, "original": { "owner": "numtide", - "ref": "master", + "ref": "main", "repo": "flake-utils", "type": "github" } diff --git a/flake.nix b/flake.nix index 9960c28..6334931 100644 --- a/flake.nix +++ b/flake.nix @@ -6,7 +6,7 @@ type = "github"; owner = "numtide"; repo = "flake-utils"; - ref = "master"; + ref = "main"; }; nixpkgs = { From 85d39b0f8a7517d465b2f69d0cb7422a0c9aa5ea Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 1 Dec 2023 19:28:16 +0000 Subject: [PATCH 377/479] nix: bump flake inputs --- flake.lock | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/flake.lock b/flake.lock index 7d3c551..ffbe623 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1668681692, - "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", + "lastModified": 1673956053, + "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", "owner": "edolstra", "repo": "flake-compat", - "rev": "009399224d5e398d03b22badca40a37ac85412a1", + "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", "type": "github" }, "original": { @@ -17,12 +17,15 @@ } }, "futils": { + "inputs": { + "systems": "systems" + }, "locked": { - "lastModified": 1667395993, - "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "lastModified": 1694529238, + "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", "owner": "numtide", "repo": "flake-utils", - "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", + "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", "type": "github" }, "original": { @@ -55,11 +58,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1669809720, - "narHash": "sha256-RMT77f6CPOYtLLQ2esj+EJ1BPVWxf4RDidjrSvA5OhI=", + "lastModified": 1701336116, + "narHash": "sha256-kEmpezCR/FpITc6yMbAh4WrOCiT2zg5pSjnKrq51h5Y=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "227de2b3bbec142f912c09d5e8a1b4e778aa54fb", + "rev": "f5c27c6136db4d76c30e533c20517df6864c46ee", "type": "github" }, "original": { @@ -84,11 +87,11 @@ ] }, "locked": { - "lastModified": 1669829516, - "narHash": "sha256-laWMD/TZzyrulu8xLNoSPertXOxjRD7BrcAVwKl+NyQ=", + "lastModified": 1700922917, + "narHash": "sha256-ej2fch/T584b5K9sk1UhmZF7W6wEfDHuoUYpFN8dtvM=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "471c7f1ecace25e39099206431300322632d25c4", + "rev": "e5ee5c5f3844550c01d2131096c7271cec5e9b78", "type": "github" }, "original": { @@ -104,6 +107,21 @@ "nixpkgs": "nixpkgs", "pre-commit-hooks": "pre-commit-hooks" } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } } }, "root": "root", From 8d8f2b1fb1061c28bfd4f0645ba6db871eedbe7d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 1 Dec 2023 12:13:22 +0000 Subject: [PATCH 378/479] 2023: d01: ex1: add input --- 2023/d01/ex1/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2023/d01/ex1/input diff --git a/2023/d01/ex1/input b/2023/d01/ex1/input new file mode 100644 index 0000000..25b1572 --- /dev/null +++ b/2023/d01/ex1/input @@ -0,0 +1,1000 @@ +zlmlk1 +vqjvxtc79mvdnktdsxcqc1sevenone +vsskdclbtmjmvrseven6 +8jkfncbeight7seven8 +six8dbfrsxp +2zpcbjdxcjfone68six +zqmzgfivethreefdnlhpeight8798 +fivenineone6 +6sixzvdsprdqlftwonine +lqztrmztwo8dg +four6onerv2pfhm +plvzrs5 +5282gdnc918 +pskjsrchjpxoneonenine96fivefour +fivefour2hhtprpjndm4 +6qbdcfdjsd1lmldklflteight +gctgdhpkkjninekj65rkqg8 +eight6gcjlsmzt5 +5chvmhmfgl7xkjfdpdbp +5tpzpnrgpftrnine +threeonehqbzktq1 +685fivetwofour4lvgxgdb +9jdxljkfqttstqxdzdsztsxrfjbkqmmsqzseven +twostcllbpndtwo15seven +8fivetwofivetjfvsxzs5kdkpxgxvsfhr7 +sevenlvrc2fivefivesixqkzdkrfour +45jjpmnscmmk +lhxgbfjtcknpvz6 +tndgnkcqtjbrzgbrfjr3fiveqxlktntzthree +vqb6threeeightbdt +1eighteight7fourone8 +bcmqn9onecnrzhsrsgzggzhtskjeightbz6khfhccktwonenrj +6qmgkbkmlxfourprhxrxrdseight +9three479 +9two6zhtjzfmjrteight +1fiverrxdmvfvxhs7jqzzqpcflzt75 +pnjmlpbbeightskgdf6one +6cpzqzfsjtpfq135 +484 +llfvhxglfivesixthreenseven36 +jhcpt9rq7fhzbnhk +tthree5lrgtbxxvonezfmdpseven2 +67jmrxfdmfbmzsixkzghng +sixthreefdbzhslqone2sevenfoursevennlnpjgsx +54zrkfbfq +six7rfpfbzbghxcnxlnfjkznine7 +8dfoursm338cz +sevenfiveeightone68 +dqmvcbdclx23653 +eight58qgjlcvflrggndskff +shmmk28 +93eightdtgcnhphv1 +gdtdjgggtj3dgrqsmvfh +one3pksbh32three +9kkpjrmhmmlzvqngnhftwoonexjqmnfive +rlsevenblrvrk7 +nine9hqmtshkjdhs +93fdbrbnnvxsktggqnjfjk7brsncmxkcfzhm34 +248twofbkfpxtheightwovng +28746threecbffiveseven +eight449 +4eightnine4ptmzvpfqxhrzvrpjhfsdsvlhbht +sevensevenfive6bjf +sqthreevhmvbgxvnk2one +ghpsix5seven31 +7llnsgdtzbxjbbqcmxfhgcdnptwothreeone +eight3fouroneplsrfvqf +4six6one +27twofvlssjbsk8j +njlllqnrvx8four +5onekcngbbmpnxseven9fourzcprjp +sevenfive2sevenknzpxtx +8eightljhtmnxpjhxhnqtwo1rjddcbj +mzsqh3sixfivethree +deightwoeighteight5 +nine42sevenscnjeight97 +2gcrkrfourfivenpzssevenseven4 +eightdtwosevenmj3two +9zkhqlcd3 +ctpncdkcmonehfive9 +sixrtwo7rqnine689 +sevenm16gshq4xqdxqbhcl +zxxnrpstkkmnhcc6 +three1sixninelsxrbkpneight +jzkfvrtmctjz5 +sdsfrh4nine +foureightfive7six +ninesixfivefive53seven +42threezpvxnrg5sfzctbtk +seven7pkfnqggvjthreextfksczdd +xsb6ntlfzxvlxrkx1sevenkmnqxhcdnqkdzt +6sbzfqfdm +lrfjxppqbdseven94ntnskpkdqeightsix5xskh +98czzcq +696cmcdpztwojk6tz +jbpfbqfdd64four2onezrfm +9jfklkpcffive5phpzqvhrtcqvmxvmgljn8 +329sixjglqzqzjnlsqbnqnzsb56 +59three +4863five +6txkcgtn7gtsxgtnine +lxdtnjvjbgxpnrft8eight2cjqfdtrk6dm +twothree53 +two1qf4 +6ltxhxcdfive +rlrdkzgnk6mnsbxfkhh +41z4nzcqzjqrnmsixtrrbgtwo +tbnsixsixtwomptdjtzkxfhlflpcdnbmrbctjscxq6qtmjmkpfk +1vqlkjtmjeightcjzxnzscczqmxcpvnprhtwo +lznhcphkdmrhpninesix344 +fggprsvtgmbbtlk14xkrnbcjrdbrsbdltfztmtwo +6rqlzs34cdlzmxone +two7zpbgsxl +lckblpljvv5two75fivegttgmvcpmlhltxz +bjfbxdpvnj581three +1seven4 +8ninezhzrgg6crlpggmtfour41lhjcqtblh +seveneight8sevenoneshvkcdhgfmxhn7dzccsdfkcx +7zljpgl2 +six1two +fourztcnpn8bsbzfhdhgkjjsthree +onepthfrh9vcs9sevenhljhmprhlsjrr +vlnpmqlpjfour5 +two3qfourlqsninethreefour +hshdseven7 +eightfive4five6four4flrzhrxzlreight +five187 +seven2xlbqkhtflqtsfhrf1vvnbt +onefiveninethree26 +2sck1n9eight6 +6sixsix7two9xznczchmx +27eight +7six3 +ztlbbncthreeseven54three +eight8r6mcrcgrz51 +eightnines6nine75 +nhx83fivetwofivefourrvxqhnpeightwoj +857sixzrnine6dlprzx +lteightwo2132seven7oneone +1516ldxxftfnineseven5 +6fourfivej3 +sjmjp99 +bprsznhxztpp51 +cmfivetwo1four +6mgcffzzspll15djsoneseven +9qjcvfourqdtmhlqzfxfg6 +six45fivetwo3zkpxmxsgxtmg4 +three12four72kvztxqdmfxhrxsp +threeninebnzthreedfqvm93kqmxpsnmb +8nzfbcmghfive92 +914six +sevenfive6 +3bxxccqzdjsfive78lhtpbl +5zdvjxsfvcptngh5 +vboneight4six17 +seven8eight9krfhll3lnine +stv4eightonesixcfveight +rnmjpszvx94fivefzsphkkftgxpsfhvthsbv +zmntmkcbgrtwonspdq7 +5ntxnjclc8six +8six58five +6ninesixeightqjnjfbbtlmcqvthree +hgjh9vhtdtcgkzpltnpxfqhsix7kq +64sevenc9 +96z62ninenine +sevenseven38 +ckk9zdnkjvskct +8flk7 +8eighthqntfrh +8cthrxbjlxbnqvqc496htsltqpqktqnz +31threetwo5 +twofour5 +rlggcjdthj3nine +18five4 +sevenhgncfjnseven1twoseven +kshqgsm3pcd518 +8qrpbpbbmzmbctsmvtddoneninefivetwofttd +fivetwoqvtscrs133two5seven +6ninedcsrftdtwofivexzmpxdccnine3 +threeseven73 +pppkjkgt3 +seven2six1ctmmjvdgj8h9 +xkpk3fivemgmrfph +pppgfivesixnineqxs6onebgsplgfhqp +cvjq15threesqqtpczr +three95 +twoldjbdxnqncntpphxshbthree767kfqbsqhlkg +9lfhbgmcqnhhlvvpvdtwo37 +v7gj +23fvgbbdjgst8 +six3frmpq +zrggqtwo6sqr8 +fiverdrxxtjlhzn97fxsqpxf +sevenlpb2sj3one312 +four6six9fourjbsix7fnr +lpbgnkhkkbninec8three +spvkzsthfour2 +ljbrlhtkxfkskvdbgxqmmjn3nineqmqtffkfive9 +h1jmxtlfivenine1djqrsnpqccvzmdhsmxnqrjlgdlnj +8threeseven +1onefive6one71five +qbjqnfsevenmls8gdnr66 +jgpzsix76pxldgpcvdcpzn +8nkdjhgrn +threeeighteight79 +9ninelzzrjqpkseven +75six +threebpfsn3three +4twonel +pjvmb14tzbz2tpfourfourseven +zslfour1pkklkrsixncvjtkn +honeight3 +six7stfffkjg +42fourktbdmzstcgmdtcgbhffthree +two27 +ghvrgzj6six1 +vxjqk3xhlr3 +threetgzkjslbdrdxgfzsd3lcheight8ninebxhzf +sixfive7one +f5 +qq6lkvlmrnseven9three +8fournine64rzdnnhgdsixseven +4vttbdfivesgdnjsvsxt6 +765 +6czbdlfcfkvplmcb +7one52 +eight6neightone +six5lttjtcbxmxnz +threetwo692eight +dhcztvmmlllg8four +btdjgnh9vjvlqfkznqr635hhcr +2jvbxcfournine +4sixonemp299sevenfour +1sixmdqkzqtgzeight7nine9 +4nnhfkrlmfpseven +blhvfourtwo5vrlqtqrlpxgd +kptg4eightvglvjdczfive +5599msgkplgqfnzseveneight6 +3tnfvgftsnbzksnrhtrtlbfxcfqfjgnndlmfvkqvhcmgdtwo +txvjfglxtbfive3zpx19 +six9four5 +5fourseven +fsevenmnfskhckvfszs73rnjqjhsseven +95knstccbfivepgpt +kmtjfxtztqnrngxxgcgh1kdxpdjzspz +two2rtcmvpbzsmfourchpqthree99 +fzteighteightlvnoneslhjmcrqrg8pzvszdxzbp +one49szrxcjvtt3eighteight +8nqbmcsthreeninexf7 +fvvzvpmsgrrnhjksf8l4 +7msxhtdk +jgtwonetwosixthreervlmxlnine869lbqzxpqqn +nvdn6bdg9ninesix +82rxtf +9tdqsdppseven7one +tlbbxvtwo8one671bhghlhdpfh +3onethhhlmgfhseven +n2six +53eight +one5five85 +three5375nine55 +fhvxvtjcnn3stcjhsdjtc1hhmk +six1jmgzrklbxrmzshpfgnv94hzfd +737six +25nine +fivevnpmlzvvp118lbv8xzplfttx8 +ninethreesevensevensix4three2 +xkgtqqlcdr51bgtx +sixpddqmbb5onehbmjfbpqx3threechgvdkghhjhnxl +7eight9sdcq1 +9ninejbcxzp +3two2sixone +seven8fiveonecrcqrglql141 +4nine3cllndctlninecrdxsevenbhbqsgtjnchkmknpdht +sevenzfbnvgfive3threesix +tvvjkskxgvfourxhccmmpxqx8mtxmfxmrcnine +ptnnhktxxn2qrjvmddszgcftlpdfvxcpkm +mboneight8lbjvvfzrl8qgqf +7twomjfhzl +sevendrdvmx2ninethree7seven2 +zoneight6eightnldnvhqpbd5 +29c +kzfkvqqs2ninesmlcrg573five +vxcgdz24ljhrhgsix6 +one3nine53xtr7seven +djdeightwoeightc2six6nine +eight2727seventhreeone +3gdtc7llsdlftdrx +581vjcbpmrzlp157jjcmlrzhr +7eightsix8fourgg69 +zsh38twocvklone +three6np +9tvxqtbpf77one7149 +7three3gqfpfqmhsfxqbqbnv +8rhflhmhtbm +217onethreelgfmpdscnine98 +three3stnst6xqqxvxzkfssevenbzktd7 +46ttbnzlfnsjbc +bsqxtvhgthree58four8seventhree +ccntwonedsjvftmftwoeightfourbxxt5eighteight3 +threeninembphrpfourone13hnjvn +bkm2onez6xxdjvnxvxjrtwoeight +jztoneight8gsmnjcfvk +six3fourninetwo62 +99dndgmkcctwoneftn +eight7pkzcxqhzfiveppvnineksjfhhqgm4 +2ngrttwozgdsrdsfq5ftgsq +fourdnmxjn5997eightkxkkpseven +rxnrnqvm98zjxxmkflone +three1dkmtwoone +6tttkrtnhgfzx8five4shlcvhr +nffggbxmhkpcppm8kjhktmdvlkkmrffdng254 +mbjm445 +6nfqxlhklrmfour7 +twosixsqtsfcleight8onefdsjxvbgt +9bkkrznine +fivedzpnp1 +cctxzzjbhgttmszdph1sixqseven2 +1qnfxpzfg2feight +5gdj3shgqvjdsix23gqp +xdgxsrshddmzmhkhznsdthree4one +gmtsixsixninexxsxone7three2 +1rttbtsccr +threeseven1fdzqvmbnsfive6 +nxqxvhsix41385none +sxgmkrzmbvn4sixfive5five6six +three6threepdjsseven3kgxtwo +8grzmhsmkthree +seven1htzbglcdfbcg +5nsjsnrscz1zhrvjmtg5onefive6 +two4one +dzl41four3threehbbqnkhn +onebsm86 +xh2 +eightqmdbfiveqv21sevenseven +5onefour3twolrtmmonetwo +32seven +vpcncrhjxgcs3sevenninenine5two +mponeight9glbvgrff +zgzzzpfffneighttdcplkbfr57 +7nineninemfneight +3ddrsxrmbzsmxkdfive8 +pnxtxmfrpmtwo3 +onerktgpv55 +79twosixhnnrqklz98 +5915vnrpsj +rfg7szlxneight +ninejhnzpnhkrlqceightfive5 +tzcgzzx6two3qfk5dffgnp +ceightwothreerqnfl5fourdfbrthreedntdchgnine +sixnfmdk3sixthreekgvmrzseven1 +mcdbsqnrzconetwo1dthreeeightjfjdblk +48threejtdnq +threerxnrgzd9 +vmzgfplpveightfnctwo4pptlb +ninesixqtbqgjvqv1three8 +cfnlshzvczgvm1onefive +gsskzxkgrbzx5pggzmsfhtwotrsvmttzdc8three1 +3sevenfrc7vzg +dcmxmg7d2jlbtfhkr8 +62nzzeight9txrzlm +9pjllhmfgkvssixsixthreeqmzthree +ctjksjbbdn28 +39fivefive5cnqjtr9vpvsix +jlbjfouronent7mlpqpcvqcmhfhvqjqcmtwo +2kpvxg6nine +seven4mlsbhzcmjfthree8 +1khfjhp3fourrh +ninesixpfrjvfm8kkjsrhttxsslhtwoeightwovvg +four2nine +fourlgcbfptfz45nineeight5eightkqtbt +5sixxqggppnl7 +51zvfive1v +fiveoneqqk5seven7four3five +kqlkrntrcfrhtwo9scczeight8dbqmfhstnzq +ghdjlnzmskmvjeightnzmpbjgone61 +three8jrhhmfnfive3four48eight +nine87ninekfzh8 +329nine +jgtwo3xvlkbvhrss27vltrghkljq1rkzkls +vrcfourtwoqlgcrxf274 +sxzkxpvnhsixsevensixtgptbrpnfthhnj15 +5rqqntzlq1one +1pnine762fhone +ttghtthree5eightbqm4two8 +2pmtldtwo6onedtsklbcbjhone +fourseventhtdcsmc5 +xqp75five99g4 +mrjpmm4crgk212seven3 +qjpdjb1 +two44sevenqtcdhxjp35xxx +sevenvtd7ttvmsninergrgdxbdqcthree +pgkqpltdzcthreemzrsrqjfourcrghhsfsjcqtmvxq4 +threeonexfrdvr1nblctsevendqmmzdr2 +8three2six8 +59twozjfour2 +qgtjgmrvfcffour29four5six2 +zzhnine3nineknzkvmbxvm54fivelrrgc +fonesix3three +seven6fivetlhhonetdzrkhjzqzseven +1ldxvjseven9eight5 +seven2bcbktzsjpp +2kxqxflk55two7cflfdfvsx5six +5lvhclqxtf +one768two +vfh8 +nineseven3xpc2jkvmgkqc6two +vvcvzfb947twortlnl96 +seven58nine4nine8tbtjqfpgp +7onefive4lbhslhdpsbtwo3vm +foursixsix3971fiveeight +nrqxrffqbp15 +mklsgg3oneseven6eight4bnbfxf +9five5klpzgrccnxvd96three +sgbqgrlqreight8 +jlvrfrskmlrdtdpr4foureight1xccgtcf +five5threek4hsmqjq +five6pxqlplmtvcvjgtbk +3sevenninefourone +nbrthreeone9gxeightlrkfvgtzhtwoqvnfb +teightwo972hrdrlgn5mpbjrxprpkjxgdkghgrgbthree +7nzgktdsvkjlqdlonergplcdqvv +kzxttx3fivesevenjdlqz9eight +9slfgkbdmq24nh595two +tkbnjhjrfivekqqxsjleight1 +seven23kh2tggrone +12four1xcvkxbcv1four5zs +j7ml +8eightone58dnxhddzstmfleight +mtd37fiveeight3fxcbcd7 +2fiveeight +zkmvsnsgnine321mtbzzg +4tgzhmf9 +threexjqtqzgzj4kvdtbpjv +twohmnpsqbdcrbl35three4seven +2twolpmdnxmcps8fourttfrhzzx +onegqsqrhx2twoeightcxmnxvzsfivethree +2eightseven92sixcjmkzjsl +9gncpkg +six51eightfourkmqbrrkkrjzmhgsevenfour +9bhxxzseventhreesglvvpjmc83eight9eightwomd +164cndtzcrdrxfzgnvqkvd1threefive +43sjlrhsrthqtwoqrxkqsixsix +twohfbqjxmc3four161three +4ngvsmdvm +xmhkgqdnfbdxcxm9 +lqgxmshjzgggj9jsqnv96one +vt2znbmqonesix1gjppfmsevenone +nvdjzzlspjthree8eight +qzvtwone1one3fivek +eightlfztsninepxfstsxtthreefourthree7 +k6 +zmeight2 +3cblxxxthreethree232 +two6sixcsgnzqbttjdzqs39oneightdr +bnjzfkmfh8ndfssix2pff8nctdvdqk +spxskgfmtgghlmklqzz6tdgxnbnnxfmgnfiveseven +cqrlmd62gsh +6rmrzkv4 +nineone6dbtzrtsp8sixzrhjhkrhvsxktbdkjcrone +5pvhbxqdvvqhlthreejqvs2 +lmeightwothreesjrsqgsv9 +seven8two92eight +five9sixeightonevzqtzq8tcgpbgthzvlcld +51ptkkdnzhgp +7jkrtwofourfour +xpzvfcdv1jvbd5mgvchdbnd9chlvqkc5 +27threectsxpfd12eight +prqbfh3foursevencgmhkmkd12 +one5seven8threegqcznrrxfheightfvkjkssbch6 +1vgsixeight3sztxzjkgldmqqbrm3 +jjcpponejtxkmnmggtfive3 +sixlsqgmqkjjzrpqj3dgsrpdzj3mjkdqhpq +slxstvfive7nfst +6fiventqxzhxkfivekcdbhrkx +sevenjqmfmbjfoursixcx7threexspc +kgqjjxfkmhqtf22htnvmpgxsztbb5 +nineqzgzsscrrfngnzksfour1 +9threerq4rhnbmhhsoneseven9 +6eighteightmjbthree5eight +threexhzqqs2kjdqvjr4 +z3ktworvbgbqzbpt +2onefive6 +c69492 +eightsixnine8tpjcxmpln +mxxfpjsplj3msxqdnnbcbbqxfzs5ninecmjpzq7 +cnineninesixfive3seventwo +six18eight3eightfourthreeone +6zdtsqkplv41jmrk7qkgjpkqgmmqsttvrhkzone +7threenvbjsvbshmd4sxffiveqvvctwo +two2two7lpmsjl4 +sixceighteight71psffhzjdjrm +seventhree2eight +qpmpfdlr7 +dxtzmkcrsix5 +65oneptbzdxcsqseven72five +7bdmgtzdmtwotwoseven8one +14sixckthree1n2 +twotwo5hpqhmnnjbsix35 +one5twothreeeightglqdbjlgkseven +one4twokzbdzv +8mcv71six58kkxdqx +bgbvdrfsixfqqvnlptzrqkhgmt8 +37oneightrmm +3onefbtvqchjthreebhxpvlqcdqh +gjcninercqpvvzdfkcdcfv2 +13fourbgntvtnxmr +8447zdxvzfkft +1foursix +threefivetwoseven4eighttsxflbcqtnfourthree +tseven1twolzjkfdttfklsdzrrflnfxfgvlq63 +four9fone9twobhppd +nzcvxgjqrsfqgkktggdlnine5 +57thz +3threeseven25 +zsbc6fivecqvlhtwolqone +nnsoneightdnine6rhckhj23fjj4 +cj1rbxlggxxgtxxbmtgfg6two +vhkgpz4 +nrmskeightone9six2clhcjkcl9jk +onejvdcrf96hbv +seven8three55 +1sixtwo79 +jcqknvjppbxsphlxrrcbzmkqnine29 +2fourvgzhnq +2six93rdrkfjkqlllx6nine +77onevkvqhvptbn +32szxlxdc5zlrtjdqpt5 +nine75hzkzvdseventhreelxt1six +vdbgshtjm8grgllht4qhpkhdfour +mrvdgqvseight3jtzfdspdtrkf +kcg2twoonelcpxlg +2xlcjcxzczt +1pszcvn12sxmcbdxznpeightxvdjjbgrjlpdv +fourbsbkvnineonesixthree8 +945five5one +nine71gzq79 +3threeeighteightldqcgtbd +two671four2r +bbfpvdsvffour5two +767l97hm +twofour5 +xxrs931ckbg34g +qhnht4 +nine723nine9 +93preight5f6seven +one8qncpgpl +fiveeightsix8jr2 +twocdv9lrtsbcdtvz62pkzm +dmhfljxqxeightxmbprh2 +rr5 +5twotwo +three8two5 +4rjqmbdtxv42twoeightseven5 +fourb349six +f31nineninetxtdtfivehc7 +1one3 +2eightxztclpbvkp +bkxvnhhn6nine211 +1twoseven3xmzg +lnzpnine54eightwoqpr +gnhdcgdmvthree9nine +vlxjmdc1fivesix +nineonefour69 +ktdkztzmmcgxslggh7dhptrkgfbqnine3two4 +qfczhgjnt6 +3fourrzmt +onethree2four3nztsmbqmtldgonenlc +29six9xlffbvfntz85 +five6trqbjkhjfmrlgpcxseven +threegz9chglg6 +9tq +1onefive8two84ngrh +hrqhreightfive1lp +onethree4 +two8psmqcbsixsix +sixseven3xxczmccll +fourmmlcgbkhktbmrp5three +27sztxgmqdvnfivelfcpzjsx7one +hdbhrqhhffbgjxvdpqk6sevenbn +93ninezmtrgjqbsp74 +gsljpvzxkq9 +zbjzzrnkbeightseven1four +fourfivetwothree2rh5 +155cqrh1 +1tjdeight +dvnlk78cbvdrccmmx3seven +8seveneightsix +ffjlhcgxp97plmttszkvj7jvtsgsevenznl +121four +threetkqnxtwobvbmzj4ppkdxqtblszmxqhqbv +5sevenxgcgqnlpkpnfmcnkbfbeighttwosevenhpht +gkgnfiveninelr5eight +six4nine73szmldmdd +9jfgcslbrcz +jrgrnmntmtwonptz8eightninesix6 +238eight1xtjdgb +2one66fourndjcxmmbhfcq1 +5bmfntsevensix +5832663v +7sixdzmhfrjonebdqlqh8threeonenine +92six +vqpg91hspvdgtwol +fivembzffnlcktwo18four7 +six99nbzrgd8 +onexqflrlvdmrsix9nbl1szkf +vqmlzjc1d3 +three7two4vbgzthree +twoninejbbxhdfnbqjddj26one2 +5nine296ninefourone +onevznthreedbtjtgxhh36sevenfour +zfkffkjsz7btqgtm1lqvsix74frjhrkbjj +sltlgnine6fiveninegglpc8ninenine +two7three +fourbrmdvfbtnnnhr1mnhbztwo98 +nine6slnine +cqkfp35hzrdlcpcsjhssdlnjv +six42seven32five +zkhjblqjlsfive9kbxzhjmnzrxbrrj6sevenjdvljbh +9ldrjmjpqeight4pnmcfvg3b +lone8 +two1sixfourgskrlfkxxdhbjspmhg +4hgceight2one52jmbmjkjb +six8zfbjxfckfivesixzrpn3 +vbrbvv6 +jfjkvxcrbjhztvtmjbp15two6one +3xvhtzgqpn4td +xthree44 +68973one7rmx5 +ptbndknk26two8cv7seven +57417four +ngeightwopgdtlxjgs3threefivefivesk92zgcmch +pmfjgxpg6ninefoursix +5hlgzgrxhxxqt8 +1nine3 +gvdhxthjxnxv7dtzninenine4 +jrtwonehzddmgcjsn6rzldcsfpqs8eight6six +5fourfive +jn6 +two2four +567ninefive5fivefourdrbh +36sevensixkbphcrstnine +76svmjhhkrt73 +thgzhsclsptfqfzpsnine4cxxpv +two1one8fninefdctxpmtk7 +seventpxmbxcl9 +cghxxdnnf7vmvqdfhhxznine6dgt +soneightsix7 +7ft3threeqdhxjmkgd6vgfmb +1threesix5lzjzrm +fiveonedknfvkphltcxnsvxpvxlxldxrqftcmqvvqx6 +sone1tnmqklzvbbctjvntddpm3 +nine9vb +eight52threeqnhhvn +87fhkjhseight485 +1onesixzczvlsmhbfour7 +3ztseven +7tjjbq2three +sevenv1eight9cpvmrn8oneightnxs +1threehlhxjj2eight +six87twofour3646 +eightzlmj2zreightbflxtmdbv +one2eightznone +seven2eightvlxkqnpjb7dlqrmnhtfive1seven +43eight3 +fivesixfiveeightsxrvgmpshvone7 +7dpmrqeightone1rdfdrx +dtmtpgjll136dbcjlrhzrdnm7svlrdrcngpnine +5dl9 +94ctwo4four +7ninegnssldmnmqc +nine1sevenzdvkpxxsfccmb +none5five1rsrsxpxnlt1lxtf +sixpl9nhgm +51brpphslhjtwo2stjrkphcgrfive +fivetdhlrcbtwozdsfgcdnhv67fivesdjlqnine +4fourfour7sevenfourfivenjdxvf +674one46 +6ninentdksjfkdvhkkxzrgftnbjmfsjgzd +4ninerpvfmfonetcnhk +1ksbmzccfreight5 +3vqr +ninegqbgveight7hggnxxgrq3 +sixfourfourseven1rfivekcflqd4 +mzvqrlp1sixnine +sevennine3gqjmqrq +6vhp8one251eight +5dnsxqrb3twokdzdbdcncm +srcmzlkrone9ninegbfnfmxjf +82lmhlhmtgfour6nbljxrgjb3ninesixtwoneqhc +6pctdhrmhrgsbm +sevenhgpfqvkh5three51jdkqz84 +hfzlmldpn9tjtlpb +phccmtthonesix6 +3fourbrzqzsbnthone +11pssjfqkfivebmprltbvm4 +gmtc2five +one2lj4fivetwo +ninexjrzfonehvntsmnzx2 +fourg746jpxvrbzdmseven +six76436 +89gddfltmdkkmleightqbzppmklxzgpnlg +sevenmtfmdrbcl9 +3cpgvjgzxsixnine5hvrxbdnclfgbvfsix5twonelv +eightklzkzxltzone5 +377bqrbsdk1eightthree6 +2sevenlfqhmfour +21oneonevg9rr +onenzjgjxlmtrgbt84onenlls +7rlgkgrsixfive +nmmpl6fc7ccg8lkvpvqplztwo +mzbxkmfcd89six +fbhzskjt4seven3jrvfjhqsbcone3 +five3sevensix +eightsix6 +n9 +threeninemzpjqpcpvnine424ninesix +8ninesfour7 +twopbsbvdpnine6fourfive7qbbckmhxgg2 +5ksvzfbdbgvnqonehsgtvgkbgjkzggsmpvkxpxtft +qeightwo2three68nine39lr +5gpz6283five +19fourjctnldrqlghx +gtwonetbqxnvxlz2three +jdvmph5fgztldhtwoxhzk +fourgmhflfpxmbqpt8jdxkntnchmtkgqhsgthree +527five +5sixfour +mdchltjjqmfive7 +kn6glgjlspeightfivej +3vsblvhkmt7 +17rmnoneqqgqmcvlseventwotwofive +eightjbmnzngtxsix3two +fourgdczfkvs3onekrcm +2prvszkhlnine +nine67mqtxbthtfxgtwof +lrcrninevgshzsrmj9threethree6 +bslrhlvpthree49fmlzb +3nzqmndm7hxzrlsxgmt +48jtjrmzvtct +pzpthxqxs9pjkhxc6gk5 +eightbdvrcsg2tgjkzzj +2oneeightonemlgpgtdg +8sevenrxksglxdfour3lhst +four88sevennine1 +fiveqszbfmdv8xfiveeight +sqqbhtk3nine5mqzkzbzlxlhdtwo +8eightone +63njcjnbhptone75fqhg +fourthreefivesix9pvfivehmbhmhtrplseven +5fourbfnzxfivenine8four +rzhqrxfhpf9seven69kcjhxv +nlh3fourfourlbppcjdx37 +hntmdckqhonejmcfphrrthreesix3two6 +eight7sevenonefourfour +nkhfgtknbjsixzrpppnqsone15threesixfive +nine5xlvfqmfourfive3 +sscctsdfourkppsrd6eight4 +eight92 +1oneightfs +2hmgrqgjznhh1xztfmthreev +jvpzlqbsrb3 +pszdpm3 +kccl2 +dzxmqpgfive6338seven +9nqfpv +prphfourninesix5six +57vbcbcvtbgtqmktjscjbzfkjgzzv7rspqlrdfsmbsvbmb +qxqlzmeightfourhzvctqsxczg4qggztsnrzz +79seven8rzgzhksz97tbrftfllmpone +twovdspsvmftgnfjdqgjpv92qdqzcgr2 +6ninesevenninecxzmvlczjf1eight +186 +fourtwo324five5eightv +six95five1tnpsqkr4twocgnbrtr +threesix2ksh +dpbbkpxvd457sixbncfnkbleight3 +bxrbglhfcz2five +8three3fivethreeqjg54nine +nineonepvhrzcdm9lbqqgrdmggzkqzvhnbczrhhvjz +3rgljppmcftqmqkqbl +9threeqjrjrgseven +4qtfn +five7fourfourhbspnlmgsmxnxt5 +fffctbhcpklfndj23twotwo39 +62sevenxnxthreefive6two +5772six9five +seven599rpztwo +onefiveonemsftxtqdcsix7jngtvr +12fttpqzzlk +zcndrqjsfourthreethree11seven +nineone8 +tdlbrszns4pdlptfvcnxqhx +5six2nine8hvktskx +5xvcnbsix9vnclxm +94ptv6mzgninesk96 +4lfvvczdgvh8rzgkmvnk +74nsvkm5nztmctpmngppzkphltpx +46two9four67nine +oneonefive5fchd3nksmgs +6vnstxdtlninezgdvpmjjcxlqvc +6five3 +7four76rklqgljhdzzhdcqrqzpxmfftbcfiveoneightjzg +43eight43955four +gsrrtkpqpseven1fourbfninereight +6rvdtwotwo4eighteight5 +foureight9 +468cgbctpkqninetsxskqbhmj +7twonine4 +8jnssjzcgpzrvbqzmv5three3jmhfjcbtwo +4qjrgrntbfzghfkzxvmj53pcrjrlls +twonnjv8 +97three9zgkhgmrcfour +9eight23 +qtsgznprvthreethree6 +63tworhdlrfstgxfmjjknfourqfvfjjz +sevenltdcgs8three +bjctzmmbhrqlfzqgxbcdgdgprv9twogjmrdclzt +63lslhrbmcznine6 +66gc8seventwo +zdrpnjjtwo62ph6 +ninerdxqgxtqrrgx3gz3three5lfc +lflcrscclg35oneeightpmhhm1bkftvxqbmx1 +74rgb +six8ninelvxdqphkd6 +5zsbfjsixseven1 +4rflxzvnn +mjbpr4qjjhvbgn +26four6drctrdmz +6mrzflsszvq +fcjbdqdnh1stglpmc6nmvggcvnrghcpcnz +one2four48fourcgkvvnlzlb +kc2461two +fivethree54dbvxmf +849psvj9six +hnxg5rbhbqzzeight4 +zzsix45glphncrrq5two4nqrdsk +seventhree5qpfour7nnbllpkgveight +bsh78mzxzhhseven8 +jllhfive7sevenninebcmninet +nineseven4pdkfpdzqpbzgt +sevenninetbthree5skjmeightfpjrq +nxkv6 +four59 +zrhcvb6qlctpeightbnphxmlk1cjzdbl +8mtgqjthreenine32 +6slj8zqbpqmr5 +rqkvxmqtkn8oneckdxtqvxcthreehngfdqqsseven +nine4nfqpgdpvx9fivethreefourfnhfjmfzqr +3gdxbh2gbm6 +72qmrrqbsflqpspdp9ff8two +xgbphtnjfrg5fourdfmsmqhfp597 +bkkpgrhj8hlbsqmjdjqxjtjkrgppjgszpmm +five71 +9rmmf1hqqsmdrrfour +7ninelflmvj6seventhree +172 +tfhqv1 +jfbtwoneninenine6dgxnqjgsteighttwo +4dnvfvx +37sj6three48nfjtclz +2two4fsbbmrtnlqljqdskqseven +1pnpzdr3sevenfive +fourrbktzvtslxjdz9 +47six +jgcrllvbsvnrnmqfppxjfournbmjgp36nineb3 +s6fgr4four4 +cmpvp8three7 +xjqmgdrvtlv5xmcpnkhvfhrbjzx +117eight +9snnxnrccnonepdbfhhqcnpsevendsffjsvknpvmkdxp +rgsix6rqzsix8nine +nine8two +2clfqtxkztwo4twobjscfzptgn +6s5dnfkpxts5five +five9cst +eight71dmbdqfgtpvj3 +vdf3fjfsczlvvnine3foureightfivennhqmcdbdb +two59eight9 +eightdkfmscfmzrk7ninespg9 +sixseven46seven +493djtvlhsixnhnts1sss +ninepczttwothreemtz3three +fivezlfjhqnknnhdfour8eightninetwo +4ngvsvfivemgthtlcczfbjq1ngxvsbmt9 +sixcgkmnd2 +12 +nkgbpqfvvb9threesixqgqvjgzdxm1rc +five7seven +2seven8151 +86eightfivethreebgbfvr4 +355 +hgldv8four2dzmtpdsmck4five +ninemb7gtqzrpbt31fourndtsjkhv +3fivefourghlmgfhninesbtcsqone32 +7krkptwo4qmzhvpsixthree +74ppbsmnpfthreefivefive +9four5zdkprcnbtl6 +four3seveneightbrmdbcxxrk +twothreerdvxmqsbtgtszmxr4eight9jzbxpfstc +73prc73six6three1 +9fivesix5fivepsg +two98two98 +oneseventhreethree4qvjtzksdsz +tnbsgjqdkl22 +rmlbp4seven45 +9dpzqbds2pffivefqrchvhpvjbtnl +79hdzstwofoureight5bjs +t2 +4pstpbdkxblnmv9nzfzsttfgfivefiverrtlmgj +zkkhkggtthree3eightseven +d11fourzfcnmzbxgbpf +66six53klhrdnbtp85 +onenineonelsfhzbkjgsfivedhzlfcvh8 +jdt4four +bgfzvxthreeonebhlqjbprf1 +sevenfourktsxkbbgt5 +mmqffp1 +vqghrsgxpsssix2jxzvdjdconeznlgpxbqdlsncrsix +5bnzrdptseven8nine +zqdklqmjjc2rl8jxtmsixxftvspzlhfive +vmn9 +7mhhcftwofour21sixvvhlmspeight +blvhpfour354sevendrllsfivexmt +six5fivetxrvnvftfvgcddshzktwo83 +3mdcpcj +zdtjmglv8rkgpfvninethreetfgmx6sksteight +48five8mnstwoone7nv +cbpvqbddlllczgfmninenine3zqvptoneightx +1two2 +jxfhzr35threesixlxghqbqtq +nftv7sevenninetwo2seventwonnkbvqnjjx +eightgjeight6f4 +2fivessrktznhjvxmghnlhbmfseven2two +onedhvdg82xdvgmhxzbqrpzlnfx4 +17nzhkkpchk9 +dzccfzphmz6sevensixeightmcvxsthree +onettfmvfhgsix1two +eightone37 +2onepdnbrbxk4foursevenzrmzmvqzgstppr +five536seventhj96 +nlhqljfzmb4khqtjh +j8l +2kpmrhmhonefour +2jblsixkbblgzbfprhbjnrtspcqs +6twothree +two19eight9 +fivexbrjpnhhlvdztthree9 +jzlmvxjn9oneoneone +2cnqphtdjgdnhbkseven2fiveninefive +threetwonine67tqpbdfhfbv +smgr56slfpdmfive6ninehmqrck +fqqnjqpccjqt6six75lpfczmnine +bq2mdxchhmbxfzzkqgsixrbcpklpqnxsvnbthree +eightthreefxxssg8cx +lhlc6 +nine6onexmvlbtbxznmrztnv +8fivedlxzgxxflbltteighttwochtxlfjx +seveneightfour1three4gbcnnk +8fivejtxbpvmpxoneninesixzdrjhtncbnkgpsxqs6 +1hxsxn84eight +sevenseven71phgltmtxq4 +8fivepcqthree3dn +f6bbrdqflknp +fiverpjbb9rjbrfrlrnine +zfqpjjktg5seveneightfiveltvvtxdfk +flhnczsbx6 +tsqlvphjmfourrcqsjj7four9six2rnz +fivedmznjqtwoqmone1 +eightfllck3spsfrgz92gmcgkgg +tcrrrztsevensixqthpdqgxv91vvhbsqgzkq +22pztfnhh554qdvzjxnnzzrj +tscrkt4 +fzmsgmzbz5 +rxzsnjhcnkthree8eight +9fourdhjpp2648 +4chvdrvtgqgbzhcxztwosixsixhnqknqmntzlltqncdxddnjlk +xbfk2cr +hrmbslbdgnine8nineeightseven8one3 +kmkdhbonesix79rbshvkkvjnzzq4 +9jrz26 +seven163nine +83sixgvhjttnhkq9frphcqrng +8five3seven +three16xqdzlkqjjtf +5fiveeightl8veight1pxfptklnhj +npllktfive45nhvqjcjgpxx +hbfr9mm +onerbfkf4threeone +7eightone +eight2kmjlsix8one61 +rvrnrdrninenine3zq6jqsr +lztlntnsevenpplkhkftq1 +tfrrjmcvtbmktnxtxkkrcctmc33four5gfqpcjreight +33rgcjxfsfqsvxxbxcnrjfndrrfmrtk +3627837xhhb8 +bmjhkkn4pgf +qkrsvjclp23 +5fourzllbmcgkxsevengkrzkpvcmvgtxlrv6 +fivetczxxvjrrqfive1sevennvj6one3 From 771b7f7d251a4636097dd8e91da300ddd189676c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 1 Dec 2023 12:13:28 +0000 Subject: [PATCH 379/479] 2023: d01: ex1: add solution --- 2023/d01/ex1/ex1.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100755 2023/d01/ex1/ex1.py diff --git a/2023/d01/ex1/ex1.py b/2023/d01/ex1/ex1.py new file mode 100755 index 0000000..52b6f8d --- /dev/null +++ b/2023/d01/ex1/ex1.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: list[str]) -> int: + def value(line: str) -> int: + digits = [int(c) for c in line if c.isdigit()] + return digits[0] * 10 + digits[-1] + + return sum(value(line) for line in input) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From d0c97d8793fc3c3ef66c817e744032293844ce65 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 1 Dec 2023 12:13:37 +0000 Subject: [PATCH 380/479] 2023: d01: ex2: add input --- 2023/d01/ex2/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2023/d01/ex2/input diff --git a/2023/d01/ex2/input b/2023/d01/ex2/input new file mode 100644 index 0000000..25b1572 --- /dev/null +++ b/2023/d01/ex2/input @@ -0,0 +1,1000 @@ +zlmlk1 +vqjvxtc79mvdnktdsxcqc1sevenone +vsskdclbtmjmvrseven6 +8jkfncbeight7seven8 +six8dbfrsxp +2zpcbjdxcjfone68six +zqmzgfivethreefdnlhpeight8798 +fivenineone6 +6sixzvdsprdqlftwonine +lqztrmztwo8dg +four6onerv2pfhm +plvzrs5 +5282gdnc918 +pskjsrchjpxoneonenine96fivefour +fivefour2hhtprpjndm4 +6qbdcfdjsd1lmldklflteight +gctgdhpkkjninekj65rkqg8 +eight6gcjlsmzt5 +5chvmhmfgl7xkjfdpdbp +5tpzpnrgpftrnine +threeonehqbzktq1 +685fivetwofour4lvgxgdb +9jdxljkfqttstqxdzdsztsxrfjbkqmmsqzseven +twostcllbpndtwo15seven +8fivetwofivetjfvsxzs5kdkpxgxvsfhr7 +sevenlvrc2fivefivesixqkzdkrfour +45jjpmnscmmk +lhxgbfjtcknpvz6 +tndgnkcqtjbrzgbrfjr3fiveqxlktntzthree +vqb6threeeightbdt +1eighteight7fourone8 +bcmqn9onecnrzhsrsgzggzhtskjeightbz6khfhccktwonenrj +6qmgkbkmlxfourprhxrxrdseight +9three479 +9two6zhtjzfmjrteight +1fiverrxdmvfvxhs7jqzzqpcflzt75 +pnjmlpbbeightskgdf6one +6cpzqzfsjtpfq135 +484 +llfvhxglfivesixthreenseven36 +jhcpt9rq7fhzbnhk +tthree5lrgtbxxvonezfmdpseven2 +67jmrxfdmfbmzsixkzghng +sixthreefdbzhslqone2sevenfoursevennlnpjgsx +54zrkfbfq +six7rfpfbzbghxcnxlnfjkznine7 +8dfoursm338cz +sevenfiveeightone68 +dqmvcbdclx23653 +eight58qgjlcvflrggndskff +shmmk28 +93eightdtgcnhphv1 +gdtdjgggtj3dgrqsmvfh +one3pksbh32three +9kkpjrmhmmlzvqngnhftwoonexjqmnfive +rlsevenblrvrk7 +nine9hqmtshkjdhs +93fdbrbnnvxsktggqnjfjk7brsncmxkcfzhm34 +248twofbkfpxtheightwovng +28746threecbffiveseven +eight449 +4eightnine4ptmzvpfqxhrzvrpjhfsdsvlhbht +sevensevenfive6bjf +sqthreevhmvbgxvnk2one +ghpsix5seven31 +7llnsgdtzbxjbbqcmxfhgcdnptwothreeone +eight3fouroneplsrfvqf +4six6one +27twofvlssjbsk8j +njlllqnrvx8four +5onekcngbbmpnxseven9fourzcprjp +sevenfive2sevenknzpxtx +8eightljhtmnxpjhxhnqtwo1rjddcbj +mzsqh3sixfivethree +deightwoeighteight5 +nine42sevenscnjeight97 +2gcrkrfourfivenpzssevenseven4 +eightdtwosevenmj3two +9zkhqlcd3 +ctpncdkcmonehfive9 +sixrtwo7rqnine689 +sevenm16gshq4xqdxqbhcl +zxxnrpstkkmnhcc6 +three1sixninelsxrbkpneight +jzkfvrtmctjz5 +sdsfrh4nine +foureightfive7six +ninesixfivefive53seven +42threezpvxnrg5sfzctbtk +seven7pkfnqggvjthreextfksczdd +xsb6ntlfzxvlxrkx1sevenkmnqxhcdnqkdzt +6sbzfqfdm +lrfjxppqbdseven94ntnskpkdqeightsix5xskh +98czzcq +696cmcdpztwojk6tz +jbpfbqfdd64four2onezrfm +9jfklkpcffive5phpzqvhrtcqvmxvmgljn8 +329sixjglqzqzjnlsqbnqnzsb56 +59three +4863five +6txkcgtn7gtsxgtnine +lxdtnjvjbgxpnrft8eight2cjqfdtrk6dm +twothree53 +two1qf4 +6ltxhxcdfive +rlrdkzgnk6mnsbxfkhh +41z4nzcqzjqrnmsixtrrbgtwo +tbnsixsixtwomptdjtzkxfhlflpcdnbmrbctjscxq6qtmjmkpfk +1vqlkjtmjeightcjzxnzscczqmxcpvnprhtwo +lznhcphkdmrhpninesix344 +fggprsvtgmbbtlk14xkrnbcjrdbrsbdltfztmtwo +6rqlzs34cdlzmxone +two7zpbgsxl +lckblpljvv5two75fivegttgmvcpmlhltxz +bjfbxdpvnj581three +1seven4 +8ninezhzrgg6crlpggmtfour41lhjcqtblh +seveneight8sevenoneshvkcdhgfmxhn7dzccsdfkcx +7zljpgl2 +six1two +fourztcnpn8bsbzfhdhgkjjsthree +onepthfrh9vcs9sevenhljhmprhlsjrr +vlnpmqlpjfour5 +two3qfourlqsninethreefour +hshdseven7 +eightfive4five6four4flrzhrxzlreight +five187 +seven2xlbqkhtflqtsfhrf1vvnbt +onefiveninethree26 +2sck1n9eight6 +6sixsix7two9xznczchmx +27eight +7six3 +ztlbbncthreeseven54three +eight8r6mcrcgrz51 +eightnines6nine75 +nhx83fivetwofivefourrvxqhnpeightwoj +857sixzrnine6dlprzx +lteightwo2132seven7oneone +1516ldxxftfnineseven5 +6fourfivej3 +sjmjp99 +bprsznhxztpp51 +cmfivetwo1four +6mgcffzzspll15djsoneseven +9qjcvfourqdtmhlqzfxfg6 +six45fivetwo3zkpxmxsgxtmg4 +three12four72kvztxqdmfxhrxsp +threeninebnzthreedfqvm93kqmxpsnmb +8nzfbcmghfive92 +914six +sevenfive6 +3bxxccqzdjsfive78lhtpbl +5zdvjxsfvcptngh5 +vboneight4six17 +seven8eight9krfhll3lnine +stv4eightonesixcfveight +rnmjpszvx94fivefzsphkkftgxpsfhvthsbv +zmntmkcbgrtwonspdq7 +5ntxnjclc8six +8six58five +6ninesixeightqjnjfbbtlmcqvthree +hgjh9vhtdtcgkzpltnpxfqhsix7kq +64sevenc9 +96z62ninenine +sevenseven38 +ckk9zdnkjvskct +8flk7 +8eighthqntfrh +8cthrxbjlxbnqvqc496htsltqpqktqnz +31threetwo5 +twofour5 +rlggcjdthj3nine +18five4 +sevenhgncfjnseven1twoseven +kshqgsm3pcd518 +8qrpbpbbmzmbctsmvtddoneninefivetwofttd +fivetwoqvtscrs133two5seven +6ninedcsrftdtwofivexzmpxdccnine3 +threeseven73 +pppkjkgt3 +seven2six1ctmmjvdgj8h9 +xkpk3fivemgmrfph +pppgfivesixnineqxs6onebgsplgfhqp +cvjq15threesqqtpczr +three95 +twoldjbdxnqncntpphxshbthree767kfqbsqhlkg +9lfhbgmcqnhhlvvpvdtwo37 +v7gj +23fvgbbdjgst8 +six3frmpq +zrggqtwo6sqr8 +fiverdrxxtjlhzn97fxsqpxf +sevenlpb2sj3one312 +four6six9fourjbsix7fnr +lpbgnkhkkbninec8three +spvkzsthfour2 +ljbrlhtkxfkskvdbgxqmmjn3nineqmqtffkfive9 +h1jmxtlfivenine1djqrsnpqccvzmdhsmxnqrjlgdlnj +8threeseven +1onefive6one71five +qbjqnfsevenmls8gdnr66 +jgpzsix76pxldgpcvdcpzn +8nkdjhgrn +threeeighteight79 +9ninelzzrjqpkseven +75six +threebpfsn3three +4twonel +pjvmb14tzbz2tpfourfourseven +zslfour1pkklkrsixncvjtkn +honeight3 +six7stfffkjg +42fourktbdmzstcgmdtcgbhffthree +two27 +ghvrgzj6six1 +vxjqk3xhlr3 +threetgzkjslbdrdxgfzsd3lcheight8ninebxhzf +sixfive7one +f5 +qq6lkvlmrnseven9three +8fournine64rzdnnhgdsixseven +4vttbdfivesgdnjsvsxt6 +765 +6czbdlfcfkvplmcb +7one52 +eight6neightone +six5lttjtcbxmxnz +threetwo692eight +dhcztvmmlllg8four +btdjgnh9vjvlqfkznqr635hhcr +2jvbxcfournine +4sixonemp299sevenfour +1sixmdqkzqtgzeight7nine9 +4nnhfkrlmfpseven +blhvfourtwo5vrlqtqrlpxgd +kptg4eightvglvjdczfive +5599msgkplgqfnzseveneight6 +3tnfvgftsnbzksnrhtrtlbfxcfqfjgnndlmfvkqvhcmgdtwo +txvjfglxtbfive3zpx19 +six9four5 +5fourseven +fsevenmnfskhckvfszs73rnjqjhsseven +95knstccbfivepgpt +kmtjfxtztqnrngxxgcgh1kdxpdjzspz +two2rtcmvpbzsmfourchpqthree99 +fzteighteightlvnoneslhjmcrqrg8pzvszdxzbp +one49szrxcjvtt3eighteight +8nqbmcsthreeninexf7 +fvvzvpmsgrrnhjksf8l4 +7msxhtdk +jgtwonetwosixthreervlmxlnine869lbqzxpqqn +nvdn6bdg9ninesix +82rxtf +9tdqsdppseven7one +tlbbxvtwo8one671bhghlhdpfh +3onethhhlmgfhseven +n2six +53eight +one5five85 +three5375nine55 +fhvxvtjcnn3stcjhsdjtc1hhmk +six1jmgzrklbxrmzshpfgnv94hzfd +737six +25nine +fivevnpmlzvvp118lbv8xzplfttx8 +ninethreesevensevensix4three2 +xkgtqqlcdr51bgtx +sixpddqmbb5onehbmjfbpqx3threechgvdkghhjhnxl +7eight9sdcq1 +9ninejbcxzp +3two2sixone +seven8fiveonecrcqrglql141 +4nine3cllndctlninecrdxsevenbhbqsgtjnchkmknpdht +sevenzfbnvgfive3threesix +tvvjkskxgvfourxhccmmpxqx8mtxmfxmrcnine +ptnnhktxxn2qrjvmddszgcftlpdfvxcpkm +mboneight8lbjvvfzrl8qgqf +7twomjfhzl +sevendrdvmx2ninethree7seven2 +zoneight6eightnldnvhqpbd5 +29c +kzfkvqqs2ninesmlcrg573five +vxcgdz24ljhrhgsix6 +one3nine53xtr7seven +djdeightwoeightc2six6nine +eight2727seventhreeone +3gdtc7llsdlftdrx +581vjcbpmrzlp157jjcmlrzhr +7eightsix8fourgg69 +zsh38twocvklone +three6np +9tvxqtbpf77one7149 +7three3gqfpfqmhsfxqbqbnv +8rhflhmhtbm +217onethreelgfmpdscnine98 +three3stnst6xqqxvxzkfssevenbzktd7 +46ttbnzlfnsjbc +bsqxtvhgthree58four8seventhree +ccntwonedsjvftmftwoeightfourbxxt5eighteight3 +threeninembphrpfourone13hnjvn +bkm2onez6xxdjvnxvxjrtwoeight +jztoneight8gsmnjcfvk +six3fourninetwo62 +99dndgmkcctwoneftn +eight7pkzcxqhzfiveppvnineksjfhhqgm4 +2ngrttwozgdsrdsfq5ftgsq +fourdnmxjn5997eightkxkkpseven +rxnrnqvm98zjxxmkflone +three1dkmtwoone +6tttkrtnhgfzx8five4shlcvhr +nffggbxmhkpcppm8kjhktmdvlkkmrffdng254 +mbjm445 +6nfqxlhklrmfour7 +twosixsqtsfcleight8onefdsjxvbgt +9bkkrznine +fivedzpnp1 +cctxzzjbhgttmszdph1sixqseven2 +1qnfxpzfg2feight +5gdj3shgqvjdsix23gqp +xdgxsrshddmzmhkhznsdthree4one +gmtsixsixninexxsxone7three2 +1rttbtsccr +threeseven1fdzqvmbnsfive6 +nxqxvhsix41385none +sxgmkrzmbvn4sixfive5five6six +three6threepdjsseven3kgxtwo +8grzmhsmkthree +seven1htzbglcdfbcg +5nsjsnrscz1zhrvjmtg5onefive6 +two4one +dzl41four3threehbbqnkhn +onebsm86 +xh2 +eightqmdbfiveqv21sevenseven +5onefour3twolrtmmonetwo +32seven +vpcncrhjxgcs3sevenninenine5two +mponeight9glbvgrff +zgzzzpfffneighttdcplkbfr57 +7nineninemfneight +3ddrsxrmbzsmxkdfive8 +pnxtxmfrpmtwo3 +onerktgpv55 +79twosixhnnrqklz98 +5915vnrpsj +rfg7szlxneight +ninejhnzpnhkrlqceightfive5 +tzcgzzx6two3qfk5dffgnp +ceightwothreerqnfl5fourdfbrthreedntdchgnine +sixnfmdk3sixthreekgvmrzseven1 +mcdbsqnrzconetwo1dthreeeightjfjdblk +48threejtdnq +threerxnrgzd9 +vmzgfplpveightfnctwo4pptlb +ninesixqtbqgjvqv1three8 +cfnlshzvczgvm1onefive +gsskzxkgrbzx5pggzmsfhtwotrsvmttzdc8three1 +3sevenfrc7vzg +dcmxmg7d2jlbtfhkr8 +62nzzeight9txrzlm +9pjllhmfgkvssixsixthreeqmzthree +ctjksjbbdn28 +39fivefive5cnqjtr9vpvsix +jlbjfouronent7mlpqpcvqcmhfhvqjqcmtwo +2kpvxg6nine +seven4mlsbhzcmjfthree8 +1khfjhp3fourrh +ninesixpfrjvfm8kkjsrhttxsslhtwoeightwovvg +four2nine +fourlgcbfptfz45nineeight5eightkqtbt +5sixxqggppnl7 +51zvfive1v +fiveoneqqk5seven7four3five +kqlkrntrcfrhtwo9scczeight8dbqmfhstnzq +ghdjlnzmskmvjeightnzmpbjgone61 +three8jrhhmfnfive3four48eight +nine87ninekfzh8 +329nine +jgtwo3xvlkbvhrss27vltrghkljq1rkzkls +vrcfourtwoqlgcrxf274 +sxzkxpvnhsixsevensixtgptbrpnfthhnj15 +5rqqntzlq1one +1pnine762fhone +ttghtthree5eightbqm4two8 +2pmtldtwo6onedtsklbcbjhone +fourseventhtdcsmc5 +xqp75five99g4 +mrjpmm4crgk212seven3 +qjpdjb1 +two44sevenqtcdhxjp35xxx +sevenvtd7ttvmsninergrgdxbdqcthree +pgkqpltdzcthreemzrsrqjfourcrghhsfsjcqtmvxq4 +threeonexfrdvr1nblctsevendqmmzdr2 +8three2six8 +59twozjfour2 +qgtjgmrvfcffour29four5six2 +zzhnine3nineknzkvmbxvm54fivelrrgc +fonesix3three +seven6fivetlhhonetdzrkhjzqzseven +1ldxvjseven9eight5 +seven2bcbktzsjpp +2kxqxflk55two7cflfdfvsx5six +5lvhclqxtf +one768two +vfh8 +nineseven3xpc2jkvmgkqc6two +vvcvzfb947twortlnl96 +seven58nine4nine8tbtjqfpgp +7onefive4lbhslhdpsbtwo3vm +foursixsix3971fiveeight +nrqxrffqbp15 +mklsgg3oneseven6eight4bnbfxf +9five5klpzgrccnxvd96three +sgbqgrlqreight8 +jlvrfrskmlrdtdpr4foureight1xccgtcf +five5threek4hsmqjq +five6pxqlplmtvcvjgtbk +3sevenninefourone +nbrthreeone9gxeightlrkfvgtzhtwoqvnfb +teightwo972hrdrlgn5mpbjrxprpkjxgdkghgrgbthree +7nzgktdsvkjlqdlonergplcdqvv +kzxttx3fivesevenjdlqz9eight +9slfgkbdmq24nh595two +tkbnjhjrfivekqqxsjleight1 +seven23kh2tggrone +12four1xcvkxbcv1four5zs +j7ml +8eightone58dnxhddzstmfleight +mtd37fiveeight3fxcbcd7 +2fiveeight +zkmvsnsgnine321mtbzzg +4tgzhmf9 +threexjqtqzgzj4kvdtbpjv +twohmnpsqbdcrbl35three4seven +2twolpmdnxmcps8fourttfrhzzx +onegqsqrhx2twoeightcxmnxvzsfivethree +2eightseven92sixcjmkzjsl +9gncpkg +six51eightfourkmqbrrkkrjzmhgsevenfour +9bhxxzseventhreesglvvpjmc83eight9eightwomd +164cndtzcrdrxfzgnvqkvd1threefive +43sjlrhsrthqtwoqrxkqsixsix +twohfbqjxmc3four161three +4ngvsmdvm +xmhkgqdnfbdxcxm9 +lqgxmshjzgggj9jsqnv96one +vt2znbmqonesix1gjppfmsevenone +nvdjzzlspjthree8eight +qzvtwone1one3fivek +eightlfztsninepxfstsxtthreefourthree7 +k6 +zmeight2 +3cblxxxthreethree232 +two6sixcsgnzqbttjdzqs39oneightdr +bnjzfkmfh8ndfssix2pff8nctdvdqk +spxskgfmtgghlmklqzz6tdgxnbnnxfmgnfiveseven +cqrlmd62gsh +6rmrzkv4 +nineone6dbtzrtsp8sixzrhjhkrhvsxktbdkjcrone +5pvhbxqdvvqhlthreejqvs2 +lmeightwothreesjrsqgsv9 +seven8two92eight +five9sixeightonevzqtzq8tcgpbgthzvlcld +51ptkkdnzhgp +7jkrtwofourfour +xpzvfcdv1jvbd5mgvchdbnd9chlvqkc5 +27threectsxpfd12eight +prqbfh3foursevencgmhkmkd12 +one5seven8threegqcznrrxfheightfvkjkssbch6 +1vgsixeight3sztxzjkgldmqqbrm3 +jjcpponejtxkmnmggtfive3 +sixlsqgmqkjjzrpqj3dgsrpdzj3mjkdqhpq +slxstvfive7nfst +6fiventqxzhxkfivekcdbhrkx +sevenjqmfmbjfoursixcx7threexspc +kgqjjxfkmhqtf22htnvmpgxsztbb5 +nineqzgzsscrrfngnzksfour1 +9threerq4rhnbmhhsoneseven9 +6eighteightmjbthree5eight +threexhzqqs2kjdqvjr4 +z3ktworvbgbqzbpt +2onefive6 +c69492 +eightsixnine8tpjcxmpln +mxxfpjsplj3msxqdnnbcbbqxfzs5ninecmjpzq7 +cnineninesixfive3seventwo +six18eight3eightfourthreeone +6zdtsqkplv41jmrk7qkgjpkqgmmqsttvrhkzone +7threenvbjsvbshmd4sxffiveqvvctwo +two2two7lpmsjl4 +sixceighteight71psffhzjdjrm +seventhree2eight +qpmpfdlr7 +dxtzmkcrsix5 +65oneptbzdxcsqseven72five +7bdmgtzdmtwotwoseven8one +14sixckthree1n2 +twotwo5hpqhmnnjbsix35 +one5twothreeeightglqdbjlgkseven +one4twokzbdzv +8mcv71six58kkxdqx +bgbvdrfsixfqqvnlptzrqkhgmt8 +37oneightrmm +3onefbtvqchjthreebhxpvlqcdqh +gjcninercqpvvzdfkcdcfv2 +13fourbgntvtnxmr +8447zdxvzfkft +1foursix +threefivetwoseven4eighttsxflbcqtnfourthree +tseven1twolzjkfdttfklsdzrrflnfxfgvlq63 +four9fone9twobhppd +nzcvxgjqrsfqgkktggdlnine5 +57thz +3threeseven25 +zsbc6fivecqvlhtwolqone +nnsoneightdnine6rhckhj23fjj4 +cj1rbxlggxxgtxxbmtgfg6two +vhkgpz4 +nrmskeightone9six2clhcjkcl9jk +onejvdcrf96hbv +seven8three55 +1sixtwo79 +jcqknvjppbxsphlxrrcbzmkqnine29 +2fourvgzhnq +2six93rdrkfjkqlllx6nine +77onevkvqhvptbn +32szxlxdc5zlrtjdqpt5 +nine75hzkzvdseventhreelxt1six +vdbgshtjm8grgllht4qhpkhdfour +mrvdgqvseight3jtzfdspdtrkf +kcg2twoonelcpxlg +2xlcjcxzczt +1pszcvn12sxmcbdxznpeightxvdjjbgrjlpdv +fourbsbkvnineonesixthree8 +945five5one +nine71gzq79 +3threeeighteightldqcgtbd +two671four2r +bbfpvdsvffour5two +767l97hm +twofour5 +xxrs931ckbg34g +qhnht4 +nine723nine9 +93preight5f6seven +one8qncpgpl +fiveeightsix8jr2 +twocdv9lrtsbcdtvz62pkzm +dmhfljxqxeightxmbprh2 +rr5 +5twotwo +three8two5 +4rjqmbdtxv42twoeightseven5 +fourb349six +f31nineninetxtdtfivehc7 +1one3 +2eightxztclpbvkp +bkxvnhhn6nine211 +1twoseven3xmzg +lnzpnine54eightwoqpr +gnhdcgdmvthree9nine +vlxjmdc1fivesix +nineonefour69 +ktdkztzmmcgxslggh7dhptrkgfbqnine3two4 +qfczhgjnt6 +3fourrzmt +onethree2four3nztsmbqmtldgonenlc +29six9xlffbvfntz85 +five6trqbjkhjfmrlgpcxseven +threegz9chglg6 +9tq +1onefive8two84ngrh +hrqhreightfive1lp +onethree4 +two8psmqcbsixsix +sixseven3xxczmccll +fourmmlcgbkhktbmrp5three +27sztxgmqdvnfivelfcpzjsx7one +hdbhrqhhffbgjxvdpqk6sevenbn +93ninezmtrgjqbsp74 +gsljpvzxkq9 +zbjzzrnkbeightseven1four +fourfivetwothree2rh5 +155cqrh1 +1tjdeight +dvnlk78cbvdrccmmx3seven +8seveneightsix +ffjlhcgxp97plmttszkvj7jvtsgsevenznl +121four +threetkqnxtwobvbmzj4ppkdxqtblszmxqhqbv +5sevenxgcgqnlpkpnfmcnkbfbeighttwosevenhpht +gkgnfiveninelr5eight +six4nine73szmldmdd +9jfgcslbrcz +jrgrnmntmtwonptz8eightninesix6 +238eight1xtjdgb +2one66fourndjcxmmbhfcq1 +5bmfntsevensix +5832663v +7sixdzmhfrjonebdqlqh8threeonenine +92six +vqpg91hspvdgtwol +fivembzffnlcktwo18four7 +six99nbzrgd8 +onexqflrlvdmrsix9nbl1szkf +vqmlzjc1d3 +three7two4vbgzthree +twoninejbbxhdfnbqjddj26one2 +5nine296ninefourone +onevznthreedbtjtgxhh36sevenfour +zfkffkjsz7btqgtm1lqvsix74frjhrkbjj +sltlgnine6fiveninegglpc8ninenine +two7three +fourbrmdvfbtnnnhr1mnhbztwo98 +nine6slnine +cqkfp35hzrdlcpcsjhssdlnjv +six42seven32five +zkhjblqjlsfive9kbxzhjmnzrxbrrj6sevenjdvljbh +9ldrjmjpqeight4pnmcfvg3b +lone8 +two1sixfourgskrlfkxxdhbjspmhg +4hgceight2one52jmbmjkjb +six8zfbjxfckfivesixzrpn3 +vbrbvv6 +jfjkvxcrbjhztvtmjbp15two6one +3xvhtzgqpn4td +xthree44 +68973one7rmx5 +ptbndknk26two8cv7seven +57417four +ngeightwopgdtlxjgs3threefivefivesk92zgcmch +pmfjgxpg6ninefoursix +5hlgzgrxhxxqt8 +1nine3 +gvdhxthjxnxv7dtzninenine4 +jrtwonehzddmgcjsn6rzldcsfpqs8eight6six +5fourfive +jn6 +two2four +567ninefive5fivefourdrbh +36sevensixkbphcrstnine +76svmjhhkrt73 +thgzhsclsptfqfzpsnine4cxxpv +two1one8fninefdctxpmtk7 +seventpxmbxcl9 +cghxxdnnf7vmvqdfhhxznine6dgt +soneightsix7 +7ft3threeqdhxjmkgd6vgfmb +1threesix5lzjzrm +fiveonedknfvkphltcxnsvxpvxlxldxrqftcmqvvqx6 +sone1tnmqklzvbbctjvntddpm3 +nine9vb +eight52threeqnhhvn +87fhkjhseight485 +1onesixzczvlsmhbfour7 +3ztseven +7tjjbq2three +sevenv1eight9cpvmrn8oneightnxs +1threehlhxjj2eight +six87twofour3646 +eightzlmj2zreightbflxtmdbv +one2eightznone +seven2eightvlxkqnpjb7dlqrmnhtfive1seven +43eight3 +fivesixfiveeightsxrvgmpshvone7 +7dpmrqeightone1rdfdrx +dtmtpgjll136dbcjlrhzrdnm7svlrdrcngpnine +5dl9 +94ctwo4four +7ninegnssldmnmqc +nine1sevenzdvkpxxsfccmb +none5five1rsrsxpxnlt1lxtf +sixpl9nhgm +51brpphslhjtwo2stjrkphcgrfive +fivetdhlrcbtwozdsfgcdnhv67fivesdjlqnine +4fourfour7sevenfourfivenjdxvf +674one46 +6ninentdksjfkdvhkkxzrgftnbjmfsjgzd +4ninerpvfmfonetcnhk +1ksbmzccfreight5 +3vqr +ninegqbgveight7hggnxxgrq3 +sixfourfourseven1rfivekcflqd4 +mzvqrlp1sixnine +sevennine3gqjmqrq +6vhp8one251eight +5dnsxqrb3twokdzdbdcncm +srcmzlkrone9ninegbfnfmxjf +82lmhlhmtgfour6nbljxrgjb3ninesixtwoneqhc +6pctdhrmhrgsbm +sevenhgpfqvkh5three51jdkqz84 +hfzlmldpn9tjtlpb +phccmtthonesix6 +3fourbrzqzsbnthone +11pssjfqkfivebmprltbvm4 +gmtc2five +one2lj4fivetwo +ninexjrzfonehvntsmnzx2 +fourg746jpxvrbzdmseven +six76436 +89gddfltmdkkmleightqbzppmklxzgpnlg +sevenmtfmdrbcl9 +3cpgvjgzxsixnine5hvrxbdnclfgbvfsix5twonelv +eightklzkzxltzone5 +377bqrbsdk1eightthree6 +2sevenlfqhmfour +21oneonevg9rr +onenzjgjxlmtrgbt84onenlls +7rlgkgrsixfive +nmmpl6fc7ccg8lkvpvqplztwo +mzbxkmfcd89six +fbhzskjt4seven3jrvfjhqsbcone3 +five3sevensix +eightsix6 +n9 +threeninemzpjqpcpvnine424ninesix +8ninesfour7 +twopbsbvdpnine6fourfive7qbbckmhxgg2 +5ksvzfbdbgvnqonehsgtvgkbgjkzggsmpvkxpxtft +qeightwo2three68nine39lr +5gpz6283five +19fourjctnldrqlghx +gtwonetbqxnvxlz2three +jdvmph5fgztldhtwoxhzk +fourgmhflfpxmbqpt8jdxkntnchmtkgqhsgthree +527five +5sixfour +mdchltjjqmfive7 +kn6glgjlspeightfivej +3vsblvhkmt7 +17rmnoneqqgqmcvlseventwotwofive +eightjbmnzngtxsix3two +fourgdczfkvs3onekrcm +2prvszkhlnine +nine67mqtxbthtfxgtwof +lrcrninevgshzsrmj9threethree6 +bslrhlvpthree49fmlzb +3nzqmndm7hxzrlsxgmt +48jtjrmzvtct +pzpthxqxs9pjkhxc6gk5 +eightbdvrcsg2tgjkzzj +2oneeightonemlgpgtdg +8sevenrxksglxdfour3lhst +four88sevennine1 +fiveqszbfmdv8xfiveeight +sqqbhtk3nine5mqzkzbzlxlhdtwo +8eightone +63njcjnbhptone75fqhg +fourthreefivesix9pvfivehmbhmhtrplseven +5fourbfnzxfivenine8four +rzhqrxfhpf9seven69kcjhxv +nlh3fourfourlbppcjdx37 +hntmdckqhonejmcfphrrthreesix3two6 +eight7sevenonefourfour +nkhfgtknbjsixzrpppnqsone15threesixfive +nine5xlvfqmfourfive3 +sscctsdfourkppsrd6eight4 +eight92 +1oneightfs +2hmgrqgjznhh1xztfmthreev +jvpzlqbsrb3 +pszdpm3 +kccl2 +dzxmqpgfive6338seven +9nqfpv +prphfourninesix5six +57vbcbcvtbgtqmktjscjbzfkjgzzv7rspqlrdfsmbsvbmb +qxqlzmeightfourhzvctqsxczg4qggztsnrzz +79seven8rzgzhksz97tbrftfllmpone +twovdspsvmftgnfjdqgjpv92qdqzcgr2 +6ninesevenninecxzmvlczjf1eight +186 +fourtwo324five5eightv +six95five1tnpsqkr4twocgnbrtr +threesix2ksh +dpbbkpxvd457sixbncfnkbleight3 +bxrbglhfcz2five +8three3fivethreeqjg54nine +nineonepvhrzcdm9lbqqgrdmggzkqzvhnbczrhhvjz +3rgljppmcftqmqkqbl +9threeqjrjrgseven +4qtfn +five7fourfourhbspnlmgsmxnxt5 +fffctbhcpklfndj23twotwo39 +62sevenxnxthreefive6two +5772six9five +seven599rpztwo +onefiveonemsftxtqdcsix7jngtvr +12fttpqzzlk +zcndrqjsfourthreethree11seven +nineone8 +tdlbrszns4pdlptfvcnxqhx +5six2nine8hvktskx +5xvcnbsix9vnclxm +94ptv6mzgninesk96 +4lfvvczdgvh8rzgkmvnk +74nsvkm5nztmctpmngppzkphltpx +46two9four67nine +oneonefive5fchd3nksmgs +6vnstxdtlninezgdvpmjjcxlqvc +6five3 +7four76rklqgljhdzzhdcqrqzpxmfftbcfiveoneightjzg +43eight43955four +gsrrtkpqpseven1fourbfninereight +6rvdtwotwo4eighteight5 +foureight9 +468cgbctpkqninetsxskqbhmj +7twonine4 +8jnssjzcgpzrvbqzmv5three3jmhfjcbtwo +4qjrgrntbfzghfkzxvmj53pcrjrlls +twonnjv8 +97three9zgkhgmrcfour +9eight23 +qtsgznprvthreethree6 +63tworhdlrfstgxfmjjknfourqfvfjjz +sevenltdcgs8three +bjctzmmbhrqlfzqgxbcdgdgprv9twogjmrdclzt +63lslhrbmcznine6 +66gc8seventwo +zdrpnjjtwo62ph6 +ninerdxqgxtqrrgx3gz3three5lfc +lflcrscclg35oneeightpmhhm1bkftvxqbmx1 +74rgb +six8ninelvxdqphkd6 +5zsbfjsixseven1 +4rflxzvnn +mjbpr4qjjhvbgn +26four6drctrdmz +6mrzflsszvq +fcjbdqdnh1stglpmc6nmvggcvnrghcpcnz +one2four48fourcgkvvnlzlb +kc2461two +fivethree54dbvxmf +849psvj9six +hnxg5rbhbqzzeight4 +zzsix45glphncrrq5two4nqrdsk +seventhree5qpfour7nnbllpkgveight +bsh78mzxzhhseven8 +jllhfive7sevenninebcmninet +nineseven4pdkfpdzqpbzgt +sevenninetbthree5skjmeightfpjrq +nxkv6 +four59 +zrhcvb6qlctpeightbnphxmlk1cjzdbl +8mtgqjthreenine32 +6slj8zqbpqmr5 +rqkvxmqtkn8oneckdxtqvxcthreehngfdqqsseven +nine4nfqpgdpvx9fivethreefourfnhfjmfzqr +3gdxbh2gbm6 +72qmrrqbsflqpspdp9ff8two +xgbphtnjfrg5fourdfmsmqhfp597 +bkkpgrhj8hlbsqmjdjqxjtjkrgppjgszpmm +five71 +9rmmf1hqqsmdrrfour +7ninelflmvj6seventhree +172 +tfhqv1 +jfbtwoneninenine6dgxnqjgsteighttwo +4dnvfvx +37sj6three48nfjtclz +2two4fsbbmrtnlqljqdskqseven +1pnpzdr3sevenfive +fourrbktzvtslxjdz9 +47six +jgcrllvbsvnrnmqfppxjfournbmjgp36nineb3 +s6fgr4four4 +cmpvp8three7 +xjqmgdrvtlv5xmcpnkhvfhrbjzx +117eight +9snnxnrccnonepdbfhhqcnpsevendsffjsvknpvmkdxp +rgsix6rqzsix8nine +nine8two +2clfqtxkztwo4twobjscfzptgn +6s5dnfkpxts5five +five9cst +eight71dmbdqfgtpvj3 +vdf3fjfsczlvvnine3foureightfivennhqmcdbdb +two59eight9 +eightdkfmscfmzrk7ninespg9 +sixseven46seven +493djtvlhsixnhnts1sss +ninepczttwothreemtz3three +fivezlfjhqnknnhdfour8eightninetwo +4ngvsvfivemgthtlcczfbjq1ngxvsbmt9 +sixcgkmnd2 +12 +nkgbpqfvvb9threesixqgqvjgzdxm1rc +five7seven +2seven8151 +86eightfivethreebgbfvr4 +355 +hgldv8four2dzmtpdsmck4five +ninemb7gtqzrpbt31fourndtsjkhv +3fivefourghlmgfhninesbtcsqone32 +7krkptwo4qmzhvpsixthree +74ppbsmnpfthreefivefive +9four5zdkprcnbtl6 +four3seveneightbrmdbcxxrk +twothreerdvxmqsbtgtszmxr4eight9jzbxpfstc +73prc73six6three1 +9fivesix5fivepsg +two98two98 +oneseventhreethree4qvjtzksdsz +tnbsgjqdkl22 +rmlbp4seven45 +9dpzqbds2pffivefqrchvhpvjbtnl +79hdzstwofoureight5bjs +t2 +4pstpbdkxblnmv9nzfzsttfgfivefiverrtlmgj +zkkhkggtthree3eightseven +d11fourzfcnmzbxgbpf +66six53klhrdnbtp85 +onenineonelsfhzbkjgsfivedhzlfcvh8 +jdt4four +bgfzvxthreeonebhlqjbprf1 +sevenfourktsxkbbgt5 +mmqffp1 +vqghrsgxpsssix2jxzvdjdconeznlgpxbqdlsncrsix +5bnzrdptseven8nine +zqdklqmjjc2rl8jxtmsixxftvspzlhfive +vmn9 +7mhhcftwofour21sixvvhlmspeight +blvhpfour354sevendrllsfivexmt +six5fivetxrvnvftfvgcddshzktwo83 +3mdcpcj +zdtjmglv8rkgpfvninethreetfgmx6sksteight +48five8mnstwoone7nv +cbpvqbddlllczgfmninenine3zqvptoneightx +1two2 +jxfhzr35threesixlxghqbqtq +nftv7sevenninetwo2seventwonnkbvqnjjx +eightgjeight6f4 +2fivessrktznhjvxmghnlhbmfseven2two +onedhvdg82xdvgmhxzbqrpzlnfx4 +17nzhkkpchk9 +dzccfzphmz6sevensixeightmcvxsthree +onettfmvfhgsix1two +eightone37 +2onepdnbrbxk4foursevenzrmzmvqzgstppr +five536seventhj96 +nlhqljfzmb4khqtjh +j8l +2kpmrhmhonefour +2jblsixkbblgzbfprhbjnrtspcqs +6twothree +two19eight9 +fivexbrjpnhhlvdztthree9 +jzlmvxjn9oneoneone +2cnqphtdjgdnhbkseven2fiveninefive +threetwonine67tqpbdfhfbv +smgr56slfpdmfive6ninehmqrck +fqqnjqpccjqt6six75lpfczmnine +bq2mdxchhmbxfzzkqgsixrbcpklpqnxsvnbthree +eightthreefxxssg8cx +lhlc6 +nine6onexmvlbtbxznmrztnv +8fivedlxzgxxflbltteighttwochtxlfjx +seveneightfour1three4gbcnnk +8fivejtxbpvmpxoneninesixzdrjhtncbnkgpsxqs6 +1hxsxn84eight +sevenseven71phgltmtxq4 +8fivepcqthree3dn +f6bbrdqflknp +fiverpjbb9rjbrfrlrnine +zfqpjjktg5seveneightfiveltvvtxdfk +flhnczsbx6 +tsqlvphjmfourrcqsjj7four9six2rnz +fivedmznjqtwoqmone1 +eightfllck3spsfrgz92gmcgkgg +tcrrrztsevensixqthpdqgxv91vvhbsqgzkq +22pztfnhh554qdvzjxnnzzrj +tscrkt4 +fzmsgmzbz5 +rxzsnjhcnkthree8eight +9fourdhjpp2648 +4chvdrvtgqgbzhcxztwosixsixhnqknqmntzlltqncdxddnjlk +xbfk2cr +hrmbslbdgnine8nineeightseven8one3 +kmkdhbonesix79rbshvkkvjnzzq4 +9jrz26 +seven163nine +83sixgvhjttnhkq9frphcqrng +8five3seven +three16xqdzlkqjjtf +5fiveeightl8veight1pxfptklnhj +npllktfive45nhvqjcjgpxx +hbfr9mm +onerbfkf4threeone +7eightone +eight2kmjlsix8one61 +rvrnrdrninenine3zq6jqsr +lztlntnsevenpplkhkftq1 +tfrrjmcvtbmktnxtxkkrcctmc33four5gfqpcjreight +33rgcjxfsfqsvxxbxcnrjfndrrfmrtk +3627837xhhb8 +bmjhkkn4pgf +qkrsvjclp23 +5fourzllbmcgkxsevengkrzkpvcmvgtxlrv6 +fivetczxxvjrrqfive1sevennvj6one3 From 5b94cedebcecff8cb4286c0f2010acb5e0677320 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 1 Dec 2023 12:13:44 +0000 Subject: [PATCH 381/479] 2023: d01: ex2: add solution --- 2023/d01/ex2/ex2.py | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100755 2023/d01/ex2/ex2.py diff --git a/2023/d01/ex2/ex2.py b/2023/d01/ex2/ex2.py new file mode 100755 index 0000000..2412098 --- /dev/null +++ b/2023/d01/ex2/ex2.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: list[str]) -> int: + def extract_digits(line: str) -> list[int]: + # Just do a search and replace to simplify our lives + digits = { + "one": 1, + "two": 2, + "three": 3, + "four": 4, + "five": 5, + "six": 6, + "seven": 7, + "eight": 8, + "nine": 9, + } + # The solution expects "sevenine" to translate to 79, so keep first/last character + # as a work-around. + for word, value in digits.items(): + line = line.replace(word, word[0] + str(value) + word[-1]) + return [int(c) for c in line if c.isdigit()] + + def value(line: str) -> int: + digits = extract_digits(line) + return digits[0] * 10 + digits[-1] + + return sum(value(line) for line in input) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 7a7691c891210aea441f1f7a37110459c1c27c84 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 2 Dec 2023 09:21:39 +0000 Subject: [PATCH 382/479] 2023: d02: ex1: add input --- 2023/d02/ex1/input | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 2023/d02/ex1/input diff --git a/2023/d02/ex1/input b/2023/d02/ex1/input new file mode 100644 index 0000000..70852bf --- /dev/null +++ b/2023/d02/ex1/input @@ -0,0 +1,100 @@ +Game 1: 13 green, 3 red; 4 red, 9 green, 4 blue; 9 green, 10 red, 2 blue +Game 2: 3 red, 8 green, 1 blue; 4 green, 11 blue, 2 red; 3 blue, 2 red, 6 green; 5 green, 15 blue, 1 red; 2 blue, 2 red, 5 green; 12 blue, 7 green, 2 red +Game 3: 1 red, 9 green, 3 blue; 8 green, 4 red, 11 blue; 6 red, 10 blue; 6 green, 6 red, 12 blue; 2 blue, 11 green, 7 red; 12 blue, 9 green, 8 red +Game 4: 7 red, 2 green, 1 blue; 12 green; 12 green +Game 5: 15 red, 3 green, 1 blue; 6 red, 2 blue, 2 green; 3 green, 3 red, 1 blue; 2 blue, 13 red, 5 green; 2 green, 15 red, 2 blue +Game 6: 3 blue, 15 red, 1 green; 8 green, 5 red, 6 blue; 9 green, 5 blue, 6 red; 9 green, 3 blue, 9 red; 10 green, 14 red, 2 blue +Game 7: 6 green, 1 red, 11 blue; 6 green, 1 red, 3 blue; 4 green, 20 blue; 2 red, 5 blue, 4 green; 10 green, 17 blue +Game 8: 10 blue, 9 green, 10 red; 9 green, 1 red; 8 red, 9 green, 9 blue; 5 green, 3 red, 7 blue +Game 9: 7 blue, 1 red; 5 red, 4 green; 4 green, 6 red, 5 blue; 2 green, 4 blue; 3 green, 6 blue, 4 red; 1 green, 3 red, 3 blue +Game 10: 2 red, 2 green, 2 blue; 10 blue, 2 red, 1 green; 2 green, 9 blue, 3 red +Game 11: 8 red, 4 blue, 1 green; 3 red; 1 green; 2 green, 3 blue +Game 12: 10 red, 2 green, 4 blue; 4 red, 2 green; 1 blue, 1 red, 1 green; 10 red, 1 green, 5 blue +Game 13: 20 blue, 9 green, 7 red; 13 red, 13 blue, 16 green; 17 blue, 6 red, 6 green; 1 red, 1 blue, 9 green; 9 blue, 18 green, 7 red +Game 14: 6 blue, 14 red; 9 red, 8 blue; 2 red, 1 green, 8 blue; 3 blue, 1 green, 9 red; 8 blue, 2 green, 1 red +Game 15: 3 red, 1 blue, 5 green; 2 red, 3 green; 5 red, 5 green, 1 blue; 2 green, 6 red; 4 red, 1 blue; 6 red, 1 blue, 1 green +Game 16: 5 blue, 7 red, 2 green; 7 red, 12 blue; 10 blue, 11 green, 5 red; 11 red, 11 blue, 10 green +Game 17: 3 red, 7 blue; 1 blue, 14 green, 4 red; 11 blue, 4 red, 11 green; 18 blue, 5 red, 11 green; 18 blue, 1 red, 8 green +Game 18: 8 green, 2 red, 6 blue; 8 blue, 11 green; 2 red, 11 blue, 9 green +Game 19: 11 red, 9 green, 3 blue; 19 green, 9 red, 2 blue; 19 green, 4 blue, 4 red; 1 green, 11 red; 10 red, 2 green, 4 blue +Game 20: 2 blue, 3 red, 1 green; 1 red, 3 green; 7 blue, 1 green, 4 red; 1 red, 8 blue, 7 green; 6 blue, 3 red; 5 red, 3 blue, 7 green +Game 21: 1 green, 1 blue, 10 red; 1 green, 5 red, 8 blue; 11 red, 4 blue; 6 blue, 6 red +Game 22: 6 blue, 6 green; 8 green, 15 blue; 8 green, 3 blue, 1 red; 11 blue, 2 red, 7 green +Game 23: 1 green, 3 blue, 7 red; 4 red, 1 green, 2 blue; 3 red, 2 blue, 2 green +Game 24: 4 green, 8 blue, 4 red; 2 green, 9 blue; 4 green, 1 red; 2 green, 5 blue, 1 red; 2 blue, 3 red, 3 green; 6 blue +Game 25: 7 blue; 15 blue, 5 red; 6 blue, 12 red; 1 green, 17 red; 13 blue, 5 red; 17 red +Game 26: 1 blue, 3 green, 7 red; 9 red, 4 green, 1 blue; 1 red, 2 green, 1 blue; 11 red, 3 green; 10 red, 4 green, 2 blue; 6 red, 4 green +Game 27: 4 blue, 6 red; 2 blue, 8 red, 1 green; 3 blue, 3 red; 2 red, 1 blue; 1 green, 3 blue, 6 red +Game 28: 1 red, 7 blue, 7 green; 2 green, 1 red, 4 blue; 8 green, 2 red; 2 red, 7 blue, 5 green; 12 green, 5 blue, 2 red; 1 red, 1 green, 2 blue +Game 29: 10 green, 3 red, 6 blue; 9 green, 6 blue, 4 red; 3 red, 2 blue, 17 green +Game 30: 8 blue; 15 blue, 1 red; 10 green, 2 red, 13 blue +Game 31: 10 green, 2 blue, 7 red; 2 green, 1 blue; 1 blue, 15 green, 2 red; 7 green, 2 blue; 3 blue, 6 green, 8 red; 6 red, 1 blue +Game 32: 2 blue, 2 red, 11 green; 10 green, 2 red, 1 blue; 1 green, 2 blue; 2 red, 9 green, 2 blue; 2 blue, 1 green; 5 green, 1 blue, 2 red +Game 33: 8 red, 6 blue; 2 green, 3 red, 2 blue; 1 green, 13 red, 18 blue +Game 34: 7 blue, 5 green; 5 green, 8 blue; 13 blue, 15 red, 2 green +Game 35: 1 blue, 2 green; 9 green; 4 red, 14 green; 1 red, 1 blue, 17 green +Game 36: 2 red, 14 green, 4 blue; 13 green, 3 blue; 1 blue, 7 green, 2 red; 4 blue, 9 green; 1 green, 3 blue, 1 red; 2 red, 4 blue, 10 green +Game 37: 2 blue, 7 green, 5 red; 5 green, 2 blue; 6 blue, 11 red +Game 38: 6 green, 6 red; 9 red, 10 green; 2 blue, 8 green, 8 red +Game 39: 10 red, 3 blue; 5 green, 3 red; 5 red, 7 green +Game 40: 5 red, 14 green, 2 blue; 5 red, 7 blue, 12 green; 2 green, 4 red; 1 red, 16 green, 3 blue; 16 green, 4 red, 7 blue; 9 green, 2 red +Game 41: 4 red, 3 green, 2 blue; 13 green, 6 blue; 2 red, 14 green, 1 blue; 7 blue, 2 red, 14 green +Game 42: 4 red; 1 blue, 5 red; 1 green, 6 red; 1 red, 1 blue; 3 blue, 8 red +Game 43: 7 blue, 16 red, 1 green; 2 red, 6 green, 1 blue; 5 green, 3 red; 5 green, 9 blue, 2 red; 3 red, 9 blue, 4 green; 7 red, 9 blue +Game 44: 2 red, 2 green; 5 red, 1 blue, 8 green; 7 green, 3 blue, 5 red +Game 45: 8 blue, 16 red; 8 blue; 4 blue, 1 green, 8 red +Game 46: 11 green, 9 blue, 1 red; 8 green, 7 blue; 10 blue, 1 red, 1 green; 12 green, 10 blue +Game 47: 3 green, 6 red, 1 blue; 2 blue, 2 green, 12 red; 3 red, 2 green, 1 blue +Game 48: 3 red, 3 green, 3 blue; 3 red, 4 green, 2 blue; 2 green, 7 red, 1 blue; 2 red, 3 blue, 5 green +Game 49: 5 red, 7 blue, 5 green; 10 red, 4 green, 7 blue; 9 red, 17 green; 6 green, 1 red, 2 blue; 7 green, 8 blue, 5 red +Game 50: 2 red, 4 green, 16 blue; 4 blue, 3 red, 8 green; 4 blue, 2 red, 6 green +Game 51: 16 green, 10 red, 14 blue; 8 red, 4 blue, 12 green; 14 green, 7 blue; 6 red, 20 green, 3 blue +Game 52: 1 red, 1 blue, 1 green; 9 green, 9 red; 4 green, 13 red; 7 red, 11 green; 4 red, 1 blue; 8 green, 3 red, 1 blue +Game 53: 4 green, 11 blue; 9 green, 2 red; 6 red, 18 green, 13 blue; 6 red, 2 blue, 14 green +Game 54: 1 green, 1 red, 1 blue; 2 green, 4 blue; 4 blue, 5 green; 3 blue, 1 red, 10 green +Game 55: 8 blue, 2 red, 3 green; 9 red, 11 blue; 1 green, 12 blue, 4 red; 3 green, 17 red; 3 red, 3 green, 15 blue; 7 blue, 7 red, 2 green +Game 56: 3 blue, 13 green; 9 green, 2 blue; 1 red, 2 blue, 16 green +Game 57: 6 blue, 4 red; 3 green, 6 red; 2 red, 3 blue, 3 green; 8 red, 5 blue +Game 58: 4 red, 15 green, 5 blue; 1 red, 16 blue, 14 green; 2 green, 17 blue, 6 red; 20 blue, 3 red, 7 green; 17 green, 1 red, 12 blue +Game 59: 3 blue, 14 red; 5 green, 10 red, 2 blue; 2 blue, 5 red, 6 green +Game 60: 4 red, 1 blue, 1 green; 15 blue; 8 green, 14 blue, 4 red; 9 blue, 3 green, 4 red; 4 green, 2 red, 11 blue; 4 blue, 7 green +Game 61: 5 green, 9 blue, 16 red; 4 blue, 12 green, 4 red; 17 red, 7 green, 5 blue; 19 blue, 12 red, 17 green; 8 green, 13 red +Game 62: 13 green, 1 red, 7 blue; 9 blue, 1 red, 4 green; 14 green, 2 red, 2 blue; 3 green +Game 63: 6 green; 7 red, 3 blue, 8 green; 5 blue, 1 green, 6 red; 6 green, 6 red, 2 blue; 8 green, 2 blue +Game 64: 16 blue, 1 red, 2 green; 4 green, 1 blue, 6 red; 6 green, 2 blue, 2 red; 17 blue; 1 red; 13 blue, 6 green, 1 red +Game 65: 8 red, 3 green, 7 blue; 6 blue, 8 red, 2 green; 2 blue, 3 green, 17 red +Game 66: 2 blue, 3 green, 3 red; 3 red, 2 blue; 5 red, 4 green, 3 blue; 1 blue, 3 green; 2 red, 1 green, 1 blue; 2 blue, 4 green +Game 67: 2 red, 3 blue, 15 green; 2 blue, 2 red, 17 green; 4 blue, 3 red, 2 green; 6 red; 3 red, 8 green +Game 68: 7 red, 1 blue, 12 green; 17 red, 1 green; 10 red, 8 green; 16 red, 5 green, 2 blue; 4 red, 1 blue, 8 green; 8 green, 7 red, 2 blue +Game 69: 17 green, 9 red, 2 blue; 1 blue, 14 green, 3 red; 9 red, 12 green, 2 blue; 11 green, 2 blue, 7 red +Game 70: 1 green, 8 blue, 2 red; 2 red, 10 green, 1 blue; 1 red, 12 green, 6 blue; 9 green, 4 blue, 4 red; 2 red, 6 green; 3 red, 8 green, 6 blue +Game 71: 1 red, 5 blue; 12 blue, 3 red; 3 red, 2 green, 4 blue; 5 blue, 3 green, 1 red +Game 72: 11 red, 6 blue; 1 red, 1 blue, 1 green; 2 blue, 7 red; 18 blue, 3 red; 1 green, 1 blue, 12 red +Game 73: 4 red, 2 blue, 1 green; 3 red; 5 red, 1 blue; 4 blue, 6 red +Game 74: 2 red; 2 red, 5 green; 4 green, 1 red, 1 blue; 1 blue, 5 green, 5 red; 7 red, 1 blue, 3 green; 8 red, 1 blue, 6 green +Game 75: 13 blue, 2 red, 2 green; 2 red, 9 blue; 2 red, 9 blue, 5 green +Game 76: 2 red, 3 green, 18 blue; 2 red, 11 green, 5 blue; 6 green, 8 blue, 2 red; 4 blue; 7 green, 14 blue +Game 77: 5 blue, 8 red, 1 green; 2 blue, 5 green, 12 red; 3 red, 4 blue +Game 78: 1 blue, 2 green, 16 red; 2 red, 3 green; 1 red, 4 green, 2 blue; 11 red; 2 green, 12 red, 2 blue; 11 red, 5 green, 3 blue +Game 79: 10 green, 3 blue, 2 red; 8 red, 3 blue, 8 green; 5 green, 3 red, 11 blue; 9 green, 16 blue +Game 80: 1 red, 4 blue; 6 green, 1 red; 6 green, 3 blue, 1 red; 6 green, 2 red; 7 green, 1 blue; 2 red, 2 blue, 2 green +Game 81: 10 blue, 4 red, 4 green; 5 green, 1 red, 7 blue; 11 blue, 8 green, 2 red; 8 green, 2 red +Game 82: 12 green, 1 red, 3 blue; 6 red, 1 blue; 16 green, 3 red, 4 blue; 8 blue; 7 blue, 7 green, 2 red; 4 red, 19 green +Game 83: 4 red, 4 blue, 3 green; 8 blue, 4 green, 6 red; 6 green, 7 blue, 6 red; 11 red, 6 green, 7 blue +Game 84: 11 red, 2 green, 2 blue; 20 green, 2 blue, 13 red; 15 red, 6 green, 3 blue; 17 green, 7 red +Game 85: 3 blue, 5 green, 2 red; 12 green, 2 blue, 1 red; 7 blue, 6 green, 5 red; 11 red, 2 blue, 17 green; 11 blue, 11 red, 17 green; 18 green, 9 red, 13 blue +Game 86: 1 blue, 14 red; 4 green, 1 blue, 3 red; 2 green, 1 blue, 13 red; 1 green, 1 blue, 10 red +Game 87: 2 red, 5 green, 4 blue; 3 blue, 9 red, 6 green; 7 blue, 9 red, 11 green; 10 green, 11 red, 9 blue; 7 green, 12 red, 4 blue; 5 blue, 1 red, 7 green +Game 88: 11 red, 1 green; 9 blue, 4 green, 7 red; 10 red, 4 green, 1 blue; 4 green, 1 red, 1 blue; 10 blue, 1 red, 3 green; 2 green, 12 blue, 11 red +Game 89: 3 green, 3 blue; 1 red, 7 green, 9 blue; 8 red, 11 blue, 11 green; 2 green, 6 blue, 5 red; 5 blue, 9 green +Game 90: 3 blue, 10 red, 2 green; 2 blue; 8 red +Game 91: 2 red, 10 green, 2 blue; 9 blue; 8 green, 5 red, 10 blue; 7 green, 6 blue, 5 red; 1 green, 6 red, 12 blue; 1 red, 4 green, 3 blue +Game 92: 12 blue, 5 red, 2 green; 4 blue, 1 red, 3 green; 6 red, 6 blue; 1 blue, 8 red, 6 green; 6 blue, 3 red, 2 green; 7 green, 4 red, 1 blue +Game 93: 3 blue; 8 blue; 3 blue, 2 red; 2 red, 1 green +Game 94: 5 red, 7 blue, 6 green; 15 red, 7 blue, 4 green; 6 blue, 1 red, 2 green; 7 green, 4 blue, 17 red; 12 red, 5 green, 1 blue +Game 95: 7 blue, 11 red, 9 green; 10 red, 6 blue, 7 green; 6 blue, 6 red, 7 green +Game 96: 2 red, 1 green, 3 blue; 3 blue, 1 green; 1 green, 1 blue; 1 red, 1 blue; 1 green, 1 red, 4 blue +Game 97: 6 red, 1 blue, 7 green; 2 blue, 5 red, 7 green; 8 red, 3 blue, 6 green; 6 green, 1 red, 3 blue; 5 red, 2 blue, 14 green; 3 green, 6 red, 6 blue +Game 98: 9 red, 14 blue; 19 red, 4 blue; 11 red, 17 blue; 14 blue, 1 green, 18 red +Game 99: 1 green, 1 red, 12 blue; 2 green, 4 red, 14 blue; 4 blue, 6 red; 10 red, 2 green, 1 blue +Game 100: 5 red, 9 green, 2 blue; 9 blue, 6 green, 1 red; 8 blue, 7 green, 3 red From 355b4f457b57fea48cf6885ecb3cda306d6f8f4e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 2 Dec 2023 09:21:45 +0000 Subject: [PATCH 383/479] 2023: d02: ex1: add solution --- 2023/d02/ex1/ex1.py | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 2023/d02/ex1/ex1.py diff --git a/2023/d02/ex1/ex1.py b/2023/d02/ex1/ex1.py new file mode 100755 index 0000000..04a0cb1 --- /dev/null +++ b/2023/d02/ex1/ex1.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +import sys +from collections import Counter +from enum import StrEnum + + +class Color(StrEnum): + RED = "red" + GREEN = "green" + BLUE = "blue" + + +Round = Counter[Color] +Game = list[Round] + +# The input is in order without skipping, but just in case... +GameRecord = dict[int, Game] + +BAG_CONTENTS = Counter( + { + Color.RED: 12, + Color.GREEN: 13, + Color.BLUE: 14, + } +) + + +def solve(input: list[str]) -> int: + def parse_round(round: str) -> Round: + values = (value.split(" ") for value in round.split(", ")) + return Counter({Color(c): int(n) for n, c in values}) + + # This does *not* expect the "Game :" bit + def parse_game(game: str) -> Game: + rounds = game.split("; ") + return [parse_round(r) for r in rounds] + + def parse_line(line: str) -> tuple[int, Game]: + game_id, rounds = line.split(": ") + return int(game_id.removeprefix("Game ")), parse_game(rounds) + + def parse(input: list[str]) -> GameRecord: + parsed = map(parse_line, input) + return {id: game for id, game in parsed} + + def game_is_valid(game: Game) -> bool: + for round in game: + for c in Color: + if round[c] > BAG_CONTENTS[c]: + return False + + return True + + games = parse(input) + return sum(id for id, game in games.items() if game_is_valid(game)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 6ebbcdeb115f6dbef53cfe84f853bdea9b4fdd0d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 2 Dec 2023 09:21:54 +0000 Subject: [PATCH 384/479] 2023: d02: ex2: add input --- 2023/d02/ex2/input | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 2023/d02/ex2/input diff --git a/2023/d02/ex2/input b/2023/d02/ex2/input new file mode 100644 index 0000000..70852bf --- /dev/null +++ b/2023/d02/ex2/input @@ -0,0 +1,100 @@ +Game 1: 13 green, 3 red; 4 red, 9 green, 4 blue; 9 green, 10 red, 2 blue +Game 2: 3 red, 8 green, 1 blue; 4 green, 11 blue, 2 red; 3 blue, 2 red, 6 green; 5 green, 15 blue, 1 red; 2 blue, 2 red, 5 green; 12 blue, 7 green, 2 red +Game 3: 1 red, 9 green, 3 blue; 8 green, 4 red, 11 blue; 6 red, 10 blue; 6 green, 6 red, 12 blue; 2 blue, 11 green, 7 red; 12 blue, 9 green, 8 red +Game 4: 7 red, 2 green, 1 blue; 12 green; 12 green +Game 5: 15 red, 3 green, 1 blue; 6 red, 2 blue, 2 green; 3 green, 3 red, 1 blue; 2 blue, 13 red, 5 green; 2 green, 15 red, 2 blue +Game 6: 3 blue, 15 red, 1 green; 8 green, 5 red, 6 blue; 9 green, 5 blue, 6 red; 9 green, 3 blue, 9 red; 10 green, 14 red, 2 blue +Game 7: 6 green, 1 red, 11 blue; 6 green, 1 red, 3 blue; 4 green, 20 blue; 2 red, 5 blue, 4 green; 10 green, 17 blue +Game 8: 10 blue, 9 green, 10 red; 9 green, 1 red; 8 red, 9 green, 9 blue; 5 green, 3 red, 7 blue +Game 9: 7 blue, 1 red; 5 red, 4 green; 4 green, 6 red, 5 blue; 2 green, 4 blue; 3 green, 6 blue, 4 red; 1 green, 3 red, 3 blue +Game 10: 2 red, 2 green, 2 blue; 10 blue, 2 red, 1 green; 2 green, 9 blue, 3 red +Game 11: 8 red, 4 blue, 1 green; 3 red; 1 green; 2 green, 3 blue +Game 12: 10 red, 2 green, 4 blue; 4 red, 2 green; 1 blue, 1 red, 1 green; 10 red, 1 green, 5 blue +Game 13: 20 blue, 9 green, 7 red; 13 red, 13 blue, 16 green; 17 blue, 6 red, 6 green; 1 red, 1 blue, 9 green; 9 blue, 18 green, 7 red +Game 14: 6 blue, 14 red; 9 red, 8 blue; 2 red, 1 green, 8 blue; 3 blue, 1 green, 9 red; 8 blue, 2 green, 1 red +Game 15: 3 red, 1 blue, 5 green; 2 red, 3 green; 5 red, 5 green, 1 blue; 2 green, 6 red; 4 red, 1 blue; 6 red, 1 blue, 1 green +Game 16: 5 blue, 7 red, 2 green; 7 red, 12 blue; 10 blue, 11 green, 5 red; 11 red, 11 blue, 10 green +Game 17: 3 red, 7 blue; 1 blue, 14 green, 4 red; 11 blue, 4 red, 11 green; 18 blue, 5 red, 11 green; 18 blue, 1 red, 8 green +Game 18: 8 green, 2 red, 6 blue; 8 blue, 11 green; 2 red, 11 blue, 9 green +Game 19: 11 red, 9 green, 3 blue; 19 green, 9 red, 2 blue; 19 green, 4 blue, 4 red; 1 green, 11 red; 10 red, 2 green, 4 blue +Game 20: 2 blue, 3 red, 1 green; 1 red, 3 green; 7 blue, 1 green, 4 red; 1 red, 8 blue, 7 green; 6 blue, 3 red; 5 red, 3 blue, 7 green +Game 21: 1 green, 1 blue, 10 red; 1 green, 5 red, 8 blue; 11 red, 4 blue; 6 blue, 6 red +Game 22: 6 blue, 6 green; 8 green, 15 blue; 8 green, 3 blue, 1 red; 11 blue, 2 red, 7 green +Game 23: 1 green, 3 blue, 7 red; 4 red, 1 green, 2 blue; 3 red, 2 blue, 2 green +Game 24: 4 green, 8 blue, 4 red; 2 green, 9 blue; 4 green, 1 red; 2 green, 5 blue, 1 red; 2 blue, 3 red, 3 green; 6 blue +Game 25: 7 blue; 15 blue, 5 red; 6 blue, 12 red; 1 green, 17 red; 13 blue, 5 red; 17 red +Game 26: 1 blue, 3 green, 7 red; 9 red, 4 green, 1 blue; 1 red, 2 green, 1 blue; 11 red, 3 green; 10 red, 4 green, 2 blue; 6 red, 4 green +Game 27: 4 blue, 6 red; 2 blue, 8 red, 1 green; 3 blue, 3 red; 2 red, 1 blue; 1 green, 3 blue, 6 red +Game 28: 1 red, 7 blue, 7 green; 2 green, 1 red, 4 blue; 8 green, 2 red; 2 red, 7 blue, 5 green; 12 green, 5 blue, 2 red; 1 red, 1 green, 2 blue +Game 29: 10 green, 3 red, 6 blue; 9 green, 6 blue, 4 red; 3 red, 2 blue, 17 green +Game 30: 8 blue; 15 blue, 1 red; 10 green, 2 red, 13 blue +Game 31: 10 green, 2 blue, 7 red; 2 green, 1 blue; 1 blue, 15 green, 2 red; 7 green, 2 blue; 3 blue, 6 green, 8 red; 6 red, 1 blue +Game 32: 2 blue, 2 red, 11 green; 10 green, 2 red, 1 blue; 1 green, 2 blue; 2 red, 9 green, 2 blue; 2 blue, 1 green; 5 green, 1 blue, 2 red +Game 33: 8 red, 6 blue; 2 green, 3 red, 2 blue; 1 green, 13 red, 18 blue +Game 34: 7 blue, 5 green; 5 green, 8 blue; 13 blue, 15 red, 2 green +Game 35: 1 blue, 2 green; 9 green; 4 red, 14 green; 1 red, 1 blue, 17 green +Game 36: 2 red, 14 green, 4 blue; 13 green, 3 blue; 1 blue, 7 green, 2 red; 4 blue, 9 green; 1 green, 3 blue, 1 red; 2 red, 4 blue, 10 green +Game 37: 2 blue, 7 green, 5 red; 5 green, 2 blue; 6 blue, 11 red +Game 38: 6 green, 6 red; 9 red, 10 green; 2 blue, 8 green, 8 red +Game 39: 10 red, 3 blue; 5 green, 3 red; 5 red, 7 green +Game 40: 5 red, 14 green, 2 blue; 5 red, 7 blue, 12 green; 2 green, 4 red; 1 red, 16 green, 3 blue; 16 green, 4 red, 7 blue; 9 green, 2 red +Game 41: 4 red, 3 green, 2 blue; 13 green, 6 blue; 2 red, 14 green, 1 blue; 7 blue, 2 red, 14 green +Game 42: 4 red; 1 blue, 5 red; 1 green, 6 red; 1 red, 1 blue; 3 blue, 8 red +Game 43: 7 blue, 16 red, 1 green; 2 red, 6 green, 1 blue; 5 green, 3 red; 5 green, 9 blue, 2 red; 3 red, 9 blue, 4 green; 7 red, 9 blue +Game 44: 2 red, 2 green; 5 red, 1 blue, 8 green; 7 green, 3 blue, 5 red +Game 45: 8 blue, 16 red; 8 blue; 4 blue, 1 green, 8 red +Game 46: 11 green, 9 blue, 1 red; 8 green, 7 blue; 10 blue, 1 red, 1 green; 12 green, 10 blue +Game 47: 3 green, 6 red, 1 blue; 2 blue, 2 green, 12 red; 3 red, 2 green, 1 blue +Game 48: 3 red, 3 green, 3 blue; 3 red, 4 green, 2 blue; 2 green, 7 red, 1 blue; 2 red, 3 blue, 5 green +Game 49: 5 red, 7 blue, 5 green; 10 red, 4 green, 7 blue; 9 red, 17 green; 6 green, 1 red, 2 blue; 7 green, 8 blue, 5 red +Game 50: 2 red, 4 green, 16 blue; 4 blue, 3 red, 8 green; 4 blue, 2 red, 6 green +Game 51: 16 green, 10 red, 14 blue; 8 red, 4 blue, 12 green; 14 green, 7 blue; 6 red, 20 green, 3 blue +Game 52: 1 red, 1 blue, 1 green; 9 green, 9 red; 4 green, 13 red; 7 red, 11 green; 4 red, 1 blue; 8 green, 3 red, 1 blue +Game 53: 4 green, 11 blue; 9 green, 2 red; 6 red, 18 green, 13 blue; 6 red, 2 blue, 14 green +Game 54: 1 green, 1 red, 1 blue; 2 green, 4 blue; 4 blue, 5 green; 3 blue, 1 red, 10 green +Game 55: 8 blue, 2 red, 3 green; 9 red, 11 blue; 1 green, 12 blue, 4 red; 3 green, 17 red; 3 red, 3 green, 15 blue; 7 blue, 7 red, 2 green +Game 56: 3 blue, 13 green; 9 green, 2 blue; 1 red, 2 blue, 16 green +Game 57: 6 blue, 4 red; 3 green, 6 red; 2 red, 3 blue, 3 green; 8 red, 5 blue +Game 58: 4 red, 15 green, 5 blue; 1 red, 16 blue, 14 green; 2 green, 17 blue, 6 red; 20 blue, 3 red, 7 green; 17 green, 1 red, 12 blue +Game 59: 3 blue, 14 red; 5 green, 10 red, 2 blue; 2 blue, 5 red, 6 green +Game 60: 4 red, 1 blue, 1 green; 15 blue; 8 green, 14 blue, 4 red; 9 blue, 3 green, 4 red; 4 green, 2 red, 11 blue; 4 blue, 7 green +Game 61: 5 green, 9 blue, 16 red; 4 blue, 12 green, 4 red; 17 red, 7 green, 5 blue; 19 blue, 12 red, 17 green; 8 green, 13 red +Game 62: 13 green, 1 red, 7 blue; 9 blue, 1 red, 4 green; 14 green, 2 red, 2 blue; 3 green +Game 63: 6 green; 7 red, 3 blue, 8 green; 5 blue, 1 green, 6 red; 6 green, 6 red, 2 blue; 8 green, 2 blue +Game 64: 16 blue, 1 red, 2 green; 4 green, 1 blue, 6 red; 6 green, 2 blue, 2 red; 17 blue; 1 red; 13 blue, 6 green, 1 red +Game 65: 8 red, 3 green, 7 blue; 6 blue, 8 red, 2 green; 2 blue, 3 green, 17 red +Game 66: 2 blue, 3 green, 3 red; 3 red, 2 blue; 5 red, 4 green, 3 blue; 1 blue, 3 green; 2 red, 1 green, 1 blue; 2 blue, 4 green +Game 67: 2 red, 3 blue, 15 green; 2 blue, 2 red, 17 green; 4 blue, 3 red, 2 green; 6 red; 3 red, 8 green +Game 68: 7 red, 1 blue, 12 green; 17 red, 1 green; 10 red, 8 green; 16 red, 5 green, 2 blue; 4 red, 1 blue, 8 green; 8 green, 7 red, 2 blue +Game 69: 17 green, 9 red, 2 blue; 1 blue, 14 green, 3 red; 9 red, 12 green, 2 blue; 11 green, 2 blue, 7 red +Game 70: 1 green, 8 blue, 2 red; 2 red, 10 green, 1 blue; 1 red, 12 green, 6 blue; 9 green, 4 blue, 4 red; 2 red, 6 green; 3 red, 8 green, 6 blue +Game 71: 1 red, 5 blue; 12 blue, 3 red; 3 red, 2 green, 4 blue; 5 blue, 3 green, 1 red +Game 72: 11 red, 6 blue; 1 red, 1 blue, 1 green; 2 blue, 7 red; 18 blue, 3 red; 1 green, 1 blue, 12 red +Game 73: 4 red, 2 blue, 1 green; 3 red; 5 red, 1 blue; 4 blue, 6 red +Game 74: 2 red; 2 red, 5 green; 4 green, 1 red, 1 blue; 1 blue, 5 green, 5 red; 7 red, 1 blue, 3 green; 8 red, 1 blue, 6 green +Game 75: 13 blue, 2 red, 2 green; 2 red, 9 blue; 2 red, 9 blue, 5 green +Game 76: 2 red, 3 green, 18 blue; 2 red, 11 green, 5 blue; 6 green, 8 blue, 2 red; 4 blue; 7 green, 14 blue +Game 77: 5 blue, 8 red, 1 green; 2 blue, 5 green, 12 red; 3 red, 4 blue +Game 78: 1 blue, 2 green, 16 red; 2 red, 3 green; 1 red, 4 green, 2 blue; 11 red; 2 green, 12 red, 2 blue; 11 red, 5 green, 3 blue +Game 79: 10 green, 3 blue, 2 red; 8 red, 3 blue, 8 green; 5 green, 3 red, 11 blue; 9 green, 16 blue +Game 80: 1 red, 4 blue; 6 green, 1 red; 6 green, 3 blue, 1 red; 6 green, 2 red; 7 green, 1 blue; 2 red, 2 blue, 2 green +Game 81: 10 blue, 4 red, 4 green; 5 green, 1 red, 7 blue; 11 blue, 8 green, 2 red; 8 green, 2 red +Game 82: 12 green, 1 red, 3 blue; 6 red, 1 blue; 16 green, 3 red, 4 blue; 8 blue; 7 blue, 7 green, 2 red; 4 red, 19 green +Game 83: 4 red, 4 blue, 3 green; 8 blue, 4 green, 6 red; 6 green, 7 blue, 6 red; 11 red, 6 green, 7 blue +Game 84: 11 red, 2 green, 2 blue; 20 green, 2 blue, 13 red; 15 red, 6 green, 3 blue; 17 green, 7 red +Game 85: 3 blue, 5 green, 2 red; 12 green, 2 blue, 1 red; 7 blue, 6 green, 5 red; 11 red, 2 blue, 17 green; 11 blue, 11 red, 17 green; 18 green, 9 red, 13 blue +Game 86: 1 blue, 14 red; 4 green, 1 blue, 3 red; 2 green, 1 blue, 13 red; 1 green, 1 blue, 10 red +Game 87: 2 red, 5 green, 4 blue; 3 blue, 9 red, 6 green; 7 blue, 9 red, 11 green; 10 green, 11 red, 9 blue; 7 green, 12 red, 4 blue; 5 blue, 1 red, 7 green +Game 88: 11 red, 1 green; 9 blue, 4 green, 7 red; 10 red, 4 green, 1 blue; 4 green, 1 red, 1 blue; 10 blue, 1 red, 3 green; 2 green, 12 blue, 11 red +Game 89: 3 green, 3 blue; 1 red, 7 green, 9 blue; 8 red, 11 blue, 11 green; 2 green, 6 blue, 5 red; 5 blue, 9 green +Game 90: 3 blue, 10 red, 2 green; 2 blue; 8 red +Game 91: 2 red, 10 green, 2 blue; 9 blue; 8 green, 5 red, 10 blue; 7 green, 6 blue, 5 red; 1 green, 6 red, 12 blue; 1 red, 4 green, 3 blue +Game 92: 12 blue, 5 red, 2 green; 4 blue, 1 red, 3 green; 6 red, 6 blue; 1 blue, 8 red, 6 green; 6 blue, 3 red, 2 green; 7 green, 4 red, 1 blue +Game 93: 3 blue; 8 blue; 3 blue, 2 red; 2 red, 1 green +Game 94: 5 red, 7 blue, 6 green; 15 red, 7 blue, 4 green; 6 blue, 1 red, 2 green; 7 green, 4 blue, 17 red; 12 red, 5 green, 1 blue +Game 95: 7 blue, 11 red, 9 green; 10 red, 6 blue, 7 green; 6 blue, 6 red, 7 green +Game 96: 2 red, 1 green, 3 blue; 3 blue, 1 green; 1 green, 1 blue; 1 red, 1 blue; 1 green, 1 red, 4 blue +Game 97: 6 red, 1 blue, 7 green; 2 blue, 5 red, 7 green; 8 red, 3 blue, 6 green; 6 green, 1 red, 3 blue; 5 red, 2 blue, 14 green; 3 green, 6 red, 6 blue +Game 98: 9 red, 14 blue; 19 red, 4 blue; 11 red, 17 blue; 14 blue, 1 green, 18 red +Game 99: 1 green, 1 red, 12 blue; 2 green, 4 red, 14 blue; 4 blue, 6 red; 10 red, 2 green, 1 blue +Game 100: 5 red, 9 green, 2 blue; 9 blue, 6 green, 1 red; 8 blue, 7 green, 3 red From 3aa39588edacf496afa0fa4029aeba560f3d82c6 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 2 Dec 2023 09:22:01 +0000 Subject: [PATCH 385/479] 2023: d02: ex2: add solution --- 2023/d02/ex2/ex2.py | 69 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100755 2023/d02/ex2/ex2.py diff --git a/2023/d02/ex2/ex2.py b/2023/d02/ex2/ex2.py new file mode 100755 index 0000000..32c3a34 --- /dev/null +++ b/2023/d02/ex2/ex2.py @@ -0,0 +1,69 @@ +#!/usr/bin/env python + +import math +import sys +from collections import Counter +from enum import StrEnum + + +class Color(StrEnum): + RED = "red" + GREEN = "green" + BLUE = "blue" + + +Round = Counter[Color] +Game = list[Round] + +# The input is in order without skipping, but just in case... +GameRecord = dict[int, Game] + +BAG_CONTENTS = Counter( + { + Color.RED: 12, + Color.GREEN: 13, + Color.BLUE: 14, + } +) + + +def solve(input: list[str]) -> int: + def parse_round(round: str) -> Round: + values = (value.split(" ") for value in round.split(", ")) + return Counter({Color(c): int(n) for n, c in values}) + + # This does *not* expect the "Game :" bit + def parse_game(game: str) -> Game: + rounds = game.split("; ") + return [parse_round(r) for r in rounds] + + def parse_line(line: str) -> tuple[int, Game]: + game_id, rounds = line.split(": ") + return int(game_id.removeprefix("Game ")), parse_game(rounds) + + def parse(input: list[str]) -> GameRecord: + parsed = map(parse_line, input) + return {id: game for id, game in parsed} + + def min_cubes(game: Game) -> dict[Color, int]: + res = Counter({c: 0 for c in Color}) + + for r in game: + res |= r + + return res + + def power(game: Game) -> int: + return math.prod(min_cubes(game).values()) + + games = parse(input) + return sum(map(power, games.values())) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 05f80dc3ded34ea50d5a4c5d08c9dbf9774768e6 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 3 Dec 2023 15:16:50 +0000 Subject: [PATCH 386/479] 2023: d03: ex1: add input --- 2023/d03/ex1/input | 140 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 2023/d03/ex1/input diff --git a/2023/d03/ex1/input b/2023/d03/ex1/input new file mode 100644 index 0000000..6f8ccb8 --- /dev/null +++ b/2023/d03/ex1/input @@ -0,0 +1,140 @@ +..........................................389.314.................206......................449.523..................138..................... +.........+.....954......723..........................................*.............687.....*..........692..........*........................ +121......992...............*.......%585....814............936.......102..#353.........*.....140.........*..434..301..................%..315. +.../....................877................*...523............489.................*....380.......174..263.@..............824......710....... +...........$..733*758.......435...656...483.....................*..%855........154.779.....674...............320+....+........373........... +........707......................................503.422...591.551......676............306...*....................220..........@..410..639.. +..................+....146.486.772..................*........*.....+848..*...863........-.....405........../..............636........*...... +........190.....313.&.....*...../...+738..397.....@........#.840........167.../......#....508.......498..819..............*.........147.313. +....692*............177........................727..364..800.......................748..../........*...........%733......993.854........+... +...........*..............245..........128.............*.................322......................305....7*.......................152....... +........978.160..378.........*524.......*..905.343..+.681......615......-..........................................$..........@............. +.251..................................417.....*....53...........*...........354*126........119$...942....424....863...518*....971..96.48.... +.................92.....441.681...532........................257.....932..............%...................*...............64.........*...... +...........2.235*..........*..........*318.......317............................383.567..705.923..716.409.68.......................*........ +...........*...................638..72...........+......367........802.........&..............=....*..*................-.../....401.773..... +........535...................*............4.29..........*.....784*....526........................141.342.189........630..958............... +...../.........745..+118....639....702.....%...#.*327...741............*......./324......531....................648/..............566....... +...+..172.........*.................................................910.....@.............*.....939................................*........ +.799......37.307..140........334....@..204.852......+.....104............914..553..........994.&........547.#539........588$.......436...... +.........*......*............*....12..../...&..914..223...$......+...........*....953+.......................................62........&.... +........311.98.317...595..467................................#..142......*...620........$.......795.....363..135/..968...222.*....448...754. +...................../...............*702..881...............31.......630...............834........*.......-.........*.....*.527....*....... +..............614...........640+..888.......*....360........................%....764...............859.......586.....979.514.......30....... +.........@538........=...................176......*..200.300..............708...=......460...503..............*...............385........... +....................896.......$...................14....*..../........404..........-..*.......*.............688.460....$......&............. +......677...................110......&..-.....549..........934....654...-....334..153.508.....556......913........*....199........513....... +.........*....-...=204..342........515..85......./..955............../.......*..............-......18.*..........601..........+.......280... +.........80..515.........*.......$.........259...............250.../.......3..337.......%83..972..*....586.5.651......594....484............ +..........................126.121......935*......235.815.......*.887........*........34..........294........*............$..............@... +45......$..651....$...............................*.........526.............41......*......302...................530..........@819.......463 +.....710......*....26................734.......791......565............625.......%.887........@.......381..741..*........................... +......................881...........*............................989......+....235..............491...*...-.....693.........16.............. +.............589*.....*.............610...318..#187..945@..774............................491.....*...867..................$...........679.. +........957......614..553....345*56......#..................*...658.870........895......%........714......749...13.......................... +...........$....................................127........775.....*......988..*.........254.276.................*..560.950.............*... +....761.................................825.........495..............496.....+.87.............*....*....689..26....*.....*...........131.745 +639...*.196.....993*.......................*.603......*.............%................637....951.720........*......167...28.................. +........./....-.....503........$.........634....*476...887.....463....221....457.........................698....................413.539*.... +672..116...415................641....911...................774........*.......*.....................................926.674*693..&......103. +....*....%.....246.....................*...............290*.........59..542.253..$.....&......=.......320....196*...................586..... +...630..165....=...*.................690...360...........................*........42..584..650...153...*.........191........#218.....*...... +.............*......51....680....102........*.......112...-....190......499.889&.................-...28....*........................340..... +...*729...130.683...........*....*.......776...928.....*..351....*...............878....................681.889...564*55................/760 +839.................226...246...719..954.............428.........663.......341...+...357..................................../394............ +......................*..............................................................*.....=910....821.........242......955......*569....... +......964.381.........923.....................491..906.....614........937....471..491....*........*....512....$...............574........... +........+..+.......................893..22.....*...........*............*.......@.........378......675./..........$103...................... +...............525......$..=35....+.....*...301.......162.872......910.889.354............................871.679......894......731......... +...178........*.......543............865................*.....*857...........................630...........*....*.....@........&............ +....#........954...............................433&..615...828............................*.....*745...+...556..321..................342.... +..........................422...+..130.154.........................+..............225..235.501.........189..............609...............91 +.....%........192....264.....$.609....*.....6..........932=.....*...920...........+...............391..............934.....*..211...=....... +.....805........*.......*975................$....159.........713....................&.850..$924.....-.....%..........*..212...*....176...... +.............&..381..........917.905................*...276.............352...524.878..-........#......867....769.152........484.......341.. +..664..390..140.......&.......*.........566.........163...*.&....995.....*...*..................811..............................874*....... +....=....$............43......989..............239......917..131.......13.....806....................................................174.... +...........184..72.................=......928.....................684.....118.............239.........................#.....$............... +.609...116...*..*..........241...826.......*.......312......779=.....*...*......871.475...*...883.......717..538....-.581....424......259... +...*....*...33..574......&..%..................647*................378....803...*....#..260..*......543.-.......+.76..............464...*... +...611...42..............40...............375..........30......371............666...........185.....*.................161&........*.....968. +....................295.........-............-..................+......................*............789.........548................993...... +..616....5.........*..........662.760............*670......272...........951........501.248....317......752.............616..739............ +..........#..113..192..............$....267...761..........*...192.............456..............*.......*..........572....#....*............ +............%...........606.............*...........628*.........*.342*503.....*...........409.......310........................516....316.. +......622...................181.........454.............491....738...........214....#.........*..........937.....764#.......+............... +.........*..391=.....836...%.......................183..............402.............825...*....921..843...*.............+..897......546..... +.......264..............-..................$471........................*...174$.921........276.......*...513.......598.691............*..... +................$.64.......439......445..........701.......377...491%.422...........591........658...426.....*689..*.........687...=...175.. +..171....429.260.............+........#...513.......*.....*...............477*..........375..&............641.....108..............444...... +.....#....*.....................779..........*......140.24....................22.........@..28.............................................. +.......682.....348+.153.168@......%.451.627.236.............92.141.....393........669.....................75.......557...585...826......559. +......................*.............*............881.........*....*776...*.105......*...=....#....&........&.526..+............#........%... +....955.....410......566..760....760........586....*....*...560........548.......335...951...749...256.........*......313....$...888........ +...*....45.................*...................*..798.199....................77........................280&...347.207.@.....495............. +.934....*...36....841......952......266*....997............840...$867.......*....179...........@...................*.....86.....759..33*.... +.......576...........*..........953....................722....%.............22..*...............952......965&.....777.....*....*........371. +..795................987....490..*..............................904.....4.......598....................................635..328............. +...............=563........#....270..........*.............=.......*..........+...............453.689.............=...................992... +...+......752..........................790...608.......914..69.....250.....200....996..892....=...*................472...@.............#.... +..710......../.......604.................*.......401..=.............................*.#...........622...742..............685....&........... +......284..#............*.......401...802..........*...............65......166....901.....$..196*............65*................369......... +............815..................*........925....529........262....*........*...........234......729..37+.......95.......401................ +.704..499%..........775....%....475....................287........379.......597....=...............................527..*.......264$........ +................728*.......766......619*.....#604........./.75....................834....*.................912....*.....715................. +.......981.556..........................389........888.......*...............734......862.378...412........*......................556*...... +..........*........................213........68..........696...............*.....................*.........726..678...@...931........991... +.../........=..............349.......*.........*....477.%.........#...=....7..............313...27....896.........*...13.................... +...61..386.357.....=......*.......471.........126..&....579.....772....828..........322..*...............#.....644................844....... +.......*.......&.159...263............457...........................................@...772.....$...803..........................*....$158.. +....202.....133......................*.................................362..................841.322...*..........730...868.....116.......... +..........-.......................221..................41.................*...........=......*.........508.............=............465..... +...*667...979.983......................905..../......-.....321$.......731.690..........190.999....=.........*759....................*...515. +905...........*...............58.........*..801.....199..........305.=...........168.............298......25......&...604..........434...... +..........531.217..497-.......*.......744.........................*......791.......*.................633.........657....................952. +......241...&...............675.156................831.........800..859...$....484.894...294......@....................825.655..627......... +.....*.............................*.586......790..*...178......................................716...*.......618.808-........*....*794..... +....401..+.....708.897.....655...351.../.426...*...148.....................798..........594............827...............166..784........... +........754.........&.......*...............+.............14....93..87.....@............*....205...-....................*..........224...... +............784............88....................18.977..............*...................726...*....56.....575.........139..........*....... +.652...........*......*304.....*574.714.397........*.......*920...376....*....................627..........*................208...504.609... +.........535.......280......330.......=.*...............257...........+...738..@...271..453.................55....971......*..........@..... +..185.....%...931......%762.............902.........837..............922......34........*....915*.................*....%....158............. +.............................107.............*92.......*770...991*...................130.........256...910.....550......783............675.. +....993........../...........*.........516.......*87..............147......268............................*........492*................*.... +............190...611.....450...$.......*.....828....840.......................514.........................24..361.....485.......*504...778. +...............................809.486.552.........&....$....................=....*....206......576..595..........*382...................... +...288..................$625........*..............382........318...........869.344..............*...&.....=361...................298....... +..............171..=525.............912...593..........@407......=....%43....................193.................676....&160...../.......... +.................#.......262..............*.....259&............................724......35.....*879...............*........................ +...........327..........-..........%...247...................381...................*32.......................183..735...............171..... +............$....................178.............925..70....*...............235................363......................97.764.792..*....... +.250..................*471............#....975....$.....*..42...13*687.............934...181....*.....62....532..9............*.....678..... +....*.......714.53..........245.....598...*..........251.......................116*.....*........269...=................483...../.......%... +....387......*..........498*............519........=..........$.......................600....373..........746.497..........#.248.........512 +...........42....647.............776.........9......601....560.....696....267..................%....102...........250............289.33*.... +......................667....793*......=521../.....................+........*......#....81.............*996.........*.............*.....713. +...........92............#.........*..................708................799...736.369....*.................-...779................439...... +......484...*....655.......555..471.707....-..441....*.....882$........$.........=.........797........374..196...*...................../.... +......../...284.............*...........297../....378................660.......*.....694.......709...*............499.................300... +..931...........752.986.805...................................52.783........887.127.....*........*...221....................=....../........ +...*.......105.&.........*....141........................186.............-...............134....408......*230../709..767.....446.413........ +..619.......*.......444...903.*.......594............446*.......*.........151.........................108..............*...............876.. +............204.490...........285..74*.....898..373..........243....269+......616.....242........682..................923..582.....508*..... +486...=.........%.............................*..*...........................*......#.*............*.807..........*.......*....429.......... +.....28.&.............416......851..968.....29..327.782..............706.....529..269.379........939...*...#...902.243..703................. +796......890.........*.........*....&...............*.......*...........*...................136.......944..52................@........451... +......................40..123...222..........52...408....995.......#149..708....$722....770*....*492.............714...%......99........%... +.....759.............................138+...+................................................517.......$....874.-.......54.................. +.....*........................................=.......-......61...129.........517+...............264..130...*.....16........................ +......769..176.........663..198...44.102...983......753..486...-.....*874.796.........-..........-...........941..../....973...........#.... +...........@....74.......=.*........*..........$895.......=.......*......../........235....282.......243.......................337......69.. +....................$.....................704..................283.328..........................218.............744............&...%82...... +...........#.........252.......984............799.210..153..............699.29..........99............................*....648.............. +............687..320.....518......*.............*.*.....#...........2...&...*...........*..19.356*......313.994.467..984...+................ +.......#40..........*.....#...@....473.......789................/...*.......902......987..........179......*.................382..519....... +......................*.......11...............................926..153.#.................725*................................*.....*....... +...358...527..345..746.978....................*.........................607..798..899.........86.........*478.......888....949..767..807.... +.....*...*.......%..............743*715..723...56................81.........*....=........345.........802.......776*...............$........ +....26.743..........&943.................................................971.................%....527.................*....%...........@.... +........................................782...............665......................532.......................998...991.702.542....406.779... From c2167dbfc93aa327ec0829935efb32362b1f8e67 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 3 Dec 2023 15:16:56 +0000 Subject: [PATCH 387/479] 2023: d03: ex1: add solution --- 2023/d03/ex1/ex1.py | 91 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100755 2023/d03/ex1/ex1.py diff --git a/2023/d03/ex1/ex1.py b/2023/d03/ex1/ex1.py new file mode 100755 index 0000000..36cb548 --- /dev/null +++ b/2023/d03/ex1/ex1.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python + +import sys +from collections.abc import Iterator +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class SchematicNumber(NamedTuple): + value: int + start: Point + + def neighbours(self) -> Iterator["Point"]: + # How long is the number + length = len(str(self.value)) + + # Every point to the left + for dx in range(-1, 1 + 1): + yield Point(self.start.x + dx, self.start.y - 1) + + # Every point below/above + for dy in range(length): + for dx in (-1, 1): + yield Point(self.start.x + dx, self.start.y + dy) + + # Every point to the right + for dx in range(-1, 1 + 1): + yield Point(self.start.x + dx, self.start.y + length) + + +SymbolsMap = dict[Point, str] + + +def parse_line(x: int, line: str) -> tuple[set[SchematicNumber], SymbolsMap]: + numbers: set[SchematicNumber] = set() + symbols: SymbolsMap = {} + + y = 0 + while y != len(line): + char = line[y] + pos = Point(x, y) + if char.isdigit(): + dy = 0 + while (y + dy) < len(line) and (line[y + dy]).isdigit(): + dy += 1 + numbers.add(SchematicNumber(value=int(line[y : y + dy]), start=pos)) + y += dy + continue + elif char == ".": + pass + else: + symbols[pos] = char + y += 1 + + return numbers, symbols + + +def parse(input: list[str]) -> tuple[set[SchematicNumber], SymbolsMap]: + numbers: set[SchematicNumber] = set() + symbols: SymbolsMap = {} + + for x, line in enumerate(input): + new_numbers, new_symbols = parse_line(x, line) + numbers |= new_numbers + symbols |= new_symbols + + return numbers, symbols + + +def solve(input: list[str]) -> int: + numbers, symbols = parse(input) + part_numbers: set[SchematicNumber] = set() + + for n in numbers: + if any(p in symbols for p in n.neighbours()): + part_numbers.add(n) + + return sum(n.value for n in part_numbers) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 146529433ca031e073fca2dd2713765647cd0149 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 3 Dec 2023 15:17:02 +0000 Subject: [PATCH 388/479] 2023: d03: ex2: add input --- 2023/d03/ex2/input | 140 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 2023/d03/ex2/input diff --git a/2023/d03/ex2/input b/2023/d03/ex2/input new file mode 100644 index 0000000..6f8ccb8 --- /dev/null +++ b/2023/d03/ex2/input @@ -0,0 +1,140 @@ +..........................................389.314.................206......................449.523..................138..................... +.........+.....954......723..........................................*.............687.....*..........692..........*........................ +121......992...............*.......%585....814............936.......102..#353.........*.....140.........*..434..301..................%..315. +.../....................877................*...523............489.................*....380.......174..263.@..............824......710....... +...........$..733*758.......435...656...483.....................*..%855........154.779.....674...............320+....+........373........... +........707......................................503.422...591.551......676............306...*....................220..........@..410..639.. +..................+....146.486.772..................*........*.....+848..*...863........-.....405........../..............636........*...... +........190.....313.&.....*...../...+738..397.....@........#.840........167.../......#....508.......498..819..............*.........147.313. +....692*............177........................727..364..800.......................748..../........*...........%733......993.854........+... +...........*..............245..........128.............*.................322......................305....7*.......................152....... +........978.160..378.........*524.......*..905.343..+.681......615......-..........................................$..........@............. +.251..................................417.....*....53...........*...........354*126........119$...942....424....863...518*....971..96.48.... +.................92.....441.681...532........................257.....932..............%...................*...............64.........*...... +...........2.235*..........*..........*318.......317............................383.567..705.923..716.409.68.......................*........ +...........*...................638..72...........+......367........802.........&..............=....*..*................-.../....401.773..... +........535...................*............4.29..........*.....784*....526........................141.342.189........630..958............... +...../.........745..+118....639....702.....%...#.*327...741............*......./324......531....................648/..............566....... +...+..172.........*.................................................910.....@.............*.....939................................*........ +.799......37.307..140........334....@..204.852......+.....104............914..553..........994.&........547.#539........588$.......436...... +.........*......*............*....12..../...&..914..223...$......+...........*....953+.......................................62........&.... +........311.98.317...595..467................................#..142......*...620........$.......795.....363..135/..968...222.*....448...754. +...................../...............*702..881...............31.......630...............834........*.......-.........*.....*.527....*....... +..............614...........640+..888.......*....360........................%....764...............859.......586.....979.514.......30....... +.........@538........=...................176......*..200.300..............708...=......460...503..............*...............385........... +....................896.......$...................14....*..../........404..........-..*.......*.............688.460....$......&............. +......677...................110......&..-.....549..........934....654...-....334..153.508.....556......913........*....199........513....... +.........*....-...=204..342........515..85......./..955............../.......*..............-......18.*..........601..........+.......280... +.........80..515.........*.......$.........259...............250.../.......3..337.......%83..972..*....586.5.651......594....484............ +..........................126.121......935*......235.815.......*.887........*........34..........294........*............$..............@... +45......$..651....$...............................*.........526.............41......*......302...................530..........@819.......463 +.....710......*....26................734.......791......565............625.......%.887........@.......381..741..*........................... +......................881...........*............................989......+....235..............491...*...-.....693.........16.............. +.............589*.....*.............610...318..#187..945@..774............................491.....*...867..................$...........679.. +........957......614..553....345*56......#..................*...658.870........895......%........714......749...13.......................... +...........$....................................127........775.....*......988..*.........254.276.................*..560.950.............*... +....761.................................825.........495..............496.....+.87.............*....*....689..26....*.....*...........131.745 +639...*.196.....993*.......................*.603......*.............%................637....951.720........*......167...28.................. +........./....-.....503........$.........634....*476...887.....463....221....457.........................698....................413.539*.... +672..116...415................641....911...................774........*.......*.....................................926.674*693..&......103. +....*....%.....246.....................*...............290*.........59..542.253..$.....&......=.......320....196*...................586..... +...630..165....=...*.................690...360...........................*........42..584..650...153...*.........191........#218.....*...... +.............*......51....680....102........*.......112...-....190......499.889&.................-...28....*........................340..... +...*729...130.683...........*....*.......776...928.....*..351....*...............878....................681.889...564*55................/760 +839.................226...246...719..954.............428.........663.......341...+...357..................................../394............ +......................*..............................................................*.....=910....821.........242......955......*569....... +......964.381.........923.....................491..906.....614........937....471..491....*........*....512....$...............574........... +........+..+.......................893..22.....*...........*............*.......@.........378......675./..........$103...................... +...............525......$..=35....+.....*...301.......162.872......910.889.354............................871.679......894......731......... +...178........*.......543............865................*.....*857...........................630...........*....*.....@........&............ +....#........954...............................433&..615...828............................*.....*745...+...556..321..................342.... +..........................422...+..130.154.........................+..............225..235.501.........189..............609...............91 +.....%........192....264.....$.609....*.....6..........932=.....*...920...........+...............391..............934.....*..211...=....... +.....805........*.......*975................$....159.........713....................&.850..$924.....-.....%..........*..212...*....176...... +.............&..381..........917.905................*...276.............352...524.878..-........#......867....769.152........484.......341.. +..664..390..140.......&.......*.........566.........163...*.&....995.....*...*..................811..............................874*....... +....=....$............43......989..............239......917..131.......13.....806....................................................174.... +...........184..72.................=......928.....................684.....118.............239.........................#.....$............... +.609...116...*..*..........241...826.......*.......312......779=.....*...*......871.475...*...883.......717..538....-.581....424......259... +...*....*...33..574......&..%..................647*................378....803...*....#..260..*......543.-.......+.76..............464...*... +...611...42..............40...............375..........30......371............666...........185.....*.................161&........*.....968. +....................295.........-............-..................+......................*............789.........548................993...... +..616....5.........*..........662.760............*670......272...........951........501.248....317......752.............616..739............ +..........#..113..192..............$....267...761..........*...192.............456..............*.......*..........572....#....*............ +............%...........606.............*...........628*.........*.342*503.....*...........409.......310........................516....316.. +......622...................181.........454.............491....738...........214....#.........*..........937.....764#.......+............... +.........*..391=.....836...%.......................183..............402.............825...*....921..843...*.............+..897......546..... +.......264..............-..................$471........................*...174$.921........276.......*...513.......598.691............*..... +................$.64.......439......445..........701.......377...491%.422...........591........658...426.....*689..*.........687...=...175.. +..171....429.260.............+........#...513.......*.....*...............477*..........375..&............641.....108..............444...... +.....#....*.....................779..........*......140.24....................22.........@..28.............................................. +.......682.....348+.153.168@......%.451.627.236.............92.141.....393........669.....................75.......557...585...826......559. +......................*.............*............881.........*....*776...*.105......*...=....#....&........&.526..+............#........%... +....955.....410......566..760....760........586....*....*...560........548.......335...951...749...256.........*......313....$...888........ +...*....45.................*...................*..798.199....................77........................280&...347.207.@.....495............. +.934....*...36....841......952......266*....997............840...$867.......*....179...........@...................*.....86.....759..33*.... +.......576...........*..........953....................722....%.............22..*...............952......965&.....777.....*....*........371. +..795................987....490..*..............................904.....4.......598....................................635..328............. +...............=563........#....270..........*.............=.......*..........+...............453.689.............=...................992... +...+......752..........................790...608.......914..69.....250.....200....996..892....=...*................472...@.............#.... +..710......../.......604.................*.......401..=.............................*.#...........622...742..............685....&........... +......284..#............*.......401...802..........*...............65......166....901.....$..196*............65*................369......... +............815..................*........925....529........262....*........*...........234......729..37+.......95.......401................ +.704..499%..........775....%....475....................287........379.......597....=...............................527..*.......264$........ +................728*.......766......619*.....#604........./.75....................834....*.................912....*.....715................. +.......981.556..........................389........888.......*...............734......862.378...412........*......................556*...... +..........*........................213........68..........696...............*.....................*.........726..678...@...931........991... +.../........=..............349.......*.........*....477.%.........#...=....7..............313...27....896.........*...13.................... +...61..386.357.....=......*.......471.........126..&....579.....772....828..........322..*...............#.....644................844....... +.......*.......&.159...263............457...........................................@...772.....$...803..........................*....$158.. +....202.....133......................*.................................362..................841.322...*..........730...868.....116.......... +..........-.......................221..................41.................*...........=......*.........508.............=............465..... +...*667...979.983......................905..../......-.....321$.......731.690..........190.999....=.........*759....................*...515. +905...........*...............58.........*..801.....199..........305.=...........168.............298......25......&...604..........434...... +..........531.217..497-.......*.......744.........................*......791.......*.................633.........657....................952. +......241...&...............675.156................831.........800..859...$....484.894...294......@....................825.655..627......... +.....*.............................*.586......790..*...178......................................716...*.......618.808-........*....*794..... +....401..+.....708.897.....655...351.../.426...*...148.....................798..........594............827...............166..784........... +........754.........&.......*...............+.............14....93..87.....@............*....205...-....................*..........224...... +............784............88....................18.977..............*...................726...*....56.....575.........139..........*....... +.652...........*......*304.....*574.714.397........*.......*920...376....*....................627..........*................208...504.609... +.........535.......280......330.......=.*...............257...........+...738..@...271..453.................55....971......*..........@..... +..185.....%...931......%762.............902.........837..............922......34........*....915*.................*....%....158............. +.............................107.............*92.......*770...991*...................130.........256...910.....550......783............675.. +....993........../...........*.........516.......*87..............147......268............................*........492*................*.... +............190...611.....450...$.......*.....828....840.......................514.........................24..361.....485.......*504...778. +...............................809.486.552.........&....$....................=....*....206......576..595..........*382...................... +...288..................$625........*..............382........318...........869.344..............*...&.....=361...................298....... +..............171..=525.............912...593..........@407......=....%43....................193.................676....&160...../.......... +.................#.......262..............*.....259&............................724......35.....*879...............*........................ +...........327..........-..........%...247...................381...................*32.......................183..735...............171..... +............$....................178.............925..70....*...............235................363......................97.764.792..*....... +.250..................*471............#....975....$.....*..42...13*687.............934...181....*.....62....532..9............*.....678..... +....*.......714.53..........245.....598...*..........251.......................116*.....*........269...=................483...../.......%... +....387......*..........498*............519........=..........$.......................600....373..........746.497..........#.248.........512 +...........42....647.............776.........9......601....560.....696....267..................%....102...........250............289.33*.... +......................667....793*......=521../.....................+........*......#....81.............*996.........*.............*.....713. +...........92............#.........*..................708................799...736.369....*.................-...779................439...... +......484...*....655.......555..471.707....-..441....*.....882$........$.........=.........797........374..196...*...................../.... +......../...284.............*...........297../....378................660.......*.....694.......709...*............499.................300... +..931...........752.986.805...................................52.783........887.127.....*........*...221....................=....../........ +...*.......105.&.........*....141........................186.............-...............134....408......*230../709..767.....446.413........ +..619.......*.......444...903.*.......594............446*.......*.........151.........................108..............*...............876.. +............204.490...........285..74*.....898..373..........243....269+......616.....242........682..................923..582.....508*..... +486...=.........%.............................*..*...........................*......#.*............*.807..........*.......*....429.......... +.....28.&.............416......851..968.....29..327.782..............706.....529..269.379........939...*...#...902.243..703................. +796......890.........*.........*....&...............*.......*...........*...................136.......944..52................@........451... +......................40..123...222..........52...408....995.......#149..708....$722....770*....*492.............714...%......99........%... +.....759.............................138+...+................................................517.......$....874.-.......54.................. +.....*........................................=.......-......61...129.........517+...............264..130...*.....16........................ +......769..176.........663..198...44.102...983......753..486...-.....*874.796.........-..........-...........941..../....973...........#.... +...........@....74.......=.*........*..........$895.......=.......*......../........235....282.......243.......................337......69.. +....................$.....................704..................283.328..........................218.............744............&...%82...... +...........#.........252.......984............799.210..153..............699.29..........99............................*....648.............. +............687..320.....518......*.............*.*.....#...........2...&...*...........*..19.356*......313.994.467..984...+................ +.......#40..........*.....#...@....473.......789................/...*.......902......987..........179......*.................382..519....... +......................*.......11...............................926..153.#.................725*................................*.....*....... +...358...527..345..746.978....................*.........................607..798..899.........86.........*478.......888....949..767..807.... +.....*...*.......%..............743*715..723...56................81.........*....=........345.........802.......776*...............$........ +....26.743..........&943.................................................971.................%....527.................*....%...........@.... +........................................782...............665......................532.......................998...991.702.542....406.779... From 20d7292d10b29918bd8afac0ed4bb70f1a439528 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 3 Dec 2023 15:17:08 +0000 Subject: [PATCH 389/479] 2023: d03: ex2: add solution --- 2023/d03/ex2/ex2.py | 100 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100755 2023/d03/ex2/ex2.py diff --git a/2023/d03/ex2/ex2.py b/2023/d03/ex2/ex2.py new file mode 100755 index 0000000..6cf3d80 --- /dev/null +++ b/2023/d03/ex2/ex2.py @@ -0,0 +1,100 @@ +#!/usr/bin/env python + +import sys +from collections import defaultdict +from collections.abc import Iterator +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class SchematicNumber(NamedTuple): + value: int + start: Point + + def neighbours(self) -> Iterator["Point"]: + # How long is the number + length = len(str(self.value)) + + # Every point to the left + for dx in range(-1, 1 + 1): + yield Point(self.start.x + dx, self.start.y - 1) + + # Every point below/above + for dy in range(length): + for dx in (-1, 1): + yield Point(self.start.x + dx, self.start.y + dy) + + # Every point to the right + for dx in range(-1, 1 + 1): + yield Point(self.start.x + dx, self.start.y + length) + + +SymbolsMap = dict[Point, str] + + +def parse_line(x: int, line: str) -> tuple[set[SchematicNumber], SymbolsMap]: + numbers: set[SchematicNumber] = set() + symbols: SymbolsMap = {} + + y = 0 + while y != len(line): + char = line[y] + pos = Point(x, y) + if char.isdigit(): + dy = 0 + while (y + dy) < len(line) and (line[y + dy]).isdigit(): + dy += 1 + numbers.add(SchematicNumber(value=int(line[y : y + dy]), start=pos)) + y += dy + continue + elif char == ".": + pass + else: + symbols[pos] = char + y += 1 + + return numbers, symbols + + +def parse(input: list[str]) -> tuple[set[SchematicNumber], SymbolsMap]: + numbers: set[SchematicNumber] = set() + symbols: SymbolsMap = {} + + for x, line in enumerate(input): + new_numbers, new_symbols = parse_line(x, line) + numbers |= new_numbers + symbols |= new_symbols + + return numbers, symbols + + +def solve(input: list[str]) -> int: + numbers, symbols = parse(input) + gear_adjacency: dict[Point, list[SchematicNumber]] = defaultdict(list) + + for n in numbers: + for p in n.neighbours(): + if not symbols.get(p) == "*": + continue + gear_adjacency[p].append(n) + + gear_power = [ + nums[0].value * nums[1].value + for nums in gear_adjacency.values() + if len(nums) == 2 + ] + + return sum(gear_power) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 1490fe1309e1f44c72b2a0f5820c4edf88b0d9d3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 4 Dec 2023 11:10:34 +0000 Subject: [PATCH 390/479] 2023: d04: ex1: add input --- 2023/d04/ex1/input | 203 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 2023/d04/ex1/input diff --git a/2023/d04/ex1/input b/2023/d04/ex1/input new file mode 100644 index 0000000..12e8bff --- /dev/null +++ b/2023/d04/ex1/input @@ -0,0 +1,203 @@ +Card 1: 27 61 49 69 58 44 2 29 39 10 | 97 96 49 78 26 58 27 77 69 9 39 88 53 10 2 29 61 62 48 87 18 44 74 34 11 +Card 2: 65 22 99 75 72 29 38 82 80 66 | 87 15 21 50 55 72 4 54 46 29 95 2 65 75 18 89 99 80 38 82 56 33 22 66 71 +Card 3: 27 95 96 34 14 42 40 60 50 93 | 35 95 22 34 50 27 29 77 78 4 5 61 93 8 59 63 16 45 80 81 92 23 42 88 82 +Card 4: 58 73 96 88 51 32 1 40 19 85 | 93 72 7 85 52 51 2 96 40 90 32 57 89 12 88 44 19 53 58 78 73 25 50 1 84 +Card 5: 69 52 10 51 73 47 22 84 36 8 | 40 84 69 32 73 33 98 76 51 22 10 97 36 52 68 8 43 93 29 44 85 13 26 47 77 +Card 6: 39 57 46 20 17 67 10 77 90 99 | 73 26 60 41 77 61 96 25 59 94 22 5 55 95 14 33 62 15 7 75 86 93 74 32 42 +Card 7: 7 25 29 75 24 19 78 77 18 8 | 77 80 54 85 4 66 12 82 23 17 53 20 91 32 94 59 9 6 3 97 8 55 60 11 36 +Card 8: 14 82 46 78 3 64 62 69 92 6 | 87 14 88 92 48 64 52 83 37 29 56 3 86 27 6 62 1 13 82 78 69 25 15 31 46 +Card 9: 53 43 10 8 47 41 67 95 90 11 | 10 3 71 67 54 59 24 25 53 70 43 7 93 41 85 42 26 98 8 13 87 99 11 58 2 +Card 10: 72 45 30 67 14 98 15 27 62 66 | 36 59 90 14 98 66 45 26 97 76 62 58 67 33 64 39 22 15 30 68 27 41 24 7 72 +Card 11: 45 3 18 55 42 83 79 37 30 49 | 88 97 34 71 74 14 53 79 50 18 55 60 72 28 3 19 30 63 1 90 49 32 86 70 37 +Card 12: 94 10 20 82 41 84 40 71 33 3 | 48 19 94 87 56 64 16 20 4 95 31 36 37 40 57 39 18 14 46 82 47 1 3 23 83 +Card 13: 5 27 33 28 51 14 99 68 38 65 | 2 27 14 39 41 51 69 77 38 28 15 5 65 11 57 97 76 34 99 87 31 46 68 33 16 +Card 14: 94 37 74 54 72 20 22 53 70 59 | 26 25 96 10 20 21 5 52 72 85 37 73 22 56 94 23 59 84 34 54 44 27 70 92 76 +Card 15: 6 7 59 98 17 34 15 97 72 45 | 48 50 77 6 35 7 86 17 1 27 59 54 44 97 47 72 3 34 12 37 15 69 49 64 80 +Card 16: 35 27 20 21 94 40 80 4 53 34 | 1 80 22 16 97 96 87 55 93 70 13 95 76 24 41 85 83 46 67 68 79 98 48 25 86 +Card 17: 3 48 35 96 80 15 54 16 67 92 | 94 96 34 38 57 1 67 41 9 60 80 54 15 85 4 21 75 59 66 81 84 43 48 23 3 +Card 18: 34 59 22 95 30 44 91 57 78 53 | 82 47 55 36 67 7 59 25 84 70 37 49 77 20 88 97 98 61 44 46 54 4 86 11 58 +Card 19: 31 19 44 79 94 29 18 90 3 54 | 60 76 7 48 87 36 31 57 11 21 94 20 62 53 66 39 72 85 17 63 49 24 79 37 68 +Card 20: 37 33 5 55 69 42 96 91 50 49 | 19 60 46 35 57 39 7 5 86 4 73 84 28 20 81 87 18 61 29 56 68 42 27 64 38 +Card 21: 23 95 53 13 56 62 76 64 98 63 | 36 20 61 21 67 14 82 44 59 97 56 9 47 93 63 18 16 46 25 87 19 88 85 95 29 +Card 22: 70 84 58 75 23 68 35 39 31 22 | 49 13 6 12 24 83 97 76 43 57 65 42 98 16 54 15 91 44 55 90 81 9 36 2 27 +Card 23: 61 4 42 33 21 94 67 86 91 66 | 81 34 17 92 97 12 50 69 19 63 68 44 80 72 83 95 10 31 42 75 5 74 60 9 24 +Card 24: 1 31 21 84 98 51 2 6 86 53 | 95 23 99 47 9 57 7 27 36 89 24 77 46 39 25 78 17 14 16 87 73 61 90 32 5 +Card 25: 54 19 59 74 58 36 46 39 31 27 | 54 42 46 56 59 45 39 79 19 88 27 91 74 38 48 15 36 31 73 35 64 60 62 58 78 +Card 26: 83 26 43 71 24 22 93 94 10 6 | 94 76 93 22 8 85 62 24 40 79 31 97 64 71 10 87 26 83 58 28 43 6 44 3 54 +Card 27: 47 73 50 11 5 55 46 97 8 84 | 41 75 97 8 23 15 26 86 42 98 43 47 49 62 11 9 69 92 88 5 73 18 76 93 22 +Card 28: 60 6 84 1 90 4 45 25 44 30 | 65 13 69 61 91 50 89 88 71 36 21 5 86 10 41 28 59 47 79 98 14 78 7 25 54 +Card 29: 65 16 91 46 52 7 1 41 49 32 | 10 6 32 53 12 43 62 50 37 49 66 3 97 16 72 57 81 86 91 46 89 52 71 82 14 +Card 30: 94 63 59 54 49 17 68 84 91 64 | 37 91 13 24 14 73 96 1 90 87 2 66 5 74 34 93 41 48 79 6 33 16 40 49 64 +Card 31: 34 6 27 31 92 2 25 13 5 83 | 92 2 20 11 34 48 13 25 39 87 10 16 12 15 83 57 22 76 51 55 6 5 74 38 31 +Card 32: 3 67 34 83 26 14 47 32 42 15 | 30 79 62 25 63 41 53 84 40 8 94 44 9 54 93 18 77 95 59 37 86 50 51 17 87 +Card 33: 65 88 76 95 94 71 22 99 66 60 | 7 81 32 62 5 99 69 55 19 74 96 20 36 40 84 51 8 39 48 3 93 6 98 46 41 +Card 34: 50 25 13 64 95 62 24 5 7 85 | 15 13 43 65 55 2 99 27 24 42 82 64 77 21 41 85 72 62 52 89 81 96 61 95 10 +Card 35: 33 11 79 32 91 86 12 39 5 71 | 5 91 62 16 29 82 88 2 51 80 17 99 38 58 36 12 81 43 6 49 42 37 35 46 47 +Card 36: 48 60 23 73 91 80 17 57 12 85 | 23 11 98 10 89 15 26 3 91 43 33 27 77 80 90 45 28 81 75 29 69 16 60 96 86 +Card 37: 64 82 14 98 90 74 57 60 54 45 | 30 49 57 3 46 11 64 97 6 47 41 77 82 94 15 29 61 48 75 89 21 23 78 55 33 +Card 38: 25 18 35 45 98 72 47 83 64 16 | 8 58 86 29 33 37 71 87 4 25 31 89 24 63 36 16 73 93 48 65 67 91 75 60 13 +Card 39: 88 36 73 50 12 61 8 4 45 53 | 35 31 97 68 41 10 52 38 7 49 50 3 23 25 21 13 90 75 47 73 27 2 9 48 77 +Card 40: 15 60 33 4 31 87 54 13 18 47 | 71 42 36 49 37 14 9 22 1 97 16 53 45 10 32 52 79 63 66 83 25 57 82 99 77 +Card 41: 96 67 69 23 6 24 77 81 32 13 | 58 78 54 26 50 62 49 17 38 85 89 90 25 5 51 91 52 53 65 44 93 12 8 98 73 +Card 42: 93 53 56 41 39 13 54 20 96 66 | 65 81 30 90 95 74 51 85 41 86 13 22 78 46 62 35 87 57 21 5 83 10 7 55 69 +Card 43: 49 29 51 42 62 46 44 65 92 47 | 46 47 49 42 92 54 12 68 29 3 81 51 64 44 17 1 62 23 56 87 65 85 70 6 32 +Card 44: 68 21 97 69 99 31 67 5 7 88 | 48 80 41 69 13 63 23 59 9 54 6 85 35 91 46 2 60 64 29 25 89 28 61 37 95 +Card 45: 57 39 86 33 23 96 69 46 40 83 | 8 93 40 72 43 85 33 70 15 52 3 27 89 25 75 23 86 83 42 88 97 73 80 96 47 +Card 46: 64 3 77 80 20 63 30 99 26 85 | 99 26 81 82 20 63 65 67 77 83 64 34 45 33 40 97 7 80 60 92 12 90 6 71 85 +Card 47: 94 44 75 30 86 26 45 69 89 38 | 27 50 10 12 16 32 30 45 89 37 20 43 39 7 44 86 38 87 26 9 22 79 11 35 53 +Card 48: 53 35 32 39 21 17 95 79 76 5 | 21 14 32 39 43 35 70 99 46 86 71 40 50 64 11 60 92 93 5 72 83 18 95 53 34 +Card 49: 23 7 72 99 49 95 63 20 44 88 | 47 20 74 27 88 82 91 52 49 46 92 72 13 12 80 7 75 9 99 39 23 4 31 95 84 +Card 50: 85 34 33 69 60 87 99 51 71 14 | 18 23 33 48 66 6 56 68 26 35 41 71 45 64 20 19 2 92 74 39 46 32 31 17 21 +Card 51: 59 26 52 31 47 96 25 36 63 67 | 35 18 56 71 90 84 47 66 63 96 7 10 3 50 32 70 94 49 62 74 46 33 60 93 9 +Card 52: 21 80 84 6 95 8 98 4 91 55 | 79 36 18 85 86 10 32 70 30 91 66 69 34 49 98 23 4 55 22 81 83 38 52 3 99 +Card 53: 30 40 10 21 29 58 31 85 2 61 | 92 3 91 33 19 32 42 21 76 95 93 94 82 67 18 63 25 62 20 99 30 54 72 78 74 +Card 54: 2 5 33 40 32 27 36 61 89 13 | 40 83 80 32 14 23 55 49 74 45 71 82 6 13 76 35 72 28 98 29 11 24 2 86 53 +Card 55: 95 33 11 78 50 89 27 4 35 32 | 58 14 4 57 59 10 65 29 85 71 9 51 17 49 98 25 7 31 97 15 36 80 79 1 22 +Card 56: 11 2 50 52 4 38 60 78 68 26 | 65 23 57 37 44 47 28 75 32 22 66 67 58 53 99 59 89 70 19 64 54 1 18 82 71 +Card 57: 35 87 26 17 27 58 99 75 79 90 | 78 19 59 98 83 69 29 86 23 45 61 21 41 34 66 15 94 4 22 12 89 71 73 92 65 +Card 58: 25 60 78 79 27 86 77 3 37 75 | 43 99 62 82 88 44 51 59 21 73 39 30 11 38 29 16 87 8 33 95 13 14 32 10 23 +Card 59: 53 93 58 1 28 27 64 34 76 20 | 16 53 69 63 56 51 90 95 34 37 1 77 93 27 45 17 64 12 84 58 13 76 28 6 20 +Card 60: 5 23 68 9 38 12 10 97 70 82 | 43 60 21 95 14 69 61 74 22 40 33 49 17 84 4 24 13 19 1 57 62 37 92 45 72 +Card 61: 39 98 85 63 87 5 91 61 57 74 | 33 39 61 54 87 37 13 69 57 85 98 7 83 5 91 97 50 63 74 20 26 30 71 56 23 +Card 62: 62 85 77 98 66 84 69 16 24 83 | 78 66 46 58 12 31 29 92 77 85 59 24 83 84 43 69 62 96 16 81 98 32 35 3 1 +Card 63: 54 56 39 78 46 26 36 65 61 33 | 53 78 36 25 16 31 30 10 90 46 9 62 80 61 29 76 18 91 51 8 74 58 54 65 70 +Card 64: 8 97 74 12 13 83 23 6 40 69 | 30 85 50 69 40 83 36 4 13 88 12 97 67 55 71 64 65 38 8 91 74 56 23 52 6 +Card 65: 29 38 74 28 88 34 8 1 44 73 | 34 28 41 27 73 9 95 65 35 46 15 80 21 72 68 64 26 43 47 1 29 74 8 31 76 +Card 66: 19 86 49 80 95 54 1 41 24 77 | 11 41 54 65 86 20 9 45 16 55 6 80 60 5 58 76 24 49 38 77 34 1 82 19 95 +Card 67: 14 10 60 4 5 77 82 94 9 24 | 48 19 99 73 89 78 43 26 62 28 71 96 38 57 7 68 63 60 10 85 93 50 5 41 76 +Card 68: 27 70 37 12 51 73 99 47 33 32 | 43 9 38 8 65 73 82 42 17 84 55 46 31 35 44 49 95 62 52 10 14 25 66 37 92 +Card 69: 90 69 60 85 34 56 72 16 20 35 | 13 90 42 65 72 56 39 34 20 59 28 92 40 69 32 85 16 93 79 97 35 98 5 60 26 +Card 70: 23 98 49 33 51 58 47 7 70 32 | 69 85 66 86 32 58 28 23 47 51 48 3 52 87 7 16 92 25 75 89 33 39 14 90 70 +Card 71: 70 84 44 96 76 49 34 93 87 14 | 59 14 19 67 17 28 5 56 37 52 6 18 2 44 8 63 82 57 66 34 91 73 16 54 97 +Card 72: 77 48 90 12 62 14 73 51 7 10 | 76 54 70 56 78 65 25 18 2 42 26 61 36 1 13 58 92 27 47 90 4 3 28 39 72 +Card 73: 89 29 6 91 49 99 2 27 75 36 | 22 67 98 35 71 1 99 9 33 78 97 19 73 46 47 57 90 15 92 10 12 69 7 62 95 +Card 74: 38 74 32 85 47 41 87 59 61 73 | 28 68 34 40 61 1 21 42 8 90 51 82 77 3 80 71 67 87 41 45 92 64 70 13 2 +Card 75: 1 41 81 26 87 15 63 16 83 67 | 64 83 11 34 7 36 37 15 4 52 87 50 24 21 26 41 94 70 67 43 99 12 20 55 51 +Card 76: 62 94 6 8 2 40 43 42 46 53 | 59 80 8 99 26 48 23 38 15 24 61 27 46 70 93 94 11 81 42 74 67 89 12 6 53 +Card 77: 17 15 62 90 77 30 5 97 59 10 | 6 53 67 83 63 44 43 25 11 20 41 70 39 69 97 93 5 92 51 37 23 19 65 71 56 +Card 78: 14 27 34 77 78 25 94 93 70 80 | 89 1 38 45 15 18 14 86 81 8 87 60 21 40 12 85 70 97 73 76 62 94 23 20 75 +Card 79: 87 22 38 56 58 10 94 19 68 83 | 8 76 58 87 34 52 30 32 9 55 71 97 50 6 33 22 51 11 88 44 47 42 5 41 27 +Card 80: 53 88 71 44 3 43 64 93 83 37 | 34 65 18 47 82 96 99 38 4 20 74 12 45 59 43 35 84 29 46 39 98 33 8 17 50 +Card 81: 49 78 31 83 35 16 46 43 25 12 | 94 74 28 54 67 21 16 30 7 86 93 6 95 26 80 10 55 5 1 85 79 58 18 51 72 +Card 82: 80 17 56 49 97 9 94 2 53 65 | 75 31 62 92 48 40 32 19 27 21 39 57 5 10 8 70 83 52 89 76 51 38 13 88 98 +Card 83: 8 64 56 30 93 73 40 7 27 24 | 38 76 27 25 40 83 42 17 55 89 34 7 5 39 93 74 37 29 51 3 19 1 18 30 52 +Card 84: 50 4 99 75 59 57 96 61 46 6 | 51 46 4 53 27 63 30 68 76 61 99 75 15 13 6 20 96 36 59 50 26 62 25 57 52 +Card 85: 14 82 80 7 4 59 31 15 21 23 | 15 98 45 25 4 9 23 30 14 75 59 80 35 46 82 76 31 81 21 7 11 69 91 96 49 +Card 86: 99 17 2 89 42 19 3 94 4 12 | 17 94 34 47 64 57 19 77 96 42 2 33 99 73 63 89 41 32 15 56 4 12 98 3 39 +Card 87: 43 60 77 76 78 19 51 99 39 57 | 49 26 8 1 92 70 61 54 16 98 37 32 44 43 51 9 6 30 66 74 75 72 14 40 3 +Card 88: 24 22 59 84 72 98 92 75 52 82 | 80 56 85 37 68 71 62 4 38 84 22 16 98 75 23 52 64 59 92 72 29 24 82 93 50 +Card 89: 79 5 64 69 73 95 74 49 56 47 | 47 49 61 93 6 69 85 42 5 88 66 59 19 96 72 95 26 84 9 44 79 92 25 73 1 +Card 90: 67 63 84 5 13 81 38 78 9 2 | 97 53 90 13 29 38 62 46 83 70 33 47 45 99 54 65 81 11 61 82 26 91 27 88 22 +Card 91: 39 72 25 54 90 11 79 42 4 14 | 53 83 63 25 34 11 13 78 2 15 42 62 7 28 72 91 38 54 37 75 71 5 20 14 59 +Card 92: 46 70 28 3 20 9 45 32 77 14 | 85 79 49 45 64 78 33 9 53 36 96 28 29 21 50 80 27 87 22 3 31 73 14 32 2 +Card 93: 81 59 32 19 80 13 78 70 65 38 | 32 14 23 73 65 81 56 26 50 70 19 59 27 15 17 13 48 38 53 3 77 16 80 78 36 +Card 94: 86 53 49 85 95 70 27 32 4 24 | 41 84 58 73 4 13 88 55 94 46 90 6 50 65 21 53 97 14 10 44 69 59 56 79 68 +Card 95: 59 99 76 63 47 4 8 67 23 96 | 69 9 21 8 47 75 44 29 4 12 88 38 11 13 23 85 6 18 97 2 34 1 17 32 16 +Card 96: 82 97 72 34 28 52 78 80 20 92 | 56 83 32 84 21 74 25 24 61 23 88 66 94 1 29 73 35 70 57 11 81 26 60 63 58 +Card 97: 34 76 39 38 23 51 55 25 40 22 | 91 43 59 66 40 3 45 24 56 96 98 73 29 71 30 1 50 46 78 8 11 9 27 64 26 +Card 98: 66 42 1 45 92 32 71 88 5 82 | 50 88 42 70 60 6 27 49 36 1 35 53 82 14 71 77 5 7 78 48 31 81 52 92 45 +Card 99: 12 2 77 94 59 98 95 10 39 32 | 76 88 5 12 45 55 27 17 11 98 10 87 97 99 20 78 46 4 96 26 14 82 22 39 16 +Card 100: 22 96 56 41 90 47 29 58 87 32 | 15 65 80 82 49 24 33 85 20 74 70 54 50 12 78 47 28 9 32 16 67 71 99 1 17 +Card 101: 1 23 74 4 72 26 75 68 89 83 | 83 58 63 1 52 20 26 33 64 41 53 65 57 80 69 38 4 90 74 39 32 13 61 55 14 +Card 102: 75 14 28 46 23 36 68 71 70 98 | 19 33 54 4 5 8 41 6 14 88 46 3 62 10 48 7 77 92 16 39 40 27 31 99 1 +Card 103: 65 33 61 53 51 29 26 83 19 18 | 7 2 82 55 13 22 6 27 90 99 14 50 79 25 63 46 97 81 85 61 87 28 75 31 96 +Card 104: 51 87 57 78 60 94 82 12 88 11 | 72 78 77 70 54 39 55 24 86 18 58 52 20 63 29 33 31 97 66 69 62 6 56 25 35 +Card 105: 17 55 95 42 16 52 72 9 79 59 | 98 30 35 20 46 43 51 66 75 48 52 44 34 96 65 37 41 50 74 21 38 18 73 10 76 +Card 106: 44 91 36 94 24 31 83 50 70 52 | 18 38 42 17 12 56 64 32 79 76 39 73 60 80 53 57 96 88 82 77 4 69 23 45 7 +Card 107: 45 48 58 26 5 2 35 63 78 70 | 49 71 10 21 50 13 95 6 68 84 4 40 45 31 1 34 27 2 5 85 39 44 98 83 46 +Card 108: 18 4 63 24 83 40 16 48 21 26 | 87 48 21 59 22 6 26 40 98 69 43 14 83 4 16 15 58 68 64 57 63 72 18 60 24 +Card 109: 36 46 49 57 83 68 45 30 1 58 | 35 38 22 12 39 90 86 26 72 67 81 87 79 27 25 29 4 99 41 59 96 94 9 28 75 +Card 110: 58 2 71 72 92 91 75 4 19 81 | 75 26 14 91 71 19 88 11 13 72 32 58 92 24 96 33 74 46 27 38 4 81 20 28 2 +Card 111: 3 78 14 85 53 1 2 32 59 10 | 20 62 53 94 72 45 2 46 87 17 98 74 44 25 47 60 83 59 65 81 38 24 23 39 12 +Card 112: 61 37 90 17 55 94 89 87 5 39 | 90 27 88 64 94 13 41 55 44 21 30 37 84 39 5 32 46 86 14 54 85 17 89 35 31 +Card 113: 73 76 33 37 82 79 56 22 57 6 | 76 20 41 85 2 60 37 32 6 82 94 26 63 56 16 28 33 47 70 99 73 40 22 79 57 +Card 114: 11 54 66 70 60 78 89 94 80 96 | 14 76 70 33 48 53 90 47 66 6 64 96 83 20 56 34 35 11 75 89 41 60 7 39 1 +Card 115: 45 5 33 12 63 95 27 42 1 84 | 51 10 31 27 45 42 1 74 48 72 53 69 63 47 83 33 91 95 39 12 84 11 23 28 65 +Card 116: 5 77 89 65 52 69 32 63 23 85 | 82 73 70 91 11 28 41 14 15 62 37 94 90 95 56 30 96 25 63 47 43 49 83 68 29 +Card 117: 64 80 98 39 45 11 40 22 49 55 | 44 88 40 80 49 67 69 79 62 42 43 30 55 18 5 59 87 98 54 23 45 39 22 11 64 +Card 118: 44 61 75 42 48 66 36 88 9 54 | 62 81 70 3 35 34 79 38 10 32 19 14 65 30 18 42 55 64 92 88 45 83 11 43 23 +Card 119: 82 29 59 20 19 18 66 28 23 49 | 20 19 25 70 59 18 14 36 58 40 23 3 24 80 30 78 88 2 79 72 82 7 66 49 47 +Card 120: 61 40 26 25 4 42 19 76 51 22 | 6 25 11 24 22 44 4 98 49 97 46 88 23 55 66 48 9 33 85 65 84 29 13 60 83 +Card 121: 97 31 11 71 90 96 84 76 53 8 | 71 82 44 99 98 47 40 4 52 53 84 43 27 94 13 88 3 18 28 11 60 24 21 20 38 +Card 122: 29 65 38 48 52 55 3 32 35 95 | 91 45 82 57 38 78 47 75 2 12 46 50 23 87 60 99 18 29 65 25 1 89 35 86 59 +Card 123: 4 91 26 38 36 83 60 72 19 56 | 35 26 36 22 46 69 14 5 70 3 74 47 7 63 72 89 25 60 17 19 62 76 93 75 38 +Card 124: 16 17 73 87 56 22 10 44 92 58 | 54 61 96 42 83 97 5 2 73 69 37 9 50 79 6 57 63 40 75 49 64 70 34 52 11 +Card 125: 37 77 17 70 18 59 65 81 48 15 | 59 49 62 81 12 1 71 90 99 36 25 37 60 64 19 83 21 11 3 27 52 32 45 46 72 +Card 126: 30 34 31 37 3 7 10 8 45 25 | 78 25 12 34 89 63 59 96 41 75 58 71 93 28 17 90 84 7 4 21 13 33 52 14 19 +Card 127: 3 31 15 35 26 88 75 82 77 68 | 13 33 47 92 51 32 74 66 99 44 79 62 22 64 43 23 12 49 60 57 4 83 89 65 21 +Card 128: 9 72 20 10 14 95 86 50 85 82 | 82 25 99 53 97 31 42 8 89 68 58 43 15 30 47 1 26 67 87 57 78 18 60 61 75 +Card 129: 73 72 68 95 79 76 69 24 1 98 | 15 51 83 7 74 5 93 8 27 40 78 81 3 37 44 14 21 99 97 67 57 71 84 86 64 +Card 130: 30 80 40 86 26 36 75 44 41 57 | 81 23 30 73 12 44 8 97 39 42 87 58 33 85 98 57 26 92 80 45 63 21 43 11 99 +Card 131: 22 20 60 75 26 57 33 88 74 38 | 21 92 47 36 5 65 69 9 39 1 33 87 34 53 72 44 15 51 58 25 18 67 19 2 93 +Card 132: 49 65 86 52 33 67 8 83 61 3 | 43 7 74 30 19 53 89 94 32 11 83 59 71 33 51 20 65 41 86 82 49 25 21 63 18 +Card 133: 91 17 74 21 23 47 9 57 82 35 | 23 98 88 82 33 5 92 99 7 57 74 96 9 84 66 24 65 46 40 17 2 4 47 21 51 +Card 134: 47 26 41 16 61 76 72 98 24 93 | 2 25 93 11 31 14 91 73 48 47 64 98 85 26 95 19 16 69 13 10 61 9 56 52 24 +Card 135: 23 13 58 83 99 69 93 33 10 37 | 35 54 80 42 58 46 88 19 99 81 47 89 10 30 33 92 69 23 13 37 59 34 39 93 62 +Card 136: 1 36 37 12 22 19 42 56 98 17 | 70 42 47 17 29 61 73 18 94 72 20 80 7 78 6 15 66 37 71 97 44 96 24 43 23 +Card 137: 81 73 66 58 28 36 27 19 67 4 | 21 85 77 72 99 29 38 73 71 86 6 16 58 93 79 91 39 66 80 67 81 20 11 34 40 +Card 138: 30 89 31 51 9 63 81 38 91 14 | 1 32 6 9 91 81 56 95 89 74 96 31 44 23 82 54 39 16 66 87 93 46 20 12 60 +Card 139: 7 22 84 59 50 53 73 13 97 26 | 17 7 46 18 98 82 53 81 10 39 90 45 16 47 95 15 43 19 50 58 99 13 35 14 12 +Card 140: 93 88 6 10 70 26 9 98 29 73 | 35 46 6 48 13 93 61 83 25 19 67 45 89 58 28 39 3 98 75 59 4 81 88 50 54 +Card 141: 12 6 9 54 93 16 99 71 36 11 | 88 98 87 30 35 93 14 54 82 48 78 13 55 90 36 80 46 63 83 39 61 23 69 96 8 +Card 142: 23 50 74 59 27 44 9 24 48 97 | 51 20 19 44 28 83 50 67 70 32 69 37 62 45 65 82 55 2 33 97 14 60 86 87 27 +Card 143: 79 37 21 69 97 74 33 16 39 83 | 98 39 81 84 66 24 17 87 27 48 20 47 78 61 90 53 43 41 42 92 1 52 5 15 59 +Card 144: 92 31 18 6 70 10 93 56 95 43 | 47 32 28 23 77 55 94 42 4 64 14 59 81 97 96 45 29 78 54 69 21 76 92 48 7 +Card 145: 14 42 45 75 62 1 47 66 31 23 | 30 68 76 97 65 83 22 89 34 80 38 42 62 59 74 56 44 48 71 33 51 82 36 54 40 +Card 146: 22 80 81 31 45 84 91 69 47 66 | 5 43 24 39 70 78 58 79 68 88 53 11 63 32 92 99 40 10 34 83 65 28 76 30 19 +Card 147: 83 67 45 87 14 75 29 97 64 94 | 2 86 23 53 1 63 34 54 79 82 35 88 41 44 17 13 37 12 10 56 57 31 70 30 68 +Card 148: 90 42 32 81 64 66 88 60 97 7 | 46 92 67 88 89 7 81 90 66 73 57 37 26 12 10 60 3 97 42 32 87 49 75 58 64 +Card 149: 26 62 65 96 74 6 48 61 91 83 | 74 26 85 51 89 6 44 91 75 65 1 3 96 54 20 77 87 42 61 14 62 68 24 88 17 +Card 150: 14 58 89 56 74 82 75 60 17 29 | 83 27 62 14 66 58 89 75 17 74 16 5 46 56 29 50 57 55 39 54 98 60 4 82 68 +Card 151: 24 33 68 94 57 59 46 17 84 80 | 43 76 66 46 92 39 73 59 84 68 11 81 87 85 62 33 80 99 95 24 17 57 30 97 94 +Card 152: 69 58 62 31 16 20 40 98 96 64 | 63 71 56 31 54 5 85 3 77 42 53 51 19 55 37 49 79 13 80 75 39 6 50 84 40 +Card 153: 43 50 22 2 47 75 76 56 26 80 | 80 70 19 52 43 27 56 26 86 47 50 13 2 88 93 11 74 23 22 57 90 81 40 76 75 +Card 154: 10 79 52 43 44 26 55 6 73 88 | 37 57 55 40 65 47 14 17 39 1 18 51 67 19 21 12 83 59 45 73 3 32 23 88 10 +Card 155: 69 40 90 61 59 70 77 50 31 15 | 31 34 76 14 10 91 12 86 37 24 68 8 15 59 3 35 84 97 30 77 46 70 40 69 61 +Card 156: 65 28 6 23 17 62 13 37 86 73 | 9 69 65 75 18 14 97 57 20 61 94 56 8 58 1 66 21 60 89 63 54 55 76 30 87 +Card 157: 52 34 98 50 56 69 68 45 20 11 | 34 54 69 41 68 20 44 50 76 65 35 24 84 56 45 51 98 64 23 33 9 43 91 2 97 +Card 158: 12 52 92 10 96 84 2 24 14 51 | 85 15 21 63 72 37 95 93 24 5 67 96 6 58 46 22 3 65 99 17 11 10 13 92 78 +Card 159: 85 42 96 78 39 75 21 50 14 20 | 57 88 68 79 61 20 1 78 35 59 12 76 42 92 96 75 52 13 50 89 53 81 11 69 49 +Card 160: 67 59 62 15 26 85 53 79 42 63 | 53 46 1 30 92 23 91 95 88 89 60 38 2 83 96 4 78 37 14 28 69 22 32 41 3 +Card 161: 38 4 97 98 20 55 51 64 80 53 | 53 34 94 65 3 23 45 1 4 72 64 67 51 39 24 63 90 66 29 14 61 40 91 82 49 +Card 162: 41 19 60 53 94 79 1 77 63 47 | 79 6 42 68 95 94 66 27 24 76 61 96 20 84 60 25 85 78 67 63 53 12 89 8 51 +Card 163: 33 83 82 29 51 57 63 88 66 74 | 9 71 58 88 64 70 96 29 77 25 24 55 21 35 81 33 23 45 18 34 63 6 44 83 17 +Card 164: 1 34 54 15 24 97 8 96 73 26 | 42 6 3 21 11 27 69 92 39 59 45 96 73 26 24 98 2 81 83 17 62 54 70 52 95 +Card 165: 75 92 74 11 5 1 91 36 32 24 | 87 16 28 41 79 88 96 63 86 31 58 35 65 68 8 77 42 52 38 19 70 59 14 57 37 +Card 166: 22 87 29 9 56 32 96 28 61 71 | 80 50 45 12 42 72 5 11 63 62 84 39 20 85 95 47 37 91 60 27 81 2 14 33 51 +Card 167: 60 89 56 55 84 30 95 86 11 79 | 26 94 42 66 52 2 98 8 38 71 11 80 19 4 62 10 89 27 91 61 70 90 63 16 68 +Card 168: 59 90 46 84 16 39 34 88 81 83 | 37 56 92 96 59 26 5 45 67 1 63 73 55 21 33 12 79 13 17 89 82 3 43 85 18 +Card 169: 40 31 62 10 36 69 84 23 95 98 | 22 78 4 46 94 83 60 19 90 70 86 8 20 27 35 17 95 85 14 21 28 61 16 74 37 +Card 170: 11 57 4 84 3 28 89 37 50 23 | 42 59 63 33 62 61 75 14 73 68 69 72 67 45 47 58 10 79 91 98 44 49 27 76 25 +Card 171: 37 47 28 12 74 3 96 26 95 22 | 94 79 13 35 89 57 19 71 15 11 78 45 24 32 87 61 67 51 36 73 14 23 70 2 56 +Card 172: 81 58 92 24 61 10 29 77 93 68 | 92 8 77 73 86 57 93 91 61 19 49 88 23 24 72 64 10 31 32 12 81 4 29 58 68 +Card 173: 4 79 39 55 62 88 18 87 24 96 | 79 87 74 39 16 91 55 71 2 88 54 1 58 20 90 18 62 86 43 4 93 24 99 84 96 +Card 174: 15 69 50 70 4 98 73 68 46 22 | 93 36 96 73 49 64 74 46 78 38 22 23 53 17 69 68 89 43 71 94 79 16 58 60 19 +Card 175: 29 61 14 30 9 23 7 31 60 49 | 78 73 61 91 31 27 63 30 9 64 12 51 8 56 74 36 22 88 1 29 21 80 96 38 99 +Card 176: 36 3 35 86 6 93 47 25 79 48 | 91 79 11 20 23 25 30 97 90 24 17 50 60 89 96 52 98 88 99 51 48 68 67 82 61 +Card 177: 89 81 54 66 51 77 61 11 42 39 | 36 26 40 59 90 8 33 65 11 38 96 79 80 2 13 56 46 86 71 92 72 73 95 39 85 +Card 178: 56 34 78 53 2 7 97 88 27 16 | 12 6 97 8 53 17 50 19 21 41 70 86 25 63 84 52 59 78 81 83 85 72 75 71 39 +Card 179: 63 98 17 49 6 40 18 8 82 25 | 56 66 49 33 53 59 2 21 6 80 76 4 17 8 62 57 82 55 98 58 93 52 51 22 25 +Card 180: 56 80 35 88 2 24 98 66 71 76 | 77 28 86 36 70 85 65 58 15 32 19 56 61 33 27 79 81 35 16 69 55 57 59 45 82 +Card 181: 6 31 42 96 19 4 68 28 58 99 | 48 73 97 4 68 42 70 49 39 56 14 67 89 85 81 96 27 16 15 5 94 69 33 11 44 +Card 182: 36 8 13 24 90 99 52 1 56 87 | 12 85 1 9 88 30 74 13 26 80 48 72 10 65 91 44 21 37 70 3 93 29 90 61 7 +Card 183: 83 30 76 63 77 11 22 33 15 72 | 83 12 60 16 42 31 63 55 99 1 89 93 88 85 47 48 96 97 29 45 7 75 71 8 33 +Card 184: 91 4 17 34 61 70 48 64 38 68 | 66 99 94 3 98 44 90 23 14 38 55 56 68 42 87 95 54 13 7 65 5 18 79 62 57 +Card 185: 92 81 63 22 41 13 59 79 40 70 | 94 26 80 48 82 50 23 8 93 49 19 24 58 5 43 16 53 61 37 42 44 40 95 67 25 +Card 186: 3 65 75 74 68 4 61 28 91 42 | 56 85 83 29 63 11 20 18 66 53 71 62 33 69 30 93 67 47 72 51 7 80 46 44 9 +Card 187: 76 60 87 97 68 27 52 20 12 54 | 87 7 8 14 30 19 39 22 65 24 40 34 61 20 64 81 33 25 69 26 52 76 71 11 60 +Card 188: 39 87 24 31 93 1 91 18 20 28 | 47 50 84 24 38 7 37 57 91 96 28 10 14 55 76 35 2 45 29 58 79 27 70 23 21 +Card 189: 69 77 14 29 62 32 37 57 61 8 | 73 39 51 80 89 32 8 87 81 62 92 21 4 49 79 40 10 96 55 98 69 74 97 72 37 +Card 190: 69 46 86 75 59 29 78 72 16 54 | 18 86 68 63 9 49 50 10 19 77 65 69 79 12 24 76 64 58 1 16 30 13 98 11 75 +Card 191: 52 35 79 94 34 5 96 38 70 90 | 65 46 49 11 48 1 29 82 24 85 51 61 84 81 18 20 67 41 33 88 89 25 6 83 68 +Card 192: 8 66 41 82 36 43 50 97 29 3 | 5 56 32 47 13 82 50 1 39 8 70 20 97 99 33 76 3 46 43 36 26 66 83 61 29 +Card 193: 22 70 17 82 6 24 4 35 32 61 | 24 22 67 2 89 35 95 1 34 82 39 14 5 51 27 26 4 32 43 76 45 9 70 17 30 +Card 194: 54 90 83 51 22 45 97 41 92 61 | 32 37 94 87 41 21 98 54 40 14 4 79 61 82 97 59 44 45 28 73 66 84 63 35 23 +Card 195: 68 89 18 86 4 5 82 78 3 35 | 14 21 75 98 88 28 44 49 20 95 25 68 67 79 65 30 37 87 61 78 8 73 77 31 16 +Card 196: 16 64 6 99 67 55 51 50 37 71 | 12 89 81 63 62 82 85 60 76 8 4 32 83 51 38 69 92 35 10 90 58 56 77 99 29 +Card 197: 85 67 81 59 28 36 13 84 83 92 | 67 56 68 12 34 30 60 41 58 92 49 81 22 23 21 18 5 69 71 75 94 53 90 36 9 +Card 198: 99 10 39 1 13 21 15 84 44 40 | 64 58 40 26 8 97 83 87 86 85 29 54 44 99 6 80 55 36 84 82 18 92 81 35 15 +Card 199: 16 74 44 41 37 70 15 20 36 9 | 63 89 93 59 81 76 85 14 92 30 67 71 69 49 7 39 99 97 62 18 55 83 11 79 36 +Card 200: 78 75 82 83 61 95 2 56 49 53 | 66 19 77 94 74 97 79 34 33 16 83 41 81 91 52 62 14 21 35 4 99 50 30 42 36 +Card 201: 97 48 74 15 5 4 40 64 95 33 | 83 54 73 81 37 53 85 20 68 51 82 41 27 42 60 63 50 58 98 35 9 23 18 2 32 +Card 202: 83 90 4 89 57 72 30 13 8 23 | 99 33 38 70 39 12 71 35 46 94 82 79 44 62 98 74 64 16 32 66 65 95 47 58 23 +Card 203: 38 61 14 84 65 96 90 69 53 11 | 24 50 66 56 26 25 3 60 95 19 10 21 12 87 92 37 99 76 71 57 17 55 30 6 44 From d84554d96539c0a3f53503836c17ffbab490c799 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 4 Dec 2023 11:10:40 +0000 Subject: [PATCH 391/479] 2023: d04: ex1: add solution --- 2023/d04/ex1/ex1.py | 53 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100755 2023/d04/ex1/ex1.py diff --git a/2023/d04/ex1/ex1.py b/2023/d04/ex1/ex1.py new file mode 100755 index 0000000..2df3a72 --- /dev/null +++ b/2023/d04/ex1/ex1.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +import dataclasses +import sys + + +@dataclasses.dataclass +class Card: + win_nums: set[int] + nums: set[int] + + +# The input is in order without skipping, but just in case... +Cards = dict[int, Card] + + +def solve(input: list[str]) -> int: + def parse_nums(nums: str) -> set[int]: + return {int(n) for n in nums.split(" ") if n != ""} + + # This does *not* expect the "Card :" bit + def parse_card(card: str) -> Card: + win_nums, nums = card.split("|") + return Card( + win_nums=parse_nums(win_nums), + nums=parse_nums(nums), + ) + + def parse_line(line: str) -> tuple[int, Card]: + card_id, card = line.split(": ") + return int(card_id.removeprefix("Card")), parse_card(card) + + def parse(input: list[str]) -> Cards: + parsed = map(parse_line, input) + return {id: card for id, card in parsed} + + def score(card: Card) -> int: + actual_win_nums = card.nums & card.win_nums + if len(actual_win_nums) == 0: + return 0 + return 2 ** (len(actual_win_nums) - 1) + + cards = parse(input) + return sum(score(card) for card in cards.values()) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 8292a5f3231f685ea1c7e0f0af94e284cc9b3ae3 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 4 Dec 2023 11:10:48 +0000 Subject: [PATCH 392/479] 2023: d04: ex2: add input --- 2023/d04/ex2/input | 203 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 2023/d04/ex2/input diff --git a/2023/d04/ex2/input b/2023/d04/ex2/input new file mode 100644 index 0000000..12e8bff --- /dev/null +++ b/2023/d04/ex2/input @@ -0,0 +1,203 @@ +Card 1: 27 61 49 69 58 44 2 29 39 10 | 97 96 49 78 26 58 27 77 69 9 39 88 53 10 2 29 61 62 48 87 18 44 74 34 11 +Card 2: 65 22 99 75 72 29 38 82 80 66 | 87 15 21 50 55 72 4 54 46 29 95 2 65 75 18 89 99 80 38 82 56 33 22 66 71 +Card 3: 27 95 96 34 14 42 40 60 50 93 | 35 95 22 34 50 27 29 77 78 4 5 61 93 8 59 63 16 45 80 81 92 23 42 88 82 +Card 4: 58 73 96 88 51 32 1 40 19 85 | 93 72 7 85 52 51 2 96 40 90 32 57 89 12 88 44 19 53 58 78 73 25 50 1 84 +Card 5: 69 52 10 51 73 47 22 84 36 8 | 40 84 69 32 73 33 98 76 51 22 10 97 36 52 68 8 43 93 29 44 85 13 26 47 77 +Card 6: 39 57 46 20 17 67 10 77 90 99 | 73 26 60 41 77 61 96 25 59 94 22 5 55 95 14 33 62 15 7 75 86 93 74 32 42 +Card 7: 7 25 29 75 24 19 78 77 18 8 | 77 80 54 85 4 66 12 82 23 17 53 20 91 32 94 59 9 6 3 97 8 55 60 11 36 +Card 8: 14 82 46 78 3 64 62 69 92 6 | 87 14 88 92 48 64 52 83 37 29 56 3 86 27 6 62 1 13 82 78 69 25 15 31 46 +Card 9: 53 43 10 8 47 41 67 95 90 11 | 10 3 71 67 54 59 24 25 53 70 43 7 93 41 85 42 26 98 8 13 87 99 11 58 2 +Card 10: 72 45 30 67 14 98 15 27 62 66 | 36 59 90 14 98 66 45 26 97 76 62 58 67 33 64 39 22 15 30 68 27 41 24 7 72 +Card 11: 45 3 18 55 42 83 79 37 30 49 | 88 97 34 71 74 14 53 79 50 18 55 60 72 28 3 19 30 63 1 90 49 32 86 70 37 +Card 12: 94 10 20 82 41 84 40 71 33 3 | 48 19 94 87 56 64 16 20 4 95 31 36 37 40 57 39 18 14 46 82 47 1 3 23 83 +Card 13: 5 27 33 28 51 14 99 68 38 65 | 2 27 14 39 41 51 69 77 38 28 15 5 65 11 57 97 76 34 99 87 31 46 68 33 16 +Card 14: 94 37 74 54 72 20 22 53 70 59 | 26 25 96 10 20 21 5 52 72 85 37 73 22 56 94 23 59 84 34 54 44 27 70 92 76 +Card 15: 6 7 59 98 17 34 15 97 72 45 | 48 50 77 6 35 7 86 17 1 27 59 54 44 97 47 72 3 34 12 37 15 69 49 64 80 +Card 16: 35 27 20 21 94 40 80 4 53 34 | 1 80 22 16 97 96 87 55 93 70 13 95 76 24 41 85 83 46 67 68 79 98 48 25 86 +Card 17: 3 48 35 96 80 15 54 16 67 92 | 94 96 34 38 57 1 67 41 9 60 80 54 15 85 4 21 75 59 66 81 84 43 48 23 3 +Card 18: 34 59 22 95 30 44 91 57 78 53 | 82 47 55 36 67 7 59 25 84 70 37 49 77 20 88 97 98 61 44 46 54 4 86 11 58 +Card 19: 31 19 44 79 94 29 18 90 3 54 | 60 76 7 48 87 36 31 57 11 21 94 20 62 53 66 39 72 85 17 63 49 24 79 37 68 +Card 20: 37 33 5 55 69 42 96 91 50 49 | 19 60 46 35 57 39 7 5 86 4 73 84 28 20 81 87 18 61 29 56 68 42 27 64 38 +Card 21: 23 95 53 13 56 62 76 64 98 63 | 36 20 61 21 67 14 82 44 59 97 56 9 47 93 63 18 16 46 25 87 19 88 85 95 29 +Card 22: 70 84 58 75 23 68 35 39 31 22 | 49 13 6 12 24 83 97 76 43 57 65 42 98 16 54 15 91 44 55 90 81 9 36 2 27 +Card 23: 61 4 42 33 21 94 67 86 91 66 | 81 34 17 92 97 12 50 69 19 63 68 44 80 72 83 95 10 31 42 75 5 74 60 9 24 +Card 24: 1 31 21 84 98 51 2 6 86 53 | 95 23 99 47 9 57 7 27 36 89 24 77 46 39 25 78 17 14 16 87 73 61 90 32 5 +Card 25: 54 19 59 74 58 36 46 39 31 27 | 54 42 46 56 59 45 39 79 19 88 27 91 74 38 48 15 36 31 73 35 64 60 62 58 78 +Card 26: 83 26 43 71 24 22 93 94 10 6 | 94 76 93 22 8 85 62 24 40 79 31 97 64 71 10 87 26 83 58 28 43 6 44 3 54 +Card 27: 47 73 50 11 5 55 46 97 8 84 | 41 75 97 8 23 15 26 86 42 98 43 47 49 62 11 9 69 92 88 5 73 18 76 93 22 +Card 28: 60 6 84 1 90 4 45 25 44 30 | 65 13 69 61 91 50 89 88 71 36 21 5 86 10 41 28 59 47 79 98 14 78 7 25 54 +Card 29: 65 16 91 46 52 7 1 41 49 32 | 10 6 32 53 12 43 62 50 37 49 66 3 97 16 72 57 81 86 91 46 89 52 71 82 14 +Card 30: 94 63 59 54 49 17 68 84 91 64 | 37 91 13 24 14 73 96 1 90 87 2 66 5 74 34 93 41 48 79 6 33 16 40 49 64 +Card 31: 34 6 27 31 92 2 25 13 5 83 | 92 2 20 11 34 48 13 25 39 87 10 16 12 15 83 57 22 76 51 55 6 5 74 38 31 +Card 32: 3 67 34 83 26 14 47 32 42 15 | 30 79 62 25 63 41 53 84 40 8 94 44 9 54 93 18 77 95 59 37 86 50 51 17 87 +Card 33: 65 88 76 95 94 71 22 99 66 60 | 7 81 32 62 5 99 69 55 19 74 96 20 36 40 84 51 8 39 48 3 93 6 98 46 41 +Card 34: 50 25 13 64 95 62 24 5 7 85 | 15 13 43 65 55 2 99 27 24 42 82 64 77 21 41 85 72 62 52 89 81 96 61 95 10 +Card 35: 33 11 79 32 91 86 12 39 5 71 | 5 91 62 16 29 82 88 2 51 80 17 99 38 58 36 12 81 43 6 49 42 37 35 46 47 +Card 36: 48 60 23 73 91 80 17 57 12 85 | 23 11 98 10 89 15 26 3 91 43 33 27 77 80 90 45 28 81 75 29 69 16 60 96 86 +Card 37: 64 82 14 98 90 74 57 60 54 45 | 30 49 57 3 46 11 64 97 6 47 41 77 82 94 15 29 61 48 75 89 21 23 78 55 33 +Card 38: 25 18 35 45 98 72 47 83 64 16 | 8 58 86 29 33 37 71 87 4 25 31 89 24 63 36 16 73 93 48 65 67 91 75 60 13 +Card 39: 88 36 73 50 12 61 8 4 45 53 | 35 31 97 68 41 10 52 38 7 49 50 3 23 25 21 13 90 75 47 73 27 2 9 48 77 +Card 40: 15 60 33 4 31 87 54 13 18 47 | 71 42 36 49 37 14 9 22 1 97 16 53 45 10 32 52 79 63 66 83 25 57 82 99 77 +Card 41: 96 67 69 23 6 24 77 81 32 13 | 58 78 54 26 50 62 49 17 38 85 89 90 25 5 51 91 52 53 65 44 93 12 8 98 73 +Card 42: 93 53 56 41 39 13 54 20 96 66 | 65 81 30 90 95 74 51 85 41 86 13 22 78 46 62 35 87 57 21 5 83 10 7 55 69 +Card 43: 49 29 51 42 62 46 44 65 92 47 | 46 47 49 42 92 54 12 68 29 3 81 51 64 44 17 1 62 23 56 87 65 85 70 6 32 +Card 44: 68 21 97 69 99 31 67 5 7 88 | 48 80 41 69 13 63 23 59 9 54 6 85 35 91 46 2 60 64 29 25 89 28 61 37 95 +Card 45: 57 39 86 33 23 96 69 46 40 83 | 8 93 40 72 43 85 33 70 15 52 3 27 89 25 75 23 86 83 42 88 97 73 80 96 47 +Card 46: 64 3 77 80 20 63 30 99 26 85 | 99 26 81 82 20 63 65 67 77 83 64 34 45 33 40 97 7 80 60 92 12 90 6 71 85 +Card 47: 94 44 75 30 86 26 45 69 89 38 | 27 50 10 12 16 32 30 45 89 37 20 43 39 7 44 86 38 87 26 9 22 79 11 35 53 +Card 48: 53 35 32 39 21 17 95 79 76 5 | 21 14 32 39 43 35 70 99 46 86 71 40 50 64 11 60 92 93 5 72 83 18 95 53 34 +Card 49: 23 7 72 99 49 95 63 20 44 88 | 47 20 74 27 88 82 91 52 49 46 92 72 13 12 80 7 75 9 99 39 23 4 31 95 84 +Card 50: 85 34 33 69 60 87 99 51 71 14 | 18 23 33 48 66 6 56 68 26 35 41 71 45 64 20 19 2 92 74 39 46 32 31 17 21 +Card 51: 59 26 52 31 47 96 25 36 63 67 | 35 18 56 71 90 84 47 66 63 96 7 10 3 50 32 70 94 49 62 74 46 33 60 93 9 +Card 52: 21 80 84 6 95 8 98 4 91 55 | 79 36 18 85 86 10 32 70 30 91 66 69 34 49 98 23 4 55 22 81 83 38 52 3 99 +Card 53: 30 40 10 21 29 58 31 85 2 61 | 92 3 91 33 19 32 42 21 76 95 93 94 82 67 18 63 25 62 20 99 30 54 72 78 74 +Card 54: 2 5 33 40 32 27 36 61 89 13 | 40 83 80 32 14 23 55 49 74 45 71 82 6 13 76 35 72 28 98 29 11 24 2 86 53 +Card 55: 95 33 11 78 50 89 27 4 35 32 | 58 14 4 57 59 10 65 29 85 71 9 51 17 49 98 25 7 31 97 15 36 80 79 1 22 +Card 56: 11 2 50 52 4 38 60 78 68 26 | 65 23 57 37 44 47 28 75 32 22 66 67 58 53 99 59 89 70 19 64 54 1 18 82 71 +Card 57: 35 87 26 17 27 58 99 75 79 90 | 78 19 59 98 83 69 29 86 23 45 61 21 41 34 66 15 94 4 22 12 89 71 73 92 65 +Card 58: 25 60 78 79 27 86 77 3 37 75 | 43 99 62 82 88 44 51 59 21 73 39 30 11 38 29 16 87 8 33 95 13 14 32 10 23 +Card 59: 53 93 58 1 28 27 64 34 76 20 | 16 53 69 63 56 51 90 95 34 37 1 77 93 27 45 17 64 12 84 58 13 76 28 6 20 +Card 60: 5 23 68 9 38 12 10 97 70 82 | 43 60 21 95 14 69 61 74 22 40 33 49 17 84 4 24 13 19 1 57 62 37 92 45 72 +Card 61: 39 98 85 63 87 5 91 61 57 74 | 33 39 61 54 87 37 13 69 57 85 98 7 83 5 91 97 50 63 74 20 26 30 71 56 23 +Card 62: 62 85 77 98 66 84 69 16 24 83 | 78 66 46 58 12 31 29 92 77 85 59 24 83 84 43 69 62 96 16 81 98 32 35 3 1 +Card 63: 54 56 39 78 46 26 36 65 61 33 | 53 78 36 25 16 31 30 10 90 46 9 62 80 61 29 76 18 91 51 8 74 58 54 65 70 +Card 64: 8 97 74 12 13 83 23 6 40 69 | 30 85 50 69 40 83 36 4 13 88 12 97 67 55 71 64 65 38 8 91 74 56 23 52 6 +Card 65: 29 38 74 28 88 34 8 1 44 73 | 34 28 41 27 73 9 95 65 35 46 15 80 21 72 68 64 26 43 47 1 29 74 8 31 76 +Card 66: 19 86 49 80 95 54 1 41 24 77 | 11 41 54 65 86 20 9 45 16 55 6 80 60 5 58 76 24 49 38 77 34 1 82 19 95 +Card 67: 14 10 60 4 5 77 82 94 9 24 | 48 19 99 73 89 78 43 26 62 28 71 96 38 57 7 68 63 60 10 85 93 50 5 41 76 +Card 68: 27 70 37 12 51 73 99 47 33 32 | 43 9 38 8 65 73 82 42 17 84 55 46 31 35 44 49 95 62 52 10 14 25 66 37 92 +Card 69: 90 69 60 85 34 56 72 16 20 35 | 13 90 42 65 72 56 39 34 20 59 28 92 40 69 32 85 16 93 79 97 35 98 5 60 26 +Card 70: 23 98 49 33 51 58 47 7 70 32 | 69 85 66 86 32 58 28 23 47 51 48 3 52 87 7 16 92 25 75 89 33 39 14 90 70 +Card 71: 70 84 44 96 76 49 34 93 87 14 | 59 14 19 67 17 28 5 56 37 52 6 18 2 44 8 63 82 57 66 34 91 73 16 54 97 +Card 72: 77 48 90 12 62 14 73 51 7 10 | 76 54 70 56 78 65 25 18 2 42 26 61 36 1 13 58 92 27 47 90 4 3 28 39 72 +Card 73: 89 29 6 91 49 99 2 27 75 36 | 22 67 98 35 71 1 99 9 33 78 97 19 73 46 47 57 90 15 92 10 12 69 7 62 95 +Card 74: 38 74 32 85 47 41 87 59 61 73 | 28 68 34 40 61 1 21 42 8 90 51 82 77 3 80 71 67 87 41 45 92 64 70 13 2 +Card 75: 1 41 81 26 87 15 63 16 83 67 | 64 83 11 34 7 36 37 15 4 52 87 50 24 21 26 41 94 70 67 43 99 12 20 55 51 +Card 76: 62 94 6 8 2 40 43 42 46 53 | 59 80 8 99 26 48 23 38 15 24 61 27 46 70 93 94 11 81 42 74 67 89 12 6 53 +Card 77: 17 15 62 90 77 30 5 97 59 10 | 6 53 67 83 63 44 43 25 11 20 41 70 39 69 97 93 5 92 51 37 23 19 65 71 56 +Card 78: 14 27 34 77 78 25 94 93 70 80 | 89 1 38 45 15 18 14 86 81 8 87 60 21 40 12 85 70 97 73 76 62 94 23 20 75 +Card 79: 87 22 38 56 58 10 94 19 68 83 | 8 76 58 87 34 52 30 32 9 55 71 97 50 6 33 22 51 11 88 44 47 42 5 41 27 +Card 80: 53 88 71 44 3 43 64 93 83 37 | 34 65 18 47 82 96 99 38 4 20 74 12 45 59 43 35 84 29 46 39 98 33 8 17 50 +Card 81: 49 78 31 83 35 16 46 43 25 12 | 94 74 28 54 67 21 16 30 7 86 93 6 95 26 80 10 55 5 1 85 79 58 18 51 72 +Card 82: 80 17 56 49 97 9 94 2 53 65 | 75 31 62 92 48 40 32 19 27 21 39 57 5 10 8 70 83 52 89 76 51 38 13 88 98 +Card 83: 8 64 56 30 93 73 40 7 27 24 | 38 76 27 25 40 83 42 17 55 89 34 7 5 39 93 74 37 29 51 3 19 1 18 30 52 +Card 84: 50 4 99 75 59 57 96 61 46 6 | 51 46 4 53 27 63 30 68 76 61 99 75 15 13 6 20 96 36 59 50 26 62 25 57 52 +Card 85: 14 82 80 7 4 59 31 15 21 23 | 15 98 45 25 4 9 23 30 14 75 59 80 35 46 82 76 31 81 21 7 11 69 91 96 49 +Card 86: 99 17 2 89 42 19 3 94 4 12 | 17 94 34 47 64 57 19 77 96 42 2 33 99 73 63 89 41 32 15 56 4 12 98 3 39 +Card 87: 43 60 77 76 78 19 51 99 39 57 | 49 26 8 1 92 70 61 54 16 98 37 32 44 43 51 9 6 30 66 74 75 72 14 40 3 +Card 88: 24 22 59 84 72 98 92 75 52 82 | 80 56 85 37 68 71 62 4 38 84 22 16 98 75 23 52 64 59 92 72 29 24 82 93 50 +Card 89: 79 5 64 69 73 95 74 49 56 47 | 47 49 61 93 6 69 85 42 5 88 66 59 19 96 72 95 26 84 9 44 79 92 25 73 1 +Card 90: 67 63 84 5 13 81 38 78 9 2 | 97 53 90 13 29 38 62 46 83 70 33 47 45 99 54 65 81 11 61 82 26 91 27 88 22 +Card 91: 39 72 25 54 90 11 79 42 4 14 | 53 83 63 25 34 11 13 78 2 15 42 62 7 28 72 91 38 54 37 75 71 5 20 14 59 +Card 92: 46 70 28 3 20 9 45 32 77 14 | 85 79 49 45 64 78 33 9 53 36 96 28 29 21 50 80 27 87 22 3 31 73 14 32 2 +Card 93: 81 59 32 19 80 13 78 70 65 38 | 32 14 23 73 65 81 56 26 50 70 19 59 27 15 17 13 48 38 53 3 77 16 80 78 36 +Card 94: 86 53 49 85 95 70 27 32 4 24 | 41 84 58 73 4 13 88 55 94 46 90 6 50 65 21 53 97 14 10 44 69 59 56 79 68 +Card 95: 59 99 76 63 47 4 8 67 23 96 | 69 9 21 8 47 75 44 29 4 12 88 38 11 13 23 85 6 18 97 2 34 1 17 32 16 +Card 96: 82 97 72 34 28 52 78 80 20 92 | 56 83 32 84 21 74 25 24 61 23 88 66 94 1 29 73 35 70 57 11 81 26 60 63 58 +Card 97: 34 76 39 38 23 51 55 25 40 22 | 91 43 59 66 40 3 45 24 56 96 98 73 29 71 30 1 50 46 78 8 11 9 27 64 26 +Card 98: 66 42 1 45 92 32 71 88 5 82 | 50 88 42 70 60 6 27 49 36 1 35 53 82 14 71 77 5 7 78 48 31 81 52 92 45 +Card 99: 12 2 77 94 59 98 95 10 39 32 | 76 88 5 12 45 55 27 17 11 98 10 87 97 99 20 78 46 4 96 26 14 82 22 39 16 +Card 100: 22 96 56 41 90 47 29 58 87 32 | 15 65 80 82 49 24 33 85 20 74 70 54 50 12 78 47 28 9 32 16 67 71 99 1 17 +Card 101: 1 23 74 4 72 26 75 68 89 83 | 83 58 63 1 52 20 26 33 64 41 53 65 57 80 69 38 4 90 74 39 32 13 61 55 14 +Card 102: 75 14 28 46 23 36 68 71 70 98 | 19 33 54 4 5 8 41 6 14 88 46 3 62 10 48 7 77 92 16 39 40 27 31 99 1 +Card 103: 65 33 61 53 51 29 26 83 19 18 | 7 2 82 55 13 22 6 27 90 99 14 50 79 25 63 46 97 81 85 61 87 28 75 31 96 +Card 104: 51 87 57 78 60 94 82 12 88 11 | 72 78 77 70 54 39 55 24 86 18 58 52 20 63 29 33 31 97 66 69 62 6 56 25 35 +Card 105: 17 55 95 42 16 52 72 9 79 59 | 98 30 35 20 46 43 51 66 75 48 52 44 34 96 65 37 41 50 74 21 38 18 73 10 76 +Card 106: 44 91 36 94 24 31 83 50 70 52 | 18 38 42 17 12 56 64 32 79 76 39 73 60 80 53 57 96 88 82 77 4 69 23 45 7 +Card 107: 45 48 58 26 5 2 35 63 78 70 | 49 71 10 21 50 13 95 6 68 84 4 40 45 31 1 34 27 2 5 85 39 44 98 83 46 +Card 108: 18 4 63 24 83 40 16 48 21 26 | 87 48 21 59 22 6 26 40 98 69 43 14 83 4 16 15 58 68 64 57 63 72 18 60 24 +Card 109: 36 46 49 57 83 68 45 30 1 58 | 35 38 22 12 39 90 86 26 72 67 81 87 79 27 25 29 4 99 41 59 96 94 9 28 75 +Card 110: 58 2 71 72 92 91 75 4 19 81 | 75 26 14 91 71 19 88 11 13 72 32 58 92 24 96 33 74 46 27 38 4 81 20 28 2 +Card 111: 3 78 14 85 53 1 2 32 59 10 | 20 62 53 94 72 45 2 46 87 17 98 74 44 25 47 60 83 59 65 81 38 24 23 39 12 +Card 112: 61 37 90 17 55 94 89 87 5 39 | 90 27 88 64 94 13 41 55 44 21 30 37 84 39 5 32 46 86 14 54 85 17 89 35 31 +Card 113: 73 76 33 37 82 79 56 22 57 6 | 76 20 41 85 2 60 37 32 6 82 94 26 63 56 16 28 33 47 70 99 73 40 22 79 57 +Card 114: 11 54 66 70 60 78 89 94 80 96 | 14 76 70 33 48 53 90 47 66 6 64 96 83 20 56 34 35 11 75 89 41 60 7 39 1 +Card 115: 45 5 33 12 63 95 27 42 1 84 | 51 10 31 27 45 42 1 74 48 72 53 69 63 47 83 33 91 95 39 12 84 11 23 28 65 +Card 116: 5 77 89 65 52 69 32 63 23 85 | 82 73 70 91 11 28 41 14 15 62 37 94 90 95 56 30 96 25 63 47 43 49 83 68 29 +Card 117: 64 80 98 39 45 11 40 22 49 55 | 44 88 40 80 49 67 69 79 62 42 43 30 55 18 5 59 87 98 54 23 45 39 22 11 64 +Card 118: 44 61 75 42 48 66 36 88 9 54 | 62 81 70 3 35 34 79 38 10 32 19 14 65 30 18 42 55 64 92 88 45 83 11 43 23 +Card 119: 82 29 59 20 19 18 66 28 23 49 | 20 19 25 70 59 18 14 36 58 40 23 3 24 80 30 78 88 2 79 72 82 7 66 49 47 +Card 120: 61 40 26 25 4 42 19 76 51 22 | 6 25 11 24 22 44 4 98 49 97 46 88 23 55 66 48 9 33 85 65 84 29 13 60 83 +Card 121: 97 31 11 71 90 96 84 76 53 8 | 71 82 44 99 98 47 40 4 52 53 84 43 27 94 13 88 3 18 28 11 60 24 21 20 38 +Card 122: 29 65 38 48 52 55 3 32 35 95 | 91 45 82 57 38 78 47 75 2 12 46 50 23 87 60 99 18 29 65 25 1 89 35 86 59 +Card 123: 4 91 26 38 36 83 60 72 19 56 | 35 26 36 22 46 69 14 5 70 3 74 47 7 63 72 89 25 60 17 19 62 76 93 75 38 +Card 124: 16 17 73 87 56 22 10 44 92 58 | 54 61 96 42 83 97 5 2 73 69 37 9 50 79 6 57 63 40 75 49 64 70 34 52 11 +Card 125: 37 77 17 70 18 59 65 81 48 15 | 59 49 62 81 12 1 71 90 99 36 25 37 60 64 19 83 21 11 3 27 52 32 45 46 72 +Card 126: 30 34 31 37 3 7 10 8 45 25 | 78 25 12 34 89 63 59 96 41 75 58 71 93 28 17 90 84 7 4 21 13 33 52 14 19 +Card 127: 3 31 15 35 26 88 75 82 77 68 | 13 33 47 92 51 32 74 66 99 44 79 62 22 64 43 23 12 49 60 57 4 83 89 65 21 +Card 128: 9 72 20 10 14 95 86 50 85 82 | 82 25 99 53 97 31 42 8 89 68 58 43 15 30 47 1 26 67 87 57 78 18 60 61 75 +Card 129: 73 72 68 95 79 76 69 24 1 98 | 15 51 83 7 74 5 93 8 27 40 78 81 3 37 44 14 21 99 97 67 57 71 84 86 64 +Card 130: 30 80 40 86 26 36 75 44 41 57 | 81 23 30 73 12 44 8 97 39 42 87 58 33 85 98 57 26 92 80 45 63 21 43 11 99 +Card 131: 22 20 60 75 26 57 33 88 74 38 | 21 92 47 36 5 65 69 9 39 1 33 87 34 53 72 44 15 51 58 25 18 67 19 2 93 +Card 132: 49 65 86 52 33 67 8 83 61 3 | 43 7 74 30 19 53 89 94 32 11 83 59 71 33 51 20 65 41 86 82 49 25 21 63 18 +Card 133: 91 17 74 21 23 47 9 57 82 35 | 23 98 88 82 33 5 92 99 7 57 74 96 9 84 66 24 65 46 40 17 2 4 47 21 51 +Card 134: 47 26 41 16 61 76 72 98 24 93 | 2 25 93 11 31 14 91 73 48 47 64 98 85 26 95 19 16 69 13 10 61 9 56 52 24 +Card 135: 23 13 58 83 99 69 93 33 10 37 | 35 54 80 42 58 46 88 19 99 81 47 89 10 30 33 92 69 23 13 37 59 34 39 93 62 +Card 136: 1 36 37 12 22 19 42 56 98 17 | 70 42 47 17 29 61 73 18 94 72 20 80 7 78 6 15 66 37 71 97 44 96 24 43 23 +Card 137: 81 73 66 58 28 36 27 19 67 4 | 21 85 77 72 99 29 38 73 71 86 6 16 58 93 79 91 39 66 80 67 81 20 11 34 40 +Card 138: 30 89 31 51 9 63 81 38 91 14 | 1 32 6 9 91 81 56 95 89 74 96 31 44 23 82 54 39 16 66 87 93 46 20 12 60 +Card 139: 7 22 84 59 50 53 73 13 97 26 | 17 7 46 18 98 82 53 81 10 39 90 45 16 47 95 15 43 19 50 58 99 13 35 14 12 +Card 140: 93 88 6 10 70 26 9 98 29 73 | 35 46 6 48 13 93 61 83 25 19 67 45 89 58 28 39 3 98 75 59 4 81 88 50 54 +Card 141: 12 6 9 54 93 16 99 71 36 11 | 88 98 87 30 35 93 14 54 82 48 78 13 55 90 36 80 46 63 83 39 61 23 69 96 8 +Card 142: 23 50 74 59 27 44 9 24 48 97 | 51 20 19 44 28 83 50 67 70 32 69 37 62 45 65 82 55 2 33 97 14 60 86 87 27 +Card 143: 79 37 21 69 97 74 33 16 39 83 | 98 39 81 84 66 24 17 87 27 48 20 47 78 61 90 53 43 41 42 92 1 52 5 15 59 +Card 144: 92 31 18 6 70 10 93 56 95 43 | 47 32 28 23 77 55 94 42 4 64 14 59 81 97 96 45 29 78 54 69 21 76 92 48 7 +Card 145: 14 42 45 75 62 1 47 66 31 23 | 30 68 76 97 65 83 22 89 34 80 38 42 62 59 74 56 44 48 71 33 51 82 36 54 40 +Card 146: 22 80 81 31 45 84 91 69 47 66 | 5 43 24 39 70 78 58 79 68 88 53 11 63 32 92 99 40 10 34 83 65 28 76 30 19 +Card 147: 83 67 45 87 14 75 29 97 64 94 | 2 86 23 53 1 63 34 54 79 82 35 88 41 44 17 13 37 12 10 56 57 31 70 30 68 +Card 148: 90 42 32 81 64 66 88 60 97 7 | 46 92 67 88 89 7 81 90 66 73 57 37 26 12 10 60 3 97 42 32 87 49 75 58 64 +Card 149: 26 62 65 96 74 6 48 61 91 83 | 74 26 85 51 89 6 44 91 75 65 1 3 96 54 20 77 87 42 61 14 62 68 24 88 17 +Card 150: 14 58 89 56 74 82 75 60 17 29 | 83 27 62 14 66 58 89 75 17 74 16 5 46 56 29 50 57 55 39 54 98 60 4 82 68 +Card 151: 24 33 68 94 57 59 46 17 84 80 | 43 76 66 46 92 39 73 59 84 68 11 81 87 85 62 33 80 99 95 24 17 57 30 97 94 +Card 152: 69 58 62 31 16 20 40 98 96 64 | 63 71 56 31 54 5 85 3 77 42 53 51 19 55 37 49 79 13 80 75 39 6 50 84 40 +Card 153: 43 50 22 2 47 75 76 56 26 80 | 80 70 19 52 43 27 56 26 86 47 50 13 2 88 93 11 74 23 22 57 90 81 40 76 75 +Card 154: 10 79 52 43 44 26 55 6 73 88 | 37 57 55 40 65 47 14 17 39 1 18 51 67 19 21 12 83 59 45 73 3 32 23 88 10 +Card 155: 69 40 90 61 59 70 77 50 31 15 | 31 34 76 14 10 91 12 86 37 24 68 8 15 59 3 35 84 97 30 77 46 70 40 69 61 +Card 156: 65 28 6 23 17 62 13 37 86 73 | 9 69 65 75 18 14 97 57 20 61 94 56 8 58 1 66 21 60 89 63 54 55 76 30 87 +Card 157: 52 34 98 50 56 69 68 45 20 11 | 34 54 69 41 68 20 44 50 76 65 35 24 84 56 45 51 98 64 23 33 9 43 91 2 97 +Card 158: 12 52 92 10 96 84 2 24 14 51 | 85 15 21 63 72 37 95 93 24 5 67 96 6 58 46 22 3 65 99 17 11 10 13 92 78 +Card 159: 85 42 96 78 39 75 21 50 14 20 | 57 88 68 79 61 20 1 78 35 59 12 76 42 92 96 75 52 13 50 89 53 81 11 69 49 +Card 160: 67 59 62 15 26 85 53 79 42 63 | 53 46 1 30 92 23 91 95 88 89 60 38 2 83 96 4 78 37 14 28 69 22 32 41 3 +Card 161: 38 4 97 98 20 55 51 64 80 53 | 53 34 94 65 3 23 45 1 4 72 64 67 51 39 24 63 90 66 29 14 61 40 91 82 49 +Card 162: 41 19 60 53 94 79 1 77 63 47 | 79 6 42 68 95 94 66 27 24 76 61 96 20 84 60 25 85 78 67 63 53 12 89 8 51 +Card 163: 33 83 82 29 51 57 63 88 66 74 | 9 71 58 88 64 70 96 29 77 25 24 55 21 35 81 33 23 45 18 34 63 6 44 83 17 +Card 164: 1 34 54 15 24 97 8 96 73 26 | 42 6 3 21 11 27 69 92 39 59 45 96 73 26 24 98 2 81 83 17 62 54 70 52 95 +Card 165: 75 92 74 11 5 1 91 36 32 24 | 87 16 28 41 79 88 96 63 86 31 58 35 65 68 8 77 42 52 38 19 70 59 14 57 37 +Card 166: 22 87 29 9 56 32 96 28 61 71 | 80 50 45 12 42 72 5 11 63 62 84 39 20 85 95 47 37 91 60 27 81 2 14 33 51 +Card 167: 60 89 56 55 84 30 95 86 11 79 | 26 94 42 66 52 2 98 8 38 71 11 80 19 4 62 10 89 27 91 61 70 90 63 16 68 +Card 168: 59 90 46 84 16 39 34 88 81 83 | 37 56 92 96 59 26 5 45 67 1 63 73 55 21 33 12 79 13 17 89 82 3 43 85 18 +Card 169: 40 31 62 10 36 69 84 23 95 98 | 22 78 4 46 94 83 60 19 90 70 86 8 20 27 35 17 95 85 14 21 28 61 16 74 37 +Card 170: 11 57 4 84 3 28 89 37 50 23 | 42 59 63 33 62 61 75 14 73 68 69 72 67 45 47 58 10 79 91 98 44 49 27 76 25 +Card 171: 37 47 28 12 74 3 96 26 95 22 | 94 79 13 35 89 57 19 71 15 11 78 45 24 32 87 61 67 51 36 73 14 23 70 2 56 +Card 172: 81 58 92 24 61 10 29 77 93 68 | 92 8 77 73 86 57 93 91 61 19 49 88 23 24 72 64 10 31 32 12 81 4 29 58 68 +Card 173: 4 79 39 55 62 88 18 87 24 96 | 79 87 74 39 16 91 55 71 2 88 54 1 58 20 90 18 62 86 43 4 93 24 99 84 96 +Card 174: 15 69 50 70 4 98 73 68 46 22 | 93 36 96 73 49 64 74 46 78 38 22 23 53 17 69 68 89 43 71 94 79 16 58 60 19 +Card 175: 29 61 14 30 9 23 7 31 60 49 | 78 73 61 91 31 27 63 30 9 64 12 51 8 56 74 36 22 88 1 29 21 80 96 38 99 +Card 176: 36 3 35 86 6 93 47 25 79 48 | 91 79 11 20 23 25 30 97 90 24 17 50 60 89 96 52 98 88 99 51 48 68 67 82 61 +Card 177: 89 81 54 66 51 77 61 11 42 39 | 36 26 40 59 90 8 33 65 11 38 96 79 80 2 13 56 46 86 71 92 72 73 95 39 85 +Card 178: 56 34 78 53 2 7 97 88 27 16 | 12 6 97 8 53 17 50 19 21 41 70 86 25 63 84 52 59 78 81 83 85 72 75 71 39 +Card 179: 63 98 17 49 6 40 18 8 82 25 | 56 66 49 33 53 59 2 21 6 80 76 4 17 8 62 57 82 55 98 58 93 52 51 22 25 +Card 180: 56 80 35 88 2 24 98 66 71 76 | 77 28 86 36 70 85 65 58 15 32 19 56 61 33 27 79 81 35 16 69 55 57 59 45 82 +Card 181: 6 31 42 96 19 4 68 28 58 99 | 48 73 97 4 68 42 70 49 39 56 14 67 89 85 81 96 27 16 15 5 94 69 33 11 44 +Card 182: 36 8 13 24 90 99 52 1 56 87 | 12 85 1 9 88 30 74 13 26 80 48 72 10 65 91 44 21 37 70 3 93 29 90 61 7 +Card 183: 83 30 76 63 77 11 22 33 15 72 | 83 12 60 16 42 31 63 55 99 1 89 93 88 85 47 48 96 97 29 45 7 75 71 8 33 +Card 184: 91 4 17 34 61 70 48 64 38 68 | 66 99 94 3 98 44 90 23 14 38 55 56 68 42 87 95 54 13 7 65 5 18 79 62 57 +Card 185: 92 81 63 22 41 13 59 79 40 70 | 94 26 80 48 82 50 23 8 93 49 19 24 58 5 43 16 53 61 37 42 44 40 95 67 25 +Card 186: 3 65 75 74 68 4 61 28 91 42 | 56 85 83 29 63 11 20 18 66 53 71 62 33 69 30 93 67 47 72 51 7 80 46 44 9 +Card 187: 76 60 87 97 68 27 52 20 12 54 | 87 7 8 14 30 19 39 22 65 24 40 34 61 20 64 81 33 25 69 26 52 76 71 11 60 +Card 188: 39 87 24 31 93 1 91 18 20 28 | 47 50 84 24 38 7 37 57 91 96 28 10 14 55 76 35 2 45 29 58 79 27 70 23 21 +Card 189: 69 77 14 29 62 32 37 57 61 8 | 73 39 51 80 89 32 8 87 81 62 92 21 4 49 79 40 10 96 55 98 69 74 97 72 37 +Card 190: 69 46 86 75 59 29 78 72 16 54 | 18 86 68 63 9 49 50 10 19 77 65 69 79 12 24 76 64 58 1 16 30 13 98 11 75 +Card 191: 52 35 79 94 34 5 96 38 70 90 | 65 46 49 11 48 1 29 82 24 85 51 61 84 81 18 20 67 41 33 88 89 25 6 83 68 +Card 192: 8 66 41 82 36 43 50 97 29 3 | 5 56 32 47 13 82 50 1 39 8 70 20 97 99 33 76 3 46 43 36 26 66 83 61 29 +Card 193: 22 70 17 82 6 24 4 35 32 61 | 24 22 67 2 89 35 95 1 34 82 39 14 5 51 27 26 4 32 43 76 45 9 70 17 30 +Card 194: 54 90 83 51 22 45 97 41 92 61 | 32 37 94 87 41 21 98 54 40 14 4 79 61 82 97 59 44 45 28 73 66 84 63 35 23 +Card 195: 68 89 18 86 4 5 82 78 3 35 | 14 21 75 98 88 28 44 49 20 95 25 68 67 79 65 30 37 87 61 78 8 73 77 31 16 +Card 196: 16 64 6 99 67 55 51 50 37 71 | 12 89 81 63 62 82 85 60 76 8 4 32 83 51 38 69 92 35 10 90 58 56 77 99 29 +Card 197: 85 67 81 59 28 36 13 84 83 92 | 67 56 68 12 34 30 60 41 58 92 49 81 22 23 21 18 5 69 71 75 94 53 90 36 9 +Card 198: 99 10 39 1 13 21 15 84 44 40 | 64 58 40 26 8 97 83 87 86 85 29 54 44 99 6 80 55 36 84 82 18 92 81 35 15 +Card 199: 16 74 44 41 37 70 15 20 36 9 | 63 89 93 59 81 76 85 14 92 30 67 71 69 49 7 39 99 97 62 18 55 83 11 79 36 +Card 200: 78 75 82 83 61 95 2 56 49 53 | 66 19 77 94 74 97 79 34 33 16 83 41 81 91 52 62 14 21 35 4 99 50 30 42 36 +Card 201: 97 48 74 15 5 4 40 64 95 33 | 83 54 73 81 37 53 85 20 68 51 82 41 27 42 60 63 50 58 98 35 9 23 18 2 32 +Card 202: 83 90 4 89 57 72 30 13 8 23 | 99 33 38 70 39 12 71 35 46 94 82 79 44 62 98 74 64 16 32 66 65 95 47 58 23 +Card 203: 38 61 14 84 65 96 90 69 53 11 | 24 50 66 56 26 25 3 60 95 19 10 21 12 87 92 37 99 76 71 57 17 55 30 6 44 From 018cc4a904eff79926378d023f15836d39e90492 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 4 Dec 2023 11:10:54 +0000 Subject: [PATCH 393/479] 2023: d04: ex2: add solution --- 2023/d04/ex2/ex2.py | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100755 2023/d04/ex2/ex2.py diff --git a/2023/d04/ex2/ex2.py b/2023/d04/ex2/ex2.py new file mode 100755 index 0000000..b1648bf --- /dev/null +++ b/2023/d04/ex2/ex2.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +import dataclasses +import sys + + +@dataclasses.dataclass +class Card: + win_nums: set[int] + nums: set[int] + copies: int = 1 + + +# The input is in order without skipping, but just in case... +Cards = dict[int, Card] + + +def solve(input: list[str]) -> int: + def parse_nums(nums: str) -> set[int]: + return {int(n) for n in nums.split(" ") if n != ""} + + # This does *not* expect the "Card :" bit + def parse_card(card: str) -> Card: + win_nums, nums = card.split("|") + return Card( + win_nums=parse_nums(win_nums), + nums=parse_nums(nums), + ) + + def parse_line(line: str) -> tuple[int, Card]: + card_id, card = line.split(": ") + return int(card_id.removeprefix("Card")), parse_card(card) + + def parse(input: list[str]) -> Cards: + parsed = map(parse_line, input) + return {id: card for id, card in parsed} + + def score(card: Card) -> int: + actual_win_nums = card.nums & card.win_nums + return len(actual_win_nums) + + cards = parse(input) + for i, card in cards.items(): + winnings = score(card) + for n in range(1, winnings + 1): + cards[i + n].copies += card.copies + + return sum(card.copies for card in cards.values()) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 2583ad84d63571e8bfdcc13967e746475dc9f1bc Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 5 Dec 2023 20:06:07 +0000 Subject: [PATCH 394/479] 2023: d05: ex1: add input --- 2023/d05/ex1/input | 221 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 2023/d05/ex1/input diff --git a/2023/d05/ex1/input b/2023/d05/ex1/input new file mode 100644 index 0000000..1479dbc --- /dev/null +++ b/2023/d05/ex1/input @@ -0,0 +1,221 @@ +seeds: 2019933646 2719986 2982244904 337763798 445440 255553492 1676917594 196488200 3863266382 36104375 1385433279 178385087 2169075746 171590090 572674563 5944769 835041333 194256900 664827176 42427020 + +seed-to-soil map: +3566547172 3725495029 569472267 +2346761246 1249510998 267846697 +1812605508 937956667 271194541 +1421378697 1209151208 40359790 +2083800049 2788751092 262961197 +2938601691 473979048 463977619 +473979048 1517357695 947399649 +4136019439 3566547172 158947857 +1461738487 3051712289 350867021 +2614607943 2464757344 323993748 + +soil-to-fertilizer map: +3107230831 2583931429 576709409 +970181981 608291332 1441137369 +743954495 3859046283 158951815 +3683940240 3227916509 91282070 +608291332 2448268266 135663163 +3775222310 2049428701 398839565 +2411319350 3319198579 539847704 +2951167054 4017998098 156063777 +902906310 3160640838 67275671 + +fertilizer-to-water map: +1257642402 395703749 69589612 +1800674 2215701547 90550534 +2757853693 358464863 37238886 +3285451399 181079109 43937782 +2346544130 3513448371 192150886 +3866348216 4231433060 63534236 +1327232014 1560332334 90281838 +2538695016 616206288 114467702 +255018176 225016891 46372244 +1171065990 3705599257 27021880 +1070753744 730673990 442780 +221369008 3479799203 33649168 +2987721226 271389135 80072982 +1198087870 732917444 24556356 +199036270 2306252081 22332738 +0 731116770 1800674 +3929882452 3989920675 212758268 +631506549 757473800 322942578 +301390420 0 157952443 +2795092579 157952443 1997721 +1222644226 2619085211 34998176 +954449127 499901671 116304617 +1429766246 159950164 21128945 +2205492221 2074649638 141051909 +2749302577 3732621137 8551116 +459342863 1219863414 57737723 +3329389181 3741172253 59047790 +2797090300 2328584819 190630926 +3278448653 351462117 7002746 +126959518 1277601137 72076752 +92351208 465293361 34608310 +4142640720 3866348216 123572459 +2143980560 1080416378 43307177 +1450895191 2672287871 693085369 +517080586 3365373240 114425963 +3388436971 1662866566 411783072 +2187287737 2654083387 18204484 +1417513852 1650614172 12252394 +3067794208 1349677889 210654445 +4266213179 4202678943 28754117 +2653162718 1123723555 96139859 +1071196524 2519215745 99869466 + +water-to-light map: +512627839 90187036 1196629 +3379634653 2059506154 33434334 +3286651054 4276482087 18485209 +4233695090 28914830 61272206 +3413068987 3322576776 23288997 +3736304424 3345865773 43267308 +1246285471 2994853001 251748584 +3779571732 1946298040 113208114 +390808412 3287769466 34807310 +1881283842 2879009693 106527924 +3964031050 2506138169 12994476 +3436357984 793897944 162691614 +2255160753 2092940488 151061610 +853985057 3506201042 119010035 +301385394 1856875022 89423018 +972995092 658665705 34308693 +4159948022 1315925500 65322692 +640912738 250463411 213072319 +1761800914 91383665 102591221 +450345319 3246601585 5793995 +3186220306 4173678310 91115364 +28914830 3633635453 176360375 +456139314 193974886 56488525 +2523290324 3809995828 187303152 +2406222363 3389133081 117067961 +205275205 2782899504 96110189 +2135785589 1100569535 119375164 +1121466033 533846267 124819438 +1007303785 2244002098 114162248 +3599049598 3997298980 137254826 +4077949072 463535730 70310537 +4225270714 3625211077 8424376 +1498034055 2519132645 263766859 +2710593476 1381248192 475626830 +3977025526 692974398 100923546 +4148259609 4264793674 11688413 +1987811766 2358164346 147973823 +3892779846 1244674296 71251204 +3340510149 4134553806 39124504 +1864392135 956589558 16891707 +425615722 1219944699 24729597 +513824468 973481265 127088270 +3277335670 2985537617 9315384 +3305136263 3252395580 35373886 + +light-to-temperature map: +1094191559 698410082 28110394 +383870732 1189042355 107231661 +3711052230 2164474756 34756304 +745558539 170241759 7170863 +491102393 503970250 194439832 +4034618875 3142749029 146609939 +3781998432 1718948669 129329785 +2440091414 3071819711 70929318 +1301358031 55123603 115118156 +0 2789116652 87933685 +770729148 177412622 48955790 +3772681560 3886204605 9316872 +752729402 37123857 17999746 +3745808534 2137385460 7147939 +2028807236 3677936618 208267987 +2237075223 3289358968 92979022 +88764920 1960439220 176946240 +3568470355 2258695303 142581875 +3276170082 1848278454 112160766 +2637902204 1129503077 39814191 +3000547589 892603630 188042422 +2511020732 226368412 126881472 +1122301953 1296274016 52818372 +1440958847 1353023078 243104929 +2963423732 0 37123857 +3388330848 2199231060 48304954 +1175120325 377732544 126237706 +819684938 1349092388 3930690 +3752956473 1169317268 19725087 +3911328217 2144533399 19941357 +1416476187 353249884 24482660 +2677716395 3895521477 285707337 +265711160 2413138935 118159572 +685542225 1080646052 48857025 +3556608598 2401277178 11861757 +734399250 2247536014 11159289 +87933685 3677105383 831235 +3188590011 1596128007 87580071 +836373414 2531298507 257818145 +3471876393 2877050337 84732205 +1684063776 726520476 166083154 +823615628 3560998296 12757786 +3436635802 1683708078 35240591 +3931269574 3573756082 103349301 +1850146930 3382337990 178660306 +2330054245 2961782542 110037169 + +temperature-to-humidity map: +1773059646 4122818507 172148789 +2417158855 2859734866 110076859 +977168274 1576624124 28149321 +4275291678 3797606290 19675618 +1141296808 749646180 267286171 +3592756112 2969811725 273274339 +0 19621130 7167651 +2059084943 2697725300 48133058 +2107218001 3920609496 145140777 +1453481278 1152911564 151292167 +1408582979 1465584228 44898299 +7167651 0 19621130 +2907567891 1829621431 240604380 +2252358778 3652347291 145258999 +1005317595 1016932351 135979213 +1945208435 2745858358 113876508 +2397617777 4065750273 16506015 +3251499859 1776094709 53526722 +2867005672 4082256288 40562219 +26788781 1304203731 161380497 +3305026581 2409995769 287729531 +3866030451 3243086064 409261227 +2414123792 1773059646 3035063 +911026677 1510482527 66141597 +3148172271 3817281908 103327588 +2527235714 2070225811 339769958 +188169278 26788781 722857399 + +humidity-to-location map: +3907319746 3137303541 31421983 +3085093695 1018495475 286155292 +2898003508 2491485887 87665522 +2546787368 2901838353 7997221 +3835317650 2829836257 72002096 +2554784589 3509894030 133012322 +3487595595 3719561871 104747874 +3714670750 2667334372 120646900 +975094571 2909835574 227467967 +2985669030 3864000834 99424665 +3672962118 2449777255 41708632 +3631107133 2787981272 41854985 +3938741729 3963425499 15057061 +3447904506 3824309745 39691089 +1824175159 1304650767 641793976 +242892183 0 6504921 +3371248987 3642906352 76655519 +1698833898 2258930589 81940357 +0 6504921 242892183 +2465969135 3978482560 80818233 +3592343469 4256203632 38763664 +3953798790 3168725524 341168506 +2775979874 4134179998 122023634 +1780774255 975094571 43400904 +1311468847 1946444743 312485846 +2687796911 2579151409 88182963 +1202562538 2340870946 108906309 +1623954693 4059300793 74879205 From 052d0116fdec32a7a988aa0d419e599bcab7456f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 5 Dec 2023 20:06:13 +0000 Subject: [PATCH 395/479] 2023: d05: ex1: add solution --- 2023/d05/ex1/ex1.py | 73 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100755 2023/d05/ex1/ex1.py diff --git a/2023/d05/ex1/ex1.py b/2023/d05/ex1/ex1.py new file mode 100755 index 0000000..c285cd0 --- /dev/null +++ b/2023/d05/ex1/ex1.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python + +import sys +from typing import NamedTuple + + +class AlmanacMapLine(NamedTuple): + dest_start: int + source_start: int + map_len: int + + +class AlmanacMap(NamedTuple): + lines: list[AlmanacMapLine] + + def map(self, input: int) -> int: + for l in self.lines: + if input < l.source_start: + continue + if (l.source_start + l.map_len) <= input: + continue + return l.dest_start + (input - l.source_start) + return input + + +Almanac = dict[str, tuple[str, AlmanacMap]] + + +def solve(input: str) -> int: + def parse_almanac_map_line(line: str) -> AlmanacMapLine: + dest_start, source_start, map_len = map(int, line.split(" ")) + return AlmanacMapLine(dest_start, source_start, map_len) + + def parse_almanac_map(lines: list[str]) -> tuple[str, str, AlmanacMap]: + source, dest = lines[0].split(" ")[0].split("-")[::2] + + map_lines = [parse_almanac_map_line(line) for line in lines[1:]] + + return source, dest, AlmanacMap(map_lines) + + def parse_almanac(paragraphs: list[str]) -> Almanac: + res: Almanac = {} + + for raw_map in paragraphs: + source, dest, map = parse_almanac_map(raw_map.splitlines()) + res[source] = dest, map + + return res + + def parse(input: str) -> tuple[set[int], Almanac]: + raw_seeds, *raw_almanac = input.split("\n\n") + + seeds = set(int(n) for n in raw_seeds.removeprefix("seeds: ").split(" ")) + + return seeds, parse_almanac(raw_almanac) + + def to_dest(almanac: Almanac, input: int, input_type: str, dest_type: str) -> int: + if input_type == dest_type: + return input + new_input_type, map = almanac[input_type] + return to_dest(almanac, map.map(input), new_input_type, dest_type) + + seeds, almanac = parse(input) + return min(to_dest(almanac, seed, "seed", "location") for seed in seeds) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() From ffb2c5346b93ace66c3725e69ab1c84efeefa9dd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 5 Dec 2023 20:06:18 +0000 Subject: [PATCH 396/479] 2023: d05: ex2: add input --- 2023/d05/ex2/input | 221 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 2023/d05/ex2/input diff --git a/2023/d05/ex2/input b/2023/d05/ex2/input new file mode 100644 index 0000000..1479dbc --- /dev/null +++ b/2023/d05/ex2/input @@ -0,0 +1,221 @@ +seeds: 2019933646 2719986 2982244904 337763798 445440 255553492 1676917594 196488200 3863266382 36104375 1385433279 178385087 2169075746 171590090 572674563 5944769 835041333 194256900 664827176 42427020 + +seed-to-soil map: +3566547172 3725495029 569472267 +2346761246 1249510998 267846697 +1812605508 937956667 271194541 +1421378697 1209151208 40359790 +2083800049 2788751092 262961197 +2938601691 473979048 463977619 +473979048 1517357695 947399649 +4136019439 3566547172 158947857 +1461738487 3051712289 350867021 +2614607943 2464757344 323993748 + +soil-to-fertilizer map: +3107230831 2583931429 576709409 +970181981 608291332 1441137369 +743954495 3859046283 158951815 +3683940240 3227916509 91282070 +608291332 2448268266 135663163 +3775222310 2049428701 398839565 +2411319350 3319198579 539847704 +2951167054 4017998098 156063777 +902906310 3160640838 67275671 + +fertilizer-to-water map: +1257642402 395703749 69589612 +1800674 2215701547 90550534 +2757853693 358464863 37238886 +3285451399 181079109 43937782 +2346544130 3513448371 192150886 +3866348216 4231433060 63534236 +1327232014 1560332334 90281838 +2538695016 616206288 114467702 +255018176 225016891 46372244 +1171065990 3705599257 27021880 +1070753744 730673990 442780 +221369008 3479799203 33649168 +2987721226 271389135 80072982 +1198087870 732917444 24556356 +199036270 2306252081 22332738 +0 731116770 1800674 +3929882452 3989920675 212758268 +631506549 757473800 322942578 +301390420 0 157952443 +2795092579 157952443 1997721 +1222644226 2619085211 34998176 +954449127 499901671 116304617 +1429766246 159950164 21128945 +2205492221 2074649638 141051909 +2749302577 3732621137 8551116 +459342863 1219863414 57737723 +3329389181 3741172253 59047790 +2797090300 2328584819 190630926 +3278448653 351462117 7002746 +126959518 1277601137 72076752 +92351208 465293361 34608310 +4142640720 3866348216 123572459 +2143980560 1080416378 43307177 +1450895191 2672287871 693085369 +517080586 3365373240 114425963 +3388436971 1662866566 411783072 +2187287737 2654083387 18204484 +1417513852 1650614172 12252394 +3067794208 1349677889 210654445 +4266213179 4202678943 28754117 +2653162718 1123723555 96139859 +1071196524 2519215745 99869466 + +water-to-light map: +512627839 90187036 1196629 +3379634653 2059506154 33434334 +3286651054 4276482087 18485209 +4233695090 28914830 61272206 +3413068987 3322576776 23288997 +3736304424 3345865773 43267308 +1246285471 2994853001 251748584 +3779571732 1946298040 113208114 +390808412 3287769466 34807310 +1881283842 2879009693 106527924 +3964031050 2506138169 12994476 +3436357984 793897944 162691614 +2255160753 2092940488 151061610 +853985057 3506201042 119010035 +301385394 1856875022 89423018 +972995092 658665705 34308693 +4159948022 1315925500 65322692 +640912738 250463411 213072319 +1761800914 91383665 102591221 +450345319 3246601585 5793995 +3186220306 4173678310 91115364 +28914830 3633635453 176360375 +456139314 193974886 56488525 +2523290324 3809995828 187303152 +2406222363 3389133081 117067961 +205275205 2782899504 96110189 +2135785589 1100569535 119375164 +1121466033 533846267 124819438 +1007303785 2244002098 114162248 +3599049598 3997298980 137254826 +4077949072 463535730 70310537 +4225270714 3625211077 8424376 +1498034055 2519132645 263766859 +2710593476 1381248192 475626830 +3977025526 692974398 100923546 +4148259609 4264793674 11688413 +1987811766 2358164346 147973823 +3892779846 1244674296 71251204 +3340510149 4134553806 39124504 +1864392135 956589558 16891707 +425615722 1219944699 24729597 +513824468 973481265 127088270 +3277335670 2985537617 9315384 +3305136263 3252395580 35373886 + +light-to-temperature map: +1094191559 698410082 28110394 +383870732 1189042355 107231661 +3711052230 2164474756 34756304 +745558539 170241759 7170863 +491102393 503970250 194439832 +4034618875 3142749029 146609939 +3781998432 1718948669 129329785 +2440091414 3071819711 70929318 +1301358031 55123603 115118156 +0 2789116652 87933685 +770729148 177412622 48955790 +3772681560 3886204605 9316872 +752729402 37123857 17999746 +3745808534 2137385460 7147939 +2028807236 3677936618 208267987 +2237075223 3289358968 92979022 +88764920 1960439220 176946240 +3568470355 2258695303 142581875 +3276170082 1848278454 112160766 +2637902204 1129503077 39814191 +3000547589 892603630 188042422 +2511020732 226368412 126881472 +1122301953 1296274016 52818372 +1440958847 1353023078 243104929 +2963423732 0 37123857 +3388330848 2199231060 48304954 +1175120325 377732544 126237706 +819684938 1349092388 3930690 +3752956473 1169317268 19725087 +3911328217 2144533399 19941357 +1416476187 353249884 24482660 +2677716395 3895521477 285707337 +265711160 2413138935 118159572 +685542225 1080646052 48857025 +3556608598 2401277178 11861757 +734399250 2247536014 11159289 +87933685 3677105383 831235 +3188590011 1596128007 87580071 +836373414 2531298507 257818145 +3471876393 2877050337 84732205 +1684063776 726520476 166083154 +823615628 3560998296 12757786 +3436635802 1683708078 35240591 +3931269574 3573756082 103349301 +1850146930 3382337990 178660306 +2330054245 2961782542 110037169 + +temperature-to-humidity map: +1773059646 4122818507 172148789 +2417158855 2859734866 110076859 +977168274 1576624124 28149321 +4275291678 3797606290 19675618 +1141296808 749646180 267286171 +3592756112 2969811725 273274339 +0 19621130 7167651 +2059084943 2697725300 48133058 +2107218001 3920609496 145140777 +1453481278 1152911564 151292167 +1408582979 1465584228 44898299 +7167651 0 19621130 +2907567891 1829621431 240604380 +2252358778 3652347291 145258999 +1005317595 1016932351 135979213 +1945208435 2745858358 113876508 +2397617777 4065750273 16506015 +3251499859 1776094709 53526722 +2867005672 4082256288 40562219 +26788781 1304203731 161380497 +3305026581 2409995769 287729531 +3866030451 3243086064 409261227 +2414123792 1773059646 3035063 +911026677 1510482527 66141597 +3148172271 3817281908 103327588 +2527235714 2070225811 339769958 +188169278 26788781 722857399 + +humidity-to-location map: +3907319746 3137303541 31421983 +3085093695 1018495475 286155292 +2898003508 2491485887 87665522 +2546787368 2901838353 7997221 +3835317650 2829836257 72002096 +2554784589 3509894030 133012322 +3487595595 3719561871 104747874 +3714670750 2667334372 120646900 +975094571 2909835574 227467967 +2985669030 3864000834 99424665 +3672962118 2449777255 41708632 +3631107133 2787981272 41854985 +3938741729 3963425499 15057061 +3447904506 3824309745 39691089 +1824175159 1304650767 641793976 +242892183 0 6504921 +3371248987 3642906352 76655519 +1698833898 2258930589 81940357 +0 6504921 242892183 +2465969135 3978482560 80818233 +3592343469 4256203632 38763664 +3953798790 3168725524 341168506 +2775979874 4134179998 122023634 +1780774255 975094571 43400904 +1311468847 1946444743 312485846 +2687796911 2579151409 88182963 +1202562538 2340870946 108906309 +1623954693 4059300793 74879205 From 7d4377d6a2b3aeeb5cb52b9d567b44ebc36594a2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 5 Dec 2023 20:06:23 +0000 Subject: [PATCH 397/479] 2023: d05: ex2: add solution --- 2023/d05/ex2/ex2.py | 105 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100755 2023/d05/ex2/ex2.py diff --git a/2023/d05/ex2/ex2.py b/2023/d05/ex2/ex2.py new file mode 100755 index 0000000..7b7bd27 --- /dev/null +++ b/2023/d05/ex2/ex2.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python + +import itertools +import sys +from typing import NamedTuple, Optional + + +class AlmanacMapLine(NamedTuple): + dest_start: int + source_start: int + map_len: int + + +class AlmanacMap(NamedTuple): + lines: list[AlmanacMapLine] + + def map(self, input: int) -> int: + for l in self.lines: + if input < l.source_start: + continue + if (l.source_start + l.map_len) <= input: + continue + return l.dest_start + (input - l.source_start) + return input + + +Almanac = dict[str, tuple[str, AlmanacMap]] +SeedRanges = list[tuple[int, int]] + + +def solve(input: str) -> int: + def parse_almanac_map_line(line: str) -> AlmanacMapLine: + dest_start, source_start, map_len = map(int, line.split(" ")) + return AlmanacMapLine(dest_start, source_start, map_len) + + def parse_almanac_map(lines: list[str]) -> tuple[str, str, AlmanacMap]: + source, dest = lines[0].split(" ")[0].split("-")[::2] + + map_lines = [parse_almanac_map_line(line) for line in lines[1:]] + + return source, dest, AlmanacMap(map_lines) + + def parse_almanac(paragraphs: list[str]) -> Almanac: + res: Almanac = {} + + for raw_map in paragraphs: + source, dest, map = parse_almanac_map(raw_map.splitlines()) + res[source] = dest, map + + return res + + def parse(input: str) -> tuple[SeedRanges, Almanac]: + raw_seeds, *raw_almanac = input.split("\n\n") + + parsed_seed = [int(n) for n in raw_seeds.removeprefix("seeds: ").split(" ")] + seed_ranges = list(zip(parsed_seed[::2], parsed_seed[1::2])) + + return seed_ranges, parse_almanac(raw_almanac) + + # Each input is piped to exactly one output type, so we can reverse it easily + def reverse_almanac(almanac: Almanac) -> Almanac: + def reverse_map_line(line: AlmanacMapLine) -> AlmanacMapLine: + return AlmanacMapLine( + dest_start=line.source_start, + source_start=line.dest_start, + map_len=line.map_len, + ) + + def reverse_map(map: AlmanacMap) -> AlmanacMap: + return AlmanacMap([reverse_map_line(line) for line in map.lines]) + + reversed: Almanac = {} + + for source, (dest, map) in almanac.items(): + reversed[dest] = source, reverse_map(map) + + return reversed + + def lowest_location(seeds: SeedRanges, inverse_almanac: Almanac) -> int: + def recurse(input: int, input_type: str) -> Optional[int]: + if input_type == "seed": + for start, length in seeds: + if start <= input and input < (start + length): + return input + return None + + new_input_type, map = inverse_almanac[input_type] + return recurse(map.map(input), new_input_type) + + for location in itertools.count(): + if recurse(location, "location") is not None: + return location + assert False # Sanity check + + seeds, almanac = parse(input) + return lowest_location(seeds, reverse_almanac(almanac)) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() From 60da30ee6c0d73d2b4e6faa245a21f7b5efda03d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 6 Dec 2023 09:15:54 +0000 Subject: [PATCH 398/479] 2023: d06: ex1: add input --- 2023/d06/ex1/input | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 2023/d06/ex1/input diff --git a/2023/d06/ex1/input b/2023/d06/ex1/input new file mode 100644 index 0000000..078c0bb --- /dev/null +++ b/2023/d06/ex1/input @@ -0,0 +1,2 @@ +Time: 56 71 79 99 +Distance: 334 1135 1350 2430 From 1081a4fc8d59c8ed7baa558f3b433703ebc0d3a8 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 6 Dec 2023 09:16:02 +0000 Subject: [PATCH 399/479] 2023: d06: ex1: add solution --- 2023/d06/ex1/ex1.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100755 2023/d06/ex1/ex1.py diff --git a/2023/d06/ex1/ex1.py b/2023/d06/ex1/ex1.py new file mode 100755 index 0000000..1cbd4b7 --- /dev/null +++ b/2023/d06/ex1/ex1.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +import math +import sys + + +def solve(input: list[str]) -> int: + def parse_line(line: str) -> list[int]: + return [int(n) for n in line.split(":")[1].split()] + + def solve(time: int, distance: int) -> int: + # With n being the button-held-down time. + # We want to solve: (time - n) * n > distance + # So we want the number of intergers in ]n_1, n_2[, n_1 and n_2 roots of the quadratic + # a = -1, b = time, c = -distance + determinant = time**2 - 4 * distance + if determinant <= 0: + return 0 + max = time / 2 + delta = math.sqrt(determinant) / 2 + n_1 = max - delta + n_2 = max + delta + return math.ceil(n_2 - 1) - math.floor(n_1 + 1) + 1 + + times, distances = map(parse_line, input) + + return math.prod(solve(t, d) for t, d in zip(times, distances)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 10fb8ca2d14fc15884cc3ad158408341c2f3c2ec Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 6 Dec 2023 09:16:09 +0000 Subject: [PATCH 400/479] 2023: d06: ex2: add input --- 2023/d06/ex2/input | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 2023/d06/ex2/input diff --git a/2023/d06/ex2/input b/2023/d06/ex2/input new file mode 100644 index 0000000..078c0bb --- /dev/null +++ b/2023/d06/ex2/input @@ -0,0 +1,2 @@ +Time: 56 71 79 99 +Distance: 334 1135 1350 2430 From 6b8dbbd938b4201c284477031cd5a5c6f88218e1 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 6 Dec 2023 09:16:14 +0000 Subject: [PATCH 401/479] 2023: d06: ex2: add solution --- 2023/d06/ex2/ex2.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100755 2023/d06/ex2/ex2.py diff --git a/2023/d06/ex2/ex2.py b/2023/d06/ex2/ex2.py new file mode 100755 index 0000000..fdc6ceb --- /dev/null +++ b/2023/d06/ex2/ex2.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +import math +import sys + + +def solve(input: list[str]) -> int: + def parse_line(line: str) -> int: + return int("".join(line.split(":")[1].split())) + + def solve(time: int, distance: int) -> int: + # With n being the button-held-down time. + # We want to solve: (time - n) * n > distance + # So we want the number of intergers in ]n_1, n_2[, n_1 and n_2 roots of the quadratic + # a = -1, b = time, c = -distance + determinant = time**2 - 4 * distance + if determinant <= 0: + return 0 + max = time / 2 + delta = math.sqrt(determinant) / 2 + n_1 = max - delta + n_2 = max + delta + return math.ceil(n_2 - 1) - math.floor(n_1 + 1) + 1 + + time, distance = map(parse_line, input) + + return solve(time, distance) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 6917623406e2bd1befd7869f1c0469876f97d14d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 7 Dec 2023 08:56:34 +0000 Subject: [PATCH 402/479] 2023: d07: ex1: add input --- 2023/d07/ex1/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2023/d07/ex1/input diff --git a/2023/d07/ex1/input b/2023/d07/ex1/input new file mode 100644 index 0000000..ede74f8 --- /dev/null +++ b/2023/d07/ex1/input @@ -0,0 +1,1000 @@ +99898 978 +T99A9 198 +43Q34 550 +KK8QK 418 +Q6Q57 767 +35A37 832 +AJ867 137 +45679 936 +8TJ88 409 +7772T 208 +8KJKQ 788 +KKK66 948 +JATQA 365 +2A224 66 +77QKA 119 +88844 834 +68K68 872 +225J7 557 +A7A3A 855 +22326 7 +7A7JQ 565 +JQ44Q 735 +5AA55 970 +A23JQ 715 +77976 47 +QQ333 162 +7JT7T 333 +9T9T9 151 +JJ888 217 +77QQQ 954 +TJ999 145 +44J4T 485 +J9378 655 +3TK2T 747 +297K5 257 +AK77K 912 +J25J4 120 +999Q9 928 +Q9Q88 981 +9K696 919 +66336 268 +86J69 168 +26729 650 +8A7K2 59 +7K77K 12 +7Q567 391 +5TQT5 688 +JT838 968 +45JJQ 647 +JA44A 716 +3QT98 507 +6KT38 241 +88838 362 +AAA36 1000 +KTKKJ 934 +JJ8JJ 178 +66286 757 +27722 625 +99899 53 +6J6TT 128 +TQ536 540 +72222 165 +K22K2 397 +JA3AA 719 +236Q8 82 +Q229J 974 +9639J 793 +9Q67A 787 +7JJ77 926 +KK33K 423 +AT735 497 +KA3AK 664 +AJQAA 459 +JJT24 20 +7J82Q 184 +52K52 211 +557K7 196 +3JJ3J 531 +68J8T 375 +6A5KQ 93 +J55AA 454 +5838Q 898 +9J7A9 32 +T666J 419 +777J7 99 +38823 319 +A4979 452 +K22JK 740 +8T4T8 663 +A9TQA 63 +KJ2T5 13 +Q2946 614 +39937 904 +53975 982 +29JTA 152 +65T8J 718 +6286T 500 +JJAAJ 528 +9K226 842 +TA436 902 +7464K 473 +Q55AQ 155 +63AA6 605 +QK6KA 25 +2442J 760 +7A787 706 +AQAQQ 140 +KJTAK 689 +88A8A 91 +QA268 187 +T8T36 308 +K7727 961 +82228 225 +A55A8 811 +Q63AQ 161 +4AKKT 589 +J2223 269 +5J673 376 +8586K 776 +774KA 887 +J5523 223 +J78T6 481 +QQQKQ 240 +TQJQQ 668 +K3T89 430 +TTT3T 588 +56655 604 +TJJ8A 329 +49422 969 +5T6T5 233 +J3773 894 +99939 253 +869T7 14 +QQ242 143 +4AQJ7 174 +T74AQ 973 +2397K 106 +656T5 810 +KQ2QK 250 +99797 330 +KQQK6 797 +T9J9Q 170 +586TK 310 +AK54J 366 +2676J 744 +462KT 958 +32366 460 +K4664 651 +8K859 683 +TTT4T 517 +43343 849 +K3TTK 341 +747KJ 70 +4494T 1 +6A962 378 +AAAA4 197 +9K6A6 583 +TT68J 237 +77K5J 576 +JTK55 467 +T8T88 559 +55497 918 +7J4TK 946 +K3756 401 +88J48 594 +T6666 8 +A8AAK 3 +AAAQ7 316 +JA3A6 897 +3J77K 789 +929KJ 773 +9KJ22 129 +K93A7 5 +Q88T2 727 +669Q6 57 +555A5 875 +AQ8JJ 632 +6767Q 352 +9AAAJ 745 +AJ7Q8 979 +55252 343 +89QTA 406 +T5555 845 +9TTTT 676 +6J8J7 696 +9AQ8A 772 +A25KK 831 +K5K64 337 +J62JQ 659 +K344K 377 +95T2Q 281 +65666 527 +A9A8A 925 +JQKKJ 580 +43K2K 266 +JJ5J5 259 +QJT65 564 +Q6886 285 +3QJQQ 67 +T88TT 867 +99922 31 +22225 648 +4A235 816 +68866 967 +73377 494 +5TT5T 228 +9QQ99 618 +4K73T 472 +Q6QQQ 426 +TT3T6 871 +TJ498 712 +6Q8J6 786 +QQAAK 892 +46377 264 +62832 711 +5J57Q 642 +A28A2 561 +T7K79 624 +2T22J 402 +J5252 820 +T7988 299 +T9988 603 +97369 993 +88JJJ 726 +8KK8K 72 +694K6 457 +999J3 514 +78QKK 364 +K6Q9K 743 +636AK 717 +5KT49 826 +84A65 957 +42K74 575 +23322 512 +69KAA 65 +66339 96 +3QATA 999 +J7887 311 +QA55A 214 +J2242 389 +J9999 346 +99599 703 +77Q7Q 68 +25QK2 292 +9JAT6 361 +QAQQQ 923 +48TJ6 815 +55TK8 115 +22668 751 +KKKA7 853 +372A4 424 +4KK22 710 +58555 478 +6756J 775 +36888 620 +KKK64 940 +24KK4 530 +78437 405 +63QJ5 653 +TTQ7K 771 +55352 995 +4Q83J 149 +5Q55T 421 +Q7Q4T 498 +T6496 144 +35433 807 +JKQJT 836 +979A7 38 +3K658 534 +J7QJ4 707 +Q947A 232 +J439J 458 +K7777 230 +59525 360 +KKKK2 370 +9KKQK 554 +J2T2Q 484 +TT626 847 +Q3299 812 +67TAJ 2 +66926 97 +2Q7QQ 56 +K797J 242 +5J455 103 +J66AJ 438 +77477 71 +83438 4 +JJT3Q 722 +5A7KA 873 +77778 756 +93744 888 +99AAT 489 +A75KQ 989 +33A33 450 +6786J 916 +J55J5 821 +99788 503 +66A3T 493 +JJJA7 112 +ATTJ3 465 +K9K7K 699 +9T9TT 885 +883K8 858 +96J24 590 +8J88Q 939 +39TJ5 328 +QQA23 966 +A229A 619 +8K267 868 +66686 425 +T662J 634 +QQJQ8 997 +3Q694 980 +66636 325 +TT8JK 296 +289T7 231 +9K479 801 +66AJ6 327 +524Q8 298 +JTTT8 684 +QQ9QJ 357 +2222T 219 +QQQ22 692 +9TQK8 635 +4T378 731 +2K77T 125 +5757T 860 +2J222 29 +64J4A 183 +439T2 769 +JA6QA 21 +4Q8QJ 929 +4JQ93 822 +TT34J 804 +QQ7KK 179 +JJA22 943 +5TJ6T 455 +43QTA 545 +JQ2Q2 572 +94449 78 +AA7AJ 814 +89666 529 +37443 385 +TTJ22 607 +AAKKJ 502 +4K444 289 +AAAJA 374 +T3T74 121 +K7TA4 794 +T73A2 153 +673J7 446 +QQQ66 132 +Q8288 675 +9JJ44 262 +326JQ 746 +JQ44K 277 +33T33 422 +4555Q 626 +33353 172 +7Q8K9 515 +55T27 750 +KA29T 382 +JTTA4 471 +8A8JA 135 +A8AA5 462 +25443 487 +555AJ 475 +J5T55 522 +Q2942 657 +JKK88 182 +T5TKJ 251 +Q3942 965 +9Q853 806 +2QKQQ 113 +T9J66 272 +KK7KK 838 +2JTQ6 307 +4J494 24 +59K4J 917 +K26JJ 398 +44743 17 +5T548 275 +KAA99 50 +4J6A5 896 +8J9J6 766 +8J888 613 +QQ2QQ 349 +54544 581 +T4666 347 +82J62 448 +K2KAA 186 +92TQT 646 +4Q4A4 107 +525J5 436 +22759 739 +75456 94 +QQ3Q3 695 +22296 567 +T44TT 796 +JT55T 102 +2A9Q4 569 +Q9QQQ 854 +J554A 136 +J8KKJ 835 +65QK7 667 +777QK 597 +76677 278 +35555 670 +8Q32K 577 +28KA5 546 +T95T9 209 +44QAA 622 +2A98T 40 +6AA6A 41 +JTTQT 984 +K885K 686 +444J4 254 +2TK96 599 +TJ24T 301 +628K5 535 +9K73Q 987 +J6KQ3 795 +9J663 199 +3KQ5J 271 +47864 761 +5KAAA 238 +Q474A 381 +65A45 578 +93JA8 592 +2K5T5 95 +Q3777 985 +54465 280 +A9A33 631 +377J7 387 +A8867 759 +323KJ 134 +74447 42 +3T433 725 +66AQ6 139 +29926 283 +4K868 293 +AAAAQ 164 +4Q92Q 693 +TT7AK 142 +K2A77 215 +44Q44 15 +64AA5 64 +92T49 930 +2AAAA 570 +KKKTK 188 +J444K 573 +KK4KK 627 +88T77 83 +J7959 261 +9Q2TK 479 +22622 176 +JJQJ2 900 +A328T 58 +3A33J 263 +KT76K 874 +35A28 852 +7877J 640 +J6QA9 428 +2622T 709 +KT736 202 +KKQKA 392 +QA542 236 +J333T 694 +J99J9 394 +QQJ2Q 677 +K223Q 645 +692Q6 798 +86792 932 +Q33T3 207 +3TAQQ 552 +Q65AJ 226 +74444 449 +9J47T 439 +3Q7KA 749 +AA8A8 39 +5KQ5J 150 +TTTJT 111 +5355J 286 +46J6A 468 +J6T24 679 +A43T3 990 +8659J 732 +88JJ7 173 +5T379 800 +AA777 26 +6KT9Q 555 +43444 850 +72T72 274 +42222 16 +262J6 840 +KAKAQ 864 +T367J 889 +A2A22 235 +58566 509 +399J3 996 +QAAQA 802 +3J3J6 321 +99449 942 +TTKTK 612 +JT6TT 456 +AATA7 54 +37536 678 +54A44 248 +77737 195 +K495K 661 +9QQ9Q 22 +66J66 396 +A649J 146 +22599 724 +22929 988 +2K2QK 444 +58622 508 +AAA3Q 354 +55J75 538 +K9KQQ 62 +K6QAJ 169 +A2KQQ 666 +J44J4 818 +QA8QA 755 +33343 331 +A2634 44 +664T4 729 +K3QQ3 701 +4AKTJ 519 +T7T97 124 +54KJ8 733 +9QJQ9 273 +866T6 167 +K7TTK 480 +8TJ84 705 +24477 608 +78877 148 +A7777 300 +QQKKK 844 +KJ347 803 +9699Q 160 +J22J2 601 +3AQ82 827 +AA844 758 +QQT7Q 690 +4KAJ6 960 +J77AJ 950 +3TT3T 166 +2A62Q 636 +QQAJA 55 +222A8 28 +3TA59 579 +834A3 833 +6K26K 819 +92T9K 466 +954A5 118 +5KKKK 935 +J86J6 400 +454TK 404 +A5255 463 +269TJ 61 +6A686 407 +39333 861 +A25A2 431 +JK72Q 388 +A74AA 412 +T5QA6 790 +6AJAA 74 +934TT 563 +9JJK9 359 +A534K 358 +62TA9 568 +7T474 158 +JA8AA 443 +J95J7 641 +5585J 86 +2Q9KA 708 +3733T 350 +83373 914 +T89TJ 35 +KKJKK 644 +JT645 742 +KK656 846 +2A25T 983 +74KKK 437 +8Q898 730 +K6J56 413 +49989 464 +79797 532 +6Q444 353 +AKQ42 371 +84844 784 +626K6 288 +535QJ 870 +QQ686 523 +3643K 37 +34T2Q 977 +J3272 260 +2222Q 87 +4TTKQ 36 +T2AQ8 314 +94349 229 +77673 825 +J27A5 513 +TQQ25 649 +TT77T 869 +32632 175 +39799 312 +6QKTT 189 +TK428 859 +68648 306 +QKQ5A 372 +755JJ 427 +J8969 239 +A835T 355 +4J56Q 486 +T475A 363 +Q72KT 23 +37733 837 +J9959 687 +56595 738 +88778 909 +JKQQ4 937 +QQ766 297 +6TAK5 944 +87Q4A 34 +595Q9 947 +45J45 543 +AKQ59 629 +5A4KT 395 +4A576 440 +T8TTK 379 +8887J 582 +A5947 417 +88848 383 +33QJ4 482 +8A77A 411 +66A9T 863 +93935 291 +JTJT2 824 +2KQJQ 474 +Q33A9 587 +4Q244 956 +36TAT 108 +8498K 19 +944KJ 539 +JTTAT 130 +82828 638 +795A7 201 +5Q5QQ 910 +66QJ6 596 +2224Q 303 +5K278 895 +A4854 783 +4744J 338 +242A7 681 +8358J 491 +322QQ 141 +99499 267 +TT277 741 +9KQ7Q 445 +3TT33 799 +T224T 416 +J6TA4 351 +45555 516 +444A9 110 +KKKAK 768 +T2778 249 +6666K 216 +96566 504 +96J96 866 +5J284 891 +52555 702 +44JA4 496 +73QQQ 952 +A7TT2 403 +55TT2 673 +A552T 972 +9855J 210 +49J53 606 +Q4A4Q 994 +8J8K2 492 +49623 884 +T5T6T 785 +8484J 495 +55559 924 +96929 276 +JJ857 533 +555J5 123 +Q293K 704 +T4275 553 +22228 380 +44245 903 +A6696 116 +89T2J 410 +94J99 104 +24227 224 +K9KKK 777 +QQQQ3 748 +T6ATT 591 +33J39 147 +AAQ66 131 +9K9K9 441 +KQ88Q 245 +45K44 157 +2A6K4 393 +366J7 736 +3K72J 76 +2TT22 33 +8777Q 200 +6TJJ4 302 +338A8 433 +276K9 434 +Q884Q 100 +7Q77J 258 +J9AJ7 315 +A849T 10 +99QQ8 227 +455J2 600 +99699 322 +26868 114 +J88A8 886 +5A796 483 +5TTTT 933 +JQ6QK 805 +9J6A3 255 +33733 368 +A397J 593 +T7TTT 317 +8K447 18 +55Q5A 656 +59993 320 +4JJ28 906 +3JKTA 584 +AAQ6A 857 +KQ7J7 420 +T6K22 246 +3363K 520 +JQQQQ 384 +ATJ7T 713 +95455 992 +2QK6Q 11 +66722 737 +8A327 510 +6J6QJ 453 +888J5 781 +338A3 526 +J4TJT 548 +A9627 52 +29277 792 +83866 244 +97AAA 159 +4K4K7 848 +QATTT 610 +AK26Q 75 +5976K 566 +88899 101 +33K33 662 +42739 652 +QQ8Q6 89 +K3KK7 880 +9944K 672 +QQQQ4 763 +242K5 181 +T86QA 915 +55K2J 488 +26262 326 +A5755 518 +22292 938 +AKT2T 691 +Q79J2 630 +JJ488 6 +QK9QQ 501 +8T59A 447 +4222T 222 +2A4A5 971 +KQ5TT 949 +8JJAA 88 +2A3Q2 922 +76696 658 +J22JJ 122 +Q5362 616 +A9T9T 602 +4A234 290 +33999 714 +7Q9J6 964 +4K424 660 +848JK 558 +K4K44 881 +57K5K 839 +3222Q 505 +6QA98 117 +929AA 340 +42546 945 +9QQQ8 698 +8KK88 674 +QTQJ4 51 +4KKJK 671 +KJQ7T 243 +33437 90 +QA5JA 654 +JKT3J 927 +33K39 752 +KKK62 332 +4AA5A 234 +J3333 843 +K5555 765 +4Q333 77 +Q27J2 893 +7KJ77 506 +AAAJJ 206 +67676 828 +7575J 562 +25252 643 +77277 204 +87588 700 +TQQQT 334 +T4T94 339 +TTJT5 345 +6K8A6 778 +6KT3J 595 +J7774 639 +9988J 685 +JQ879 180 +TT6T7 542 +JKKKJ 279 +Q5QQQ 399 +67666 511 +593A2 318 +24932 265 +J4JJ4 907 +T4A8A 356 +33988 335 +999AA 536 +9JQQ5 963 +9553K 780 +35435 913 +224KJ 754 +32K3Q 876 +5246Q 48 +A333A 551 +JJT75 878 +A8888 953 +KKT6K 171 +A767A 879 +T66TT 865 +55J99 46 +8J442 212 +88858 469 +74T77 126 +JJ885 390 +K5J38 637 +49664 80 +4TKJQ 986 +69969 809 +TTTT6 560 +84A5T 154 +K6TAT 720 +AAAA3 442 +43KQA 611 +9JQ45 734 +A8AAA 830 +A22K3 367 +38883 323 +6K966 193 +75595 324 +5A2A5 477 +54Q42 521 +44424 901 +34J43 991 +K5KK7 782 +A64Q2 156 +TJ7T3 541 +65996 386 +62J69 829 +QQA2T 856 +4A443 476 +KK333 247 +997J9 920 +86856 962 +QTJQT 256 +7A363 49 +75755 98 +578T4 665 +3336J 680 +526A5 185 +TQ36J 435 +85K3T 823 +7Q87J 753 +83338 304 +58585 408 +5A984 941 +7T5Q8 975 +QQ939 369 +TTT2T 723 +T32T2 270 +39K79 598 +AATTT 295 +KJ9KK 615 +J8754 415 +67777 499 +4T44T 461 +JJJJJ 628 +97A27 177 +J9822 770 +48KKT 808 +JJ553 109 +JTTTJ 313 +2JKA9 203 +JQ339 669 +Q5T5Q 817 +Q5J2A 79 +QQ8Q8 30 +T778T 617 +4355J 45 +662QQ 305 +9J788 544 +Q8299 623 +J7923 911 +AAA77 81 +93T79 220 +A4446 697 +8Q5J5 373 +26257 221 +AAJ66 470 +7J49J 27 +K7QT5 92 +37J43 621 +999K9 955 +684K7 547 +J666J 105 +T4J49 344 +53T5K 69 +J6224 586 +47TJ3 609 +AA789 451 +33636 998 +8TJKJ 549 +7KT42 976 +A9J84 218 +977AJ 882 +68888 336 +5K32A 931 +35AJ9 764 +42442 205 +KQQQK 342 +66TAT 721 +TTQ9T 862 +KAAKT 163 +5TT9T 138 +3753J 813 +43K32 633 +KKTQT 877 +8TTJJ 84 +383J8 85 +8946T 556 +4K2KK 585 +T7T44 791 +575Q3 294 +K5Q49 574 +Q2QJ4 774 +5A93K 348 +5A643 194 +A24J9 429 +TT773 127 +K9J5A 921 +38377 851 +2226A 191 +66662 537 +77AA9 890 +Q7547 951 +JQAJQ 841 +78888 213 +4TTT7 571 +526J2 133 +TKQJT 309 +955J5 414 +96666 959 +8886K 525 +KK8TT 73 +22A2T 908 +JT4JQ 282 +43448 60 +JKJAQ 9 +T4TTJ 43 +Q75T6 779 +237T4 883 +46644 682 +92T29 287 +AAATA 490 +TATK3 762 +JK4KJ 192 +34436 905 +QK5T8 432 +333K4 252 +QQQ78 524 +AAAA7 190 +QQ222 899 +7K283 284 +23339 728 From bb9dff359d2eed5f92b03d636754874db14f26ab Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 7 Dec 2023 08:56:39 +0000 Subject: [PATCH 403/479] 2023: d07: ex1: add solution --- 2023/d07/ex1/ex1.py | 56 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100755 2023/d07/ex1/ex1.py diff --git a/2023/d07/ex1/ex1.py b/2023/d07/ex1/ex1.py new file mode 100755 index 0000000..8c7a00e --- /dev/null +++ b/2023/d07/ex1/ex1.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python + +import functools +import sys +from collections import Counter + +Play = tuple[str, int] + +ORDER = "23456789TJQKA" + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> list[Play]: + return [(hand, int(bid)) for hand, bid in map(str.split, input)] + + # Stronger hands compare higher than weaker hands + def cmp_hand(lhs: str, rhs: str) -> int: + def to_type(hand: str) -> list[int]: + return [count for _, count in Counter(hand).most_common()] + + def cmp_type(lhs: list[int], rhs: list[int]) -> int: + for left, right in zip(lhs, rhs): + if (cmp := left - right) != 0: + return cmp + return 0 + + def cmp_card(lhs: str, rhs: str) -> int: + assert lhs in ORDER and rhs in ORDER # Sanity check + assert len(lhs) == 1 and len(rhs) == 1 # Sanity check + return ORDER.find(lhs) - ORDER.find(rhs) + + if (cmp := cmp_type(to_type(lhs), to_type(rhs))) != 0: + return cmp + + for left, right in zip(lhs, rhs): + if (cmp := cmp_card(left, right)) != 0: + return cmp + + return 0 + + def cmp_play(lhs: Play, rhs: Play) -> int: + return cmp_hand(lhs[0], rhs[0]) + + plays = parse(input) + plays = sorted(plays, key=functools.cmp_to_key(cmp_play)) + + return sum(rank * bid for rank, (_, bid) in enumerate(plays, start=1)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 9b4506da33cfa00fa9a39e4d9341e2532cbb77cb Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 7 Dec 2023 08:56:44 +0000 Subject: [PATCH 404/479] 2023: d07: ex2: add input --- 2023/d07/ex2/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2023/d07/ex2/input diff --git a/2023/d07/ex2/input b/2023/d07/ex2/input new file mode 100644 index 0000000..ede74f8 --- /dev/null +++ b/2023/d07/ex2/input @@ -0,0 +1,1000 @@ +99898 978 +T99A9 198 +43Q34 550 +KK8QK 418 +Q6Q57 767 +35A37 832 +AJ867 137 +45679 936 +8TJ88 409 +7772T 208 +8KJKQ 788 +KKK66 948 +JATQA 365 +2A224 66 +77QKA 119 +88844 834 +68K68 872 +225J7 557 +A7A3A 855 +22326 7 +7A7JQ 565 +JQ44Q 735 +5AA55 970 +A23JQ 715 +77976 47 +QQ333 162 +7JT7T 333 +9T9T9 151 +JJ888 217 +77QQQ 954 +TJ999 145 +44J4T 485 +J9378 655 +3TK2T 747 +297K5 257 +AK77K 912 +J25J4 120 +999Q9 928 +Q9Q88 981 +9K696 919 +66336 268 +86J69 168 +26729 650 +8A7K2 59 +7K77K 12 +7Q567 391 +5TQT5 688 +JT838 968 +45JJQ 647 +JA44A 716 +3QT98 507 +6KT38 241 +88838 362 +AAA36 1000 +KTKKJ 934 +JJ8JJ 178 +66286 757 +27722 625 +99899 53 +6J6TT 128 +TQ536 540 +72222 165 +K22K2 397 +JA3AA 719 +236Q8 82 +Q229J 974 +9639J 793 +9Q67A 787 +7JJ77 926 +KK33K 423 +AT735 497 +KA3AK 664 +AJQAA 459 +JJT24 20 +7J82Q 184 +52K52 211 +557K7 196 +3JJ3J 531 +68J8T 375 +6A5KQ 93 +J55AA 454 +5838Q 898 +9J7A9 32 +T666J 419 +777J7 99 +38823 319 +A4979 452 +K22JK 740 +8T4T8 663 +A9TQA 63 +KJ2T5 13 +Q2946 614 +39937 904 +53975 982 +29JTA 152 +65T8J 718 +6286T 500 +JJAAJ 528 +9K226 842 +TA436 902 +7464K 473 +Q55AQ 155 +63AA6 605 +QK6KA 25 +2442J 760 +7A787 706 +AQAQQ 140 +KJTAK 689 +88A8A 91 +QA268 187 +T8T36 308 +K7727 961 +82228 225 +A55A8 811 +Q63AQ 161 +4AKKT 589 +J2223 269 +5J673 376 +8586K 776 +774KA 887 +J5523 223 +J78T6 481 +QQQKQ 240 +TQJQQ 668 +K3T89 430 +TTT3T 588 +56655 604 +TJJ8A 329 +49422 969 +5T6T5 233 +J3773 894 +99939 253 +869T7 14 +QQ242 143 +4AQJ7 174 +T74AQ 973 +2397K 106 +656T5 810 +KQ2QK 250 +99797 330 +KQQK6 797 +T9J9Q 170 +586TK 310 +AK54J 366 +2676J 744 +462KT 958 +32366 460 +K4664 651 +8K859 683 +TTT4T 517 +43343 849 +K3TTK 341 +747KJ 70 +4494T 1 +6A962 378 +AAAA4 197 +9K6A6 583 +TT68J 237 +77K5J 576 +JTK55 467 +T8T88 559 +55497 918 +7J4TK 946 +K3756 401 +88J48 594 +T6666 8 +A8AAK 3 +AAAQ7 316 +JA3A6 897 +3J77K 789 +929KJ 773 +9KJ22 129 +K93A7 5 +Q88T2 727 +669Q6 57 +555A5 875 +AQ8JJ 632 +6767Q 352 +9AAAJ 745 +AJ7Q8 979 +55252 343 +89QTA 406 +T5555 845 +9TTTT 676 +6J8J7 696 +9AQ8A 772 +A25KK 831 +K5K64 337 +J62JQ 659 +K344K 377 +95T2Q 281 +65666 527 +A9A8A 925 +JQKKJ 580 +43K2K 266 +JJ5J5 259 +QJT65 564 +Q6886 285 +3QJQQ 67 +T88TT 867 +99922 31 +22225 648 +4A235 816 +68866 967 +73377 494 +5TT5T 228 +9QQ99 618 +4K73T 472 +Q6QQQ 426 +TT3T6 871 +TJ498 712 +6Q8J6 786 +QQAAK 892 +46377 264 +62832 711 +5J57Q 642 +A28A2 561 +T7K79 624 +2T22J 402 +J5252 820 +T7988 299 +T9988 603 +97369 993 +88JJJ 726 +8KK8K 72 +694K6 457 +999J3 514 +78QKK 364 +K6Q9K 743 +636AK 717 +5KT49 826 +84A65 957 +42K74 575 +23322 512 +69KAA 65 +66339 96 +3QATA 999 +J7887 311 +QA55A 214 +J2242 389 +J9999 346 +99599 703 +77Q7Q 68 +25QK2 292 +9JAT6 361 +QAQQQ 923 +48TJ6 815 +55TK8 115 +22668 751 +KKKA7 853 +372A4 424 +4KK22 710 +58555 478 +6756J 775 +36888 620 +KKK64 940 +24KK4 530 +78437 405 +63QJ5 653 +TTQ7K 771 +55352 995 +4Q83J 149 +5Q55T 421 +Q7Q4T 498 +T6496 144 +35433 807 +JKQJT 836 +979A7 38 +3K658 534 +J7QJ4 707 +Q947A 232 +J439J 458 +K7777 230 +59525 360 +KKKK2 370 +9KKQK 554 +J2T2Q 484 +TT626 847 +Q3299 812 +67TAJ 2 +66926 97 +2Q7QQ 56 +K797J 242 +5J455 103 +J66AJ 438 +77477 71 +83438 4 +JJT3Q 722 +5A7KA 873 +77778 756 +93744 888 +99AAT 489 +A75KQ 989 +33A33 450 +6786J 916 +J55J5 821 +99788 503 +66A3T 493 +JJJA7 112 +ATTJ3 465 +K9K7K 699 +9T9TT 885 +883K8 858 +96J24 590 +8J88Q 939 +39TJ5 328 +QQA23 966 +A229A 619 +8K267 868 +66686 425 +T662J 634 +QQJQ8 997 +3Q694 980 +66636 325 +TT8JK 296 +289T7 231 +9K479 801 +66AJ6 327 +524Q8 298 +JTTT8 684 +QQ9QJ 357 +2222T 219 +QQQ22 692 +9TQK8 635 +4T378 731 +2K77T 125 +5757T 860 +2J222 29 +64J4A 183 +439T2 769 +JA6QA 21 +4Q8QJ 929 +4JQ93 822 +TT34J 804 +QQ7KK 179 +JJA22 943 +5TJ6T 455 +43QTA 545 +JQ2Q2 572 +94449 78 +AA7AJ 814 +89666 529 +37443 385 +TTJ22 607 +AAKKJ 502 +4K444 289 +AAAJA 374 +T3T74 121 +K7TA4 794 +T73A2 153 +673J7 446 +QQQ66 132 +Q8288 675 +9JJ44 262 +326JQ 746 +JQ44K 277 +33T33 422 +4555Q 626 +33353 172 +7Q8K9 515 +55T27 750 +KA29T 382 +JTTA4 471 +8A8JA 135 +A8AA5 462 +25443 487 +555AJ 475 +J5T55 522 +Q2942 657 +JKK88 182 +T5TKJ 251 +Q3942 965 +9Q853 806 +2QKQQ 113 +T9J66 272 +KK7KK 838 +2JTQ6 307 +4J494 24 +59K4J 917 +K26JJ 398 +44743 17 +5T548 275 +KAA99 50 +4J6A5 896 +8J9J6 766 +8J888 613 +QQ2QQ 349 +54544 581 +T4666 347 +82J62 448 +K2KAA 186 +92TQT 646 +4Q4A4 107 +525J5 436 +22759 739 +75456 94 +QQ3Q3 695 +22296 567 +T44TT 796 +JT55T 102 +2A9Q4 569 +Q9QQQ 854 +J554A 136 +J8KKJ 835 +65QK7 667 +777QK 597 +76677 278 +35555 670 +8Q32K 577 +28KA5 546 +T95T9 209 +44QAA 622 +2A98T 40 +6AA6A 41 +JTTQT 984 +K885K 686 +444J4 254 +2TK96 599 +TJ24T 301 +628K5 535 +9K73Q 987 +J6KQ3 795 +9J663 199 +3KQ5J 271 +47864 761 +5KAAA 238 +Q474A 381 +65A45 578 +93JA8 592 +2K5T5 95 +Q3777 985 +54465 280 +A9A33 631 +377J7 387 +A8867 759 +323KJ 134 +74447 42 +3T433 725 +66AQ6 139 +29926 283 +4K868 293 +AAAAQ 164 +4Q92Q 693 +TT7AK 142 +K2A77 215 +44Q44 15 +64AA5 64 +92T49 930 +2AAAA 570 +KKKTK 188 +J444K 573 +KK4KK 627 +88T77 83 +J7959 261 +9Q2TK 479 +22622 176 +JJQJ2 900 +A328T 58 +3A33J 263 +KT76K 874 +35A28 852 +7877J 640 +J6QA9 428 +2622T 709 +KT736 202 +KKQKA 392 +QA542 236 +J333T 694 +J99J9 394 +QQJ2Q 677 +K223Q 645 +692Q6 798 +86792 932 +Q33T3 207 +3TAQQ 552 +Q65AJ 226 +74444 449 +9J47T 439 +3Q7KA 749 +AA8A8 39 +5KQ5J 150 +TTTJT 111 +5355J 286 +46J6A 468 +J6T24 679 +A43T3 990 +8659J 732 +88JJ7 173 +5T379 800 +AA777 26 +6KT9Q 555 +43444 850 +72T72 274 +42222 16 +262J6 840 +KAKAQ 864 +T367J 889 +A2A22 235 +58566 509 +399J3 996 +QAAQA 802 +3J3J6 321 +99449 942 +TTKTK 612 +JT6TT 456 +AATA7 54 +37536 678 +54A44 248 +77737 195 +K495K 661 +9QQ9Q 22 +66J66 396 +A649J 146 +22599 724 +22929 988 +2K2QK 444 +58622 508 +AAA3Q 354 +55J75 538 +K9KQQ 62 +K6QAJ 169 +A2KQQ 666 +J44J4 818 +QA8QA 755 +33343 331 +A2634 44 +664T4 729 +K3QQ3 701 +4AKTJ 519 +T7T97 124 +54KJ8 733 +9QJQ9 273 +866T6 167 +K7TTK 480 +8TJ84 705 +24477 608 +78877 148 +A7777 300 +QQKKK 844 +KJ347 803 +9699Q 160 +J22J2 601 +3AQ82 827 +AA844 758 +QQT7Q 690 +4KAJ6 960 +J77AJ 950 +3TT3T 166 +2A62Q 636 +QQAJA 55 +222A8 28 +3TA59 579 +834A3 833 +6K26K 819 +92T9K 466 +954A5 118 +5KKKK 935 +J86J6 400 +454TK 404 +A5255 463 +269TJ 61 +6A686 407 +39333 861 +A25A2 431 +JK72Q 388 +A74AA 412 +T5QA6 790 +6AJAA 74 +934TT 563 +9JJK9 359 +A534K 358 +62TA9 568 +7T474 158 +JA8AA 443 +J95J7 641 +5585J 86 +2Q9KA 708 +3733T 350 +83373 914 +T89TJ 35 +KKJKK 644 +JT645 742 +KK656 846 +2A25T 983 +74KKK 437 +8Q898 730 +K6J56 413 +49989 464 +79797 532 +6Q444 353 +AKQ42 371 +84844 784 +626K6 288 +535QJ 870 +QQ686 523 +3643K 37 +34T2Q 977 +J3272 260 +2222Q 87 +4TTKQ 36 +T2AQ8 314 +94349 229 +77673 825 +J27A5 513 +TQQ25 649 +TT77T 869 +32632 175 +39799 312 +6QKTT 189 +TK428 859 +68648 306 +QKQ5A 372 +755JJ 427 +J8969 239 +A835T 355 +4J56Q 486 +T475A 363 +Q72KT 23 +37733 837 +J9959 687 +56595 738 +88778 909 +JKQQ4 937 +QQ766 297 +6TAK5 944 +87Q4A 34 +595Q9 947 +45J45 543 +AKQ59 629 +5A4KT 395 +4A576 440 +T8TTK 379 +8887J 582 +A5947 417 +88848 383 +33QJ4 482 +8A77A 411 +66A9T 863 +93935 291 +JTJT2 824 +2KQJQ 474 +Q33A9 587 +4Q244 956 +36TAT 108 +8498K 19 +944KJ 539 +JTTAT 130 +82828 638 +795A7 201 +5Q5QQ 910 +66QJ6 596 +2224Q 303 +5K278 895 +A4854 783 +4744J 338 +242A7 681 +8358J 491 +322QQ 141 +99499 267 +TT277 741 +9KQ7Q 445 +3TT33 799 +T224T 416 +J6TA4 351 +45555 516 +444A9 110 +KKKAK 768 +T2778 249 +6666K 216 +96566 504 +96J96 866 +5J284 891 +52555 702 +44JA4 496 +73QQQ 952 +A7TT2 403 +55TT2 673 +A552T 972 +9855J 210 +49J53 606 +Q4A4Q 994 +8J8K2 492 +49623 884 +T5T6T 785 +8484J 495 +55559 924 +96929 276 +JJ857 533 +555J5 123 +Q293K 704 +T4275 553 +22228 380 +44245 903 +A6696 116 +89T2J 410 +94J99 104 +24227 224 +K9KKK 777 +QQQQ3 748 +T6ATT 591 +33J39 147 +AAQ66 131 +9K9K9 441 +KQ88Q 245 +45K44 157 +2A6K4 393 +366J7 736 +3K72J 76 +2TT22 33 +8777Q 200 +6TJJ4 302 +338A8 433 +276K9 434 +Q884Q 100 +7Q77J 258 +J9AJ7 315 +A849T 10 +99QQ8 227 +455J2 600 +99699 322 +26868 114 +J88A8 886 +5A796 483 +5TTTT 933 +JQ6QK 805 +9J6A3 255 +33733 368 +A397J 593 +T7TTT 317 +8K447 18 +55Q5A 656 +59993 320 +4JJ28 906 +3JKTA 584 +AAQ6A 857 +KQ7J7 420 +T6K22 246 +3363K 520 +JQQQQ 384 +ATJ7T 713 +95455 992 +2QK6Q 11 +66722 737 +8A327 510 +6J6QJ 453 +888J5 781 +338A3 526 +J4TJT 548 +A9627 52 +29277 792 +83866 244 +97AAA 159 +4K4K7 848 +QATTT 610 +AK26Q 75 +5976K 566 +88899 101 +33K33 662 +42739 652 +QQ8Q6 89 +K3KK7 880 +9944K 672 +QQQQ4 763 +242K5 181 +T86QA 915 +55K2J 488 +26262 326 +A5755 518 +22292 938 +AKT2T 691 +Q79J2 630 +JJ488 6 +QK9QQ 501 +8T59A 447 +4222T 222 +2A4A5 971 +KQ5TT 949 +8JJAA 88 +2A3Q2 922 +76696 658 +J22JJ 122 +Q5362 616 +A9T9T 602 +4A234 290 +33999 714 +7Q9J6 964 +4K424 660 +848JK 558 +K4K44 881 +57K5K 839 +3222Q 505 +6QA98 117 +929AA 340 +42546 945 +9QQQ8 698 +8KK88 674 +QTQJ4 51 +4KKJK 671 +KJQ7T 243 +33437 90 +QA5JA 654 +JKT3J 927 +33K39 752 +KKK62 332 +4AA5A 234 +J3333 843 +K5555 765 +4Q333 77 +Q27J2 893 +7KJ77 506 +AAAJJ 206 +67676 828 +7575J 562 +25252 643 +77277 204 +87588 700 +TQQQT 334 +T4T94 339 +TTJT5 345 +6K8A6 778 +6KT3J 595 +J7774 639 +9988J 685 +JQ879 180 +TT6T7 542 +JKKKJ 279 +Q5QQQ 399 +67666 511 +593A2 318 +24932 265 +J4JJ4 907 +T4A8A 356 +33988 335 +999AA 536 +9JQQ5 963 +9553K 780 +35435 913 +224KJ 754 +32K3Q 876 +5246Q 48 +A333A 551 +JJT75 878 +A8888 953 +KKT6K 171 +A767A 879 +T66TT 865 +55J99 46 +8J442 212 +88858 469 +74T77 126 +JJ885 390 +K5J38 637 +49664 80 +4TKJQ 986 +69969 809 +TTTT6 560 +84A5T 154 +K6TAT 720 +AAAA3 442 +43KQA 611 +9JQ45 734 +A8AAA 830 +A22K3 367 +38883 323 +6K966 193 +75595 324 +5A2A5 477 +54Q42 521 +44424 901 +34J43 991 +K5KK7 782 +A64Q2 156 +TJ7T3 541 +65996 386 +62J69 829 +QQA2T 856 +4A443 476 +KK333 247 +997J9 920 +86856 962 +QTJQT 256 +7A363 49 +75755 98 +578T4 665 +3336J 680 +526A5 185 +TQ36J 435 +85K3T 823 +7Q87J 753 +83338 304 +58585 408 +5A984 941 +7T5Q8 975 +QQ939 369 +TTT2T 723 +T32T2 270 +39K79 598 +AATTT 295 +KJ9KK 615 +J8754 415 +67777 499 +4T44T 461 +JJJJJ 628 +97A27 177 +J9822 770 +48KKT 808 +JJ553 109 +JTTTJ 313 +2JKA9 203 +JQ339 669 +Q5T5Q 817 +Q5J2A 79 +QQ8Q8 30 +T778T 617 +4355J 45 +662QQ 305 +9J788 544 +Q8299 623 +J7923 911 +AAA77 81 +93T79 220 +A4446 697 +8Q5J5 373 +26257 221 +AAJ66 470 +7J49J 27 +K7QT5 92 +37J43 621 +999K9 955 +684K7 547 +J666J 105 +T4J49 344 +53T5K 69 +J6224 586 +47TJ3 609 +AA789 451 +33636 998 +8TJKJ 549 +7KT42 976 +A9J84 218 +977AJ 882 +68888 336 +5K32A 931 +35AJ9 764 +42442 205 +KQQQK 342 +66TAT 721 +TTQ9T 862 +KAAKT 163 +5TT9T 138 +3753J 813 +43K32 633 +KKTQT 877 +8TTJJ 84 +383J8 85 +8946T 556 +4K2KK 585 +T7T44 791 +575Q3 294 +K5Q49 574 +Q2QJ4 774 +5A93K 348 +5A643 194 +A24J9 429 +TT773 127 +K9J5A 921 +38377 851 +2226A 191 +66662 537 +77AA9 890 +Q7547 951 +JQAJQ 841 +78888 213 +4TTT7 571 +526J2 133 +TKQJT 309 +955J5 414 +96666 959 +8886K 525 +KK8TT 73 +22A2T 908 +JT4JQ 282 +43448 60 +JKJAQ 9 +T4TTJ 43 +Q75T6 779 +237T4 883 +46644 682 +92T29 287 +AAATA 490 +TATK3 762 +JK4KJ 192 +34436 905 +QK5T8 432 +333K4 252 +QQQ78 524 +AAAA7 190 +QQ222 899 +7K283 284 +23339 728 From d4078c91bfa5aaaf9df332ed6581371e3cb784c7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 7 Dec 2023 08:56:49 +0000 Subject: [PATCH 405/479] 2023: d07: ex2: add solution --- 2023/d07/ex2/ex2.py | 64 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 2023/d07/ex2/ex2.py diff --git a/2023/d07/ex2/ex2.py b/2023/d07/ex2/ex2.py new file mode 100755 index 0000000..5812695 --- /dev/null +++ b/2023/d07/ex2/ex2.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python + +import functools +import sys +from collections import Counter + +Play = tuple[str, int] + +ORDER = "J23456789TQKA" + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> list[Play]: + return [(hand, int(bid)) for hand, bid in map(str.split, input)] + + # Stronger hands compare higher than weaker hands + def cmp_hand(lhs: str, rhs: str) -> int: + def to_type(hand: str) -> list[int]: + counter = Counter(hand) + raw_type = counter.most_common() + type = [count for card, count in raw_type if card != "J"] + if (joker_count := counter["J"]) != 0: + # Don't break on hands that are only jokers + if len(type) == 0: + type = [0] + type[0] += joker_count + return type + + def cmp_type(lhs: list[int], rhs: list[int]) -> int: + for left, right in zip(lhs, rhs): + if (cmp := left - right) != 0: + return cmp + return 0 + + def cmp_card(lhs: str, rhs: str) -> int: + assert lhs in ORDER and rhs in ORDER # Sanity check + assert len(lhs) == 1 and len(rhs) == 1 # Sanity check + return ORDER.find(lhs) - ORDER.find(rhs) + + if (cmp := cmp_type(to_type(lhs), to_type(rhs))) != 0: + return cmp + + for left, right in zip(lhs, rhs): + if (cmp := cmp_card(left, right)) != 0: + return cmp + + return 0 + + def cmp_play(lhs: Play, rhs: Play) -> int: + return cmp_hand(lhs[0], rhs[0]) + + plays = parse(input) + plays = sorted(plays, key=functools.cmp_to_key(cmp_play)) + + return sum(rank * bid for rank, (_, bid) in enumerate(plays, start=1)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 59e2d4abcf6729add2d41b7a944f04b5c150f4c6 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 8 Dec 2023 08:22:59 +0000 Subject: [PATCH 406/479] 2023: d08: ex1: add input --- 2023/d08/ex1/input | 728 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 728 insertions(+) create mode 100644 2023/d08/ex1/input diff --git a/2023/d08/ex1/input b/2023/d08/ex1/input new file mode 100644 index 0000000..b1b82ae --- /dev/null +++ b/2023/d08/ex1/input @@ -0,0 +1,728 @@ +LRLRLLRRLLRRLRRLRRRLLRLRLRLRLRRLRRRLRLRRLRLLRRLLRLRRLRLRRLLRRRLRLRLRRRLRLLRRRLLLLLLRRRLRRLLLRRLRLRRLRRLRLRRLRRLLRRLRRRLRRRLLRLRLLLRRLLLRRLLRRLRLLRRRLRRRLRRRLRLRRLRRLLLRRRLRRLLRRLRRRLRLRLRRLRRLRRRLRRRLRLLLLRRRLRLRRRLRRRLLRLRRLRRLLRLLLRRLRLRRLRRRLRRRLRRRLLRRRLRLLRRRLRRRLRRRLRRRLRRLRRRLLRRLLRLRLRRRLRRRLRLRRRR + +LFM = (PCJ, GQH) +THP = (SPP, MKB) +PBL = (VVX, JMM) +DSR = (BST, MPD) +QKF = (DSR, KGX) +AAA = (SLH, CVN) +DSH = (DVN, VXT) +VTK = (NSF, QJM) +QQR = (FNB, CBM) +RQV = (XQQ, NQQ) +CGV = (CCB, FTX) +RXL = (HXQ, HLQ) +MQP = (MSH, TJB) +MPL = (JSJ, TJR) +XQK = (RQT, JKB) +GXT = (JFP, MTT) +LHK = (BVR, MFH) +BXH = (PGR, NDC) +FFV = (MJC, TLD) +TFM = (DKJ, RTC) +MVG = (TNC, PXR) +QXN = (CGV, KKM) +LTN = (MQC, XGD) +NLP = (SQQ, DKG) +QTK = (MBH, GJX) +SSR = (DHV, NHN) +DGJ = (QSX, CKB) +SFD = (GRS, DLD) +HBT = (NVN, HJF) +VKH = (CBT, CBT) +VRH = (FVN, JNB) +HTJ = (JNB, FVN) +BDL = (SQS, QVX) +MMC = (MJC, TLD) +RBL = (VNF, BXD) +RNM = (HJQ, PJF) +CTZ = (NCP, PLT) +JFK = (TPJ, JGX) +HPJ = (MMC, FFV) +RJC = (RBH, DFJ) +DHL = (RJC, JFD) +LVR = (BBB, LHK) +LFD = (GCQ, SGC) +BVG = (BSQ, QXH) +DVN = (MTL, NDG) +XGD = (TML, JQL) +RQS = (VXX, BDV) +CPC = (PGB, SVP) +QLQ = (CLK, CBH) +RXZ = (SHG, MDS) +NTR = (RGP, PNX) +BBB = (MFH, BVR) +RGK = (FRD, FRD) +JLV = (DVV, GSF) +NLS = (VFF, HCX) +RHC = (DKG, SQQ) +NVB = (TTG, QTK) +SLZ = (DJM, BVG) +BFK = (SKJ, BBD) +HXX = (XQK, BVT) +SKS = (SLL, FQH) +SGB = (RLT, RHK) +NPD = (RFJ, DJN) +XSJ = (TSF, MVT) +LLH = (RPV, VML) +NXD = (DJS, FJG) +GJX = (SGS, LBJ) +FBV = (CXG, DCJ) +FRX = (GDV, RQB) +SDC = (RGC, THM) +JCT = (CSC, GNM) +SPS = (MLP, TRQ) +BNG = (PFC, CLX) +SHH = (LPM, VRC) +SGC = (FCH, JLC) +FJB = (MVK, JKT) +DRN = (KGL, LTN) +RJB = (NTR, BDN) +DMC = (JBM, KNV) +HBG = (RQB, GDV) +VRC = (RDD, MRD) +JJP = (GQC, VMP) +PLB = (VKX, BGL) +DVV = (QTS, NHG) +LGL = (SSX, JRQ) +RGC = (DVG, RDQ) +GPK = (DDL, FLG) +NVN = (HPJ, SFK) +DVQ = (JFJ, FRC) +VDP = (PFL, GLN) +CVN = (HNX, QKF) +QXP = (VTG, BDC) +LKT = (SBP, SBP) +QSX = (FNN, FKT) +CSC = (HPQ, SLS) +FNN = (DCV, JKF) +MTH = (NVN, HJF) +TPJ = (HNM, NGV) +NHN = (VCC, RXL) +BHF = (JKK, LFD) +HXQ = (VNH, FBV) +KDR = (HDN, HJJ) +SVD = (VRK, STT) +FGJ = (TNM, CRD) +XFF = (NPD, RXQ) +TNC = (XKT, LRP) +VBM = (GJM, PBK) +XBV = (DGJ, QJN) +GXH = (LVK, QGX) +SLH = (HNX, QKF) +ZZZ = (CVN, SLH) +RTC = (TPH, FJT) +NQP = (MJH, MSP) +XSD = (STT, VRK) +HJJ = (XMV, TJX) +JFP = (XSV, KBQ) +FTD = (NMN, PXX) +NVQ = (MSP, MJH) +SHC = (PTV, XDR) +DCV = (TFX, TFX) +BTX = (JJG, FLL) +RDQ = (DCF, FRH) +MTT = (KBQ, XSV) +DRB = (RML, LGR) +PBD = (VSX, FRS) +HFS = (KBM, KSJ) +SKJ = (NXN, LJM) +MTS = (GJC, SQX) +BRL = (TMJ, JTT) +TTQ = (KFC, DPL) +LQF = (DJS, FJG) +TKG = (JFD, RJC) +PGB = (BFJ, BQJ) +BQX = (VHC, PQH) +MRD = (BTB, NJK) +LJF = (XQR, PMH) +BCL = (VBK, JHN) +BHQ = (VMB, SQF) +BSR = (LPM, VRC) +VNK = (GBH, LPQ) +KHJ = (NJG, QQL) +VMB = (BBK, VXF) +QJM = (QDN, VFV) +KFC = (FSM, PMF) +JVN = (DMJ, SPR) +MVT = (RGM, HDH) +PQB = (BVP, NTH) +QQF = (KJP, BDP) +RGP = (JJP, MFM) +DLD = (VSG, BDL) +SCV = (CBT, LHV) +VTD = (KLC, QVL) +FCH = (GGR, TFM) +GJR = (QMX, CFM) +PMH = (GSG, JSF) +DCJ = (CDJ, TRP) +QJX = (NVQ, NQP) +DJN = (JFK, HFM) +DQP = (DSS, PBL) +XXH = (NTX, QLG) +MXK = (JTT, TMJ) +FDL = (JCT, TRR) +MGA = (PLT, NCP) +HPS = (RFQ, VXV) +SBC = (NPD, RXQ) +XPD = (VHH, PDH) +SRX = (SSX, JRQ) +CKJ = (MQQ, QJX) +FKT = (DCV, JKF) +JKP = (VFF, HCX) +JMN = (XSJ, CQP) +GLN = (SFQ, SGB) +PTV = (JNS, FXR) +FXM = (NTR, BDN) +DJS = (XMQ, KSN) +LVC = (FRD, PNN) +JPD = (PQP, XCX) +GQC = (NSQ, GJD) +SFK = (FFV, MMC) +JBD = (TFG, MSN) +BSZ = (RGR, FTD) +SQX = (XRQ, PQB) +PPV = (VBD, SNX) +JSF = (FRT, MVG) +JMT = (TJG, BNV) +JMJ = (DCX, BNG) +KJP = (QFH, VSP) +VXV = (SHM, NMD) +KLC = (XLB, MCH) +JMD = (XQQ, NQQ) +PJN = (FDL, BQC) +PLT = (MCP, VHB) +BGL = (DSC, PSN) +RXH = (SLH, CVN) +VSG = (QVX, SQS) +BDC = (RPS, RBL) +JMM = (XMJ, XDG) +RHK = (QKH, BTX) +RQX = (KSM, PLB) +FQH = (MHT, CDG) +SRM = (PLV, QGV) +HNX = (DSR, KGX) +JNS = (RJN, RXD) +MLP = (JMN, PCR) +LVK = (JHS, QMJ) +PRG = (TJB, MSH) +VGS = (JXR, JLP) +XQQ = (KTJ, BMN) +DGA = (FTD, RGR) +HTX = (MTG, XBV) +CCB = (TXB, VTK) +RQT = (TLR, LDB) +QMX = (SHQ, DPB) +MDS = (KQD, DMC) +JDC = (LCL, SSR) +NHG = (JMD, RQV) +CBM = (DBH, BHQ) +RKB = (VGP, LLP) +SJD = (PLB, KSM) +CDG = (FBC, TJF) +QGV = (TLB, QVB) +BDS = (SPS, BGH) +DGF = (VKH, VKH) +RLV = (MKB, SPP) +SHG = (KQD, DMC) +KQD = (KNV, JBM) +RMV = (DVV, GSF) +MSH = (XXH, TVV) +FJX = (BVG, DJM) +KCV = (PLV, QGV) +MFH = (HCQ, CNF) +TLD = (MCK, KXR) +SLB = (VGP, LLP) +KSN = (HFF, PPV) +RGV = (BDP, KJP) +CNF = (NBF, PCM) +TJF = (GQB, JNP) +NDG = (MTS, JLF) +VHH = (FXM, RJB) +MPH = (CLK, CBH) +RPM = (NXD, LQF) +JHS = (PGH, MXS) +TRJ = (PJF, HJQ) +RJK = (SSR, LCL) +DPB = (SLB, RKB) +XXD = (FFJ, BBX) +QBX = (CRF, VBM) +RMX = (NGM, CPL) +VXT = (MTL, NDG) +KQN = (QQF, RGV) +SFQ = (RLT, RHK) +QGJ = (XDR, PTV) +MSN = (RMV, JLV) +HCQ = (PCM, NBF) +GKF = (PLT, NCP) +VCC = (HLQ, HXQ) +MSJ = (JKP, NLS) +RFF = (BXM, SPH) +FBD = (DGF, VNG) +GLJ = (MQF, RRT) +QRN = (MTH, HBT) +QGS = (TNM, CRD) +XPP = (FNB, CBM) +QQQ = (GHK, DVD) +RBK = (PPQ, XTT) +HHG = (DPL, KFC) +SBP = (FTD, RGR) +MJH = (MLQ, QTG) +JLX = (BDS, TMM) +DVG = (FRH, DCF) +DFJ = (NSK, PDS) +RHJ = (DKM, TDJ) +FQN = (JKT, MVK) +RMD = (LGR, RML) +JTB = (VDP, BSL) +GJM = (NLD, RHJ) +LGP = (CPC, NQN) +JHN = (NBQ, MSJ) +SQF = (BBK, VXF) +HST = (CFM, QMX) +LBJ = (TBP, VNK) +SNX = (PCX, RMX) +PJF = (MGX, SKS) +RRT = (JTB, LSC) +JTT = (MLM, GLJ) +DLQ = (JBQ, RND) +LGR = (QRV, XXD) +LPT = (BSR, SHH) +HQB = (BRL, MXK) +TRP = (LFM, LCT) +JKT = (RNM, TRJ) +MXS = (GQR, KQN) +MKB = (LVQ, NNX) +NDC = (RGK, LVC) +LFN = (RRL, XNF) +SHQ = (RKB, SLB) +JGX = (NGV, HNM) +RPN = (BCL, CDR) +JSJ = (CRH, FHR) +FRH = (THR, TSX) +BNV = (RXS, LGP) +FLL = (GSR, PVF) +DNS = (JLP, JXR) +HDN = (TJX, XMV) +HJQ = (SKS, MGX) +TNX = (SJD, RQX) +XQD = (BFR, MDM) +GNM = (HPQ, SLS) +NML = (DGF, VNG) +BXM = (FJB, FQN) +MSP = (QTG, MLQ) +PBJ = (XLJ, TKD) +MNN = (DNS, VGS) +RBH = (PDS, NSK) +BFJ = (KNT, SDP) +CRD = (PBC, BFK) +TJB = (XXH, TVV) +PDJ = (SRN, SRN) +XJS = (HBG, FRX) +BBK = (LLH, PNP) +QQL = (MFR, KKZ) +FVN = (LGL, SRX) +LRP = (GXT, BSF) +SVX = (MSN, TFG) +PFC = (PCP, FGB) +XMJ = (GKF, GKF) +LLL = (DNS, VGS) +VSX = (TKG, DHL) +RND = (SBC, XFF) +MLQ = (DXT, JMT) +XLC = (TTG, QTK) +TJG = (RXS, LGP) +DPL = (PMF, FSM) +PCR = (CQP, XSJ) +BSQ = (XSD, SVD) +DHP = (HPS, MNQ) +SCB = (HXX, NQV) +FFJ = (LJF, BSV) +FTX = (VTK, TXB) +TRQ = (PCR, JMN) +GDL = (PBD, BJK) +MLM = (RRT, MQF) +TLA = (QXP, MKM) +SMN = (LFN, FVJ) +RRL = (CKJ, JNK) +BDP = (VSP, QFH) +CBC = (DVN, VXT) +JLP = (PTL, SJK) +FRS = (TKG, DHL) +SQQ = (MPL, QBQ) +DVD = (RLK, JPD) +PQP = (LGN, SFD) +FSM = (JDC, RJK) +PSN = (XJS, NRN) +QDN = (SHC, QGJ) +RJN = (XPD, GMS) +HRT = (PPQ, XTT) +CBH = (SRM, KCV) +FSC = (XBV, MTG) +DCX = (CLX, PFC) +XQR = (GSG, JSF) +HBP = (XDT, KNF) +BQJ = (KNT, SDP) +CDJ = (LFM, LCT) +JNK = (MQQ, QJX) +BVP = (MTF, SDC) +TLR = (RHC, NLP) +SJK = (DQP, LMN) +NJG = (MFR, MFR) +RLK = (XCX, PQP) +TPH = (BXH, GSQ) +NSK = (DDS, MLV) +HLQ = (FBV, VNH) +JTP = (FSN, QQQ) +PGH = (KQN, GQR) +SRJ = (PXK, GDL) +TJR = (FHR, CRH) +XDT = (BKJ, PPJ) +GQH = (RLV, THP) +GRS = (BDL, VSG) +DLJ = (CRF, VBM) +VMP = (GJD, NSQ) +MKM = (VTG, BDC) +PVF = (VLX, LBB) +GPV = (SRJ, FNQ) +NTL = (FSN, QQQ) +FQL = (BFR, MDM) +TMJ = (MLM, GLJ) +XKT = (GXT, BSF) +PCX = (NGM, CPL) +XMV = (HQB, JRJ) +QKH = (FLL, JJG) +VQP = (FLG, DDL) +SLS = (CKK, HVF) +THM = (RDQ, DVG) +PPJ = (GCT, TNX) +TMM = (BGH, SPS) +GVL = (PCG, RQS) +DCF = (TSX, THR) +BJK = (FRS, VSX) +SPP = (NNX, LVQ) +QGX = (QMJ, JHS) +RPV = (HGR, DHP) +MTG = (DGJ, QJN) +KGL = (XGD, MQC) +DHD = (RND, JBQ) +BXD = (KFH, HTM) +KGX = (MPD, BST) +QVB = (LKT, RGT) +CBK = (RDG, PKT) +BTB = (JMJ, CTD) +FSN = (DVD, GHK) +KXR = (FFT, DVQ) +TML = (GPV, PVN) +VXF = (PNP, LLH) +DBH = (SQF, VMB) +FCP = (JKK, LFD) +RXQ = (DJN, RFJ) +NTH = (SDC, MTF) +JBM = (SVX, JBD) +PNN = (FJX, SLZ) +GQR = (QQF, RGV) +PXR = (LRP, XKT) +VRK = (RDJ, SMN) +LDB = (RHC, NLP) +LHV = (RXH, ZZZ) +FNB = (DBH, BHQ) +MFM = (VMP, GQC) +PGV = (PKT, RDG) +SPR = (XJP, SHD) +CCR = (LQF, NXD) +GJC = (XRQ, PQB) +LGN = (GRS, DLD) +RDG = (FBD, NML) +MCP = (DLC, TGK) +NMD = (XFR, GRK) +MVK = (TRJ, RNM) +JKF = (TFX, KHJ) +XFR = (SMG, JNQ) +NGM = (XPX, JLX) +MFD = (GVL, MBR) +RNT = (CDR, BCL) +VVX = (XMJ, XMJ) +GNC = (HST, GJR) +CRF = (PBK, GJM) +JKK = (GCQ, SGC) +GBH = (QDR, RFF) +FJG = (XMQ, KSN) +GDV = (GQN, GXH) +XLB = (FMN, JVN) +KNV = (JBD, SVX) +PXX = (HHG, TTQ) +TDJ = (MFD, QJT) +QLG = (PJN, VFS) +NRN = (HBG, FRX) +SHM = (GRK, XFR) +FHV = (HXX, NQV) +QFH = (GNC, CHX) +PCM = (QLQ, MPH) +VLX = (QMR, PBJ) +RPP = (HRT, RBK) +JXR = (SJK, PTL) +LPQ = (QDR, RFF) +BFR = (STC, PJT) +XTT = (CBC, DSH) +HVF = (VTD, KDC) +JFJ = (FCP, BHF) +LVQ = (PRG, MQP) +JFD = (RBH, DFJ) +HFM = (TPJ, JGX) +BSV = (XQR, PMH) +JLC = (GGR, TFM) +NSQ = (FHV, SCB) +NCP = (VHB, MCP) +JKB = (LDB, TLR) +BLX = (PDJ, GBX) +SVP = (BQJ, BFJ) +VSP = (CHX, GNC) +SPH = (FJB, FQN) +RPS = (VNF, BXD) +QMR = (TKD, XLJ) +QMJ = (MXS, PGH) +JNB = (LGL, SRX) +RGM = (JTP, NTL) +GHK = (JPD, RLK) +TFX = (NJG, NJG) +NBQ = (JKP, NLS) +NTX = (VFS, PJN) +QTS = (RQV, JMD) +LMN = (DSS, PBL) +CLK = (SRM, KCV) +MPD = (RMD, DRB) +PDS = (DDS, MLV) +NNX = (PRG, MQP) +BST = (DRB, RMD) +DSG = (SGV, DVB) +KDC = (QVL, KLC) +VKX = (PSN, DSC) +LJM = (DBB, QXN) +VFV = (SHC, QGJ) +FXR = (RJN, RXD) +HGR = (HPS, MNQ) +BMN = (CCR, RPM) +CRH = (FSC, HTX) +QRV = (BBX, FFJ) +CKK = (VTD, KDC) +SDP = (RNT, RPN) +XLJ = (JTX, QRN) +BSL = (PFL, GLN) +GJD = (FHV, SCB) +VNH = (DCJ, CXG) +BCB = (MXJ, LVR) +NBF = (MPH, QLQ) +MCK = (DVQ, FFT) +RFJ = (HFM, JFK) +BBD = (LJM, NXN) +FMN = (SPR, DMJ) +JXK = (GPK, VQP) +SLL = (MHT, CDG) +TRR = (GNM, CSC) +MJC = (KXR, MCK) +MHT = (FBC, TJF) +TSF = (HDH, RGM) +FLG = (FQL, XQD) +MGX = (SLL, FQH) +RGR = (NMN, PXX) +RDA = (BVG, DJM) +VXX = (DHD, DLQ) +DXT = (BNV, TJG) +LCL = (DHV, NHN) +CKB = (FNN, FKT) +KNH = (LVR, MXJ) +GSQ = (PGR, NDC) +CFM = (DPB, SHQ) +HDH = (JTP, NTL) +NSF = (VFV, QDN) +HSF = (KSJ, KBM) +GSR = (VLX, LBB) +GCT = (RQX, SJD) +RBN = (XDT, KNF) +XNF = (JNK, CKJ) +TCF = (RBK, HRT) +DPA = (MDS, SHG) +QTG = (JMT, DXT) +RGT = (SBP, BSZ) +XCX = (SFD, LGN) +KSJ = (KDR, GKG) +GQN = (QGX, LVK) +MDM = (PJT, STC) +KKZ = (MKM, QXP) +MQC = (JQL, TML) +VFS = (FDL, BQC) +TJX = (JRJ, HQB) +BSF = (MTT, JFP) +VMD = (PQH, VHC) +JTX = (HBT, MTH) +MCH = (FMN, JVN) +VBK = (MSJ, NBQ) +TBP = (GBH, LPQ) +TVX = (VQP, GPK) +NQN = (SVP, PGB) +SMG = (XLC, NVB) +SHD = (BCB, KNH) +JLF = (SQX, GJC) +GSF = (QTS, NHG) +BDN = (PNX, RGP) +GRK = (SMG, JNQ) +PLV = (TLB, TLB) +SQS = (HTJ, VRH) +PDH = (FXM, RJB) +VGP = (LLL, MNN) +JRQ = (TVT, BLX) +CLX = (PCP, FGB) +PMF = (JDC, RJK) +JRJ = (BRL, MXK) +XMQ = (PPV, HFF) +BVT = (RQT, JKB) +FJT = (BXH, GSQ) +FRT = (TNC, PXR) +QVL = (XLB, MCH) +TNM = (BFK, PBC) +XPX = (BDS, TMM) +XCN = (SHH, BSR) +PKT = (FBD, NML) +TLB = (LKT, LKT) +TFG = (RMV, JLV) +SRN = (MDS, SHG) +FRC = (BHF, FCP) +GGR = (RTC, DKJ) +KFH = (JXK, TVX) +JNQ = (XLC, NVB) +MTF = (RGC, THM) +STT = (RDJ, SMN) +CPL = (XPX, JLX) +FGB = (XPP, QQR) +DLC = (RPP, TCF) +DJM = (QXH, BSQ) +MBH = (SGS, LBJ) +VBD = (RMX, PCX) +CXG = (TRP, CDJ) +NGV = (VMD, BQX) +GQB = (DRN, NXS) +FHR = (HTX, FSC) +DDL = (FQL, XQD) +FBC = (JNP, GQB) +DKJ = (TPH, FJT) +RQB = (GQN, GXH) +LPM = (RDD, MRD) +BKJ = (GCT, TNX) +GMS = (PDH, VHH) +HTM = (JXK, TVX) +PPQ = (CBC, DSH) +MBR = (RQS, PCG) +PJT = (FGJ, QGS) +PQH = (RBN, HBP) +CBT = (RXH, RXH) +CHX = (HST, GJR) +BQC = (JCT, TRR) +NJK = (JMJ, CTD) +QVX = (VRH, HTJ) +KKM = (FTX, CCB) +NXN = (DBB, QXN) +JQL = (GPV, PVN) +MFR = (QXP, MKM) +VML = (HGR, DHP) +PCJ = (THP, RLV) +XRQ = (BVP, NTH) +PXK = (PBD, BJK) +HCX = (HFS, HSF) +QJT = (MBR, GVL) +RLT = (BTX, QKH) +DKG = (QBQ, MPL) +CQP = (TSF, MVT) +HFF = (VBD, SNX) +KNF = (BKJ, PPJ) +FFT = (JFJ, FRC) +DDS = (PGK, DSG) +PFL = (SGB, SFQ) +RXS = (CPC, NQN) +XSV = (XCN, LPT) +MNQ = (VXV, RFQ) +PVN = (SRJ, FNQ) +VNF = (KFH, HTM) +HPQ = (HVF, CKK) +PGK = (DVB, SGV) +VHC = (HBP, RBN) +GBX = (SRN, RXZ) +SGV = (CBK, PGV) +TVV = (QLG, NTX) +KNT = (RPN, RNT) +TXB = (NSF, QJM) +PCP = (XPP, QQR) +PCG = (BDV, VXX) +MQF = (LSC, JTB) +QJN = (CKB, QSX) +QXH = (SVD, XSD) +LCT = (PCJ, GQH) +GKG = (HDN, HJJ) +TKD = (JTX, QRN) +KBQ = (XCN, LPT) +KSM = (VKX, BGL) +MQQ = (NQP, NVQ) +VFF = (HFS, HSF) +SSX = (TVT, TVT) +DSS = (VVX, VVX) +QDR = (SPH, BXM) +PGR = (RGK, RGK) +RML = (QRV, XXD) +XDR = (JNS, FXR) +DVB = (PGV, CBK) +TSX = (QBX, DLJ) +QBQ = (TJR, JSJ) +BBX = (LJF, BSV) +PTL = (DQP, LMN) +PBC = (BBD, SKJ) +VHB = (DLC, TGK) +XJP = (BCB, KNH) +STC = (QGS, FGJ) +FNQ = (PXK, GDL) +MXJ = (LHK, BBB) +JNP = (NXS, DRN) +SGS = (TBP, VNK) +RFQ = (SHM, NMD) +MLV = (DSG, PGK) +CDR = (VBK, JHN) +CTD = (DCX, BNG) +FRD = (FJX, FJX) +GCQ = (FCH, JLC) +NXS = (KGL, LTN) +JBQ = (SBC, XFF) +NLD = (DKM, TDJ) +VTG = (RBL, RPS) +JJG = (GSR, PVF) +DKM = (QJT, MFD) +RDJ = (LFN, FVJ) +KTJ = (RPM, CCR) +GSG = (FRT, MVG) +MTL = (JLF, MTS) +PNP = (RPV, VML) +TTG = (MBH, GJX) +LSC = (VDP, BSL) +THR = (DLJ, QBX) +NQV = (BVT, XQK) +LBB = (PBJ, QMR) +NQQ = (KTJ, BMN) +DMJ = (XJP, SHD) +DSC = (XJS, NRN) +RXD = (GMS, XPD) +KBM = (GKG, KDR) +LLP = (LLL, MNN) +HNM = (VMD, BQX) +VNG = (VKH, SCV) +XDG = (GKF, CTZ) +PNX = (MFM, JJP) +PBK = (RHJ, NLD) +BVR = (CNF, HCQ) +DHV = (VCC, RXL) +TGK = (RPP, TCF) +RDD = (NJK, BTB) +NMN = (HHG, TTQ) +HJF = (HPJ, SFK) +BDV = (DLQ, DHD) +TVT = (PDJ, PDJ) +BGH = (TRQ, MLP) +FVJ = (RRL, XNF) +DBB = (KKM, CGV) From 140cf8549d3d76a61c5942ff011dd97863613071 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 8 Dec 2023 08:23:05 +0000 Subject: [PATCH 407/479] 2023: d08: ex1: add solution --- 2023/d08/ex1/ex1.py | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100755 2023/d08/ex1/ex1.py diff --git a/2023/d08/ex1/ex1.py b/2023/d08/ex1/ex1.py new file mode 100755 index 0000000..9765985 --- /dev/null +++ b/2023/d08/ex1/ex1.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +import itertools +import sys + +Graph = dict[str, list[str]] + + +def solve(input: list[str]) -> int: + def parse_graph(input: list[str]) -> Graph: + res: Graph = {} + + for line in input: + start, dests = line.split(" = ") + res[start] = dests[1:-1].split(", ") + + return res + + def parse(input: list[str]) -> tuple[str, Graph]: + return input[0], parse_graph(input[2:]) + + def navigate(directions: str, graph: Graph, start: str, end: str) -> int: + pos = start + i = 0 + for dir in itertools.cycle(directions): + if pos == end: + break + pos = graph[pos][0 if dir == "L" else 1] + i += 1 + return i + + directions, graph = parse(input) + return navigate(directions, graph, "AAA", "ZZZ") + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 9fa50a7aadeb594bc2f07b489e4ba07725482726 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 8 Dec 2023 08:23:11 +0000 Subject: [PATCH 408/479] 2023: d08: ex2: add input --- 2023/d08/ex2/input | 728 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 728 insertions(+) create mode 100644 2023/d08/ex2/input diff --git a/2023/d08/ex2/input b/2023/d08/ex2/input new file mode 100644 index 0000000..b1b82ae --- /dev/null +++ b/2023/d08/ex2/input @@ -0,0 +1,728 @@ +LRLRLLRRLLRRLRRLRRRLLRLRLRLRLRRLRRRLRLRRLRLLRRLLRLRRLRLRRLLRRRLRLRLRRRLRLLRRRLLLLLLRRRLRRLLLRRLRLRRLRRLRLRRLRRLLRRLRRRLRRRLLRLRLLLRRLLLRRLLRRLRLLRRRLRRRLRRRLRLRRLRRLLLRRRLRRLLRRLRRRLRLRLRRLRRLRRRLRRRLRLLLLRRRLRLRRRLRRRLLRLRRLRRLLRLLLRRLRLRRLRRRLRRRLRRRLLRRRLRLLRRRLRRRLRRRLRRRLRRLRRRLLRRLLRLRLRRRLRRRLRLRRRR + +LFM = (PCJ, GQH) +THP = (SPP, MKB) +PBL = (VVX, JMM) +DSR = (BST, MPD) +QKF = (DSR, KGX) +AAA = (SLH, CVN) +DSH = (DVN, VXT) +VTK = (NSF, QJM) +QQR = (FNB, CBM) +RQV = (XQQ, NQQ) +CGV = (CCB, FTX) +RXL = (HXQ, HLQ) +MQP = (MSH, TJB) +MPL = (JSJ, TJR) +XQK = (RQT, JKB) +GXT = (JFP, MTT) +LHK = (BVR, MFH) +BXH = (PGR, NDC) +FFV = (MJC, TLD) +TFM = (DKJ, RTC) +MVG = (TNC, PXR) +QXN = (CGV, KKM) +LTN = (MQC, XGD) +NLP = (SQQ, DKG) +QTK = (MBH, GJX) +SSR = (DHV, NHN) +DGJ = (QSX, CKB) +SFD = (GRS, DLD) +HBT = (NVN, HJF) +VKH = (CBT, CBT) +VRH = (FVN, JNB) +HTJ = (JNB, FVN) +BDL = (SQS, QVX) +MMC = (MJC, TLD) +RBL = (VNF, BXD) +RNM = (HJQ, PJF) +CTZ = (NCP, PLT) +JFK = (TPJ, JGX) +HPJ = (MMC, FFV) +RJC = (RBH, DFJ) +DHL = (RJC, JFD) +LVR = (BBB, LHK) +LFD = (GCQ, SGC) +BVG = (BSQ, QXH) +DVN = (MTL, NDG) +XGD = (TML, JQL) +RQS = (VXX, BDV) +CPC = (PGB, SVP) +QLQ = (CLK, CBH) +RXZ = (SHG, MDS) +NTR = (RGP, PNX) +BBB = (MFH, BVR) +RGK = (FRD, FRD) +JLV = (DVV, GSF) +NLS = (VFF, HCX) +RHC = (DKG, SQQ) +NVB = (TTG, QTK) +SLZ = (DJM, BVG) +BFK = (SKJ, BBD) +HXX = (XQK, BVT) +SKS = (SLL, FQH) +SGB = (RLT, RHK) +NPD = (RFJ, DJN) +XSJ = (TSF, MVT) +LLH = (RPV, VML) +NXD = (DJS, FJG) +GJX = (SGS, LBJ) +FBV = (CXG, DCJ) +FRX = (GDV, RQB) +SDC = (RGC, THM) +JCT = (CSC, GNM) +SPS = (MLP, TRQ) +BNG = (PFC, CLX) +SHH = (LPM, VRC) +SGC = (FCH, JLC) +FJB = (MVK, JKT) +DRN = (KGL, LTN) +RJB = (NTR, BDN) +DMC = (JBM, KNV) +HBG = (RQB, GDV) +VRC = (RDD, MRD) +JJP = (GQC, VMP) +PLB = (VKX, BGL) +DVV = (QTS, NHG) +LGL = (SSX, JRQ) +RGC = (DVG, RDQ) +GPK = (DDL, FLG) +NVN = (HPJ, SFK) +DVQ = (JFJ, FRC) +VDP = (PFL, GLN) +CVN = (HNX, QKF) +QXP = (VTG, BDC) +LKT = (SBP, SBP) +QSX = (FNN, FKT) +CSC = (HPQ, SLS) +FNN = (DCV, JKF) +MTH = (NVN, HJF) +TPJ = (HNM, NGV) +NHN = (VCC, RXL) +BHF = (JKK, LFD) +HXQ = (VNH, FBV) +KDR = (HDN, HJJ) +SVD = (VRK, STT) +FGJ = (TNM, CRD) +XFF = (NPD, RXQ) +TNC = (XKT, LRP) +VBM = (GJM, PBK) +XBV = (DGJ, QJN) +GXH = (LVK, QGX) +SLH = (HNX, QKF) +ZZZ = (CVN, SLH) +RTC = (TPH, FJT) +NQP = (MJH, MSP) +XSD = (STT, VRK) +HJJ = (XMV, TJX) +JFP = (XSV, KBQ) +FTD = (NMN, PXX) +NVQ = (MSP, MJH) +SHC = (PTV, XDR) +DCV = (TFX, TFX) +BTX = (JJG, FLL) +RDQ = (DCF, FRH) +MTT = (KBQ, XSV) +DRB = (RML, LGR) +PBD = (VSX, FRS) +HFS = (KBM, KSJ) +SKJ = (NXN, LJM) +MTS = (GJC, SQX) +BRL = (TMJ, JTT) +TTQ = (KFC, DPL) +LQF = (DJS, FJG) +TKG = (JFD, RJC) +PGB = (BFJ, BQJ) +BQX = (VHC, PQH) +MRD = (BTB, NJK) +LJF = (XQR, PMH) +BCL = (VBK, JHN) +BHQ = (VMB, SQF) +BSR = (LPM, VRC) +VNK = (GBH, LPQ) +KHJ = (NJG, QQL) +VMB = (BBK, VXF) +QJM = (QDN, VFV) +KFC = (FSM, PMF) +JVN = (DMJ, SPR) +MVT = (RGM, HDH) +PQB = (BVP, NTH) +QQF = (KJP, BDP) +RGP = (JJP, MFM) +DLD = (VSG, BDL) +SCV = (CBT, LHV) +VTD = (KLC, QVL) +FCH = (GGR, TFM) +GJR = (QMX, CFM) +PMH = (GSG, JSF) +DCJ = (CDJ, TRP) +QJX = (NVQ, NQP) +DJN = (JFK, HFM) +DQP = (DSS, PBL) +XXH = (NTX, QLG) +MXK = (JTT, TMJ) +FDL = (JCT, TRR) +MGA = (PLT, NCP) +HPS = (RFQ, VXV) +SBC = (NPD, RXQ) +XPD = (VHH, PDH) +SRX = (SSX, JRQ) +CKJ = (MQQ, QJX) +FKT = (DCV, JKF) +JKP = (VFF, HCX) +JMN = (XSJ, CQP) +GLN = (SFQ, SGB) +PTV = (JNS, FXR) +FXM = (NTR, BDN) +DJS = (XMQ, KSN) +LVC = (FRD, PNN) +JPD = (PQP, XCX) +GQC = (NSQ, GJD) +SFK = (FFV, MMC) +JBD = (TFG, MSN) +BSZ = (RGR, FTD) +SQX = (XRQ, PQB) +PPV = (VBD, SNX) +JSF = (FRT, MVG) +JMT = (TJG, BNV) +JMJ = (DCX, BNG) +KJP = (QFH, VSP) +VXV = (SHM, NMD) +KLC = (XLB, MCH) +JMD = (XQQ, NQQ) +PJN = (FDL, BQC) +PLT = (MCP, VHB) +BGL = (DSC, PSN) +RXH = (SLH, CVN) +VSG = (QVX, SQS) +BDC = (RPS, RBL) +JMM = (XMJ, XDG) +RHK = (QKH, BTX) +RQX = (KSM, PLB) +FQH = (MHT, CDG) +SRM = (PLV, QGV) +HNX = (DSR, KGX) +JNS = (RJN, RXD) +MLP = (JMN, PCR) +LVK = (JHS, QMJ) +PRG = (TJB, MSH) +VGS = (JXR, JLP) +XQQ = (KTJ, BMN) +DGA = (FTD, RGR) +HTX = (MTG, XBV) +CCB = (TXB, VTK) +RQT = (TLR, LDB) +QMX = (SHQ, DPB) +MDS = (KQD, DMC) +JDC = (LCL, SSR) +NHG = (JMD, RQV) +CBM = (DBH, BHQ) +RKB = (VGP, LLP) +SJD = (PLB, KSM) +CDG = (FBC, TJF) +QGV = (TLB, QVB) +BDS = (SPS, BGH) +DGF = (VKH, VKH) +RLV = (MKB, SPP) +SHG = (KQD, DMC) +KQD = (KNV, JBM) +RMV = (DVV, GSF) +MSH = (XXH, TVV) +FJX = (BVG, DJM) +KCV = (PLV, QGV) +MFH = (HCQ, CNF) +TLD = (MCK, KXR) +SLB = (VGP, LLP) +KSN = (HFF, PPV) +RGV = (BDP, KJP) +CNF = (NBF, PCM) +TJF = (GQB, JNP) +NDG = (MTS, JLF) +VHH = (FXM, RJB) +MPH = (CLK, CBH) +RPM = (NXD, LQF) +JHS = (PGH, MXS) +TRJ = (PJF, HJQ) +RJK = (SSR, LCL) +DPB = (SLB, RKB) +XXD = (FFJ, BBX) +QBX = (CRF, VBM) +RMX = (NGM, CPL) +VXT = (MTL, NDG) +KQN = (QQF, RGV) +SFQ = (RLT, RHK) +QGJ = (XDR, PTV) +MSN = (RMV, JLV) +HCQ = (PCM, NBF) +GKF = (PLT, NCP) +VCC = (HLQ, HXQ) +MSJ = (JKP, NLS) +RFF = (BXM, SPH) +FBD = (DGF, VNG) +GLJ = (MQF, RRT) +QRN = (MTH, HBT) +QGS = (TNM, CRD) +XPP = (FNB, CBM) +QQQ = (GHK, DVD) +RBK = (PPQ, XTT) +HHG = (DPL, KFC) +SBP = (FTD, RGR) +MJH = (MLQ, QTG) +JLX = (BDS, TMM) +DVG = (FRH, DCF) +DFJ = (NSK, PDS) +RHJ = (DKM, TDJ) +FQN = (JKT, MVK) +RMD = (LGR, RML) +JTB = (VDP, BSL) +GJM = (NLD, RHJ) +LGP = (CPC, NQN) +JHN = (NBQ, MSJ) +SQF = (BBK, VXF) +HST = (CFM, QMX) +LBJ = (TBP, VNK) +SNX = (PCX, RMX) +PJF = (MGX, SKS) +RRT = (JTB, LSC) +JTT = (MLM, GLJ) +DLQ = (JBQ, RND) +LGR = (QRV, XXD) +LPT = (BSR, SHH) +HQB = (BRL, MXK) +TRP = (LFM, LCT) +JKT = (RNM, TRJ) +MXS = (GQR, KQN) +MKB = (LVQ, NNX) +NDC = (RGK, LVC) +LFN = (RRL, XNF) +SHQ = (RKB, SLB) +JGX = (NGV, HNM) +RPN = (BCL, CDR) +JSJ = (CRH, FHR) +FRH = (THR, TSX) +BNV = (RXS, LGP) +FLL = (GSR, PVF) +DNS = (JLP, JXR) +HDN = (TJX, XMV) +HJQ = (SKS, MGX) +TNX = (SJD, RQX) +XQD = (BFR, MDM) +GNM = (HPQ, SLS) +NML = (DGF, VNG) +BXM = (FJB, FQN) +MSP = (QTG, MLQ) +PBJ = (XLJ, TKD) +MNN = (DNS, VGS) +RBH = (PDS, NSK) +BFJ = (KNT, SDP) +CRD = (PBC, BFK) +TJB = (XXH, TVV) +PDJ = (SRN, SRN) +XJS = (HBG, FRX) +BBK = (LLH, PNP) +QQL = (MFR, KKZ) +FVN = (LGL, SRX) +LRP = (GXT, BSF) +SVX = (MSN, TFG) +PFC = (PCP, FGB) +XMJ = (GKF, GKF) +LLL = (DNS, VGS) +VSX = (TKG, DHL) +RND = (SBC, XFF) +MLQ = (DXT, JMT) +XLC = (TTG, QTK) +TJG = (RXS, LGP) +DPL = (PMF, FSM) +PCR = (CQP, XSJ) +BSQ = (XSD, SVD) +DHP = (HPS, MNQ) +SCB = (HXX, NQV) +FFJ = (LJF, BSV) +FTX = (VTK, TXB) +TRQ = (PCR, JMN) +GDL = (PBD, BJK) +MLM = (RRT, MQF) +TLA = (QXP, MKM) +SMN = (LFN, FVJ) +RRL = (CKJ, JNK) +BDP = (VSP, QFH) +CBC = (DVN, VXT) +JLP = (PTL, SJK) +FRS = (TKG, DHL) +SQQ = (MPL, QBQ) +DVD = (RLK, JPD) +PQP = (LGN, SFD) +FSM = (JDC, RJK) +PSN = (XJS, NRN) +QDN = (SHC, QGJ) +RJN = (XPD, GMS) +HRT = (PPQ, XTT) +CBH = (SRM, KCV) +FSC = (XBV, MTG) +DCX = (CLX, PFC) +XQR = (GSG, JSF) +HBP = (XDT, KNF) +BQJ = (KNT, SDP) +CDJ = (LFM, LCT) +JNK = (MQQ, QJX) +BVP = (MTF, SDC) +TLR = (RHC, NLP) +SJK = (DQP, LMN) +NJG = (MFR, MFR) +RLK = (XCX, PQP) +TPH = (BXH, GSQ) +NSK = (DDS, MLV) +HLQ = (FBV, VNH) +JTP = (FSN, QQQ) +PGH = (KQN, GQR) +SRJ = (PXK, GDL) +TJR = (FHR, CRH) +XDT = (BKJ, PPJ) +GQH = (RLV, THP) +GRS = (BDL, VSG) +DLJ = (CRF, VBM) +VMP = (GJD, NSQ) +MKM = (VTG, BDC) +PVF = (VLX, LBB) +GPV = (SRJ, FNQ) +NTL = (FSN, QQQ) +FQL = (BFR, MDM) +TMJ = (MLM, GLJ) +XKT = (GXT, BSF) +PCX = (NGM, CPL) +XMV = (HQB, JRJ) +QKH = (FLL, JJG) +VQP = (FLG, DDL) +SLS = (CKK, HVF) +THM = (RDQ, DVG) +PPJ = (GCT, TNX) +TMM = (BGH, SPS) +GVL = (PCG, RQS) +DCF = (TSX, THR) +BJK = (FRS, VSX) +SPP = (NNX, LVQ) +QGX = (QMJ, JHS) +RPV = (HGR, DHP) +MTG = (DGJ, QJN) +KGL = (XGD, MQC) +DHD = (RND, JBQ) +BXD = (KFH, HTM) +KGX = (MPD, BST) +QVB = (LKT, RGT) +CBK = (RDG, PKT) +BTB = (JMJ, CTD) +FSN = (DVD, GHK) +KXR = (FFT, DVQ) +TML = (GPV, PVN) +VXF = (PNP, LLH) +DBH = (SQF, VMB) +FCP = (JKK, LFD) +RXQ = (DJN, RFJ) +NTH = (SDC, MTF) +JBM = (SVX, JBD) +PNN = (FJX, SLZ) +GQR = (QQF, RGV) +PXR = (LRP, XKT) +VRK = (RDJ, SMN) +LDB = (RHC, NLP) +LHV = (RXH, ZZZ) +FNB = (DBH, BHQ) +MFM = (VMP, GQC) +PGV = (PKT, RDG) +SPR = (XJP, SHD) +CCR = (LQF, NXD) +GJC = (XRQ, PQB) +LGN = (GRS, DLD) +RDG = (FBD, NML) +MCP = (DLC, TGK) +NMD = (XFR, GRK) +MVK = (TRJ, RNM) +JKF = (TFX, KHJ) +XFR = (SMG, JNQ) +NGM = (XPX, JLX) +MFD = (GVL, MBR) +RNT = (CDR, BCL) +VVX = (XMJ, XMJ) +GNC = (HST, GJR) +CRF = (PBK, GJM) +JKK = (GCQ, SGC) +GBH = (QDR, RFF) +FJG = (XMQ, KSN) +GDV = (GQN, GXH) +XLB = (FMN, JVN) +KNV = (JBD, SVX) +PXX = (HHG, TTQ) +TDJ = (MFD, QJT) +QLG = (PJN, VFS) +NRN = (HBG, FRX) +SHM = (GRK, XFR) +FHV = (HXX, NQV) +QFH = (GNC, CHX) +PCM = (QLQ, MPH) +VLX = (QMR, PBJ) +RPP = (HRT, RBK) +JXR = (SJK, PTL) +LPQ = (QDR, RFF) +BFR = (STC, PJT) +XTT = (CBC, DSH) +HVF = (VTD, KDC) +JFJ = (FCP, BHF) +LVQ = (PRG, MQP) +JFD = (RBH, DFJ) +HFM = (TPJ, JGX) +BSV = (XQR, PMH) +JLC = (GGR, TFM) +NSQ = (FHV, SCB) +NCP = (VHB, MCP) +JKB = (LDB, TLR) +BLX = (PDJ, GBX) +SVP = (BQJ, BFJ) +VSP = (CHX, GNC) +SPH = (FJB, FQN) +RPS = (VNF, BXD) +QMR = (TKD, XLJ) +QMJ = (MXS, PGH) +JNB = (LGL, SRX) +RGM = (JTP, NTL) +GHK = (JPD, RLK) +TFX = (NJG, NJG) +NBQ = (JKP, NLS) +NTX = (VFS, PJN) +QTS = (RQV, JMD) +LMN = (DSS, PBL) +CLK = (SRM, KCV) +MPD = (RMD, DRB) +PDS = (DDS, MLV) +NNX = (PRG, MQP) +BST = (DRB, RMD) +DSG = (SGV, DVB) +KDC = (QVL, KLC) +VKX = (PSN, DSC) +LJM = (DBB, QXN) +VFV = (SHC, QGJ) +FXR = (RJN, RXD) +HGR = (HPS, MNQ) +BMN = (CCR, RPM) +CRH = (FSC, HTX) +QRV = (BBX, FFJ) +CKK = (VTD, KDC) +SDP = (RNT, RPN) +XLJ = (JTX, QRN) +BSL = (PFL, GLN) +GJD = (FHV, SCB) +VNH = (DCJ, CXG) +BCB = (MXJ, LVR) +NBF = (MPH, QLQ) +MCK = (DVQ, FFT) +RFJ = (HFM, JFK) +BBD = (LJM, NXN) +FMN = (SPR, DMJ) +JXK = (GPK, VQP) +SLL = (MHT, CDG) +TRR = (GNM, CSC) +MJC = (KXR, MCK) +MHT = (FBC, TJF) +TSF = (HDH, RGM) +FLG = (FQL, XQD) +MGX = (SLL, FQH) +RGR = (NMN, PXX) +RDA = (BVG, DJM) +VXX = (DHD, DLQ) +DXT = (BNV, TJG) +LCL = (DHV, NHN) +CKB = (FNN, FKT) +KNH = (LVR, MXJ) +GSQ = (PGR, NDC) +CFM = (DPB, SHQ) +HDH = (JTP, NTL) +NSF = (VFV, QDN) +HSF = (KSJ, KBM) +GSR = (VLX, LBB) +GCT = (RQX, SJD) +RBN = (XDT, KNF) +XNF = (JNK, CKJ) +TCF = (RBK, HRT) +DPA = (MDS, SHG) +QTG = (JMT, DXT) +RGT = (SBP, BSZ) +XCX = (SFD, LGN) +KSJ = (KDR, GKG) +GQN = (QGX, LVK) +MDM = (PJT, STC) +KKZ = (MKM, QXP) +MQC = (JQL, TML) +VFS = (FDL, BQC) +TJX = (JRJ, HQB) +BSF = (MTT, JFP) +VMD = (PQH, VHC) +JTX = (HBT, MTH) +MCH = (FMN, JVN) +VBK = (MSJ, NBQ) +TBP = (GBH, LPQ) +TVX = (VQP, GPK) +NQN = (SVP, PGB) +SMG = (XLC, NVB) +SHD = (BCB, KNH) +JLF = (SQX, GJC) +GSF = (QTS, NHG) +BDN = (PNX, RGP) +GRK = (SMG, JNQ) +PLV = (TLB, TLB) +SQS = (HTJ, VRH) +PDH = (FXM, RJB) +VGP = (LLL, MNN) +JRQ = (TVT, BLX) +CLX = (PCP, FGB) +PMF = (JDC, RJK) +JRJ = (BRL, MXK) +XMQ = (PPV, HFF) +BVT = (RQT, JKB) +FJT = (BXH, GSQ) +FRT = (TNC, PXR) +QVL = (XLB, MCH) +TNM = (BFK, PBC) +XPX = (BDS, TMM) +XCN = (SHH, BSR) +PKT = (FBD, NML) +TLB = (LKT, LKT) +TFG = (RMV, JLV) +SRN = (MDS, SHG) +FRC = (BHF, FCP) +GGR = (RTC, DKJ) +KFH = (JXK, TVX) +JNQ = (XLC, NVB) +MTF = (RGC, THM) +STT = (RDJ, SMN) +CPL = (XPX, JLX) +FGB = (XPP, QQR) +DLC = (RPP, TCF) +DJM = (QXH, BSQ) +MBH = (SGS, LBJ) +VBD = (RMX, PCX) +CXG = (TRP, CDJ) +NGV = (VMD, BQX) +GQB = (DRN, NXS) +FHR = (HTX, FSC) +DDL = (FQL, XQD) +FBC = (JNP, GQB) +DKJ = (TPH, FJT) +RQB = (GQN, GXH) +LPM = (RDD, MRD) +BKJ = (GCT, TNX) +GMS = (PDH, VHH) +HTM = (JXK, TVX) +PPQ = (CBC, DSH) +MBR = (RQS, PCG) +PJT = (FGJ, QGS) +PQH = (RBN, HBP) +CBT = (RXH, RXH) +CHX = (HST, GJR) +BQC = (JCT, TRR) +NJK = (JMJ, CTD) +QVX = (VRH, HTJ) +KKM = (FTX, CCB) +NXN = (DBB, QXN) +JQL = (GPV, PVN) +MFR = (QXP, MKM) +VML = (HGR, DHP) +PCJ = (THP, RLV) +XRQ = (BVP, NTH) +PXK = (PBD, BJK) +HCX = (HFS, HSF) +QJT = (MBR, GVL) +RLT = (BTX, QKH) +DKG = (QBQ, MPL) +CQP = (TSF, MVT) +HFF = (VBD, SNX) +KNF = (BKJ, PPJ) +FFT = (JFJ, FRC) +DDS = (PGK, DSG) +PFL = (SGB, SFQ) +RXS = (CPC, NQN) +XSV = (XCN, LPT) +MNQ = (VXV, RFQ) +PVN = (SRJ, FNQ) +VNF = (KFH, HTM) +HPQ = (HVF, CKK) +PGK = (DVB, SGV) +VHC = (HBP, RBN) +GBX = (SRN, RXZ) +SGV = (CBK, PGV) +TVV = (QLG, NTX) +KNT = (RPN, RNT) +TXB = (NSF, QJM) +PCP = (XPP, QQR) +PCG = (BDV, VXX) +MQF = (LSC, JTB) +QJN = (CKB, QSX) +QXH = (SVD, XSD) +LCT = (PCJ, GQH) +GKG = (HDN, HJJ) +TKD = (JTX, QRN) +KBQ = (XCN, LPT) +KSM = (VKX, BGL) +MQQ = (NQP, NVQ) +VFF = (HFS, HSF) +SSX = (TVT, TVT) +DSS = (VVX, VVX) +QDR = (SPH, BXM) +PGR = (RGK, RGK) +RML = (QRV, XXD) +XDR = (JNS, FXR) +DVB = (PGV, CBK) +TSX = (QBX, DLJ) +QBQ = (TJR, JSJ) +BBX = (LJF, BSV) +PTL = (DQP, LMN) +PBC = (BBD, SKJ) +VHB = (DLC, TGK) +XJP = (BCB, KNH) +STC = (QGS, FGJ) +FNQ = (PXK, GDL) +MXJ = (LHK, BBB) +JNP = (NXS, DRN) +SGS = (TBP, VNK) +RFQ = (SHM, NMD) +MLV = (DSG, PGK) +CDR = (VBK, JHN) +CTD = (DCX, BNG) +FRD = (FJX, FJX) +GCQ = (FCH, JLC) +NXS = (KGL, LTN) +JBQ = (SBC, XFF) +NLD = (DKM, TDJ) +VTG = (RBL, RPS) +JJG = (GSR, PVF) +DKM = (QJT, MFD) +RDJ = (LFN, FVJ) +KTJ = (RPM, CCR) +GSG = (FRT, MVG) +MTL = (JLF, MTS) +PNP = (RPV, VML) +TTG = (MBH, GJX) +LSC = (VDP, BSL) +THR = (DLJ, QBX) +NQV = (BVT, XQK) +LBB = (PBJ, QMR) +NQQ = (KTJ, BMN) +DMJ = (XJP, SHD) +DSC = (XJS, NRN) +RXD = (GMS, XPD) +KBM = (GKG, KDR) +LLP = (LLL, MNN) +HNM = (VMD, BQX) +VNG = (VKH, SCV) +XDG = (GKF, CTZ) +PNX = (MFM, JJP) +PBK = (RHJ, NLD) +BVR = (CNF, HCQ) +DHV = (VCC, RXL) +TGK = (RPP, TCF) +RDD = (NJK, BTB) +NMN = (HHG, TTQ) +HJF = (HPJ, SFK) +BDV = (DLQ, DHD) +TVT = (PDJ, PDJ) +BGH = (TRQ, MLP) +FVJ = (RRL, XNF) +DBB = (KKM, CGV) From 01ecc496a594be32ff28a68b81cd02af7e0eb46b Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 8 Dec 2023 08:23:16 +0000 Subject: [PATCH 409/479] 2023: d08: ex2: add solution --- 2023/d08/ex2/ex2.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100755 2023/d08/ex2/ex2.py diff --git a/2023/d08/ex2/ex2.py b/2023/d08/ex2/ex2.py new file mode 100755 index 0000000..8d9ec61 --- /dev/null +++ b/2023/d08/ex2/ex2.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +import itertools +import math +import sys + +Graph = dict[str, list[str]] + + +def solve(input: list[str]) -> int: + def parse_graph(input: list[str]) -> Graph: + res: Graph = {} + + for line in input: + start, dests = line.split(" = ") + res[start] = dests[1:-1].split(", ") + + return res + + def parse(input: list[str]) -> tuple[str, Graph]: + return input[0], parse_graph(input[2:]) + + def navigate(directions: str, graph: Graph, start: str) -> int: + pos = start + i = 0 + for dir in itertools.cycle(directions): + if pos[-1] == "Z": + break + pos = graph[pos][0 if dir == "L" else 1] + i += 1 + return i + + directions, graph = parse(input) + starts = set(node for node in graph if node[-1] == "A") + steps = {navigate(directions, graph, n) for n in starts} + return math.lcm(*steps) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 7c29d7d889d7c6277aaed8878c45b0580b03a349 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 9 Dec 2023 09:47:07 +0000 Subject: [PATCH 410/479] 2023: d09: ex1: add input --- 2023/d09/ex1/input | 200 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 2023/d09/ex1/input diff --git a/2023/d09/ex1/input b/2023/d09/ex1/input new file mode 100644 index 0000000..24b4351 --- /dev/null +++ b/2023/d09/ex1/input @@ -0,0 +1,200 @@ +28 38 58 115 255 558 1167 2343 4564 8699 16328 30378 56447 105549 199601 381868 735876 1418100 2712150 5115341 9472583 +24 34 56 103 191 343 593 990 1602 2520 3862 5777 8449 12101 16999 23456 31836 42558 56100 73003 93875 +12 30 66 118 187 291 486 901 1807 3760 7885 16402 33536 67001 130303 246169 451478 804146 1392500 2347766 3860393 +11 7 -1 -10 4 101 392 1052 2337 4631 8595 15584 28661 54781 109041 222274 453659 910327 1775963 3349730 6094694 +13 26 56 110 200 360 677 1347 2785 5847 12267 25493 52275 105732 211455 420013 833076 1658291 3323777 6713131 13636877 +24 36 50 68 92 124 166 220 288 372 474 596 740 908 1102 1324 1576 1860 2178 2532 2924 +4 10 18 35 81 207 523 1232 2664 5299 9766 16819 27345 42607 65306 103013 177906 352348 792280 1916515 4732055 +2 4 15 46 115 246 479 915 1841 4022 9326 21995 51143 115539 252570 534754 1099830 2205374 4328183 8346246 15873877 +6 16 41 104 240 508 1016 1959 3670 6684 11815 20246 33632 54216 84958 129677 193206 281560 402117 563812 777344 +10 24 59 127 240 410 649 969 1382 1900 2535 3299 4204 5262 6485 7885 9474 11264 13267 15495 17960 +1 3 19 65 161 334 621 1072 1753 2749 4167 6139 8825 12416 17137 23250 31057 40903 53179 68325 86833 +1 3 14 46 118 256 493 869 1431 2233 3336 4808 6724 9166 12223 15991 20573 26079 32626 40338 49346 +5 20 54 111 200 339 551 863 1338 2203 4189 9270 22068 52271 118490 254073 515553 994838 1837662 3275301 5689494 +11 19 37 74 152 315 630 1176 2019 3189 4728 6991 11599 23863 58350 151043 385257 945993 2232085 5082986 11226568 +-6 -5 -1 6 16 29 45 64 86 111 139 170 204 241 281 324 370 419 471 526 584 +19 44 79 123 175 234 299 369 443 520 599 679 759 838 915 989 1059 1124 1183 1235 1279 +20 26 41 76 144 261 459 824 1572 3189 6707 14297 30581 65483 140200 299218 633600 1324592 2722729 5487182 10824554 +2 13 49 134 316 686 1400 2714 5060 9211 16601 29879 53781 96407 171038 298877 513930 873445 1482345 2550372 4520094 +7 22 55 116 218 381 645 1090 1862 3209 5540 9533 16335 27918 47680 81409 138761 235440 396309 659706 1083288 +23 34 43 54 73 105 151 202 234 223 220 555 2284 8074 23894 62315 149406 340397 757350 1681105 3771572 +-2 9 31 72 157 346 769 1701 3724 8065 17266 36441 75513 153008 302220 580858 1085650 1973817 3493849 6028622 10154597 +17 35 83 175 326 554 878 1305 1800 2233 2292 1349 -1702 -8485 -20570 -37084 -47977 -18173 145725 659887 1980386 +6 19 49 119 273 598 1257 2530 4856 8858 15310 24963 38082 53479 66865 68818 44405 -18660 -94790 -14282 809438 +17 21 22 20 15 7 -4 -18 -35 -55 -78 -104 -133 -165 -200 -238 -279 -323 -370 -420 -473 +8 23 59 139 312 672 1383 2710 5056 9005 15371 25253 40096 61758 92583 135480 194008 272467 375995 510671 683624 +9 16 34 63 103 154 216 289 373 468 574 691 819 958 1108 1269 1441 1624 1818 2023 2239 +8 19 59 140 275 481 794 1315 2308 4381 8817 18206 37692 77458 157694 318613 640892 1287715 2591041 5226414 10560561 +8 21 37 57 82 107 117 88 -4 -163 -339 -377 54 1555 5117 12270 25264 47285 82709 137397 219034 +22 34 44 52 58 62 64 64 62 58 52 44 34 22 8 -8 -26 -46 -68 -92 -118 +28 57 114 220 416 779 1446 2651 4785 8494 14832 25483 43057 71450 116238 185052 287858 437047 647230 934638 1316054 +16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 +28 39 48 62 97 180 347 630 1022 1413 1518 905 -557 -1064 7553 50137 189888 570667 1494764 3559032 7883557 +5 0 3 30 106 262 542 1035 1947 3728 7269 14184 27192 50614 91000 157901 264801 430224 679031 1043922 1567158 +4 21 55 119 239 461 864 1591 2913 5356 9967 18894 36631 72557 145803 294037 588486 1158435 2229571 4181885 7634411 +8 11 15 33 81 182 384 805 1728 3777 8206 17321 35023 67400 123199 213865 352632 551879 817609 1139457 1474069 +6 15 30 69 162 358 754 1560 3223 6658 13679 27799 55705 109973 214073 411584 783020 1476065 2758724 5110417 9373988 +18 26 37 54 84 138 231 382 614 954 1433 2086 2952 4074 5499 7278 9466 12122 15309 19094 23548 +3 -2 -7 -12 -17 -22 -27 -32 -37 -42 -47 -52 -57 -62 -67 -72 -77 -82 -87 -92 -97 +16 32 61 121 242 466 847 1451 2356 3652 5441 7837 10966 14966 19987 26191 33752 42856 53701 66497 81466 +13 35 79 160 302 554 1015 1865 3399 6061 10475 17470 28096 43628 65555 95551 135425 187047 252247 332684 429682 +13 6 -9 -20 11 156 538 1364 2981 5967 11279 20495 36207 62647 106658 179157 297277 487420 789503 1262734 1993315 +14 11 18 51 141 348 790 1714 3660 7803 16602 34939 71995 144184 279550 524126 950858 1671811 2854498 4743307 7687145 +2 7 22 56 123 242 437 737 1176 1793 2632 3742 5177 6996 9263 12047 15422 19467 24266 29908 36487 +19 34 68 128 220 349 519 733 993 1300 1654 2054 2498 2983 3505 4059 4639 5238 5848 6460 7064 +21 48 85 132 195 292 468 836 1684 3739 8772 20876 48964 111327 243473 510946 1029407 1994954 3728471 6738732 11810049 +11 27 55 108 210 394 696 1143 1733 2405 2997 3190 2436 -132 -5810 -16455 -34641 -63841 -108637 -174960 -270362 +12 12 12 25 90 292 791 1869 4012 8064 15537 29266 54829 103647 199701 393835 793523 1623291 3344337 6885726 14081159 +5 13 31 72 164 358 736 1410 2499 4070 6039 8076 9700 11088 15835 38309 120943 371965 1044017 2693426 6497234 +-1 -4 4 46 162 411 867 1607 2698 4206 6273 9338 14615 24985 46510 90835 178809 345728 648682 1176574 2063472 +8 16 23 40 92 216 455 847 1408 2108 2839 3374 3316 2036 -1401 -8323 -20552 -40520 -71401 -117260 -183220 +27 54 93 143 215 340 581 1059 2009 3892 7603 14833 28665 54510 101519 184641 327535 566586 956321 1576571 2541779 +18 25 37 63 114 201 333 515 746 1017 1309 1591 1818 1929 1845 1467 674 -679 -2763 -5777 -9950 +11 23 58 131 266 508 956 1834 3618 7240 14408 28142 53779 101035 188408 352630 668776 1292502 2547568 5104551 10339633 +20 30 55 112 230 464 919 1792 3444 6514 12092 22012 39486 70717 129039 244932 488666 1018738 2181538 4711697 10130222 +8 15 22 29 36 43 50 57 64 71 78 85 92 99 106 113 120 127 134 141 148 +8 17 18 5 -32 -110 -256 -510 -928 -1585 -2578 -4029 -6088 -8936 -12788 -17896 -24552 -33091 -43894 -57391 -74064 +0 6 28 73 155 304 573 1043 1826 3066 4938 7645 11413 16484 23107 31527 41972 54638 69672 87153 107071 +8 14 26 39 49 61 112 320 974 2687 6657 15139 32341 66134 131237 254984 487637 921079 1723959 3210704 5981290 +-3 6 32 88 209 468 1005 2092 4276 8669 17497 35106 69812 137381 267702 517614 995199 1904592 3626038 6854228 12829699 +16 14 18 32 52 64 53 40 180 979 3722 11247 29252 68383 147421 297965 571096 1046604 1845466 3146378 5207268 +0 19 60 146 330 708 1432 2721 4864 8205 13096 19800 28322 38142 47820 54439 52848 34663 -13020 -109250 -281238 +19 37 70 119 185 269 372 495 639 805 994 1207 1445 1709 2000 2319 2667 3045 3454 3895 4369 +8 18 30 51 92 174 350 764 1787 4310 10347 24225 54843 119816 252855 516572 1024178 1975442 3715028 6825207 12270294 +9 31 64 108 163 229 306 394 493 603 724 856 999 1153 1318 1494 1681 1879 2088 2308 2539 +27 36 46 65 110 223 504 1178 2725 6116 13214 27417 54640 104755 193632 345950 598975 1007532 1650430 2638633 4125506 +-3 -9 -19 -25 -9 63 252 660 1449 2882 5441 10155 19412 38768 80661 171586 365345 766697 1572457 3141343 6110353 +9 13 16 19 30 81 256 730 1819 4041 8188 15409 27304 46029 74412 116080 175597 258613 372024 524143 724882 +8 17 26 35 44 53 62 71 80 89 98 107 116 125 134 143 152 161 170 179 188 +13 29 69 150 300 564 1014 1770 3055 5340 9688 18482 36824 75023 152753 305660 595433 1124631 2057879 3651414 6293380 +19 39 64 101 169 299 534 929 1551 2479 3804 5629 8069 11251 15314 20409 26699 34359 43576 54549 67489 +26 48 79 119 168 226 293 369 454 548 651 763 884 1014 1153 1301 1458 1624 1799 1983 2176 +16 28 45 62 80 120 240 563 1330 3003 6482 13603 28310 59352 126262 272164 590489 1279633 2753130 5858989 12311553 +16 27 38 49 60 71 82 93 104 115 126 137 148 159 170 181 192 203 214 225 236 +16 26 52 107 212 412 806 1601 3204 6384 12578 24502 47411 91748 178785 352718 706597 1437520 2962583 6158201 12843931 +15 23 44 100 234 527 1138 2396 4995 10379 21457 43857 88008 172421 328611 608145 1092295 1904695 3227218 5318970 8537806 +19 35 67 125 219 359 555 817 1155 1579 2099 2725 3467 4335 5339 6489 7795 9267 10915 12749 14779 +14 9 -2 -25 -60 -96 -107 -38 250 1146 3714 10678 28555 72047 172745 395881 871826 1854119 3824278 7677249 15042442 +0 14 48 119 263 559 1175 2446 5004 10002 19512 37235 69743 128583 233715 418934 740144 1287614 2203656 3707527 6129775 +-6 -13 -11 9 54 127 233 409 798 1797 4331 10342 23629 51210 105348 206191 384454 682459 1149765 1826027 2697892 +14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 +9 15 23 41 93 228 528 1127 2265 4422 8622 17094 34685 71869 151157 320706 682873 1452897 3076233 6455943 13379245 +26 38 54 85 154 309 648 1354 2736 5284 9786 17637 31605 57512 107535 206117 399770 772302 1467138 2718337 4891512 +7 2 -4 -11 -19 -28 -38 -49 -61 -74 -88 -103 -119 -136 -154 -173 -193 -214 -236 -259 -283 +17 40 72 120 202 355 665 1340 2867 6327 14000 30508 64985 135242 275772 552897 1092529 2128842 4085140 7700052 14210216 +-3 -4 -7 -12 -19 -28 -39 -52 -67 -84 -103 -124 -147 -172 -199 -228 -259 -292 -327 -364 -403 +9 21 38 62 99 161 268 450 749 1221 1938 2990 4487 6561 9368 13090 17937 24149 31998 41790 53867 +2 9 39 99 204 393 760 1519 3132 6545 13600 27720 54996 105835 197349 356668 625334 1064865 1763453 2843561 4469892 +20 33 49 75 125 228 457 1004 2337 5480 12453 26893 54846 105671 192927 335020 555266 880875 1340177 1957191 2742379 +18 21 16 6 5 57 270 860 2190 4774 9202 15936 24945 35235 44593 50493 54394 73951 171296 510662 1464845 +10 11 18 38 71 100 71 -142 -790 -2316 -5409 -10945 -19511 -29701 -33227 -2480 138638 579164 1757487 4641596 11293649 +25 33 43 67 138 323 742 1611 3346 6797 13731 27756 55976 111792 219447 421300 789851 1449309 2618271 4700169 8479106 +27 42 62 88 120 169 286 615 1492 3635 8492 18826 39628 79522 153115 285551 522357 951296 1749478 3279940 6279276 +-1 11 47 125 280 574 1106 2022 3525 5885 9449 14651 22022 32200 45940 64124 87771 118047 156275 203945 262724 +13 21 51 115 225 393 631 951 1365 1885 2523 3291 4201 5265 6495 7903 9501 11301 13315 15555 18033 +20 35 53 83 140 245 425 713 1148 1775 2645 3815 5348 7313 9785 12845 16580 21083 26453 32795 40220 +10 26 63 132 248 429 694 1074 1663 2751 5098 10427 22235 47044 96239 188667 354200 638496 1109225 1864062 3040786 +6 -1 -9 -15 -17 -13 13 141 635 2188 6391 16606 39556 88146 186315 377108 735668 1389501 2549183 4553679 7935653 +9 15 43 117 265 514 885 1388 2017 2745 3519 4255 4833 5092 4825 3774 1625 -1997 -7533 -15495 -26471 +7 22 41 65 106 207 489 1245 3117 7431 16845 36609 76972 157632 315649 618971 1188707 2234572 4109585 7392185 13006510 +10 9 5 -1 3 51 224 700 1840 4321 9327 18809 35825 64971 112914 189038 306214 481705 738217 1105107 1619759 +12 16 30 69 148 282 486 775 1164 1668 2302 3081 4020 5134 6438 7947 9676 11640 13854 16333 19092 +1 0 10 42 98 172 270 462 979 2368 5718 12970 27324 53756 99658 175614 296325 481696 758098 1159818 1730710 +8 19 38 73 142 283 562 1079 1973 3430 5708 9217 14739 23954 40566 72513 136014 262573 510546 983505 1858428 +9 24 57 114 205 359 643 1184 2197 4026 7209 12582 21441 35785 58667 94684 150641 236428 366153 559578 843909 +8 14 22 32 44 58 74 92 112 134 158 184 212 242 274 308 344 382 422 464 508 +24 34 44 54 64 74 84 94 104 114 124 134 144 154 164 174 184 194 204 214 224 +16 30 63 126 233 405 686 1187 2184 4316 8979 19130 40965 87415 185254 389023 807192 1649322 3307839 6494862 12463897 +-7 -7 1 32 121 335 787 1666 3321 6479 12739 25563 52073 106047 212569 414805 783321 1428197 2513885 4276266 7040633 +-2 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 +13 27 38 41 36 48 177 688 2156 5707 13455 29337 60698 121182 235783 449463 842011 1554867 2842648 5177133 9461476 +15 42 93 182 326 549 884 1374 2086 3178 5119 9300 19562 45721 111199 268798 632393 1439844 3177921 6832092 14389654 +7 28 73 151 265 408 559 679 707 556 109 -785 -2315 -4712 -8253 -13265 -20129 -29284 -41231 -56537 -75839 +8 5 13 42 97 177 284 446 766 1532 3473 8340 20149 47680 109278 241921 518597 1082840 2220086 4508651 9140126 +17 27 40 71 149 317 632 1165 2001 3239 4992 7387 10565 14681 19904 26417 34417 44115 55736 69519 85717 +24 37 47 65 117 257 594 1347 2963 6367 13474 28217 58615 120994 248715 510261 1046343 2144574 4386122 8926186 18016274 +11 16 36 80 158 277 445 706 1254 2711 6703 16929 40991 93338 199774 404089 777493 1431666 2536382 4342822 7213860 +0 -2 8 48 141 321 657 1303 2580 5096 9915 18799 34571 61685 107144 181982 303624 499562 812938 1310810 2096097 +4 15 39 91 211 473 995 1967 3741 7078 13740 27774 58093 123376 261026 543285 1106377 2204300 4310572 8314176 15899538 +-7 6 36 87 163 272 446 788 1568 3411 7651 16966 36460 75419 150039 287505 531891 952452 1654990 2797097 4608209 +13 29 56 95 152 244 405 692 1191 2023 3350 5381 8378 12662 18619 26706 37457 51489 69508 92315 120812 +15 27 59 125 237 417 722 1283 2361 4428 8300 15415 28528 53504 103742 210470 445527 969865 2133765 4678765 10135083 +20 31 57 122 274 596 1223 2377 4439 8101 14695 26909 50338 96812 191434 387177 794467 1639641 3377468 6902112 13932807 +10 37 91 200 416 820 1528 2716 4696 8091 14175 25464 46666 86122 157896 284700 501870 862641 1445003 2360456 3765020 +6 24 54 95 153 251 440 812 1516 2778 4926 8421 13895 22197 34448 52106 77042 111628 158838 222363 306741 +9 24 49 84 125 162 193 281 693 2172 6405 16762 39393 84782 169869 320863 576881 994560 1653801 2664816 4176661 +3 10 23 57 149 386 945 2142 4499 8866 16685 30566 55492 101260 187366 352765 675303 1309938 2562335 5026719 9836291 +15 29 55 109 226 481 1024 2134 4299 8344 15672 28779 52397 95981 178896 340733 660899 1294259 2533505 4914517 9388784 +14 33 78 166 331 644 1248 2423 4711 9165 17861 34963 68917 136884 273538 548338 1099300 2198986 4383250 8701159 17195603 +7 5 5 7 11 17 25 35 47 61 77 95 115 137 161 187 215 245 277 311 347 +0 2 9 21 38 60 87 119 156 198 245 297 354 416 483 555 632 714 801 893 990 +8 11 29 79 200 478 1087 2365 4957 10076 19965 38689 73433 136495 248086 439830 758518 1269449 2059289 3241351 4974534 +9 26 71 154 282 459 686 961 1279 1632 2009 2396 2776 3129 3432 3659 3781 3766 3579 3182 2534 +-8 -9 -1 23 70 147 261 419 628 895 1227 1631 2114 2683 3345 4107 4976 5959 7063 8295 9662 +14 38 88 183 349 621 1047 1694 2656 4064 6098 9001 13095 18799 26649 37320 51650 70666 95612 127979 169537 +1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 +10 17 33 71 156 319 593 1016 1655 2681 4550 8393 16823 35591 76964 166498 356232 749489 1545759 3118955 6149158 +-2 5 20 55 147 378 896 1945 3924 7507 13868 25067 44665 78648 136752 234293 394618 652305 1057252 1679807 2617103 +-2 -3 -3 12 76 250 640 1443 3044 6202 12405 24581 48599 96524 193673 393656 809674 1677915 3482413 7194006 14714566 +-5 -2 2 11 40 131 388 1045 2594 6015 13162 27362 54272 103007 187497 327953 552225 896728 1406510 2133961 3135644 +-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 +6 23 51 90 140 201 273 356 450 555 671 798 936 1085 1245 1416 1598 1791 1995 2210 2436 +22 44 78 135 237 421 758 1410 2772 5783 12540 27421 59046 123639 250801 493519 945638 1772306 3262446 5917591 10599023 +24 37 60 106 197 375 727 1435 2867 5730 11311 21837 40990 74618 131688 225532 375442 608675 962934 1489396 2256363 +12 20 49 112 222 392 635 964 1392 1932 2597 3400 4354 5472 6767 8252 9940 11844 13977 16352 18982 +2 7 24 61 126 227 372 569 826 1151 1552 2037 2614 3291 4076 4977 6002 7159 8456 9901 11502 +12 11 22 60 158 379 821 1618 2953 5122 8728 15159 27666 53731 110255 234858 510014 1112985 2415218 5172306 10872818 +17 24 49 120 294 677 1456 2952 5715 10719 19792 36560 68444 130715 254454 501802 994701 1968430 3870295 7539464 14530122 +25 40 65 122 253 535 1117 2293 4630 9184 17861 34010 63355 115342 204806 353380 588983 939636 1414390 1959381 2372399 +25 52 90 138 195 260 332 410 493 580 670 762 855 948 1040 1130 1217 1300 1378 1450 1515 +0 2 24 87 221 468 885 1547 2550 4014 6086 8943 12795 17888 24507 32979 43676 57018 73476 93575 117897 +19 32 61 117 214 369 603 947 1457 2242 3509 5629 9228 15307 25395 41739 67535 107204 166717 253973 379234 +23 32 38 44 60 103 197 373 669 1130 1808 2762 4058 5769 7975 10763 14227 18468 23594 29720 36968 +4 11 19 35 76 180 439 1069 2539 5797 12662 26510 53500 104832 201057 380617 717363 1357502 2598934 5062820 10063437 +10 19 23 14 -24 -121 -314 -610 -897 -761 888 6598 22021 59353 144459 331532 733040 1580211 3343069 6963206 14293206 +3 17 48 105 201 354 600 1028 1847 3495 6800 13203 25053 45984 81384 138966 229451 367373 572016 868493 1288977 +-4 -3 10 49 132 289 583 1147 2252 4449 8873 17855 36050 72341 142802 274973 513588 927669 1618516 2727541 4442064 +19 39 74 133 236 422 765 1415 2696 5313 10758 22099 45557 93732 192181 392487 797276 1606233 3197558 6267150 12058959 +-7 -10 -13 -16 -19 -22 -25 -28 -31 -34 -37 -40 -43 -46 -49 -52 -55 -58 -61 -64 -67 +21 44 74 122 221 432 849 1603 2865 4848 7808 12044 17897 25748 36015 49149 65629 85956 110646 140222 175205 +18 26 39 66 116 198 321 494 726 1026 1403 1866 2424 3086 3861 4758 5786 6954 8271 9746 11388 +21 40 78 164 356 766 1605 3259 6420 12322 23187 43106 79841 148586 279840 535679 1042583 2055644 4079972 8092520 15934162 +20 37 62 95 136 185 242 307 380 461 550 647 752 865 986 1115 1252 1397 1550 1711 1880 +0 2 15 48 121 283 642 1407 2942 5832 10961 19602 33519 55081 87388 134409 201132 293726 419715 588164 809877 +8 13 15 13 15 42 131 338 755 1592 3455 8105 20256 51423 127543 303162 686530 1482119 3060047 6065853 11589253 +12 30 59 93 125 157 214 361 722 1498 2987 5640 10262 18599 34737 67942 137708 281702 566759 1101727 2048287 +-3 10 49 127 264 492 863 1464 2440 4028 6633 11078 19417 37246 79490 183510 436575 1030078 2361565 5219525 11107638 +16 33 54 90 174 378 846 1849 3867 7702 14625 26559 46299 77769 126315 199032 305122 456279 667096 955488 1343124 +19 43 88 176 343 647 1194 2198 4111 7897 15598 31482 64323 131829 269087 544536 1090317 2160903 4249054 8320480 16296305 +22 41 67 112 212 447 969 2039 4084 7808 14445 26357 48398 90840 175255 345646 688410 1366499 2675535 5132758 9613680 +12 25 47 89 162 277 445 677 984 1377 1867 2465 3182 4029 5017 6157 7460 8937 10599 12457 14522 +5 0 -7 -1 49 197 534 1225 2596 5304 10634 21018 41034 79540 154415 302881 602927 1215420 2462671 4968277 9895903 +-9 -14 -15 1 65 237 627 1430 2974 5775 10594 18507 31038 50464 80459 127293 201992 324897 538038 942790 1811370 +2 4 0 -10 -11 41 233 709 1684 3458 6430 11112 18143 28303 42527 61919 87766 121552 164972 219946 288633 +7 26 67 150 317 656 1342 2714 5434 10819 21508 42739 84695 166680 324376 622208 1174037 2177180 3967333 7105608 12513901 +12 22 38 64 119 247 532 1123 2276 4424 8309 15295 28210 53572 107038 225653 493336 1090494 2385292 5093646 10548309 +14 12 10 19 59 159 357 700 1244 2054 3204 4777 6865 9569 12999 17274 22522 28880 36494 45519 56119 +2 14 43 115 280 632 1341 2710 5286 10076 18959 35465 66244 123814 231609 433008 806986 1494370 2740499 4962479 8852304 +16 36 82 165 307 556 1007 1841 3405 6374 12066 23034 44170 84820 163047 314653 612780 1210538 2432293 4964944 10250289 +10 8 10 20 58 188 557 1451 3382 7223 14402 27147 48738 83665 137509 216252 324578 462546 619794 766166 837338 +9 22 46 85 154 288 571 1200 2601 5616 11777 23672 45407 83249 146871 252546 431725 752582 1369644 2629419 5280540 +16 20 35 87 210 449 878 1653 3133 6129 12402 25663 53593 111897 232285 477770 971150 1946550 3840269 7447123 14183748 +22 44 94 197 405 821 1643 3250 6376 12465 24392 47913 94545 187207 371116 734593 1448530 2841203 5540681 10747619 20760527 +4 15 42 101 226 487 1024 2115 4318 8768 17778 36006 72647 145461 288069 563007 1084756 2059673 3853830 7105719 12909204 +15 23 48 115 271 611 1319 2724 5371 10107 18182 31365 52075 83527 129893 196478 289911 418351 591708 821879 1122999 +7 6 17 48 107 202 341 532 783 1102 1497 1976 2547 3218 3997 4892 5911 7062 8353 9792 11387 +-4 3 25 70 153 309 619 1270 2682 5750 12268 25628 51937 101824 193553 358902 655155 1190487 2177891 4048307 7684230 +-2 4 19 40 65 112 264 766 2210 5847 14057 30979 63235 120551 215877 364424 581237 878545 1269600 1800115 2661524 +18 30 45 58 64 58 35 -10 -82 -186 -327 -510 -740 -1022 -1361 -1762 -2230 -2770 -3387 -4086 -4872 +8 20 59 143 292 523 844 1247 1700 2138 2453 2483 2000 697 -1826 -6077 -12688 -22432 -36241 -55225 -80692 +11 12 8 -7 -28 -26 65 361 1041 2360 4662 8393 14114 22514 34423 50825 72871 101892 139412 187161 247088 +6 6 19 54 113 189 264 307 272 96 -303 -1028 -2205 -3985 -6546 -10095 -14870 -21142 -29217 -39438 -52187 +26 40 63 112 222 455 906 1708 3036 5116 8278 13187 21602 38439 76677 167925 383519 874229 1941697 4162964 8603981 +12 19 31 58 110 209 412 843 1741 3551 7128 14215 28539 58216 120779 253209 531098 1103839 2256973 4519124 8840092 +14 28 47 71 102 153 266 539 1162 2462 4957 9419 16946 29043 47712 75551 115862 172768 251339 357727 499310 +19 22 38 89 208 457 958 1941 3833 7447 14380 27796 53861 104226 200137 378978 704206 1279303 2264473 3888958 6437241 +20 38 83 177 353 665 1204 2120 3650 6152 10145 16355 25767 39683 59786 88210 127616 181274 253151 348005 471485 +18 33 52 75 103 147 258 596 1573 4137 10313 24197 53757 114135 233848 466630 914030 1767831 3387708 6439669 12137157 +16 32 61 98 136 164 171 173 281 836 2678 7743 20501 51456 125378 299753 704238 1621680 3648963 8007452 17127734 +0 9 25 62 141 293 566 1037 1844 3286 6097 12096 25583 56164 124287 271914 582905 1221701 2506400 5046590 10003946 +-4 12 56 141 280 486 772 1151 1636 2240 2976 3857 4896 6106 7500 9091 10892 12916 15176 17685 20456 From ffd47cdea7cf5eac9ecb5af9e46369b8d8ac48bd Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 9 Dec 2023 09:47:13 +0000 Subject: [PATCH 411/479] 2023: d09: ex1: add solution --- 2023/d09/ex1/ex1.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 2023/d09/ex1/ex1.py diff --git a/2023/d09/ex1/ex1.py b/2023/d09/ex1/ex1.py new file mode 100755 index 0000000..5b8c5ad --- /dev/null +++ b/2023/d09/ex1/ex1.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +import itertools +import sys + + +def solve(input: list[str]) -> int: + def parse_line(line: str) -> list[int]: + return [int(n) for n in line.split()] + + def parse(input: list[str]) -> list[list[int]]: + return [parse_line(line) for line in input] + + def extrapolate(sequence: list[int]) -> int: + diffs = [n - p for p, n in itertools.pairwise(sequence)] + if all(n == 0 for n in diffs): + return sequence[-1] + return sequence[-1] + extrapolate(diffs) + + sequences = parse(input) + + return sum(extrapolate(seq) for seq in sequences) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 7c7df880ed090cac175e74b5a4062e361ca8a32e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 9 Dec 2023 09:47:19 +0000 Subject: [PATCH 412/479] 2023: d09: ex2: add input --- 2023/d09/ex2/input | 200 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 2023/d09/ex2/input diff --git a/2023/d09/ex2/input b/2023/d09/ex2/input new file mode 100644 index 0000000..24b4351 --- /dev/null +++ b/2023/d09/ex2/input @@ -0,0 +1,200 @@ +28 38 58 115 255 558 1167 2343 4564 8699 16328 30378 56447 105549 199601 381868 735876 1418100 2712150 5115341 9472583 +24 34 56 103 191 343 593 990 1602 2520 3862 5777 8449 12101 16999 23456 31836 42558 56100 73003 93875 +12 30 66 118 187 291 486 901 1807 3760 7885 16402 33536 67001 130303 246169 451478 804146 1392500 2347766 3860393 +11 7 -1 -10 4 101 392 1052 2337 4631 8595 15584 28661 54781 109041 222274 453659 910327 1775963 3349730 6094694 +13 26 56 110 200 360 677 1347 2785 5847 12267 25493 52275 105732 211455 420013 833076 1658291 3323777 6713131 13636877 +24 36 50 68 92 124 166 220 288 372 474 596 740 908 1102 1324 1576 1860 2178 2532 2924 +4 10 18 35 81 207 523 1232 2664 5299 9766 16819 27345 42607 65306 103013 177906 352348 792280 1916515 4732055 +2 4 15 46 115 246 479 915 1841 4022 9326 21995 51143 115539 252570 534754 1099830 2205374 4328183 8346246 15873877 +6 16 41 104 240 508 1016 1959 3670 6684 11815 20246 33632 54216 84958 129677 193206 281560 402117 563812 777344 +10 24 59 127 240 410 649 969 1382 1900 2535 3299 4204 5262 6485 7885 9474 11264 13267 15495 17960 +1 3 19 65 161 334 621 1072 1753 2749 4167 6139 8825 12416 17137 23250 31057 40903 53179 68325 86833 +1 3 14 46 118 256 493 869 1431 2233 3336 4808 6724 9166 12223 15991 20573 26079 32626 40338 49346 +5 20 54 111 200 339 551 863 1338 2203 4189 9270 22068 52271 118490 254073 515553 994838 1837662 3275301 5689494 +11 19 37 74 152 315 630 1176 2019 3189 4728 6991 11599 23863 58350 151043 385257 945993 2232085 5082986 11226568 +-6 -5 -1 6 16 29 45 64 86 111 139 170 204 241 281 324 370 419 471 526 584 +19 44 79 123 175 234 299 369 443 520 599 679 759 838 915 989 1059 1124 1183 1235 1279 +20 26 41 76 144 261 459 824 1572 3189 6707 14297 30581 65483 140200 299218 633600 1324592 2722729 5487182 10824554 +2 13 49 134 316 686 1400 2714 5060 9211 16601 29879 53781 96407 171038 298877 513930 873445 1482345 2550372 4520094 +7 22 55 116 218 381 645 1090 1862 3209 5540 9533 16335 27918 47680 81409 138761 235440 396309 659706 1083288 +23 34 43 54 73 105 151 202 234 223 220 555 2284 8074 23894 62315 149406 340397 757350 1681105 3771572 +-2 9 31 72 157 346 769 1701 3724 8065 17266 36441 75513 153008 302220 580858 1085650 1973817 3493849 6028622 10154597 +17 35 83 175 326 554 878 1305 1800 2233 2292 1349 -1702 -8485 -20570 -37084 -47977 -18173 145725 659887 1980386 +6 19 49 119 273 598 1257 2530 4856 8858 15310 24963 38082 53479 66865 68818 44405 -18660 -94790 -14282 809438 +17 21 22 20 15 7 -4 -18 -35 -55 -78 -104 -133 -165 -200 -238 -279 -323 -370 -420 -473 +8 23 59 139 312 672 1383 2710 5056 9005 15371 25253 40096 61758 92583 135480 194008 272467 375995 510671 683624 +9 16 34 63 103 154 216 289 373 468 574 691 819 958 1108 1269 1441 1624 1818 2023 2239 +8 19 59 140 275 481 794 1315 2308 4381 8817 18206 37692 77458 157694 318613 640892 1287715 2591041 5226414 10560561 +8 21 37 57 82 107 117 88 -4 -163 -339 -377 54 1555 5117 12270 25264 47285 82709 137397 219034 +22 34 44 52 58 62 64 64 62 58 52 44 34 22 8 -8 -26 -46 -68 -92 -118 +28 57 114 220 416 779 1446 2651 4785 8494 14832 25483 43057 71450 116238 185052 287858 437047 647230 934638 1316054 +16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96 +28 39 48 62 97 180 347 630 1022 1413 1518 905 -557 -1064 7553 50137 189888 570667 1494764 3559032 7883557 +5 0 3 30 106 262 542 1035 1947 3728 7269 14184 27192 50614 91000 157901 264801 430224 679031 1043922 1567158 +4 21 55 119 239 461 864 1591 2913 5356 9967 18894 36631 72557 145803 294037 588486 1158435 2229571 4181885 7634411 +8 11 15 33 81 182 384 805 1728 3777 8206 17321 35023 67400 123199 213865 352632 551879 817609 1139457 1474069 +6 15 30 69 162 358 754 1560 3223 6658 13679 27799 55705 109973 214073 411584 783020 1476065 2758724 5110417 9373988 +18 26 37 54 84 138 231 382 614 954 1433 2086 2952 4074 5499 7278 9466 12122 15309 19094 23548 +3 -2 -7 -12 -17 -22 -27 -32 -37 -42 -47 -52 -57 -62 -67 -72 -77 -82 -87 -92 -97 +16 32 61 121 242 466 847 1451 2356 3652 5441 7837 10966 14966 19987 26191 33752 42856 53701 66497 81466 +13 35 79 160 302 554 1015 1865 3399 6061 10475 17470 28096 43628 65555 95551 135425 187047 252247 332684 429682 +13 6 -9 -20 11 156 538 1364 2981 5967 11279 20495 36207 62647 106658 179157 297277 487420 789503 1262734 1993315 +14 11 18 51 141 348 790 1714 3660 7803 16602 34939 71995 144184 279550 524126 950858 1671811 2854498 4743307 7687145 +2 7 22 56 123 242 437 737 1176 1793 2632 3742 5177 6996 9263 12047 15422 19467 24266 29908 36487 +19 34 68 128 220 349 519 733 993 1300 1654 2054 2498 2983 3505 4059 4639 5238 5848 6460 7064 +21 48 85 132 195 292 468 836 1684 3739 8772 20876 48964 111327 243473 510946 1029407 1994954 3728471 6738732 11810049 +11 27 55 108 210 394 696 1143 1733 2405 2997 3190 2436 -132 -5810 -16455 -34641 -63841 -108637 -174960 -270362 +12 12 12 25 90 292 791 1869 4012 8064 15537 29266 54829 103647 199701 393835 793523 1623291 3344337 6885726 14081159 +5 13 31 72 164 358 736 1410 2499 4070 6039 8076 9700 11088 15835 38309 120943 371965 1044017 2693426 6497234 +-1 -4 4 46 162 411 867 1607 2698 4206 6273 9338 14615 24985 46510 90835 178809 345728 648682 1176574 2063472 +8 16 23 40 92 216 455 847 1408 2108 2839 3374 3316 2036 -1401 -8323 -20552 -40520 -71401 -117260 -183220 +27 54 93 143 215 340 581 1059 2009 3892 7603 14833 28665 54510 101519 184641 327535 566586 956321 1576571 2541779 +18 25 37 63 114 201 333 515 746 1017 1309 1591 1818 1929 1845 1467 674 -679 -2763 -5777 -9950 +11 23 58 131 266 508 956 1834 3618 7240 14408 28142 53779 101035 188408 352630 668776 1292502 2547568 5104551 10339633 +20 30 55 112 230 464 919 1792 3444 6514 12092 22012 39486 70717 129039 244932 488666 1018738 2181538 4711697 10130222 +8 15 22 29 36 43 50 57 64 71 78 85 92 99 106 113 120 127 134 141 148 +8 17 18 5 -32 -110 -256 -510 -928 -1585 -2578 -4029 -6088 -8936 -12788 -17896 -24552 -33091 -43894 -57391 -74064 +0 6 28 73 155 304 573 1043 1826 3066 4938 7645 11413 16484 23107 31527 41972 54638 69672 87153 107071 +8 14 26 39 49 61 112 320 974 2687 6657 15139 32341 66134 131237 254984 487637 921079 1723959 3210704 5981290 +-3 6 32 88 209 468 1005 2092 4276 8669 17497 35106 69812 137381 267702 517614 995199 1904592 3626038 6854228 12829699 +16 14 18 32 52 64 53 40 180 979 3722 11247 29252 68383 147421 297965 571096 1046604 1845466 3146378 5207268 +0 19 60 146 330 708 1432 2721 4864 8205 13096 19800 28322 38142 47820 54439 52848 34663 -13020 -109250 -281238 +19 37 70 119 185 269 372 495 639 805 994 1207 1445 1709 2000 2319 2667 3045 3454 3895 4369 +8 18 30 51 92 174 350 764 1787 4310 10347 24225 54843 119816 252855 516572 1024178 1975442 3715028 6825207 12270294 +9 31 64 108 163 229 306 394 493 603 724 856 999 1153 1318 1494 1681 1879 2088 2308 2539 +27 36 46 65 110 223 504 1178 2725 6116 13214 27417 54640 104755 193632 345950 598975 1007532 1650430 2638633 4125506 +-3 -9 -19 -25 -9 63 252 660 1449 2882 5441 10155 19412 38768 80661 171586 365345 766697 1572457 3141343 6110353 +9 13 16 19 30 81 256 730 1819 4041 8188 15409 27304 46029 74412 116080 175597 258613 372024 524143 724882 +8 17 26 35 44 53 62 71 80 89 98 107 116 125 134 143 152 161 170 179 188 +13 29 69 150 300 564 1014 1770 3055 5340 9688 18482 36824 75023 152753 305660 595433 1124631 2057879 3651414 6293380 +19 39 64 101 169 299 534 929 1551 2479 3804 5629 8069 11251 15314 20409 26699 34359 43576 54549 67489 +26 48 79 119 168 226 293 369 454 548 651 763 884 1014 1153 1301 1458 1624 1799 1983 2176 +16 28 45 62 80 120 240 563 1330 3003 6482 13603 28310 59352 126262 272164 590489 1279633 2753130 5858989 12311553 +16 27 38 49 60 71 82 93 104 115 126 137 148 159 170 181 192 203 214 225 236 +16 26 52 107 212 412 806 1601 3204 6384 12578 24502 47411 91748 178785 352718 706597 1437520 2962583 6158201 12843931 +15 23 44 100 234 527 1138 2396 4995 10379 21457 43857 88008 172421 328611 608145 1092295 1904695 3227218 5318970 8537806 +19 35 67 125 219 359 555 817 1155 1579 2099 2725 3467 4335 5339 6489 7795 9267 10915 12749 14779 +14 9 -2 -25 -60 -96 -107 -38 250 1146 3714 10678 28555 72047 172745 395881 871826 1854119 3824278 7677249 15042442 +0 14 48 119 263 559 1175 2446 5004 10002 19512 37235 69743 128583 233715 418934 740144 1287614 2203656 3707527 6129775 +-6 -13 -11 9 54 127 233 409 798 1797 4331 10342 23629 51210 105348 206191 384454 682459 1149765 1826027 2697892 +14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 +9 15 23 41 93 228 528 1127 2265 4422 8622 17094 34685 71869 151157 320706 682873 1452897 3076233 6455943 13379245 +26 38 54 85 154 309 648 1354 2736 5284 9786 17637 31605 57512 107535 206117 399770 772302 1467138 2718337 4891512 +7 2 -4 -11 -19 -28 -38 -49 -61 -74 -88 -103 -119 -136 -154 -173 -193 -214 -236 -259 -283 +17 40 72 120 202 355 665 1340 2867 6327 14000 30508 64985 135242 275772 552897 1092529 2128842 4085140 7700052 14210216 +-3 -4 -7 -12 -19 -28 -39 -52 -67 -84 -103 -124 -147 -172 -199 -228 -259 -292 -327 -364 -403 +9 21 38 62 99 161 268 450 749 1221 1938 2990 4487 6561 9368 13090 17937 24149 31998 41790 53867 +2 9 39 99 204 393 760 1519 3132 6545 13600 27720 54996 105835 197349 356668 625334 1064865 1763453 2843561 4469892 +20 33 49 75 125 228 457 1004 2337 5480 12453 26893 54846 105671 192927 335020 555266 880875 1340177 1957191 2742379 +18 21 16 6 5 57 270 860 2190 4774 9202 15936 24945 35235 44593 50493 54394 73951 171296 510662 1464845 +10 11 18 38 71 100 71 -142 -790 -2316 -5409 -10945 -19511 -29701 -33227 -2480 138638 579164 1757487 4641596 11293649 +25 33 43 67 138 323 742 1611 3346 6797 13731 27756 55976 111792 219447 421300 789851 1449309 2618271 4700169 8479106 +27 42 62 88 120 169 286 615 1492 3635 8492 18826 39628 79522 153115 285551 522357 951296 1749478 3279940 6279276 +-1 11 47 125 280 574 1106 2022 3525 5885 9449 14651 22022 32200 45940 64124 87771 118047 156275 203945 262724 +13 21 51 115 225 393 631 951 1365 1885 2523 3291 4201 5265 6495 7903 9501 11301 13315 15555 18033 +20 35 53 83 140 245 425 713 1148 1775 2645 3815 5348 7313 9785 12845 16580 21083 26453 32795 40220 +10 26 63 132 248 429 694 1074 1663 2751 5098 10427 22235 47044 96239 188667 354200 638496 1109225 1864062 3040786 +6 -1 -9 -15 -17 -13 13 141 635 2188 6391 16606 39556 88146 186315 377108 735668 1389501 2549183 4553679 7935653 +9 15 43 117 265 514 885 1388 2017 2745 3519 4255 4833 5092 4825 3774 1625 -1997 -7533 -15495 -26471 +7 22 41 65 106 207 489 1245 3117 7431 16845 36609 76972 157632 315649 618971 1188707 2234572 4109585 7392185 13006510 +10 9 5 -1 3 51 224 700 1840 4321 9327 18809 35825 64971 112914 189038 306214 481705 738217 1105107 1619759 +12 16 30 69 148 282 486 775 1164 1668 2302 3081 4020 5134 6438 7947 9676 11640 13854 16333 19092 +1 0 10 42 98 172 270 462 979 2368 5718 12970 27324 53756 99658 175614 296325 481696 758098 1159818 1730710 +8 19 38 73 142 283 562 1079 1973 3430 5708 9217 14739 23954 40566 72513 136014 262573 510546 983505 1858428 +9 24 57 114 205 359 643 1184 2197 4026 7209 12582 21441 35785 58667 94684 150641 236428 366153 559578 843909 +8 14 22 32 44 58 74 92 112 134 158 184 212 242 274 308 344 382 422 464 508 +24 34 44 54 64 74 84 94 104 114 124 134 144 154 164 174 184 194 204 214 224 +16 30 63 126 233 405 686 1187 2184 4316 8979 19130 40965 87415 185254 389023 807192 1649322 3307839 6494862 12463897 +-7 -7 1 32 121 335 787 1666 3321 6479 12739 25563 52073 106047 212569 414805 783321 1428197 2513885 4276266 7040633 +-2 1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 +13 27 38 41 36 48 177 688 2156 5707 13455 29337 60698 121182 235783 449463 842011 1554867 2842648 5177133 9461476 +15 42 93 182 326 549 884 1374 2086 3178 5119 9300 19562 45721 111199 268798 632393 1439844 3177921 6832092 14389654 +7 28 73 151 265 408 559 679 707 556 109 -785 -2315 -4712 -8253 -13265 -20129 -29284 -41231 -56537 -75839 +8 5 13 42 97 177 284 446 766 1532 3473 8340 20149 47680 109278 241921 518597 1082840 2220086 4508651 9140126 +17 27 40 71 149 317 632 1165 2001 3239 4992 7387 10565 14681 19904 26417 34417 44115 55736 69519 85717 +24 37 47 65 117 257 594 1347 2963 6367 13474 28217 58615 120994 248715 510261 1046343 2144574 4386122 8926186 18016274 +11 16 36 80 158 277 445 706 1254 2711 6703 16929 40991 93338 199774 404089 777493 1431666 2536382 4342822 7213860 +0 -2 8 48 141 321 657 1303 2580 5096 9915 18799 34571 61685 107144 181982 303624 499562 812938 1310810 2096097 +4 15 39 91 211 473 995 1967 3741 7078 13740 27774 58093 123376 261026 543285 1106377 2204300 4310572 8314176 15899538 +-7 6 36 87 163 272 446 788 1568 3411 7651 16966 36460 75419 150039 287505 531891 952452 1654990 2797097 4608209 +13 29 56 95 152 244 405 692 1191 2023 3350 5381 8378 12662 18619 26706 37457 51489 69508 92315 120812 +15 27 59 125 237 417 722 1283 2361 4428 8300 15415 28528 53504 103742 210470 445527 969865 2133765 4678765 10135083 +20 31 57 122 274 596 1223 2377 4439 8101 14695 26909 50338 96812 191434 387177 794467 1639641 3377468 6902112 13932807 +10 37 91 200 416 820 1528 2716 4696 8091 14175 25464 46666 86122 157896 284700 501870 862641 1445003 2360456 3765020 +6 24 54 95 153 251 440 812 1516 2778 4926 8421 13895 22197 34448 52106 77042 111628 158838 222363 306741 +9 24 49 84 125 162 193 281 693 2172 6405 16762 39393 84782 169869 320863 576881 994560 1653801 2664816 4176661 +3 10 23 57 149 386 945 2142 4499 8866 16685 30566 55492 101260 187366 352765 675303 1309938 2562335 5026719 9836291 +15 29 55 109 226 481 1024 2134 4299 8344 15672 28779 52397 95981 178896 340733 660899 1294259 2533505 4914517 9388784 +14 33 78 166 331 644 1248 2423 4711 9165 17861 34963 68917 136884 273538 548338 1099300 2198986 4383250 8701159 17195603 +7 5 5 7 11 17 25 35 47 61 77 95 115 137 161 187 215 245 277 311 347 +0 2 9 21 38 60 87 119 156 198 245 297 354 416 483 555 632 714 801 893 990 +8 11 29 79 200 478 1087 2365 4957 10076 19965 38689 73433 136495 248086 439830 758518 1269449 2059289 3241351 4974534 +9 26 71 154 282 459 686 961 1279 1632 2009 2396 2776 3129 3432 3659 3781 3766 3579 3182 2534 +-8 -9 -1 23 70 147 261 419 628 895 1227 1631 2114 2683 3345 4107 4976 5959 7063 8295 9662 +14 38 88 183 349 621 1047 1694 2656 4064 6098 9001 13095 18799 26649 37320 51650 70666 95612 127979 169537 +1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61 +10 17 33 71 156 319 593 1016 1655 2681 4550 8393 16823 35591 76964 166498 356232 749489 1545759 3118955 6149158 +-2 5 20 55 147 378 896 1945 3924 7507 13868 25067 44665 78648 136752 234293 394618 652305 1057252 1679807 2617103 +-2 -3 -3 12 76 250 640 1443 3044 6202 12405 24581 48599 96524 193673 393656 809674 1677915 3482413 7194006 14714566 +-5 -2 2 11 40 131 388 1045 2594 6015 13162 27362 54272 103007 187497 327953 552225 896728 1406510 2133961 3135644 +-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 +6 23 51 90 140 201 273 356 450 555 671 798 936 1085 1245 1416 1598 1791 1995 2210 2436 +22 44 78 135 237 421 758 1410 2772 5783 12540 27421 59046 123639 250801 493519 945638 1772306 3262446 5917591 10599023 +24 37 60 106 197 375 727 1435 2867 5730 11311 21837 40990 74618 131688 225532 375442 608675 962934 1489396 2256363 +12 20 49 112 222 392 635 964 1392 1932 2597 3400 4354 5472 6767 8252 9940 11844 13977 16352 18982 +2 7 24 61 126 227 372 569 826 1151 1552 2037 2614 3291 4076 4977 6002 7159 8456 9901 11502 +12 11 22 60 158 379 821 1618 2953 5122 8728 15159 27666 53731 110255 234858 510014 1112985 2415218 5172306 10872818 +17 24 49 120 294 677 1456 2952 5715 10719 19792 36560 68444 130715 254454 501802 994701 1968430 3870295 7539464 14530122 +25 40 65 122 253 535 1117 2293 4630 9184 17861 34010 63355 115342 204806 353380 588983 939636 1414390 1959381 2372399 +25 52 90 138 195 260 332 410 493 580 670 762 855 948 1040 1130 1217 1300 1378 1450 1515 +0 2 24 87 221 468 885 1547 2550 4014 6086 8943 12795 17888 24507 32979 43676 57018 73476 93575 117897 +19 32 61 117 214 369 603 947 1457 2242 3509 5629 9228 15307 25395 41739 67535 107204 166717 253973 379234 +23 32 38 44 60 103 197 373 669 1130 1808 2762 4058 5769 7975 10763 14227 18468 23594 29720 36968 +4 11 19 35 76 180 439 1069 2539 5797 12662 26510 53500 104832 201057 380617 717363 1357502 2598934 5062820 10063437 +10 19 23 14 -24 -121 -314 -610 -897 -761 888 6598 22021 59353 144459 331532 733040 1580211 3343069 6963206 14293206 +3 17 48 105 201 354 600 1028 1847 3495 6800 13203 25053 45984 81384 138966 229451 367373 572016 868493 1288977 +-4 -3 10 49 132 289 583 1147 2252 4449 8873 17855 36050 72341 142802 274973 513588 927669 1618516 2727541 4442064 +19 39 74 133 236 422 765 1415 2696 5313 10758 22099 45557 93732 192181 392487 797276 1606233 3197558 6267150 12058959 +-7 -10 -13 -16 -19 -22 -25 -28 -31 -34 -37 -40 -43 -46 -49 -52 -55 -58 -61 -64 -67 +21 44 74 122 221 432 849 1603 2865 4848 7808 12044 17897 25748 36015 49149 65629 85956 110646 140222 175205 +18 26 39 66 116 198 321 494 726 1026 1403 1866 2424 3086 3861 4758 5786 6954 8271 9746 11388 +21 40 78 164 356 766 1605 3259 6420 12322 23187 43106 79841 148586 279840 535679 1042583 2055644 4079972 8092520 15934162 +20 37 62 95 136 185 242 307 380 461 550 647 752 865 986 1115 1252 1397 1550 1711 1880 +0 2 15 48 121 283 642 1407 2942 5832 10961 19602 33519 55081 87388 134409 201132 293726 419715 588164 809877 +8 13 15 13 15 42 131 338 755 1592 3455 8105 20256 51423 127543 303162 686530 1482119 3060047 6065853 11589253 +12 30 59 93 125 157 214 361 722 1498 2987 5640 10262 18599 34737 67942 137708 281702 566759 1101727 2048287 +-3 10 49 127 264 492 863 1464 2440 4028 6633 11078 19417 37246 79490 183510 436575 1030078 2361565 5219525 11107638 +16 33 54 90 174 378 846 1849 3867 7702 14625 26559 46299 77769 126315 199032 305122 456279 667096 955488 1343124 +19 43 88 176 343 647 1194 2198 4111 7897 15598 31482 64323 131829 269087 544536 1090317 2160903 4249054 8320480 16296305 +22 41 67 112 212 447 969 2039 4084 7808 14445 26357 48398 90840 175255 345646 688410 1366499 2675535 5132758 9613680 +12 25 47 89 162 277 445 677 984 1377 1867 2465 3182 4029 5017 6157 7460 8937 10599 12457 14522 +5 0 -7 -1 49 197 534 1225 2596 5304 10634 21018 41034 79540 154415 302881 602927 1215420 2462671 4968277 9895903 +-9 -14 -15 1 65 237 627 1430 2974 5775 10594 18507 31038 50464 80459 127293 201992 324897 538038 942790 1811370 +2 4 0 -10 -11 41 233 709 1684 3458 6430 11112 18143 28303 42527 61919 87766 121552 164972 219946 288633 +7 26 67 150 317 656 1342 2714 5434 10819 21508 42739 84695 166680 324376 622208 1174037 2177180 3967333 7105608 12513901 +12 22 38 64 119 247 532 1123 2276 4424 8309 15295 28210 53572 107038 225653 493336 1090494 2385292 5093646 10548309 +14 12 10 19 59 159 357 700 1244 2054 3204 4777 6865 9569 12999 17274 22522 28880 36494 45519 56119 +2 14 43 115 280 632 1341 2710 5286 10076 18959 35465 66244 123814 231609 433008 806986 1494370 2740499 4962479 8852304 +16 36 82 165 307 556 1007 1841 3405 6374 12066 23034 44170 84820 163047 314653 612780 1210538 2432293 4964944 10250289 +10 8 10 20 58 188 557 1451 3382 7223 14402 27147 48738 83665 137509 216252 324578 462546 619794 766166 837338 +9 22 46 85 154 288 571 1200 2601 5616 11777 23672 45407 83249 146871 252546 431725 752582 1369644 2629419 5280540 +16 20 35 87 210 449 878 1653 3133 6129 12402 25663 53593 111897 232285 477770 971150 1946550 3840269 7447123 14183748 +22 44 94 197 405 821 1643 3250 6376 12465 24392 47913 94545 187207 371116 734593 1448530 2841203 5540681 10747619 20760527 +4 15 42 101 226 487 1024 2115 4318 8768 17778 36006 72647 145461 288069 563007 1084756 2059673 3853830 7105719 12909204 +15 23 48 115 271 611 1319 2724 5371 10107 18182 31365 52075 83527 129893 196478 289911 418351 591708 821879 1122999 +7 6 17 48 107 202 341 532 783 1102 1497 1976 2547 3218 3997 4892 5911 7062 8353 9792 11387 +-4 3 25 70 153 309 619 1270 2682 5750 12268 25628 51937 101824 193553 358902 655155 1190487 2177891 4048307 7684230 +-2 4 19 40 65 112 264 766 2210 5847 14057 30979 63235 120551 215877 364424 581237 878545 1269600 1800115 2661524 +18 30 45 58 64 58 35 -10 -82 -186 -327 -510 -740 -1022 -1361 -1762 -2230 -2770 -3387 -4086 -4872 +8 20 59 143 292 523 844 1247 1700 2138 2453 2483 2000 697 -1826 -6077 -12688 -22432 -36241 -55225 -80692 +11 12 8 -7 -28 -26 65 361 1041 2360 4662 8393 14114 22514 34423 50825 72871 101892 139412 187161 247088 +6 6 19 54 113 189 264 307 272 96 -303 -1028 -2205 -3985 -6546 -10095 -14870 -21142 -29217 -39438 -52187 +26 40 63 112 222 455 906 1708 3036 5116 8278 13187 21602 38439 76677 167925 383519 874229 1941697 4162964 8603981 +12 19 31 58 110 209 412 843 1741 3551 7128 14215 28539 58216 120779 253209 531098 1103839 2256973 4519124 8840092 +14 28 47 71 102 153 266 539 1162 2462 4957 9419 16946 29043 47712 75551 115862 172768 251339 357727 499310 +19 22 38 89 208 457 958 1941 3833 7447 14380 27796 53861 104226 200137 378978 704206 1279303 2264473 3888958 6437241 +20 38 83 177 353 665 1204 2120 3650 6152 10145 16355 25767 39683 59786 88210 127616 181274 253151 348005 471485 +18 33 52 75 103 147 258 596 1573 4137 10313 24197 53757 114135 233848 466630 914030 1767831 3387708 6439669 12137157 +16 32 61 98 136 164 171 173 281 836 2678 7743 20501 51456 125378 299753 704238 1621680 3648963 8007452 17127734 +0 9 25 62 141 293 566 1037 1844 3286 6097 12096 25583 56164 124287 271914 582905 1221701 2506400 5046590 10003946 +-4 12 56 141 280 486 772 1151 1636 2240 2976 3857 4896 6106 7500 9091 10892 12916 15176 17685 20456 From bc41afab0f7a592fc81117135c8572f53742a4b4 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 9 Dec 2023 09:47:24 +0000 Subject: [PATCH 413/479] 2023: d09: ex2: add solution --- 2023/d09/ex2/ex2.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100755 2023/d09/ex2/ex2.py diff --git a/2023/d09/ex2/ex2.py b/2023/d09/ex2/ex2.py new file mode 100755 index 0000000..122bc46 --- /dev/null +++ b/2023/d09/ex2/ex2.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +import itertools +import sys + + +def solve(input: list[str]) -> int: + def parse_line(line: str) -> list[int]: + return [int(n) for n in line.split()] + + def parse(input: list[str]) -> list[list[int]]: + return [parse_line(line) for line in input] + + def extrapolate(sequence: list[int]) -> int: + diffs = [n - p for p, n in itertools.pairwise(sequence)] + if all(n == 0 for n in diffs): + return sequence[-1] + return sequence[-1] + extrapolate(diffs) + + sequences = parse(input) + + return sum(extrapolate(seq[::-1]) for seq in sequences) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 974524b1f1ceeac5c3febf9418f37616e021d29a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 10 Dec 2023 12:48:03 +0000 Subject: [PATCH 414/479] 2023: d10: ex1: add input --- 2023/d10/ex1/input | 140 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 2023/d10/ex1/input diff --git a/2023/d10/ex1/input b/2023/d10/ex1/input new file mode 100644 index 0000000..e1a4432 --- /dev/null +++ b/2023/d10/ex1/input @@ -0,0 +1,140 @@ +F-L----F7-7.F-7JJ.F--L-.F|F77.L|7.FLF-7.JJ--7FF-F-F7F7.7-F-7.L.FL7F|7--777.FJ-|7J-F-J-77-FF-F-7.JF77.L.JFL.L-|-FF7-77FL--F77.7-|77F7|7FF7-7- +J|F7.LL|.F7.FL|J-77--JJ7L|-|-F-7L7-|LJ|F|JL|L-JJ|L|--7FF77.|-L7|LFLF-7FL--LL.FLJL-JFF-F7.-LJLF|J-LJ|FJ.|7-7L-JF|.J.LF7|L7.LF-|7F7-|-7-J7|7.| +FF7J.7L|-7|FF7|L7|L|.LF7-JFLJJ.J7JJFJ-7.L-LLJJ|LJ7LL|.JLL---.LFJ7L-LJL-|JJ-|-F.LJ7|FLF-J.L7.FJ||F||L|L7--F..FLF7-L7|LLJ7L7.-7||||J|FJ.LLJ7F- +FJ.LF-7-FJLJ-|7-7J777..|-FJ7.FJ.|.F|LFL-L7L|..--L|7.F-7-L|..FF|JF|7J.|7|FF-|.LF7LL77.J.LJL|7LF-77.|FFJ|7FLJF|-F7..FJF7L7.FJF7LJ||--|JJLLJF.J +|FF7LFL7LJJL|.|.||L77--|7F---L.F|77JFL7.F|7FL7.F7LJ-7-JJLJ.--JLJFJ77F|7F|-.|L-LJ7-LJ7FJ7.|J|-F-J|FL7|-L-J7|-.L7JJ-L||L-|7J.LF7FLL-|||.FF-7J. +FFJ-7LL7JF-.LL|-L--||.F|FL7J..LLJ|J.J.FF7L||JFJLL.J-J7LF7J77.7.||.F-FJ-|J.77.F-LLJJ|L-7|L---7JFL-7FJ-7FFL|7FLFJ|L|F-JL|.|.|-J7-LL-FL-.FFLJJ7 +LL7.L--|7LJ7J.7|FL7.F77FF..-|7-L-|F7.L7JLFJ|LL|.LF-FLL7LLL-|7|F7F-7-J.FL-F|-J77-|.F-.L-J.L|||F|JLJJ7FJF7|J|7FL77FL|.|L|J7FF-L--..L|.F-77JL7- +|LF-7L.|FLLJ.LJ7-7FJL--FJ7L.7J.|JL|J-7|F7-.J7L|L-L77J|L7..FJF7LF77|J-.L--.-7L-F7F-J.F-|J|.FL7-7-F|JF.FL|---J-FFJF|.F|7F-FF.FL7--..J.|LL---JJ +|.--7.F|F7.J-LLJJLFJ.|.|-||-|LF77-7|FF||||7.JFFJF-J7|.F7FFF7||FJ|7|.|.|.L-FJFLJL|7|F|.L7.L|L|.-.LJF|F7|..FFJ-LJF.JJ7L||LLJ7---JLL-|7LFF7-7.| +F-LJJF-FJ-|..||L.JJ|-77|LF-F77F-7|LF7-L--7-|.FJ-JJ-JFF|L--J||LJFJJ-F-FJ.|FJFJJ..L7.|.F7J--L.|7.JJ.--7L7JF7L|J|FF7.LF7LJ-|||.|L-JL7-7-FJ-FJ-7 +FJ||FF7-J|L|-LF7LF7J7F7F7|FJ|FJFJJ--J|L|7LL|7LL-77J7FFL7F-7LJF7L7J.7-|.-F7|||-F|-FFF-J|J.F|7F-7.|FL-J-LJ-|7LFF7||7-|L7-F77-LJ|.FFLJL-|L|L|.. +J.LJ-|LL-77F7.||-J|F-JL|L7L7|L7|.|-|FF-F..LJ|.LL|-F7-F7LJFJF7|L-JLFF.L-|JF7F7F7JJF7L7FJF7JLF|FJ777.|.7.|F77-FJLJ|F7L7|.||..JJFLJ77F7|F-J.|-7 +|77JFL77L|-J|--|7F-||LFL7|F||-|L77--F7J|7L.F-|J|LFJ|||L7JL7||L7F7F7J|..L||LJL-7F-JL7|L7||7-FJL-777.F.F-7||F7L7F-J|||||FJL777FL-L---.JJ|LJ.L| +7JL--7.|.|77L7.F7-FF7FF-JL7||-L7|F7.||.77L|--7FF7L7L7|FJ77LJ|FJ|LJ|7|FF7-L-7F-JL--7||FJ||F7|F--JF--77L7LJ||L7|L7FJL-J||F-J||J.77F|.|-|7FL.FF +.F7F7F7JF.F--7-L7.F||7L--7LJL--J|||-||FF7F7JFF7||.L7||L-77F-JL-JF7|F7FJ|7|FJ|F7F--JLJL7||||||F7||F-JF7|F-JL7|L7||F---J||||7|-J-L-|7L7F-|77F- +FL||-L7F|7JL7J77F7FJL7F-7L-7F---J|L7||FJ|||7FJ|||7-|||F7L7L-7F-7|LJ||L7L-7L7|||L--7F--J||||||||-|L-7|||L-7.||FJ||L--7FJL-7L7LL|J.|J-LJ||LJJ. +|JLF-.LL|-J|L7FF||L7FJ|FJJFJL7FF7|FJ||L7||L7L7||L-7||||L-J|FJL7LJ|L|L7|F-J|||||F7.|L7F7|||LJLJL7L7FJ||L7FJFJ|L7LJF--J|F--J7J..F7FL.|-LFFJ|F7 +.|7||.L|J.FL7FF-JL7|L7||F7L7FJFJ|||F||.|||FJFJ|L-7||||L7F7FJF7L-7F7L7LJ|F7FJLJ|||FJFJ||||L-7F--JFJL7|L7|L7L7|FL7FJ-F7||-LF7JFFJL7LJ77F7-.||7 +L7FFL7-|-J--7-L--7|L7||||L-J|FJFJ|L7||FJLJL7L7L7FJLJ||FJ||L7|L7FJ|||L-7|||L--7|||L7|FJ|||F7||F-7L-7LJFJ|FJFJL-7||F7|||L-7||77L7JJL|-FJJ-77JL +L7LLJJ.JFLL7JFF--JL7|LJ|L--7||FJFJFJ||L7F--J|L7|L--7|||FJ|FJL7||FJ|F7-||||FF-J|||L||L7||||||||FJ|FJF-JFJL7L--7LJLJLJLJF-J||LFFJ.7JL.|L|.|F.| +F|.|--F7|-FJ7L|F--7LJF-J.F7|LJL7L7|FJL-J|F7FF7||7F-J|||L7LJF-JLJL7||L7|LJL7L-7LJL-JL-J|||||||||F7L7L-7|F7L7F7|F------7L--JL-7|--7F|FJ.|FJ|7. +7F-7-JLJLF-7LLLJF-JF7L7-FJ|L7F-JFJLJF---J|L7|||L7L-7LJL7|F7L7-F--J|L7||F--JJ|L----7F--J|||||LJLJ|LL7FJLJL7||||L77F7F7L------JJ7LL777|-F7||7F +|FJJ..LL-7|||FF7L-7|L7L7L7|||L-7L7F7|7F7.L7||LJFJF7|F--JLJL7L7L--7|FJ||L7F-77F7.F7|L-7FJLJLJF---JF7||F7F-J|||L7|FJLJL7F7F-7||-F7L--77LJLJJ7| +LL.F-|7JJ.J-FFJL-7LJFL7|FJ|FJF-J.|||L7|L7FJ||F-JFJLJL7F7F7F|FJF7FJ|L7LJFJL7|FJL7|||F-JL---7FJ-F7-||||||L-7|||FJLJF--7LJLJFJF7FJL77FLL-JLL7|L +|FJ|LJ|L-F-LFL7F7L-7F7||L7||FJJF7LJL7||FJL7||L-7L--7FJ||||FJL7|||FJL|F-JF-J|L-7LJ||L7F7F7|||F7|L7|||LJ|F7|||||F--JF7L----JFJ||F-J-|7JJ|-|JJJ +JJ-J-JJF-7|L|-LJ|F7LJLJL-JLJ|F7|L7F7|LJ|F-J||F-JF7F||.|||||F-J||||F-JL-7L-7L-7L7FJ|FJ|LJ|FJ||||FJ||L7FJ|||||S|L---J|F7F7F7|FJ||F7JJF-L|-|L77 +JLF-7..|7||F|JF-J||F7F7F-7F7LJ|L7||||F-JL-7|||F7||FJ|FJ||LJ|F7||||L7F-7|F7|F7|FJ|FJL7L-7LJFJ|||L7|L-J|FJ||||LJF----J|||LJ||L7||||FF777|F7FFJ +FL|F7-|FJ-L-L.L--JLJ||LJ|LJL7FJFJ||LJL7JF7|LJ|||||L7||FJL-7|||||||FJL7LJ||LJ||L7|L7FJF7L-7|FJLJFJL--7|L7||||F-J7F--7|||F-JL7||LJ|FJ|.|7JL-JJ +|.-|J.L-J|FJ|7|LF--7LJF-----JL7L7|L-7FJFJ|L-7||||L-JLJL-7FJLJLJLJLJF-JF7|L7FJL7||FJL7||FFJ|L-7FJF7LFJL7||||||F--JF-J|||L7F7|LJF-J|FJF77J||.. +F-LL--.FL-7.|J-FL-7L--JF-----7L-J|F-JL7|FJF-J|||L--7F---JL--7F----7|F7||L7|L-7|||L-7LJL7L7|F7|L7||FJF7||||||||F--JF7||L7LJ||F7L7FJ|FJL7.J7FF +777F7F-J-|.LF7--JFJF7F-JLF--7L-7FJL-7FJ|L7L7FJ||-F-JL7LF7F7JLJF7JFJLJ||L7||F7|LJL-7L--7L7||||L7LJLJFJLJ|||LJLJ|F7-||||FJF-J||L-JL7||F-J7FLJ. +J--L7F.J.7FL||FFFL7|||F-7L-7L--JL--7|L7|FJFJ|FJL7L--7L7|LJ|F7FJL7L7F-JL7LJ|||L-7F-JF-7L7||LJ|LL7F--J||FJLJF7F-J|L7||||L7L--J|F--7|LJL--77.L7 +F--LLLL7LL7LF7F7F7LJLJL7L-7L----7F-J|FJ||FJFJ|F-JF7-L7|L7FJ|||F-JFJ|F-7L7FJ||F7||F7L7||||L-7|F7||F7F7FJF--JLJ-FJFJ||||FJF---JL7FJ|F-7F7L-77J +J|-7.|J|FJ-FJLJ|||F--7LL-7L-----JL--JL7|LJFJ7|L-7||F7||FJL7|||L7FJFJL7L7||FJ|||||||FJ|FJL7FJ||LJ||||LJFJLF-7F7L7|L|LJLJFJF--7FJL-J|-LJ|F-J77 +LL-F-JF|L.FL-7FJ||L7FJF7FJF--7F7F--7F-JL7FJF7L7FJ||||||L7FJ|||FJ|FJF7L7|||L7|||||||L7||F-JL7|L7FJ|||F-JF7|FJ||J||FJF7F7L-JF7LJF7F7L--7LJFJLJ +7JLJL-FJJ|7F7||FJ|FJ|FJ|L-JF-J|LJF7||F-7|L7|L7|L-J|||||FJ|FJLJ|FJL7|L7|||L7|||LJ||L7|||L7F7|L7|L-J|||F7|LJL-JL7|LJFJLJL-7FJL7FJ|||F-7L777-J. +|..L7LJ.LF-JLJ|L7|L7|L7|F7FL--J-FJLJLJ7||FJL7|L--7LJ||LJJ||F--JL-7|L7LJ|L7|||L7FJ|FJ|LJL||LJFJ|F--J|||||F-----J|F-JF7FF7|L-7LJFLJ|L7L7L77-7J +7.77||.F||F7F7L-J|FJL7||||F7F--7L-----7||L7FJ|F-7|F7|L--7||L7F7F7|L7|F-JFJ||L7|L7|L7L-7FJ|.FJFJL7F7|||LJL7F--7FJL-7||FJ||F7L----7|FJ-L7|JFF. +|..FF7.F-LJLJL--7LJF-J||||||L-7|F7F---JLJFJ|FJ|.LJ|LJF7FJLJJLJ|||L7||L-7L7||-LJ|||FJF7|L7L7|FJF-J||||L7F7LJF7LJF-7LJLJFJ||L-7F7FJLJ|FFLJFJ.. +|.F7L|-J-|LF----JF7L-7||||||F7||||L-----7L-JL7L-7-L7FJ|L---7F-J|L7||L7FJFJ|L-7F-J|L7|||FJFJ||.|F7|||L-J||F-J|F7L7|F-7FJ|LJF7LJLJJLL7F-7LJ-FJ +JJ.|7L7LFJ-L-----JL-7||||LJ||||LJL---7F7|F---JF-JF7|L7|F7F7|L-7|FJ|L-J|FJFJF7||F7L7||||L7|-LJFJ|LJ||F--JLJF7LJ|FJ||-LJF7F7|L--7F7-7L7J-7L.7. +||F||-J7LL7|JF------JLJLJF7LJLJF7F--7LJLJ|F7F7|F-JLJFJ||||LJF-J|L7L-7JLJ.L7|||||L7|||||FJL--7L-JF-J|L-----JL-7||7|L---JLJLJF--J||.L7|JF|FF-J +.-J-F.L|7FJ-FL-7F--7F---7|L-7F-JLJF-JF7F7LJ||||L7F-7|L|||L-7L-7|L|F7L--7F7||||||FJ|||||L7F7FJF-7L-7|F------7FJ|L7L---------JF7FJL7|LLJF.JJ|. +FLL7|FFL77JJF-7LJF-J|F--J|F7||F--7L-7|LJ|F7LJLJLLJFJL7LJL7FJ|FJ|FJ||F-7LJ|||||||L7|||||FJ||L7L7L--J|L7F7F7-LJ|L-JF-7F7F-----J||F-J7.|.|.|..F +FJ|L--J7LFJ-L7|F7L--JL-7FJ|LJ|L-7L--JL-7LJL7F-77F7|F-JF7J||7FJFJ|FJ|L7|F-J||||||FJ||||||FJL7|-L---7|FJ|LJL-7|F7F7|FJ|LJF-----J|L---7FL7F-F7| +|-JJJ7|7F|FF-JLJL------JL7L7FJF7L---7F7|F--J|FJFJLJL--J|FJL7L7|J|||L7||L-7||LJLJL-JLJ||||7JLJF7F-7LJ|FJF7F7L-JLJLJL-JF-J.F7F7.|F---J7.LJ7|FL +L7|.LLL7-||L7F7F---------J.LJFJL--7FJ||||F7FJL7L7F-7F7FJL7FJ|LJFJL7FJ||F7||L--7F--7F-J||L7F--JLJFJF7||FJLJL7F7F7F-7F7L---JLJL-JL--7|F77|--.J +.FJF7JLJ.FF-J||L7F-7F7F7F7F7FJF--7|L-JLJLJLJF7L7|L7||||F-JL---7|F7|L7|LJLJ|F--JL-7LJF7||FJL-7F-7|FJ|LJL---7LJLJLJL||L7F--7F7F-7F7FJFJL7|J|7. +|J-L-77.F|L-7||FJL7|||||||||L-J|FJL-7F-7F7F7||FJL-JLJ|||F7F7F-J||||FJL-7F-J|F7LF-JF7|||LJF--J|-||L7||F----JF-----7||7|L-7||||J|||L-JF-J7F|FL +|.F7LJ|7L||LLJLJF-JLJLJLJLJL7LF7L--7|L7LJ|||||L-----7||LJ|||L-7LJ||L-7FJL-7LJL7L7FJ||LJF-JF--JFJ|FJL7L-----JF----JLJFJF7||||L7LJ|F-7L--7-L-. +.F7JJ---JL7|F---JF---------7|FJ|7F-JL-JF7LJLJ|F-7F--JLJF-J||F7|F-J|F-JL--7L7F-JFJ|FJL7FL7FJJF7L7|L-7L7F7F---J|F7F-7|L-JLJ||L7|F-JL7L7F7|J7-- +LLJ-F7JL|FF-JF---JF--------JLJFJFJF7F7FJL7F-7|L7|L---7-L-7|||LJ|F7|L7F7F7L7|L-7L-JL7FJF7LJF-J|FJL--JFJ||L----7|||FJF7F--7LJ7LJ|F7FJFJ|LJLJ.L +J7|F-F--JFL--JFF-7L----------7|JL-JLJ|L7FJL7|L-JL----JF-7|||L-7||||FJ|||L7||F7|F---JL7||F-JF7LJF-7F7L-JL--7F-J|LJL-JLJF7L----7LJ|L7L-JJ-FJF. +LFF7JJ.F7FFF7F7L7L----------7||F-7.F7L-JL-7|L------7F7|FJLJ|F-JLJ||L7||L7||||LJL7F-7FJ||L--JL7FJFJ||F7F7F7LJF-JF------JL-7F--JJLL-JJL|-77-77 +LL|JLF-F-7FJLJL-JF-----7F7F7LJ|L7L-JL----7LJF------J|LJL-7FJL-7F7LJFJ||FJ|||L7F-J|FJ|FJL7F7F7LJFJFJLJ||||L--JF7L-----7F-7|L---7-L7|.-.FLJLJJ +--777L7L7||F-7F--JF7JF7LJLJL-7|FJF-----7FL-7L---7F7||F-7FJL-7FJ|L7FJFJ||FJ||FJL--JL-J|F7LJ|||F7L-JF7JLJLJF---JL---7F7LJFJL-7F7|FL|7FJ7F|77|7 +LLF-J|LFJLJ|FJL7F-JL7|L-7FF7||LJFJLF---JF77L-7F7LJL-JL7||F--JL7|FJL7|FJ|L7|LJF7F7F7F7LJL-7LJLJ|F7FJL-----JF------7LJ|F-JF7-LJLJ-7.|JF7J.L7|| +F.|7FFJL---JL--JL7F-JL-7|FJL-JF7|F7L-77FJL--7||L--7F7FJLJL7F-7LJL-7||L7|FJ|F-JLJLJLJ|F--7|F7F7LJ|L--------JF7F7F7L-7|L--JL--7J-LJ7LLJ||-J.|7 +777|7..FF---7F---JL7F--JLJF7F7||||L-7L-JF7F-JLJF77LJLJF7F7||7|F7F7|||FJ||FJL7F----7FJL-7|LJLJL-7|F--7-F----JLJLJL--J|F-----7|-F-LF7FLL-JF-JJ +L-|J-L-FL--7|L----7LJF--7FJ||||LJL-7L---JLJ|F7J|L-----JLJ|LJFJ|||LJ|||FJLJJ-LJF---J|F7FJL------JLJF7L-JF-------7F7F7|L----7LJ7|--.|-...--7.F +FLF.FLF7|F7|L7F7F-JF-JF-J||LJLJF---JF7F7F---JL-JF-7F-----JF-JFJ|L-7||LJJJ.LFJFJF--7LJLJF7F7F-7F7F7|L7F-JF---7F7LJLJ||F7F7FJF-7--FF|LF|77FF-- +J|L-7-|L7||L7|||L--JF-JF7|F7-F7L----JLJLJF--7F7FJFJL--7F-7L-7L7|F7|||JJ|L7-F7L7|F-JF--7|||||FJ|||||FJ|F7L--7LJ|F---JLJLJ|L-JFJLF-F|7FJLFJ-J. +FFFL7-L7LJ|FJLJL--7FL--JLJ|L-JL---7F7F-7FJF-J||L7L---7LJFJFFJFJLJLJLJJF|7L-|L-J||F7|F-J|||LJL-JLJ||L7||L---JF-JL-----7F7L---J7-|L7L7L7LL.F-| +L-FF7|FL-7LJF-7F-7|F7F----JF-7F--7LJLJFJL7L-7||FJF--7|F-JF7L7|J7L|||JF-F-JLL7F7|LJ||L7FJ|L-7F----J|FJ|L7F7F7L-----7F7LJL7F-7.JJLLL-F--FL-7-| +.F7LL7F--JF7|FJ|FJLJLJF7F--JFJL7JL---7L--JF7LJ||FJF-JLJF-JL7||J|7.|.LL.J.F-FJ|||F-JL7||LL--JL--7F-J|FJ7LJLJL-----7LJL---J|FJ7-F77FFL7J|L7L-| +-|77|L|F7FJLJL7||F7F7FJLJF--JF-JF----JF7F7||F7LJ|FJ-F-7|F--JLJ.|J7L77L----J|FJLJL---J||F7F-7F-7LJF-J|F7F7F---7F-7L-7|F7F-JL7--FFJ---J.JF7FFJ +..L77L||||..F7LJLJ||||F--JF-7|F-JF----JLJLJLJL--JL--JFJ|L-----7.||F7J7|F|..LJJL7JF7F7LJ||L7LJFJF7L--J|LJLJF77LJ|L-7L-JLJF7FJFF|.F-J||-LL-7LF +|.JL-JLJLJF-JL----J|LJ|F7FJLLJL7FJF----7F7F7F7F-7F--7L7|F7F7F-JFF7|JLLJJ77.JL77FFJLJL--J|FL7FJFJL7FF7L----JL---7F7L7F---JLJ-LJ|F|7FJ-F-JLLJL +L-||-||F--JF7F-----JF7LJ|L7FF7FLJLL---7LJLJLJ|L7|L-7L-J||LJLJ-LFJ|J|.F|JLF7..L|JL7F-7F-7L--JL7L-7L7||F---------J|L7|L-----77L7|F777|JJ..FJ-J +L-JF-JFL7F7|LJF----7||F7|FJFJL--------JF7-F7-L-JL--JF--JL--7.F-|FJ.LFLJJ.|F7..|FFJ||||JL--7F7|F7L7|||L-----7F--7|FJL-----7L-7F7F777JJ.L-|JF7 +.-.F7L|JLJLJF7L---7||||LJL7L-----------JL7|L---7F--7|F-----J-7-||LJFLJ-LLFLJ-F-7L-JFJ|F--7LJ|LJL-JLJL7F----J|F-J|L7F7F7F7L--J||||||J-F.JJF-F +FL7L-JF.|.|FJL-7F-JLJLJF--JFF------------J|F---JL-7|||F---7F-77||7JF7|7LL77.-L7|-|7L-JL-7|F-JF------7LJF-7F-JL7F|FJ|LJLJL7JF7|LJL-7F7|..FF7| +7FJ-J-JLJF7L7F7LJF-7F-7L7F--JF-7F7F---7F-7||F7LF7-|||||F--JL7|FJL7.||F7.7LJ-.F|L7F7F7F7F||L--JF-7F-7L--JFJ|F--JFJ|FJF--7FJFJ||F---J-7J7FFL77 +|-7-|..|7|L-J||F7|FJ|FJFJL-7FJLLJLJF--J|FJ||||FJL7|LJLJL----JLJF7|.|LJ|7L7..7-L7||LJ|||FJL--7JL7LJFJJF-7L-JL-7||FJ|FJF7LJ|L7|||F-7..LFJ7-FJ7 +7||F|.7LFL---JLJLJL7|L7|F-7LJF7F7F7L---JL-JLJLJF-J|F---7F------JLJ.L-7L7F7F7J-F||L-7LJLJF7F7L-7L-7L-7L7L--7F7L-JL-JL-JL-7F7|LJLJFJ7L.F-FF-JJ +L7-L7.777LLF---7|F-J|FJ|L7L--JLJLJL-----7F--7F7L--JL--7|L--7F-7F7FJJ7L7|||||7F7||F7L--7FJLJL-7L-7L-7|FL7F7LJL7F-7F-7F--7LJLJF---JF7L7L7.JJ.J +F|7.J..-7.LL7F7L7L--J|FJFJF---7F------7FJ|F7LJ|F7F7F-7|L---JL7|||7JJF7||||||FJLJLJ|F7-LJF7F7FL-7|F-J|F7LJL--7|L7|L7|L-7L---7L----JL-77.-J|7. +-J|7L77JLFFFJ|L7L-7F7LJJL-JF7|||F-----JL-J||F7||LJ|L7|L------JLJL-7.|LJLJLJ||F---7||L---JLJL---JLJF7LJL-----JL-J|FJL-7L-7F7L-7F7F7F-J--J.FJ. +|JLF.|J|F-LL-J7L-7LJL-7F7F-JL7LJL7F7-F--7FJLJ||L7LL7||F7F7F--7F7F7|-L7F7F-7|||F-7||L---------7F7F-J|F7F--------7|L-7FJF7LJL7.LJLJLJ.J.LF-JJ. +L7LL7JF-L-FF7F7F7L---7||||F-7|F7JLJL-JF-J|F--JL7L-7||||LJ|L-7||||LJF7LJ||.LJLJL7||L-7F-7F----J||L7FLJLJF------7||F7||FJ|F-7L--7F7.LF|---J7.F +LJF-JFF.|FFJ||LJL7F--J|||LJFJLJL-7F--7L--JL--7JL--J||||F7L--JLJLJ.FJL--JL-7F7F7|LJF7|L7LJF7F-7|L7L7F-7FJF--7F7LJLJLJLJJLJFJF7FJ|L---7..|.--J +L7J.FJ|LF7L7LJF-7LJF-7LJL7FJF7F-7|L-7|F-7F7F7L----7LJ|||L7F7F7F7F7L----7F-J|||||F7|LJL|F7|LJLLJ-L-JL7|L-JF-J|L7F7JF-7F--7L-JLJFJF-7FJ777...| +.L|FLJL.||LL--J|L7FJLL--7LJFJLJFJL--JLJ-|||||F7F7FJF7LJL7LJLJLJ|||F7F7FJL7L|LJ|LJ||7F7||LJF7-F7F7FF7||F7FL-7L7LJ|FJFJ|F-JF7F--JFJ7LJLF-7---J +|||LJ..F|L7F7F7F7LJF----JF7|F7FJF--7F7F7LJLJLJLJ||FJL--7|F-----J|||LJLJF7L7L-7L7FJL7||LJF-JL-JLJ|FJLJLJL---JFJF-JL7L-JL--J||F--JF7F7-7J77.F| +LJJ.|.-FJFJ||||||F7L----7|LJ||L-JF7LJLJL-7F--7F7LJL7F--J|L---7F7||L-7F-JL7|F7L7||F-J||F7L7F----7LJF-7F-7F7F7|FJLF-JF------J||-F7|LJL7J|FJ-FJ +FF|-|.|L7L-JLJLJLJ|F77F7LJF-JL---JL----7FJ|F-J||F7F|L7|FJF7F7LJ||L7LLJ-F7||||FJ||L7FJ||L7LJFF7|L--JJ||7LJLJLJL-7|F7L7F7F7F7||FJLJF--JJL|FFJJ +FFJF--F-JF-7F----7|||FJ|F7L----7F-----7|L-JL--JLJL7L7|FJFJ||L-7|L7|F7F7|LJLJ|L7||FJL7||FJFF-JL------J|F----7F-7LJ|L-J|LJLJLJLJF7FJF7..FF7J.| +FF7JJ7L7FJLLJF7F-JLJ|L7||L7F-77LJF--7FJL-------7F-JL|LJFJFLJF7LJ-||||||L--7FJ7||||-FJ|||F7L--7F7F7F7FJL---7LJFJF7L7JFJF7F--7F7|LJ||L7F7|J7.F +J|L.L|JLJJ-FFJLJF7F7L-JLJFJL7|F7FJF7LJ7F7F7F--7||F-7L7FJF7.FJ|LF-J|||||F7FJL7FJ||L7L7||LJL7F-J|LJ||||F----JF-JFJL7L-JFJ|L-7LJLJ-F7L7LJL7FJ-| +FFL7||7|L-F-JF-7|||L--7F-J|L||||L-JL---J||LJF-JLJL7L-JL7|L7L7L7L-7||||||||F-JL7||FJ-|LJF--JL--JF-J|LJL----7|F7L-7L---J.L-7L-----J|FJF-7L7-FF +F|7.J|LFJ-L--J.||||F--JL7F7FJLJL-7|F-7F7LJF7L-7LF7L--7FJL7L7|FJF-J||||LJLJL-7J||||F7|F-JF7F-7F7L--JF------JLJL-7L------7.L7F-7F-7LJFJ-L-J.FJ +L.L-|L7LLFF----J|LJL-7F7|||L----7L-JFJ|L-7|L-7L-J|F--J|F7|FJ|L7|F7LJ||F-7F--JFJLJ||||L-7||L7||L----JF7F7F-7F-7.L------7L-7|||LJJL-7L777|FF-J +.-..-FJJ.FJF--7FJF---J||LJL-7F-7L7F7L7|F7|L-7L7F7|L--7LJLJL-JFJ||L7FJLJFJ|F-7L--7LJLJF7||L7||L-----7|||LJFJL7L7F---7F7L--JLJF7-F77L-JL|LFJJ- +F--|JL7J.L7|F7||FL---7||F7F7|L7L-J|L7|||LJF-J|LJ||F--JF-----7L7LJ-||F-7L7||FJF-7L7F--J||L7|||-F-7F7||LJF-JF7L7||F--J|L7F-7-FJL-JL-7FL7|F-JJ. +LJLJ.LJLF7LJ|LJ|F----J|||LJ|L-JF--JFJLJL-7L--7F7LJL--7|LF7F7L-JF7FJ|L7L-J||L7L7L-JL--7LJFJ||L7L7||LJ|F-JF7||7||||F7F|FJL7L-JF7F---J7||77LL|7 +FF-7.|.F|L7|L--JL7F-7FJLJF-JF--JF--JF7F7FJF--J|L7FF7FJL7|||L7F7|LJFJJL--7||FJFJF-7F--JF7L7LJFJFJ|L7FJL--JLJL-JLJLJL-JL--JF7FJ|L----77.F7--77 +L|FL-J-FL7L-7F-7LLJ|LJF7FL--JF7-L---JLJ|L-JJF7|FJFJLJF-J|||FJ||L-7L-7FF7|LJL7|FJJ|L-7FJL7L-7L7L7||LJF---7F7F7F7F-7F------JLJ7L7F7F7L7..|.L|J +F|FJ.FF77L-7|L7|F7F---J|F77F-JL-7F7F---JF7F7|||L7L7F7L7FJLJL-JL-7L7FJFJ|L-7FJ|L-7|F7|L7FJF7|FJ7|L-7FJF-7LJLJLJLJFJL------7F-7L|||||FJ.7JJFJJ +J-77LL|L---JL7||||L---7LJL7L---7|||L--7FJ||LJ|L7L7LJ|FJ|F-------JFJL7L7L--JL7|F-JLJLJFJL7||||F-JF-JL-J|L-------7L--7F7F--JL7|7LJLJLJF-J|J-.| +JJL--LL-----7LJLJ||F7.L7F7L----JLJL---J|FJL-7L7L7L7FJL-JL7F----7FL-7L7L----7LJ|F--7F7L-7|||||L7FJF7F--7F---7F-7L--7LJ|L--7FJL7F-7JJ.L7LL7.LF +FFL|7-|.F---JF7F7L-JL--J|L7F----------7|L7F7|FJL|FJL-7F-7LJF---JF7.|FJLF7|FJF-JL7FJ||F7|||LJ|FJL7||L-7|L--7LJFJF-7L-7L---JL7FJ|FJ|J|7F.FF|.L +F7||LFFFL-7F7|||L-7F-7F7|FJ|F---------JL7LJ||L7FJ|F7F||-L--JLF7FJ|FJL7FJL7L7L-7FJ|FJ||LJ|L-7||F-J||F-JL---JF7L-JLL-7L------JL-JL7J.7-JL-7|L7 +F|7F-LJF7L|||||||FJ|FJ||||FJL-7F7F-7-F77L-7||FJL7|||FJ|F7F--7||L7|L7FJ|F-JFJF-JL7|L7|L7FJF7|LJ|F7||L-7F7F--JL-----7L7F7F-7F7F---JLF|.F|LFJF7 +.LL--J7|L-J|||LJFJFJL7|||LJF--J|LJJL7|L7F7|||L-7|||LJFJ|||F-J||FJ|FJL7|L7FJFJF-7|L7|L7|L7|LJF-J|||L7|LJLJF--------J-LJ||7LJ|L---7L7LF.|.J.L7 +|JJJ.J7L-7FJLJFLL7|F-J|||F7L--7|F---J|FJ|||||F-J||L-7|7||||F7||L7||F-JL7||FJ-|FJ|FJ|FJL7|L7FJF7|||FJF7|F7L------7F---7|L--7|F-7FJFF7--7-L7J| +|JFF|.FLLLJLF-7F7|||F-JLJ|L---J|L7F-7|L7|||LJ|F7||F7|L7|||LJ|||FJ||L7F7||||F-J|FJL7||F7|L7||FJ|||||FJ|FJ|F-----7LJF--JL-7FJ|L7LJFFJ||FJ--.F| +|LJJ-LJ7|LJ|L7|||||||F---JF7F--JJ||.|L7||||F-J|LJ||||F|||L7FJ|||FJ|-||LJ||||-FJL-7|||||L7LJLJFJ||||L7||.|L-7F7F|F7L----7LJ-L7L---JFJJ7.|L|7| +F7J|.|JFL|JFF|LJLJ|||L7F--JLJF7F7||FJFJLJ||L-7L-7|||L7||L7||FJ||L7|FJL7FJ||L7L7F-JLJ||L7L---7L7|LJL7|||FJF7LJL7LJ|F7F-7L-7F-JF7F7FJJLF-7-J|L +FJFFFJL-7|JF7|F7F7|||7LJF----JLJLJ|L7L--7LJF-JF-JLJ|FJ|L7|||L7||7LJL7FJ|FJL7|FJL---7||FJF7F7|FJ|F--J|LJL7||F-7|F7LJ|L7L--JL--JLJ||J-FF7L.FJ7 +|LF.L-7J-J-|LJ|LJ||||F--JF7F7F7F7FJJL7F7L-7|F7L---7|L7L7|LJ|FJLJF7F7||L|L-7|||F----J||L7|||||L7|L7F7L--7|||L7|LJL-7|FJF------7J.LJ7FJLJ|-FLJ +L||L7.7F77.L-7|F7||||L---JLJ||||||F--J|L7FJ||L7F-7|L7L7||F-J|.F-JLJLJL7L7FJ|||L--7F7||FJ|LJ|L7||FJ|L7F7|LJ|FJL-7F-JLJFJF-7F-7|JF.|JL-FLL.L-7 +FLL.|-|LF----JLJ|||||F------J|LJ||L7F7L7|L7LJ.||L|L7|FJLJ|F7L7L--7F--7|FJL7LJL7F7LJ|||L7L-7L7|LJL7|FJ|||JFJL-7FJL7F--JFJFJL7|L77-L-JF-J|--L7 +|7|F--LJL-7F7F7FJ||LJL----7F-JF-J|FJ|L7|L7L-7FJL7|FJLJ-LFJ|L7L-7FJL7F||L-7L-7||||F7|LJ7L7FJFJL7F7||L7||L7L7F-JL7FJ|F--J-|F-JL-J|FLJ7FJFJ.L|| +|--F7FJ.|LLJLJLJJ||F------JL7FJF-JL7|FJ|FJF-JL7FJ||-F7-FJFJFJF7||F7|FJ|F-JF-JFJ|||LJF7F7|L7L7FJ|LJ|FJ||FJFJL7F-JL-JL-7F7LJ-L|-FL7J-7|L|.|F-. +7.F-J-JFF-J.|||--LJL------7FJ|FJF--J|L7|L7L--7LJ7|L7|L-JFJ.L7|||||LJL7|L-7L-7L-J|L-7|LJ|L7|FJL7L7FJL7|LJLL7FJ|F-7F7F7LJL7||FJ-L.7J|LFF7-LJ-| +FLJJ7|FJJ7.LLJF--|LF------J|LLJLL-7FJ|||FJF7FJ|F-JFJL-7FJ.FFJ|LJ|L7F7LJF7L7FJF--JF-J|F-J.||L7FJ.LJ|FJL7FF-J|LLJ|||||L7F7L77|J7|7L77-FJJ|.J.| +FJJL-7-J.77FJF7|FLFJF-7F7F7L-7F---J|F-J||FJLJF-JF7|-F-JL-7FJFJF-JFJ|L--JL-JL7L7F7L--JL--7LJFJ|.F--7L-7L7|F7L---7||||J||L7L7|J-|F7.LL-J.|7|FJ +F7FF-J|F--.L7-LF|-L7|.LJLJ|F7|L7F7FJ|F7||L--7L-7||L7L-7F-JL7|FJF7L7L--7F--7FJL|||F7F7F-7|-FJFJFJF7L--JFJLJL7F7FJLJLJFJL7L-J-7J|-77|7|.FL7JJ. +|--7LL|JFL-.77..LFLLJF7F--J|LJ.LJ|L7||||L-7FJF-J||FJF-JL--7|||FJL-JFF7LJF-JL-7||||LJ|L7|L7|FJ7L7|L7F7FJF---J||L-7F7FJF7L-7|7J..F77LL--|F-.FL +LL|L..7--J|F|7.L|LLF-JLJF-7L-77F7L-JLJ|L7L||7L7FJ|L7L7F7F-J|||L--7F-JL--JF7F7||||L-7|FJL7||L7F7||F|||L7L-7F7||F7LJ|L7||F7L77FJ-J.L-L-JL7--7J +7F--L7L7|.FJL|7-JFLL-7F7L7L7FJFJL-----JFJFJL-7|L7|FJLLJ||F-J||F-7||F7F7F7|LJLJ||L7FJLJF7||L7LJ|LJFJ|L7L7FJ||||||F7L7||||L7L7-|.LL-7-L.F|FJJ| +F|7FFJJ77F7-F7|FJJJ||||L-J||||L7F7F--7FJ|L7F7|L7|||-F--J|L7FJ|L7LJLJLJLJ|L---7||FJL-7FJ|||FJF7|F-JFJJL7||FJ|||||||FJ|||L7L-JFJ-L-7..|7FJL--J +-F-L|7LJL-J-LF|-J-F-L||F---JL7FJ|||F-J|.F7||LJFJ|||FJF-7|FJ|LL7L7F7F----JF7F7||||F-7LJFJLJ|FJLJL7FJ.F7LJ||FJ||||||L7LJL7L-77JJ|L||-LL-FJF.FJ +||F||7|.-..LFJL7.L-.LLJ|F-7F-JL7|LJL-7L7|LJL7FJFJLJL7|FJ|L7L7-L7||LJF-7F7|LJLJ|||L7L7FJFF-JL-7F-JL-7||F-J|L7|LJ|||FJL|L|F7L7.FF-JF.L|LJ7JFL. +--FJ77J||J.F7L-L-7F7JF7||JLJ7LFJL7F--JFJL-7FJL7|7FF-J||FJFJFJF-J||F7|JLJ|L---7|||FJ-LJF7L-7F-JL7F-7LJ|L7FJL||F7LJLJ|.|FJ|L-J7FJF7.F-F7J--||7 +FFFJ.|--L.7.|.|.FLJ-F|LJL-7J|JL--JL7F7L--7||F-JL7FJF7||L7L7|JL-7|LJLJF--JF7F-JLJ|L----JL7FJL7LFJL7|F7|FJ|LFJLJL-----7-L-JJ|.F|LL77J.JJ7J-|J7 +FF.F|J..|7F7FFFFJ|J-LL7F--JL-JLF---J||F-7|LJ|F7FJL-JLJ|FJ-||F--J|7F7FL7F7||L77-FJF---7F7|L--JFJF7|||LJ|FJFJF7F7F----J.||FLL-7J|LJF77|.|-FJ-L +7L-L7FF7-F7F---JFJF-JLLJ-JLFJJL|F-7FJ|L7|L-7|||L--7-F-JL7FJ|L7F7|FJL--J|||L7L-7L7L--7|||L7|LLL7|LJ|L-7||LL-J|||L-7J7|7J-F.JF|-FJ-F7-J-L-|J|| +J77F|-LJ|LFLJ|J.-JFL7.|L7..J7F.LJFJL7|FJ|F-JLJ|F-7L7L--7|L-JFJ|||L7F7F7|LJFL7FJF|F--J||L-J--FFJL-7L--JLJJL|L|||F7|F|7.|L77-F7-J.FJ.F.FJJ|FL| +L7-F|.L-J7|LFJJFJ|7L7-F-J7F-J77.FJF7|||FJL--7FJL7L-JL|7|||F-JFJ||FJ|LJ|L--7FJ|FFJL7|7LJJJJ|F-L7F-JJL|J|J7||.LJLJLJ-JF-F7J7|L|JL--F7|-J7F77|| +FL-J.FLJF-7JJ|FL7J-J|L|-FJ|J..LFL-JLJLJ|F7F7||F-JJ.L|FFJ|FJF7|FJ|L7L-7|F7FJL7L7L-7L--7-|-FFJJ-LJJJ-LLFF.77|-.L|.LF|-L7J|7L-7J7.JJL7||L-.J-J7 +L..|FJJ.FJ|7L-J|L|F-7.F-J.--77F.L|7||LFJ|LJLJLJJ.|7-J|L-JL7||||FJL|F7|||LJF7L7L7FJF7FJ-L--J.|.L-J7F7J.J7|LLLJ-LJFJJLLJF-|-FJ||J|||.|-JFFJ.|| +FJ.77JF---JJ||.7-F|-|7LJJ..FL7L7----J||FJLJ|-|-|.LF7-LLJ7FLJLJ|L7FJ||||||FJL-JFJ|FJLJJ77.LLLJ.LFF-JJ.F.|L.LJ|-LF-JJ.LJ7.L-7.|..LLJF7FL|-7|L- +LF7.F.|.LF7FL--L7LJ7.L7J.7.|.F-F.|LJLFLJ7LLJLJ7|.LJ7|||7FJFLF-JFJL7|||LJ-L-7F-J-||JJJF--7.LL.F.F|FJ.FL7|.-77|7.7.-77LL7-L7|F|-F7|FLL7|L|LF7| +.LJ|LJ|7|LF7JJ.L7.--7JL77|.F7J7L--.|.77.L-7J-LFF-FJL7--77-J7L7FJ7.LJ|L7J|FLLJJFL||J|F---LJ-L-7J-JJFF.L-77LF-|J-FLJ|FF.||FJ-|JJ||LFJ.-7L7.FJ7 +|-|||JF-7-7||LJ7J-|7|..F7LFJ7.F7F|.F7.---7||J.|L.F-77L|-|7F7FLJ.L7FLL-JFF7J|-F7L||7LJJ||||||LJ|F7FLFJJJ||7J|.LFFJLL7JFL-7J7L-F||.JF|FJ-|7L|- +|.LFJ-|JLF7-7-||L|||J.FFJ7.|F-7J|7.LL-7|FJF-7F||FF7||7L-|-LJLJLF.F|-|JL--7F77F--||-.LFJ-LL7F-FF.FL--JJ.LJ7-F.F7F7L||.-.FJLF.-J|-FJJL7..J|FFJ +F-|.F7|.FJ7FL-|-7F||L-J|F7F-L7J-7--F7FFLJLFFL7J|7|F-7F|.|LF7|.L|-LLJFJJ..L-JF7|FLJ.F||J||-J.F-JFL.-7|F-JFF7.--JJJFJ|||-|F|L-.FJLLJL7LFF-L|J7 +.FJF|JFFJLL77||L-7LJ77F-||L-|J.||J.L7-7-L--77F7L-J7JL--7L-F-|7-F7LF-L7LFF-J.||7FL|7.F--J7F|.F777-LL7LL.|LF7-LFJLF7|L7|.LJ777F|-7|-FJ-.L7-7|| +F-J-L--|.LFJ-F|-J-----|.LLLJL7-JJ.F-L-7-F---JLJLLLL.7LL|LFJ|L--LL---L7-FJ.L|--L-JLL7L7.LLLJ-FJL|J-LLJL.|.JJLLLJ.LLF.L77LL|-J-|-7JJ..L-7JJ.-J From 151630332efb346ee48b2ed8ddcf0a408687a036 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 10 Dec 2023 12:48:09 +0000 Subject: [PATCH 415/479] 2023: d10: ex1: add solution --- 2023/d10/ex1/ex1.py | 155 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100755 2023/d10/ex1/ex1.py diff --git a/2023/d10/ex1/ex1.py b/2023/d10/ex1/ex1.py new file mode 100755 index 0000000..b56dd6e --- /dev/null +++ b/2023/d10/ex1/ex1.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python + +import sys +from collections.abc import Iterator +from enum import Enum, StrEnum +from typing import NamedTuple, Optional + + +class Point(NamedTuple): + x: int + y: int + + +class Direction(Enum): + NORTH = Point(-1, 0) + SOUTH = Point(1, 0) + WEST = Point(0, -1) + EAST = Point(0, 1) + + def apply(self, pos: "Point") -> "Point": + dx, dy = self.value + return Point(pos.x + dx, pos.y + dy) + + +class Pipe(StrEnum): + VERTICAL = "|" + HORIZONTAL = "-" + NE_BEND = "L" + NW_BEND = "J" + SW_BEND = "7" + SE_BEND = "F" + + @classmethod + def from_connection(cls, connections: dict[Direction, bool]) -> "Pipe": + assert sum(connections.values()) == 2 # Sanity check + if connections.get(Direction.NORTH, False): + if connections.get(Direction.SOUTH, False): + return cls.VERTICAL + if connections.get(Direction.EAST, False): + return cls.NE_BEND + if connections.get(Direction.WEST, False): + return cls.NW_BEND + if connections.get(Direction.SOUTH, False): + if connections.get(Direction.WEST, False): + return cls.SW_BEND + if connections.get(Direction.EAST, False): + return cls.SE_BEND + assert connections[Direction.WEST] and connections[Direction.EAST] + return cls.HORIZONTAL + + def neighbours(self, pos: Point) -> Iterator[Point]: + deltas: tuple[Direction, Direction] + + match self: + case self.VERTICAL: + deltas = (Direction.NORTH, Direction.SOUTH) + case self.HORIZONTAL: + deltas = (Direction.WEST, Direction.EAST) + case self.NE_BEND: + deltas = (Direction.NORTH, Direction.EAST) + case self.NW_BEND: + deltas = (Direction.NORTH, Direction.WEST) + case self.SW_BEND: + deltas = (Direction.SOUTH, Direction.WEST) + case self.SE_BEND: + deltas = (Direction.SOUTH, Direction.EAST) + + for dir in deltas: + yield dir.apply(pos) + + def go_through(self, pos: Point, prev: Point) -> Point: + for dest in self.neighbours(pos): + if dest == prev: + continue + return dest + assert False # Sanity check + + +Pipes = dict[Point, Pipe] + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> tuple[Point, Pipes]: + start: Optional[Point] = None + pipes: Pipes = {} + + for x, line in enumerate(input): + for y, c in enumerate(line): + if c == ".": + continue + if c == "S": + start = Point(x, y) + continue + pipes[Point(x, y)] = Pipe(c) + + assert start is not None # Sanity check + return start, pipes + + def iter_pipe(cur: Point, start: Point, pipes: Pipes) -> Iterator[Point]: + prev = start + while True: + if cur == start: + break + if cur not in pipes: + break + # Check that the receiving pipe is connected to previous one + if prev not in pipes[cur].neighbours(cur): + return + yield cur + cur, prev = pipes[cur].go_through(cur, prev), cur + # Yield the loop element + if cur == start: + yield cur + + # Return the possible pipes that start can be + def resolve_start(start: Point, pipes: Pipes) -> Pipe: + # Returns the direction which closes the loop, if there is one + def explore(dir: Direction) -> Optional[Direction]: + points = list(iter_pipe(dir.apply(start), start, pipes)) + if len(points) == 0: + return None + penultimate, last = points[-2], points[-1] + if last != start: + return None + return Direction(Point(penultimate.x - last.x, penultimate.y - last.y)) + + res: set[Pipe] = set() + for dir in Direction: + if (resulting_dir := explore(dir)) is None: + continue + res.add(Pipe.from_connection({dir: True, resulting_dir: True})) + assert len(res) == 1 # Instructions say there is exactly one loop + return res.pop() + + def compute_dist(start: Point, pipes: Pipes) -> dict[Point, int]: + res = {start: 0} + + for n in pipes[start].neighbours(start): + for d, p in enumerate(iter_pipe(n, start, pipes), start=1): + res[p] = min(d, res.get(p, d)) + + return res + + start, pipes = parse(input) + pipes[start] = resolve_start(start, pipes) + return max(compute_dist(start, pipes).values()) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 4309339016d047167caedcfef834b5f58bffa683 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 10 Dec 2023 12:48:14 +0000 Subject: [PATCH 416/479] 2023: d10: ex2: add input --- 2023/d10/ex2/input | 140 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 2023/d10/ex2/input diff --git a/2023/d10/ex2/input b/2023/d10/ex2/input new file mode 100644 index 0000000..e1a4432 --- /dev/null +++ b/2023/d10/ex2/input @@ -0,0 +1,140 @@ +F-L----F7-7.F-7JJ.F--L-.F|F77.L|7.FLF-7.JJ--7FF-F-F7F7.7-F-7.L.FL7F|7--777.FJ-|7J-F-J-77-FF-F-7.JF77.L.JFL.L-|-FF7-77FL--F77.7-|77F7|7FF7-7- +J|F7.LL|.F7.FL|J-77--JJ7L|-|-F-7L7-|LJ|F|JL|L-JJ|L|--7FF77.|-L7|LFLF-7FL--LL.FLJL-JFF-F7.-LJLF|J-LJ|FJ.|7-7L-JF|.J.LF7|L7.LF-|7F7-|-7-J7|7.| +FF7J.7L|-7|FF7|L7|L|.LF7-JFLJJ.J7JJFJ-7.L-LLJJ|LJ7LL|.JLL---.LFJ7L-LJL-|JJ-|-F.LJ7|FLF-J.L7.FJ||F||L|L7--F..FLF7-L7|LLJ7L7.-7||||J|FJ.LLJ7F- +FJ.LF-7-FJLJ-|7-7J777..|-FJ7.FJ.|.F|LFL-L7L|..--L|7.F-7-L|..FF|JF|7J.|7|FF-|.LF7LL77.J.LJL|7LF-77.|FFJ|7FLJF|-F7..FJF7L7.FJF7LJ||--|JJLLJF.J +|FF7LFL7LJJL|.|.||L77--|7F---L.F|77JFL7.F|7FL7.F7LJ-7-JJLJ.--JLJFJ77F|7F|-.|L-LJ7-LJ7FJ7.|J|-F-J|FL7|-L-J7|-.L7JJ-L||L-|7J.LF7FLL-|||.FF-7J. +FFJ-7LL7JF-.LL|-L--||.F|FL7J..LLJ|J.J.FF7L||JFJLL.J-J7LF7J77.7.||.F-FJ-|J.77.F-LLJJ|L-7|L---7JFL-7FJ-7FFL|7FLFJ|L|F-JL|.|.|-J7-LL-FL-.FFLJJ7 +LL7.L--|7LJ7J.7|FL7.F77FF..-|7-L-|F7.L7JLFJ|LL|.LF-FLL7LLL-|7|F7F-7-J.FL-F|-J77-|.F-.L-J.L|||F|JLJJ7FJF7|J|7FL77FL|.|L|J7FF-L--..L|.F-77JL7- +|LF-7L.|FLLJ.LJ7-7FJL--FJ7L.7J.|JL|J-7|F7-.J7L|L-L77J|L7..FJF7LF77|J-.L--.-7L-F7F-J.F-|J|.FL7-7-F|JF.FL|---J-FFJF|.F|7F-FF.FL7--..J.|LL---JJ +|.--7.F|F7.J-LLJJLFJ.|.|-||-|LF77-7|FF||||7.JFFJF-J7|.F7FFF7||FJ|7|.|.|.L-FJFLJL|7|F|.L7.L|L|.-.LJF|F7|..FFJ-LJF.JJ7L||LLJ7---JLL-|7LFF7-7.| +F-LJJF-FJ-|..||L.JJ|-77|LF-F77F-7|LF7-L--7-|.FJ-JJ-JFF|L--J||LJFJJ-F-FJ.|FJFJJ..L7.|.F7J--L.|7.JJ.--7L7JF7L|J|FF7.LF7LJ-|||.|L-JL7-7-FJ-FJ-7 +FJ||FF7-J|L|-LF7LF7J7F7F7|FJ|FJFJJ--J|L|7LL|7LL-77J7FFL7F-7LJF7L7J.7-|.-F7|||-F|-FFF-J|J.F|7F-7.|FL-J-LJ-|7LFF7||7-|L7-F77-LJ|.FFLJL-|L|L|.. +J.LJ-|LL-77F7.||-J|F-JL|L7L7|L7|.|-|FF-F..LJ|.LL|-F7-F7LJFJF7|L-JLFF.L-|JF7F7F7JJF7L7FJF7JLF|FJ777.|.7.|F77-FJLJ|F7L7|.||..JJFLJ77F7|F-J.|-7 +|77JFL77L|-J|--|7F-||LFL7|F||-|L77--F7J|7L.F-|J|LFJ|||L7JL7||L7F7F7J|..L||LJL-7F-JL7|L7||7-FJL-777.F.F-7||F7L7F-J|||||FJL777FL-L---.JJ|LJ.L| +7JL--7.|.|77L7.F7-FF7FF-JL7||-L7|F7.||.77L|--7FF7L7L7|FJ77LJ|FJ|LJ|7|FF7-L-7F-JL--7||FJ||F7|F--JF--77L7LJ||L7|L7FJL-J||F-J||J.77F|.|-|7FL.FF +.F7F7F7JF.F--7-L7.F||7L--7LJL--J|||-||FF7F7JFF7||.L7||L-77F-JL-JF7|F7FJ|7|FJ|F7F--JLJL7||||||F7||F-JF7|F-JL7|L7||F---J||||7|-J-L-|7L7F-|77F- +FL||-L7F|7JL7J77F7FJL7F-7L-7F---J|L7||FJ|||7FJ|||7-|||F7L7L-7F-7|LJ||L7L-7L7|||L--7F--J||||||||-|L-7|||L-7.||FJ||L--7FJL-7L7LL|J.|J-LJ||LJJ. +|JLF-.LL|-J|L7FF||L7FJ|FJJFJL7FF7|FJ||L7||L7L7||L-7||||L-J|FJL7LJ|L|L7|F-J|||||F7.|L7F7|||LJLJL7L7FJ||L7FJFJ|L7LJF--J|F--J7J..F7FL.|-LFFJ|F7 +.|7||.L|J.FL7FF-JL7|L7||F7L7FJFJ|||F||.|||FJFJ|L-7||||L7F7FJF7L-7F7L7LJ|F7FJLJ|||FJFJ||||L-7F--JFJL7|L7|L7L7|FL7FJ-F7||-LF7JFFJL7LJ77F7-.||7 +L7FFL7-|-J--7-L--7|L7||||L-J|FJFJ|L7||FJLJL7L7L7FJLJ||FJ||L7|L7FJ|||L-7|||L--7|||L7|FJ|||F7||F-7L-7LJFJ|FJFJL-7||F7|||L-7||77L7JJL|-FJJ-77JL +L7LLJJ.JFLL7JFF--JL7|LJ|L--7||FJFJFJ||L7F--J|L7|L--7|||FJ|FJL7||FJ|F7-||||FF-J|||L||L7||||||||FJ|FJF-JFJL7L--7LJLJLJLJF-J||LFFJ.7JL.|L|.|F.| +F|.|--F7|-FJ7L|F--7LJF-J.F7|LJL7L7|FJL-J|F7FF7||7F-J|||L7LJF-JLJL7||L7|LJL7L-7LJL-JL-J|||||||||F7L7L-7|F7L7F7|F------7L--JL-7|--7F|FJ.|FJ|7. +7F-7-JLJLF-7LLLJF-JF7L7-FJ|L7F-JFJLJF---J|L7|||L7L-7LJL7|F7L7-F--J|L7||F--JJ|L----7F--J|||||LJLJ|LL7FJLJL7||||L77F7F7L------JJ7LL777|-F7||7F +|FJJ..LL-7|||FF7L-7|L7L7L7|||L-7L7F7|7F7.L7||LJFJF7|F--JLJL7L7L--7|FJ||L7F-77F7.F7|L-7FJLJLJF---JF7||F7F-J|||L7|FJLJL7F7F-7||-F7L--77LJLJJ7| +LL.F-|7JJ.J-FFJL-7LJFL7|FJ|FJF-J.|||L7|L7FJ||F-JFJLJL7F7F7F|FJF7FJ|L7LJFJL7|FJL7|||F-JL---7FJ-F7-||||||L-7|||FJLJF--7LJLJFJF7FJL77FLL-JLL7|L +|FJ|LJ|L-F-LFL7F7L-7F7||L7||FJJF7LJL7||FJL7||L-7L--7FJ||||FJL7|||FJL|F-JF-J|L-7LJ||L7F7F7|||F7|L7|||LJ|F7|||||F--JF7L----JFJ||F-J-|7JJ|-|JJJ +JJ-J-JJF-7|L|-LJ|F7LJLJL-JLJ|F7|L7F7|LJ|F-J||F-JF7F||.|||||F-J||||F-JL-7L-7L-7L7FJ|FJ|LJ|FJ||||FJ||L7FJ|||||S|L---J|F7F7F7|FJ||F7JJF-L|-|L77 +JLF-7..|7||F|JF-J||F7F7F-7F7LJ|L7||||F-JL-7|||F7||FJ|FJ||LJ|F7||||L7F-7|F7|F7|FJ|FJL7L-7LJFJ|||L7|L-J|FJ||||LJF----J|||LJ||L7||||FF777|F7FFJ +FL|F7-|FJ-L-L.L--JLJ||LJ|LJL7FJFJ||LJL7JF7|LJ|||||L7||FJL-7|||||||FJL7LJ||LJ||L7|L7FJF7L-7|FJLJFJL--7|L7||||F-J7F--7|||F-JL7||LJ|FJ|.|7JL-JJ +|.-|J.L-J|FJ|7|LF--7LJF-----JL7L7|L-7FJFJ|L-7||||L-JLJL-7FJLJLJLJLJF-JF7|L7FJL7||FJL7||FFJ|L-7FJF7LFJL7||||||F--JF-J|||L7F7|LJF-J|FJF77J||.. +F-LL--.FL-7.|J-FL-7L--JF-----7L-J|F-JL7|FJF-J|||L--7F---JL--7F----7|F7||L7|L-7|||L-7LJL7L7|F7|L7||FJF7||||||||F--JF7||L7LJ||F7L7FJ|FJL7.J7FF +777F7F-J-|.LF7--JFJF7F-JLF--7L-7FJL-7FJ|L7L7FJ||-F-JL7LF7F7JLJF7JFJLJ||L7||F7|LJL-7L--7L7||||L7LJLJFJLJ|||LJLJ|F7-||||FJF-J||L-JL7||F-J7FLJ. +J--L7F.J.7FL||FFFL7|||F-7L-7L--JL--7|L7|FJFJ|FJL7L--7L7|LJ|F7FJL7L7F-JL7LJ|||L-7F-JF-7L7||LJ|LL7F--J||FJLJF7F-J|L7||||L7L--J|F--7|LJL--77.L7 +F--LLLL7LL7LF7F7F7LJLJL7L-7L----7F-J|FJ||FJFJ|F-JF7-L7|L7FJ|||F-JFJ|F-7L7FJ||F7||F7L7||||L-7|F7||F7F7FJF--JLJ-FJFJ||||FJF---JL7FJ|F-7F7L-77J +J|-7.|J|FJ-FJLJ|||F--7LL-7L-----JL--JL7|LJFJ7|L-7||F7||FJL7|||L7FJFJL7L7||FJ|||||||FJ|FJL7FJ||LJ||||LJFJLF-7F7L7|L|LJLJFJF--7FJL-J|-LJ|F-J77 +LL-F-JF|L.FL-7FJ||L7FJF7FJF--7F7F--7F-JL7FJF7L7FJ||||||L7FJ|||FJ|FJF7L7|||L7|||||||L7||F-JL7|L7FJ|||F-JF7|FJ||J||FJF7F7L-JF7LJF7F7L--7LJFJLJ +7JLJL-FJJ|7F7||FJ|FJ|FJ|L-JF-J|LJF7||F-7|L7|L7|L-J|||||FJ|FJLJ|FJL7|L7|||L7|||LJ||L7|||L7F7|L7|L-J|||F7|LJL-JL7|LJFJLJL-7FJL7FJ|||F-7L777-J. +|..L7LJ.LF-JLJ|L7|L7|L7|F7FL--J-FJLJLJ7||FJL7|L--7LJ||LJJ||F--JL-7|L7LJ|L7|||L7FJ|FJ|LJL||LJFJ|F--J|||||F-----J|F-JF7FF7|L-7LJFLJ|L7L7L77-7J +7.77||.F||F7F7L-J|FJL7||||F7F--7L-----7||L7FJ|F-7|F7|L--7||L7F7F7|L7|F-JFJ||L7|L7|L7L-7FJ|.FJFJL7F7|||LJL7F--7FJL-7||FJ||F7L----7|FJ-L7|JFF. +|..FF7.F-LJLJL--7LJF-J||||||L-7|F7F---JLJFJ|FJ|.LJ|LJF7FJLJJLJ|||L7||L-7L7||-LJ|||FJF7|L7L7|FJF-J||||L7F7LJF7LJF-7LJLJFJ||L-7F7FJLJ|FFLJFJ.. +|.F7L|-J-|LF----JF7L-7||||||F7||||L-----7L-JL7L-7-L7FJ|L---7F-J|L7||L7FJFJ|L-7F-J|L7|||FJFJ||.|F7|||L-J||F-J|F7L7|F-7FJ|LJF7LJLJJLL7F-7LJ-FJ +JJ.|7L7LFJ-L-----JL-7||||LJ||||LJL---7F7|F---JF-JF7|L7|F7F7|L-7|FJ|L-J|FJFJF7||F7L7||||L7|-LJFJ|LJ||F--JLJF7LJ|FJ||-LJF7F7|L--7F7-7L7J-7L.7. +||F||-J7LL7|JF------JLJLJF7LJLJF7F--7LJLJ|F7F7|F-JLJFJ||||LJF-J|L7L-7JLJ.L7|||||L7|||||FJL--7L-JF-J|L-----JL-7||7|L---JLJLJF--J||.L7|JF|FF-J +.-J-F.L|7FJ-FL-7F--7F---7|L-7F-JLJF-JF7F7LJ||||L7F-7|L|||L-7L-7|L|F7L--7F7||||||FJ|||||L7F7FJF-7L-7|F------7FJ|L7L---------JF7FJL7|LLJF.JJ|. +FLL7|FFL77JJF-7LJF-J|F--J|F7||F--7L-7|LJ|F7LJLJLLJFJL7LJL7FJ|FJ|FJ||F-7LJ|||||||L7|||||FJ||L7L7L--J|L7F7F7-LJ|L-JF-7F7F-----J||F-J7.|.|.|..F +FJ|L--J7LFJ-L7|F7L--JL-7FJ|LJ|L-7L--JL-7LJL7F-77F7|F-JF7J||7FJFJ|FJ|L7|F-J||||||FJ||||||FJL7|-L---7|FJ|LJL-7|F7F7|FJ|LJF-----J|L---7FL7F-F7| +|-JJJ7|7F|FF-JLJL------JL7L7FJF7L---7F7|F--J|FJFJLJL--J|FJL7L7|J|||L7||L-7||LJLJL-JLJ||||7JLJF7F-7LJ|FJF7F7L-JLJLJL-JF-J.F7F7.|F---J7.LJ7|FL +L7|.LLL7-||L7F7F---------J.LJFJL--7FJ||||F7FJL7L7F-7F7FJL7FJ|LJFJL7FJ||F7||L--7F--7F-J||L7F--JLJFJF7||FJLJL7F7F7F-7F7L---JLJL-JL--7|F77|--.J +.FJF7JLJ.FF-J||L7F-7F7F7F7F7FJF--7|L-JLJLJLJF7L7|L7||||F-JL---7|F7|L7|LJLJ|F--JL-7LJF7||FJL-7F-7|FJ|LJL---7LJLJLJL||L7F--7F7F-7F7FJFJL7|J|7. +|J-L-77.F|L-7||FJL7|||||||||L-J|FJL-7F-7F7F7||FJL-JLJ|||F7F7F-J||||FJL-7F-J|F7LF-JF7|||LJF--J|-||L7||F----JF-----7||7|L-7||||J|||L-JF-J7F|FL +|.F7LJ|7L||LLJLJF-JLJLJLJLJL7LF7L--7|L7LJ|||||L-----7||LJ|||L-7LJ||L-7FJL-7LJL7L7FJ||LJF-JF--JFJ|FJL7L-----JF----JLJFJF7||||L7LJ|F-7L--7-L-. +.F7JJ---JL7|F---JF---------7|FJ|7F-JL-JF7LJLJ|F-7F--JLJF-J||F7|F-J|F-JL--7L7F-JFJ|FJL7FL7FJJF7L7|L-7L7F7F---J|F7F-7|L-JLJ||L7|F-JL7L7F7|J7-- +LLJ-F7JL|FF-JF---JF--------JLJFJFJF7F7FJL7F-7|L7|L---7-L-7|||LJ|F7|L7F7F7L7|L-7L-JL7FJF7LJF-J|FJL--JFJ||L----7|||FJF7F--7LJ7LJ|F7FJFJ|LJLJ.L +J7|F-F--JFL--JFF-7L----------7|JL-JLJ|L7FJL7|L-JL----JF-7|||L-7||||FJ|||L7||F7|F---JL7||F-JF7LJF-7F7L-JL--7F-J|LJL-JLJF7L----7LJ|L7L-JJ-FJF. +LFF7JJ.F7FFF7F7L7L----------7||F-7.F7L-JL-7|L------7F7|FJLJ|F-JLJ||L7||L7||||LJL7F-7FJ||L--JL7FJFJ||F7F7F7LJF-JF------JL-7F--JJLL-JJL|-77-77 +LL|JLF-F-7FJLJL-JF-----7F7F7LJ|L7L-JL----7LJF------J|LJL-7FJL-7F7LJFJ||FJ|||L7F-J|FJ|FJL7F7F7LJFJFJLJ||||L--JF7L-----7F-7|L---7-L7|.-.FLJLJJ +--777L7L7||F-7F--JF7JF7LJLJL-7|FJF-----7FL-7L---7F7||F-7FJL-7FJ|L7FJFJ||FJ||FJL--JL-J|F7LJ|||F7L-JF7JLJLJF---JL---7F7LJFJL-7F7|FL|7FJ7F|77|7 +LLF-J|LFJLJ|FJL7F-JL7|L-7FF7||LJFJLF---JF77L-7F7LJL-JL7||F--JL7|FJL7|FJ|L7|LJF7F7F7F7LJL-7LJLJ|F7FJL-----JF------7LJ|F-JF7-LJLJ-7.|JF7J.L7|| +F.|7FFJL---JL--JL7F-JL-7|FJL-JF7|F7L-77FJL--7||L--7F7FJLJL7F-7LJL-7||L7|FJ|F-JLJLJLJ|F--7|F7F7LJ|L--------JF7F7F7L-7|L--JL--7J-LJ7LLJ||-J.|7 +777|7..FF---7F---JL7F--JLJF7F7||||L-7L-JF7F-JLJF77LJLJF7F7||7|F7F7|||FJ||FJL7F----7FJL-7|LJLJL-7|F--7-F----JLJLJL--J|F-----7|-F-LF7FLL-JF-JJ +L-|J-L-FL--7|L----7LJF--7FJ||||LJL-7L---JLJ|F7J|L-----JLJ|LJFJ|||LJ|||FJLJJ-LJF---J|F7FJL------JLJF7L-JF-------7F7F7|L----7LJ7|--.|-...--7.F +FLF.FLF7|F7|L7F7F-JF-JF-J||LJLJF---JF7F7F---JL-JF-7F-----JF-JFJ|L-7||LJJJ.LFJFJF--7LJLJF7F7F-7F7F7|L7F-JF---7F7LJLJ||F7F7FJF-7--FF|LF|77FF-- +J|L-7-|L7||L7|||L--JF-JF7|F7-F7L----JLJLJF--7F7FJFJL--7F-7L-7L7|F7|||JJ|L7-F7L7|F-JF--7|||||FJ|||||FJ|F7L--7LJ|F---JLJLJ|L-JFJLF-F|7FJLFJ-J. +FFFL7-L7LJ|FJLJL--7FL--JLJ|L-JL---7F7F-7FJF-J||L7L---7LJFJFFJFJLJLJLJJF|7L-|L-J||F7|F-J|||LJL-JLJ||L7||L---JF-JL-----7F7L---J7-|L7L7L7LL.F-| +L-FF7|FL-7LJF-7F-7|F7F----JF-7F--7LJLJFJL7L-7||FJF--7|F-JF7L7|J7L|||JF-F-JLL7F7|LJ||L7FJ|L-7F----J|FJ|L7F7F7L-----7F7LJL7F-7.JJLLL-F--FL-7-| +.F7LL7F--JF7|FJ|FJLJLJF7F--JFJL7JL---7L--JF7LJ||FJF-JLJF-JL7||J|7.|.LL.J.F-FJ|||F-JL7||LL--JL--7F-J|FJ7LJLJL-----7LJL---J|FJ7-F77FFL7J|L7L-| +-|77|L|F7FJLJL7||F7F7FJLJF--JF-JF----JF7F7||F7LJ|FJ-F-7|F--JLJ.|J7L77L----J|FJLJL---J||F7F-7F-7LJF-J|F7F7F---7F-7L-7|F7F-JL7--FFJ---J.JF7FFJ +..L77L||||..F7LJLJ||||F--JF-7|F-JF----JLJLJLJL--JL--JFJ|L-----7.||F7J7|F|..LJJL7JF7F7LJ||L7LJFJF7L--J|LJLJF77LJ|L-7L-JLJF7FJFF|.F-J||-LL-7LF +|.JL-JLJLJF-JL----J|LJ|F7FJLLJL7FJF----7F7F7F7F-7F--7L7|F7F7F-JFF7|JLLJJ77.JL77FFJLJL--J|FL7FJFJL7FF7L----JL---7F7L7F---JLJ-LJ|F|7FJ-F-JLLJL +L-||-||F--JF7F-----JF7LJ|L7FF7FLJLL---7LJLJLJ|L7|L-7L-J||LJLJ-LFJ|J|.F|JLF7..L|JL7F-7F-7L--JL7L-7L7||F---------J|L7|L-----77L7|F777|JJ..FJ-J +L-JF-JFL7F7|LJF----7||F7|FJFJL--------JF7-F7-L-JL--JF--JL--7.F-|FJ.LFLJJ.|F7..|FFJ||||JL--7F7|F7L7|||L-----7F--7|FJL-----7L-7F7F777JJ.L-|JF7 +.-.F7L|JLJLJF7L---7||||LJL7L-----------JL7|L---7F--7|F-----J-7-||LJFLJ-LLFLJ-F-7L-JFJ|F--7LJ|LJL-JLJL7F----J|F-J|L7F7F7F7L--J||||||J-F.JJF-F +FL7L-JF.|.|FJL-7F-JLJLJF--JFF------------J|F---JL-7|||F---7F-77||7JF7|7LL77.-L7|-|7L-JL-7|F-JF------7LJF-7F-JL7F|FJ|LJLJL7JF7|LJL-7F7|..FF7| +7FJ-J-JLJF7L7F7LJF-7F-7L7F--JF-7F7F---7F-7||F7LF7-|||||F--JL7|FJL7.||F7.7LJ-.F|L7F7F7F7F||L--JF-7F-7L--JFJ|F--JFJ|FJF--7FJFJ||F---J-7J7FFL77 +|-7-|..|7|L-J||F7|FJ|FJFJL-7FJLLJLJF--J|FJ||||FJL7|LJLJL----JLJF7|.|LJ|7L7..7-L7||LJ|||FJL--7JL7LJFJJF-7L-JL-7||FJ|FJF7LJ|L7|||F-7..LFJ7-FJ7 +7||F|.7LFL---JLJLJL7|L7|F-7LJF7F7F7L---JL-JLJLJF-J|F---7F------JLJ.L-7L7F7F7J-F||L-7LJLJF7F7L-7L-7L-7L7L--7F7L-JL-JL-JL-7F7|LJLJFJ7L.F-FF-JJ +L7-L7.777LLF---7|F-J|FJ|L7L--JLJLJL-----7F--7F7L--JL--7|L--7F-7F7FJJ7L7|||||7F7||F7L--7FJLJL-7L-7L-7|FL7F7LJL7F-7F-7F--7LJLJF---JF7L7L7.JJ.J +F|7.J..-7.LL7F7L7L--J|FJFJF---7F------7FJ|F7LJ|F7F7F-7|L---JL7|||7JJF7||||||FJLJLJ|F7-LJF7F7FL-7|F-J|F7LJL--7|L7|L7|L-7L---7L----JL-77.-J|7. +-J|7L77JLFFFJ|L7L-7F7LJJL-JF7|||F-----JL-J||F7||LJ|L7|L------JLJL-7.|LJLJLJ||F---7||L---JLJL---JLJF7LJL-----JL-J|FJL-7L-7F7L-7F7F7F-J--J.FJ. +|JLF.|J|F-LL-J7L-7LJL-7F7F-JL7LJL7F7-F--7FJLJ||L7LL7||F7F7F--7F7F7|-L7F7F-7|||F-7||L---------7F7F-J|F7F--------7|L-7FJF7LJL7.LJLJLJ.J.LF-JJ. +L7LL7JF-L-FF7F7F7L---7||||F-7|F7JLJL-JF-J|F--JL7L-7||||LJ|L-7||||LJF7LJ||.LJLJL7||L-7F-7F----J||L7FLJLJF------7||F7||FJ|F-7L--7F7.LF|---J7.F +LJF-JFF.|FFJ||LJL7F--J|||LJFJLJL-7F--7L--JL--7JL--J||||F7L--JLJLJ.FJL--JL-7F7F7|LJF7|L7LJF7F-7|L7L7F-7FJF--7F7LJLJLJLJJLJFJF7FJ|L---7..|.--J +L7J.FJ|LF7L7LJF-7LJF-7LJL7FJF7F-7|L-7|F-7F7F7L----7LJ|||L7F7F7F7F7L----7F-J|||||F7|LJL|F7|LJLLJ-L-JL7|L-JF-J|L7F7JF-7F--7L-JLJFJF-7FJ777...| +.L|FLJL.||LL--J|L7FJLL--7LJFJLJFJL--JLJ-|||||F7F7FJF7LJL7LJLJLJ|||F7F7FJL7L|LJ|LJ||7F7||LJF7-F7F7FF7||F7FL-7L7LJ|FJFJ|F-JF7F--JFJ7LJLF-7---J +|||LJ..F|L7F7F7F7LJF----JF7|F7FJF--7F7F7LJLJLJLJ||FJL--7|F-----J|||LJLJF7L7L-7L7FJL7||LJF-JL-JLJ|FJLJLJL---JFJF-JL7L-JL--J||F--JF7F7-7J77.F| +LJJ.|.-FJFJ||||||F7L----7|LJ||L-JF7LJLJL-7F--7F7LJL7F--J|L---7F7||L-7F-JL7|F7L7||F-J||F7L7F----7LJF-7F-7F7F7|FJLF-JF------J||-F7|LJL7J|FJ-FJ +FF|-|.|L7L-JLJLJLJ|F77F7LJF-JL---JL----7FJ|F-J||F7F|L7|FJF7F7LJ||L7LLJ-F7||||FJ||L7FJ||L7LJFF7|L--JJ||7LJLJLJL-7|F7L7F7F7F7||FJLJF--JJL|FFJJ +FFJF--F-JF-7F----7|||FJ|F7L----7F-----7|L-JL--JLJL7L7|FJFJ||L-7|L7|F7F7|LJLJ|L7||FJL7||FJFF-JL------J|F----7F-7LJ|L-J|LJLJLJLJF7FJF7..FF7J.| +FF7JJ7L7FJLLJF7F-JLJ|L7||L7F-77LJF--7FJL-------7F-JL|LJFJFLJF7LJ-||||||L--7FJ7||||-FJ|||F7L--7F7F7F7FJL---7LJFJF7L7JFJF7F--7F7|LJ||L7F7|J7.F +J|L.L|JLJJ-FFJLJF7F7L-JLJFJL7|F7FJF7LJ7F7F7F--7||F-7L7FJF7.FJ|LF-J|||||F7FJL7FJ||L7L7||LJL7F-J|LJ||||F----JF-JFJL7L-JFJ|L-7LJLJ-F7L7LJL7FJ-| +FFL7||7|L-F-JF-7|||L--7F-J|L||||L-JL---J||LJF-JLJL7L-JL7|L7L7L7L-7||||||||F-JL7||FJ-|LJF--JL--JF-J|LJL----7|F7L-7L---J.L-7L-----J|FJF-7L7-FF +F|7.J|LFJ-L--J.||||F--JL7F7FJLJL-7|F-7F7LJF7L-7LF7L--7FJL7L7|FJF-J||||LJLJL-7J||||F7|F-JF7F-7F7L--JF------JLJL-7L------7.L7F-7F-7LJFJ-L-J.FJ +L.L-|L7LLFF----J|LJL-7F7|||L----7L-JFJ|L-7|L-7L-J|F--J|F7|FJ|L7|F7LJ||F-7F--JFJLJ||||L-7||L7||L----JF7F7F-7F-7.L------7L-7|||LJJL-7L777|FF-J +.-..-FJJ.FJF--7FJF---J||LJL-7F-7L7F7L7|F7|L-7L7F7|L--7LJLJL-JFJ||L7FJLJFJ|F-7L--7LJLJF7||L7||L-----7|||LJFJL7L7F---7F7L--JLJF7-F77L-JL|LFJJ- +F--|JL7J.L7|F7||FL---7||F7F7|L7L-J|L7|||LJF-J|LJ||F--JF-----7L7LJ-||F-7L7||FJF-7L7F--J||L7|||-F-7F7||LJF-JF7L7||F--J|L7F-7-FJL-JL-7FL7|F-JJ. +LJLJ.LJLF7LJ|LJ|F----J|||LJ|L-JF--JFJLJL-7L--7F7LJL--7|LF7F7L-JF7FJ|L7L-J||L7L7L-JL--7LJFJ||L7L7||LJ|F-JF7||7||||F7F|FJL7L-JF7F---J7||77LL|7 +FF-7.|.F|L7|L--JL7F-7FJLJF-JF--JF--JF7F7FJF--J|L7FF7FJL7|||L7F7|LJFJJL--7||FJFJF-7F--JF7L7LJFJFJ|L7FJL--JLJL-JLJLJL-JL--JF7FJ|L----77.F7--77 +L|FL-J-FL7L-7F-7LLJ|LJF7FL--JF7-L---JLJ|L-JJF7|FJFJLJF-J|||FJ||L-7L-7FF7|LJL7|FJJ|L-7FJL7L-7L7L7||LJF---7F7F7F7F-7F------JLJ7L7F7F7L7..|.L|J +F|FJ.FF77L-7|L7|F7F---J|F77F-JL-7F7F---JF7F7|||L7L7F7L7FJLJL-JL-7L7FJFJ|L-7FJ|L-7|F7|L7FJF7|FJ7|L-7FJF-7LJLJLJLJFJL------7F-7L|||||FJ.7JJFJJ +J-77LL|L---JL7||||L---7LJL7L---7|||L--7FJ||LJ|L7L7LJ|FJ|F-------JFJL7L7L--JL7|F-JLJLJFJL7||||F-JF-JL-J|L-------7L--7F7F--JL7|7LJLJLJF-J|J-.| +JJL--LL-----7LJLJ||F7.L7F7L----JLJL---J|FJL-7L7L7L7FJL-JL7F----7FL-7L7L----7LJ|F--7F7L-7|||||L7FJF7F--7F---7F-7L--7LJ|L--7FJL7F-7JJ.L7LL7.LF +FFL|7-|.F---JF7F7L-JL--J|L7F----------7|L7F7|FJL|FJL-7F-7LJF---JF7.|FJLF7|FJF-JL7FJ||F7|||LJ|FJL7||L-7|L--7LJFJF-7L-7L---JL7FJ|FJ|J|7F.FF|.L +F7||LFFFL-7F7|||L-7F-7F7|FJ|F---------JL7LJ||L7FJ|F7F||-L--JLF7FJ|FJL7FJL7L7L-7FJ|FJ||LJ|L-7||F-J||F-JL---JF7L-JLL-7L------JL-JL7J.7-JL-7|L7 +F|7F-LJF7L|||||||FJ|FJ||||FJL-7F7F-7-F77L-7||FJL7|||FJ|F7F--7||L7|L7FJ|F-JFJF-JL7|L7|L7FJF7|LJ|F7||L-7F7F--JL-----7L7F7F-7F7F---JLF|.F|LFJF7 +.LL--J7|L-J|||LJFJFJL7|||LJF--J|LJJL7|L7F7|||L-7|||LJFJ|||F-J||FJ|FJL7|L7FJFJF-7|L7|L7|L7|LJF-J|||L7|LJLJF--------J-LJ||7LJ|L---7L7LF.|.J.L7 +|JJJ.J7L-7FJLJFLL7|F-J|||F7L--7|F---J|FJ|||||F-J||L-7|7||||F7||L7||F-JL7||FJ-|FJ|FJ|FJL7|L7FJF7|||FJF7|F7L------7F---7|L--7|F-7FJFF7--7-L7J| +|JFF|.FLLLJLF-7F7|||F-JLJ|L---J|L7F-7|L7|||LJ|F7||F7|L7|||LJ|||FJ||L7F7||||F-J|FJL7||F7|L7||FJ|||||FJ|FJ|F-----7LJF--JL-7FJ|L7LJFFJ||FJ--.F| +|LJJ-LJ7|LJ|L7|||||||F---JF7F--JJ||.|L7||||F-J|LJ||||F|||L7FJ|||FJ|-||LJ||||-FJL-7|||||L7LJLJFJ||||L7||.|L-7F7F|F7L----7LJ-L7L---JFJJ7.|L|7| +F7J|.|JFL|JFF|LJLJ|||L7F--JLJF7F7||FJFJLJ||L-7L-7|||L7||L7||FJ||L7|FJL7FJ||L7L7F-JLJ||L7L---7L7|LJL7|||FJF7LJL7LJ|F7F-7L-7F-JF7F7FJJLF-7-J|L +FJFFFJL-7|JF7|F7F7|||7LJF----JLJLJ|L7L--7LJF-JF-JLJ|FJ|L7|||L7||7LJL7FJ|FJL7|FJL---7||FJF7F7|FJ|F--J|LJL7||F-7|F7LJ|L7L--JL--JLJ||J-FF7L.FJ7 +|LF.L-7J-J-|LJ|LJ||||F--JF7F7F7F7FJJL7F7L-7|F7L---7|L7L7|LJ|FJLJF7F7||L|L-7|||F----J||L7|||||L7|L7F7L--7|||L7|LJL-7|FJF------7J.LJ7FJLJ|-FLJ +L||L7.7F77.L-7|F7||||L---JLJ||||||F--J|L7FJ||L7F-7|L7L7||F-J|.F-JLJLJL7L7FJ|||L--7F7||FJ|LJ|L7||FJ|L7F7|LJ|FJL-7F-JLJFJF-7F-7|JF.|JL-FLL.L-7 +FLL.|-|LF----JLJ|||||F------J|LJ||L7F7L7|L7LJ.||L|L7|FJLJ|F7L7L--7F--7|FJL7LJL7F7LJ|||L7L-7L7|LJL7|FJ|||JFJL-7FJL7F--JFJFJL7|L77-L-JF-J|--L7 +|7|F--LJL-7F7F7FJ||LJL----7F-JF-J|FJ|L7|L7L-7FJL7|FJLJ-LFJ|L7L-7FJL7F||L-7L-7||||F7|LJ7L7FJFJL7F7||L7||L7L7F-JL7FJ|F--J-|F-JL-J|FLJ7FJFJ.L|| +|--F7FJ.|LLJLJLJJ||F------JL7FJF-JL7|FJ|FJF-JL7FJ||-F7-FJFJFJF7||F7|FJ|F-JF-JFJ|||LJF7F7|L7L7FJ|LJ|FJ||FJFJL7F-JL-JL-7F7LJ-L|-FL7J-7|L|.|F-. +7.F-J-JFF-J.|||--LJL------7FJ|FJF--J|L7|L7L--7LJ7|L7|L-JFJ.L7|||||LJL7|L-7L-7L-J|L-7|LJ|L7|FJL7L7FJL7|LJLL7FJ|F-7F7F7LJL7||FJ-L.7J|LFF7-LJ-| +FLJJ7|FJJ7.LLJF--|LF------J|LLJLL-7FJ|||FJF7FJ|F-JFJL-7FJ.FFJ|LJ|L7F7LJF7L7FJF--JF-J|F-J.||L7FJ.LJ|FJL7FF-J|LLJ|||||L7F7L77|J7|7L77-FJJ|.J.| +FJJL-7-J.77FJF7|FLFJF-7F7F7L-7F---J|F-J||FJLJF-JF7|-F-JL-7FJFJF-JFJ|L--JL-JL7L7F7L--JL--7LJFJ|.F--7L-7L7|F7L---7||||J||L7L7|J-|F7.LL-J.|7|FJ +F7FF-J|F--.L7-LF|-L7|.LJLJ|F7|L7F7FJ|F7||L--7L-7||L7L-7F-JL7|FJF7L7L--7F--7FJL|||F7F7F-7|-FJFJFJF7L--JFJLJL7F7FJLJLJFJL7L-J-7J|-77|7|.FL7JJ. +|--7LL|JFL-.77..LFLLJF7F--J|LJ.LJ|L7||||L-7FJF-J||FJF-JL--7|||FJL-JFF7LJF-JL-7||||LJ|L7|L7|FJ7L7|L7F7FJF---J||L-7F7FJF7L-7|7J..F77LL--|F-.FL +LL|L..7--J|F|7.L|LLF-JLJF-7L-77F7L-JLJ|L7L||7L7FJ|L7L7F7F-J|||L--7F-JL--JF7F7||||L-7|FJL7||L7F7||F|||L7L-7F7||F7LJ|L7||F7L77FJ-J.L-L-JL7--7J +7F--L7L7|.FJL|7-JFLL-7F7L7L7FJFJL-----JFJFJL-7|L7|FJLLJ||F-J||F-7||F7F7F7|LJLJ||L7FJLJF7||L7LJ|LJFJ|L7L7FJ||||||F7L7||||L7L7-|.LL-7-L.F|FJJ| +F|7FFJJ77F7-F7|FJJJ||||L-J||||L7F7F--7FJ|L7F7|L7|||-F--J|L7FJ|L7LJLJLJLJ|L---7||FJL-7FJ|||FJF7|F-JFJJL7||FJ|||||||FJ|||L7L-JFJ-L-7..|7FJL--J +-F-L|7LJL-J-LF|-J-F-L||F---JL7FJ|||F-J|.F7||LJFJ|||FJF-7|FJ|LL7L7F7F----JF7F7||||F-7LJFJLJ|FJLJL7FJ.F7LJ||FJ||||||L7LJL7L-77JJ|L||-LL-FJF.FJ +||F||7|.-..LFJL7.L-.LLJ|F-7F-JL7|LJL-7L7|LJL7FJFJLJL7|FJ|L7L7-L7||LJF-7F7|LJLJ|||L7L7FJFF-JL-7F-JL-7||F-J|L7|LJ|||FJL|L|F7L7.FF-JF.L|LJ7JFL. +--FJ77J||J.F7L-L-7F7JF7||JLJ7LFJL7F--JFJL-7FJL7|7FF-J||FJFJFJF-J||F7|JLJ|L---7|||FJ-LJF7L-7F-JL7F-7LJ|L7FJL||F7LJLJ|.|FJ|L-J7FJF7.F-F7J--||7 +FFFJ.|--L.7.|.|.FLJ-F|LJL-7J|JL--JL7F7L--7||F-JL7FJF7||L7L7|JL-7|LJLJF--JF7F-JLJ|L----JL7FJL7LFJL7|F7|FJ|LFJLJL-----7-L-JJ|.F|LL77J.JJ7J-|J7 +FF.F|J..|7F7FFFFJ|J-LL7F--JL-JLF---J||F-7|LJ|F7FJL-JLJ|FJ-||F--J|7F7FL7F7||L77-FJF---7F7|L--JFJF7|||LJ|FJFJF7F7F----J.||FLL-7J|LJF77|.|-FJ-L +7L-L7FF7-F7F---JFJF-JLLJ-JLFJJL|F-7FJ|L7|L-7|||L--7-F-JL7FJ|L7F7|FJL--J|||L7L-7L7L--7|||L7|LLL7|LJ|L-7||LL-J|||L-7J7|7J-F.JF|-FJ-F7-J-L-|J|| +J77F|-LJ|LFLJ|J.-JFL7.|L7..J7F.LJFJL7|FJ|F-JLJ|F-7L7L--7|L-JFJ|||L7F7F7|LJFL7FJF|F--J||L-J--FFJL-7L--JLJJL|L|||F7|F|7.|L77-F7-J.FJ.F.FJJ|FL| +L7-F|.L-J7|LFJJFJ|7L7-F-J7F-J77.FJF7|||FJL--7FJL7L-JL|7|||F-JFJ||FJ|LJ|L--7FJ|FFJL7|7LJJJJ|F-L7F-JJL|J|J7||.LJLJLJ-JF-F7J7|L|JL--F7|-J7F77|| +FL-J.FLJF-7JJ|FL7J-J|L|-FJ|J..LFL-JLJLJ|F7F7||F-JJ.L|FFJ|FJF7|FJ|L7L-7|F7FJL7L7L-7L--7-|-FFJJ-LJJJ-LLFF.77|-.L|.LF|-L7J|7L-7J7.JJL7||L-.J-J7 +L..|FJJ.FJ|7L-J|L|F-7.F-J.--77F.L|7||LFJ|LJLJLJJ.|7-J|L-JL7||||FJL|F7|||LJF7L7L7FJF7FJ-L--J.|.L-J7F7J.J7|LLLJ-LJFJJLLJF-|-FJ||J|||.|-JFFJ.|| +FJ.77JF---JJ||.7-F|-|7LJJ..FL7L7----J||FJLJ|-|-|.LF7-LLJ7FLJLJ|L7FJ||||||FJL-JFJ|FJLJJ77.LLLJ.LFF-JJ.F.|L.LJ|-LF-JJ.LJ7.L-7.|..LLJF7FL|-7|L- +LF7.F.|.LF7FL--L7LJ7.L7J.7.|.F-F.|LJLFLJ7LLJLJ7|.LJ7|||7FJFLF-JFJL7|||LJ-L-7F-J-||JJJF--7.LL.F.F|FJ.FL7|.-77|7.7.-77LL7-L7|F|-F7|FLL7|L|LF7| +.LJ|LJ|7|LF7JJ.L7.--7JL77|.F7J7L--.|.77.L-7J-LFF-FJL7--77-J7L7FJ7.LJ|L7J|FLLJJFL||J|F---LJ-L-7J-JJFF.L-77LF-|J-FLJ|FF.||FJ-|JJ||LFJ.-7L7.FJ7 +|-|||JF-7-7||LJ7J-|7|..F7LFJ7.F7F|.F7.---7||J.|L.F-77L|-|7F7FLJ.L7FLL-JFF7J|-F7L||7LJJ||||||LJ|F7FLFJJJ||7J|.LFFJLL7JFL-7J7L-F||.JF|FJ-|7L|- +|.LFJ-|JLF7-7-||L|||J.FFJ7.|F-7J|7.LL-7|FJF-7F||FF7||7L-|-LJLJLF.F|-|JL--7F77F--||-.LFJ-LL7F-FF.FL--JJ.LJ7-F.F7F7L||.-.FJLF.-J|-FJJL7..J|FFJ +F-|.F7|.FJ7FL-|-7F||L-J|F7F-L7J-7--F7FFLJLFFL7J|7|F-7F|.|LF7|.L|-LLJFJJ..L-JF7|FLJ.F||J||-J.F-JFL.-7|F-JFF7.--JJJFJ|||-|F|L-.FJLLJL7LFF-L|J7 +.FJF|JFFJLL77||L-7LJ77F-||L-|J.||J.L7-7-L--77F7L-J7JL--7L-F-|7-F7LF-L7LFF-J.||7FL|7.F--J7F|.F777-LL7LL.|LF7-LFJLF7|L7|.LJ777F|-7|-FJ-.L7-7|| +F-J-L--|.LFJ-F|-J-----|.LLLJL7-JJ.F-L-7-F---JLJLLLL.7LL|LFJ|L--LL---L7-FJ.L|--L-JLL7L7.LLLJ-FJL|J-LLJL.|.JJLLLJ.LLF.L77LL|-J-|-7JJ..L-7JJ.-J From d471d8f643be124e2581cf735b9c0875690f6c91 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 10 Dec 2023 12:48:20 +0000 Subject: [PATCH 417/479] 2023: d10: ex2: add solution --- 2023/d10/ex2/ex2.py | 162 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100755 2023/d10/ex2/ex2.py diff --git a/2023/d10/ex2/ex2.py b/2023/d10/ex2/ex2.py new file mode 100755 index 0000000..fb8884a --- /dev/null +++ b/2023/d10/ex2/ex2.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python + +import sys +from collections.abc import Iterator +from enum import Enum, StrEnum +from typing import NamedTuple, Optional + + +class Point(NamedTuple): + x: int + y: int + + +class Direction(Enum): + NORTH = Point(-1, 0) + SOUTH = Point(1, 0) + WEST = Point(0, -1) + EAST = Point(0, 1) + + def apply(self, pos: "Point") -> "Point": + dx, dy = self.value + return Point(pos.x + dx, pos.y + dy) + + +class Pipe(StrEnum): + VERTICAL = "|" + HORIZONTAL = "-" + NE_BEND = "L" + NW_BEND = "J" + SW_BEND = "7" + SE_BEND = "F" + + @classmethod + def from_connection(cls, connections: dict[Direction, bool]) -> "Pipe": + assert sum(connections.values()) == 2 # Sanity check + if connections.get(Direction.NORTH, False): + if connections.get(Direction.SOUTH, False): + return cls.VERTICAL + if connections.get(Direction.EAST, False): + return cls.NE_BEND + if connections.get(Direction.WEST, False): + return cls.NW_BEND + if connections.get(Direction.SOUTH, False): + if connections.get(Direction.WEST, False): + return cls.SW_BEND + if connections.get(Direction.EAST, False): + return cls.SE_BEND + assert connections[Direction.WEST] and connections[Direction.EAST] + return cls.HORIZONTAL + + def neighbours(self, pos: Point) -> Iterator[Point]: + deltas: tuple[Direction, Direction] + + match self: + case self.VERTICAL: + deltas = (Direction.NORTH, Direction.SOUTH) + case self.HORIZONTAL: + deltas = (Direction.WEST, Direction.EAST) + case self.NE_BEND: + deltas = (Direction.NORTH, Direction.EAST) + case self.NW_BEND: + deltas = (Direction.NORTH, Direction.WEST) + case self.SW_BEND: + deltas = (Direction.SOUTH, Direction.WEST) + case self.SE_BEND: + deltas = (Direction.SOUTH, Direction.EAST) + + for dir in deltas: + yield dir.apply(pos) + + def go_through(self, pos: Point, prev: Point) -> Point: + for dest in self.neighbours(pos): + if dest == prev: + continue + return dest + assert False # Sanity check + + +Pipes = dict[Point, Pipe] + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> tuple[Point, Pipes]: + start: Optional[Point] = None + pipes: Pipes = {} + + for x, line in enumerate(input): + for y, c in enumerate(line): + if c == ".": + continue + if c == "S": + start = Point(x, y) + continue + pipes[Point(x, y)] = Pipe(c) + + assert start is not None # Sanity check + return start, pipes + + def iter_pipe(cur: Point, start: Point, pipes: Pipes) -> Iterator[Point]: + prev = start + while True: + if cur == start: + break + if cur not in pipes: + break + # Check that the receiving pipe is connected to previous one + if prev not in pipes[cur].neighbours(cur): + return + yield cur + cur, prev = pipes[cur].go_through(cur, prev), cur + # Yield the loop element + if cur == start: + yield cur + + # Return the possible pipes that start can be + def resolve_start(start: Point, pipes: Pipes) -> Pipe: + # Returns the direction which closes the loop, if there is one + def explore(dir: Direction) -> Optional[Direction]: + points = list(iter_pipe(dir.apply(start), start, pipes)) + if len(points) == 0: + return None + penultimate, last = points[-2], points[-1] + if last != start: + return None + return Direction(Point(penultimate.x - last.x, penultimate.y - last.y)) + + res: set[Pipe] = set() + for dir in Direction: + if (resulting_dir := explore(dir)) is None: + continue + res.add(Pipe.from_connection({dir: True, resulting_dir: True})) + assert len(res) == 1 # Instructions say there is exactly one loop + return res.pop() + + def loop_points(start: Point, pipes: Pipes) -> list[Point]: + return list(iter_pipe(next(pipes[start].neighbours(start)), start, pipes)) + + def shoelace_area(points: list[Point]) -> int: + # Must be integer because pipes follow the grid, and can't cut squares in half + return ( + sum( + (points[i - 1].x * points[i].y) - (points[i].x * points[i - 1].y) + for i in range(len(points)) + ) + // 2 + ) + + start, pipes = parse(input) + pipes[start] = resolve_start(start, pipes) + loop = loop_points(start, pipes) + area = abs(shoelace_area(loop)) + # len(loop) must be pair, because it's a *loop* + return area - len(loop) // 2 + 1 # Using Pick's formula + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 9168b6850ddc90d213ad2eb832622b22ed011688 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 11 Dec 2023 07:05:49 +0000 Subject: [PATCH 418/479] 2023: d11: ex1: add input --- 2023/d11/ex1/input | 140 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 2023/d11/ex1/input diff --git a/2023/d11/ex1/input b/2023/d11/ex1/input new file mode 100644 index 0000000..264f0a7 --- /dev/null +++ b/2023/d11/ex1/input @@ -0,0 +1,140 @@ +..#..........#................................................#............................................................................. +...................................#............................................#..........................#............................#... +......................................................................#.............................#....................................... +........#...................................#..................................................................................#............ +.................#.........#..........#...............#........................................#.................#.......................... +.................................#..............#...................................#....................................................... +#.........................................................................#...............#............................#.................... +.......................#........................................................#........................................................... +.......#.........................................................#................................#.................................#....... +..................#...............................#...........................................................#............................. +...........#.................................#..............#................................................................#...........#.. +..........................#........#........................................................................................................ +.#..................................................................#................#.................#.................................... +......................#.........................#.....................................................................................#..... +..........................................#....................#..............#....................#........................................ +.........................................................................................#.........................#.....#.................. +..............#............................................................................................................................. +..........................................................................................................#........................#........ +.....#.........................#.............#....................#.......#........#........................................#............... +..........................#...........#...............................................................#..................................... +...................#...........................................................................#................#........................... +#............#........................................#................................................................................#.... +......................................................................................................................#.........#........... +........................................#................................................................................................... +...#............#........#...........................................................#...................................................... +.............................................#.............................................................................................. +............#.......#..........................................................................#..................#.....#................... +................................................................................#.........................#....................#.....#...... +.................................................................#.......................................................................... +..........................#...............#.................................................#.................#............................. +#.........#...........................................#............................................#........................................ +.....................#................#................................#.................................................................... +.....................................................................................#.....................#............#................... +............................................................................................................................................ +.............................#..........................................................................................................#... +.................#..................#......#......#............................#......................#..........#...........#.............. +.......#.................#...........................................#...................................................................... +......................................................................................#..................................................... +...#....................................................#......#..................................#......................................... +............#........#.........#..............#.........................#....................................#.............................. +.......................................................................................................#................#.....#............. +..............................................................................................#............................................. +....................................................................................#..............................#......................#. +#.............#.........#..................#.............................................#...........................................#...... +.............................#......#...........#.........#...................#............................................................. +.......#...........................................................................................#.....#.................................. +...................#........................................................................................................#.....#......... +....................................................#..................#.................................................................... +.................................#............................#............................................................................. +.......................#.................................#...........................................................................#...... +........................................#..........................................#............#...............#........................... +.........................................................................................#.................................................. +.............................................#......................#....................................................................... +..........................#...........................................................................#.........................#........... +............................................................................................................................................ +...........#....................................................................#......#.................................................... +....................................................................................................................#......................# +...............#........................#....................................................#.............................................. +.....#.........................................#................#........................................................................... +.......................#.............................................#................................#..................#.........#........ +#.........#.........................................#..........................#........#.......................#........................... +..............................#............................................................................................................. +.....................................#....................................................................#.....................#........... +..............................................................#.............#............................................................... +..#......................................................................................................................................#.. +.................#.........#........................................................#....................................#.................. +................................#.......................#.......................................#........................................... +..........................................#.....#...................................................................#....................... +......#......#.........................................................................................#......................#............. +......................................#..............#...................................................................................... +..................#...........#.................................#........................................................................... +..#.......#............................................................................#...................................................# +......................#..................................#..............#................................................................... +..........................................................................................................................#................. +.................................#.........#....................................................#........................................... +............................................................................................................................................ +....................#...............................................................................#....................................... +.#...................................#..........#........................................................................................... +.......#..............................................................#.................................#................................... +.............................#...........#.....................#.................................#.............................#............ +.......................#....................................................................#...................#......................#.... +.............#.....................#.................#..........................#....................................#...................... +...........................................................................#............#...........#..............................#........ +..........................................................................................................................................#. +.#..............................#........................................................................................................... +.............................................#............#...............................................#................................. +...............#.......#..........................#.................#.......................#...........................#................... +...............................................................................#.................................................#.......... +.........#..............................#..............................................................#......#............................. +............................................................................................................................................ +................................................#........................................#.................................................. +.........................................................................#......................#.....................................#..... +...........#......#..........#......................#......................................................................#................ +..........................................................#...................#.....#.......#.....................#......................... +......................................#..................................................................................................... +........#................................................................................................................................#.. +......................#........................#................#....................................#........#............................. +..#.......................................#.......................................................................................#......... +..............#............................................................................................................................. +.........................................................................#.................................................................. +.........................#..........#........#........................................#..................................................... +.....#..................................................#..................................................................................# +..............................#................................#..............#..............#................#............#................ +........................................................................................................#.............#.........#........... +.#.............#.......................................................#.................................................................... +.......................................#.................................................................................................... +.......................#..........................#.......#................................................................................. +.......#........................................................................#........................................................... +............................#........................................#................................................................#..... +..........................................#..........#........................................................#............................. +..............#..........................................................................#.....#..................................#......... +#........................................................................................................................................... +..................................#................................................................#........................#............... +..................................................................#.........................#...............#..........................#.... +.......................................#...................................#..........#............................#........................ +..................#.....#.....#.............#..........................................................#.................................... +...................................................................................................................................#........ +......................................................#.......................................................#............................. +...........#...............#...................#...............#....................#...............#.................#..................... +.........................................#......................................................................................#........... +...............................#.........................................................#......#.................#.....................#... +..#.................................................#....................................................#...............#.................. +........#.............................#..................................................................................................... +..............#.........#................................................#.................................................................. +..........................................#.....................................#....................#.......................#.............. +............................................................................................................................................ +................................#...............#..........................................................#.....#...............#.......... +..#.......#................................................................................................................................. +........................................................................#...............................................#................... +............................#.................................#.........................#..........#........................................ +....................#.............................#.........................................................................#............... +........................................................#....................................#..........#......#............................ +........#................................................................................................................................... +.........................................................................#..........#....................................................... +............#......................#............#.................................................................#.....................#... +.............................#.....................................................................#........................................ +........................................................................................................................#................... +.......#.........#...........................................................................#.........#......#............................. +........................#.............................#..........#...................................................................#...... +...#.................................#........#................................#.....#.......................................#.............. From 396aaf22acaa86ad543ed21abbd41eda20683f8d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 11 Dec 2023 07:05:54 +0000 Subject: [PATCH 419/479] 2023: d11: ex1: add solution --- 2023/d11/ex1/ex1.py | 64 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 2023/d11/ex1/ex1.py diff --git a/2023/d11/ex1/ex1.py b/2023/d11/ex1/ex1.py new file mode 100755 index 0000000..17603d9 --- /dev/null +++ b/2023/d11/ex1/ex1.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python + +import dataclasses +import sys +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +@dataclasses.dataclass +class Expansion: + lines: set[int] + rows: set[int] + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> tuple[list[Point], Expansion]: + res: list[Point] = [] + expansion = Expansion(set(range(len(input))), set(range(len(input[0])))) + + for x, line in enumerate(input): + for y, c in enumerate(line): + if c != "#": + continue + res.append(Point(x, y)) + expansion.lines.discard(x) + expansion.rows.discard(y) + + return res, expansion + + def do_expansion(galaxies: list[Point], expansion: Expansion) -> list[Point]: + new_lines = [0] * len(input) + new_rows = [0] * len(input[0]) + + for i in range(len(new_lines)): + new_lines[i] = new_lines[i - 1] + (i in expansion.lines) + 1 + + for i in range(len(new_rows)): + new_rows[i] = new_rows[i - 1] + (i in expansion.rows) + 1 + + return [Point(new_lines[p.x], new_rows[p.y]) for p in galaxies] + + def dist(a: Point, b: Point) -> int: + return abs(a.x - b.x) + abs(a.y - b.y) + + galaxies, expansion = parse(input) + galaxies = do_expansion(galaxies, expansion) + return sum( + dist(galaxies[i], galaxies[j]) + for i in range(len(galaxies)) + for j in range(i + 1, len(galaxies)) + ) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 73884e99363373b1d7e70f1eca09fd1e8e3e62c0 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 11 Dec 2023 07:06:01 +0000 Subject: [PATCH 420/479] 2023: d11: ex2: add input --- 2023/d11/ex2/input | 140 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 2023/d11/ex2/input diff --git a/2023/d11/ex2/input b/2023/d11/ex2/input new file mode 100644 index 0000000..264f0a7 --- /dev/null +++ b/2023/d11/ex2/input @@ -0,0 +1,140 @@ +..#..........#................................................#............................................................................. +...................................#............................................#..........................#............................#... +......................................................................#.............................#....................................... +........#...................................#..................................................................................#............ +.................#.........#..........#...............#........................................#.................#.......................... +.................................#..............#...................................#....................................................... +#.........................................................................#...............#............................#.................... +.......................#........................................................#........................................................... +.......#.........................................................#................................#.................................#....... +..................#...............................#...........................................................#............................. +...........#.................................#..............#................................................................#...........#.. +..........................#........#........................................................................................................ +.#..................................................................#................#.................#.................................... +......................#.........................#.....................................................................................#..... +..........................................#....................#..............#....................#........................................ +.........................................................................................#.........................#.....#.................. +..............#............................................................................................................................. +..........................................................................................................#........................#........ +.....#.........................#.............#....................#.......#........#........................................#............... +..........................#...........#...............................................................#..................................... +...................#...........................................................................#................#........................... +#............#........................................#................................................................................#.... +......................................................................................................................#.........#........... +........................................#................................................................................................... +...#............#........#...........................................................#...................................................... +.............................................#.............................................................................................. +............#.......#..........................................................................#..................#.....#................... +................................................................................#.........................#....................#.....#...... +.................................................................#.......................................................................... +..........................#...............#.................................................#.................#............................. +#.........#...........................................#............................................#........................................ +.....................#................#................................#.................................................................... +.....................................................................................#.....................#............#................... +............................................................................................................................................ +.............................#..........................................................................................................#... +.................#..................#......#......#............................#......................#..........#...........#.............. +.......#.................#...........................................#...................................................................... +......................................................................................#..................................................... +...#....................................................#......#..................................#......................................... +............#........#.........#..............#.........................#....................................#.............................. +.......................................................................................................#................#.....#............. +..............................................................................................#............................................. +....................................................................................#..............................#......................#. +#.............#.........#..................#.............................................#...........................................#...... +.............................#......#...........#.........#...................#............................................................. +.......#...........................................................................................#.....#.................................. +...................#........................................................................................................#.....#......... +....................................................#..................#.................................................................... +.................................#............................#............................................................................. +.......................#.................................#...........................................................................#...... +........................................#..........................................#............#...............#........................... +.........................................................................................#.................................................. +.............................................#......................#....................................................................... +..........................#...........................................................................#.........................#........... +............................................................................................................................................ +...........#....................................................................#......#.................................................... +....................................................................................................................#......................# +...............#........................#....................................................#.............................................. +.....#.........................................#................#........................................................................... +.......................#.............................................#................................#..................#.........#........ +#.........#.........................................#..........................#........#.......................#........................... +..............................#............................................................................................................. +.....................................#....................................................................#.....................#........... +..............................................................#.............#............................................................... +..#......................................................................................................................................#.. +.................#.........#........................................................#....................................#.................. +................................#.......................#.......................................#........................................... +..........................................#.....#...................................................................#....................... +......#......#.........................................................................................#......................#............. +......................................#..............#...................................................................................... +..................#...........#.................................#........................................................................... +..#.......#............................................................................#...................................................# +......................#..................................#..............#................................................................... +..........................................................................................................................#................. +.................................#.........#....................................................#........................................... +............................................................................................................................................ +....................#...............................................................................#....................................... +.#...................................#..........#........................................................................................... +.......#..............................................................#.................................#................................... +.............................#...........#.....................#.................................#.............................#............ +.......................#....................................................................#...................#......................#.... +.............#.....................#.................#..........................#....................................#...................... +...........................................................................#............#...........#..............................#........ +..........................................................................................................................................#. +.#..............................#........................................................................................................... +.............................................#............#...............................................#................................. +...............#.......#..........................#.................#.......................#...........................#................... +...............................................................................#.................................................#.......... +.........#..............................#..............................................................#......#............................. +............................................................................................................................................ +................................................#........................................#.................................................. +.........................................................................#......................#.....................................#..... +...........#......#..........#......................#......................................................................#................ +..........................................................#...................#.....#.......#.....................#......................... +......................................#..................................................................................................... +........#................................................................................................................................#.. +......................#........................#................#....................................#........#............................. +..#.......................................#.......................................................................................#......... +..............#............................................................................................................................. +.........................................................................#.................................................................. +.........................#..........#........#........................................#..................................................... +.....#..................................................#..................................................................................# +..............................#................................#..............#..............#................#............#................ +........................................................................................................#.............#.........#........... +.#.............#.......................................................#.................................................................... +.......................................#.................................................................................................... +.......................#..........................#.......#................................................................................. +.......#........................................................................#........................................................... +............................#........................................#................................................................#..... +..........................................#..........#........................................................#............................. +..............#..........................................................................#.....#..................................#......... +#........................................................................................................................................... +..................................#................................................................#........................#............... +..................................................................#.........................#...............#..........................#.... +.......................................#...................................#..........#............................#........................ +..................#.....#.....#.............#..........................................................#.................................... +...................................................................................................................................#........ +......................................................#.......................................................#............................. +...........#...............#...................#...............#....................#...............#.................#..................... +.........................................#......................................................................................#........... +...............................#.........................................................#......#.................#.....................#... +..#.................................................#....................................................#...............#.................. +........#.............................#..................................................................................................... +..............#.........#................................................#.................................................................. +..........................................#.....................................#....................#.......................#.............. +............................................................................................................................................ +................................#...............#..........................................................#.....#...............#.......... +..#.......#................................................................................................................................. +........................................................................#...............................................#................... +............................#.................................#.........................#..........#........................................ +....................#.............................#.........................................................................#............... +........................................................#....................................#..........#......#............................ +........#................................................................................................................................... +.........................................................................#..........#....................................................... +............#......................#............#.................................................................#.....................#... +.............................#.....................................................................#........................................ +........................................................................................................................#................... +.......#.........#...........................................................................#.........#......#............................. +........................#.............................#..........#...................................................................#...... +...#.................................#........#................................#.....#.......................................#.............. From 30d45a60216f642bc71c0165e5f7e215e2b98918 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 11 Dec 2023 07:06:10 +0000 Subject: [PATCH 421/479] 2023: d11: ex2: add solution --- 2023/d11/ex2/ex2.py | 64 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 2023/d11/ex2/ex2.py diff --git a/2023/d11/ex2/ex2.py b/2023/d11/ex2/ex2.py new file mode 100755 index 0000000..c9a8fbd --- /dev/null +++ b/2023/d11/ex2/ex2.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python + +import dataclasses +import sys +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +@dataclasses.dataclass +class Expansion: + lines: set[int] + rows: set[int] + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> tuple[list[Point], Expansion]: + res: list[Point] = [] + expansion = Expansion(set(range(len(input))), set(range(len(input[0])))) + + for x, line in enumerate(input): + for y, c in enumerate(line): + if c != "#": + continue + res.append(Point(x, y)) + expansion.lines.discard(x) + expansion.rows.discard(y) + + return res, expansion + + def do_expansion(galaxies: list[Point], expansion: Expansion) -> list[Point]: + new_lines = [0] * len(input) + new_rows = [0] * len(input[0]) + + for i in range(len(new_lines)): + new_lines[i] = new_lines[i - 1] + (1000000 - 1) * (i in expansion.lines) + 1 + + for i in range(len(new_rows)): + new_rows[i] = new_rows[i - 1] + (1000000 - 1) * (i in expansion.rows) + 1 + + return [Point(new_lines[p.x], new_rows[p.y]) for p in galaxies] + + def dist(a: Point, b: Point) -> int: + return abs(a.x - b.x) + abs(a.y - b.y) + + galaxies, expansion = parse(input) + galaxies = do_expansion(galaxies, expansion) + return sum( + dist(galaxies[i], galaxies[j]) + for i in range(len(galaxies)) + for j in range(i + 1, len(galaxies)) + ) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 65cc5b2e7cb86a1a6956635a0023d9ab4e375e85 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 12 Dec 2023 10:23:56 +0000 Subject: [PATCH 422/479] 2023: d12: ex1: add input --- 2023/d12/ex1/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2023/d12/ex1/input diff --git a/2023/d12/ex1/input b/2023/d12/ex1/input new file mode 100644 index 0000000..f598af2 --- /dev/null +++ b/2023/d12/ex1/input @@ -0,0 +1,1000 @@ +??????#?#?#?? 2,2,6 +#?????????#???? 1,3,2,2 +?#??#..#?#???#??#. 5,1,1,4 +#??????#???##??#???? 2,1,3,9 +??.?????.? 3,1 +?.?.?#?##????.?.?# 1,1,3,2,1 +#..?????#.???#? 1,1,1,1,4 +#?#??????#??????. 1,1,8,1,1 +??????.????#?#??. 2,1,6 +?#?????.?..??.#??. 1,2,1,2,1,1 +??.#?.#???.#??? 1,2,1,1,4 +###?.?#??.?#?. 4,4,2 +.?...??#??? 1,1 +????#.?.???#??#?#?. 2,2,3,5 +.??.?#????????? 1,2,1,1,1 +?#.????#????.????# 1,6,1,2 +?#???.?????### 2,1,3,4 +?????#.??# 2,1,3 +??????.?##?#??#????? 3,1,12 +.?..??.????#?? 1,1,3,1 +#.?#?#?..?????.??.. 1,5,5,1 +.???#?.?#?#?? 1,1,4 +???.??#??.?? 3,1 +?????##?#??????????. 1,6,2,1,1 +..??#?????..?## 4,3 +????.#??.# 1,1,1 +????###.???#??.#. 7,5,1 +??#?.#??.?#?.??? 2,2,2,1,1 +.#???#?#...###?##?# 1,4,8 +.?#??.???? 4,1 +#?#?.???#????#### 1,1,4,6 +#?#?.?????##??#???? 1,2,8,1,1 +?####?????.#??? 5,1,3 +??.??.???##?? 1,1,7 +#?#??#??..#??##?? 1,6,1,3 +???????????? 1,1,1,4 +#?????#???.???? 8,1,1,1 +?????.????#?#? 1,1,2,4 +?.##???.?#???? 5,3 +?.??##????????. 7,4 +??#?##???##?????#? 1,9,1,1 +?????.#.???#??.? 4,1,3,1 +?????????.. 4,1 +..#??#?????.# 1,2,1,1 +???.#?.????? 2,1,1,3 +?..?#..??#?. 2,2 +??#????????.???#### 9,1,1,4 +??###?#????##?. 4,7 +.??#??#???.#????# 3,1,1,6 +#??#?.???#?? 4,1,1,1 +?#?##....#?#?#?? 4,5,1 +?.???#?.??? 1,4 +?????????.#???..?## 3,1,1,1,1,3 +?#??#??#??#.??????# 7,2,2,2 +????#????.??# 6,1,2 +#.??.?.?????#????? 1,1,1,5,2 +#.?.?##????#????.?. 1,1,3,3,1,1 +??.?..??..? 2,1,1 +????#?????#.??? 6,1,1,2 +#??#??##?????.#??. 5,5,1,1,1 +?#?????????#??#.??? 4,1,1,1,1,1 +?#??????.? 6,1 +??..??????.#??#?? 1,3,5 +?##??.?#?? 2,1 +##???????#???? 3,3,1,1 +?.??.??????#.##?#? 2,6,5 +.?????#?????.????.? 3,7,2,1 +?.???????.??###????. 1,3,1,7 +.??#????#?? 3,2 +?..???..??? 1,3,1 +.?#?#?#???.#.? 1,3,1,1 +.#?.???#?#?#?#??#??? 1,14,1 +#??.##???????# 2,7,1 +#?????#.?.??.#? 2,3,1,2 +#.???.???#.#? 1,2,2,1 +.???##?###????. 3,6 +#?#????#?.#???.?. 4,3,1,1,1 +?#??.#.#?..? 2,1,2 +?#???.???.????#????# 4,2,4,2 +?????#.?##?#?? 4,6 +.#.?.??????? 1,4,2 +?.??????##???.?#### 1,10,5 +.?.?????????##???? 1,3,1,6 +???#?#??.??#..??? 6,3,2 +?????#?##??.??#?? 9,3 +##????.??#???? 2,2,7 +?#???#???. 3,4 +??#????..????#??#?# 1,3,1,1,7 +.?????#?#?????????.# 1,6,1,2,1 +?#..??.#?.?#???? 1,1,1,6 +?#?.??.???????#? 2,2,9 +????????.???. 5,1,1 +?????????.?##? 1,3,1,3 +??#?????#?????#?? 3,1,8 +??#????.??##???#? 3,2,2,4 +????????????? 7,3 +??.????#???#????##. 1,15 +#???##????.??? 1,7,1,1 +?.?.???#.##?..???#? 1,1,1,1,3,4 +.?#?.?#??##??#???#?? 2,8,2 +????#???.#..??#????? 4,2,1,7 +???..?.??#?#?##??#? 1,1,1,12 +??#?.??.?????.???? 4,2,1,1,3 +??.?#????#??#.?? 2,6,1 +?#??#.?#?????.? 5,7 +#.#??.???. 1,2,3 +##?????#???.#????#? 6,3,2,1,2 +.???.##?.?..?. 2,3,1,1 +.#?#??###?.?###.? 8,4,1 +??????#?#?.#?.??#?.? 8,2,3,1 +??#?#?#?#..????#.# 6,1,1,1,1,1 +??#??.?#???##?#??.. 5,2,6 +?????.????### 2,2,1,4 +????#?????????.. 5,1,1 +?????#.??? 5,1 +#??#????.???#?.##?? 1,3,1,1,2,1 +??.??.???###???.??? 2,1,1,5,1,1 +#???#?##?.?? 3,4,1 +.#????#?.??. 6,1 +#????.???.#??#?#???# 1,1,1,1,1,8 +??????????#?????? 5,2,7 +??.?#????? 2,1,1 +???#?.??##?.????? 4,3,3 +.?????.?.?#? 1,1,1,1 +????????#??#??#???? 1,1,9,2 +??..?..##? 1,3 +.#..???#?.??#???.? 1,2,4,1,1 +??.#?????#???.??? 7,1,1 +?#???#?.?.??#????#? 2,3,4,1,2 +.?#???#??????????# 2,2,2,2,1 +?.?.#????????? 1,1,6 +.#?.??#?????? 2,4,2 +.##.#..??.??.???###. 2,1,1,2,2,3 +????????###??#?##?# 1,1,1,12 +#?#????#.??.??#??? 1,3,1,1,1,2 +?#..???#?.???.???# 1,1,1,3,1,1 +?###??.??#??##? 3,5 +??.#?.?????????.?? 1,1,1,3,2,1 +?.??#??????##????#?? 3,10 +?.#???#???????#??.?# 1,4,1,4,2 +??..#?.???. 1,2 +##?..??#?????#?.? 3,10 +?#??#???????#?? 2,1,2,2 +?##????.???. 2,2 +??.??#????.?????#??? 1,1,1,9 +?.??.?#?##???.???? 1,2,5,1,1,1 +.???????????? 1,5 +#.??.??.???? 1,2,1,3 +??...??#??????? 1,8 +?#??#?#?#?????#??? 10,1,1,2 +?#???.????? 1,2 +????#.?##? 1,4 +#?..#????.?..?????## 2,1,1,1,7 +??????#???#??????.? 1,12,1,1 +.?????.???? 1,1 +??#??#???.??#? 4,2 +??#.?.?.??? 1,1 +.???#?????#### 3,2,5 +????##???..?#?? 1,6,1 +.????#??#???#?... 3,5 +.???#?#??..??#??? 1,3,1,1,3 +###?##??.#????#? 7,7 +?.?.????.?.???? 1,4,1,1 +??..?.?#..?.. 1,2 +.???#?.?#??? 3,1,1 +??.?????????????.?# 2,1,1,1,1,2 +???#?.??????? 3,6 +????.??.?????#?.???? 3,1,1,4,4 +???#?.#???#???.???. 3,7,2 +?#?.?#??#??.? 1,7,1 +??#???#??? 2,2,1 +????#???#????#.#???? 1,12,2 +??##???..???? 5,3 +???#??##?.??.??? 6,1,2 +#.????..## 1,1,2 +.?????#??#?.#?##?? 1,5,1,2,1 +??#?##????.#?##?#??. 4,6 +?.?##???##????#????. 1,12,1 +???????.??#???? 1,1,6 +??#?.???.#??..???? 1,1 +#?#??##???.?#? 3,5,3 +#????##??#?????? 1,8,1,1 +?.??##??#.? 2,1,1 +?..???##??#?? 1,1,2,3 +?#?#?##.???#... 6,3 +??#??#??#?.#?????## 2,1,2,1,5 +.#?##?..#?#??#?? 1,2,3,3 +??#??#??????? 5,1,2 +.????#?.??? 4,2 +#??.##.?.##??? 1,1,2,4 +.???????#?#???.? 2,1,1,4 +?#???#??#?????#.??? 1,1,2,2,1,2 +?.#?????.?????????#. 1,2,1,4,1,2 +?.????#????.?##??? 7,5 +.???#?#?????? 2,1,1,1 +#?#?##???????###? 8,1,5 +.??.????#. 2,1,1 +..?..#?.??? 1,2,1 +?.?.#?#?.?.??.??? 1,1,4,1,2 +???##?.?.#???? 2,2,1,2 +???##.#?#???## 1,2,8 +?.#?.???#?#?#?#.?.? 1,1,6,3,1,1 +???##?.?????? 5,2 +???#.????#??? 1,3,1 +??????????#? 5,1 +??.#???.#?????#?.# 1,1,2,2,3,1 +???#?#?????#???#? 1,3,1,5 +?#????????#????## 1,1,4,2,4 +?????#.??#??#?? 1,1,1,1,6 +.?.#?#.?#??????#?? 1,1,1,3,2,3 +.??#???##?##??. 3,6 +..???#???.??? 2,1 +.????#???. 1,1,1 +????##???.??????? 1,2,1,7 +?????????????#.?. 2,9,1,1 +??#?..??.?? 2,1,1 +??#??#??.?#??# 7,2,1 +#?#???????#?? 1,1,8 +???..#???? 1,2,1 +#??.?????. 2,1,2 +?.???#???????#?#???? 1,6,3,3 +.???#?#?#????#?.?#.. 13,1 +?#???##??#????#?#??? 2,14 +??.????.???????? 1,2,4,1 +.???#?.??????#??#??? 5,6,3,1 +???.##.?#??????#??? 1,2,1,1,5,1 +?.??.????.??#.??# 1,4,1,1,3 +???#????##?.?#?? 3,3,2 +???#???.#?#??? 4,1,3 +?#?#?#?####????#?. 1,14 +??#??????.? 2,3 +??#??????????#. 5,2,1,1 +.?#.?#.??????. 1,1,1,3 +????????????? 1,2,2,1 +#?#??.?#????## 5,3,3 +???#???#?# 4,1,1 +.#?.???????.#. 2,3,1,1 +..????##????#?#?? 7,4 +?#????#?????#?#??? 8,1,1,1,1 +????#??..????. 3,1,2 +??.??.?#.? 1,1,1 +??????.?#.?? 2,1,2,1 +?#??.???#?.?..???? 1,1,2,1,2,1 +???.???.?#???? 1,3 +???.??????..?.? 2,1,3,1,1 +????????#?.#?#????.? 2,1,3,7,1 +..??..#?###??#???.? 1,9 +???#??.#??. 2,2 +??#.???????.? 2,1,1,1 +.???##??.?.??.?? 4,1,2 +??#?#..???#??#???# 2,1,2,4,1,1 +??#???##????#.??? 2,4,4,2 +.?????#?#?? 1,2,2 +#??????#.?????? 2,1,1,1,1 +??????#??.?? 1,1,2 +?..?#.??#?.? 1,2,2,1 +.#??#?#?.? 1,4 +#??#???????.?##? 7,2,2 +?#??.#??##.#.???##? 1,1,1,3,1,6 +??.?.??#?##???????.? 2,1,9,2,1 +.?..#???#?#. 1,1,1,1 +?.?.?????? 1,1 +??##?????.#?#????? 7,8 +??#?###?.?#??#??#?? 7,1,5,1 +???#?#?...#???? 1,4,1,1 +???????####?.?#????? 3,5,5 +??.?.?????#? 1,2,1 +.?????#???#???? 4,4 +.?####???.??# 6,1,1 +???#????.??#?#? 3,1,1,4 +??#???.??.#???# 3,1,1,1,1 +????#??????#? 7,3 +??####?#.??#???#??#? 1,6,1,3,1 +?#?###??.??.?#??. 7,4 +.??.??#??#..? 1,2,1,1 +????.?????.?##??. 3,1,1,5 +????#?????.?. 4,1 +#???.?#?##??..#?# 1,1,6,1,1 +???#?#????????.??.? 1,8,1,1,1 +????????????###?# 6,5 +???#?.??##??.?. 1,2,4,1 +#.?#??????#??? 1,1,5 +????????#????.???# 9,2,4 +??.??#?.#?#? 1,2,4 +??#.????#???#?? 1,1,2,1,4 +????.#?.##? 2,1,2 +.??####..#????#. 6,3,1 +???.??####???? 1,1,4,2 +.???.#?#?#???? 1,9 +??#??..?????.. 4,1,2 +???????#???#.??#. 3,1,3,2 +?..#?#???..#???. 6,3 +.#??#???#?????#??? 1,14 +.?#?#?.???.?#???? 4,3,2,1 +#????#?#?.?#?## 9,1,2 +????????.??#???? 2,3,1,1,4 +??????????????#??##? 2,6,7 +?????.????????.???? 3,6,2 +???.??.?#?? 2,1,2 +?.???#??.?.???? 1,6,1 +?#.#????????#.???? 1,1,3,2,2 +??????##?????????? 1,12 +#????#??#?##?#?.?#?? 1,1,10,1,1 +?#???#????? 1,5,1 +.?.#??##?????. 1,5,1,1 +..?.???#??#?##?? 1,2,5 +.?????#???.???. 1,1,3,1 +.?.?###??#??? 1,7,1 +??????????#??#??##? 4,3,3,1,3 +????#????.??.???? 8,1,1 +.?.????#?#?.????## 6,2 +???.??.????????? 1,1,1,1,4 +??..???.#? 1,1,1 +??.????##.? 2,1,2 +?..#?##????##?##??# 1,1,2,9,1 +.???.#??#?#.#? 2,1,4,1 +??.???????#????? 2,1,1,1,2 +????..##???.?.?. 1,2,2,1,1 +#??#??????#??.##? 5,1,1,1,2 +.????#???? 4,1 +.??#.??.?.?## 2,1,1,2 +??.????#????#?? 1,6 +??#?????#?#????? 1,5,1,3,1 +????..???.? 3,2 +??.?????????##.??#. 11,1,1 +...##?..#.??.???? 3,1,1,2 +????????????. 1,1,1,1 +??.???#??.?.????? 1,1,4,1,1 +#?.#????.##?? 1,2,1,3 +#?.#????????? 1,6,1,1 +?#??????..??#?? 8,1 +?#.?#???#??????#? 2,1,8,2 +?.???.???#.. 1,1,2,1 +.#.??#?.??#?#?? 1,3,6 +..????????.???# 3,1,1,1 +????.?#?.????.????? 1,3,3,1,1,1 +##??#?#???.?..#? 5,1,2,1,1 +?.?.????#. 1,3 +#?#???????. 5,1 +?#???.#?##?? 3,6 +??????.??. 1,1,2 +..????????#.? 1,4 +?#?##?..????????? 4,2,1,3 +.#????.?#.? 1,2,2 +?#?##????? 1,5,1 +????????.?? 1,3 +?####?..??#??? 5,2 +#??#????#??? 4,2,1 +??.?#??##.?? 6,1 +???????##.?.??. 1,3,2,1,1 +?.?#??#..?? 2,1,1 +.#??#??????#??#?? 4,10 +?????#???????? 1,8,2 +?#.?.??????.?# 1,1,2,2 +??????#?#????#?##?# 4,13 +?????#?#?#??.#??##. 1,1,1,4,1,3 +.?????###??#?#.#.?. 1,5,1,1,1,1 +..???..?#..??#?? 2,2,2 +..??????.???##?#? 5,4 +????.?#?.??#?.??##.? 2,3,3,4,1 +??#?..#???????? 2,6,1 +?.##.?..#???##?????? 1,2,1,7,1 +??####??????????.. 6,5,1 +.?#.????### 1,1,4 +?????.?##..?? 3,3,1 +???????????#?????#?? 1,10 +?.#.?.???##??#?#?#?. 1,1,12 +?#?????#???? 1,2,2 +??.?#???.???##?###? 1,3,10 +??#????#??#???#??# 5,1,2,2,1 +.?#??????#?? 2,5 +?##??#???#?#????.??? 11,1 +???????.?.??? 3,3 +?#?#?..#???.??? 1,1,3,1 +?#..?.??#?? 1,1,2 +??#???.??. 4,1 +#?#????????##?????.? 1,5,5,2 +???????#?? 3,1 +.#?.?#???##?????.??? 2,12,1,1 +???#???#???? 1,1,6 +??##?????##?#.??. 5,4 +???#.???#???.?#???? 1,1,5,1,6 +?#???.??#??????. 2,8 +.?#??#?.??????.? 2,1,3 +#??#??##?.? 8,1 +??#??????#.????#..?? 8,4 +#?.????.??? 1,4,1 +???????#?.???#? 6,3 +?#??.??#.??#???# 1,1,1,6 +?#???????#??????? 7,5,1 +??.?.#???? 2,1,4 +????..#??? 1,1,1 +.??..???#..?# 2,1,1,1 +?#.?????????.?#??? 1,4,3,1,1 +??#???##?#?????#??? 9,1,2 +?????.?#.??? 1,1,1,1 +???????#.. 2,2,1 +.#.?#?#?#??#????. 1,9,1 +#??.?#???.#.??? 2,1,1,1,1 +??###?.???# 6,1,1 +???.???#?#???? 2,1,4,1 +.????.?#??.?## 1,2,2,2 +??##??#?#????.? 3,8 +???????#.???? 1,2,1,1 +?#????#?#??.#?# 1,2,1,1,1 +??#.##?.##??? 2,3,2 +???????#????#??##?.? 6,1,7 +?#???.?.#?????#?#??? 3,1,1,3,5,1 +????.????? 1,1,2 +??..#??#?.. 1,4 +?.?#?.???#..?????? 2,4,4 +#?###??#?????#.. 8,1,3 +??#??#????#.#?.. 6,1,2 +???#???#??.??#? 6,1,1 +??..#?###?#??.? 1,9 +??.?#?.??? 3,1 +.#??????.? 1,3,1 +.??##.?#.? 2,1,1 +????#.?.?#?#?##?.?? 4,1,2,4,1 +.##??.??.??? 4,1,3 +???????#??#?#?#?. 7,6 +???..##?#??#?.? 2,5,1,1 +##???.??.?. 4,1,1 +.????###?.##????#. 1,4,2,4 +.?.#?#..?.#??#?. 1,3,1,5 +.##?#????#???#???? 13,3 +##.#???#???#.??# 2,1,6,3 +.??????.??#?.?? 4,1,1 +????#..???? 1,1,2 +?..????.??...???. 1,1,3 +#?#???#?????????# 1,5,3,4 +?????#??.????#??. 5,1,3 +???###?????#????.?# 8,5,1 +#??#?????.??#?? 4,2,2 +?.??????????? 3,1 +?#.?.?#???? 1,3 +?.???????.?.???.? 1,4,3 +?.#????#???.. 1,2,4 +????#?????#?##??#? 1,12,2 +?.??????#????#?? 10,1 +.?..??#????.# 1,2,2,1 +?.???????#. 1,1,3 +??????????????.? 1,3,4,1,1 +??????#???. 1,5 +.#??????#? 3,1,1 +??.????##?.? 1,2,4 +#???#??????#??.#??# 6,1,1,3,1,1 +??#.????.? 3,4 +##??.?#??.?##???#??. 2,2,1,2,4 +.?????.##????????#? 1,12 +?#?.??.????? 1,1,1,1 +.##?#?#???? 2,7 +.#????.?.?#.?.? 5,1,2,1,1 +.??#.?????#.? 2,5 +#?????????##?#??.??? 3,1,1,5,1,1 +??????#????#?##?#? 1,1,1,2,4 +?#?????#.? 2,3 +?????#?.??#? 1,1,1,1 +?????#.??.? 6,1,1 +?.??.???#.#???.?#??? 1,1,1,4,3 +???#?????#???????? 2,1,4,1,3,1 +???#??.?#?? 1,1,2 +????.??#?.? 2,4 +?.##??#?.#???#?? 1,5,1,2 +#?...??.#?.#???? 2,1,1,2,2 +???.??#?.#..? 1,2,1,1 +#?.?#?#??????#?#? 1,1,10 +????????#??#?????? 2,1,4,4 +???##??#??#??.?.?# 9,3,1,1 +?????.??.#??? 3,1,1,1 +?.????#??????#????. 1,4,1,7 +??##??.?????????#?? 6,4,1,1,1 +#????##???.???.?#? 10,2,2 +???.#?????.?? 3,1,1,1 +.???#?##???#? 1,5,1 +??.#.??.??.#?##??.? 2,1,1,1,5,1 +??#?#??#.??????????? 3,2,1,1,7 +?.#?.?#???. 1,4 +???###????.??? 5,3,1 +#?##??????????.? 5,1,2,1 +#???.???#???? 1,1,5 +?#??..?..?#?? 3,1 +??.????????#???.?. 2,3 +?????##??##?.#??? 1,2,4,1,1 +#..??#..?#?????#?? 1,1,1,10 +???#?????????##.?? 1,1,4,1,2,1 +?.??????..#?????#. 1,1,2,7 +??????#?#?#?#? 1,1,7 +?..????#???#??#?? 1,3,1,2,4 +?????????????????# 1,1,1,1,3,3 +???.#????#??????... 6,1 +????.?.?#?##?#?.??? 3,7 +?????.?.?##?? 2,1,1,3 +????.???#?#?#??#???# 1,1,12,1 +##?#.?#??## 4,2,2 +??##?????##??.?#? 10,2 +?.#?#????#..?#??##? 1,3,1,5 +?##?##?????????? 7,6 +????#.#?#????? 4,3,1 +?.#???????#???.# 11,1 +???#????#?.???? 3,3 +?#??????#?#??#??.?? 14,1 +???????????????.?.?. 4,1,1,2,1,1 +#?.???##??.#.?? 2,1,4,1,2 +.##?.?.?.??????.??? 2,3 +###?.???##?# 3,6 +..???##.??.? 5,2 +????????#???.?#??# 2,1,6,2,1 +?.??#??????.... 5,2 +?.??????#?.#????? 3,3,2,2 +?#.???.#?? 1,1,3 +?????#???#?.#.? 1,2,4,1,1 +##??#??.????#.?#? 5,1,2,1 +?#????.??? 1,1,1 +.#?.???###?##?? 1,5,4 +.????#.??.#??#?#??? 1,1,1,6,1 +??.#.?##???#?#?????? 1,1,7,1,1,1 +?.?#...#?????#????. 1,1,2,6 +?#?.#???.?? 1,3,2 +.?#???##?? 2,5 +#????####.#?##.#.?? 9,1,2,1,1 +?.???#?????#.#? 1,1,1,3,1 +.???#????...????# 7,4 +#???.#???##?##?.?#? 1,1,2,6,3 +?.?##????#?????? 1,9,1 +?#????..?? 1,3,2 +??.??????.#? 1,1,2,1 +?????..#??#?????#?# 4,1,8,1 +???????.??????. 1,2 +?##??..#???????.. 4,3,1,1 +??#???..?#???? 4,3,1 +??????????????.????? 1,3,4,1,1,1 +???.#?.?##? 2,1,2 +???.??.??.?#? 3,1,2,2 +?????????? 1,7 +.??????#??#?.?#???. 10,4 +??#???#??#.??????# 10,2,2 +??.??????. 1,2,1 +????.#????? 1,2,1 +??#.#???#.? 1,1,1 +#?#.?????#??.###?? 1,1,7,4 +???#.???#??#?.??? 3,3,2,1 +??#????.?.?##?.. 4,4 +??..????.?#??.# 2,1,1,2,1 +#??#??##???.????. 2,1,4,1,1 +?.#??###?#?.????#?#? 1,6,6 +.??????#??.??####?? 1,4,7 +?.???#??.#?? 1,3,1 +???#??#??.?? 6,1 +?##..???.? 3,1 +?????..#?#?????.? 3,8 +?.?##????#????. 2,4 +?#?#??????. 1,1,2 +.????#???.????. 1,1,1,1,1 +????#??##?.?.?#.. 8,1 +??##?#????#?? 7,2 +?#????###?#??#? 2,9 +????????????#???.?? 1,1,3,8,1 +?.?#??#????#?#?#?. 4,5 +??.??.???. 1,1,1 +.??.??#????.??#..? 2,3,2,2,1 +?###????#..??###.?. 8,4 +??###????????????# 5,1,1,1,1 +..???#??.?? 3,2 +##.???.???#? 2,4 +???#???#.???#? 7,3 +?.???..???#??##.#.? 1,1,8,1,1 +.?#?#??.??? 4,1 +??##?.????? 4,3 +.????.?#..?#.????..? 2,1,2,3,1 +????##??????#? 6,4 +?.??#?????..? 7,1 +?????#?#?..?????? 7,2,1 +.??.??????? 1,2,3 +#?#####??#???#??#?? 11,2,1 +?#??#?????.???? 6,1,1 +?.?????#?#???.? 1,1,6,1,1 +#?????????#??.#.?# 6,1,1,1,1,1 +?#?##??#??.#??#?.# 4,2,1,1,3,1 +??????#??..???##??? 7,4 +#????#???.?.?#?# 1,4,1,1,1 +?#?#???#????. 1,7 +?????###????? 2,5 +#?????.#?.???????? 1,4,1,4,1 +??.???###?##??.??#?# 1,1,8,1,3 +??.?????#? 1,1,4 +????????#?.????#? 1,7,2 +.????.???????#?####? 4,1,9 +??.?#.??.????#??#?? 2,6 +??#?????.???#?#??? 3,1,8 +???.??.???..???.?.. 1,2 +?????#??????### 1,3,1,1,3 +#?.???#??#?????#???. 1,1,2,4,3,2 +??.??#?#??#?#?? 1,5,1,1 +??.?#???#???? 2,2,4 +.?.??#???##.?.??.. 7,1 +???#????#?#.??.?? 4,1,1,1,1 +?????#.?.?#????. 4,4 +???.#?.????###?##??? 1,1,1,1,8 +??????.????##?? 1,1,4 +?????.?#?.????## 1,2,1,4 +?????#??#???? 5,1,1 +.?.???#???#???????? 9,1 +?##????#??#.??? 4,5,1 +??.#?#?#???????#???. 5,3 +????#?#?.?????. 1,5,3,1 +?.#?.#???#?##?? 1,5,3 +.????.??####?#?? 2,1,1,8 +?.??????.????? 1,3 +??#?.?##?.??????.?# 2,4,2,1,1 +?.??#??????#.??.##? 9,2 +??#.?.#?#?# 3,5 +????#.?#???#? 2,1,3,2 +#?????#?..?.#? 1,5,1,1 +.??#?#?#??###?#??.? 1,1,12,1 +##???.?#????#? 5,7 +???#???#??. 1,7 +??????.???. 3,2 +##?????????????.#? 7,2,2,1 +??.??##.????#.??? 3,1 +.#??##?...????? 6,2 +????.??#.????. 4,1,4 +???????..?#. 5,2 +?.?#???.????###???? 3,8 +?#?.??????#.?? 2,7,2 +??????#??#? 1,4 +.??#????###???#?? 2,4,2 +.?#?#?##??#??#??.#?? 6,3,3,2 +?.????????#???##??? 3,5,5 +??????.????? 1,3,2,1 +..????#????##.???#?# 9,5 +##?#?????.???#???? 5,1,2,2,1 +???#.????#????.?##. 1,1,2 +.????????. 3,1 +?#?.?#.#.?????? 3,1,1,1,3 +#??.##?????#?..??..# 1,4,3,2,1 +.??.???????#??? 1,1,6 +??.???#?.? 1,3 +?#?#?????.??#.? 5,2,2 +??#?.??#?#?? 1,5 +??#??###??????.?? 1,11,1 +??.???????## 1,5 +????..??#.???.? 1,1,2,2 +??##????#. 2,3 +?#.?###????# 2,3,1,1 +???#??.????.? 1,2,3,1 +..???..?????#??#? 3,8 +.?.???????.#????#??? 1,2,1,1,1,4 +??.?#?#???????# 1,3,2,1,1 +??#?.#?..? 2,1,1 +?.?.?##.?.#?? 3,2 +.???.???#????????? 2,3,2,3 +????.?#??.?..?????? 1,1,2,1,6 +.?#?#???####??????. 11,1 +#?#???#??????##? 1,1,1,1,7 +#???#???????.?# 9,1,2 +???#???.???? 4,1,1 +#?.?.???????. 1,7 +??????#??#??.? 1,7 +?????????? 5,1 +.??#??????.??? 7,1 +?.##?????? 1,2,2 +#??##???????? 1,4,1,2 +??.#?.#?.??? 2,1,2 +?.?#??????##?#?#... 2,7 +.????#??##?#.????? 1,3,3,1,1,1 +?#?##??#???.?????.?# 11,3,1 +?#.?..???? 1,1,1 +???.??#??###?###.... 1,11 +??#.?????#.#.?? 1,1,1,1,2 +???#?.??#?.?##. 1,3,2,2 +?##..??.#.?????? 2,1,1,4 +?.??.?#?#? 1,1,2 +.##?.?????.? 2,3 +..????##???? 5,1 +???.?#???..#?. 1,4,2 +?????..?#?#?.? 1,1,5,1 +???#????.## 3,2,2 +#??????.#??? 6,3 +.??#?.???# 3,2,1 +???#???#?#.?##?.??. 9,4 +.??..?..#??? 1,1,1,1 +.???#..??#???? 4,1,1,1 +?##??##????.???#.?? 9,1,1,1 +.???#?#??????#?? 6,1,2 +?#??#????? 5,2 +?????#??#???? 1,3,1,1 +?????.???? 1,1,2 +?.?...?#?.?##?.?? 1,3,3,2 +?#????.??#??? 3,5 +?????.#??# 2,1,4 +?#.?##?##?????# 2,2,4,2 +#???????#??????.#??. 10,1,1,1 +?##?#??.????.???## 7,1,1,1,3 +?????...????#??.?. 2,6 +????????#??#?#????? 8,3,3 +##??#??#??#.?#?? 5,2,2,3 +???#?????.?? 1,1,1,1 +#..###??????? 1,4,2 +??.?##??????#?##. 1,13 +.?#?#.???# 4,1,2 +.???#####????? 2,5,1 +???.????.? 1,2,1 +.????#?#??.? 1,1,5,1 +?.##???????.#. 5,1,1 +??.??#.?????.. 1,2,4 +??#??.?.?. 3,1 +#???.??.???????#? 4,2,4,1 +???#??#????????#? 1,12,1 +?#?#??#????##??. 1,4,1,4 +?#?.??.#??.?? 1,1,2,2 +??.#?.??.?#??##????? 1,1,1,2,4,2 +??#?????????.??? 1,2,1,3,3 +??.?.?.???#? 1,1,1,1 +????????#.?? 1,3,2,1 +??.?.?#??.?..?? 1,2 +.???.????#??.?? 1,1,1,1,3 +#????.?#.??.#??.#?# 2,2,1,3,3 +.#????.#?. 1,1,2 +???#.???.????#?? 3,3,4 +#??#?????#???.????? 1,9,1,3 +????????..?#? 1,4,1 +.?#####???.??##???.? 9,6,1 +???##?????#?#.#? 8,1,1,1 +?##???##?.?#?# 8,3 +???#?????? 3,3 +??.?????????????? 1,1,6,1,1 +????#?.???#?#????.? 4,8 +..?#?.????#??? 2,6 +.????#??#???.????#? 5,5 +..??????????? 1,2 +?.???????.. 4,1 +.????????? 3,4 +???????..# 2,2,1 +????#??.????? 5,4 +#??##??.#??#.?.?? 7,1,1,1 +.??????.?#.?.??#. 5,2,3 +.#?#???????.??#?#??? 7,7 +??#??????. 2,2,1 +??????????#? 1,8 +.?#???????# 7,2 +##.???????#?.???.?? 2,9,3,1 +#?..#?.???.# 1,2,2,1 +#?##?????.?#?????. 1,7,2,4 +?##?##?#??..??#?? 10,1,1,1 +??.???#???.??? 1,1,3,1 +.?..?.?.#? 1,1,2 +?#??????????##???? 1,11 +??#?##???#????#??#? 1,8,1,3,1 +.?##?#.???.???.#??? 5,3,3,3 +.??.?.#???? 1,5 +.#?#???#.#.?#?#.?#? 7,1,4,2 +.#?#???????#.#??.??? 3,3,1,1,1,1 +#.??????#?????. 1,8 +??.????#??#?##?#? 1,1,6,5 +??#.???????? 1,1,7 +#?##?##????.??.?? 7,2,1,1 +??????##?#..?.??.? 1,2,4,1,1,1 +???#?.?#??#??.??? 3,7,1,1 +##????????##???.#? 4,7,1 +??#?????.?. 3,3,1 +??#??#?#?#?..?????? 9,2,1 +#?.????.??#.??? 1,4,1,1,1 +?.?????###??#?#???.? 8,6 +????#???..#?###????# 2,4,10 +?#??.##?????????.? 4,6,1,1,1 +??#???#?????? 3,6,1 +#???.?.???????????? 1,1,1,1,1,4 +??????.???#? 1,1,4 +.?#???###.. 2,4 +??#???#???# 6,1,1 +?????#??#??#??? 1,10,1 +.??????????#??? 4,1,3 +.??#??????? 2,2 +??????#?.? 1,3,1 +.????????#?#.?##??. 2,6,1,4 +.????.#????##?..? 1,2,8,1 +???????.#??#.??.### 6,4,1,3 +.????##??????#? 1,8,1 +?.?###?..?? 1,3,1 +?????..?.?#. 4,1,2 +???#???#.#????#?.? 8,6,1 +?.?????????????? 6,5 +..?.##???##?? 1,7 +?#???????? 3,2,2 +?????#??#???##?.?#?? 1,6,3,3 +.??.????#?##???????? 2,1,10,2 +.#??????#.? 3,4,1 +?..?..????.?.#???? 3,1 +??.?#?.??# 1,1,3 +????.????#.??? 1,3 +..???#???.? 5,1 +??.#???.??#??#? 1,1,2,1,5 +.??#????..???? 3,3 +#?#?????#.????? 3,1,1,1,1 +???#.???????#??? 2,3,5 +#?.??.?????????? 2,1,1,4 +?#???.????#?## 3,8 +?.?#?#??..?? 5,1 +.###?.???? 3,2 +???##?#?#..?????## 8,1,5 +??.?#???##?#?. 1,9 +??????#?#.?#? 1,1,1,2 +???##.??##?.??????#? 5,2,3,1,2 +..??##?????. 4,2 +?.?##?.#?????..????? 1,4,1,4,1,1 +?????#.#??#####???# 4,12 +????????#???#?##. 2,6,4 +??##????##????? 2,4 +???????.?#????#???? 6,6,1,1 +.#?#??##??#.??? 1,2,5,3 +???..????????##????? 2,3 +??##?#.?.??# 5,1,1,1 +???#???#?? 1,1,3 +???#??###? 1,1,5 +?.??????#?? 1,5 +#.??##??..???? 1,5,1 +????#?###??.? 7,1 +?????#.?..? 4,1 +#?.###?##? 2,6 +?#???#???##??. 2,8,1 +?#??#.#.???# 2,1,1,2 +#????.#??.?.#?? 2,1,3,1,1 +?.?????#?###?????? 1,9,3 +###?#.??.?? 5,2,1 +?#??..??#??.#???#?? 1,1,5,2,1,1 +??.?.??#?#?#?##?? 1,1,11 +.???#??.?##????.?? 1,3,4,1,1 +????????.?#. 4,1 +??###?#?#?????.??#. 13,1,1 +???#?#?#??.?##??#??? 2,3,2,9 +????????.?????#??? 1,6,1,6 +???.??.??.?#?##?? 1,2,1,5,1 +????????...?? 2,4,1 +##????#?.?.# 4,1,1 +?##??.???##??#???. 2,11 +?.????#???#??? 7,2 +#????##??#.#?##?## 1,1,5,4,2 +?.????..?#???##??.?? 1,2,4,4,2 +????#?????#?????#?# 11,1,3 +??###???????. 5,1,1 +#?????.???????.?? 1,1,6,1 +?.#????????????#??#? 1,2,1,1,1,8 +????#??.?????? 5,1,1 +?#?#?.#???????? 4,1,1,3,1 +#??#?...#? 1,2,1 +??#.???????#?????# 1,1,7,1 +??#???##?##.#??..? 1,6,2,1,1 +?.????????????????#? 1,2,5,2,1 +????.?#????? 1,3,1 +?.????????#?? 5,1 +#?????#???? 1,7 +.??.???##?..? 1,4,1 +..?##.?#????????? 2,10 +??????????.###?# 1,6,3,1 +??#?##?#????##??.#? 1,1,4,1,4,2 +?###.??#??? 4,4 +??????.?### 2,1,3 +.?????...?#???? 5,3,1 +?????.???? 1,2 +????.?##.?? 3,2 +???###??#?#?.???#?? 2,9,2 +??????????#????#?.?# 6,1,1,1,1,1 +?#??????????#?#?? 1,1,3,4 +????#?????.??##..? 8,2 +?#..?#?#.??#?.##? 1,4,2,2 +#?#??.??#. 1,3,3 +#..?.#?????.? 1,1,6,1 +?##?.??.?.#??#?#?? 3,7 +??#.????.???#????? 3,1,5,1 +?#????#????#????..?. 1,4,7,1 +????.????.? 1,2 +???.????????.?#?.. 1,1,1,1,1,3 +???#??..?#??? 3,1,5 +???.?#??#??#.???? 1,1,8,1 +.##?#.??.#??##.??.. 4,5,1 +?####????..????. 9,2 +##????#?#..????#?# 7,1,3,1,1 +??????#??.? 1,4 +?.?#..##??? 2,2,1 +#?##???????#?# 4,2,1,1 +??????????. 4,1,1 +.???##??#?#?#.????# 1,10,1,1,1 +??##??????##?.?? 4,6,2 +?#???##?.?###?# 7,3,1 +#??????.??? 5,1 +#????..#???????.. 1,2,1,3,1 +???#??.??????. 4,6 +?.?##???#?#?????#? 1,3,7,1,1 +##?#??.???? 4,1,2 +?#??.?????? 1,5 +?.??#..#?. 3,2 +#.???#???.??#..? 1,4,2,1 +#??#??#??????????? 8,4,1 +?#?????#???..#. 9,1 +???????..##??? 3,4 +.???.#?##?#? 2,4,1 +.?#??#????#?.. 2,4,1 +?..#?????????##?? 1,2,9,1 +?.#??#??#??#?#?? 1,9,1 +?????.???#??????#?? 3,8,2 +?.???#??#? 1,5 +.??.??#?##.. 1,2,2 +?????.???????? 2,6 +.#?????#?#? 1,1,4 +.?????????#..# 2,7,1 +??#?.????#? 1,1,2 +.??#??#??. 3,2 +???#.????? 1,1,4 +??.?????.?#.##??. 3,1,3 +????????#?? 7,1 +????.?.##?#?#?? 2,1,4,1,1 +?#???#???###??#?.? 3,10 +?.?????#???..#? 1,8,1 +.??.????????? 2,1,2,1 +#.?##???#??#.???? 1,6,2,1 +???.?????#?????? 2,12 +??????#?????. 1,5,1 +??.??#?????.? 1,5,1 +.?#??#??#?#.? 1,6 +#?#?##.??#??.# 6,4,1 +???.?##.?#?????.? 1,3,6,1 +?????????##???? 4,3 +.?.?##???? 1,3,1 +.#????.??.?#?#.? 1,2,1,3 +???#????????.?. 2,1 +???#??.??#??##?.?? 2,1,1,2,2,1 +#???#?????#??#?#. 2,3,9 +#?#??????? 1,4,2 +???.???...# 1,2,1 +???.?..?#??#??? 1,4 +?.#??.?..?.#? 2,1,1 +#?#??..#?.??#???#?.? 1,1,1,2,6,1 +?#??.????#?###.?# 4,1,1,5,1 +??.???.?#???????. 1,1,1,6,1 +?###..??#? 4,3 +#.?????#?#???#? 1,12 +?#..??#.????####?##? 2,3,3,4,3 +#?##?#.??.?.# 6,1,1,1 +?????...?.???? 3,1,2 +???#?????.#?#?? 1,4,3,1 +???..#???.????#? 3,4,2,1 +??#??#.???????? 1,1,1,4 +...###?.?? 3,2 +?.???#?##??#.?#.?? 1,9,1 +?????##???##????# 1,3,8 +?.???????.????#?#??. 1,3,7 +#??#?????#???.?# 5,3,1 +????#????. 6,1 +?##?.?????#??.##???. 4,1,5,4 +?#??.???????.? 2,5 +?.????..#??? 1,4,1,2 +#?#.?????#??? 3,1,1,4 +????.?#????.?.???? 2,1,2,1,1,3 +??##.???#?????????? 4,1,1,2,2,1 +?##?#?.?????. 5,2 +???#?##??#???.#??? 11,1,2 +??..#????#????##.?? 2,3,2,1,2,1 +?????#?..????#.# 2,4,1,3,1 +???.???#?.#????#?.# 1,4,1,1,1,1 +#?#?###..????????.# 3,3,1,3,1 +##?#?#???#??. 6,3 +.???#?##?? 4,4 +??????#?#.?#?? 1,3,1 +#??##?????..?.???? 2,2,2,1,2 +??.?.?????.?#? 1,1,5,1 +??#???#?.??..#?? 1,1,4,1,1 +?????????????#???? 1,1,10 +?#?????.#???#??????? 5,1,7 +?#??????.?#.?#? 8,2,2 +#?.??#??#???#? 2,5,2 +?#??#?..#??#? 5,5 +?#??..?#???. 3,3 +???#?##????????????# 6,1,1,7 +.?#????#?##??#??# 13,1 +??.??##???.???#???? 1,7,8 +?#?#?#??#?#?#?## 5,8 +???#??##?.??##?#.? 6,6 +.??..?#????#??. 1,3,3 +.???#.????#?? 2,1,1,4 +??#??????##?.??#. 3,4,2 +?????..#?# 1,2,3 +.?#?.#????#?.???.?# 3,3,2,1,1,2 +???.??????? 1,1,3 +.?????.?#??# 1,1,5 +???????##???#?? 3,1,4,1,1 +?.?#?????#? 1,1,2 +#??????.#??..?? 3,2,3,1 +?.#?????????##?.???? 1,2,1,8,1 +.??#??.??? 4,1 +??#.?###???? 1,1,5,1 +.????#?#?#?#??#?#?#? 2,7,3,1 +?#???##?#???##???. 2,1,6,3,1 +?#.?.#?#???????#?? 1,3,6 +?#??.?.#??#??#?.#. 3,7,1 +.???#??.??#???. 4,5 +.##.??????#.?# 2,6,2 +?#.???.???. 1,2,1 +#??#???.?????????#?? 6,3,4 +?#?#.?.?#? 3,1,2 From 1ac549afe3785f7ae7950d951ae4ef06f71c0a5d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 12 Dec 2023 10:24:03 +0000 Subject: [PATCH 423/479] 2023: d12: ex1: add solution --- 2023/d12/ex1/ex1.py | 47 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100755 2023/d12/ex1/ex1.py diff --git a/2023/d12/ex1/ex1.py b/2023/d12/ex1/ex1.py new file mode 100755 index 0000000..4e84e37 --- /dev/null +++ b/2023/d12/ex1/ex1.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +import functools +import sys + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> list[tuple[str, tuple[int, ...]]]: + return [ + (record, tuple(map(int, groups.split(",")))) + for record, groups in map(str.split, input) + ] + + @functools.cache + def solve_line(record: str, groups: tuple[int, ...]) -> int: + # Empty string must have no groups left, or it's not a solve + if len(record) == 0: + return 1 if len(groups) == 0 else 0 + # Empty groups must not contain any broken spring, or it's not a solve + if len(groups) == 0: + return 1 if all(c in (".", "?") for c in record) else 0 + # Skip working springs + if record[0] == ".": + return solve_line(record[1:], groups) + # Try with a '.' (and discard it directly), or a '#' for the unknown springs + if record[0] == "?": + return solve_line(record[1:], groups) + solve_line("#" + record[1:], groups) + # We start with a '#', check that the group is long enough + if len(record) < groups[0] or any(c == "." for c in record[: groups[0]]): + return 0 + # And check that we _can_ separate the group from the next one + if len(record) > groups[0] and record[groups[0]] == "#": + return 0 + # Now recurse + return solve_line(record[groups[0] + 1 :], groups[1:]) + + lines = parse(input) + return sum(solve_line(record, groups) for record, groups in lines) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From fa6fcf635b27dade79ac47803961e34fa0969c9c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 12 Dec 2023 10:24:08 +0000 Subject: [PATCH 424/479] 2023: d12: ex2: add input --- 2023/d12/ex2/input | 1000 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1000 insertions(+) create mode 100644 2023/d12/ex2/input diff --git a/2023/d12/ex2/input b/2023/d12/ex2/input new file mode 100644 index 0000000..f598af2 --- /dev/null +++ b/2023/d12/ex2/input @@ -0,0 +1,1000 @@ +??????#?#?#?? 2,2,6 +#?????????#???? 1,3,2,2 +?#??#..#?#???#??#. 5,1,1,4 +#??????#???##??#???? 2,1,3,9 +??.?????.? 3,1 +?.?.?#?##????.?.?# 1,1,3,2,1 +#..?????#.???#? 1,1,1,1,4 +#?#??????#??????. 1,1,8,1,1 +??????.????#?#??. 2,1,6 +?#?????.?..??.#??. 1,2,1,2,1,1 +??.#?.#???.#??? 1,2,1,1,4 +###?.?#??.?#?. 4,4,2 +.?...??#??? 1,1 +????#.?.???#??#?#?. 2,2,3,5 +.??.?#????????? 1,2,1,1,1 +?#.????#????.????# 1,6,1,2 +?#???.?????### 2,1,3,4 +?????#.??# 2,1,3 +??????.?##?#??#????? 3,1,12 +.?..??.????#?? 1,1,3,1 +#.?#?#?..?????.??.. 1,5,5,1 +.???#?.?#?#?? 1,1,4 +???.??#??.?? 3,1 +?????##?#??????????. 1,6,2,1,1 +..??#?????..?## 4,3 +????.#??.# 1,1,1 +????###.???#??.#. 7,5,1 +??#?.#??.?#?.??? 2,2,2,1,1 +.#???#?#...###?##?# 1,4,8 +.?#??.???? 4,1 +#?#?.???#????#### 1,1,4,6 +#?#?.?????##??#???? 1,2,8,1,1 +?####?????.#??? 5,1,3 +??.??.???##?? 1,1,7 +#?#??#??..#??##?? 1,6,1,3 +???????????? 1,1,1,4 +#?????#???.???? 8,1,1,1 +?????.????#?#? 1,1,2,4 +?.##???.?#???? 5,3 +?.??##????????. 7,4 +??#?##???##?????#? 1,9,1,1 +?????.#.???#??.? 4,1,3,1 +?????????.. 4,1 +..#??#?????.# 1,2,1,1 +???.#?.????? 2,1,1,3 +?..?#..??#?. 2,2 +??#????????.???#### 9,1,1,4 +??###?#????##?. 4,7 +.??#??#???.#????# 3,1,1,6 +#??#?.???#?? 4,1,1,1 +?#?##....#?#?#?? 4,5,1 +?.???#?.??? 1,4 +?????????.#???..?## 3,1,1,1,1,3 +?#??#??#??#.??????# 7,2,2,2 +????#????.??# 6,1,2 +#.??.?.?????#????? 1,1,1,5,2 +#.?.?##????#????.?. 1,1,3,3,1,1 +??.?..??..? 2,1,1 +????#?????#.??? 6,1,1,2 +#??#??##?????.#??. 5,5,1,1,1 +?#?????????#??#.??? 4,1,1,1,1,1 +?#??????.? 6,1 +??..??????.#??#?? 1,3,5 +?##??.?#?? 2,1 +##???????#???? 3,3,1,1 +?.??.??????#.##?#? 2,6,5 +.?????#?????.????.? 3,7,2,1 +?.???????.??###????. 1,3,1,7 +.??#????#?? 3,2 +?..???..??? 1,3,1 +.?#?#?#???.#.? 1,3,1,1 +.#?.???#?#?#?#??#??? 1,14,1 +#??.##???????# 2,7,1 +#?????#.?.??.#? 2,3,1,2 +#.???.???#.#? 1,2,2,1 +.???##?###????. 3,6 +#?#????#?.#???.?. 4,3,1,1,1 +?#??.#.#?..? 2,1,2 +?#???.???.????#????# 4,2,4,2 +?????#.?##?#?? 4,6 +.#.?.??????? 1,4,2 +?.??????##???.?#### 1,10,5 +.?.?????????##???? 1,3,1,6 +???#?#??.??#..??? 6,3,2 +?????#?##??.??#?? 9,3 +##????.??#???? 2,2,7 +?#???#???. 3,4 +??#????..????#??#?# 1,3,1,1,7 +.?????#?#?????????.# 1,6,1,2,1 +?#..??.#?.?#???? 1,1,1,6 +?#?.??.???????#? 2,2,9 +????????.???. 5,1,1 +?????????.?##? 1,3,1,3 +??#?????#?????#?? 3,1,8 +??#????.??##???#? 3,2,2,4 +????????????? 7,3 +??.????#???#????##. 1,15 +#???##????.??? 1,7,1,1 +?.?.???#.##?..???#? 1,1,1,1,3,4 +.?#?.?#??##??#???#?? 2,8,2 +????#???.#..??#????? 4,2,1,7 +???..?.??#?#?##??#? 1,1,1,12 +??#?.??.?????.???? 4,2,1,1,3 +??.?#????#??#.?? 2,6,1 +?#??#.?#?????.? 5,7 +#.#??.???. 1,2,3 +##?????#???.#????#? 6,3,2,1,2 +.???.##?.?..?. 2,3,1,1 +.#?#??###?.?###.? 8,4,1 +??????#?#?.#?.??#?.? 8,2,3,1 +??#?#?#?#..????#.# 6,1,1,1,1,1 +??#??.?#???##?#??.. 5,2,6 +?????.????### 2,2,1,4 +????#?????????.. 5,1,1 +?????#.??? 5,1 +#??#????.???#?.##?? 1,3,1,1,2,1 +??.??.???###???.??? 2,1,1,5,1,1 +#???#?##?.?? 3,4,1 +.#????#?.??. 6,1 +#????.???.#??#?#???# 1,1,1,1,1,8 +??????????#?????? 5,2,7 +??.?#????? 2,1,1 +???#?.??##?.????? 4,3,3 +.?????.?.?#? 1,1,1,1 +????????#??#??#???? 1,1,9,2 +??..?..##? 1,3 +.#..???#?.??#???.? 1,2,4,1,1 +??.#?????#???.??? 7,1,1 +?#???#?.?.??#????#? 2,3,4,1,2 +.?#???#??????????# 2,2,2,2,1 +?.?.#????????? 1,1,6 +.#?.??#?????? 2,4,2 +.##.#..??.??.???###. 2,1,1,2,2,3 +????????###??#?##?# 1,1,1,12 +#?#????#.??.??#??? 1,3,1,1,1,2 +?#..???#?.???.???# 1,1,1,3,1,1 +?###??.??#??##? 3,5 +??.#?.?????????.?? 1,1,1,3,2,1 +?.??#??????##????#?? 3,10 +?.#???#???????#??.?# 1,4,1,4,2 +??..#?.???. 1,2 +##?..??#?????#?.? 3,10 +?#??#???????#?? 2,1,2,2 +?##????.???. 2,2 +??.??#????.?????#??? 1,1,1,9 +?.??.?#?##???.???? 1,2,5,1,1,1 +.???????????? 1,5 +#.??.??.???? 1,2,1,3 +??...??#??????? 1,8 +?#??#?#?#?????#??? 10,1,1,2 +?#???.????? 1,2 +????#.?##? 1,4 +#?..#????.?..?????## 2,1,1,1,7 +??????#???#??????.? 1,12,1,1 +.?????.???? 1,1 +??#??#???.??#? 4,2 +??#.?.?.??? 1,1 +.???#?????#### 3,2,5 +????##???..?#?? 1,6,1 +.????#??#???#?... 3,5 +.???#?#??..??#??? 1,3,1,1,3 +###?##??.#????#? 7,7 +?.?.????.?.???? 1,4,1,1 +??..?.?#..?.. 1,2 +.???#?.?#??? 3,1,1 +??.?????????????.?# 2,1,1,1,1,2 +???#?.??????? 3,6 +????.??.?????#?.???? 3,1,1,4,4 +???#?.#???#???.???. 3,7,2 +?#?.?#??#??.? 1,7,1 +??#???#??? 2,2,1 +????#???#????#.#???? 1,12,2 +??##???..???? 5,3 +???#??##?.??.??? 6,1,2 +#.????..## 1,1,2 +.?????#??#?.#?##?? 1,5,1,2,1 +??#?##????.#?##?#??. 4,6 +?.?##???##????#????. 1,12,1 +???????.??#???? 1,1,6 +??#?.???.#??..???? 1,1 +#?#??##???.?#? 3,5,3 +#????##??#?????? 1,8,1,1 +?.??##??#.? 2,1,1 +?..???##??#?? 1,1,2,3 +?#?#?##.???#... 6,3 +??#??#??#?.#?????## 2,1,2,1,5 +.#?##?..#?#??#?? 1,2,3,3 +??#??#??????? 5,1,2 +.????#?.??? 4,2 +#??.##.?.##??? 1,1,2,4 +.???????#?#???.? 2,1,1,4 +?#???#??#?????#.??? 1,1,2,2,1,2 +?.#?????.?????????#. 1,2,1,4,1,2 +?.????#????.?##??? 7,5 +.???#?#?????? 2,1,1,1 +#?#?##???????###? 8,1,5 +.??.????#. 2,1,1 +..?..#?.??? 1,2,1 +?.?.#?#?.?.??.??? 1,1,4,1,2 +???##?.?.#???? 2,2,1,2 +???##.#?#???## 1,2,8 +?.#?.???#?#?#?#.?.? 1,1,6,3,1,1 +???##?.?????? 5,2 +???#.????#??? 1,3,1 +??????????#? 5,1 +??.#???.#?????#?.# 1,1,2,2,3,1 +???#?#?????#???#? 1,3,1,5 +?#????????#????## 1,1,4,2,4 +?????#.??#??#?? 1,1,1,1,6 +.?.#?#.?#??????#?? 1,1,1,3,2,3 +.??#???##?##??. 3,6 +..???#???.??? 2,1 +.????#???. 1,1,1 +????##???.??????? 1,2,1,7 +?????????????#.?. 2,9,1,1 +??#?..??.?? 2,1,1 +??#??#??.?#??# 7,2,1 +#?#???????#?? 1,1,8 +???..#???? 1,2,1 +#??.?????. 2,1,2 +?.???#???????#?#???? 1,6,3,3 +.???#?#?#????#?.?#.. 13,1 +?#???##??#????#?#??? 2,14 +??.????.???????? 1,2,4,1 +.???#?.??????#??#??? 5,6,3,1 +???.##.?#??????#??? 1,2,1,1,5,1 +?.??.????.??#.??# 1,4,1,1,3 +???#????##?.?#?? 3,3,2 +???#???.#?#??? 4,1,3 +?#?#?#?####????#?. 1,14 +??#??????.? 2,3 +??#??????????#. 5,2,1,1 +.?#.?#.??????. 1,1,1,3 +????????????? 1,2,2,1 +#?#??.?#????## 5,3,3 +???#???#?# 4,1,1 +.#?.???????.#. 2,3,1,1 +..????##????#?#?? 7,4 +?#????#?????#?#??? 8,1,1,1,1 +????#??..????. 3,1,2 +??.??.?#.? 1,1,1 +??????.?#.?? 2,1,2,1 +?#??.???#?.?..???? 1,1,2,1,2,1 +???.???.?#???? 1,3 +???.??????..?.? 2,1,3,1,1 +????????#?.#?#????.? 2,1,3,7,1 +..??..#?###??#???.? 1,9 +???#??.#??. 2,2 +??#.???????.? 2,1,1,1 +.???##??.?.??.?? 4,1,2 +??#?#..???#??#???# 2,1,2,4,1,1 +??#???##????#.??? 2,4,4,2 +.?????#?#?? 1,2,2 +#??????#.?????? 2,1,1,1,1 +??????#??.?? 1,1,2 +?..?#.??#?.? 1,2,2,1 +.#??#?#?.? 1,4 +#??#???????.?##? 7,2,2 +?#??.#??##.#.???##? 1,1,1,3,1,6 +??.?.??#?##???????.? 2,1,9,2,1 +.?..#???#?#. 1,1,1,1 +?.?.?????? 1,1 +??##?????.#?#????? 7,8 +??#?###?.?#??#??#?? 7,1,5,1 +???#?#?...#???? 1,4,1,1 +???????####?.?#????? 3,5,5 +??.?.?????#? 1,2,1 +.?????#???#???? 4,4 +.?####???.??# 6,1,1 +???#????.??#?#? 3,1,1,4 +??#???.??.#???# 3,1,1,1,1 +????#??????#? 7,3 +??####?#.??#???#??#? 1,6,1,3,1 +?#?###??.??.?#??. 7,4 +.??.??#??#..? 1,2,1,1 +????.?????.?##??. 3,1,1,5 +????#?????.?. 4,1 +#???.?#?##??..#?# 1,1,6,1,1 +???#?#????????.??.? 1,8,1,1,1 +????????????###?# 6,5 +???#?.??##??.?. 1,2,4,1 +#.?#??????#??? 1,1,5 +????????#????.???# 9,2,4 +??.??#?.#?#? 1,2,4 +??#.????#???#?? 1,1,2,1,4 +????.#?.##? 2,1,2 +.??####..#????#. 6,3,1 +???.??####???? 1,1,4,2 +.???.#?#?#???? 1,9 +??#??..?????.. 4,1,2 +???????#???#.??#. 3,1,3,2 +?..#?#???..#???. 6,3 +.#??#???#?????#??? 1,14 +.?#?#?.???.?#???? 4,3,2,1 +#????#?#?.?#?## 9,1,2 +????????.??#???? 2,3,1,1,4 +??????????????#??##? 2,6,7 +?????.????????.???? 3,6,2 +???.??.?#?? 2,1,2 +?.???#??.?.???? 1,6,1 +?#.#????????#.???? 1,1,3,2,2 +??????##?????????? 1,12 +#????#??#?##?#?.?#?? 1,1,10,1,1 +?#???#????? 1,5,1 +.?.#??##?????. 1,5,1,1 +..?.???#??#?##?? 1,2,5 +.?????#???.???. 1,1,3,1 +.?.?###??#??? 1,7,1 +??????????#??#??##? 4,3,3,1,3 +????#????.??.???? 8,1,1 +.?.????#?#?.????## 6,2 +???.??.????????? 1,1,1,1,4 +??..???.#? 1,1,1 +??.????##.? 2,1,2 +?..#?##????##?##??# 1,1,2,9,1 +.???.#??#?#.#? 2,1,4,1 +??.???????#????? 2,1,1,1,2 +????..##???.?.?. 1,2,2,1,1 +#??#??????#??.##? 5,1,1,1,2 +.????#???? 4,1 +.??#.??.?.?## 2,1,1,2 +??.????#????#?? 1,6 +??#?????#?#????? 1,5,1,3,1 +????..???.? 3,2 +??.?????????##.??#. 11,1,1 +...##?..#.??.???? 3,1,1,2 +????????????. 1,1,1,1 +??.???#??.?.????? 1,1,4,1,1 +#?.#????.##?? 1,2,1,3 +#?.#????????? 1,6,1,1 +?#??????..??#?? 8,1 +?#.?#???#??????#? 2,1,8,2 +?.???.???#.. 1,1,2,1 +.#.??#?.??#?#?? 1,3,6 +..????????.???# 3,1,1,1 +????.?#?.????.????? 1,3,3,1,1,1 +##??#?#???.?..#? 5,1,2,1,1 +?.?.????#. 1,3 +#?#???????. 5,1 +?#???.#?##?? 3,6 +??????.??. 1,1,2 +..????????#.? 1,4 +?#?##?..????????? 4,2,1,3 +.#????.?#.? 1,2,2 +?#?##????? 1,5,1 +????????.?? 1,3 +?####?..??#??? 5,2 +#??#????#??? 4,2,1 +??.?#??##.?? 6,1 +???????##.?.??. 1,3,2,1,1 +?.?#??#..?? 2,1,1 +.#??#??????#??#?? 4,10 +?????#???????? 1,8,2 +?#.?.??????.?# 1,1,2,2 +??????#?#????#?##?# 4,13 +?????#?#?#??.#??##. 1,1,1,4,1,3 +.?????###??#?#.#.?. 1,5,1,1,1,1 +..???..?#..??#?? 2,2,2 +..??????.???##?#? 5,4 +????.?#?.??#?.??##.? 2,3,3,4,1 +??#?..#???????? 2,6,1 +?.##.?..#???##?????? 1,2,1,7,1 +??####??????????.. 6,5,1 +.?#.????### 1,1,4 +?????.?##..?? 3,3,1 +???????????#?????#?? 1,10 +?.#.?.???##??#?#?#?. 1,1,12 +?#?????#???? 1,2,2 +??.?#???.???##?###? 1,3,10 +??#????#??#???#??# 5,1,2,2,1 +.?#??????#?? 2,5 +?##??#???#?#????.??? 11,1 +???????.?.??? 3,3 +?#?#?..#???.??? 1,1,3,1 +?#..?.??#?? 1,1,2 +??#???.??. 4,1 +#?#????????##?????.? 1,5,5,2 +???????#?? 3,1 +.#?.?#???##?????.??? 2,12,1,1 +???#???#???? 1,1,6 +??##?????##?#.??. 5,4 +???#.???#???.?#???? 1,1,5,1,6 +?#???.??#??????. 2,8 +.?#??#?.??????.? 2,1,3 +#??#??##?.? 8,1 +??#??????#.????#..?? 8,4 +#?.????.??? 1,4,1 +???????#?.???#? 6,3 +?#??.??#.??#???# 1,1,1,6 +?#???????#??????? 7,5,1 +??.?.#???? 2,1,4 +????..#??? 1,1,1 +.??..???#..?# 2,1,1,1 +?#.?????????.?#??? 1,4,3,1,1 +??#???##?#?????#??? 9,1,2 +?????.?#.??? 1,1,1,1 +???????#.. 2,2,1 +.#.?#?#?#??#????. 1,9,1 +#??.?#???.#.??? 2,1,1,1,1 +??###?.???# 6,1,1 +???.???#?#???? 2,1,4,1 +.????.?#??.?## 1,2,2,2 +??##??#?#????.? 3,8 +???????#.???? 1,2,1,1 +?#????#?#??.#?# 1,2,1,1,1 +??#.##?.##??? 2,3,2 +???????#????#??##?.? 6,1,7 +?#???.?.#?????#?#??? 3,1,1,3,5,1 +????.????? 1,1,2 +??..#??#?.. 1,4 +?.?#?.???#..?????? 2,4,4 +#?###??#?????#.. 8,1,3 +??#??#????#.#?.. 6,1,2 +???#???#??.??#? 6,1,1 +??..#?###?#??.? 1,9 +??.?#?.??? 3,1 +.#??????.? 1,3,1 +.??##.?#.? 2,1,1 +????#.?.?#?#?##?.?? 4,1,2,4,1 +.##??.??.??? 4,1,3 +???????#??#?#?#?. 7,6 +???..##?#??#?.? 2,5,1,1 +##???.??.?. 4,1,1 +.????###?.##????#. 1,4,2,4 +.?.#?#..?.#??#?. 1,3,1,5 +.##?#????#???#???? 13,3 +##.#???#???#.??# 2,1,6,3 +.??????.??#?.?? 4,1,1 +????#..???? 1,1,2 +?..????.??...???. 1,1,3 +#?#???#?????????# 1,5,3,4 +?????#??.????#??. 5,1,3 +???###?????#????.?# 8,5,1 +#??#?????.??#?? 4,2,2 +?.??????????? 3,1 +?#.?.?#???? 1,3 +?.???????.?.???.? 1,4,3 +?.#????#???.. 1,2,4 +????#?????#?##??#? 1,12,2 +?.??????#????#?? 10,1 +.?..??#????.# 1,2,2,1 +?.???????#. 1,1,3 +??????????????.? 1,3,4,1,1 +??????#???. 1,5 +.#??????#? 3,1,1 +??.????##?.? 1,2,4 +#???#??????#??.#??# 6,1,1,3,1,1 +??#.????.? 3,4 +##??.?#??.?##???#??. 2,2,1,2,4 +.?????.##????????#? 1,12 +?#?.??.????? 1,1,1,1 +.##?#?#???? 2,7 +.#????.?.?#.?.? 5,1,2,1,1 +.??#.?????#.? 2,5 +#?????????##?#??.??? 3,1,1,5,1,1 +??????#????#?##?#? 1,1,1,2,4 +?#?????#.? 2,3 +?????#?.??#? 1,1,1,1 +?????#.??.? 6,1,1 +?.??.???#.#???.?#??? 1,1,1,4,3 +???#?????#???????? 2,1,4,1,3,1 +???#??.?#?? 1,1,2 +????.??#?.? 2,4 +?.##??#?.#???#?? 1,5,1,2 +#?...??.#?.#???? 2,1,1,2,2 +???.??#?.#..? 1,2,1,1 +#?.?#?#??????#?#? 1,1,10 +????????#??#?????? 2,1,4,4 +???##??#??#??.?.?# 9,3,1,1 +?????.??.#??? 3,1,1,1 +?.????#??????#????. 1,4,1,7 +??##??.?????????#?? 6,4,1,1,1 +#????##???.???.?#? 10,2,2 +???.#?????.?? 3,1,1,1 +.???#?##???#? 1,5,1 +??.#.??.??.#?##??.? 2,1,1,1,5,1 +??#?#??#.??????????? 3,2,1,1,7 +?.#?.?#???. 1,4 +???###????.??? 5,3,1 +#?##??????????.? 5,1,2,1 +#???.???#???? 1,1,5 +?#??..?..?#?? 3,1 +??.????????#???.?. 2,3 +?????##??##?.#??? 1,2,4,1,1 +#..??#..?#?????#?? 1,1,1,10 +???#?????????##.?? 1,1,4,1,2,1 +?.??????..#?????#. 1,1,2,7 +??????#?#?#?#? 1,1,7 +?..????#???#??#?? 1,3,1,2,4 +?????????????????# 1,1,1,1,3,3 +???.#????#??????... 6,1 +????.?.?#?##?#?.??? 3,7 +?????.?.?##?? 2,1,1,3 +????.???#?#?#??#???# 1,1,12,1 +##?#.?#??## 4,2,2 +??##?????##??.?#? 10,2 +?.#?#????#..?#??##? 1,3,1,5 +?##?##?????????? 7,6 +????#.#?#????? 4,3,1 +?.#???????#???.# 11,1 +???#????#?.???? 3,3 +?#??????#?#??#??.?? 14,1 +???????????????.?.?. 4,1,1,2,1,1 +#?.???##??.#.?? 2,1,4,1,2 +.##?.?.?.??????.??? 2,3 +###?.???##?# 3,6 +..???##.??.? 5,2 +????????#???.?#??# 2,1,6,2,1 +?.??#??????.... 5,2 +?.??????#?.#????? 3,3,2,2 +?#.???.#?? 1,1,3 +?????#???#?.#.? 1,2,4,1,1 +##??#??.????#.?#? 5,1,2,1 +?#????.??? 1,1,1 +.#?.???###?##?? 1,5,4 +.????#.??.#??#?#??? 1,1,1,6,1 +??.#.?##???#?#?????? 1,1,7,1,1,1 +?.?#...#?????#????. 1,1,2,6 +?#?.#???.?? 1,3,2 +.?#???##?? 2,5 +#????####.#?##.#.?? 9,1,2,1,1 +?.???#?????#.#? 1,1,1,3,1 +.???#????...????# 7,4 +#???.#???##?##?.?#? 1,1,2,6,3 +?.?##????#?????? 1,9,1 +?#????..?? 1,3,2 +??.??????.#? 1,1,2,1 +?????..#??#?????#?# 4,1,8,1 +???????.??????. 1,2 +?##??..#???????.. 4,3,1,1 +??#???..?#???? 4,3,1 +??????????????.????? 1,3,4,1,1,1 +???.#?.?##? 2,1,2 +???.??.??.?#? 3,1,2,2 +?????????? 1,7 +.??????#??#?.?#???. 10,4 +??#???#??#.??????# 10,2,2 +??.??????. 1,2,1 +????.#????? 1,2,1 +??#.#???#.? 1,1,1 +#?#.?????#??.###?? 1,1,7,4 +???#.???#??#?.??? 3,3,2,1 +??#????.?.?##?.. 4,4 +??..????.?#??.# 2,1,1,2,1 +#??#??##???.????. 2,1,4,1,1 +?.#??###?#?.????#?#? 1,6,6 +.??????#??.??####?? 1,4,7 +?.???#??.#?? 1,3,1 +???#??#??.?? 6,1 +?##..???.? 3,1 +?????..#?#?????.? 3,8 +?.?##????#????. 2,4 +?#?#??????. 1,1,2 +.????#???.????. 1,1,1,1,1 +????#??##?.?.?#.. 8,1 +??##?#????#?? 7,2 +?#????###?#??#? 2,9 +????????????#???.?? 1,1,3,8,1 +?.?#??#????#?#?#?. 4,5 +??.??.???. 1,1,1 +.??.??#????.??#..? 2,3,2,2,1 +?###????#..??###.?. 8,4 +??###????????????# 5,1,1,1,1 +..???#??.?? 3,2 +##.???.???#? 2,4 +???#???#.???#? 7,3 +?.???..???#??##.#.? 1,1,8,1,1 +.?#?#??.??? 4,1 +??##?.????? 4,3 +.????.?#..?#.????..? 2,1,2,3,1 +????##??????#? 6,4 +?.??#?????..? 7,1 +?????#?#?..?????? 7,2,1 +.??.??????? 1,2,3 +#?#####??#???#??#?? 11,2,1 +?#??#?????.???? 6,1,1 +?.?????#?#???.? 1,1,6,1,1 +#?????????#??.#.?# 6,1,1,1,1,1 +?#?##??#??.#??#?.# 4,2,1,1,3,1 +??????#??..???##??? 7,4 +#????#???.?.?#?# 1,4,1,1,1 +?#?#???#????. 1,7 +?????###????? 2,5 +#?????.#?.???????? 1,4,1,4,1 +??.???###?##??.??#?# 1,1,8,1,3 +??.?????#? 1,1,4 +????????#?.????#? 1,7,2 +.????.???????#?####? 4,1,9 +??.?#.??.????#??#?? 2,6 +??#?????.???#?#??? 3,1,8 +???.??.???..???.?.. 1,2 +?????#??????### 1,3,1,1,3 +#?.???#??#?????#???. 1,1,2,4,3,2 +??.??#?#??#?#?? 1,5,1,1 +??.?#???#???? 2,2,4 +.?.??#???##.?.??.. 7,1 +???#????#?#.??.?? 4,1,1,1,1 +?????#.?.?#????. 4,4 +???.#?.????###?##??? 1,1,1,1,8 +??????.????##?? 1,1,4 +?????.?#?.????## 1,2,1,4 +?????#??#???? 5,1,1 +.?.???#???#???????? 9,1 +?##????#??#.??? 4,5,1 +??.#?#?#???????#???. 5,3 +????#?#?.?????. 1,5,3,1 +?.#?.#???#?##?? 1,5,3 +.????.??####?#?? 2,1,1,8 +?.??????.????? 1,3 +??#?.?##?.??????.?# 2,4,2,1,1 +?.??#??????#.??.##? 9,2 +??#.?.#?#?# 3,5 +????#.?#???#? 2,1,3,2 +#?????#?..?.#? 1,5,1,1 +.??#?#?#??###?#??.? 1,1,12,1 +##???.?#????#? 5,7 +???#???#??. 1,7 +??????.???. 3,2 +##?????????????.#? 7,2,2,1 +??.??##.????#.??? 3,1 +.#??##?...????? 6,2 +????.??#.????. 4,1,4 +???????..?#. 5,2 +?.?#???.????###???? 3,8 +?#?.??????#.?? 2,7,2 +??????#??#? 1,4 +.??#????###???#?? 2,4,2 +.?#?#?##??#??#??.#?? 6,3,3,2 +?.????????#???##??? 3,5,5 +??????.????? 1,3,2,1 +..????#????##.???#?# 9,5 +##?#?????.???#???? 5,1,2,2,1 +???#.????#????.?##. 1,1,2 +.????????. 3,1 +?#?.?#.#.?????? 3,1,1,1,3 +#??.##?????#?..??..# 1,4,3,2,1 +.??.???????#??? 1,1,6 +??.???#?.? 1,3 +?#?#?????.??#.? 5,2,2 +??#?.??#?#?? 1,5 +??#??###??????.?? 1,11,1 +??.???????## 1,5 +????..??#.???.? 1,1,2,2 +??##????#. 2,3 +?#.?###????# 2,3,1,1 +???#??.????.? 1,2,3,1 +..???..?????#??#? 3,8 +.?.???????.#????#??? 1,2,1,1,1,4 +??.?#?#???????# 1,3,2,1,1 +??#?.#?..? 2,1,1 +?.?.?##.?.#?? 3,2 +.???.???#????????? 2,3,2,3 +????.?#??.?..?????? 1,1,2,1,6 +.?#?#???####??????. 11,1 +#?#???#??????##? 1,1,1,1,7 +#???#???????.?# 9,1,2 +???#???.???? 4,1,1 +#?.?.???????. 1,7 +??????#??#??.? 1,7 +?????????? 5,1 +.??#??????.??? 7,1 +?.##?????? 1,2,2 +#??##???????? 1,4,1,2 +??.#?.#?.??? 2,1,2 +?.?#??????##?#?#... 2,7 +.????#??##?#.????? 1,3,3,1,1,1 +?#?##??#???.?????.?# 11,3,1 +?#.?..???? 1,1,1 +???.??#??###?###.... 1,11 +??#.?????#.#.?? 1,1,1,1,2 +???#?.??#?.?##. 1,3,2,2 +?##..??.#.?????? 2,1,1,4 +?.??.?#?#? 1,1,2 +.##?.?????.? 2,3 +..????##???? 5,1 +???.?#???..#?. 1,4,2 +?????..?#?#?.? 1,1,5,1 +???#????.## 3,2,2 +#??????.#??? 6,3 +.??#?.???# 3,2,1 +???#???#?#.?##?.??. 9,4 +.??..?..#??? 1,1,1,1 +.???#..??#???? 4,1,1,1 +?##??##????.???#.?? 9,1,1,1 +.???#?#??????#?? 6,1,2 +?#??#????? 5,2 +?????#??#???? 1,3,1,1 +?????.???? 1,1,2 +?.?...?#?.?##?.?? 1,3,3,2 +?#????.??#??? 3,5 +?????.#??# 2,1,4 +?#.?##?##?????# 2,2,4,2 +#???????#??????.#??. 10,1,1,1 +?##?#??.????.???## 7,1,1,1,3 +?????...????#??.?. 2,6 +????????#??#?#????? 8,3,3 +##??#??#??#.?#?? 5,2,2,3 +???#?????.?? 1,1,1,1 +#..###??????? 1,4,2 +??.?##??????#?##. 1,13 +.?#?#.???# 4,1,2 +.???#####????? 2,5,1 +???.????.? 1,2,1 +.????#?#??.? 1,1,5,1 +?.##???????.#. 5,1,1 +??.??#.?????.. 1,2,4 +??#??.?.?. 3,1 +#???.??.???????#? 4,2,4,1 +???#??#????????#? 1,12,1 +?#?#??#????##??. 1,4,1,4 +?#?.??.#??.?? 1,1,2,2 +??.#?.??.?#??##????? 1,1,1,2,4,2 +??#?????????.??? 1,2,1,3,3 +??.?.?.???#? 1,1,1,1 +????????#.?? 1,3,2,1 +??.?.?#??.?..?? 1,2 +.???.????#??.?? 1,1,1,1,3 +#????.?#.??.#??.#?# 2,2,1,3,3 +.#????.#?. 1,1,2 +???#.???.????#?? 3,3,4 +#??#?????#???.????? 1,9,1,3 +????????..?#? 1,4,1 +.?#####???.??##???.? 9,6,1 +???##?????#?#.#? 8,1,1,1 +?##???##?.?#?# 8,3 +???#?????? 3,3 +??.?????????????? 1,1,6,1,1 +????#?.???#?#????.? 4,8 +..?#?.????#??? 2,6 +.????#??#???.????#? 5,5 +..??????????? 1,2 +?.???????.. 4,1 +.????????? 3,4 +???????..# 2,2,1 +????#??.????? 5,4 +#??##??.#??#.?.?? 7,1,1,1 +.??????.?#.?.??#. 5,2,3 +.#?#???????.??#?#??? 7,7 +??#??????. 2,2,1 +??????????#? 1,8 +.?#???????# 7,2 +##.???????#?.???.?? 2,9,3,1 +#?..#?.???.# 1,2,2,1 +#?##?????.?#?????. 1,7,2,4 +?##?##?#??..??#?? 10,1,1,1 +??.???#???.??? 1,1,3,1 +.?..?.?.#? 1,1,2 +?#??????????##???? 1,11 +??#?##???#????#??#? 1,8,1,3,1 +.?##?#.???.???.#??? 5,3,3,3 +.??.?.#???? 1,5 +.#?#???#.#.?#?#.?#? 7,1,4,2 +.#?#???????#.#??.??? 3,3,1,1,1,1 +#.??????#?????. 1,8 +??.????#??#?##?#? 1,1,6,5 +??#.???????? 1,1,7 +#?##?##????.??.?? 7,2,1,1 +??????##?#..?.??.? 1,2,4,1,1,1 +???#?.?#??#??.??? 3,7,1,1 +##????????##???.#? 4,7,1 +??#?????.?. 3,3,1 +??#??#?#?#?..?????? 9,2,1 +#?.????.??#.??? 1,4,1,1,1 +?.?????###??#?#???.? 8,6 +????#???..#?###????# 2,4,10 +?#??.##?????????.? 4,6,1,1,1 +??#???#?????? 3,6,1 +#???.?.???????????? 1,1,1,1,1,4 +??????.???#? 1,1,4 +.?#???###.. 2,4 +??#???#???# 6,1,1 +?????#??#??#??? 1,10,1 +.??????????#??? 4,1,3 +.??#??????? 2,2 +??????#?.? 1,3,1 +.????????#?#.?##??. 2,6,1,4 +.????.#????##?..? 1,2,8,1 +???????.#??#.??.### 6,4,1,3 +.????##??????#? 1,8,1 +?.?###?..?? 1,3,1 +?????..?.?#. 4,1,2 +???#???#.#????#?.? 8,6,1 +?.?????????????? 6,5 +..?.##???##?? 1,7 +?#???????? 3,2,2 +?????#??#???##?.?#?? 1,6,3,3 +.??.????#?##???????? 2,1,10,2 +.#??????#.? 3,4,1 +?..?..????.?.#???? 3,1 +??.?#?.??# 1,1,3 +????.????#.??? 1,3 +..???#???.? 5,1 +??.#???.??#??#? 1,1,2,1,5 +.??#????..???? 3,3 +#?#?????#.????? 3,1,1,1,1 +???#.???????#??? 2,3,5 +#?.??.?????????? 2,1,1,4 +?#???.????#?## 3,8 +?.?#?#??..?? 5,1 +.###?.???? 3,2 +???##?#?#..?????## 8,1,5 +??.?#???##?#?. 1,9 +??????#?#.?#? 1,1,1,2 +???##.??##?.??????#? 5,2,3,1,2 +..??##?????. 4,2 +?.?##?.#?????..????? 1,4,1,4,1,1 +?????#.#??#####???# 4,12 +????????#???#?##. 2,6,4 +??##????##????? 2,4 +???????.?#????#???? 6,6,1,1 +.#?#??##??#.??? 1,2,5,3 +???..????????##????? 2,3 +??##?#.?.??# 5,1,1,1 +???#???#?? 1,1,3 +???#??###? 1,1,5 +?.??????#?? 1,5 +#.??##??..???? 1,5,1 +????#?###??.? 7,1 +?????#.?..? 4,1 +#?.###?##? 2,6 +?#???#???##??. 2,8,1 +?#??#.#.???# 2,1,1,2 +#????.#??.?.#?? 2,1,3,1,1 +?.?????#?###?????? 1,9,3 +###?#.??.?? 5,2,1 +?#??..??#??.#???#?? 1,1,5,2,1,1 +??.?.??#?#?#?##?? 1,1,11 +.???#??.?##????.?? 1,3,4,1,1 +????????.?#. 4,1 +??###?#?#?????.??#. 13,1,1 +???#?#?#??.?##??#??? 2,3,2,9 +????????.?????#??? 1,6,1,6 +???.??.??.?#?##?? 1,2,1,5,1 +????????...?? 2,4,1 +##????#?.?.# 4,1,1 +?##??.???##??#???. 2,11 +?.????#???#??? 7,2 +#????##??#.#?##?## 1,1,5,4,2 +?.????..?#???##??.?? 1,2,4,4,2 +????#?????#?????#?# 11,1,3 +??###???????. 5,1,1 +#?????.???????.?? 1,1,6,1 +?.#????????????#??#? 1,2,1,1,1,8 +????#??.?????? 5,1,1 +?#?#?.#???????? 4,1,1,3,1 +#??#?...#? 1,2,1 +??#.???????#?????# 1,1,7,1 +??#???##?##.#??..? 1,6,2,1,1 +?.????????????????#? 1,2,5,2,1 +????.?#????? 1,3,1 +?.????????#?? 5,1 +#?????#???? 1,7 +.??.???##?..? 1,4,1 +..?##.?#????????? 2,10 +??????????.###?# 1,6,3,1 +??#?##?#????##??.#? 1,1,4,1,4,2 +?###.??#??? 4,4 +??????.?### 2,1,3 +.?????...?#???? 5,3,1 +?????.???? 1,2 +????.?##.?? 3,2 +???###??#?#?.???#?? 2,9,2 +??????????#????#?.?# 6,1,1,1,1,1 +?#??????????#?#?? 1,1,3,4 +????#?????.??##..? 8,2 +?#..?#?#.??#?.##? 1,4,2,2 +#?#??.??#. 1,3,3 +#..?.#?????.? 1,1,6,1 +?##?.??.?.#??#?#?? 3,7 +??#.????.???#????? 3,1,5,1 +?#????#????#????..?. 1,4,7,1 +????.????.? 1,2 +???.????????.?#?.. 1,1,1,1,1,3 +???#??..?#??? 3,1,5 +???.?#??#??#.???? 1,1,8,1 +.##?#.??.#??##.??.. 4,5,1 +?####????..????. 9,2 +##????#?#..????#?# 7,1,3,1,1 +??????#??.? 1,4 +?.?#..##??? 2,2,1 +#?##???????#?# 4,2,1,1 +??????????. 4,1,1 +.???##??#?#?#.????# 1,10,1,1,1 +??##??????##?.?? 4,6,2 +?#???##?.?###?# 7,3,1 +#??????.??? 5,1 +#????..#???????.. 1,2,1,3,1 +???#??.??????. 4,6 +?.?##???#?#?????#? 1,3,7,1,1 +##?#??.???? 4,1,2 +?#??.?????? 1,5 +?.??#..#?. 3,2 +#.???#???.??#..? 1,4,2,1 +#??#??#??????????? 8,4,1 +?#?????#???..#. 9,1 +???????..##??? 3,4 +.???.#?##?#? 2,4,1 +.?#??#????#?.. 2,4,1 +?..#?????????##?? 1,2,9,1 +?.#??#??#??#?#?? 1,9,1 +?????.???#??????#?? 3,8,2 +?.???#??#? 1,5 +.??.??#?##.. 1,2,2 +?????.???????? 2,6 +.#?????#?#? 1,1,4 +.?????????#..# 2,7,1 +??#?.????#? 1,1,2 +.??#??#??. 3,2 +???#.????? 1,1,4 +??.?????.?#.##??. 3,1,3 +????????#?? 7,1 +????.?.##?#?#?? 2,1,4,1,1 +?#???#???###??#?.? 3,10 +?.?????#???..#? 1,8,1 +.??.????????? 2,1,2,1 +#.?##???#??#.???? 1,6,2,1 +???.?????#?????? 2,12 +??????#?????. 1,5,1 +??.??#?????.? 1,5,1 +.?#??#??#?#.? 1,6 +#?#?##.??#??.# 6,4,1 +???.?##.?#?????.? 1,3,6,1 +?????????##???? 4,3 +.?.?##???? 1,3,1 +.#????.??.?#?#.? 1,2,1,3 +???#????????.?. 2,1 +???#??.??#??##?.?? 2,1,1,2,2,1 +#???#?????#??#?#. 2,3,9 +#?#??????? 1,4,2 +???.???...# 1,2,1 +???.?..?#??#??? 1,4 +?.#??.?..?.#? 2,1,1 +#?#??..#?.??#???#?.? 1,1,1,2,6,1 +?#??.????#?###.?# 4,1,1,5,1 +??.???.?#???????. 1,1,1,6,1 +?###..??#? 4,3 +#.?????#?#???#? 1,12 +?#..??#.????####?##? 2,3,3,4,3 +#?##?#.??.?.# 6,1,1,1 +?????...?.???? 3,1,2 +???#?????.#?#?? 1,4,3,1 +???..#???.????#? 3,4,2,1 +??#??#.???????? 1,1,1,4 +...###?.?? 3,2 +?.???#?##??#.?#.?? 1,9,1 +?????##???##????# 1,3,8 +?.???????.????#?#??. 1,3,7 +#??#?????#???.?# 5,3,1 +????#????. 6,1 +?##?.?????#??.##???. 4,1,5,4 +?#??.???????.? 2,5 +?.????..#??? 1,4,1,2 +#?#.?????#??? 3,1,1,4 +????.?#????.?.???? 2,1,2,1,1,3 +??##.???#?????????? 4,1,1,2,2,1 +?##?#?.?????. 5,2 +???#?##??#???.#??? 11,1,2 +??..#????#????##.?? 2,3,2,1,2,1 +?????#?..????#.# 2,4,1,3,1 +???.???#?.#????#?.# 1,4,1,1,1,1 +#?#?###..????????.# 3,3,1,3,1 +##?#?#???#??. 6,3 +.???#?##?? 4,4 +??????#?#.?#?? 1,3,1 +#??##?????..?.???? 2,2,2,1,2 +??.?.?????.?#? 1,1,5,1 +??#???#?.??..#?? 1,1,4,1,1 +?????????????#???? 1,1,10 +?#?????.#???#??????? 5,1,7 +?#??????.?#.?#? 8,2,2 +#?.??#??#???#? 2,5,2 +?#??#?..#??#? 5,5 +?#??..?#???. 3,3 +???#?##????????????# 6,1,1,7 +.?#????#?##??#??# 13,1 +??.??##???.???#???? 1,7,8 +?#?#?#??#?#?#?## 5,8 +???#??##?.??##?#.? 6,6 +.??..?#????#??. 1,3,3 +.???#.????#?? 2,1,1,4 +??#??????##?.??#. 3,4,2 +?????..#?# 1,2,3 +.?#?.#????#?.???.?# 3,3,2,1,1,2 +???.??????? 1,1,3 +.?????.?#??# 1,1,5 +???????##???#?? 3,1,4,1,1 +?.?#?????#? 1,1,2 +#??????.#??..?? 3,2,3,1 +?.#?????????##?.???? 1,2,1,8,1 +.??#??.??? 4,1 +??#.?###???? 1,1,5,1 +.????#?#?#?#??#?#?#? 2,7,3,1 +?#???##?#???##???. 2,1,6,3,1 +?#.?.#?#???????#?? 1,3,6 +?#??.?.#??#??#?.#. 3,7,1 +.???#??.??#???. 4,5 +.##.??????#.?# 2,6,2 +?#.???.???. 1,2,1 +#??#???.?????????#?? 6,3,4 +?#?#.?.?#? 3,1,2 From 28faa62410369439b40e03a69ffd6811052efa5d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 12 Dec 2023 10:24:13 +0000 Subject: [PATCH 425/479] 2023: d12: ex2: add solution --- 2023/d12/ex2/ex2.py | 57 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100755 2023/d12/ex2/ex2.py diff --git a/2023/d12/ex2/ex2.py b/2023/d12/ex2/ex2.py new file mode 100755 index 0000000..322617b --- /dev/null +++ b/2023/d12/ex2/ex2.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python + +import functools +import itertools +import sys + +Line = tuple[str, tuple[int, ...]] + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> list[Line]: + return [ + (record, tuple(map(int, groups.split(",")))) + for record, groups in map(str.split, input) + ] + + def unfold(lines: list[Line]) -> list[Line]: + return [ + ("?".join(itertools.repeat(record, 5)), groups * 5) + for record, groups in lines + ] + + @functools.cache + def solve_line(record: str, groups: tuple[int, ...]) -> int: + # Empty string must have no groups left, or it's not a solve + if len(record) == 0: + return 1 if len(groups) == 0 else 0 + # Empty groups must not contain any broken spring, or it's not a solve + if len(groups) == 0: + return 1 if all(c in (".", "?") for c in record) else 0 + # Skip working springs + if record[0] == ".": + return solve_line(record[1:], groups) + # Try with a '.' (and discard it directly), or a '#' for the unknown springs + if record[0] == "?": + return solve_line(record[1:], groups) + solve_line("#" + record[1:], groups) + # We start with a '#', check that the group is long enough + if len(record) < groups[0] or any(c == "." for c in record[: groups[0]]): + return 0 + # And check that we _can_ separate the group from the next one + if len(record) > groups[0] and record[groups[0]] == "#": + return 0 + # Now recurse + return solve_line(record[groups[0] + 1 :], groups[1:]) + + lines = parse(input) + lines = unfold(lines) + return sum(solve_line(record, groups) for record, groups in lines) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 7349222bee08b851fa6b3497358e385206f9bb9f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 13 Dec 2023 10:08:30 +0000 Subject: [PATCH 426/479] 2023: d13: ex1: add input --- 2023/d13/ex1/input | 1349 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1349 insertions(+) create mode 100644 2023/d13/ex1/input diff --git a/2023/d13/ex1/input b/2023/d13/ex1/input new file mode 100644 index 0000000..6d7d1e2 --- /dev/null +++ b/2023/d13/ex1/input @@ -0,0 +1,1349 @@ +######..# +.##....#. +.....##.# +.....##.# +.##..#.#. +######..# +#..#..### +.##..#.## +#####.#.# +#..#.##.. +.....###. +#####.... +....##.#. + +##..###.###.. +##.#.#..##..# +..#.#...#.#.# +######.#.#### +##..#.##....# +##.##.#..#.#. +#####....#.#. +###.########. +#######..#.## +..####..##..# +......#.###.. +......#.###.. +..####..#...# + +....#....##..##.. +##.#.....#....#.. +....##...#.##.#.. +..##..#####..#### +###..##..######.. +.....##.#.#..#.#. +.#.#####.##..##.# +###.###...####... +....####.#....#.# + +#.##.#.####.# +.#..#..#..#.. +.####.#....#. +#....#......# +.#..#.#....#. +.##.#.######. +#....######## +#....##....## +########..### +.#..#..####.. +.#..#..####.. +..##....##... +.####...##... +.#..#.##..##. +##..######### + +#.##.#.## +#....##.. +.......## +#....##.. +#....#### +#.####.## +.####.### + +.###.#### +.##.##..# +.###.#### +#....#..# +....#.... +##.##.... +##.###..# +#..#..##. +.#...#..# +....#.... +##.###### +...###.## +#.###.... +##.#.#### +##.#.#### + +......##.## +####..###.. +.##....#.#. +######.#### +######.#### +.##....#.#. +####..###.. +......##.## +.##.##.##.# +...##..###. +....###.##. +#..#......# +....##..... +#####.#.#.. +.....#..##. + +###.....###..## +#.#..#..##...## +..##.#...###.## +..##.#...##..## +#.#..#..##...## +###.....###..## +.##.#...#.#...# +##...#####.###. +##.#...###....# +#.####..#.#.#.. +#.##..###.###.. +#.##..###.###.. +#.####..#.#.#.. +##.#...###....# +##...#####.###. + +..###..#....#.. +##.....#.##.#.. +###....#.##.#.. +###.#..#....#.. +..##.#........# +####........... +..##...##..##.. +##...#.######.# +..#.#.########. +##....#.####.#. +##.#.####...### +##...#.#....#.# +##...##.#..#.## + +##..#..#..##..# +.###....###.#.. +.#...##...#..#. +..##.##.##..... +.#.#.##.#.#.#.# +.....#........# +.#..####..#.##. +####.##.####.## +####.##.####.## + +.#.#..####. +#.####.##.# +..#..###### +..#...####. +..#...####. +..#..###### +#.####.##.# +.#.#..####. +#..#.##..## +#.#.####### +###........ +....##....# +..#.###..## +...#..#.##. +.#.#.##..## + +##...#...##.#.#.# +##.#.......#.#.## +##.#.......#.#.## +##.......##.#.#.# +###....#.##.#...# +.#.#.#..#.###.##. +.#...#..##....... +#..#.#....#.##.## +.#.##...###.#..## +.##.#.#.#.#...### +#...##..#...#.##. +.#.####...#..#.## +.#.####...#..#.## +#...##..#...#.##. +.##.#.#.#.#...### + +.....#.##..##.# +.....#.##..##.# +.##.##.##..##.. +....#..#....#.. +#..#.###....### +##..#.##.##.##. +#...##........# +.#..#.###..###. +..##...#....#.. +#....#.##..##.# +#.##..###..###. + +.##.....#..#. +.##..#.###### +#.#...#...... +.###..#...... +..#..#..#..#. +..#..#..#..#. +.###.##...... +#.#...#...... +.##..#.###### +.##.....#..#. +........####. +.####.##....# +.#.##.#...... +######..####. +.#.##..##..## +....##.#....# +.###.#.###### + +###.#.####.#. +###.#.####.#. +...#.#.##.#.# +###...#..#... +.#.#.#....#.# +##..#..#...#. +..###..##..## +####..#..#..# +#...#......#. +..##..####..# +.#..########. +.#.#.#....#.# +#..####..#### +.#........... +#.#.#.#..#.#. + +#.#.... +#.#.... +#..#..# +..##..# +#...... +#...... +..#.##. +#.#.##. +#.##... +..#.##. +#.#.##. +#.##### +#.##### +.#.#### +##..##. + +.##.....### +#..###.##.# +.##..#.##.. +.....#.#.#. +#..##.#..## +#..##.#..## +.....#.#.#. +.##..#.##.. +#..###.##.# +.##..#..### +#..##..##.# +####...##.# +#..#.#.#.#. +........#.# +....####... +....#.###.# +.##.#.#..#. + +###.######. +...##.##.## +.###.#..#.# +....######. +.#.######## +#####....## +..##..##..# +#.##..##..# +##....##... +.#..#...... +#####....## +##....##... +.##.######. +###..####.. +....#.##.#. +....#.##.#. +###..####.. + +#.####..####.##.. +##..##..##..##.## +.#....##....###.. +###...##...###.## +#.#........#.#.## +.#.##....##.#.### +.#..........#.... +.#..........#.### +##.##.##.##.##### +##..........##### +.#..........#.### +.#####..#####.... +#..##....##..##.. + +#.##.#.#### +.###.###### +#..#....##. +#...####### +##.##..#..# +...#.###### +#.##....... +.#......... +##.####.##. +#..####.##. +.#......... +#.##....... +...#.###### +##.##..#..# +#...####### +#..#....##. +.###.###### + +.#...###... +.....##.### +..#..##.#.. +####....... +..##..#.##. +######.###. +########..# +########..# +######.###. +..##..#.##. +####....... + +##....###.. +###..####.. +..#..#..##. +...##...#.# +.#.##.#.##. +##.##.####. +########.## +..#..#..##. +########.#. +##.##.##... +...##...### +#########.. +...##....## + +#.....###.... +#.##.####.##. +#..#..##..#.. +##...#..#...# +.....#..#.... +####..##..### +..##......##. +##..######..# +##.##....##.# +##.##....##.# +##..######..# + +.####.##.#.#..##. +.....######..#..# +..#..######..#..# +.####.##.#.#..##. +######..##...#### +#..##.#..#.###### +..#....#.##...... +.##.#..###...#### +.....#..#..##.... +##.#..##.###..##. +#..##.#.##.#.#..# +..##.#.##...##..# +####.......#..... +.###.####...##..# +#..#..#.#####.... +###.#.#..###..... +####...######.... + +#####.###...# +##..#.#.###.. +#..#..##..#.# +##...##.#..#. +#####....##.# +.....##...### +#####.#.#.### +#####.#.#.### +.....##...### + +..##### +.#..... +.###### +#..#### +.###### +..#.... +###.... +###.... +##.#### +..#.##. +.#.#### +.###### +.#.#### +#.##### +##..... + +####....#...#.### +.#..#..####.##..# +.##.##.##..#####. +......##.##.##### +###.#.##.#####.## +.####....#...#### +.##.#....#...#### +###.#.##.#####.## +......##.##.##### +.##.##.##..#####. +.#..#..####.##..# +####....#...#.### +####....#...#.### + +###...#..#...## +...#......#.#.. +....#......#... +##..#.####.#..# +##..#.#..#.#..# +##.#.######.#.# +....#.####.#... +..##.#.##.#.##. +##...######...# +###.#..##..#.## +..#..######..#. + +.##..##..##..#### +####.##.####..... +.###.##.###..#### +..#.#..#.#...#### +.............#..# +...######...#.##. +..#.#..#.#..####. + +##.##.#.# +###.#.#.# +###.#.#.# +##.####.# +...#####. +...###### +...#..### +..######. +##...##.# +##...#..# +#####.#.. + +#.###.. +####.## +.#.##.. +....### +.##.... +.##.... +.#..### + +......#....#..... +#..#.########.#.. +.##.##......##.## +....#.######.#.#. +.#..##########..# +#.#..###..###..#. +####..######..### +#.##..#.##.#..##. +#..#..######..#.. +.#.#..##..##..#.# +#.#...#.##.#...#. +.#.##.#.##.#.##.# +.#.##.#.##.#.##.# + +###..## +#....## +###..#. +##..... +..#..## +#....## +#...### +###.### +..##.## +...##.. +...##.. +..##... +##.#... +..#.... +.##.### +###.... +###.... + +####.###..# +.......###. +......####. +####.###..# +###..#.#### +###.#....## +..#.#.....# +###.##.#.## +##.###.###. +####.##.#.. +##..#.#.#.. + +#..##.....##. +.......#..#.# +.##..#...#.## +.##..#...#.## +.......#..#.# +#..##.....##. +.##..#.###### +######.##.... +####...##.... +....#.##.#.## +#.....####... +.##..###..... +#####..#....# + +#..####..#... +####..#####.. +###....###.#. +..#....#..#.. +.#.#..#.#.### +.###..###.... +###########.. +#...##...#.## +...........## +..#....#...## +#.#....#.#### + +.##...#.# +.##..#... +.##.###.. +.##..#.#. +.##....## +#####.##. +.##...### +#..#..#.# +#..#..#.# +.##...### +########. +.##....## +.##..#.#. +.##.###.. +.##..#... + +.##.#....###..# +.##.#....###..# +..#######...... +.######.#.##.## +..#.#..#...###. +##....#.#.###.. +##....#.#.###.. +..#.#..#...###. +.######.#.##.#. +..#######...... +.##.#....###..# + +.##..####.. +.##..####.. +###...##... +...###..### +..#.#.##.#. +...######.# +...#..##..# +...#.#..#.# +#.#.##..##. + +##.#......... +#.####..##..# +##.#.######## +##.##........ +##.########## +#.#.......... +.#.#......... +#.########### +.###.#......# +###.......... +#.#.#.##..##. +.#....##..##. +#.#...##..##. +.##.##..##..# +.#.#.#..##..# + +...#### +...#### +.#..#.. +######. +##.#..# +##.#.## +######. +.#..#.. +...#### + +.....#. +###.##. +##...#. +####.## +####.## +##...#. +###.##. +.....#. +#.##... +###..#. +###.### +....##. +##.#.## + +##.#....# +##.#.##.# +...#....# +..#.####. +....####. +##...##.. +....####. +####.##.. +..#...... +##...##.. +###.####. +#####..## +###..##.. + +..##..### +..##.##.. +..##.##.# +..##..### +##.....## +.....##.. +..##...#. +##.#...#. +##.###..# + +.####...##... +..#....#..#.. +#####.##..##. +#..#.##.##.## +...##.#.##.#. +####...####.. +#.......##... +#..#....##... +####...####.. + +#.##..# +...#### +...#### +#.##..# +...##.. +###.#.. +###..#. +.....## +##.#... +#.#..## +.##...# +.##...# +#.##.## + +.##...##.##.##... +.#.####..##..#### +.#.####..##..#### +.##...##.##.##... +####.##.####.##.# +##.#####....##### +#.###..#....#..## +...##..........## +.#.###.######.### +#.##.####..####.# +..##.....##.....# +.#..#...#..#...#. +#.##...##..##...# +#.#.#.##.##.##.#. +.#..####....####. +#...####.##.###.. +...#..#.####.#..# + +....#.##..#.#.##. +#..##..#..#.#...# +.##.##.#.#..#.##. +.....#....#.#.##. +####.###....#.... +#..#.#.#.#..#.... +#..###.##....#### +####..#....#.#..# +####.#...###.#..# +#####..#.###..... +####.#####.#.#..# +#####.#.###...##. +####.##..#...#### + +.......##...... +....########... +#####.####.#### +##..#.####.#..# +##.##......##.# +....###..###... +...#..#..#..##. + +..........###.. +#.####.##..#... +#.#..#.##.#...# +.######.###..## +...##...##.#### +########..##... +............#.. + +....#.###.#.. +#..#...#...#. +....#.##.#### +....#.##.#### +#..#...#...#. +....#.###.#.. +......##.#### +.###.#####.## +####.#####.## +....#.##....# +....##..#..#. +.##.###....#. +.##....####.. +#####...#.#.. +######.#..### + +.##.### +...#... +###.### +.#..... +#.#.#.. +####... +..##... +##.#... +#...... +.#.##.. +#.#.### +..##### +..##### +..#.### +.#.##.. + +####.#.#### +####.#..##. +#...#.##..# +#...#.##..# +####.#..##. +####.#.#### +#.#...#.... +#.....##..# +#.#.##..##. +.###.#..##. +##...#..... +.###..#.... +.####.#.##. +....#...##. +.####....#. + +....##### +....#.... +####.#..# +.....#### +#..###### +#..#..... +#####.... +###.##### +#####.##. +#..##.... +.##.#.... +####.#### +#..#.#### + +######..##.#.#.## +#.........####... +###.##.....#.##.. +##.#.###..###..## +###..#...#....### +#.#...#.#######.. +.#..#.###.#.##... +.##...####.#..### +.##....#....#.#.. +.#.##.#..#..##### +##....###......## +...##.######..#.. +....#.#..#.###### +##...###..##..### +##.#.###..##..### + +.....###..###.#.. +#####.#...#...... +#####.##.#..#.... +.##.##.#.###.#.## +......#..###.##.. +....#...#.####... +.....####.#.###.. +......#.##.##.#.. +...##.##....#.#.. +#..##.##.###..### +#..#..###.###..## +#..#...#....###.. +....#....##.#..## + +....#.... +##.###### +##.#..... +##.#.#### +##..#...# +..#.#.##. +......##. +###..#### +..##.#..# + +..##..# +##..... +...#### +...#### +##..... +..##..# +#.#.#.. +#.##... +#..##.# +####... +####... +#..##.# +#.##... +..#.#.. +..##..# + +...##.####### +...##.#.##### +#....#..#..## +#..########.. +#.##...#...## +.#....#...#.. +.#....#...#.. +#.##...#...## +#..########.. +#....#..#..## +...##.#.##### +...##.####### +.####.....### +######.#.#..# +..#..#.#.#### +...#..#..#### +..####..###.# + +########. +.......## +.####.#.. +..##...## +#....#.#. +..##....# +######... +.#..#..## +##..###.. +......##. +..##..##. +#.#..##.. +.#..#..## +#....##.# +#....##.# + +######.#### +#.##.###### +.#..#.##..# +...#..##..# +######.#..# +.####...##. +.......#### +######.#..# +#....##.... +.####.#.... +......##### +######.#### +#....##.##. + +.####.###.# +.#..#...... +##..####### +#.##.#..### +#######..## +######.###. +##..##...#. +##..##.#.#. +######.###. + +.##...##..#.# +#..#.#..#.... +.##.##.##..#. +.##..#.#.###. +.....#.#.#... +.##.#.###...# +####..###...# +####..###...# +.##.#.###...# +.....#.#.#... +.##..#.#####. + +#.#.#...### +#.....#.#.. +###.##.##.. +######.#### +####.#.#..# +###..##..#. +.###..#.#.# +.###..#.#.# +###.###..#. +####.#.#..# +######.#### +###.##.##.. +#.....#.#.. +#.#.#...### +####...#### +####...#### +#.#.#...### + +###...#...#.##. +.#######.#.#### +.#######.#.#### +###...#...#.##. +#.#####...#..#. +##..#..##..#..# +#..##.##..##..# + +#..#..#..######.. +#.#.##.#.#.##.#.# +..##..##...##...# +....##........... +.########.#..#.## +#...##...######.. +.#......#.#..#.#. +#.##..##.######.# +....##.....##.... +##......##....##. +...####...#..#... +#.#....#.#.##.#.# +..#.##.#........# +#####.####....### +.###..###.#..#.## +##......##....##. +..#.##.#..####..# + +##.######## +.#..#....#. +####.#..#.# +#.##.#..#.# +.#..#....#. +##.######## +#.#..#..#.. +#..#..##..# +##...####.. +.########## +.#.######## +..###.##.## +.#....##... +##...####.. +##..#....#. +##..######. +..#.##..##. + +.#..#.#.#.###.##. +.#..#.#.#.##..##. +......####....#.. +.#..#...##..####. +######.###...#### +.#..#..#....#.#.# +......##...#..... +#######.#.####### +.#..#..##..##.##. + +.###.#.##...... +.......###.##.# +.##..#..#.#..#. +#..##.####.##.# +####.#..###..## +#..##.....####. +#..#...##.#..#. +....#.....#..#. +####..###...... + +#.#..##.####. +#.#..##.####. +.##..#.#..... +#.###.#..#... +....#.####..# +...#.##..###. +.###..#.#.... +..#....#..... +.#.##..#..##. +.#.##..#..##. +..#....#..... +.###..#.#.... +...#.##..###. +....#.####..# +#.###.#..#... +.##..#.#..... +..#..##.####. + +...######.. +####.#..#.# +.#...#..#.. +#..###.#... +#..###.#... +.#...#..#.. +.###.#..#.# +...######.. +..##..#..#. +..##.##.##. +##.#####..# +....#.###.# +#########.. +#.#...##... +#.#...##... +#########.. +....#.###.# + +##....####..###.. +########..#.##... +########..#.##... +##....####..###.. +........####....# +.#.##.#.##.#..#.# +........##.###### +.##...#....#.###. +.######....#.#..# +.#....#.#..###.#. +.##..##...#...##. + +###.##..... +#..#.###.## +#..#..##... +#.#..#.##.. +.##.###.##. +###....#### +.##..#.#... +.##..#.#... +###....#### +.##.###.##. +#.#..#.##.. +#..#..##... +#..#.###.## +###.##..... +###.##....# + +#..#.....#.####.# +####.#.#..#....#. +#####..#......... +#.#####.##..##..# +#..#.#.#...####.. +#..#.##....####.. +#..#####.###..### +.##.#....#..##..# +#..##.#.##.#..#.# + +##..#..#.##.##.## +##..#..#.##..#.## +.#####..##.##..## +..#.###.###..#..# +..#.###.###..#..# +.#####..##.##..## +##..#..#.##..#.## +##..#..#.##.##.## +#...###..#.##...# +#........#..#.##. +#...#.#...#.##... + +#....##.#.. +#.##.#..### +.####.##..# +.####.##..# +#.##.#...## +#....##.#.. +##..##.#..# + +.#.#..#.#.#.#..## +.##....##..#.#### +####..####..#.#.. +.##.##.##.#...#.# +..######..##..... +..######..##..#.. +.##.##.##.#...#.# + +.####.# +.####.. +.####.# +#....#. +#.##.## +##..### +.####.. + +#..#.#..###...##. +#..#.#..###...##. +#.#.....##.#.##.# +#..#####...#.#.## +##....###......## +##..###.#.###..## +.#....###...#..## +#.###.#...#.....# +##.....#...##.### +......#..######## +##.#############. +.#.#.##.....####. +###.##.###.###..# +####.###..#.#.#.. +#.##.#......#.##. +#####.....#..#..# +#####..#..#..#..# + +.##.####.##....## +####.##.######... +#.#..##..#.#...## +##.#....#..#.#... +...#.##.#....#... +#..........#..... +#.##....##.#..### +#..#.##.#..##.### +............#.### +...#.##.#...#..## +#.##.##.##.#.#... +...#.##.#........ +...######....#... +#.#.####.#.##.#.. +##.#....#.####.## +...#.##.#....#### +.#.#....#.#...### + +...##.##..####. +..##.#.#.#.#### +##.#.#.###.##.. +......#.#####.. +..##..#.####.## +..##...#.#.#... +..#.#.#...#.... +#####.##.##.#.. +##.###.##...... +..#..##..#.##.. +....#....##.#.. +...#.#.#.#.#### +##.#.##.#.##.## +###..#....###.. +..##.#..#.#..## +..##..#.##..### +..#..#.##.###.. + +.....##..#.#.##.# +#..####.#.##..##. +..##..##.#......# +.##.###.###....## +#..#.#..#........ +..##.##..###..### +.##....#.#..##..# +##.#.##.......... +##.#.##.......... + +#..##.... +#....#.#. +##.###.## +.####.### +#.####### +..#.###.. +..#.###.. + +.#.###.#... +#.#.#.#..## +###..#..#.. +#.#..#..#.. +#.#.#.#..## +.#.###.#... +#......#### + +#.#..#..#..#.## +.#.########.#.. +.#...##.#...#.. +.#.#......#.#.. +###...##...#### +.#..........#.. +...#......#.... + +...#.#####.#. +.#.#.....#..# +#.##..#.#.### +#.##..#.#.### +.#.##....#..# +...#.#####.#. +######......# +###.####.#### +..##.###.###. +###......##.. +...##.#....#. +...##.#....#. +###......##.. +..##.###.###. +###.####.#### +######......# +...#.#####.#. + +##.#....#.# +.#.##..##.# +..###...##. +#..######.. +#...#..#... +#..#....#.. +.###.##.### +.####..#### +#.##.##.##. +#..######.. +...#.##.#.. +...#.##.#.. +#..######.. +#.##.##.##. +.####..#### +.###.##.### +#..#....#.. + +####.#.####.####. +#.#.#..######..## +.##.##.....#....# +.##.####...###### +...#..#.#.###..## +.####.###.###..## +#.##..#.#....##.. +#....##.#..###### +#....###..##.##.# +#....####.##.##.# +#....##.#..###### +#.##..#.#....##.. +.####.###.###..## +...#..#.#.###..## +.##.####...###### +.##.##.....#....# +#.#.#..######..## + +.#.####.#.#.... +.#.####.#.#.... +.##......##...# +.#...#....#.#.. +###..#.#..#.#.# +####....#.##..# +.#.#..##.#.##.# +.##....###..#.# +..##.##.##...#. +.#.#.....#....# +.#.#.....#....# +..##.##.##...#. +.##....###..#.# +.#.#..##.#.##.# +####....#.#...# + +....#.. +#.##..# +#####.. +.##.##. +####.## +####.## +#..###. +#..##.. +#####.. +.....## +.....## + +##.#....#..#...#. +####..#..#####... +####..#..#####... +##.#....#..#...#. +####.##.#.#.#...# +#####....##.####. +.#####..###.#..#. +######.##...#.#.. +...###.....#.#### +###.##..##..####. +..#.##.......#### + +##.#..#.#.# +##.##.#.#.# +####.#..#.# +..##.####.. +##.####.#.. +....##..#.# +..##.###.#. +#####.###.. +######....# +##.#####.## +..#.##.#.#. + +.##...# +....### +####.## +####.## +....### +.##...# +.....#. +#..#... +.##.#.. +...##.# +....#.. + +#######..#### +####.##..#... +#..##..#...#. +.#####....### +.##.....##... +....#.###..## +#..#..##..##. +........###.# +........###.# + +####...## +###..#... +###.##... +####...## +#.#..#..# +#.###.... +....##.## +.#...#### +#.#..#..# +###....## +.....##.. +.....##.. +###....## + +#.#...#..#... +...##.####.## +...##.####.## +#.....#..#... +.##..##..##.. +...#...##...# +#...#.####.#. +##...#.##.#.. +#..##......## +#.##...##...# +##....####... + +#..###.## +#..#.#.## +..##.###. +..##.#.## +##...##.# +##...##.# +..##.#.## +..##.###. +#..#.#.## +#..###.## +.###..#.# + +...#.###....# +..#.###.####. +.#.#..####### +.#####.#.##.. +#.#.#.#..##.. +##.###....... +##.###....... + +#.##..##.##.# +...####...... +#..####..##.. +##.####.####. +####..####### +##..##..####. +##..##..####. +#..#..#..##.. +..##..##....# +..#....#....# +...#..#...... +.##..#.##..## +.#..##..#..#. +#.#.##.#.##.# +.########..## + +##....##.#### +.#...##.###.. +.#.#.....#.#. +.##..#.#.#.## +.....#.##.#.# +.....#.##.#.# +.##..#.#.#.## +.#.##....#.#. +.#...##.###.. +##....##.#### +.############ +..####.###.## +..####.###.## +.############ +##....##.#### From 48175ec659e549e7b10147f00511af488be82acf Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 13 Dec 2023 10:08:35 +0000 Subject: [PATCH 427/479] 2023: d13: ex1: add solution --- 2023/d13/ex1/ex1.py | 84 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 2023/d13/ex1/ex1.py diff --git a/2023/d13/ex1/ex1.py b/2023/d13/ex1/ex1.py new file mode 100755 index 0000000..a591a9e --- /dev/null +++ b/2023/d13/ex1/ex1.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python + +import sys +from typing import NamedTuple, Optional + + +class Point(NamedTuple): + x: int + y: int + + +class Grid(NamedTuple): + points: set[Point] + lines: int + rows: int + + +def solve(input: str) -> int: + def parse_grid(grid: list[str]) -> Grid: + points: set[Point] = set() + + for x, line in enumerate(grid): + for y, c in enumerate(line): + if c != "#": + continue + points.add(Point(x, y)) + + return Grid(points, len(grid), len(grid[0])) + + def parse(input: str) -> list[Grid]: + return [parse_grid(grid.splitlines()) for grid in input.split("\n\n")] + + def reflect_vertical(grid: Grid) -> Optional[int]: + def try_row(row: int) -> bool: + for y in range(min(row, grid.rows - row)): + for x in range(grid.lines): + left = Point(x, row - y - 1) in grid.points + right = Point(x, row + y) in grid.points + if left and right: + continue + if left or right: + return False + return True + + for row in range(1, grid.rows): + if try_row(row): + return row + return None + + def reflect_horizontal(grid: Grid) -> Optional[int]: + def try_line(line: int) -> bool: + for x in range(min(line, grid.lines - line)): + for y in range(grid.rows): + up = Point(line - x - 1, y) in grid.points + down = Point(line + x, y) in grid.points + if up and down: + continue + if up or down: + return False + return True + + for line in range(1, grid.lines): + if try_line(line): + return line + return None + + def solve(grid: Grid) -> int: + if (columns := reflect_vertical(grid)) is not None: + return columns + if (rows := reflect_horizontal(grid)) is not None: + return 100 * rows + assert False # Sanity check + + grids = parse(input) + return sum(map(solve, grids)) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() From 6a3c87ef2e38a0bea7ffe5f079f9b5de25cf4d72 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 13 Dec 2023 10:08:42 +0000 Subject: [PATCH 428/479] 2023: d13: ex2: add input --- 2023/d13/ex2/input | 1349 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1349 insertions(+) create mode 100644 2023/d13/ex2/input diff --git a/2023/d13/ex2/input b/2023/d13/ex2/input new file mode 100644 index 0000000..6d7d1e2 --- /dev/null +++ b/2023/d13/ex2/input @@ -0,0 +1,1349 @@ +######..# +.##....#. +.....##.# +.....##.# +.##..#.#. +######..# +#..#..### +.##..#.## +#####.#.# +#..#.##.. +.....###. +#####.... +....##.#. + +##..###.###.. +##.#.#..##..# +..#.#...#.#.# +######.#.#### +##..#.##....# +##.##.#..#.#. +#####....#.#. +###.########. +#######..#.## +..####..##..# +......#.###.. +......#.###.. +..####..#...# + +....#....##..##.. +##.#.....#....#.. +....##...#.##.#.. +..##..#####..#### +###..##..######.. +.....##.#.#..#.#. +.#.#####.##..##.# +###.###...####... +....####.#....#.# + +#.##.#.####.# +.#..#..#..#.. +.####.#....#. +#....#......# +.#..#.#....#. +.##.#.######. +#....######## +#....##....## +########..### +.#..#..####.. +.#..#..####.. +..##....##... +.####...##... +.#..#.##..##. +##..######### + +#.##.#.## +#....##.. +.......## +#....##.. +#....#### +#.####.## +.####.### + +.###.#### +.##.##..# +.###.#### +#....#..# +....#.... +##.##.... +##.###..# +#..#..##. +.#...#..# +....#.... +##.###### +...###.## +#.###.... +##.#.#### +##.#.#### + +......##.## +####..###.. +.##....#.#. +######.#### +######.#### +.##....#.#. +####..###.. +......##.## +.##.##.##.# +...##..###. +....###.##. +#..#......# +....##..... +#####.#.#.. +.....#..##. + +###.....###..## +#.#..#..##...## +..##.#...###.## +..##.#...##..## +#.#..#..##...## +###.....###..## +.##.#...#.#...# +##...#####.###. +##.#...###....# +#.####..#.#.#.. +#.##..###.###.. +#.##..###.###.. +#.####..#.#.#.. +##.#...###....# +##...#####.###. + +..###..#....#.. +##.....#.##.#.. +###....#.##.#.. +###.#..#....#.. +..##.#........# +####........... +..##...##..##.. +##...#.######.# +..#.#.########. +##....#.####.#. +##.#.####...### +##...#.#....#.# +##...##.#..#.## + +##..#..#..##..# +.###....###.#.. +.#...##...#..#. +..##.##.##..... +.#.#.##.#.#.#.# +.....#........# +.#..####..#.##. +####.##.####.## +####.##.####.## + +.#.#..####. +#.####.##.# +..#..###### +..#...####. +..#...####. +..#..###### +#.####.##.# +.#.#..####. +#..#.##..## +#.#.####### +###........ +....##....# +..#.###..## +...#..#.##. +.#.#.##..## + +##...#...##.#.#.# +##.#.......#.#.## +##.#.......#.#.## +##.......##.#.#.# +###....#.##.#...# +.#.#.#..#.###.##. +.#...#..##....... +#..#.#....#.##.## +.#.##...###.#..## +.##.#.#.#.#...### +#...##..#...#.##. +.#.####...#..#.## +.#.####...#..#.## +#...##..#...#.##. +.##.#.#.#.#...### + +.....#.##..##.# +.....#.##..##.# +.##.##.##..##.. +....#..#....#.. +#..#.###....### +##..#.##.##.##. +#...##........# +.#..#.###..###. +..##...#....#.. +#....#.##..##.# +#.##..###..###. + +.##.....#..#. +.##..#.###### +#.#...#...... +.###..#...... +..#..#..#..#. +..#..#..#..#. +.###.##...... +#.#...#...... +.##..#.###### +.##.....#..#. +........####. +.####.##....# +.#.##.#...... +######..####. +.#.##..##..## +....##.#....# +.###.#.###### + +###.#.####.#. +###.#.####.#. +...#.#.##.#.# +###...#..#... +.#.#.#....#.# +##..#..#...#. +..###..##..## +####..#..#..# +#...#......#. +..##..####..# +.#..########. +.#.#.#....#.# +#..####..#### +.#........... +#.#.#.#..#.#. + +#.#.... +#.#.... +#..#..# +..##..# +#...... +#...... +..#.##. +#.#.##. +#.##... +..#.##. +#.#.##. +#.##### +#.##### +.#.#### +##..##. + +.##.....### +#..###.##.# +.##..#.##.. +.....#.#.#. +#..##.#..## +#..##.#..## +.....#.#.#. +.##..#.##.. +#..###.##.# +.##..#..### +#..##..##.# +####...##.# +#..#.#.#.#. +........#.# +....####... +....#.###.# +.##.#.#..#. + +###.######. +...##.##.## +.###.#..#.# +....######. +.#.######## +#####....## +..##..##..# +#.##..##..# +##....##... +.#..#...... +#####....## +##....##... +.##.######. +###..####.. +....#.##.#. +....#.##.#. +###..####.. + +#.####..####.##.. +##..##..##..##.## +.#....##....###.. +###...##...###.## +#.#........#.#.## +.#.##....##.#.### +.#..........#.... +.#..........#.### +##.##.##.##.##### +##..........##### +.#..........#.### +.#####..#####.... +#..##....##..##.. + +#.##.#.#### +.###.###### +#..#....##. +#...####### +##.##..#..# +...#.###### +#.##....... +.#......... +##.####.##. +#..####.##. +.#......... +#.##....... +...#.###### +##.##..#..# +#...####### +#..#....##. +.###.###### + +.#...###... +.....##.### +..#..##.#.. +####....... +..##..#.##. +######.###. +########..# +########..# +######.###. +..##..#.##. +####....... + +##....###.. +###..####.. +..#..#..##. +...##...#.# +.#.##.#.##. +##.##.####. +########.## +..#..#..##. +########.#. +##.##.##... +...##...### +#########.. +...##....## + +#.....###.... +#.##.####.##. +#..#..##..#.. +##...#..#...# +.....#..#.... +####..##..### +..##......##. +##..######..# +##.##....##.# +##.##....##.# +##..######..# + +.####.##.#.#..##. +.....######..#..# +..#..######..#..# +.####.##.#.#..##. +######..##...#### +#..##.#..#.###### +..#....#.##...... +.##.#..###...#### +.....#..#..##.... +##.#..##.###..##. +#..##.#.##.#.#..# +..##.#.##...##..# +####.......#..... +.###.####...##..# +#..#..#.#####.... +###.#.#..###..... +####...######.... + +#####.###...# +##..#.#.###.. +#..#..##..#.# +##...##.#..#. +#####....##.# +.....##...### +#####.#.#.### +#####.#.#.### +.....##...### + +..##### +.#..... +.###### +#..#### +.###### +..#.... +###.... +###.... +##.#### +..#.##. +.#.#### +.###### +.#.#### +#.##### +##..... + +####....#...#.### +.#..#..####.##..# +.##.##.##..#####. +......##.##.##### +###.#.##.#####.## +.####....#...#### +.##.#....#...#### +###.#.##.#####.## +......##.##.##### +.##.##.##..#####. +.#..#..####.##..# +####....#...#.### +####....#...#.### + +###...#..#...## +...#......#.#.. +....#......#... +##..#.####.#..# +##..#.#..#.#..# +##.#.######.#.# +....#.####.#... +..##.#.##.#.##. +##...######...# +###.#..##..#.## +..#..######..#. + +.##..##..##..#### +####.##.####..... +.###.##.###..#### +..#.#..#.#...#### +.............#..# +...######...#.##. +..#.#..#.#..####. + +##.##.#.# +###.#.#.# +###.#.#.# +##.####.# +...#####. +...###### +...#..### +..######. +##...##.# +##...#..# +#####.#.. + +#.###.. +####.## +.#.##.. +....### +.##.... +.##.... +.#..### + +......#....#..... +#..#.########.#.. +.##.##......##.## +....#.######.#.#. +.#..##########..# +#.#..###..###..#. +####..######..### +#.##..#.##.#..##. +#..#..######..#.. +.#.#..##..##..#.# +#.#...#.##.#...#. +.#.##.#.##.#.##.# +.#.##.#.##.#.##.# + +###..## +#....## +###..#. +##..... +..#..## +#....## +#...### +###.### +..##.## +...##.. +...##.. +..##... +##.#... +..#.... +.##.### +###.... +###.... + +####.###..# +.......###. +......####. +####.###..# +###..#.#### +###.#....## +..#.#.....# +###.##.#.## +##.###.###. +####.##.#.. +##..#.#.#.. + +#..##.....##. +.......#..#.# +.##..#...#.## +.##..#...#.## +.......#..#.# +#..##.....##. +.##..#.###### +######.##.... +####...##.... +....#.##.#.## +#.....####... +.##..###..... +#####..#....# + +#..####..#... +####..#####.. +###....###.#. +..#....#..#.. +.#.#..#.#.### +.###..###.... +###########.. +#...##...#.## +...........## +..#....#...## +#.#....#.#### + +.##...#.# +.##..#... +.##.###.. +.##..#.#. +.##....## +#####.##. +.##...### +#..#..#.# +#..#..#.# +.##...### +########. +.##....## +.##..#.#. +.##.###.. +.##..#... + +.##.#....###..# +.##.#....###..# +..#######...... +.######.#.##.## +..#.#..#...###. +##....#.#.###.. +##....#.#.###.. +..#.#..#...###. +.######.#.##.#. +..#######...... +.##.#....###..# + +.##..####.. +.##..####.. +###...##... +...###..### +..#.#.##.#. +...######.# +...#..##..# +...#.#..#.# +#.#.##..##. + +##.#......... +#.####..##..# +##.#.######## +##.##........ +##.########## +#.#.......... +.#.#......... +#.########### +.###.#......# +###.......... +#.#.#.##..##. +.#....##..##. +#.#...##..##. +.##.##..##..# +.#.#.#..##..# + +...#### +...#### +.#..#.. +######. +##.#..# +##.#.## +######. +.#..#.. +...#### + +.....#. +###.##. +##...#. +####.## +####.## +##...#. +###.##. +.....#. +#.##... +###..#. +###.### +....##. +##.#.## + +##.#....# +##.#.##.# +...#....# +..#.####. +....####. +##...##.. +....####. +####.##.. +..#...... +##...##.. +###.####. +#####..## +###..##.. + +..##..### +..##.##.. +..##.##.# +..##..### +##.....## +.....##.. +..##...#. +##.#...#. +##.###..# + +.####...##... +..#....#..#.. +#####.##..##. +#..#.##.##.## +...##.#.##.#. +####...####.. +#.......##... +#..#....##... +####...####.. + +#.##..# +...#### +...#### +#.##..# +...##.. +###.#.. +###..#. +.....## +##.#... +#.#..## +.##...# +.##...# +#.##.## + +.##...##.##.##... +.#.####..##..#### +.#.####..##..#### +.##...##.##.##... +####.##.####.##.# +##.#####....##### +#.###..#....#..## +...##..........## +.#.###.######.### +#.##.####..####.# +..##.....##.....# +.#..#...#..#...#. +#.##...##..##...# +#.#.#.##.##.##.#. +.#..####....####. +#...####.##.###.. +...#..#.####.#..# + +....#.##..#.#.##. +#..##..#..#.#...# +.##.##.#.#..#.##. +.....#....#.#.##. +####.###....#.... +#..#.#.#.#..#.... +#..###.##....#### +####..#....#.#..# +####.#...###.#..# +#####..#.###..... +####.#####.#.#..# +#####.#.###...##. +####.##..#...#### + +.......##...... +....########... +#####.####.#### +##..#.####.#..# +##.##......##.# +....###..###... +...#..#..#..##. + +..........###.. +#.####.##..#... +#.#..#.##.#...# +.######.###..## +...##...##.#### +########..##... +............#.. + +....#.###.#.. +#..#...#...#. +....#.##.#### +....#.##.#### +#..#...#...#. +....#.###.#.. +......##.#### +.###.#####.## +####.#####.## +....#.##....# +....##..#..#. +.##.###....#. +.##....####.. +#####...#.#.. +######.#..### + +.##.### +...#... +###.### +.#..... +#.#.#.. +####... +..##... +##.#... +#...... +.#.##.. +#.#.### +..##### +..##### +..#.### +.#.##.. + +####.#.#### +####.#..##. +#...#.##..# +#...#.##..# +####.#..##. +####.#.#### +#.#...#.... +#.....##..# +#.#.##..##. +.###.#..##. +##...#..... +.###..#.... +.####.#.##. +....#...##. +.####....#. + +....##### +....#.... +####.#..# +.....#### +#..###### +#..#..... +#####.... +###.##### +#####.##. +#..##.... +.##.#.... +####.#### +#..#.#### + +######..##.#.#.## +#.........####... +###.##.....#.##.. +##.#.###..###..## +###..#...#....### +#.#...#.#######.. +.#..#.###.#.##... +.##...####.#..### +.##....#....#.#.. +.#.##.#..#..##### +##....###......## +...##.######..#.. +....#.#..#.###### +##...###..##..### +##.#.###..##..### + +.....###..###.#.. +#####.#...#...... +#####.##.#..#.... +.##.##.#.###.#.## +......#..###.##.. +....#...#.####... +.....####.#.###.. +......#.##.##.#.. +...##.##....#.#.. +#..##.##.###..### +#..#..###.###..## +#..#...#....###.. +....#....##.#..## + +....#.... +##.###### +##.#..... +##.#.#### +##..#...# +..#.#.##. +......##. +###..#### +..##.#..# + +..##..# +##..... +...#### +...#### +##..... +..##..# +#.#.#.. +#.##... +#..##.# +####... +####... +#..##.# +#.##... +..#.#.. +..##..# + +...##.####### +...##.#.##### +#....#..#..## +#..########.. +#.##...#...## +.#....#...#.. +.#....#...#.. +#.##...#...## +#..########.. +#....#..#..## +...##.#.##### +...##.####### +.####.....### +######.#.#..# +..#..#.#.#### +...#..#..#### +..####..###.# + +########. +.......## +.####.#.. +..##...## +#....#.#. +..##....# +######... +.#..#..## +##..###.. +......##. +..##..##. +#.#..##.. +.#..#..## +#....##.# +#....##.# + +######.#### +#.##.###### +.#..#.##..# +...#..##..# +######.#..# +.####...##. +.......#### +######.#..# +#....##.... +.####.#.... +......##### +######.#### +#....##.##. + +.####.###.# +.#..#...... +##..####### +#.##.#..### +#######..## +######.###. +##..##...#. +##..##.#.#. +######.###. + +.##...##..#.# +#..#.#..#.... +.##.##.##..#. +.##..#.#.###. +.....#.#.#... +.##.#.###...# +####..###...# +####..###...# +.##.#.###...# +.....#.#.#... +.##..#.#####. + +#.#.#...### +#.....#.#.. +###.##.##.. +######.#### +####.#.#..# +###..##..#. +.###..#.#.# +.###..#.#.# +###.###..#. +####.#.#..# +######.#### +###.##.##.. +#.....#.#.. +#.#.#...### +####...#### +####...#### +#.#.#...### + +###...#...#.##. +.#######.#.#### +.#######.#.#### +###...#...#.##. +#.#####...#..#. +##..#..##..#..# +#..##.##..##..# + +#..#..#..######.. +#.#.##.#.#.##.#.# +..##..##...##...# +....##........... +.########.#..#.## +#...##...######.. +.#......#.#..#.#. +#.##..##.######.# +....##.....##.... +##......##....##. +...####...#..#... +#.#....#.#.##.#.# +..#.##.#........# +#####.####....### +.###..###.#..#.## +##......##....##. +..#.##.#..####..# + +##.######## +.#..#....#. +####.#..#.# +#.##.#..#.# +.#..#....#. +##.######## +#.#..#..#.. +#..#..##..# +##...####.. +.########## +.#.######## +..###.##.## +.#....##... +##...####.. +##..#....#. +##..######. +..#.##..##. + +.#..#.#.#.###.##. +.#..#.#.#.##..##. +......####....#.. +.#..#...##..####. +######.###...#### +.#..#..#....#.#.# +......##...#..... +#######.#.####### +.#..#..##..##.##. + +.###.#.##...... +.......###.##.# +.##..#..#.#..#. +#..##.####.##.# +####.#..###..## +#..##.....####. +#..#...##.#..#. +....#.....#..#. +####..###...... + +#.#..##.####. +#.#..##.####. +.##..#.#..... +#.###.#..#... +....#.####..# +...#.##..###. +.###..#.#.... +..#....#..... +.#.##..#..##. +.#.##..#..##. +..#....#..... +.###..#.#.... +...#.##..###. +....#.####..# +#.###.#..#... +.##..#.#..... +..#..##.####. + +...######.. +####.#..#.# +.#...#..#.. +#..###.#... +#..###.#... +.#...#..#.. +.###.#..#.# +...######.. +..##..#..#. +..##.##.##. +##.#####..# +....#.###.# +#########.. +#.#...##... +#.#...##... +#########.. +....#.###.# + +##....####..###.. +########..#.##... +########..#.##... +##....####..###.. +........####....# +.#.##.#.##.#..#.# +........##.###### +.##...#....#.###. +.######....#.#..# +.#....#.#..###.#. +.##..##...#...##. + +###.##..... +#..#.###.## +#..#..##... +#.#..#.##.. +.##.###.##. +###....#### +.##..#.#... +.##..#.#... +###....#### +.##.###.##. +#.#..#.##.. +#..#..##... +#..#.###.## +###.##..... +###.##....# + +#..#.....#.####.# +####.#.#..#....#. +#####..#......... +#.#####.##..##..# +#..#.#.#...####.. +#..#.##....####.. +#..#####.###..### +.##.#....#..##..# +#..##.#.##.#..#.# + +##..#..#.##.##.## +##..#..#.##..#.## +.#####..##.##..## +..#.###.###..#..# +..#.###.###..#..# +.#####..##.##..## +##..#..#.##..#.## +##..#..#.##.##.## +#...###..#.##...# +#........#..#.##. +#...#.#...#.##... + +#....##.#.. +#.##.#..### +.####.##..# +.####.##..# +#.##.#...## +#....##.#.. +##..##.#..# + +.#.#..#.#.#.#..## +.##....##..#.#### +####..####..#.#.. +.##.##.##.#...#.# +..######..##..... +..######..##..#.. +.##.##.##.#...#.# + +.####.# +.####.. +.####.# +#....#. +#.##.## +##..### +.####.. + +#..#.#..###...##. +#..#.#..###...##. +#.#.....##.#.##.# +#..#####...#.#.## +##....###......## +##..###.#.###..## +.#....###...#..## +#.###.#...#.....# +##.....#...##.### +......#..######## +##.#############. +.#.#.##.....####. +###.##.###.###..# +####.###..#.#.#.. +#.##.#......#.##. +#####.....#..#..# +#####..#..#..#..# + +.##.####.##....## +####.##.######... +#.#..##..#.#...## +##.#....#..#.#... +...#.##.#....#... +#..........#..... +#.##....##.#..### +#..#.##.#..##.### +............#.### +...#.##.#...#..## +#.##.##.##.#.#... +...#.##.#........ +...######....#... +#.#.####.#.##.#.. +##.#....#.####.## +...#.##.#....#### +.#.#....#.#...### + +...##.##..####. +..##.#.#.#.#### +##.#.#.###.##.. +......#.#####.. +..##..#.####.## +..##...#.#.#... +..#.#.#...#.... +#####.##.##.#.. +##.###.##...... +..#..##..#.##.. +....#....##.#.. +...#.#.#.#.#### +##.#.##.#.##.## +###..#....###.. +..##.#..#.#..## +..##..#.##..### +..#..#.##.###.. + +.....##..#.#.##.# +#..####.#.##..##. +..##..##.#......# +.##.###.###....## +#..#.#..#........ +..##.##..###..### +.##....#.#..##..# +##.#.##.......... +##.#.##.......... + +#..##.... +#....#.#. +##.###.## +.####.### +#.####### +..#.###.. +..#.###.. + +.#.###.#... +#.#.#.#..## +###..#..#.. +#.#..#..#.. +#.#.#.#..## +.#.###.#... +#......#### + +#.#..#..#..#.## +.#.########.#.. +.#...##.#...#.. +.#.#......#.#.. +###...##...#### +.#..........#.. +...#......#.... + +...#.#####.#. +.#.#.....#..# +#.##..#.#.### +#.##..#.#.### +.#.##....#..# +...#.#####.#. +######......# +###.####.#### +..##.###.###. +###......##.. +...##.#....#. +...##.#....#. +###......##.. +..##.###.###. +###.####.#### +######......# +...#.#####.#. + +##.#....#.# +.#.##..##.# +..###...##. +#..######.. +#...#..#... +#..#....#.. +.###.##.### +.####..#### +#.##.##.##. +#..######.. +...#.##.#.. +...#.##.#.. +#..######.. +#.##.##.##. +.####..#### +.###.##.### +#..#....#.. + +####.#.####.####. +#.#.#..######..## +.##.##.....#....# +.##.####...###### +...#..#.#.###..## +.####.###.###..## +#.##..#.#....##.. +#....##.#..###### +#....###..##.##.# +#....####.##.##.# +#....##.#..###### +#.##..#.#....##.. +.####.###.###..## +...#..#.#.###..## +.##.####...###### +.##.##.....#....# +#.#.#..######..## + +.#.####.#.#.... +.#.####.#.#.... +.##......##...# +.#...#....#.#.. +###..#.#..#.#.# +####....#.##..# +.#.#..##.#.##.# +.##....###..#.# +..##.##.##...#. +.#.#.....#....# +.#.#.....#....# +..##.##.##...#. +.##....###..#.# +.#.#..##.#.##.# +####....#.#...# + +....#.. +#.##..# +#####.. +.##.##. +####.## +####.## +#..###. +#..##.. +#####.. +.....## +.....## + +##.#....#..#...#. +####..#..#####... +####..#..#####... +##.#....#..#...#. +####.##.#.#.#...# +#####....##.####. +.#####..###.#..#. +######.##...#.#.. +...###.....#.#### +###.##..##..####. +..#.##.......#### + +##.#..#.#.# +##.##.#.#.# +####.#..#.# +..##.####.. +##.####.#.. +....##..#.# +..##.###.#. +#####.###.. +######....# +##.#####.## +..#.##.#.#. + +.##...# +....### +####.## +####.## +....### +.##...# +.....#. +#..#... +.##.#.. +...##.# +....#.. + +#######..#### +####.##..#... +#..##..#...#. +.#####....### +.##.....##... +....#.###..## +#..#..##..##. +........###.# +........###.# + +####...## +###..#... +###.##... +####...## +#.#..#..# +#.###.... +....##.## +.#...#### +#.#..#..# +###....## +.....##.. +.....##.. +###....## + +#.#...#..#... +...##.####.## +...##.####.## +#.....#..#... +.##..##..##.. +...#...##...# +#...#.####.#. +##...#.##.#.. +#..##......## +#.##...##...# +##....####... + +#..###.## +#..#.#.## +..##.###. +..##.#.## +##...##.# +##...##.# +..##.#.## +..##.###. +#..#.#.## +#..###.## +.###..#.# + +...#.###....# +..#.###.####. +.#.#..####### +.#####.#.##.. +#.#.#.#..##.. +##.###....... +##.###....... + +#.##..##.##.# +...####...... +#..####..##.. +##.####.####. +####..####### +##..##..####. +##..##..####. +#..#..#..##.. +..##..##....# +..#....#....# +...#..#...... +.##..#.##..## +.#..##..#..#. +#.#.##.#.##.# +.########..## + +##....##.#### +.#...##.###.. +.#.#.....#.#. +.##..#.#.#.## +.....#.##.#.# +.....#.##.#.# +.##..#.#.#.## +.#.##....#.#. +.#...##.###.. +##....##.#### +.############ +..####.###.## +..####.###.## +.############ +##....##.#### From e7892e901491540a7f9d5a18f3741f71dce5afe7 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 13 Dec 2023 10:08:47 +0000 Subject: [PATCH 429/479] 2023: d13: ex2: add solution --- 2023/d13/ex2/ex2.py | 86 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100755 2023/d13/ex2/ex2.py diff --git a/2023/d13/ex2/ex2.py b/2023/d13/ex2/ex2.py new file mode 100755 index 0000000..febde9b --- /dev/null +++ b/2023/d13/ex2/ex2.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python + +import sys +from typing import NamedTuple, Optional + + +class Point(NamedTuple): + x: int + y: int + + +class Grid(NamedTuple): + points: set[Point] + lines: int + rows: int + + +def solve(input: str) -> int: + def parse_grid(grid: list[str]) -> Grid: + points: set[Point] = set() + + for x, line in enumerate(grid): + for y, c in enumerate(line): + if c != "#": + continue + points.add(Point(x, y)) + + return Grid(points, len(grid), len(grid[0])) + + def parse(input: str) -> list[Grid]: + return [parse_grid(grid.splitlines()) for grid in input.split("\n\n")] + + def reflect_vertical(grid: Grid) -> Optional[int]: + def try_row(row: int) -> set[Point]: + smudges: set[Point] = set() + for y in range(min(row, grid.rows - row)): + for x in range(grid.lines): + left = Point(x, row - y - 1) in grid.points + right = Point(x, row + y) in grid.points + if left and right: + continue + if left or right: + smudges.add(Point(x, row - y - 1)) + return smudges + + for row in range(1, grid.rows): + if len(try_row(row)) == 1: + return row + return None + + def reflect_horizontal(grid: Grid) -> Optional[int]: + def try_line(line: int) -> set[Point]: + smudges: set[Point] = set() + for x in range(min(line, grid.lines - line)): + for y in range(grid.rows): + up = Point(line - x - 1, y) in grid.points + down = Point(line + x, y) in grid.points + if up and down: + continue + if up or down: + smudges.add(Point(line - x - 1, y)) + return smudges + + for line in range(1, grid.lines): + if len(try_line(line)) == 1: + return line + return None + + def solve(grid: Grid) -> int: + if (columns := reflect_vertical(grid)) is not None: + return columns + if (rows := reflect_horizontal(grid)) is not None: + return 100 * rows + assert False # Sanity check + + grids = parse(input) + return sum(map(solve, grids)) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() From 58eaa4ea5dc0379b66f8a5db7570402f433e8ea5 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 14 Dec 2023 10:42:55 +0000 Subject: [PATCH 430/479] 2023: d14: ex1: add input --- 2023/d14/ex1/input | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 2023/d14/ex1/input diff --git a/2023/d14/ex1/input b/2023/d14/ex1/input new file mode 100644 index 0000000..146bd48 --- /dev/null +++ b/2023/d14/ex1/input @@ -0,0 +1,100 @@ +O...#.O.OOO.OO.O.OOO...........OO#..##...#...#.O.#.O....#.##..#.#.OOO.O....#....O...O..OOOO.O#...... +O#OO....#O....O..#..###....#.#..#.......#..#.#....O...O.#..O.O#.....#.O#...O.O..##..OO.#...O.O#..... +.O...#..#...##....##....O.OO#O....O.O..#O.....#O.O....#.#O#.#O......#O.....#.O..O.....O.....O...O##. +..O...#OO..O....OO.....OOOO#O.OO..#.........O.O........O..#.........##...O.........O#..O.....#O.OO## +OO.O....#O#..O..#.OO....OO.#.OO...##.O..O..O....OO...O....#.....#..O#OO....#....O.....OO.#.O......OO +#....O...O#..O.O...O...#O#O.#....O.##..#..........OO.#....O#O#..O.OOO.O....O.O.O.O#.O..O..O....O..O. +#.O#..O......OO.#.......O......#.#.O..##..OO..##O.#.O.O#...#.....O.#.O.OO#.O.O#...O.O.#....#.#OOO... +#..O.O.O..O.#.#.#..O#OO.O.O...#.......#...#.#....O.....OO..#.....O....#O...#O..##.O.#....O.....O.O#. +.#O..#........OO.OOO..O...O.O..#O#OO.O.#..#..O.....O.OO..O..#...O......O.O##.O.OO.#..O........#..... +.O.O.O........O..#.O.##....#.#.#..OO..#....O.O.O.O.....#.#..O....OO..O#..O###.OO.OO....#..#..O.##O.. +O.O......#..##.O...#O.#OO.#..O..O...O.#OO...O..OO.O.O..OO....O.#.#.O#O#..O.#.#.OOOO..OO.O.O.O.O.#..O +O#.....#OO#....O..#..O##..OO.............#O#OO.##...O.......##......#O....O.#.O......##...........O. +...##.##..#O......#.......#.....#...#O.O.....#...O..O........O...OO.O..#....##....#O....#...O.O....# +..O.....OO.#..#O#.#OO..O.....O.......O.OOO#OOO.....O..O..O#...........##O..O.#...O.OOO..O.##O.#..#.O +.##...OOO.....#.O...#.O......#.O.O....O......#OOO...#..#.#.#.O...O.O.#.O.###.OO##O....O....#.##..#.. +O..#.#.........O#...O...O.##..#....O.#..#O...##.OOOO#O#.......#..#.........#OO.##..#......O.##...... +..#O...#......O.#.OO..#..O..O#....O.....#....O.#.#......####..##OO.O.O..O...#..#....#..#O#..#.#...O. +............O.......O.....O.#O...#.....###......O...#O....#.OO.##.....#.....O..O.O...O......#O#...OO +..#.O#.#.#..O.OO#.#..#.O.#..O.#.O.O...OO..OO.##..#.#O....O.......OO...O.....#..O..#....O.#...#...OO. +OO...#..#.#..O.OO#O#..##...#...O..#...........O.O.OO.O..#...OO.#.O..O#.#O#.O#.O...O..O...#O..#.O.... +..O.O.#....#...#.O.#.O#...##.O#..#O...........O.##...#...#O..O.....#O.#O.....#..##.O..#.O.....#O.O.. +.O..OO.O....#OO#....#.###O#..OO..##..#..##.....O.O.O........O.O.O.O#...O..#O#..O........#.O###..O.#. +O.#...O.O.OO#..##....OO...O.....O.O.#O....#...#....##.#..#OO...O#O....O...O.#O....#..#...OO..O.#.... +..#...O......O#..O.#..#O#.#OO..#O.O..O..#...#........OOO#.OO.....O##O..#..OO.O##..O..#..O.O...O..O.. +...##.#O.###.###...O..#.#O..#..O....O.#O......O.#....O..OOO..O..O..#..O.#.#.....O.#.#...O#.O..O...OO +...O.#....#..O##..#....O..O...O....OO.#.O..#O....#.....#.#........O....O#O.O....O...#.O..#..O.O#OO.O +.##O....#O#O.O.....#.O...........#..O.......#O...###....#O##O...##..OO.#O..#O.O..O.....#.OO#O..#O... +O.O..........O.#..OO.#...O.O..#..........#......O.......#..#O#...#O..##...O...O#.O..........##...#O. +..#..O..O..#O....O.O...#.O..O.#..O#O...O.#......O.#O..#O#....O#..#....##.#.O.#..##.....#.#.#.....O.# +.O##..#.#O.OOO...O.O..OOO..O..#.O..#..#..OO#..OO...O..O..O.O#O.#.....#O.#.#...#O#.O.O.OO..O.......#. +O..O#.OO.#O..O.##..O..OO#.O.....O.O..##....#O...#..#.#O.#O.O#..O...O.#OO#O.O..#.......O.......O..... +..#.#.##O...#.O.O..O...OO.....O#.....O.#...#O.#O.#....##O.....OOO.O..OO....O.O..##....O.O..#.....O.# +.....#.OO.O....O##..##..O...#......#..#..O..O...#O...#............O.#.......#O.O#......##.O.O.#....# +...#O#.#O.##..#.#...O.O...#..........O.O#....O.O..###.#..O...#.#OOO....OO.O.O#O##........#..O.O...O. +..OOO.O..O#..O#OO.#....O.............#....##.#O...O...O##.O..O..##.....O#....#O#...O.O#.O.#..OOO...# +.#.#..O.O.....#O#.....OO#..O.O..O.O............O..#.#.#.#......####.#O#..#..OO.O.OO#..O#.##....O#..O +........##O.#.......OO......O.OO.##..#..O......O#O...#...O.#......#OO..........O..OO...##..#..O.O.O. +..O#.O...#..O..O.##.....O..##....#...O..#.O..#..O.#.OO...###...#..O..O#..O.O..#.#....O#..#.#......O# +...#..#.#.#..#O..OO#..O.O#...........O.........#.O.OO..#.......O#....O.....#OO.....OO..OO...O.O.O.#. +...O#O......#...O...O..#.O.O#.#O.#....#.OO#.....O.O.#...O.#....O.#...#..O#..#..OOO.O..O.....O#....#O +..O..OO...O..#.#.O..#..#.O.#.O##O..OO..O........#....O##...#....#.#O.#..#......#....#.......O....... +#.........#.O#......OO............O.#......OO.O.#.OO.#..OO..O.##........#O#..OO.#...#.#.O.OO.#.O..#. +...O...#O...O....#..O#O#......#..OO#.O##OOO.#..#O.O#..O...O......O#......OOO..#...#O..OO#........... +.#.#..O#..O......#...O....OOO..#..........O....#..##..#...OO#...O.#.O.#.O......#....O##O..#OOO...... +...O.##...#..O.......#.#.O..O..#.O.....OOOOOOO...#.....O.....#.....O...OOO.##...O#.OO.OO.#...#O#O... +....#.O..#.O.O..O..O#..O.#.......#....#.#....O.....O#....O##O..O..##.O#..OOO#..O.......#.O..O#OO..O. +##.O.............#.#....O...O.......#O#.....OO#O......O..#.......#.#..#...#.......O.O..O....O.#....# +..O..#O..#...#.........O..#.....O.O.#.....O..#..#O....O..O.....##.#...O..O.#..OO#O#...####.O.......# +.O#.#O#..O#...#.O......OOO.O.#..O.O#.#....####......##.O.O.#...#..#O..O........O.....#........O..#.. +.O..O#....O.....O#.O.OOOO##.O..#OO.........##.O.##O...#O...#.O#OO##.....O....O###....###.#.........O +...O##O...O.O..........O#...O#.O...#O..O..##...O#.....O#.O....O...O#.##...#........OOO.O#....OO..### +O.O.O.....O.O..O....O#.OO.O.....O...#..#O#OO...OO..OO.O....#.O.OO....#..O.#O...O...#O#.O#...#.....OO +....#.....##.O#O..#O...OO...O#.#O..#.........OO..#......O..####OOO#...O#.............#.O....O.O..#OO +##O..O.O......O......OOOO..OO##..O........O.....O..O#..OO.O#.O#O#OO#O#..O.O.#..O...O.O.O......##.... +..O.O.#..#.O...#.........O..###.#O..O.#..#......#...O##......O.#.O.O##.....O#..........O..O.....O.#. +....#...O.#...#.#.#.#.O.....O.OO#..O...O#..OOO.OO..O.#.........O.......OO..O..#.#...........#....... +O##...#......#OO..O...O..#O.#OO.##.O.O....#.....O.O.....#O.#....#....O.#.OO..##............#O...O.#. +.OO..##....#.OOO...O.O....O..O.........##..O#.O.OO.....#..OO#....O.O#.#..O.OOO...#.....O#...O.O..O.O +O.O...OO#...O.....O..#.O.........O.O.#...OO....#..O.O..OOO.O..#.O.#.##O#.#OOO.#..#O..O............#. +#..O.O..OO.#O.....#.O.#..O.........#.OO..##.O....#O..OO.O.O.O#.O...OO...O..O.O.O.#..O.....#.O....... +O##..O...##....#O..........O..#..O..O.#.#..O..#.O....#OO......##OOO.##......##.....O.#.........#.... +..#.....#O..O.O......O..#.......#.OO#.....#.O.....O...O.....O#.......#.....#O...O#.#O.###..O.O..##.O +..O.OO.OO...OO.#.......#....#..#O............O.........O....#OO..O...##..O.O..O..OO..##.........O..O +#...O..#O.O..#O..O...#.O.#......O#....#.....O.##..OOO.....O...O.OO#......O...O..O.###OO...#OO.O.OO.# +O#..O....#O.....O#....O..#.O.###..O.OO.#....#...#.O..#O...O.O..O.O........O..#O.O.O..OOO.O..OO..O.#O +#O#.O....#..#......#.#........O...#......#..#.O........O..O.....#............O#..#O#OO#....O.OOOO#.O +...OOO.O........#..O...........#..#O...#.#OOO#....OO.O....#...##.#...#O...#.....OO.#...O..##.O....O. +O.O......#..#.#...OO..##O#..#O.OOO##...O.#O.......O....OOOO.O..O....#.OO#.O...#..O..O.#....#...O..#O +...O..OOO.#OO..O..#O.#O.O#.O..O....#OO.#..O.O.O.....##O...O.......#O..........##...#............O..# +...O.#......O##......#..#............#O#..O......##.#O.O.#OO....O.#..O...O.....O.O....#O.O.O##.#.... +...OO......O#...#.O.#....O.OO.O.##.O..O......#.O.O.O...#O.O.O.O.....##....#...##...#....#OO..#OO#.## +....O....##..##.#.OO....##.....#.....O.O..OO..O...##...#..O##.##......OO.O...OO...OOO..O...##.#.#.O. +#.....O..O.....#.......#.O...........OO..O..O..#......O#.#.OO....#........#..#O.#O#...#..#OOO......O +.O###OO.O##......OO...##O....#..#.....##..#.#OO....#.O.O...#......O....#..O.O..O#O#.###......O....#. +.O..#OO...O#O.....O...#O.O..O..O..##.O..O#.O#.OO..O..O#....O.O.O...OO#....O....O.OOO.O....O...#.##.. +.O........OO...#.OOO..O.#O.##..#..........O..........#.O...OO#.#..O.#O##O...#.....#O#.O#.......#.... +OO.O.......##..O#OO...#.#.#.#.O..O......#..#OO.#...O............#.#.#.##....O.O..#...OO#.##..#O..O.. +O..OO.....#..##.O.#O.....O.O.#...O#.#...#O.OO...O.O..#.##O..OO#..O...##..OO#..O##...O.....#.#..O#.OO +.O...#..#O#..OOO..O#.O#..#O...O.O#.....#...........O.##....O..O...#.OO............O.O#.....#O.O#..O. +..O.O.........#O...#...#..O#.#...#OO##..O#...#.OO#O....OO.O#O......OO...O#O.O....O#O..O#........O..O +#...O....OO.O#..#.#......#.....O#...O.#.O..O...#..O.O..O.O.#OO.O....#....#.......O......O...#.#..#.. +.O..OO.O.#O....##O#..O.#O.#.#..#....##.#O...#.O......#.OO#...#O...O.#...O.OO.#.O.#.O...O....#...#... +..OO......O.O....O#..O..##.###.....O.#..##.#.O......O...#...#..O...O.O.#....#.#...O.O.#........#.#.. +#...#..#.......#.O.O..#..OO..O.O..OOO.O..O..#......O..O..#OO##....O.#.#.O#O#..O#.##.O...#..#.O....#. +#.O#O.O.OOOO#...#..O#..#O#O..#....O...#.OO.#.###.O.......OO.O..O..OOO.#O.O.........#...#.O..O..O...# +.#.O..##..O...O....O......OO.............O.....OO#O..#.....#.OOO##O.OO........#..#.##..OO..........O +OOOOO....#O.O......O.#O#...#...#.#.#OO.O.#..O..##...##...O.....O...O...O##O..O.#O..O#.O...O.O...OOO. +.O..#..#.#..O.O.##O....#......O#.OOO..O....#O.#.###O.#.#.OO.O.#.OO.........#....#..OO.O.O.O##.#.##.. +#O...O..O..O.O.O..........#.#...#O.O......O.O#...OO...#..O..O.....OO...#....#.##......O.........OO.O +..O..##..O.....O.O.....O.O.....O.O...##...O.......#...OO...#..O...#OO.O..#OO..#...#....OO###.O.....O +#...O......#.OO.....O......###..#...#...#.#.....OO#.#.O#..#......O....O.O...#..O#O#..##....#...#.... +..O..#O...#.......O##..#.....O#..O#...OO.#..#.O.O..O..O#.#.OO.O.#..O..O..##...#.O....OO#O........... +.###.O.....#...#......#..#.....#..#....#..O.O....O.#..#..#O#.......#.O.O.....OO#.O...#OO.#..OO#..... +.#.....O...#O.........#....##.O......O.OO##...#.....#..#..O##.#...#..O..#O.O..#O...O..O.O...O.....O. +.#....##....O....O..OO....OO..#..#..OO...O..#.O.O..#..O###.O...#O.#.O.O.O.OO........###....OOO.....# +#.#..O..#.O#...#O.....#..O#.OO..O.#..OOO..O..#...O..O......O..#........#.#O#..O..O#OO.##.#.#.....#.O +......#.#.....O#....OO#...O#.#.O.O#.....O...##..###.....O#.....#..OO#.......OO....#...#.O......O.... +.........O.#........O...O#.#....O..#..O#OOO..#...O.O.....#.#OO.O.OO......#.....OO#O...O...#...#O..OO +..O#..OO.OO#..O##.O..O.##O....#..O##.......#..O........#.O......#....#O..OOO#..OO.O...#...##O.O...OO +..#.....OOO..O.#O#.O##..##..O#.##..OO...#..O..O..#.OOO...O..O.#..O#..#.OO#..O.OO...OOO..O...O..#.... From c0c824513eb2b43838292df5af86801ff90f8d60 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 14 Dec 2023 10:43:03 +0000 Subject: [PATCH 431/479] 2023: d14: ex1: add solution --- 2023/d14/ex1/ex1.py | 68 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100755 2023/d14/ex1/ex1.py diff --git a/2023/d14/ex1/ex1.py b/2023/d14/ex1/ex1.py new file mode 100755 index 0000000..290cd48 --- /dev/null +++ b/2023/d14/ex1/ex1.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python + +import itertools +import sys +from enum import StrEnum +from typing import NamedTuple, Optional + + +class Cell(StrEnum): + ROLLER = "O" + CUBE = "#" + EMPTY = "." + + +class Map(NamedTuple): + rocks: tuple[tuple[Optional[Cell], ...], ...] + lines: int + rows: int + + def tilt_north(self) -> "Map": + rocks = [[Cell.EMPTY for _ in range(self.rows)] for _ in range(self.lines)] + + for y in range(self.rows): + rolling_stop = -1 + + for x in range(self.lines): + # Nothing to do on empty cell + if self.rocks[x][y] == Cell.EMPTY: + continue + # Record the new stop point on cubes + if self.rocks[x][y] == Cell.CUBE: + rolling_stop = x + rocks[x][y] = Cell.CUBE + continue + # For rollers, roll it up to the `last_cube` + rocks[rolling_stop + 1][y] = Cell.ROLLER + rolling_stop += 1 + + return Map(tuple(map(tuple, rocks)), self.lines, self.rows) + + def load(self) -> int: + res = 0 + + for x, y in itertools.product(range(self.lines), range(self.rows)): + if self.rocks[x][y] != Cell.ROLLER: + continue + res += self.lines - x + + return res + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> Map: + rocks = tuple(tuple(Cell(c) for c in line) for line in input) + return Map(rocks, len(input), len(input[0])) + + map = parse(input) + map = map.tilt_north() + return map.load() + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From d39bc20a2195a59c3aaf805a3d77c2eca4bb47ba Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 14 Dec 2023 10:43:09 +0000 Subject: [PATCH 432/479] 2023: d14: ex2: add input --- 2023/d14/ex2/input | 100 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 2023/d14/ex2/input diff --git a/2023/d14/ex2/input b/2023/d14/ex2/input new file mode 100644 index 0000000..146bd48 --- /dev/null +++ b/2023/d14/ex2/input @@ -0,0 +1,100 @@ +O...#.O.OOO.OO.O.OOO...........OO#..##...#...#.O.#.O....#.##..#.#.OOO.O....#....O...O..OOOO.O#...... +O#OO....#O....O..#..###....#.#..#.......#..#.#....O...O.#..O.O#.....#.O#...O.O..##..OO.#...O.O#..... +.O...#..#...##....##....O.OO#O....O.O..#O.....#O.O....#.#O#.#O......#O.....#.O..O.....O.....O...O##. +..O...#OO..O....OO.....OOOO#O.OO..#.........O.O........O..#.........##...O.........O#..O.....#O.OO## +OO.O....#O#..O..#.OO....OO.#.OO...##.O..O..O....OO...O....#.....#..O#OO....#....O.....OO.#.O......OO +#....O...O#..O.O...O...#O#O.#....O.##..#..........OO.#....O#O#..O.OOO.O....O.O.O.O#.O..O..O....O..O. +#.O#..O......OO.#.......O......#.#.O..##..OO..##O.#.O.O#...#.....O.#.O.OO#.O.O#...O.O.#....#.#OOO... +#..O.O.O..O.#.#.#..O#OO.O.O...#.......#...#.#....O.....OO..#.....O....#O...#O..##.O.#....O.....O.O#. +.#O..#........OO.OOO..O...O.O..#O#OO.O.#..#..O.....O.OO..O..#...O......O.O##.O.OO.#..O........#..... +.O.O.O........O..#.O.##....#.#.#..OO..#....O.O.O.O.....#.#..O....OO..O#..O###.OO.OO....#..#..O.##O.. +O.O......#..##.O...#O.#OO.#..O..O...O.#OO...O..OO.O.O..OO....O.#.#.O#O#..O.#.#.OOOO..OO.O.O.O.O.#..O +O#.....#OO#....O..#..O##..OO.............#O#OO.##...O.......##......#O....O.#.O......##...........O. +...##.##..#O......#.......#.....#...#O.O.....#...O..O........O...OO.O..#....##....#O....#...O.O....# +..O.....OO.#..#O#.#OO..O.....O.......O.OOO#OOO.....O..O..O#...........##O..O.#...O.OOO..O.##O.#..#.O +.##...OOO.....#.O...#.O......#.O.O....O......#OOO...#..#.#.#.O...O.O.#.O.###.OO##O....O....#.##..#.. +O..#.#.........O#...O...O.##..#....O.#..#O...##.OOOO#O#.......#..#.........#OO.##..#......O.##...... +..#O...#......O.#.OO..#..O..O#....O.....#....O.#.#......####..##OO.O.O..O...#..#....#..#O#..#.#...O. +............O.......O.....O.#O...#.....###......O...#O....#.OO.##.....#.....O..O.O...O......#O#...OO +..#.O#.#.#..O.OO#.#..#.O.#..O.#.O.O...OO..OO.##..#.#O....O.......OO...O.....#..O..#....O.#...#...OO. +OO...#..#.#..O.OO#O#..##...#...O..#...........O.O.OO.O..#...OO.#.O..O#.#O#.O#.O...O..O...#O..#.O.... +..O.O.#....#...#.O.#.O#...##.O#..#O...........O.##...#...#O..O.....#O.#O.....#..##.O..#.O.....#O.O.. +.O..OO.O....#OO#....#.###O#..OO..##..#..##.....O.O.O........O.O.O.O#...O..#O#..O........#.O###..O.#. +O.#...O.O.OO#..##....OO...O.....O.O.#O....#...#....##.#..#OO...O#O....O...O.#O....#..#...OO..O.#.... +..#...O......O#..O.#..#O#.#OO..#O.O..O..#...#........OOO#.OO.....O##O..#..OO.O##..O..#..O.O...O..O.. +...##.#O.###.###...O..#.#O..#..O....O.#O......O.#....O..OOO..O..O..#..O.#.#.....O.#.#...O#.O..O...OO +...O.#....#..O##..#....O..O...O....OO.#.O..#O....#.....#.#........O....O#O.O....O...#.O..#..O.O#OO.O +.##O....#O#O.O.....#.O...........#..O.......#O...###....#O##O...##..OO.#O..#O.O..O.....#.OO#O..#O... +O.O..........O.#..OO.#...O.O..#..........#......O.......#..#O#...#O..##...O...O#.O..........##...#O. +..#..O..O..#O....O.O...#.O..O.#..O#O...O.#......O.#O..#O#....O#..#....##.#.O.#..##.....#.#.#.....O.# +.O##..#.#O.OOO...O.O..OOO..O..#.O..#..#..OO#..OO...O..O..O.O#O.#.....#O.#.#...#O#.O.O.OO..O.......#. +O..O#.OO.#O..O.##..O..OO#.O.....O.O..##....#O...#..#.#O.#O.O#..O...O.#OO#O.O..#.......O.......O..... +..#.#.##O...#.O.O..O...OO.....O#.....O.#...#O.#O.#....##O.....OOO.O..OO....O.O..##....O.O..#.....O.# +.....#.OO.O....O##..##..O...#......#..#..O..O...#O...#............O.#.......#O.O#......##.O.O.#....# +...#O#.#O.##..#.#...O.O...#..........O.O#....O.O..###.#..O...#.#OOO....OO.O.O#O##........#..O.O...O. +..OOO.O..O#..O#OO.#....O.............#....##.#O...O...O##.O..O..##.....O#....#O#...O.O#.O.#..OOO...# +.#.#..O.O.....#O#.....OO#..O.O..O.O............O..#.#.#.#......####.#O#..#..OO.O.OO#..O#.##....O#..O +........##O.#.......OO......O.OO.##..#..O......O#O...#...O.#......#OO..........O..OO...##..#..O.O.O. +..O#.O...#..O..O.##.....O..##....#...O..#.O..#..O.#.OO...###...#..O..O#..O.O..#.#....O#..#.#......O# +...#..#.#.#..#O..OO#..O.O#...........O.........#.O.OO..#.......O#....O.....#OO.....OO..OO...O.O.O.#. +...O#O......#...O...O..#.O.O#.#O.#....#.OO#.....O.O.#...O.#....O.#...#..O#..#..OOO.O..O.....O#....#O +..O..OO...O..#.#.O..#..#.O.#.O##O..OO..O........#....O##...#....#.#O.#..#......#....#.......O....... +#.........#.O#......OO............O.#......OO.O.#.OO.#..OO..O.##........#O#..OO.#...#.#.O.OO.#.O..#. +...O...#O...O....#..O#O#......#..OO#.O##OOO.#..#O.O#..O...O......O#......OOO..#...#O..OO#........... +.#.#..O#..O......#...O....OOO..#..........O....#..##..#...OO#...O.#.O.#.O......#....O##O..#OOO...... +...O.##...#..O.......#.#.O..O..#.O.....OOOOOOO...#.....O.....#.....O...OOO.##...O#.OO.OO.#...#O#O... +....#.O..#.O.O..O..O#..O.#.......#....#.#....O.....O#....O##O..O..##.O#..OOO#..O.......#.O..O#OO..O. +##.O.............#.#....O...O.......#O#.....OO#O......O..#.......#.#..#...#.......O.O..O....O.#....# +..O..#O..#...#.........O..#.....O.O.#.....O..#..#O....O..O.....##.#...O..O.#..OO#O#...####.O.......# +.O#.#O#..O#...#.O......OOO.O.#..O.O#.#....####......##.O.O.#...#..#O..O........O.....#........O..#.. +.O..O#....O.....O#.O.OOOO##.O..#OO.........##.O.##O...#O...#.O#OO##.....O....O###....###.#.........O +...O##O...O.O..........O#...O#.O...#O..O..##...O#.....O#.O....O...O#.##...#........OOO.O#....OO..### +O.O.O.....O.O..O....O#.OO.O.....O...#..#O#OO...OO..OO.O....#.O.OO....#..O.#O...O...#O#.O#...#.....OO +....#.....##.O#O..#O...OO...O#.#O..#.........OO..#......O..####OOO#...O#.............#.O....O.O..#OO +##O..O.O......O......OOOO..OO##..O........O.....O..O#..OO.O#.O#O#OO#O#..O.O.#..O...O.O.O......##.... +..O.O.#..#.O...#.........O..###.#O..O.#..#......#...O##......O.#.O.O##.....O#..........O..O.....O.#. +....#...O.#...#.#.#.#.O.....O.OO#..O...O#..OOO.OO..O.#.........O.......OO..O..#.#...........#....... +O##...#......#OO..O...O..#O.#OO.##.O.O....#.....O.O.....#O.#....#....O.#.OO..##............#O...O.#. +.OO..##....#.OOO...O.O....O..O.........##..O#.O.OO.....#..OO#....O.O#.#..O.OOO...#.....O#...O.O..O.O +O.O...OO#...O.....O..#.O.........O.O.#...OO....#..O.O..OOO.O..#.O.#.##O#.#OOO.#..#O..O............#. +#..O.O..OO.#O.....#.O.#..O.........#.OO..##.O....#O..OO.O.O.O#.O...OO...O..O.O.O.#..O.....#.O....... +O##..O...##....#O..........O..#..O..O.#.#..O..#.O....#OO......##OOO.##......##.....O.#.........#.... +..#.....#O..O.O......O..#.......#.OO#.....#.O.....O...O.....O#.......#.....#O...O#.#O.###..O.O..##.O +..O.OO.OO...OO.#.......#....#..#O............O.........O....#OO..O...##..O.O..O..OO..##.........O..O +#...O..#O.O..#O..O...#.O.#......O#....#.....O.##..OOO.....O...O.OO#......O...O..O.###OO...#OO.O.OO.# +O#..O....#O.....O#....O..#.O.###..O.OO.#....#...#.O..#O...O.O..O.O........O..#O.O.O..OOO.O..OO..O.#O +#O#.O....#..#......#.#........O...#......#..#.O........O..O.....#............O#..#O#OO#....O.OOOO#.O +...OOO.O........#..O...........#..#O...#.#OOO#....OO.O....#...##.#...#O...#.....OO.#...O..##.O....O. +O.O......#..#.#...OO..##O#..#O.OOO##...O.#O.......O....OOOO.O..O....#.OO#.O...#..O..O.#....#...O..#O +...O..OOO.#OO..O..#O.#O.O#.O..O....#OO.#..O.O.O.....##O...O.......#O..........##...#............O..# +...O.#......O##......#..#............#O#..O......##.#O.O.#OO....O.#..O...O.....O.O....#O.O.O##.#.... +...OO......O#...#.O.#....O.OO.O.##.O..O......#.O.O.O...#O.O.O.O.....##....#...##...#....#OO..#OO#.## +....O....##..##.#.OO....##.....#.....O.O..OO..O...##...#..O##.##......OO.O...OO...OOO..O...##.#.#.O. +#.....O..O.....#.......#.O...........OO..O..O..#......O#.#.OO....#........#..#O.#O#...#..#OOO......O +.O###OO.O##......OO...##O....#..#.....##..#.#OO....#.O.O...#......O....#..O.O..O#O#.###......O....#. +.O..#OO...O#O.....O...#O.O..O..O..##.O..O#.O#.OO..O..O#....O.O.O...OO#....O....O.OOO.O....O...#.##.. +.O........OO...#.OOO..O.#O.##..#..........O..........#.O...OO#.#..O.#O##O...#.....#O#.O#.......#.... +OO.O.......##..O#OO...#.#.#.#.O..O......#..#OO.#...O............#.#.#.##....O.O..#...OO#.##..#O..O.. +O..OO.....#..##.O.#O.....O.O.#...O#.#...#O.OO...O.O..#.##O..OO#..O...##..OO#..O##...O.....#.#..O#.OO +.O...#..#O#..OOO..O#.O#..#O...O.O#.....#...........O.##....O..O...#.OO............O.O#.....#O.O#..O. +..O.O.........#O...#...#..O#.#...#OO##..O#...#.OO#O....OO.O#O......OO...O#O.O....O#O..O#........O..O +#...O....OO.O#..#.#......#.....O#...O.#.O..O...#..O.O..O.O.#OO.O....#....#.......O......O...#.#..#.. +.O..OO.O.#O....##O#..O.#O.#.#..#....##.#O...#.O......#.OO#...#O...O.#...O.OO.#.O.#.O...O....#...#... +..OO......O.O....O#..O..##.###.....O.#..##.#.O......O...#...#..O...O.O.#....#.#...O.O.#........#.#.. +#...#..#.......#.O.O..#..OO..O.O..OOO.O..O..#......O..O..#OO##....O.#.#.O#O#..O#.##.O...#..#.O....#. +#.O#O.O.OOOO#...#..O#..#O#O..#....O...#.OO.#.###.O.......OO.O..O..OOO.#O.O.........#...#.O..O..O...# +.#.O..##..O...O....O......OO.............O.....OO#O..#.....#.OOO##O.OO........#..#.##..OO..........O +OOOOO....#O.O......O.#O#...#...#.#.#OO.O.#..O..##...##...O.....O...O...O##O..O.#O..O#.O...O.O...OOO. +.O..#..#.#..O.O.##O....#......O#.OOO..O....#O.#.###O.#.#.OO.O.#.OO.........#....#..OO.O.O.O##.#.##.. +#O...O..O..O.O.O..........#.#...#O.O......O.O#...OO...#..O..O.....OO...#....#.##......O.........OO.O +..O..##..O.....O.O.....O.O.....O.O...##...O.......#...OO...#..O...#OO.O..#OO..#...#....OO###.O.....O +#...O......#.OO.....O......###..#...#...#.#.....OO#.#.O#..#......O....O.O...#..O#O#..##....#...#.... +..O..#O...#.......O##..#.....O#..O#...OO.#..#.O.O..O..O#.#.OO.O.#..O..O..##...#.O....OO#O........... +.###.O.....#...#......#..#.....#..#....#..O.O....O.#..#..#O#.......#.O.O.....OO#.O...#OO.#..OO#..... +.#.....O...#O.........#....##.O......O.OO##...#.....#..#..O##.#...#..O..#O.O..#O...O..O.O...O.....O. +.#....##....O....O..OO....OO..#..#..OO...O..#.O.O..#..O###.O...#O.#.O.O.O.OO........###....OOO.....# +#.#..O..#.O#...#O.....#..O#.OO..O.#..OOO..O..#...O..O......O..#........#.#O#..O..O#OO.##.#.#.....#.O +......#.#.....O#....OO#...O#.#.O.O#.....O...##..###.....O#.....#..OO#.......OO....#...#.O......O.... +.........O.#........O...O#.#....O..#..O#OOO..#...O.O.....#.#OO.O.OO......#.....OO#O...O...#...#O..OO +..O#..OO.OO#..O##.O..O.##O....#..O##.......#..O........#.O......#....#O..OOO#..OO.O...#...##O.O...OO +..#.....OOO..O.#O#.O##..##..O#.##..OO...#..O..O..#.OOO...O..O.#..O#..#.OO#..O.OO...OOO..O...O..#.... From 26d37fbe0e08f73b2e198322c621cc855e2df49c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 14 Dec 2023 10:43:13 +0000 Subject: [PATCH 433/479] 2023: d14: ex2: add solution --- 2023/d14/ex2/ex2.py | 151 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100755 2023/d14/ex2/ex2.py diff --git a/2023/d14/ex2/ex2.py b/2023/d14/ex2/ex2.py new file mode 100755 index 0000000..b7b0222 --- /dev/null +++ b/2023/d14/ex2/ex2.py @@ -0,0 +1,151 @@ +#!/usr/bin/env python + +import itertools +import sys +from enum import StrEnum +from typing import NamedTuple, Optional + + +class Cell(StrEnum): + ROLLER = "O" + CUBE = "#" + EMPTY = "." + + +class Map(NamedTuple): + rocks: tuple[tuple[Optional[Cell], ...], ...] + lines: int + rows: int + + def tilt_north(self) -> "Map": + rocks = [[Cell.EMPTY for _ in range(self.rows)] for _ in range(self.lines)] + + for y in range(self.rows): + rolling_stop = -1 + + for x in range(self.lines): + # Nothing to do on empty cell + if self.rocks[x][y] == Cell.EMPTY: + continue + # Record the new stop point on cubes + if self.rocks[x][y] == Cell.CUBE: + rolling_stop = x + rocks[x][y] = Cell.CUBE + continue + # For rollers, roll it up to the `last_cube` + rocks[rolling_stop + 1][y] = Cell.ROLLER + rolling_stop += 1 + + return Map(tuple(map(tuple, rocks)), self.lines, self.rows) + + def tilt_south(self) -> "Map": + rocks = [[Cell.EMPTY for _ in range(self.rows)] for _ in range(self.lines)] + + for y in range(self.rows): + rolling_stop = self.rows + + for x in reversed(range(self.lines)): + # Nothing to do on empty cell + if self.rocks[x][y] == Cell.EMPTY: + continue + # Record the new stop point on cubes + if self.rocks[x][y] == Cell.CUBE: + rolling_stop = x + rocks[x][y] = Cell.CUBE + continue + # For rollers, roll it up to the `last_cube` + rocks[rolling_stop - 1][y] = Cell.ROLLER + rolling_stop -= 1 + + return Map(tuple(map(tuple, rocks)), self.lines, self.rows) + + def tilt_west(self) -> "Map": + rocks = [[Cell.EMPTY for _ in range(self.rows)] for _ in range(self.lines)] + + for x in range(self.lines): + rolling_stop = -1 + + for y in range(self.rows): + # Nothing to do on empty cell + if self.rocks[x][y] == Cell.EMPTY: + continue + # Record the new stop point on cubes + if self.rocks[x][y] == Cell.CUBE: + rolling_stop = y + rocks[x][y] = Cell.CUBE + continue + # For rollers, roll it up to the `last_cube` + rocks[x][rolling_stop + 1] = Cell.ROLLER + rolling_stop += 1 + + return Map(tuple(map(tuple, rocks)), self.lines, self.rows) + + def tilt_east(self) -> "Map": + rocks = [[Cell.EMPTY for _ in range(self.rows)] for _ in range(self.lines)] + + for x in range(self.lines): + rolling_stop = self.lines + + for y in reversed(range(self.rows)): + # Nothing to do on empty cell + if self.rocks[x][y] == Cell.EMPTY: + continue + # Record the new stop point on cubes + if self.rocks[x][y] == Cell.CUBE: + rolling_stop = y + rocks[x][y] = Cell.CUBE + continue + # For rollers, roll it up to the `last_cube` + rocks[x][rolling_stop - 1] = Cell.ROLLER + rolling_stop -= 1 + + return Map(tuple(map(tuple, rocks)), self.lines, self.rows) + + def cycle(self) -> "Map": + return self.tilt_north().tilt_west().tilt_south().tilt_east() + + def load(self) -> int: + res = 0 + + for x, y in itertools.product(range(self.lines), range(self.rows)): + if self.rocks[x][y] != Cell.ROLLER: + continue + res += self.lines - x + + return res + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> Map: + rocks = tuple(tuple(Cell(c) for c in line) for line in input) + return Map(rocks, len(input), len(input[0])) + + def do_cycles(map: Map) -> Map: + cache = {map: 0} + t = 0 + SPIN_CYCLE_LENGTH = 1000000000 + while t < SPIN_CYCLE_LENGTH: + map = map.cycle() + t += 1 + if map in cache: + previous_t = cache[map] + cycle_length = t - previous_t + num_cycles = (SPIN_CYCLE_LENGTH - t) // cycle_length + t += num_cycles * cycle_length + else: + cache[map] = t + + return map + + map = parse(input) + map = do_cycles(map) + return map.load() + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From f1c8a7693b5bbc503a078f4b615a5d5e4bf626ad Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 15 Dec 2023 10:58:54 +0000 Subject: [PATCH 434/479] 2023: d15: ex1: add input --- 2023/d15/ex1/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2023/d15/ex1/input diff --git a/2023/d15/ex1/input b/2023/d15/ex1/input new file mode 100644 index 0000000..1820faf --- /dev/null +++ b/2023/d15/ex1/input @@ -0,0 +1 @@ +xxcc=8,jq=4,qbns=7,qgp-,jb=4,mxh=3,ltf-,xlkb-,ff=5,fjrp-,nl=8,lmhb-,tjfk-,qnn-,fz-,hjp-,msl=6,vmm-,dj=6,db-,knp-,lkks-,jq=5,db-,jx-,tp=1,gtx=7,mktfz-,fx-,jk=2,ddk=6,rzpt-,qpn=5,hxl=6,vl-,xpl=1,mbrmr=6,mnx-,jbgf-,lmpxsn=8,psf-,vv=6,nkccfg=7,xg-,ss-,sx=5,tc-,vmcsh=8,vnz-,pgpzq=9,jzhvv=7,nkccfg=9,kzzn-,lrkmv=7,vgv=9,vb=9,jq=1,jv=8,chfsm-,htqt=9,zk-,gc=5,mt=7,mcpkb-,fx=6,mktfz-,sbx-,psb-,df=4,jv-,xh-,zzqmg=2,mxtz-,kr-,psr=6,mxtz-,px-,klnvl-,vgv-,cspg=9,sspm-,tt-,kqql-,xznvs-,vsd-,td=4,kbmc=4,ggf-,bltn-,ks=9,rf-,jx-,qgp-,pb=5,cpb=5,tn=3,sx-,sh-,xc-,hch-,vmm=9,tbc-,mktfz-,hc=1,smks-,hh=6,jgrd-,vgc-,cpb-,gc=5,xfg=3,jq=5,qs=5,gnhjs=7,gg=4,jbgf-,clpc-,kjcqvr-,bmhs-,bt-,bbth-,fn-,nrvg-,zgs=2,jq=5,dsp=9,gdx-,gdc-,grkk=5,mhqzc-,pl-,lrdkf=1,rj-,pjct=2,scx-,cxz=9,dxtvkd=9,xj=3,pssx=7,vkf-,jgs=3,hgpd-,vm-,ggf=2,xt=6,jfrkh=5,flh=6,hgjhv=2,grkk-,gr-,vcp=8,hgpd-,gxc-,ftp=8,xsbg=2,vnk=2,sq=8,mnpbcf-,sgv=4,dbs=7,lzmb=7,vmcsh=6,rtclsf-,ngs-,xjznm-,vss=7,qq-,vg-,bt-,zgs-,xpl-,qpn=7,lk=1,qq-,vxlgph-,kp=7,ctg=3,gpjm=3,dcmx-,kglvq=7,rjrm-,rncmzp-,fn=2,stg=9,mnpbcf=4,sdg=7,nkzzc-,gpt-,srb=2,sf-,bdlt=2,mcpkb-,mdvnr-,bclt=3,dgk-,zsg=3,pzjgls-,bt=4,mz=5,hd=4,ljr-,clpc-,qpn=8,fjrp=9,cspg=9,jb-,xsh=3,jnps=1,lmhb-,dk-,rmm-,shx-,vnk-,gtx=2,hvvh-,jkz=7,mch=2,bltn-,ghk-,pjl=9,gpt-,fjrp=4,cpb-,thn-,sdbj=5,hb=1,qjjfz=2,kz=6,hb-,jc-,msb=3,tc=8,dgf=6,vsm-,rzpt-,sbg-,hhz=3,qjjfz-,vsd=9,ztcgrm=6,gzx=1,jkz-,qpn-,ngs-,vp-,bg-,kpv=1,xg-,ph=6,lmhb=4,xh-,lrc-,hgv=9,msb=4,ttk=2,vxr-,td-,rt-,kf=1,pnq=7,bzk=2,vzp-,hvs-,cpz=6,sjdkl-,vnz=9,lkks=5,dgk-,vmm-,psf-,ckcslv=5,vv=1,njv=1,dtdk-,gg-,scx=6,gxs=1,bt=7,dqns=3,sdg-,rp=1,bnn=3,sq-,ttk=9,bdlt=6,lkks-,cx-,mbrmr-,jc-,rl=3,psr-,ctg=9,vb=1,pssx-,lnc=4,crxg-,sspm-,fx-,gr-,vjv=8,bl=5,pc=4,hb=3,mkn-,fhp=5,kpmfqs-,vxlgph-,khsf-,lnc-,gpjm-,jnps=1,nfv=9,dxtvkd-,kd-,jgs-,ssp-,kzt=9,ss=3,lcq=7,nks=4,nsnn=9,msl=8,dv=4,rzxt=6,mfx=6,rbpp-,grkk-,lvfdjv-,qx-,gxd=3,ckrt=1,pz-,jb-,zbc-,hh-,jvjdbb-,ztcgrm=5,xsbg-,tv=8,ftp=1,bzk=3,jhm-,xxcc=3,rxrt=2,rq=7,rt-,vphf=6,xm=3,srb=5,hzq=6,zxz-,mnt=1,vlnd=4,fr=5,dbs=6,bzp=1,rbt=4,nj=5,lvfdjv=2,qb=6,hzq-,ckrt-,dgpf=5,fl=7,lf=2,svg-,kbmc=1,fz=3,kpd=3,kf=2,mnx=7,bjd=2,dkv-,vmm=9,zhd-,xvh-,pnq-,lvfdjv-,xzf-,pb=8,ctg-,mch=8,bjd=7,vzp-,bdlt=2,dv=7,xc-,bzp=2,xfg-,kz=7,nmn=9,kbqc-,mxh-,gfjrh=6,dnj-,bpf=3,qqj=6,dnc-,gc-,jq=5,nmrt=1,hd-,dz=5,hd-,dgf=3,tn-,pbdd-,nn-,xc-,cxz=3,vg-,nkccfg-,xvh=9,gxmgld=5,jq=2,kgk=4,kzzn-,ltf-,hmv-,ttk-,rmm=8,xpl=3,nvx=8,hzq-,lrc=4,gdx=2,zzx=5,gg=6,kzt=4,xvh=9,cc-,rfs=3,smnh-,kpb-,nsnn-,pl=9,bpf-,jv=5,ng=8,gxc-,rzxt=9,bbth-,lnc=5,nn=2,cxxrc-,vbs=7,dkv=2,sbg=6,qfpf=5,crxg-,bt=7,vc-,qrr-,gtm=5,ltf-,lrdkf=3,gqgzxf-,lzmb-,xkt=4,hh=9,sn=4,hr-,zdjgj-,jx=2,cpz-,hjp-,hh=6,vtms-,pgr-,jq-,mxh=7,kf=5,lbdrk-,kqql-,vjv-,jfsg=5,vc-,mnt=7,xb=9,hgjhv-,mxtz=5,zgs=2,zhd=5,vdfx-,fx=3,mf=6,sck-,kf-,gr-,kpv=5,xt-,msb=2,hjx-,mxh=1,tc-,rvs-,vzp=5,cl-,fl-,ddn-,vcp=1,rjk=2,qq=1,jgs=4,slds=5,jdb-,grkk=2,vmcsh-,nmq-,dsp=3,lmpxsn-,hch-,xgrs-,tt-,vxr=3,hch=6,mdn=6,cc=7,dv-,dhjv-,vgc-,qbns=6,psr-,vsm=7,mhqzc-,vxlgph=2,vc=2,vjl=9,rfs-,gpjm=6,vfjdpr-,hjx-,xvh=8,fkrs=1,lk-,sccd-,lmhb=3,pt=1,tc-,hzq-,khsf-,bl-,zdtb=6,hbg-,gq=8,dgpf-,kpd-,ddk=6,rbpp=2,jbgf=6,xzf=9,td=4,vl-,qqj=2,dgf-,xvh-,fqqx=7,kqql=9,lkks-,nn-,xt=8,sh=5,kp-,kn-,bmxzp-,bl-,nks-,kn=9,ml-,hxl-,qfpf-,tsvtm=4,kglvq=3,pgpzq-,kvkdr=1,fr-,bfsnt-,gxc-,mbp=4,gk=9,bclt=1,fk-,kk-,dd-,sf-,hd-,snz=2,tjfk-,hb=6,mdvnr-,ngs-,sccd=6,sh=5,lnc=1,jf-,smks=5,rxrt-,bb-,xlx-,nmrt=7,pxlvz-,bjd=6,nl=1,pssx-,tc=7,nmrt-,xsh=6,nfv=5,qr=3,sgvz-,jhm=6,xlkb-,bpf-,fv-,mv=2,xg=2,vxlgph-,msb=6,pmp=8,qq-,sck=2,qbpq-,qr-,dbs=6,pz=3,dkv=1,kq=4,vzp=1,lzmb-,rbt=2,hjp=3,kqql-,df-,mjx-,rtclsf=4,ssj-,hz-,lcq=8,rbt=4,rz-,tq=1,lzmb-,ljr=9,hgqr-,zhd=1,hg-,tqhs-,mk-,cx-,xkt=9,qq=9,bfsnt-,gq-,ddn=7,qhsj-,jvx-,qqj=8,fpp=8,qbpq-,sspm=6,dgk=7,gxmgld=2,vnk-,dsfb-,vjv-,sdbj=1,sq=5,hjp=6,jhm-,jxf-,vv-,df=8,nsnn=4,kf=3,gdc-,ntgd-,jnps-,ttk-,ncndp=1,hjp-,qx=3,gq-,tv-,bnn-,fpp=2,fjrp=3,ks=2,ndq-,qrr-,fkrs=3,kz=9,mjx-,qjjfz=9,kr-,hg-,szxdt=9,qb=2,kzzn-,qqj-,zv-,tb=4,nkr=4,rnk-,mxh=5,vmm=5,xh-,qrr=4,gr=5,pxhnxj=9,vgc-,sck=2,hjp-,mcl-,rjrm-,rmm-,cspg-,vc=2,srb=4,mxtz=1,mnt-,tqb-,dv=1,cp=7,gfjrh-,fr=2,nl=4,mcl-,vmh-,nsm-,ssp=4,nvx=5,lrkmv-,hc-,dsp=1,mz=9,sjdkl=9,jpn-,kglvq=1,fl-,flp=8,mf=5,dg-,sccd=6,cb-,ngs=6,tjfk=9,px-,svg=4,gfjht-,nbd=3,sccd-,hjx=6,xsh=2,pjl=8,lrc-,bbth-,vvl-,kp-,sx=7,ngqh-,chv=2,sdg=8,zjhht-,ghk=7,zsgl=6,tzz-,zg=8,dbs=5,fbng=6,tv-,qx-,hgjhv-,hbg=5,mdn-,hmv=1,hhz=5,xvs=2,vzp-,zjhht-,tls=5,tzz-,zf=9,rvr=3,qbns=2,bqctt=7,prf-,xsh=3,hbg=5,pz=6,nsm-,ks=8,qx-,smks=5,tg=8,krl-,mktfz-,rxrt=6,sgvz-,zxz-,hp-,hxl=2,fjrp=3,dj=4,mz-,mk=1,rxrt=2,bjd=8,dk=3,fqqx=5,snz-,kn=5,vxlgph=5,vg-,fjrp=6,mcpkb=2,szx=8,knp=5,dv-,qg=6,jvjdbb-,rlfgd=4,hvs=5,gpjm-,cb=7,dd=7,vfjdpr-,hvs-,hg=2,lpd=8,zbc-,mth-,qndj-,bk-,xgrs=6,vvl-,ljr-,sbx=8,td-,pb-,sft-,gq=1,mf=2,hxl-,hbg=5,jpn-,lpd=1,rf=4,mdqh-,mr=3,rmm-,bpf-,mnpbcf=2,xsh-,sspm-,gzx=6,clpc=4,xlkb-,vgc=1,xgrs=9,gxs=5,ftlcft-,sj=3,lkks=4,xg-,vd-,mhx=8,hqlkpl=3,qqh=3,tb=7,glmzc-,td-,lrpxp=4,pgpzq-,jb-,dvh=8,bmxzp-,bzsx=8,dkv=6,hd=4,psf-,js=9,kpb-,gxd=4,jgs=7,jvjdbb=2,ftp-,gpjm-,hgv-,chfsm-,pssx=9,scx-,mjx-,lvfdjv-,gxmgld=1,bltn=2,mcpkb-,dqns=9,nsnn=6,jxf-,rxq-,rlfgd=4,slds=8,qqj-,snz=4,xsh=7,df=6,bt-,td=6,jpb-,dhjv=8,gfjrh-,rd=2,zdjgj-,mhx-,cl-,tzz=9,vzp=7,qndj-,rfs=5,lcm-,zj-,mcpkb=6,td=5,knp-,nrvg=2,tc=6,mxtz=6,mnt=8,smnh=9,ssj=5,pjct=8,zjhht=7,tt-,gnhjs=1,vlnd-,psb=5,gtm=4,fr-,dv-,rp=8,rmm-,tq-,cp=6,ssp=1,js-,sccd=5,mktfz-,mch-,vjl-,tcqz-,gtm-,qndj=1,vdl-,km-,zk-,ff-,zdtb=4,gxd-,zdjgj-,svg-,vvl-,cxxrc=4,rvs-,pc-,xj-,qqh=8,tqhs=3,hg=7,kzzn-,jc-,dgk=4,jgrd=7,kf-,vp=1,rzcx-,rvr-,mfx-,ckrt=9,xdk=7,njv-,msl-,lrpxp-,kp=3,xj=8,zzqmg-,ml=9,bltn=8,srb=7,mzfl=6,bb=6,pxlvz-,hp-,vcp-,xp=2,zdks=6,jgs-,rt-,srb-,tcqz-,fhp-,hjx-,kb-,hhz-,mnx-,kbqc=1,hxl=2,hp=8,jgrd=8,dk=7,gnhjs=3,zfhmj=4,pzjgls-,rzcx-,vg=2,scx=7,tsvtm-,bdlt-,xsbg-,lcm=8,km=7,rncmzp-,psf=9,sbg-,gxc=5,xfg-,lzmb=7,fv-,ljr=1,xqgl-,ts=6,sq=9,xzkj=6,ljr-,fl=6,kn-,vp=6,smks-,vpnk-,jf-,sh-,qpn-,bbk=4,td=2,jvx=9,hch-,lk=3,fqlnbc-,szxdt-,hl=4,pgp=8,rncmzp=7,bfsnt=5,rbvl=1,cp=7,qfpf=6,qbpq=1,xdk-,qqj-,mq=7,xkt=3,xsh-,sjdkl=5,zsq-,rjrm=6,nkccfg=8,lls=2,kp-,zf=9,dd-,vhzd=6,vjv=7,vmcsh=7,pfxhxj-,xznvs-,qgt=1,zjhht-,vxr-,bk-,smnh-,xlx=4,hqlkpl=9,dnc=5,jbgf=6,lpd-,mhqzc-,dgf=6,dnj-,cb=1,jgs-,nnkl=4,dvd-,kjcqvr-,pnq=1,vdfx=3,ftp=8,bqblll=1,vjl=1,rvr=8,knp=6,sbvx-,gzx=3,zs=3,zxz-,jbgf=5,stg-,fkrs=1,gtx=8,kgk-,zfhmj=4,mth=1,dj=8,fjrp=9,nj-,zdtb=8,gzx=8,th=7,jkz=1,zdtb=6,mq=9,zsgl=7,xr-,hqlkpl-,zs=8,xvh-,jvjdbb-,hxl=9,ddn=1,qbpq=3,fjrp-,tch=3,th=9,jq-,bl=7,qskn=9,kk-,mhqzc=2,pt-,srb=4,bzp-,lmpxsn-,tn-,clpc-,dcmx-,mxh-,jk=8,rzxt-,zg=8,lk-,hvvh=7,szxdt=8,tls-,pc=3,klnvl-,prf=6,bltn=9,bk-,hl-,sx-,tl-,pdg=5,kzzn-,kq=4,ckcslv=8,vh=8,rtclsf=8,lrkmv-,szx-,cmp=3,jhm=8,cfx-,gc-,ctg-,xkt-,kpmfqs-,vtms-,rfs-,bz-,mhqzc=5,qx-,psb=2,thl=5,dtdk=4,fpp-,xp-,pc-,hhz-,ltf-,nn=3,thn=7,lvfdjv-,bnn=4,rp=9,htqt-,hzq-,xzkj=7,gdc=1,qbpq-,rvr-,cxxrc=5,grkk=5,chv-,gq-,rfs=8,nrvg-,mfx-,kg=8,hgpd=6,nnkl=4,xt-,gbxh-,qs-,krdk-,tm=3,rjrm=8,bdlt=3,gp-,pxlvz=8,jv=7,jkz-,zc-,kglvq=4,fn=2,rnk=4,lqq-,mbp-,jnps=8,hvs-,xlx=2,bzsx-,hp=4,cxxrc=2,ztcgrm-,qx-,qnn-,hgjhv-,xvs=2,jbgf=5,jfrkh-,nbd=2,kk-,bmxzp-,rjk=2,xh-,ssp-,td-,pnq-,df=8,vtms=8,cp=7,kphb-,hd-,xxcc-,dnj-,fz=1,tq=5,df=2,nt=8,hgqr=2,vcp-,mdqh-,vp-,vgc=5,ddn=9,xp=3,vd=6,lrkmv=3,bb-,cpb-,gr=9,fqqx=9,ncndp-,rjrm-,dbs=7,cp-,dk=7,mdvnr-,htzgz=5,fx=5,lcq-,dnc=6,hgpd-,pm=7,vgv-,ps-,gfjrh-,vp-,sgv-,sft-,slds=6,rd=1,htqt=2,sbx=5,xvfc-,mv-,fx-,nkccfg=8,qjz-,nmn-,hh-,sbg=6,smnh=5,jk=8,xgrs=5,th-,mkn-,rmm-,lmhb-,kpd=9,gp=1,vsd-,kzt=7,lcq-,rq-,mnt=8,mn-,kr=1,qfpf-,thl-,hvs=5,zk-,sj=3,dgf-,lcq=2,rncmzp=3,nk-,ncndp-,kr=3,hjx=8,nl=5,mz=4,tqb-,fvpqcp-,pf=7,tp=4,rf-,dgk=1,qgp-,jfrkh=1,vvl=8,ngs-,qjz-,ts-,fz=4,mk=8,xzkj=2,cpz-,mdqh-,slds=2,mhqzc=8,hgjhv=5,fn=5,ts-,hvvh-,vcp-,xzf-,nvx=3,sx-,vsm=3,rzpt=6,dz=8,msl-,lbdrk=6,lmhb=9,nbd-,vxlgph=8,vphf-,pgp-,vsm=9,gc-,tm-,mv-,vjv=4,bj=9,rncmzp=1,chfsm=5,qrr-,bck=2,hxl-,mxtz-,qpcvg=6,ml=2,pf=3,cqs=4,nks-,jkz-,hmv-,qjz=8,mt=5,hqlkpl-,bck-,pb=4,xm-,vjl=3,mr-,gzx-,xzf-,gfjrh-,dg-,lkks-,mkn-,gg-,vld-,fpp-,zg=5,ttk=6,zzx=9,pc-,pc=7,vd-,pxhnxj=8,ckcslv=5,ph-,vfjdpr=4,pm=9,kb-,ntgd=3,km-,svg=7,cpb-,mjx=4,lpd=1,hr=5,dqns-,qgp=3,pb=4,nsnn-,ghk=5,pfsff-,pmp=3,rjrm=4,gbxh-,nn-,sjdkl-,jsz-,tcqz-,zdtb-,sspm-,rbvl=2,jv=6,vv=1,bk-,hbg-,ng=2,nkr-,rv=1,ncndp-,ff=3,vpnk-,ljr=1,xxcc=7,kk=8,hh-,rt=3,lpd=9,vcp=3,mktfz=1,fn=1,ts=7,sccd=6,tch-,kbmc=2,hgpd-,bclt-,lmhb=2,tg-,dsp-,gq-,dz-,thn-,qpn=8,dcmx=9,sn-,gxs-,zk-,gm=5,zk=3,sspm-,mzfl=2,gk-,bzk=6,grkk=7,rfs-,ndq-,hzq-,vd-,tv-,fjrp=7,xxcc=9,hz-,rt=2,vmh-,mz-,dvd=1,szdz-,vmm-,bt-,sh=3,xv-,sft=5,vmcsh-,qqj=1,sck-,gm-,rqzxz-,vzp-,ncndp=6,fkrs=7,tjfk-,tcn=6,ztcgrm-,vl=9,fl=1,khsf-,jk-,khsf-,bl=6,xxcc=9,dxtvkd=8,zsg-,nnkl=8,kglvq-,rzpt-,nfv=4,xvh-,hz=4,nsm=6,gm=2,cp-,qndj=4,vhzd=9,hmv=5,zfhmj-,rtclsf=4,hgv-,jk-,tbc=4,jfrkh=2,pf-,tch-,zxz-,mf-,zsgl-,pgpzq-,hhz-,nk=3,gpt=4,zxz=4,jpn-,tqb-,htn=2,nks=3,vd=7,gtx=1,rd-,gzx=6,gnvcc=8,ts=8,ckrt-,jdb-,kk=3,gq=7,nbd=5,msb-,hzq-,pfsff-,jq=5,ngs-,dj-,vmcsh=3,nsm-,kpmfqs-,pmp-,vsd-,jgs-,slds-,lzmb=4,njv=9,bclt=5,gnhjs=5,xj=5,bqblll=2,ddn=8,mhx=5,tjfk-,jb=3,msb-,ckcslv-,njv=2,htn=1,zs=5,stg=2,knp-,nsnn=7,mz=4,hjp=5,vjl-,jzhvv=5,zzqmg-,mjx=2,xpl-,xlkb=7,fhp-,vjl-,hqlkpl-,nt=6,zj-,bzk=5,tg=3,sgv-,lrkmv-,pz=9,xg=5,hgv-,szxdt-,gcc-,qgp-,qnn-,zdks-,nn-,sspm-,tt-,mdvnr-,pgpzq=1,rbt-,nn-,bltn=7,msl-,szxdt-,tl-,hjx-,cxxrc=3,shx=1,qq-,mcl=3,qndj=4,cx-,nks=4,chfsm=9,vsd=8,cf-,kvkdr-,pt=8,gfjht=4,mth=5,pxlvz=2,tv-,ttk-,sj=6,kzzn-,vsd=4,hmv=6,zdtb=5,jc=5,dsfb=6,ckrt=3,gg-,tsvtm=8,hb-,tb=7,mnpbcf-,krl-,kphb=3,tcqz=5,cpz-,ggf=9,ljr=8,rzgg-,ssp-,hbg=5,lzmb=3,psf-,knp=1,dj-,ljr=5,rl=2,cpb=6,tv-,kpv-,jb-,gk=7,mcpkb-,mcpkb-,xsbg-,gq=7,mcpkb-,bpf=1,lmpxsn=5,ckrt-,vm-,td=5,pxlvz-,lrpxp=7,ph=6,gp-,hdn-,svg-,htn=2,bzp-,dbs-,hhz-,dgk=5,sjdkl-,rf=5,zjhht-,mch=9,xgrs=4,cmp-,rzpt-,mdn-,jknn=5,mdvnr-,tsvtm=6,gdx-,tq-,dvh=1,xpl=6,gxd-,rqzxz-,cx=8,pxlvz-,hc-,vgc=7,bbth=6,vsd-,glmzc=6,dxtvkd-,gc=5,bmxzp=7,mhqzc-,ddk=3,cc-,hmv-,vjl-,cf-,jc=1,mth-,xvfc-,qjz=6,vkf-,kpv-,xvh=3,pmp-,gm=9,fx=6,zj=1,rbt-,xsh-,zfhmj-,nkr=1,vmh=2,nsm=6,psf-,xgrs=3,bzsx-,srb=5,vkm=3,shx=1,zj-,cpz-,glmzc=7,jf-,vz=7,pb-,mbp-,mt=2,xb=4,jpb-,zs=1,mdvnr-,lpd-,mxtz=1,dgpf-,smnh=8,td-,zfhmj=7,lrpxp=2,rzpt-,sbvx=1,rtclsf-,px=7,bl=7,rf=1,bqctt-,qq-,hg=3,srb-,nmn=8,hr=3,qskn=4,vg=7,psb-,hg=7,mcl=2,pz-,bz-,mcl-,rnk-,hgv=8,sh-,pjct-,hvvh-,qqh=5,kb=7,vsd=8,mnx=4,lrc=9,htzgz=8,tb=4,tch-,thl-,hdn=6,dvd=1,gxmgld-,sf-,jk-,xsbg-,bmhs=7,dgk=7,kqql-,mz=6,mn-,zvg=9,xp-,fk-,rtclsf=5,tjfk-,gpjm-,kphb-,zv-,grkk=9,pzjgls=1,fn-,zjhht-,sgvz=4,ggf=6,zbc-,nptmr-,sbvx-,zzmxzs=2,dv-,xpl-,kbmc-,tn-,rzcx=7,vcp-,ps=5,lpd=4,dd=8,qg-,hd-,bj=8,qnn-,rqzxz=3,sspm=1,dnb=2,jf-,chfsm-,lh-,lzmb-,jx-,xzkj=5,lrdkf=3,mzfl=7,mxh=5,xxcc-,bjd-,ng-,vgdb-,vcp=1,qqj=9,gxc-,xp-,tb-,xp-,jk=4,rj=3,tbc=5,vmh-,zzx=8,tc=9,dgf-,ftp-,slds-,qbns=8,pssx=1,rd=8,zbc-,kglvq=5,nks=9,szdz-,bdlt=6,tm=7,psr=8,kp=7,rbt=9,kzt=8,gzx-,sdg-,pc=3,gxmgld=3,vmcsh-,dj-,kpv=2,lpd=5,hpmn-,nkccfg-,qbns-,jc-,mxh-,hgpd-,lcq=6,rqzxz=2,zk-,qjjfz-,fvpqcp=2,jpn-,mktfz-,vhzd-,dkv=2,px-,rzcx=3,dbs-,mlp-,mbrmr=5,hvvh=5,gdx=5,rxrt-,dvd-,sdbj=9,ncndp-,cb=1,xxcc-,hch=9,sn=5,pfxhxj=8,bfsnt=5,ltf-,qb=5,km=7,kd-,zzqmg=1,rlfgd-,kn-,hjx=9,jv=5,ntgd=3,rzcx-,mt=5,pzjgls-,rnk=9,stg-,tzz-,rv=1,qr=7,vcp=6,gdc=6,mnt=6,hch=4,mt-,rh-,zgs-,vnk=2,pb-,gxs=5,mn-,jnps-,px-,tzz-,jkz-,dsfb=8,pf-,cb=4,sx=8,lpd-,jhm=3,nnkl=6,sgv=8,xxcc=9,xjznm=9,vxr=1,xxcc=6,pjl-,chv-,zvg-,sqt-,vbs=2,pgpzq=9,nrvg=2,vgv-,lcm-,dj-,kq=1,mk=7,msl-,pgpzq-,mjx=7,kqql-,rbvl-,gxc-,xm-,qfpf-,nsnn-,gxd-,sx=7,nj=6,bclt-,sdg-,svg=2,ssp=4,gk-,scx=8,nsm=1,rvr=5,jkz=4,lcm-,pjl-,kr=1,gfjrh=6,dxtvkd-,qhsj=5,ckcslv=5,bnn-,hxl=8,rj-,kqql-,hp=8,nfv=7,vgdb=7,qb-,dcmx-,cf=4,nvx-,hh=5,hdn=5,bck-,chv-,xh=3,mdvnr=9,ztcgrm=2,vpnk-,jk=1,gnvcc-,ftlcft-,zj=2,tp-,crxg-,sft-,hp-,xv-,pjct=7,hb-,rlfgd=3,mt-,gbxh=1,vdfx-,xv=1,lbdrk-,xvh=6,jgs-,dbs=6,hhz=3,mcpkb-,qx-,sccd-,bjd=4,pz=5,xb-,mxh=8,vxlgph-,gnvcc=6,kbmc-,mn-,db-,mlp-,dnb=6,ps=8,ngqh-,vlnd=3,qndj-,nks=3,pjl-,vpnk-,dsp=9,tq=3,mdn-,jpb-,vhzd=3,kp=2,tm=1,lrdkf-,vg=4,mkn=4,xxcc-,lbdrk-,pc-,glmzc-,fqqx-,hmv=8,dk-,dkv-,dkv-,pb=6,vmcsh=5,pmp=8,khsf-,psb=5,jpb=8,pgpzq=5,scx=2,lh=1,tt-,pgp=4,dv=7,ss=5,rjrm-,sccd-,ph=2,dj=8,pdg-,rxrt-,mxtz=2,xj=9,jfrkh-,bt=9,bzk=3,ngs=8,gpt=6,fjrp-,kb=5,zzmxzs=7,px=5,nrvg=3,vcp=4,xqgl=5,qskn=3,mdvnr-,bg=5,rf-,pzjgls=5,rz=3,zsq-,vbjk=2,zsgl-,rh=5,zsq-,kgk=8,pdg=3,tt-,nmrt-,srb=5,dv=5,grkk-,sjdkl-,tjfk-,hmv-,kbqc=2,pfxhxj-,vbs=7,pgr-,jfrkh=1,qgt=4,kp-,jc=2,htn-,sspm-,nkr=4,cspg=2,tm-,mxtz-,qbns-,mxtz-,pgr=1,bclt-,xdk=1,clpc=1,gnvcc=9,lpd=1,tc-,sh=2,rzxt-,ts=6,rnk-,cmp=6,vl=2,psr=7,zzmxzs=7,td=8,snz-,kjcqvr=1,vhzd=6,fr-,htzgz=8,xv-,kpd-,rbt-,rvr-,jsz-,vss=3,xv-,sq=6,scx-,fjrp-,gxd-,js-,nkr-,cc-,mhqzc-,vv-,xdk=7,bck-,qh-,sq-,ckrt-,fkrs=2,zf-,prf=3,tjfk=5,sgv-,lk-,rqzxz=7,rvs=6,dsfb-,rvs=9,htn-,cpz=4,gtx-,jpb-,qbpq=7,hd-,cpz=6,mkn=2,bt=5,hp=7,gbxh=3,prf-,xp=3,lls-,qjjfz-,mnpbcf-,sx=4,mz=9,pzjgls-,szdz-,zzqmg-,mzfl=8,kpd=6,cqs-,zsg=2,qqj-,vhzd=7,qx=1,pxlvz-,mq=1,gk=7,lzmb=2,jbgf-,dcmx-,xzkj-,tg=8,fr-,mkn=1,tn=9,klnvl-,vmm-,zgs-,rj=3,zzmxzs=5,fpp-,stg=2,gk=9,cfx=7,bpf-,xkt=1,lrkmv=1,sgvz-,sdg-,rxq=3,lcq-,zsq-,smks-,ctg-,xqgl-,bb-,glmzc-,sdbj=9,rncmzp=8,ljr-,kz=6,bltn-,tjfk-,vcp=7,fk=1,fhp-,mcpkb=2,dsfb=3,vkm=9,thn-,tsvtm-,cf=2,flp-,rd=4,gc-,mdn-,zvg-,dgf=4,lqq=7,tcn=5,vgv-,rncmzp-,pjl-,sjdkl=3,rtclsf-,slds=7,pb=1,xvs-,vcp-,zsg=9,vsd=4,kgk-,lh-,mktfz-,bltn-,gdx=5,hzq=7,cpz=7,vld=1,nt-,cqs-,hl-,pzjgls-,cqs-,xg=3,ng-,dg-,nkzzc=1,hc=8,ggf-,zc=8,glmzc-,krdk-,cb-,vzp=2,mv=6,cspg=4,pb-,vmm-,sck-,vvl=9,qnn-,htn-,nt-,xqgl-,nvx-,qskn=8,vkf-,dvh=9,xc-,vh-,jq=2,zsq=1,jgrd-,kbmc-,mz-,dnb=5,njv-,mxh=3,bmhs-,jhm=7,ghk-,rnk-,tch-,xfg-,rxrt=7,tbc-,dg-,mhx=8,sh-,pz-,mnt=4,sbx-,mz=6,rv=5,gpt=8,nmrt-,bmxzp-,jv-,krdk-,tqhs-,gfjht-,sccd-,clpc-,xsbg-,jpn=9,szx=4,mhx-,mt=4,zvg=9,szx-,ng=4,mjx-,qg-,zzqmg=7,xb-,gr-,xm-,xxcc=8,mq-,hg=1,vz-,bqctt=6,rbvl-,gqgzxf=3,mk=6,thn-,mnt=4,mcpkb=7,knp=2,snz-,jzhvv=2,ndq=9,mq-,mkn-,mf-,ss=4,zbc=7,zzmxzs=1,pgr-,njv-,qb-,bfsnt=4,bnn-,hmv-,zbc-,ckrt=5,bpf-,vht-,sbg=7,vmcsh-,rbpp-,qgt-,lcm=9,rbpp-,bl=1,sck-,vsm-,rf-,krdk=4,mjx=6,pfsff=6,tg-,sn=7,qbns=2,vzp-,qx-,chv=1,qr=3,ch-,khsf-,sgv=9,qjz=1,smks-,rqzxz=7,cb-,nnkl-,kzzn=1,vphf=3,nt-,hxl=8,sh=2,rtclsf-,scx=7,kb-,mzfl-,zzmxzs=7,ssp=4,nptmr-,xlkb=4,jbgf=1,kf=3,tv-,zsgl-,xsh-,kq-,mch-,hb=5,vss=7,bg=9,msb-,fr-,pz-,zgs=6,ngs-,jdb=9,hjx-,dcmx-,rt=9,rbt-,vc-,tt-,qjjfz-,flp=5,hg-,xgrs=7,psf=1,vtms-,mkn-,mcpkb=1,tls=6,fqqx-,zgs=9,ckcslv-,kglvq-,dvh=3,sqt-,hhz=6,mnx=8,msl-,kzzn=2,flp-,hr-,jhm=6,qgp-,lqq=7,hpmn-,gzx=6,vdfx-,tm-,rfs=1,zc-,flh=1,lmhb=7,jf=1,vcp=7,vmh-,kr=9,hxl-,xlx-,vtms=5,px-,fjrp=8,lqq-,nfv-,vdl=8,tm-,vsd-,kb-,hp=8,ctg=9,hqlkpl-,fkrs=4,jvx-,hdn=8,zzqmg-,gzx-,kzt=9,dd-,ddn=5,sbg-,fqlnbc=7,shx-,fhp=4,ch=1,pnq-,nbd=2,xv=5,qbpq=6,jk=7,cc=4,mhqzc-,xfg=3,lvfdjv-,vv-,hjx=9,lkks-,pnq-,ngs-,nbd=5,td=5,flh=6,zbk=5,smnh-,rv=9,vv-,kg=1,jvx-,lf=2,gg=7,tqhs-,kpmfqs=1,xjznm=6,tb=7,zjhht=6,pssx-,zdjgj=6,rlfgd=6,mbrmr=8,dv-,psf-,sn-,qbpq=2,bqblll=6,xh=5,tqhs=8,gxc-,rzcx-,vp-,zc=4,fvpqcp-,kd-,pc=7,dbs=7,zbk-,pm-,cspg=7,qfpf-,hr-,dhjv=3,tbc-,tn-,sdbj=5,pxhnxj-,nsnn-,nmrt=1,sck-,zg=4,bdlt-,bc-,rncmzp-,khsf-,krdk-,lk=2,kjcqvr-,vkm=1,vtms-,nsm-,slds-,lcm-,kqql=3,mktfz-,shx-,xsh-,lh-,rl-,cc=5,pgpzq-,gdx-,vnz=5,bltn-,gtm-,vtms-,rh-,hjx=8,zc-,mzfl=2,vsm=7,pnq=5,rxq-,gcc-,zdks-,nn-,ngqh=1,clpc-,pxhnxj=2,hvs=6,dj-,pssx=7,jvx=1,zs=6,gk-,mnx-,jpb-,jxf-,jpb=4,pxhnxj=1,gp-,vht-,dnb=7,kd=9,pl-,kb=7,nt-,hmv=6,sx-,hxl=9,nmn=8,kq=9,df-,cxxrc=3,xvs=8,kphb=6,xlkb=5,lrkmv-,rjk=7,zf=1,scx=4,rfs-,ckrt=2,hgv-,qqj=5,lcm=7,hgpd=3,hjp=6,hzq=4,qjjfz=1,nmq-,thn-,ghk-,bk=4,kpv=9,xgrs-,dbs-,rxq=8,fpp=8,lpd=6,nmq=6,th=6,nk=6,sdbj=2,kr-,zg-,gnvcc-,hg=1,sh=8,nmq-,jzhvv-,ggf-,kgk-,kvkdr=7,xznvs=6,fr=9,tjfk-,rxrt-,sspm-,hdn-,xh-,grfm=2,mdvnr-,rh-,vh=2,nkccfg-,xlx-,dj-,vtms=3,gtm=6,vxlgph=9,rbvl-,lpd-,vmh-,tch=7,ckrt-,tqb-,dkv-,rfs-,pssx-,kglvq=6,jvx-,hz-,rt-,hg-,jk=7,kr-,bg=3,tch-,df-,cspg=4,qgp-,vc-,dgpf-,ff=2,hmv=8,jsz=5,hg-,zvg=7,cx-,gfjrh=3,xfg=2,jc=5,xzkj=4,xb=9,zbc=4,zdtb=5,jnps-,jxf-,nkr-,xdk=7,hpmn-,kpd=5,zk=5,gc-,dcmx=5,ngqh=8,rtclsf=1,gdx=3,hc=3,vphf-,mf-,vmcsh-,dj=9,bz-,zzx=7,kn=8,pvdzq=4,tch=1,tch=7,fv-,bk=5,kjcqvr=1,hgqr-,ddn-,bbth-,dj-,bclt=9,cxz-,pbdd=7,xxfrf=6,ltf-,nj-,zsgl=2,fqqx-,gr=4,hp=7,gdx-,msb-,vc=1,ml=9,lmpxsn=7,lpd-,fbng=3,mth=7,pbdd=5,fhp-,lkks-,zhd-,ltf=6,khsf=4,qr-,mcl=4,hhz=8,kbqc=3,vgc=6,px=7,stg-,fvpqcp=8,vdfx-,js-,hz=8,qndj=6,nsm=9,sx=4,ghk=2,xp=1,pfsff-,kd=5,rzpt=4,dhjv=2,xv-,mnpbcf=5,cc=9,xzkj-,pzjgls-,flp=4,ftlcft=4,hjx=6,rt-,dv=8,vtms-,xp-,hgjhv=6,ps-,rt-,kzt-,kg=7,sf-,dhjv=3,qb-,mbp-,fv=1,xh-,vdfx=8,scx-,dsfb=3,rnk=5,kp-,sgv=4,tbc=9,gpt-,cqs-,dnj=1,fk=2,mch-,tbc-,gxs=4,hqlkpl-,crxg-,qhsj-,clpc-,nptmr=7,krdk=2,rbvl-,ckrt-,zdjgj=4,smnh=5,fk-,hjp=9,jxf-,kpb-,ljr=6,jv-,msb-,xg=9,hb=6,tl=3,stg-,qbpq-,vgv=3,tl-,mkn=2,rvs=6,ngqh=8,bg-,crxg=2,gc=3,lh-,qqh=5,xzkj=1,zj-,mv=5,sdbj=5,jx=6,vm=6,jgrd-,rjrm-,jsz=8,th=8,njv-,dcmx=3,rd=5,rzpt-,mn=5,vtms-,zdks-,mktfz-,kf=1,mdn-,ff=8,fk-,dgpf=9,xdk=6,nnkl=4,xzf=4,kk=2,mcpkb=2,bck=8,vpnk=9,xznvs=2,lk=2,ltf-,tc-,nmn-,zs-,tl=2,vzp=4,szx=3,lmhb=7,psb=8,ps=4,jv-,qgt-,nk-,nk-,ssp=3,rf-,pxhnxj-,pfxhxj-,qgt=4,gnvcc-,sgvz=3,pt-,rv-,sf=6,vgdb-,bbth-,gr=7,kbmc-,nrvg-,cspg=9,kg=9,dvh-,lh=9,vnk=5,pvdzq=3,kn=8,mdn=8,nmq-,rq=4,kp=4,gfjht-,ckcslv-,fkrs=4,nks-,xqgl-,hc=8,ssp-,fz=1,ssp=7,ps=2,kphb=9,nsm-,stg=7,bmhs-,sck=1,xj-,cmp-,ghk-,nn-,zsgl-,qbns-,rtclsf=9,zhd-,lrc-,gdc=3,mch-,sjdkl-,bmxzp-,lvfdjv-,vg-,qgt-,cfx-,ph=3,xsbg-,hr-,dkv-,cc-,nptmr=2,nfv=7,sccd=8,hjp=6,dxtvkd=2,hz-,vkm-,xxcc-,hpmn-,sqt=9,qx-,bj-,vnk=2,lrc=6,hmv=4,hbg=4,kbqc=8,zxz=1,qg=9,dg-,kz-,bzk-,xzf-,hg=6,mch=5,dbs-,qx-,qgt=5,bqblll-,tl-,qx=2,nmq=3,mlp=1,hzq-,bnn-,vmm=1,ljr=9,tp-,qg-,jvx-,vtms=6,ltf=1,rbpp-,flp=6,gtx=4,gr-,pgpzq=2,nks=2,px-,rv-,hgjhv=6,dv=8,lmhb-,ch=3,htzgz-,sspm=3,jknn-,ndq=3,qbpq=7,dgpf=5,qndj-,ctg=4,kn-,cxz=8,lrkmv=5,krdk=6,gtx=8,hch=9,nkzzc-,cqs-,kg=4,zzmxzs-,jx-,gfjrh-,vld-,qpcvg-,hgv=4,dkv-,rxrt=2,vmm=5,mnx=7,kd-,dhjv=3,nks-,rp-,svg=4,glmzc-,lls=9,bqblll=9,qpn=8,qskn-,rbvl=6,vm-,mk=3,cspg=5,slds-,cl=6,xg-,xc-,rncmzp=4,pzjgls-,hd-,hvvh-,xkt=2,smnh=4,tm=4,lnc=4,gtm=1,snz-,rqzxz-,ssp-,xg=2,zv=7,pjct=6,mq-,bnn-,sx-,xfg=9,ljr-,bj=8,pbdd=8,ttk=7,cx=1,snz=6,dkv-,tv-,pxhnxj-,jpn-,jgs-,mxh=1,mf=7,kq-,hz-,vz=8,bzsx=4,jnps=1,dgf=8,zgs-,fbng=4,mk-,pt=7,nmq-,ngs=8,lh-,vkm=6,kqql-,vg=2,gg-,cxz=8,hr=4,tq-,gxs=6,cspg-,mth=9,xjznm=6,bzsx-,pzjgls=9,krdk=6,jxf=9,mdqh=5,ssp=6,njv-,mch=1,gqgzxf-,sgvz-,pssx-,zsq=7,ng=6,rzcx-,sdbj=1,zsgl=1,szx-,nrvg=1,dtdk=9,dbs-,kqql-,hjp=5,ddn=2,df=8,zg-,xfg=7,cx-,nmq=9,bzsx-,sft-,gfjht=2,bqctt-,gtm-,sqt=8,ljr-,shx-,gcc=3,kjcqvr=5,tt-,xvfc-,ghk-,tls-,hb=5,pz-,vphf=1,rv=6,zf=9,vzp=9,ml-,thl-,kbqc-,knb=4,tsvtm-,bzp-,pnq=2,scx=6,nt-,ngs=4,vpnk=5,pb-,lrdkf=6,jfrkh=8,crxg=8,gpt=6,bmhs-,vss=2,pgr=9,mhqzc=8,jgrd-,bz=2,kqql=9,gxmgld-,pl=8,dd-,hgqr=3,tcqz=9,zk-,zhd=3,pgp-,th-,vxlgph=9,gxmgld=5,gpjm-,cfx-,bbk=5,ltf=1,pgr=7,tjfk=3,vkf-,nfv=2,zdjgj-,knp-,bck-,vb=9,hd=5,sdg=6,vgv-,th=3,fqqx=8,gxs-,dcmx-,zs=4,fzs-,zsgl=9,nbd=1,fv-,lrdkf=6,vjv-,sck=1,qx=8,jdb-,zdjgj=5,sbg-,pgp-,kzt-,zg=4,pgpzq-,rtclsf-,bpf=6,dnb-,kzzn=4,cp=1,td=4,jpb-,xqgl-,lrpxp=7,xh-,tt=4,xgrs=3,vkm=9,xpl=6,nkccfg=8,sn=1,bl-,ssj=2,snz=5,dgk-,tch-,bmhs=5,mbp-,gtm=4,dg-,slds=5,gtx=5,xr=4,msb=2,ftp=5,tch=8,vl-,mdvnr=6,dk-,sgvz=4,fz-,rzpt-,sspm-,gr=6,nl=3,hp=9,pzjgls-,vdfx-,nj-,xxcc=5,db-,bjd=6,ps-,gtm-,psf-,ncndp-,nt-,mnx-,tc-,lkks=9,mn=7,rvs-,cpz-,vpnk=1,ks=8,vht-,nmn-,vpnk-,vxlgph-,xm=2,qg-,jv=8,sck=9,gpt-,rbt=2,mdn-,gxc-,bzsx=7,tm=5,lh-,nn=1,th=9,ckcslv=5,hvs=1,sccd-,mcpkb=4,vcp=6,vz-,rjk-,mcpkb=2,gcc-,jdb=4,bz-,kq=8,pnq-,ntgd=9,ss=6,pl-,szx-,lkks-,pmp-,lf-,ghk=7,ckcslv-,kz=5,hdn-,vxlgph=3,qqj-,gpjm=1,vmcsh=8,krdk-,mch=2,kpd=8,gdc=4,fz=4,fl=2,gc=2,mbp=3,kczrf=8,fk=2,gr-,fkrs-,dnb-,zs=7,xzf-,lnc-,xznvs-,rzgg-,xpl=5,dk=4,jk=9,mjx=6,kphb-,cpz-,lmhb-,fz=6,sgv-,zzmxzs-,cp=3,zzx=9,hb=7,nkzzc=2,kphb=9,nsnn-,jfsg-,pzjgls=7,fpp-,gqgzxf=4,tb=9,rz-,sqt=2,lqq=5,xvfc=2,mbp-,rp=8,zxz-,qg-,jknn=3,nks=2,dgk-,cf=8,gxc-,gq-,crxg-,qx=9,sbg-,vss=7,xt-,kqql-,khsf=1,dvd-,zc=6,vzp-,jvjdbb=9,kq=7,zdtb=1,slds-,msb=7,jfrkh-,vss-,xp=6,fvpqcp=6,bclt-,th=6,kpmfqs=5,sdbj=8,mth=2,cfx=5,kz-,kpmfqs=5,pgr=8,vm=8,bb-,sh-,bk=4,zzx=5,jpn=3,pgr-,pjl-,kqql=5,hhz=4,vnk-,mxh=6,zbc=7,dvd-,qpcvg=4,lpd-,hd-,gr=2,mq=3,nkccfg-,rzcx=8,sgvz=3,nks=3,qqj-,gxmgld=7,th=4,pjl=2,xvh-,df-,hl=3,zjhht=5,zgs=2,kp=4,rtclsf-,xvs-,bbth=3,pdg-,nmrt=9,smnh=3,vsd-,fkrs-,pf-,sbg=9,jfsg-,vcp=6,jb-,xzf=3,xvfc=8,kq=3,zbc-,hpmn-,rzcx-,tbc=3,zsgl-,lqq-,hzq=4,vdl=9,hd=1,mq-,prf-,qqh=2,lrdkf=5,vmcsh-,rjk-,pbdd-,sx-,jk=7,bmxzp=9,tq-,pgpzq-,jzhvv=9,fv=6,ks-,rf=7,bl=7,pdg-,pzjgls=7,mxtz-,hgpd=2,hb=2,rzcx-,vmcsh-,gxc-,kpmfqs-,mch=4,zzqmg=4,kczrf-,hz-,vhzd-,hzq=7,qhsj=5,mn=8,bzk=3,vgdb=8,vdfx-,nkccfg-,xzkj-,tv-,pssx-,gm=2,lbdrk=2,xvs=8,hb-,dnc-,mdvnr=2,lrpxp=1,hxl-,dgk-,ps-,vvl=1,xv-,vb=8,mch=4,rtclsf=9,rxq=6,hgpd-,zv=2,qnn=1,fkrs-,knb-,gm-,kczrf=5,gxmgld-,vxr=8,vgdb=3,pbdd=5,pssx-,zq=1,nfv=5,pxhnxj=8,hbg-,ngs=9,kglvq-,bg-,gk=2,cb=2,cxz-,vxlgph-,ml=3,lrc-,bfsnt=7,nk-,pb-,vp=2,vgv=7,flh-,pgpzq=3,rz-,xxfrf=2,hz=4,htn=5,sck=2,vhzd-,vc-,rq=4,vpnk-,mn=4,rzxt=2,hgpd-,lqq-,ssp-,kbmc=4,bz=3,rt-,shx-,pm=8,qhsj-,xb=2,hbg=9,kqql=4,mnpbcf-,kn-,ndq-,hvs=4,dgf=5,tqb=9,xvs=7,smnh-,htqt-,xvs=5,xvfc-,glmzc=9,gxd=2,fn-,jpb=5,jvx=3,vjl-,gq-,xxcc-,zhd-,zhd-,jhm-,ckrt-,vm-,vjl-,zj-,ftp-,xv-,dgpf=8,ttk-,nptmr-,zgs=3,tt-,vgc-,hb-,knb-,kpmfqs-,mlp=6,vgdb=5,hqlkpl-,tc-,fr=1,ljr-,ttk=4,xxcc=7,xt=9,rmm=9,fv=8,dhjv-,dgk-,tzz-,kczrf=9,kg-,jkz=6,xpl=9,ml-,qbns-,ttk-,mbp-,ddn=5,vhzd=8,kglvq=7,bpf-,crxg=9,vvl-,lnc-,jk-,xgrs-,gpjm-,hh-,zbc=3,ckcslv-,snz-,xpl-,fk=2,tjfk-,dbs-,mv-,ff-,pvdzq=1,nn-,kz=3,hgjhv-,km=8,rq=5,zgs-,lrdkf=8,krdk-,jhm=9,nks=9,szxdt-,knb=7,xsbg=6,dnj-,psr=5,lmpxsn-,bqblll=7,dnc=5,bdlt=3,tv=8,knp=1,mktfz-,vmcsh=2,hjx=1,gtm=3,xlx-,zsg=6,sqt=7,fk-,bc-,kq-,rxq-,jgs=2,lmpxsn-,ddn=9,sgv-,szxdt=2,cp=4,tp=5,xzf-,zhd=1,mfx=1,xg=4,fn=3,rjrm-,lrc=8,vg-,sgvz-,jf=5,qg-,fx-,msl=4,pl-,nk=6,jsz-,msb-,vg-,ngs-,szx=6,hjp-,vv=6,qjjfz-,sgvz-,tl=8,mxh-,xvfc-,ssp-,tqb=7,fn=5,gk-,nmn-,msb=2,ftlcft-,mfx=3,mjx-,lls=1,fqlnbc-,hc-,sf-,db-,gtx-,vc-,xznvs=6,hl-,vss=1,sft-,sspm-,sft=8,gtm-,gxc=2,tbc-,cfx-,lpd-,psb-,sft=9,kgk-,mn-,zvg=2,qgp-,vg-,bfsnt-,hvs=7,pjl-,njv=5,qbns-,qpcvg=9,rfs=9,bbk=3,qg-,tqhs=3,xsbg-,zfhmj=6,zsq-,hhz=3,mbrmr-,pbdd-,qb-,fhp=3,mbp=9,ch-,bg-,rz=7,rl-,qs=3,sjdkl-,xt=3,cp-,zsgl-,pdg-,bpf=6,krl=5,sck-,dg=4,hb=4,rncmzp=7,kbqc=8,nsm-,nfv-,bclt=4,hmv-,rt-,pvdzq=9,nnkl=2,dgk-,dgf-,vsd=7,kz=4,klnvl=6,rzcx-,mnx-,kpb=3,jq=6,db-,fx-,zjjmb-,jc=4,kzzn=3,vphf-,lh=9,mnpbcf-,hqlkpl-,szdz=5,xzf=8,rj=1,nnkl=9,qfpf-,xh=3,js=5,ggf=8,zdjgj-,zsgl-,zq-,psb-,cmp=5,glmzc-,gpjm=5,chfsm=5,lnc-,srb=1,xvs-,snz-,rncmzp=9,xsbg=4,pt-,smks=3,ljr-,ckcslv-,mfx-,mktfz-,mn=1,zhd-,nnkl=9,mzfl-,km=3,grkk-,crxg-,qrr=1,thn=1,hd-,gfjht-,xsh-,xdk=9,xzf=7,ks=1,kk=7,dsfb=2,hjx-,pgp-,qgp=5,qpcvg=4,xv=4,xxfrf-,pl=4,smks-,pt-,msb=4,bclt-,qndj-,jc-,ts=5,gbxh-,dhjv=1,sgvz-,mjx-,jkz=6,sf-,sjdkl=9,crxg-,zg=9,zjjmb=2,zc-,hxl-,mn=9,dvd-,vnk-,nbd=7,gbxh-,ljr-,hh-,kn=3,fn=1,xqgl-,ng=1,sx-,lrdkf=4,dg=9,ngqh=5,gxmgld-,hch-,qpn-,gcc-,zjhht-,df=8,rp-,rv=6,mktfz-,kr=9,bzk-,lpd- From 9407e73b44da353ff83a36d06298259786d9a174 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 15 Dec 2023 10:58:59 +0000 Subject: [PATCH 435/479] 2023: d15: ex1: add solution --- 2023/d15/ex1/ex1.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100755 2023/d15/ex1/ex1.py diff --git a/2023/d15/ex1/ex1.py b/2023/d15/ex1/ex1.py new file mode 100755 index 0000000..41fbc25 --- /dev/null +++ b/2023/d15/ex1/ex1.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: list[str]) -> int: + def compute_hash(string: str) -> int: + res = 0 + + for c in string: + res += ord(c) + res *= 17 + res %= 256 + + return res + + return sum(map(compute_hash, input)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + assert len(input) == 1 # Sanity check + print(solve(input[0].split(","))) + + +if __name__ == "__main__": + main() From e253096a7efdf4ee27d6b85f48f281a66d28bc56 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 15 Dec 2023 10:59:05 +0000 Subject: [PATCH 436/479] 2023: d15: ex2: add input --- 2023/d15/ex2/input | 1 + 1 file changed, 1 insertion(+) create mode 100644 2023/d15/ex2/input diff --git a/2023/d15/ex2/input b/2023/d15/ex2/input new file mode 100644 index 0000000..1820faf --- /dev/null +++ b/2023/d15/ex2/input @@ -0,0 +1 @@ +xxcc=8,jq=4,qbns=7,qgp-,jb=4,mxh=3,ltf-,xlkb-,ff=5,fjrp-,nl=8,lmhb-,tjfk-,qnn-,fz-,hjp-,msl=6,vmm-,dj=6,db-,knp-,lkks-,jq=5,db-,jx-,tp=1,gtx=7,mktfz-,fx-,jk=2,ddk=6,rzpt-,qpn=5,hxl=6,vl-,xpl=1,mbrmr=6,mnx-,jbgf-,lmpxsn=8,psf-,vv=6,nkccfg=7,xg-,ss-,sx=5,tc-,vmcsh=8,vnz-,pgpzq=9,jzhvv=7,nkccfg=9,kzzn-,lrkmv=7,vgv=9,vb=9,jq=1,jv=8,chfsm-,htqt=9,zk-,gc=5,mt=7,mcpkb-,fx=6,mktfz-,sbx-,psb-,df=4,jv-,xh-,zzqmg=2,mxtz-,kr-,psr=6,mxtz-,px-,klnvl-,vgv-,cspg=9,sspm-,tt-,kqql-,xznvs-,vsd-,td=4,kbmc=4,ggf-,bltn-,ks=9,rf-,jx-,qgp-,pb=5,cpb=5,tn=3,sx-,sh-,xc-,hch-,vmm=9,tbc-,mktfz-,hc=1,smks-,hh=6,jgrd-,vgc-,cpb-,gc=5,xfg=3,jq=5,qs=5,gnhjs=7,gg=4,jbgf-,clpc-,kjcqvr-,bmhs-,bt-,bbth-,fn-,nrvg-,zgs=2,jq=5,dsp=9,gdx-,gdc-,grkk=5,mhqzc-,pl-,lrdkf=1,rj-,pjct=2,scx-,cxz=9,dxtvkd=9,xj=3,pssx=7,vkf-,jgs=3,hgpd-,vm-,ggf=2,xt=6,jfrkh=5,flh=6,hgjhv=2,grkk-,gr-,vcp=8,hgpd-,gxc-,ftp=8,xsbg=2,vnk=2,sq=8,mnpbcf-,sgv=4,dbs=7,lzmb=7,vmcsh=6,rtclsf-,ngs-,xjznm-,vss=7,qq-,vg-,bt-,zgs-,xpl-,qpn=7,lk=1,qq-,vxlgph-,kp=7,ctg=3,gpjm=3,dcmx-,kglvq=7,rjrm-,rncmzp-,fn=2,stg=9,mnpbcf=4,sdg=7,nkzzc-,gpt-,srb=2,sf-,bdlt=2,mcpkb-,mdvnr-,bclt=3,dgk-,zsg=3,pzjgls-,bt=4,mz=5,hd=4,ljr-,clpc-,qpn=8,fjrp=9,cspg=9,jb-,xsh=3,jnps=1,lmhb-,dk-,rmm-,shx-,vnk-,gtx=2,hvvh-,jkz=7,mch=2,bltn-,ghk-,pjl=9,gpt-,fjrp=4,cpb-,thn-,sdbj=5,hb=1,qjjfz=2,kz=6,hb-,jc-,msb=3,tc=8,dgf=6,vsm-,rzpt-,sbg-,hhz=3,qjjfz-,vsd=9,ztcgrm=6,gzx=1,jkz-,qpn-,ngs-,vp-,bg-,kpv=1,xg-,ph=6,lmhb=4,xh-,lrc-,hgv=9,msb=4,ttk=2,vxr-,td-,rt-,kf=1,pnq=7,bzk=2,vzp-,hvs-,cpz=6,sjdkl-,vnz=9,lkks=5,dgk-,vmm-,psf-,ckcslv=5,vv=1,njv=1,dtdk-,gg-,scx=6,gxs=1,bt=7,dqns=3,sdg-,rp=1,bnn=3,sq-,ttk=9,bdlt=6,lkks-,cx-,mbrmr-,jc-,rl=3,psr-,ctg=9,vb=1,pssx-,lnc=4,crxg-,sspm-,fx-,gr-,vjv=8,bl=5,pc=4,hb=3,mkn-,fhp=5,kpmfqs-,vxlgph-,khsf-,lnc-,gpjm-,jnps=1,nfv=9,dxtvkd-,kd-,jgs-,ssp-,kzt=9,ss=3,lcq=7,nks=4,nsnn=9,msl=8,dv=4,rzxt=6,mfx=6,rbpp-,grkk-,lvfdjv-,qx-,gxd=3,ckrt=1,pz-,jb-,zbc-,hh-,jvjdbb-,ztcgrm=5,xsbg-,tv=8,ftp=1,bzk=3,jhm-,xxcc=3,rxrt=2,rq=7,rt-,vphf=6,xm=3,srb=5,hzq=6,zxz-,mnt=1,vlnd=4,fr=5,dbs=6,bzp=1,rbt=4,nj=5,lvfdjv=2,qb=6,hzq-,ckrt-,dgpf=5,fl=7,lf=2,svg-,kbmc=1,fz=3,kpd=3,kf=2,mnx=7,bjd=2,dkv-,vmm=9,zhd-,xvh-,pnq-,lvfdjv-,xzf-,pb=8,ctg-,mch=8,bjd=7,vzp-,bdlt=2,dv=7,xc-,bzp=2,xfg-,kz=7,nmn=9,kbqc-,mxh-,gfjrh=6,dnj-,bpf=3,qqj=6,dnc-,gc-,jq=5,nmrt=1,hd-,dz=5,hd-,dgf=3,tn-,pbdd-,nn-,xc-,cxz=3,vg-,nkccfg-,xvh=9,gxmgld=5,jq=2,kgk=4,kzzn-,ltf-,hmv-,ttk-,rmm=8,xpl=3,nvx=8,hzq-,lrc=4,gdx=2,zzx=5,gg=6,kzt=4,xvh=9,cc-,rfs=3,smnh-,kpb-,nsnn-,pl=9,bpf-,jv=5,ng=8,gxc-,rzxt=9,bbth-,lnc=5,nn=2,cxxrc-,vbs=7,dkv=2,sbg=6,qfpf=5,crxg-,bt=7,vc-,qrr-,gtm=5,ltf-,lrdkf=3,gqgzxf-,lzmb-,xkt=4,hh=9,sn=4,hr-,zdjgj-,jx=2,cpz-,hjp-,hh=6,vtms-,pgr-,jq-,mxh=7,kf=5,lbdrk-,kqql-,vjv-,jfsg=5,vc-,mnt=7,xb=9,hgjhv-,mxtz=5,zgs=2,zhd=5,vdfx-,fx=3,mf=6,sck-,kf-,gr-,kpv=5,xt-,msb=2,hjx-,mxh=1,tc-,rvs-,vzp=5,cl-,fl-,ddn-,vcp=1,rjk=2,qq=1,jgs=4,slds=5,jdb-,grkk=2,vmcsh-,nmq-,dsp=3,lmpxsn-,hch-,xgrs-,tt-,vxr=3,hch=6,mdn=6,cc=7,dv-,dhjv-,vgc-,qbns=6,psr-,vsm=7,mhqzc-,vxlgph=2,vc=2,vjl=9,rfs-,gpjm=6,vfjdpr-,hjx-,xvh=8,fkrs=1,lk-,sccd-,lmhb=3,pt=1,tc-,hzq-,khsf-,bl-,zdtb=6,hbg-,gq=8,dgpf-,kpd-,ddk=6,rbpp=2,jbgf=6,xzf=9,td=4,vl-,qqj=2,dgf-,xvh-,fqqx=7,kqql=9,lkks-,nn-,xt=8,sh=5,kp-,kn-,bmxzp-,bl-,nks-,kn=9,ml-,hxl-,qfpf-,tsvtm=4,kglvq=3,pgpzq-,kvkdr=1,fr-,bfsnt-,gxc-,mbp=4,gk=9,bclt=1,fk-,kk-,dd-,sf-,hd-,snz=2,tjfk-,hb=6,mdvnr-,ngs-,sccd=6,sh=5,lnc=1,jf-,smks=5,rxrt-,bb-,xlx-,nmrt=7,pxlvz-,bjd=6,nl=1,pssx-,tc=7,nmrt-,xsh=6,nfv=5,qr=3,sgvz-,jhm=6,xlkb-,bpf-,fv-,mv=2,xg=2,vxlgph-,msb=6,pmp=8,qq-,sck=2,qbpq-,qr-,dbs=6,pz=3,dkv=1,kq=4,vzp=1,lzmb-,rbt=2,hjp=3,kqql-,df-,mjx-,rtclsf=4,ssj-,hz-,lcq=8,rbt=4,rz-,tq=1,lzmb-,ljr=9,hgqr-,zhd=1,hg-,tqhs-,mk-,cx-,xkt=9,qq=9,bfsnt-,gq-,ddn=7,qhsj-,jvx-,qqj=8,fpp=8,qbpq-,sspm=6,dgk=7,gxmgld=2,vnk-,dsfb-,vjv-,sdbj=1,sq=5,hjp=6,jhm-,jxf-,vv-,df=8,nsnn=4,kf=3,gdc-,ntgd-,jnps-,ttk-,ncndp=1,hjp-,qx=3,gq-,tv-,bnn-,fpp=2,fjrp=3,ks=2,ndq-,qrr-,fkrs=3,kz=9,mjx-,qjjfz=9,kr-,hg-,szxdt=9,qb=2,kzzn-,qqj-,zv-,tb=4,nkr=4,rnk-,mxh=5,vmm=5,xh-,qrr=4,gr=5,pxhnxj=9,vgc-,sck=2,hjp-,mcl-,rjrm-,rmm-,cspg-,vc=2,srb=4,mxtz=1,mnt-,tqb-,dv=1,cp=7,gfjrh-,fr=2,nl=4,mcl-,vmh-,nsm-,ssp=4,nvx=5,lrkmv-,hc-,dsp=1,mz=9,sjdkl=9,jpn-,kglvq=1,fl-,flp=8,mf=5,dg-,sccd=6,cb-,ngs=6,tjfk=9,px-,svg=4,gfjht-,nbd=3,sccd-,hjx=6,xsh=2,pjl=8,lrc-,bbth-,vvl-,kp-,sx=7,ngqh-,chv=2,sdg=8,zjhht-,ghk=7,zsgl=6,tzz-,zg=8,dbs=5,fbng=6,tv-,qx-,hgjhv-,hbg=5,mdn-,hmv=1,hhz=5,xvs=2,vzp-,zjhht-,tls=5,tzz-,zf=9,rvr=3,qbns=2,bqctt=7,prf-,xsh=3,hbg=5,pz=6,nsm-,ks=8,qx-,smks=5,tg=8,krl-,mktfz-,rxrt=6,sgvz-,zxz-,hp-,hxl=2,fjrp=3,dj=4,mz-,mk=1,rxrt=2,bjd=8,dk=3,fqqx=5,snz-,kn=5,vxlgph=5,vg-,fjrp=6,mcpkb=2,szx=8,knp=5,dv-,qg=6,jvjdbb-,rlfgd=4,hvs=5,gpjm-,cb=7,dd=7,vfjdpr-,hvs-,hg=2,lpd=8,zbc-,mth-,qndj-,bk-,xgrs=6,vvl-,ljr-,sbx=8,td-,pb-,sft-,gq=1,mf=2,hxl-,hbg=5,jpn-,lpd=1,rf=4,mdqh-,mr=3,rmm-,bpf-,mnpbcf=2,xsh-,sspm-,gzx=6,clpc=4,xlkb-,vgc=1,xgrs=9,gxs=5,ftlcft-,sj=3,lkks=4,xg-,vd-,mhx=8,hqlkpl=3,qqh=3,tb=7,glmzc-,td-,lrpxp=4,pgpzq-,jb-,dvh=8,bmxzp-,bzsx=8,dkv=6,hd=4,psf-,js=9,kpb-,gxd=4,jgs=7,jvjdbb=2,ftp-,gpjm-,hgv-,chfsm-,pssx=9,scx-,mjx-,lvfdjv-,gxmgld=1,bltn=2,mcpkb-,dqns=9,nsnn=6,jxf-,rxq-,rlfgd=4,slds=8,qqj-,snz=4,xsh=7,df=6,bt-,td=6,jpb-,dhjv=8,gfjrh-,rd=2,zdjgj-,mhx-,cl-,tzz=9,vzp=7,qndj-,rfs=5,lcm-,zj-,mcpkb=6,td=5,knp-,nrvg=2,tc=6,mxtz=6,mnt=8,smnh=9,ssj=5,pjct=8,zjhht=7,tt-,gnhjs=1,vlnd-,psb=5,gtm=4,fr-,dv-,rp=8,rmm-,tq-,cp=6,ssp=1,js-,sccd=5,mktfz-,mch-,vjl-,tcqz-,gtm-,qndj=1,vdl-,km-,zk-,ff-,zdtb=4,gxd-,zdjgj-,svg-,vvl-,cxxrc=4,rvs-,pc-,xj-,qqh=8,tqhs=3,hg=7,kzzn-,jc-,dgk=4,jgrd=7,kf-,vp=1,rzcx-,rvr-,mfx-,ckrt=9,xdk=7,njv-,msl-,lrpxp-,kp=3,xj=8,zzqmg-,ml=9,bltn=8,srb=7,mzfl=6,bb=6,pxlvz-,hp-,vcp-,xp=2,zdks=6,jgs-,rt-,srb-,tcqz-,fhp-,hjx-,kb-,hhz-,mnx-,kbqc=1,hxl=2,hp=8,jgrd=8,dk=7,gnhjs=3,zfhmj=4,pzjgls-,rzcx-,vg=2,scx=7,tsvtm-,bdlt-,xsbg-,lcm=8,km=7,rncmzp-,psf=9,sbg-,gxc=5,xfg-,lzmb=7,fv-,ljr=1,xqgl-,ts=6,sq=9,xzkj=6,ljr-,fl=6,kn-,vp=6,smks-,vpnk-,jf-,sh-,qpn-,bbk=4,td=2,jvx=9,hch-,lk=3,fqlnbc-,szxdt-,hl=4,pgp=8,rncmzp=7,bfsnt=5,rbvl=1,cp=7,qfpf=6,qbpq=1,xdk-,qqj-,mq=7,xkt=3,xsh-,sjdkl=5,zsq-,rjrm=6,nkccfg=8,lls=2,kp-,zf=9,dd-,vhzd=6,vjv=7,vmcsh=7,pfxhxj-,xznvs-,qgt=1,zjhht-,vxr-,bk-,smnh-,xlx=4,hqlkpl=9,dnc=5,jbgf=6,lpd-,mhqzc-,dgf=6,dnj-,cb=1,jgs-,nnkl=4,dvd-,kjcqvr-,pnq=1,vdfx=3,ftp=8,bqblll=1,vjl=1,rvr=8,knp=6,sbvx-,gzx=3,zs=3,zxz-,jbgf=5,stg-,fkrs=1,gtx=8,kgk-,zfhmj=4,mth=1,dj=8,fjrp=9,nj-,zdtb=8,gzx=8,th=7,jkz=1,zdtb=6,mq=9,zsgl=7,xr-,hqlkpl-,zs=8,xvh-,jvjdbb-,hxl=9,ddn=1,qbpq=3,fjrp-,tch=3,th=9,jq-,bl=7,qskn=9,kk-,mhqzc=2,pt-,srb=4,bzp-,lmpxsn-,tn-,clpc-,dcmx-,mxh-,jk=8,rzxt-,zg=8,lk-,hvvh=7,szxdt=8,tls-,pc=3,klnvl-,prf=6,bltn=9,bk-,hl-,sx-,tl-,pdg=5,kzzn-,kq=4,ckcslv=8,vh=8,rtclsf=8,lrkmv-,szx-,cmp=3,jhm=8,cfx-,gc-,ctg-,xkt-,kpmfqs-,vtms-,rfs-,bz-,mhqzc=5,qx-,psb=2,thl=5,dtdk=4,fpp-,xp-,pc-,hhz-,ltf-,nn=3,thn=7,lvfdjv-,bnn=4,rp=9,htqt-,hzq-,xzkj=7,gdc=1,qbpq-,rvr-,cxxrc=5,grkk=5,chv-,gq-,rfs=8,nrvg-,mfx-,kg=8,hgpd=6,nnkl=4,xt-,gbxh-,qs-,krdk-,tm=3,rjrm=8,bdlt=3,gp-,pxlvz=8,jv=7,jkz-,zc-,kglvq=4,fn=2,rnk=4,lqq-,mbp-,jnps=8,hvs-,xlx=2,bzsx-,hp=4,cxxrc=2,ztcgrm-,qx-,qnn-,hgjhv-,xvs=2,jbgf=5,jfrkh-,nbd=2,kk-,bmxzp-,rjk=2,xh-,ssp-,td-,pnq-,df=8,vtms=8,cp=7,kphb-,hd-,xxcc-,dnj-,fz=1,tq=5,df=2,nt=8,hgqr=2,vcp-,mdqh-,vp-,vgc=5,ddn=9,xp=3,vd=6,lrkmv=3,bb-,cpb-,gr=9,fqqx=9,ncndp-,rjrm-,dbs=7,cp-,dk=7,mdvnr-,htzgz=5,fx=5,lcq-,dnc=6,hgpd-,pm=7,vgv-,ps-,gfjrh-,vp-,sgv-,sft-,slds=6,rd=1,htqt=2,sbx=5,xvfc-,mv-,fx-,nkccfg=8,qjz-,nmn-,hh-,sbg=6,smnh=5,jk=8,xgrs=5,th-,mkn-,rmm-,lmhb-,kpd=9,gp=1,vsd-,kzt=7,lcq-,rq-,mnt=8,mn-,kr=1,qfpf-,thl-,hvs=5,zk-,sj=3,dgf-,lcq=2,rncmzp=3,nk-,ncndp-,kr=3,hjx=8,nl=5,mz=4,tqb-,fvpqcp-,pf=7,tp=4,rf-,dgk=1,qgp-,jfrkh=1,vvl=8,ngs-,qjz-,ts-,fz=4,mk=8,xzkj=2,cpz-,mdqh-,slds=2,mhqzc=8,hgjhv=5,fn=5,ts-,hvvh-,vcp-,xzf-,nvx=3,sx-,vsm=3,rzpt=6,dz=8,msl-,lbdrk=6,lmhb=9,nbd-,vxlgph=8,vphf-,pgp-,vsm=9,gc-,tm-,mv-,vjv=4,bj=9,rncmzp=1,chfsm=5,qrr-,bck=2,hxl-,mxtz-,qpcvg=6,ml=2,pf=3,cqs=4,nks-,jkz-,hmv-,qjz=8,mt=5,hqlkpl-,bck-,pb=4,xm-,vjl=3,mr-,gzx-,xzf-,gfjrh-,dg-,lkks-,mkn-,gg-,vld-,fpp-,zg=5,ttk=6,zzx=9,pc-,pc=7,vd-,pxhnxj=8,ckcslv=5,ph-,vfjdpr=4,pm=9,kb-,ntgd=3,km-,svg=7,cpb-,mjx=4,lpd=1,hr=5,dqns-,qgp=3,pb=4,nsnn-,ghk=5,pfsff-,pmp=3,rjrm=4,gbxh-,nn-,sjdkl-,jsz-,tcqz-,zdtb-,sspm-,rbvl=2,jv=6,vv=1,bk-,hbg-,ng=2,nkr-,rv=1,ncndp-,ff=3,vpnk-,ljr=1,xxcc=7,kk=8,hh-,rt=3,lpd=9,vcp=3,mktfz=1,fn=1,ts=7,sccd=6,tch-,kbmc=2,hgpd-,bclt-,lmhb=2,tg-,dsp-,gq-,dz-,thn-,qpn=8,dcmx=9,sn-,gxs-,zk-,gm=5,zk=3,sspm-,mzfl=2,gk-,bzk=6,grkk=7,rfs-,ndq-,hzq-,vd-,tv-,fjrp=7,xxcc=9,hz-,rt=2,vmh-,mz-,dvd=1,szdz-,vmm-,bt-,sh=3,xv-,sft=5,vmcsh-,qqj=1,sck-,gm-,rqzxz-,vzp-,ncndp=6,fkrs=7,tjfk-,tcn=6,ztcgrm-,vl=9,fl=1,khsf-,jk-,khsf-,bl=6,xxcc=9,dxtvkd=8,zsg-,nnkl=8,kglvq-,rzpt-,nfv=4,xvh-,hz=4,nsm=6,gm=2,cp-,qndj=4,vhzd=9,hmv=5,zfhmj-,rtclsf=4,hgv-,jk-,tbc=4,jfrkh=2,pf-,tch-,zxz-,mf-,zsgl-,pgpzq-,hhz-,nk=3,gpt=4,zxz=4,jpn-,tqb-,htn=2,nks=3,vd=7,gtx=1,rd-,gzx=6,gnvcc=8,ts=8,ckrt-,jdb-,kk=3,gq=7,nbd=5,msb-,hzq-,pfsff-,jq=5,ngs-,dj-,vmcsh=3,nsm-,kpmfqs-,pmp-,vsd-,jgs-,slds-,lzmb=4,njv=9,bclt=5,gnhjs=5,xj=5,bqblll=2,ddn=8,mhx=5,tjfk-,jb=3,msb-,ckcslv-,njv=2,htn=1,zs=5,stg=2,knp-,nsnn=7,mz=4,hjp=5,vjl-,jzhvv=5,zzqmg-,mjx=2,xpl-,xlkb=7,fhp-,vjl-,hqlkpl-,nt=6,zj-,bzk=5,tg=3,sgv-,lrkmv-,pz=9,xg=5,hgv-,szxdt-,gcc-,qgp-,qnn-,zdks-,nn-,sspm-,tt-,mdvnr-,pgpzq=1,rbt-,nn-,bltn=7,msl-,szxdt-,tl-,hjx-,cxxrc=3,shx=1,qq-,mcl=3,qndj=4,cx-,nks=4,chfsm=9,vsd=8,cf-,kvkdr-,pt=8,gfjht=4,mth=5,pxlvz=2,tv-,ttk-,sj=6,kzzn-,vsd=4,hmv=6,zdtb=5,jc=5,dsfb=6,ckrt=3,gg-,tsvtm=8,hb-,tb=7,mnpbcf-,krl-,kphb=3,tcqz=5,cpz-,ggf=9,ljr=8,rzgg-,ssp-,hbg=5,lzmb=3,psf-,knp=1,dj-,ljr=5,rl=2,cpb=6,tv-,kpv-,jb-,gk=7,mcpkb-,mcpkb-,xsbg-,gq=7,mcpkb-,bpf=1,lmpxsn=5,ckrt-,vm-,td=5,pxlvz-,lrpxp=7,ph=6,gp-,hdn-,svg-,htn=2,bzp-,dbs-,hhz-,dgk=5,sjdkl-,rf=5,zjhht-,mch=9,xgrs=4,cmp-,rzpt-,mdn-,jknn=5,mdvnr-,tsvtm=6,gdx-,tq-,dvh=1,xpl=6,gxd-,rqzxz-,cx=8,pxlvz-,hc-,vgc=7,bbth=6,vsd-,glmzc=6,dxtvkd-,gc=5,bmxzp=7,mhqzc-,ddk=3,cc-,hmv-,vjl-,cf-,jc=1,mth-,xvfc-,qjz=6,vkf-,kpv-,xvh=3,pmp-,gm=9,fx=6,zj=1,rbt-,xsh-,zfhmj-,nkr=1,vmh=2,nsm=6,psf-,xgrs=3,bzsx-,srb=5,vkm=3,shx=1,zj-,cpz-,glmzc=7,jf-,vz=7,pb-,mbp-,mt=2,xb=4,jpb-,zs=1,mdvnr-,lpd-,mxtz=1,dgpf-,smnh=8,td-,zfhmj=7,lrpxp=2,rzpt-,sbvx=1,rtclsf-,px=7,bl=7,rf=1,bqctt-,qq-,hg=3,srb-,nmn=8,hr=3,qskn=4,vg=7,psb-,hg=7,mcl=2,pz-,bz-,mcl-,rnk-,hgv=8,sh-,pjct-,hvvh-,qqh=5,kb=7,vsd=8,mnx=4,lrc=9,htzgz=8,tb=4,tch-,thl-,hdn=6,dvd=1,gxmgld-,sf-,jk-,xsbg-,bmhs=7,dgk=7,kqql-,mz=6,mn-,zvg=9,xp-,fk-,rtclsf=5,tjfk-,gpjm-,kphb-,zv-,grkk=9,pzjgls=1,fn-,zjhht-,sgvz=4,ggf=6,zbc-,nptmr-,sbvx-,zzmxzs=2,dv-,xpl-,kbmc-,tn-,rzcx=7,vcp-,ps=5,lpd=4,dd=8,qg-,hd-,bj=8,qnn-,rqzxz=3,sspm=1,dnb=2,jf-,chfsm-,lh-,lzmb-,jx-,xzkj=5,lrdkf=3,mzfl=7,mxh=5,xxcc-,bjd-,ng-,vgdb-,vcp=1,qqj=9,gxc-,xp-,tb-,xp-,jk=4,rj=3,tbc=5,vmh-,zzx=8,tc=9,dgf-,ftp-,slds-,qbns=8,pssx=1,rd=8,zbc-,kglvq=5,nks=9,szdz-,bdlt=6,tm=7,psr=8,kp=7,rbt=9,kzt=8,gzx-,sdg-,pc=3,gxmgld=3,vmcsh-,dj-,kpv=2,lpd=5,hpmn-,nkccfg-,qbns-,jc-,mxh-,hgpd-,lcq=6,rqzxz=2,zk-,qjjfz-,fvpqcp=2,jpn-,mktfz-,vhzd-,dkv=2,px-,rzcx=3,dbs-,mlp-,mbrmr=5,hvvh=5,gdx=5,rxrt-,dvd-,sdbj=9,ncndp-,cb=1,xxcc-,hch=9,sn=5,pfxhxj=8,bfsnt=5,ltf-,qb=5,km=7,kd-,zzqmg=1,rlfgd-,kn-,hjx=9,jv=5,ntgd=3,rzcx-,mt=5,pzjgls-,rnk=9,stg-,tzz-,rv=1,qr=7,vcp=6,gdc=6,mnt=6,hch=4,mt-,rh-,zgs-,vnk=2,pb-,gxs=5,mn-,jnps-,px-,tzz-,jkz-,dsfb=8,pf-,cb=4,sx=8,lpd-,jhm=3,nnkl=6,sgv=8,xxcc=9,xjznm=9,vxr=1,xxcc=6,pjl-,chv-,zvg-,sqt-,vbs=2,pgpzq=9,nrvg=2,vgv-,lcm-,dj-,kq=1,mk=7,msl-,pgpzq-,mjx=7,kqql-,rbvl-,gxc-,xm-,qfpf-,nsnn-,gxd-,sx=7,nj=6,bclt-,sdg-,svg=2,ssp=4,gk-,scx=8,nsm=1,rvr=5,jkz=4,lcm-,pjl-,kr=1,gfjrh=6,dxtvkd-,qhsj=5,ckcslv=5,bnn-,hxl=8,rj-,kqql-,hp=8,nfv=7,vgdb=7,qb-,dcmx-,cf=4,nvx-,hh=5,hdn=5,bck-,chv-,xh=3,mdvnr=9,ztcgrm=2,vpnk-,jk=1,gnvcc-,ftlcft-,zj=2,tp-,crxg-,sft-,hp-,xv-,pjct=7,hb-,rlfgd=3,mt-,gbxh=1,vdfx-,xv=1,lbdrk-,xvh=6,jgs-,dbs=6,hhz=3,mcpkb-,qx-,sccd-,bjd=4,pz=5,xb-,mxh=8,vxlgph-,gnvcc=6,kbmc-,mn-,db-,mlp-,dnb=6,ps=8,ngqh-,vlnd=3,qndj-,nks=3,pjl-,vpnk-,dsp=9,tq=3,mdn-,jpb-,vhzd=3,kp=2,tm=1,lrdkf-,vg=4,mkn=4,xxcc-,lbdrk-,pc-,glmzc-,fqqx-,hmv=8,dk-,dkv-,dkv-,pb=6,vmcsh=5,pmp=8,khsf-,psb=5,jpb=8,pgpzq=5,scx=2,lh=1,tt-,pgp=4,dv=7,ss=5,rjrm-,sccd-,ph=2,dj=8,pdg-,rxrt-,mxtz=2,xj=9,jfrkh-,bt=9,bzk=3,ngs=8,gpt=6,fjrp-,kb=5,zzmxzs=7,px=5,nrvg=3,vcp=4,xqgl=5,qskn=3,mdvnr-,bg=5,rf-,pzjgls=5,rz=3,zsq-,vbjk=2,zsgl-,rh=5,zsq-,kgk=8,pdg=3,tt-,nmrt-,srb=5,dv=5,grkk-,sjdkl-,tjfk-,hmv-,kbqc=2,pfxhxj-,vbs=7,pgr-,jfrkh=1,qgt=4,kp-,jc=2,htn-,sspm-,nkr=4,cspg=2,tm-,mxtz-,qbns-,mxtz-,pgr=1,bclt-,xdk=1,clpc=1,gnvcc=9,lpd=1,tc-,sh=2,rzxt-,ts=6,rnk-,cmp=6,vl=2,psr=7,zzmxzs=7,td=8,snz-,kjcqvr=1,vhzd=6,fr-,htzgz=8,xv-,kpd-,rbt-,rvr-,jsz-,vss=3,xv-,sq=6,scx-,fjrp-,gxd-,js-,nkr-,cc-,mhqzc-,vv-,xdk=7,bck-,qh-,sq-,ckrt-,fkrs=2,zf-,prf=3,tjfk=5,sgv-,lk-,rqzxz=7,rvs=6,dsfb-,rvs=9,htn-,cpz=4,gtx-,jpb-,qbpq=7,hd-,cpz=6,mkn=2,bt=5,hp=7,gbxh=3,prf-,xp=3,lls-,qjjfz-,mnpbcf-,sx=4,mz=9,pzjgls-,szdz-,zzqmg-,mzfl=8,kpd=6,cqs-,zsg=2,qqj-,vhzd=7,qx=1,pxlvz-,mq=1,gk=7,lzmb=2,jbgf-,dcmx-,xzkj-,tg=8,fr-,mkn=1,tn=9,klnvl-,vmm-,zgs-,rj=3,zzmxzs=5,fpp-,stg=2,gk=9,cfx=7,bpf-,xkt=1,lrkmv=1,sgvz-,sdg-,rxq=3,lcq-,zsq-,smks-,ctg-,xqgl-,bb-,glmzc-,sdbj=9,rncmzp=8,ljr-,kz=6,bltn-,tjfk-,vcp=7,fk=1,fhp-,mcpkb=2,dsfb=3,vkm=9,thn-,tsvtm-,cf=2,flp-,rd=4,gc-,mdn-,zvg-,dgf=4,lqq=7,tcn=5,vgv-,rncmzp-,pjl-,sjdkl=3,rtclsf-,slds=7,pb=1,xvs-,vcp-,zsg=9,vsd=4,kgk-,lh-,mktfz-,bltn-,gdx=5,hzq=7,cpz=7,vld=1,nt-,cqs-,hl-,pzjgls-,cqs-,xg=3,ng-,dg-,nkzzc=1,hc=8,ggf-,zc=8,glmzc-,krdk-,cb-,vzp=2,mv=6,cspg=4,pb-,vmm-,sck-,vvl=9,qnn-,htn-,nt-,xqgl-,nvx-,qskn=8,vkf-,dvh=9,xc-,vh-,jq=2,zsq=1,jgrd-,kbmc-,mz-,dnb=5,njv-,mxh=3,bmhs-,jhm=7,ghk-,rnk-,tch-,xfg-,rxrt=7,tbc-,dg-,mhx=8,sh-,pz-,mnt=4,sbx-,mz=6,rv=5,gpt=8,nmrt-,bmxzp-,jv-,krdk-,tqhs-,gfjht-,sccd-,clpc-,xsbg-,jpn=9,szx=4,mhx-,mt=4,zvg=9,szx-,ng=4,mjx-,qg-,zzqmg=7,xb-,gr-,xm-,xxcc=8,mq-,hg=1,vz-,bqctt=6,rbvl-,gqgzxf=3,mk=6,thn-,mnt=4,mcpkb=7,knp=2,snz-,jzhvv=2,ndq=9,mq-,mkn-,mf-,ss=4,zbc=7,zzmxzs=1,pgr-,njv-,qb-,bfsnt=4,bnn-,hmv-,zbc-,ckrt=5,bpf-,vht-,sbg=7,vmcsh-,rbpp-,qgt-,lcm=9,rbpp-,bl=1,sck-,vsm-,rf-,krdk=4,mjx=6,pfsff=6,tg-,sn=7,qbns=2,vzp-,qx-,chv=1,qr=3,ch-,khsf-,sgv=9,qjz=1,smks-,rqzxz=7,cb-,nnkl-,kzzn=1,vphf=3,nt-,hxl=8,sh=2,rtclsf-,scx=7,kb-,mzfl-,zzmxzs=7,ssp=4,nptmr-,xlkb=4,jbgf=1,kf=3,tv-,zsgl-,xsh-,kq-,mch-,hb=5,vss=7,bg=9,msb-,fr-,pz-,zgs=6,ngs-,jdb=9,hjx-,dcmx-,rt=9,rbt-,vc-,tt-,qjjfz-,flp=5,hg-,xgrs=7,psf=1,vtms-,mkn-,mcpkb=1,tls=6,fqqx-,zgs=9,ckcslv-,kglvq-,dvh=3,sqt-,hhz=6,mnx=8,msl-,kzzn=2,flp-,hr-,jhm=6,qgp-,lqq=7,hpmn-,gzx=6,vdfx-,tm-,rfs=1,zc-,flh=1,lmhb=7,jf=1,vcp=7,vmh-,kr=9,hxl-,xlx-,vtms=5,px-,fjrp=8,lqq-,nfv-,vdl=8,tm-,vsd-,kb-,hp=8,ctg=9,hqlkpl-,fkrs=4,jvx-,hdn=8,zzqmg-,gzx-,kzt=9,dd-,ddn=5,sbg-,fqlnbc=7,shx-,fhp=4,ch=1,pnq-,nbd=2,xv=5,qbpq=6,jk=7,cc=4,mhqzc-,xfg=3,lvfdjv-,vv-,hjx=9,lkks-,pnq-,ngs-,nbd=5,td=5,flh=6,zbk=5,smnh-,rv=9,vv-,kg=1,jvx-,lf=2,gg=7,tqhs-,kpmfqs=1,xjznm=6,tb=7,zjhht=6,pssx-,zdjgj=6,rlfgd=6,mbrmr=8,dv-,psf-,sn-,qbpq=2,bqblll=6,xh=5,tqhs=8,gxc-,rzcx-,vp-,zc=4,fvpqcp-,kd-,pc=7,dbs=7,zbk-,pm-,cspg=7,qfpf-,hr-,dhjv=3,tbc-,tn-,sdbj=5,pxhnxj-,nsnn-,nmrt=1,sck-,zg=4,bdlt-,bc-,rncmzp-,khsf-,krdk-,lk=2,kjcqvr-,vkm=1,vtms-,nsm-,slds-,lcm-,kqql=3,mktfz-,shx-,xsh-,lh-,rl-,cc=5,pgpzq-,gdx-,vnz=5,bltn-,gtm-,vtms-,rh-,hjx=8,zc-,mzfl=2,vsm=7,pnq=5,rxq-,gcc-,zdks-,nn-,ngqh=1,clpc-,pxhnxj=2,hvs=6,dj-,pssx=7,jvx=1,zs=6,gk-,mnx-,jpb-,jxf-,jpb=4,pxhnxj=1,gp-,vht-,dnb=7,kd=9,pl-,kb=7,nt-,hmv=6,sx-,hxl=9,nmn=8,kq=9,df-,cxxrc=3,xvs=8,kphb=6,xlkb=5,lrkmv-,rjk=7,zf=1,scx=4,rfs-,ckrt=2,hgv-,qqj=5,lcm=7,hgpd=3,hjp=6,hzq=4,qjjfz=1,nmq-,thn-,ghk-,bk=4,kpv=9,xgrs-,dbs-,rxq=8,fpp=8,lpd=6,nmq=6,th=6,nk=6,sdbj=2,kr-,zg-,gnvcc-,hg=1,sh=8,nmq-,jzhvv-,ggf-,kgk-,kvkdr=7,xznvs=6,fr=9,tjfk-,rxrt-,sspm-,hdn-,xh-,grfm=2,mdvnr-,rh-,vh=2,nkccfg-,xlx-,dj-,vtms=3,gtm=6,vxlgph=9,rbvl-,lpd-,vmh-,tch=7,ckrt-,tqb-,dkv-,rfs-,pssx-,kglvq=6,jvx-,hz-,rt-,hg-,jk=7,kr-,bg=3,tch-,df-,cspg=4,qgp-,vc-,dgpf-,ff=2,hmv=8,jsz=5,hg-,zvg=7,cx-,gfjrh=3,xfg=2,jc=5,xzkj=4,xb=9,zbc=4,zdtb=5,jnps-,jxf-,nkr-,xdk=7,hpmn-,kpd=5,zk=5,gc-,dcmx=5,ngqh=8,rtclsf=1,gdx=3,hc=3,vphf-,mf-,vmcsh-,dj=9,bz-,zzx=7,kn=8,pvdzq=4,tch=1,tch=7,fv-,bk=5,kjcqvr=1,hgqr-,ddn-,bbth-,dj-,bclt=9,cxz-,pbdd=7,xxfrf=6,ltf-,nj-,zsgl=2,fqqx-,gr=4,hp=7,gdx-,msb-,vc=1,ml=9,lmpxsn=7,lpd-,fbng=3,mth=7,pbdd=5,fhp-,lkks-,zhd-,ltf=6,khsf=4,qr-,mcl=4,hhz=8,kbqc=3,vgc=6,px=7,stg-,fvpqcp=8,vdfx-,js-,hz=8,qndj=6,nsm=9,sx=4,ghk=2,xp=1,pfsff-,kd=5,rzpt=4,dhjv=2,xv-,mnpbcf=5,cc=9,xzkj-,pzjgls-,flp=4,ftlcft=4,hjx=6,rt-,dv=8,vtms-,xp-,hgjhv=6,ps-,rt-,kzt-,kg=7,sf-,dhjv=3,qb-,mbp-,fv=1,xh-,vdfx=8,scx-,dsfb=3,rnk=5,kp-,sgv=4,tbc=9,gpt-,cqs-,dnj=1,fk=2,mch-,tbc-,gxs=4,hqlkpl-,crxg-,qhsj-,clpc-,nptmr=7,krdk=2,rbvl-,ckrt-,zdjgj=4,smnh=5,fk-,hjp=9,jxf-,kpb-,ljr=6,jv-,msb-,xg=9,hb=6,tl=3,stg-,qbpq-,vgv=3,tl-,mkn=2,rvs=6,ngqh=8,bg-,crxg=2,gc=3,lh-,qqh=5,xzkj=1,zj-,mv=5,sdbj=5,jx=6,vm=6,jgrd-,rjrm-,jsz=8,th=8,njv-,dcmx=3,rd=5,rzpt-,mn=5,vtms-,zdks-,mktfz-,kf=1,mdn-,ff=8,fk-,dgpf=9,xdk=6,nnkl=4,xzf=4,kk=2,mcpkb=2,bck=8,vpnk=9,xznvs=2,lk=2,ltf-,tc-,nmn-,zs-,tl=2,vzp=4,szx=3,lmhb=7,psb=8,ps=4,jv-,qgt-,nk-,nk-,ssp=3,rf-,pxhnxj-,pfxhxj-,qgt=4,gnvcc-,sgvz=3,pt-,rv-,sf=6,vgdb-,bbth-,gr=7,kbmc-,nrvg-,cspg=9,kg=9,dvh-,lh=9,vnk=5,pvdzq=3,kn=8,mdn=8,nmq-,rq=4,kp=4,gfjht-,ckcslv-,fkrs=4,nks-,xqgl-,hc=8,ssp-,fz=1,ssp=7,ps=2,kphb=9,nsm-,stg=7,bmhs-,sck=1,xj-,cmp-,ghk-,nn-,zsgl-,qbns-,rtclsf=9,zhd-,lrc-,gdc=3,mch-,sjdkl-,bmxzp-,lvfdjv-,vg-,qgt-,cfx-,ph=3,xsbg-,hr-,dkv-,cc-,nptmr=2,nfv=7,sccd=8,hjp=6,dxtvkd=2,hz-,vkm-,xxcc-,hpmn-,sqt=9,qx-,bj-,vnk=2,lrc=6,hmv=4,hbg=4,kbqc=8,zxz=1,qg=9,dg-,kz-,bzk-,xzf-,hg=6,mch=5,dbs-,qx-,qgt=5,bqblll-,tl-,qx=2,nmq=3,mlp=1,hzq-,bnn-,vmm=1,ljr=9,tp-,qg-,jvx-,vtms=6,ltf=1,rbpp-,flp=6,gtx=4,gr-,pgpzq=2,nks=2,px-,rv-,hgjhv=6,dv=8,lmhb-,ch=3,htzgz-,sspm=3,jknn-,ndq=3,qbpq=7,dgpf=5,qndj-,ctg=4,kn-,cxz=8,lrkmv=5,krdk=6,gtx=8,hch=9,nkzzc-,cqs-,kg=4,zzmxzs-,jx-,gfjrh-,vld-,qpcvg-,hgv=4,dkv-,rxrt=2,vmm=5,mnx=7,kd-,dhjv=3,nks-,rp-,svg=4,glmzc-,lls=9,bqblll=9,qpn=8,qskn-,rbvl=6,vm-,mk=3,cspg=5,slds-,cl=6,xg-,xc-,rncmzp=4,pzjgls-,hd-,hvvh-,xkt=2,smnh=4,tm=4,lnc=4,gtm=1,snz-,rqzxz-,ssp-,xg=2,zv=7,pjct=6,mq-,bnn-,sx-,xfg=9,ljr-,bj=8,pbdd=8,ttk=7,cx=1,snz=6,dkv-,tv-,pxhnxj-,jpn-,jgs-,mxh=1,mf=7,kq-,hz-,vz=8,bzsx=4,jnps=1,dgf=8,zgs-,fbng=4,mk-,pt=7,nmq-,ngs=8,lh-,vkm=6,kqql-,vg=2,gg-,cxz=8,hr=4,tq-,gxs=6,cspg-,mth=9,xjznm=6,bzsx-,pzjgls=9,krdk=6,jxf=9,mdqh=5,ssp=6,njv-,mch=1,gqgzxf-,sgvz-,pssx-,zsq=7,ng=6,rzcx-,sdbj=1,zsgl=1,szx-,nrvg=1,dtdk=9,dbs-,kqql-,hjp=5,ddn=2,df=8,zg-,xfg=7,cx-,nmq=9,bzsx-,sft-,gfjht=2,bqctt-,gtm-,sqt=8,ljr-,shx-,gcc=3,kjcqvr=5,tt-,xvfc-,ghk-,tls-,hb=5,pz-,vphf=1,rv=6,zf=9,vzp=9,ml-,thl-,kbqc-,knb=4,tsvtm-,bzp-,pnq=2,scx=6,nt-,ngs=4,vpnk=5,pb-,lrdkf=6,jfrkh=8,crxg=8,gpt=6,bmhs-,vss=2,pgr=9,mhqzc=8,jgrd-,bz=2,kqql=9,gxmgld-,pl=8,dd-,hgqr=3,tcqz=9,zk-,zhd=3,pgp-,th-,vxlgph=9,gxmgld=5,gpjm-,cfx-,bbk=5,ltf=1,pgr=7,tjfk=3,vkf-,nfv=2,zdjgj-,knp-,bck-,vb=9,hd=5,sdg=6,vgv-,th=3,fqqx=8,gxs-,dcmx-,zs=4,fzs-,zsgl=9,nbd=1,fv-,lrdkf=6,vjv-,sck=1,qx=8,jdb-,zdjgj=5,sbg-,pgp-,kzt-,zg=4,pgpzq-,rtclsf-,bpf=6,dnb-,kzzn=4,cp=1,td=4,jpb-,xqgl-,lrpxp=7,xh-,tt=4,xgrs=3,vkm=9,xpl=6,nkccfg=8,sn=1,bl-,ssj=2,snz=5,dgk-,tch-,bmhs=5,mbp-,gtm=4,dg-,slds=5,gtx=5,xr=4,msb=2,ftp=5,tch=8,vl-,mdvnr=6,dk-,sgvz=4,fz-,rzpt-,sspm-,gr=6,nl=3,hp=9,pzjgls-,vdfx-,nj-,xxcc=5,db-,bjd=6,ps-,gtm-,psf-,ncndp-,nt-,mnx-,tc-,lkks=9,mn=7,rvs-,cpz-,vpnk=1,ks=8,vht-,nmn-,vpnk-,vxlgph-,xm=2,qg-,jv=8,sck=9,gpt-,rbt=2,mdn-,gxc-,bzsx=7,tm=5,lh-,nn=1,th=9,ckcslv=5,hvs=1,sccd-,mcpkb=4,vcp=6,vz-,rjk-,mcpkb=2,gcc-,jdb=4,bz-,kq=8,pnq-,ntgd=9,ss=6,pl-,szx-,lkks-,pmp-,lf-,ghk=7,ckcslv-,kz=5,hdn-,vxlgph=3,qqj-,gpjm=1,vmcsh=8,krdk-,mch=2,kpd=8,gdc=4,fz=4,fl=2,gc=2,mbp=3,kczrf=8,fk=2,gr-,fkrs-,dnb-,zs=7,xzf-,lnc-,xznvs-,rzgg-,xpl=5,dk=4,jk=9,mjx=6,kphb-,cpz-,lmhb-,fz=6,sgv-,zzmxzs-,cp=3,zzx=9,hb=7,nkzzc=2,kphb=9,nsnn-,jfsg-,pzjgls=7,fpp-,gqgzxf=4,tb=9,rz-,sqt=2,lqq=5,xvfc=2,mbp-,rp=8,zxz-,qg-,jknn=3,nks=2,dgk-,cf=8,gxc-,gq-,crxg-,qx=9,sbg-,vss=7,xt-,kqql-,khsf=1,dvd-,zc=6,vzp-,jvjdbb=9,kq=7,zdtb=1,slds-,msb=7,jfrkh-,vss-,xp=6,fvpqcp=6,bclt-,th=6,kpmfqs=5,sdbj=8,mth=2,cfx=5,kz-,kpmfqs=5,pgr=8,vm=8,bb-,sh-,bk=4,zzx=5,jpn=3,pgr-,pjl-,kqql=5,hhz=4,vnk-,mxh=6,zbc=7,dvd-,qpcvg=4,lpd-,hd-,gr=2,mq=3,nkccfg-,rzcx=8,sgvz=3,nks=3,qqj-,gxmgld=7,th=4,pjl=2,xvh-,df-,hl=3,zjhht=5,zgs=2,kp=4,rtclsf-,xvs-,bbth=3,pdg-,nmrt=9,smnh=3,vsd-,fkrs-,pf-,sbg=9,jfsg-,vcp=6,jb-,xzf=3,xvfc=8,kq=3,zbc-,hpmn-,rzcx-,tbc=3,zsgl-,lqq-,hzq=4,vdl=9,hd=1,mq-,prf-,qqh=2,lrdkf=5,vmcsh-,rjk-,pbdd-,sx-,jk=7,bmxzp=9,tq-,pgpzq-,jzhvv=9,fv=6,ks-,rf=7,bl=7,pdg-,pzjgls=7,mxtz-,hgpd=2,hb=2,rzcx-,vmcsh-,gxc-,kpmfqs-,mch=4,zzqmg=4,kczrf-,hz-,vhzd-,hzq=7,qhsj=5,mn=8,bzk=3,vgdb=8,vdfx-,nkccfg-,xzkj-,tv-,pssx-,gm=2,lbdrk=2,xvs=8,hb-,dnc-,mdvnr=2,lrpxp=1,hxl-,dgk-,ps-,vvl=1,xv-,vb=8,mch=4,rtclsf=9,rxq=6,hgpd-,zv=2,qnn=1,fkrs-,knb-,gm-,kczrf=5,gxmgld-,vxr=8,vgdb=3,pbdd=5,pssx-,zq=1,nfv=5,pxhnxj=8,hbg-,ngs=9,kglvq-,bg-,gk=2,cb=2,cxz-,vxlgph-,ml=3,lrc-,bfsnt=7,nk-,pb-,vp=2,vgv=7,flh-,pgpzq=3,rz-,xxfrf=2,hz=4,htn=5,sck=2,vhzd-,vc-,rq=4,vpnk-,mn=4,rzxt=2,hgpd-,lqq-,ssp-,kbmc=4,bz=3,rt-,shx-,pm=8,qhsj-,xb=2,hbg=9,kqql=4,mnpbcf-,kn-,ndq-,hvs=4,dgf=5,tqb=9,xvs=7,smnh-,htqt-,xvs=5,xvfc-,glmzc=9,gxd=2,fn-,jpb=5,jvx=3,vjl-,gq-,xxcc-,zhd-,zhd-,jhm-,ckrt-,vm-,vjl-,zj-,ftp-,xv-,dgpf=8,ttk-,nptmr-,zgs=3,tt-,vgc-,hb-,knb-,kpmfqs-,mlp=6,vgdb=5,hqlkpl-,tc-,fr=1,ljr-,ttk=4,xxcc=7,xt=9,rmm=9,fv=8,dhjv-,dgk-,tzz-,kczrf=9,kg-,jkz=6,xpl=9,ml-,qbns-,ttk-,mbp-,ddn=5,vhzd=8,kglvq=7,bpf-,crxg=9,vvl-,lnc-,jk-,xgrs-,gpjm-,hh-,zbc=3,ckcslv-,snz-,xpl-,fk=2,tjfk-,dbs-,mv-,ff-,pvdzq=1,nn-,kz=3,hgjhv-,km=8,rq=5,zgs-,lrdkf=8,krdk-,jhm=9,nks=9,szxdt-,knb=7,xsbg=6,dnj-,psr=5,lmpxsn-,bqblll=7,dnc=5,bdlt=3,tv=8,knp=1,mktfz-,vmcsh=2,hjx=1,gtm=3,xlx-,zsg=6,sqt=7,fk-,bc-,kq-,rxq-,jgs=2,lmpxsn-,ddn=9,sgv-,szxdt=2,cp=4,tp=5,xzf-,zhd=1,mfx=1,xg=4,fn=3,rjrm-,lrc=8,vg-,sgvz-,jf=5,qg-,fx-,msl=4,pl-,nk=6,jsz-,msb-,vg-,ngs-,szx=6,hjp-,vv=6,qjjfz-,sgvz-,tl=8,mxh-,xvfc-,ssp-,tqb=7,fn=5,gk-,nmn-,msb=2,ftlcft-,mfx=3,mjx-,lls=1,fqlnbc-,hc-,sf-,db-,gtx-,vc-,xznvs=6,hl-,vss=1,sft-,sspm-,sft=8,gtm-,gxc=2,tbc-,cfx-,lpd-,psb-,sft=9,kgk-,mn-,zvg=2,qgp-,vg-,bfsnt-,hvs=7,pjl-,njv=5,qbns-,qpcvg=9,rfs=9,bbk=3,qg-,tqhs=3,xsbg-,zfhmj=6,zsq-,hhz=3,mbrmr-,pbdd-,qb-,fhp=3,mbp=9,ch-,bg-,rz=7,rl-,qs=3,sjdkl-,xt=3,cp-,zsgl-,pdg-,bpf=6,krl=5,sck-,dg=4,hb=4,rncmzp=7,kbqc=8,nsm-,nfv-,bclt=4,hmv-,rt-,pvdzq=9,nnkl=2,dgk-,dgf-,vsd=7,kz=4,klnvl=6,rzcx-,mnx-,kpb=3,jq=6,db-,fx-,zjjmb-,jc=4,kzzn=3,vphf-,lh=9,mnpbcf-,hqlkpl-,szdz=5,xzf=8,rj=1,nnkl=9,qfpf-,xh=3,js=5,ggf=8,zdjgj-,zsgl-,zq-,psb-,cmp=5,glmzc-,gpjm=5,chfsm=5,lnc-,srb=1,xvs-,snz-,rncmzp=9,xsbg=4,pt-,smks=3,ljr-,ckcslv-,mfx-,mktfz-,mn=1,zhd-,nnkl=9,mzfl-,km=3,grkk-,crxg-,qrr=1,thn=1,hd-,gfjht-,xsh-,xdk=9,xzf=7,ks=1,kk=7,dsfb=2,hjx-,pgp-,qgp=5,qpcvg=4,xv=4,xxfrf-,pl=4,smks-,pt-,msb=4,bclt-,qndj-,jc-,ts=5,gbxh-,dhjv=1,sgvz-,mjx-,jkz=6,sf-,sjdkl=9,crxg-,zg=9,zjjmb=2,zc-,hxl-,mn=9,dvd-,vnk-,nbd=7,gbxh-,ljr-,hh-,kn=3,fn=1,xqgl-,ng=1,sx-,lrdkf=4,dg=9,ngqh=5,gxmgld-,hch-,qpn-,gcc-,zjhht-,df=8,rp-,rv=6,mktfz-,kr=9,bzk-,lpd- From d35af3ede73dbb8116ed98a74e1ce3cec23ac27e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 15 Dec 2023 10:59:09 +0000 Subject: [PATCH 437/479] 2023: d15: ex2: add solution --- 2023/d15/ex2/ex2.py | 76 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100755 2023/d15/ex2/ex2.py diff --git a/2023/d15/ex2/ex2.py b/2023/d15/ex2/ex2.py new file mode 100755 index 0000000..a0065e9 --- /dev/null +++ b/2023/d15/ex2/ex2.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python + +import dataclasses +import sys +from typing import Optional + + +@dataclasses.dataclass +class Lens: + label: str + num: int + + def __eq__(self, other: object) -> bool: + if isinstance(other, str): + return self.label == other + return super().__eq__(other) + + +def solve(input: list[str]) -> int: + def compute_hash(string: str) -> int: + res = 0 + + for c in string: + res += ord(c) + res *= 17 + res %= 256 + + return res + + def parse_step(step: str) -> tuple[str, Optional[int]]: + if step[-1] == "-": + return step[:-1], None + label, num = step.split("=") + return label, int(num) + + def find_label(label: str, box: list[Lens]) -> Optional[int]: + for i, lens in enumerate(box): + if lens.label == label: + return i + return None + + def focusing_power(boxes: list[list[Lens]]) -> int: + res = 0 + + for box_num, box in enumerate(boxes, start=1): + for i, lens in enumerate(box, start=1): + res += box_num * i * lens.num + + return res + + boxes: list[list[Lens]] = [[] for _ in range(256)] + + for label, num in map(parse_step, input): + box = compute_hash(label) + index = find_label(label, boxes[box]) + if num is None: + # Remove label from box + if index is not None: + del boxes[box][index] + # Place len in box + elif index is not None: + boxes[box][index].num = num + else: + boxes[box].append(Lens(label, num)) + + return focusing_power(boxes) + + +def main() -> None: + input = sys.stdin.read().splitlines() + assert len(input) == 1 # Sanity check + print(solve(input[0].split(","))) + + +if __name__ == "__main__": + main() From 6c0e3722288c70386a725000f481fda2ef0aa637 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 16 Dec 2023 11:12:42 +0000 Subject: [PATCH 438/479] 2023: d16: ex1: add input --- 2023/d16/ex1/input | 110 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 2023/d16/ex1/input diff --git a/2023/d16/ex1/input b/2023/d16/ex1/input new file mode 100644 index 0000000..2b0a13f --- /dev/null +++ b/2023/d16/ex1/input @@ -0,0 +1,110 @@ +\..|...................|........\..............\.................-......./........./...\..........-......./... +........../...-/......\.|............../.................\...........\........-.........|.....\.-.|........... +...............-...........|......|...|......../.......\............../.................................../... +..................................|............../..|.|.../............./..\\........|...|..............\..|.. +...........................-...-...-.......................-.....-.-....\.......-............................/ +........-...|.......|./../......................./.........................\.................../.....\........ +\..\............-.\.........|../................................\....\......................./.............-.. +|\...|....\................\...|........\-..............|............\.........\.\..|.|....................... +.....\.........\......|...-...............................-.............-../.../..--......\.....\............. +................|...........................|..........\...........././.................../............../.... +.............................\......\.../..|................---................-......\....|...-............-. +..........|........./......\|...|.......|........\......\....-....\...-...../................/..-..../......-. +...|............./.................\../....|...\../.................|...|..|......|........................... +..................................-......../.....|............................................................ +...................-.............|...-.........../...........................-..............-...............|. +..-.............../.............................-......-.....-.............|-...../....................../.... +....||...../.........................................-...........................................--./-.......\ +...................\..........-......./..............|\........................../.-.|..............-..-/...|. +.-............-............../..-........../.......................\...-...||........./.-.....-....../........ +.......-.......-........................................../\\.......|......./../..\........\..-.........../../ +....../../.......................\.........\-....\.|..................\......................./...-\.......... +\.......-........\...-.....................\....-........./-...|......|.......-........................\...\.. +...|\.................................../..../..........|......-......../-..|......./..........\../..|......-\ +..........\...........................|..-........-/-......../....|...............................\.....|..... +..............\......-............................-.../........|........................./........-........... +.............-..\.//.....................-....-......|....../....-............................/..............| +\........../....|................./.....\......\.../.................|........\............../................ +.....-........-/|.........\.....-./............|...\.|......|.......|...................\\.....\.............- +................|.-...-.....................|..........-....\....\......../...............................././ +...........|.......\..............\......................................./........-.......................... +...........................-..../............|............................|...........\....................... +....................|..........|..................../...........\.....|.........-............\.\...-..\....... +................................-......-......\.....-/......\...\................/................-........... +..|.....\..\......|../....................................................\\......-...../..../..............// +.........\.................\..\..-.-..................\.....\..\.....\..........-............................. +...................\............/..\............|.............../..\............................|\.\...../.... +......|...............\.......|......|/........|....-.......|...........-.../.\....\.....|./.......|.......... +....\/|................-.-..........|.................../..............|../-...|/..........|.................. +..|........./-\.............|...|............|......\...................\..../.........|...............|.-.... +...................-................\....|/....-...|......./....../..........-|............/......\../..\\.... +...........................-..........................................-...|.|................\../...........-. +......../.....|.........-.......|........./-............|../.......|......-.-.-.......................-..|-... +.........|-...............|............./.....|........../..|........\..........|/.............../-........... +...\.....|..|...........\....-...\/.........................................|...................\......-.-.... +.../...-...|.............|.....\...|.................................../..............\.................../... +..........-.........../....|.....|..-.........../.................................-..................\....\/.. +....../..............\../......../.....-./....|../.\....-.................../............................../.\ +......-.|..........................\...............|.......-...-....../.............//...\|................/.. +................/.........|........................|......./..|......../-...........................\....|.... +........../...|.........\...........-./......\\...........\......|-......|...\...............\................ +../.........................|.................-/...........--.........\.../........................\.........\ +........\..|...|.............../...................-.........|.................\..|......./.........-.....-|.. +\.../.......|.............|-.../.................\...\..........\...|..........\....../......-................ +............|.|....\..--............-/-..................../........................-../..\..-................ +.....................................|.................../.................................|..../..-......\... +....|..............|..-.....|../.........................................|........\.................|......... +..............\..|...............\....||........../................................\................./.\...... +.....................-../......./....../.................................-............\........../............ +.....|.............../......-.\.|........-...................|.....-........\...-.............-....-.......-.. +..../.....|..............\../..............................\........|....................|..............\..... +....\................-........\../......|..../......................-.....|............../.../........../..... +....-...........................-.............|...........\..|........|.......\././.....|./..........\........ +/....................\..............\.............................-......................../\......../....-... +......\..................-............................................./.\...../.............\....-....\.\.... +..................................\-............................/.......|........................-|........... +.................../.../.......|./............\.........\....-.-....-../\.........|........./...\............. +......./.../....|...../|......................|.....|.....|.........|...........\......-.\..................|. +..././...........................|.......\.|......-........./................................................. +........|.|.......................-....................././.......||...........|/....-....\.......|......\/... +.\.\.....|....\......-....|...|.....//........|..-.........-.................-........./...................... +.|.....................\............-.................................|..../.............-....../.........../. +.|..\..../...............\..................../...\............................-....../................../.|.. +./.\............................/.............-...../-................\.........\.............|...../......... +..........\...............................\............../.........\.....-/........./|........................ +.............\..|....|..................................\.........|./......................\.........-........ +../.....|-............|...\................|...-....-........./........|.-..........\......................... +........-............./...........--................../...............................|..|.\....\............. +\.............-\.........................-|......|/.........\............/...........-.../.\........\..\.../.. +......................|........\....-../.............|......|.-...................................-|../...-... +.............|...|.....-...........|.....-...............|...\........................./..\....\.............. +..............|.............-.........../....-..................................|......./........|............ +...........|.-..../......................................\....-...\-......../........-..........-......-.....| +../...........-............-.../|...........-.-.............\.............................|.............-..... +.........../...-............../........./...................................../......-.......\\............... +........................./.||......|...../.......|....|..................-..........|......\.................. +............/....-./..-...........|...-..........\....../...\/.......|\.....\....|........../..\.\............ +.......................................-.../.......|............|........|...\..........\.....-............... +/..\|.............-...-.................................\........\...................\......|....-............ +..................\............../........................./.........|..........\...\......\..........|......| +.../.................................................../...|............../....\...\...../........|.......-... +..................-.-..........................\.................-......................-..\.........-........ +...................../\.....\.............\.............../................\.|............../........./....... +....................|../.\./......................................-.../.......\............................... +|........................-..............................................|...............................-..... +....\.\...........\......|.........\/|..|....|.....\............-...../.............................\\........ +......\....|......\|.....-..................\........\.......................-............-.|..............|.. +....|.....././.......................|......../...........-.|............./......-.|....../.....\......|....\. +.........\........|.......\..........|........./..................\.........................|................- +.....\..........\.....-......../...|-........../...\/|........................................................ +.../.....................\../.........\.|.........-..........\...............................|...............\ +.........-...........................................-.|...........\......//............../..|.\............/. +.-|../...../.........|............./..........................|..-.\......\............\................../... +../....../.................|..............\.........|.\......\...../.......\............\./.......|....../..\. +......../.-..-......\.........................\|...................................-....../................... +......................-....|........./\................|......\..-\....../.......\.................\/.-\...... +............\...|...............|............./...........................................\....-.-............ +\.........|.............................|............/.........-.....\........\|...-..-..\/.../......./....... +.............................\.|...............\....\..\-.....................\......-...../......\..../.....\ +..\-......\.\........-........../........\...............\..................../....-....\.\.|.|............... +................|./........../.................................-.............|...................\............ From 36f84c43245a79821c2cb2a7dd0a8ff980201d12 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 16 Dec 2023 11:12:48 +0000 Subject: [PATCH 439/479] 2023: d16: ex1: add solution --- 2023/d16/ex1/ex1.py | 118 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100755 2023/d16/ex1/ex1.py diff --git a/2023/d16/ex1/ex1.py b/2023/d16/ex1/ex1.py new file mode 100755 index 0000000..49cf855 --- /dev/null +++ b/2023/d16/ex1/ex1.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python + +import sys +from collections import deque +from collections.abc import Iterator +from enum import Enum, StrEnum +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class Direction(Enum): + NORTH = Point(-1, 0) + SOUTH = Point(1, 0) + EAST = Point(0, 1) + WEST = Point(0, -1) + + def apply(self, pos: Point) -> Point: + dx, dy = self.value + return Point(pos.x + dx, pos.y + dy) + + +class Tile(StrEnum): + EMPTY = "." + MIRROR = "/" + ANTI_MIRROR = "\\" + VERTICAL_SPLITTER = "|" + HORIZONTAL_SPLITTER = "-" + + def apply(self, dir: Direction) -> Iterator[Direction]: + match self: + case self.EMPTY: + yield dir + case self.MIRROR: + directions = { + Direction.EAST: Direction.NORTH, + Direction.NORTH: Direction.EAST, + Direction.WEST: Direction.SOUTH, + Direction.SOUTH: Direction.WEST, + } + yield directions[dir] + case self.ANTI_MIRROR: + directions = { + Direction.WEST: Direction.NORTH, + Direction.NORTH: Direction.WEST, + Direction.EAST: Direction.SOUTH, + Direction.SOUTH: Direction.EAST, + } + yield directions[dir] + case self.VERTICAL_SPLITTER: + if dir in (Direction.NORTH, Direction.SOUTH): + yield dir + else: + yield from (Direction.NORTH, Direction.SOUTH) + case self.HORIZONTAL_SPLITTER: + if dir in (Direction.EAST, Direction.WEST): + yield dir + else: + yield from (Direction.EAST, Direction.WEST) + + +class TileMap(NamedTuple): + tiles: dict[Point, Tile] + lines: int + rows: int + + def in_bounds(self, pos: Point) -> bool: + x, y = pos + if x < 0 or x >= self.lines: + return False + if y < 0 or y >= self.rows: + return False + return True + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> TileMap: + res: dict[Point, Tile] = {} + + for x, line in enumerate(input): + for y, c in enumerate(line): + res[Point(x, y)] = Tile(c) + + return TileMap(res, len(input), len(input[0])) + + def compute_energy(map: TileMap) -> int: + queue: deque[tuple[Point, Direction]] = deque([(Point(0, 0), Direction.EAST)]) + seen: set[tuple[Point, Direction]] = set() + energized: set[Point] = set() + + while queue: + point, dir = queue.popleft() + if (point, dir) in seen: + continue + seen.add((point, dir)) + energized.add(point) + for new_dir in map.tiles[point].apply(dir): + new_pos = new_dir.apply(point) + if not map.in_bounds(new_pos): + continue + queue.append((new_pos, new_dir)) + + return len(energized) + + map = parse(input) + return compute_energy(map) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From d5bf9f3c9fab5f4b06c1f0567881fa007719368f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 16 Dec 2023 11:12:54 +0000 Subject: [PATCH 440/479] 2023: d16: ex2: add input --- 2023/d16/ex2/input | 110 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 2023/d16/ex2/input diff --git a/2023/d16/ex2/input b/2023/d16/ex2/input new file mode 100644 index 0000000..2b0a13f --- /dev/null +++ b/2023/d16/ex2/input @@ -0,0 +1,110 @@ +\..|...................|........\..............\.................-......./........./...\..........-......./... +........../...-/......\.|............../.................\...........\........-.........|.....\.-.|........... +...............-...........|......|...|......../.......\............../.................................../... +..................................|............../..|.|.../............./..\\........|...|..............\..|.. +...........................-...-...-.......................-.....-.-....\.......-............................/ +........-...|.......|./../......................./.........................\.................../.....\........ +\..\............-.\.........|../................................\....\......................./.............-.. +|\...|....\................\...|........\-..............|............\.........\.\..|.|....................... +.....\.........\......|...-...............................-.............-../.../..--......\.....\............. +................|...........................|..........\...........././.................../............../.... +.............................\......\.../..|................---................-......\....|...-............-. +..........|........./......\|...|.......|........\......\....-....\...-...../................/..-..../......-. +...|............./.................\../....|...\../.................|...|..|......|........................... +..................................-......../.....|............................................................ +...................-.............|...-.........../...........................-..............-...............|. +..-.............../.............................-......-.....-.............|-...../....................../.... +....||...../.........................................-...........................................--./-.......\ +...................\..........-......./..............|\........................../.-.|..............-..-/...|. +.-............-............../..-........../.......................\...-...||........./.-.....-....../........ +.......-.......-........................................../\\.......|......./../..\........\..-.........../../ +....../../.......................\.........\-....\.|..................\......................./...-\.......... +\.......-........\...-.....................\....-........./-...|......|.......-........................\...\.. +...|\.................................../..../..........|......-......../-..|......./..........\../..|......-\ +..........\...........................|..-........-/-......../....|...............................\.....|..... +..............\......-............................-.../........|........................./........-........... +.............-..\.//.....................-....-......|....../....-............................/..............| +\........../....|................./.....\......\.../.................|........\............../................ +.....-........-/|.........\.....-./............|...\.|......|.......|...................\\.....\.............- +................|.-...-.....................|..........-....\....\......../...............................././ +...........|.......\..............\......................................./........-.......................... +...........................-..../............|............................|...........\....................... +....................|..........|..................../...........\.....|.........-............\.\...-..\....... +................................-......-......\.....-/......\...\................/................-........... +..|.....\..\......|../....................................................\\......-...../..../..............// +.........\.................\..\..-.-..................\.....\..\.....\..........-............................. +...................\............/..\............|.............../..\............................|\.\...../.... +......|...............\.......|......|/........|....-.......|...........-.../.\....\.....|./.......|.......... +....\/|................-.-..........|.................../..............|../-...|/..........|.................. +..|........./-\.............|...|............|......\...................\..../.........|...............|.-.... +...................-................\....|/....-...|......./....../..........-|............/......\../..\\.... +...........................-..........................................-...|.|................\../...........-. +......../.....|.........-.......|........./-............|../.......|......-.-.-.......................-..|-... +.........|-...............|............./.....|........../..|........\..........|/.............../-........... +...\.....|..|...........\....-...\/.........................................|...................\......-.-.... +.../...-...|.............|.....\...|.................................../..............\.................../... +..........-.........../....|.....|..-.........../.................................-..................\....\/.. +....../..............\../......../.....-./....|../.\....-.................../............................../.\ +......-.|..........................\...............|.......-...-....../.............//...\|................/.. +................/.........|........................|......./..|......../-...........................\....|.... +........../...|.........\...........-./......\\...........\......|-......|...\...............\................ +../.........................|.................-/...........--.........\.../........................\.........\ +........\..|...|.............../...................-.........|.................\..|......./.........-.....-|.. +\.../.......|.............|-.../.................\...\..........\...|..........\....../......-................ +............|.|....\..--............-/-..................../........................-../..\..-................ +.....................................|.................../.................................|..../..-......\... +....|..............|..-.....|../.........................................|........\.................|......... +..............\..|...............\....||........../................................\................./.\...... +.....................-../......./....../.................................-............\........../............ +.....|.............../......-.\.|........-...................|.....-........\...-.............-....-.......-.. +..../.....|..............\../..............................\........|....................|..............\..... +....\................-........\../......|..../......................-.....|............../.../........../..... +....-...........................-.............|...........\..|........|.......\././.....|./..........\........ +/....................\..............\.............................-......................../\......../....-... +......\..................-............................................./.\...../.............\....-....\.\.... +..................................\-............................/.......|........................-|........... +.................../.../.......|./............\.........\....-.-....-../\.........|........./...\............. +......./.../....|...../|......................|.....|.....|.........|...........\......-.\..................|. +..././...........................|.......\.|......-........./................................................. +........|.|.......................-....................././.......||...........|/....-....\.......|......\/... +.\.\.....|....\......-....|...|.....//........|..-.........-.................-........./...................... +.|.....................\............-.................................|..../.............-....../.........../. +.|..\..../...............\..................../...\............................-....../................../.|.. +./.\............................/.............-...../-................\.........\.............|...../......... +..........\...............................\............../.........\.....-/........./|........................ +.............\..|....|..................................\.........|./......................\.........-........ +../.....|-............|...\................|...-....-........./........|.-..........\......................... +........-............./...........--................../...............................|..|.\....\............. +\.............-\.........................-|......|/.........\............/...........-.../.\........\..\.../.. +......................|........\....-../.............|......|.-...................................-|../...-... +.............|...|.....-...........|.....-...............|...\........................./..\....\.............. +..............|.............-.........../....-..................................|......./........|............ +...........|.-..../......................................\....-...\-......../........-..........-......-.....| +../...........-............-.../|...........-.-.............\.............................|.............-..... +.........../...-............../........./...................................../......-.......\\............... +........................./.||......|...../.......|....|..................-..........|......\.................. +............/....-./..-...........|...-..........\....../...\/.......|\.....\....|........../..\.\............ +.......................................-.../.......|............|........|...\..........\.....-............... +/..\|.............-...-.................................\........\...................\......|....-............ +..................\............../........................./.........|..........\...\......\..........|......| +.../.................................................../...|............../....\...\...../........|.......-... +..................-.-..........................\.................-......................-..\.........-........ +...................../\.....\.............\.............../................\.|............../........./....... +....................|../.\./......................................-.../.......\............................... +|........................-..............................................|...............................-..... +....\.\...........\......|.........\/|..|....|.....\............-...../.............................\\........ +......\....|......\|.....-..................\........\.......................-............-.|..............|.. +....|.....././.......................|......../...........-.|............./......-.|....../.....\......|....\. +.........\........|.......\..........|........./..................\.........................|................- +.....\..........\.....-......../...|-........../...\/|........................................................ +.../.....................\../.........\.|.........-..........\...............................|...............\ +.........-...........................................-.|...........\......//............../..|.\............/. +.-|../...../.........|............./..........................|..-.\......\............\................../... +../....../.................|..............\.........|.\......\...../.......\............\./.......|....../..\. +......../.-..-......\.........................\|...................................-....../................... +......................-....|........./\................|......\..-\....../.......\.................\/.-\...... +............\...|...............|............./...........................................\....-.-............ +\.........|.............................|............/.........-.....\........\|...-..-..\/.../......./....... +.............................\.|...............\....\..\-.....................\......-...../......\..../.....\ +..\-......\.\........-........../........\...............\..................../....-....\.\.|.|............... +................|./........../.................................-.............|...................\............ From 2869e9684167785415fa5959da5c2825c2b4b828 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 16 Dec 2023 11:13:00 +0000 Subject: [PATCH 441/479] 2023: d16: ex2: add solution --- 2023/d16/ex2/ex2.py | 126 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100755 2023/d16/ex2/ex2.py diff --git a/2023/d16/ex2/ex2.py b/2023/d16/ex2/ex2.py new file mode 100755 index 0000000..3587197 --- /dev/null +++ b/2023/d16/ex2/ex2.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python + +import sys +from collections import deque +from collections.abc import Iterator +from enum import Enum, StrEnum +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class Direction(Enum): + NORTH = Point(-1, 0) + SOUTH = Point(1, 0) + EAST = Point(0, 1) + WEST = Point(0, -1) + + def apply(self, pos: Point) -> Point: + dx, dy = self.value + return Point(pos.x + dx, pos.y + dy) + + +class Tile(StrEnum): + EMPTY = "." + MIRROR = "/" + ANTI_MIRROR = "\\" + VERTICAL_SPLITTER = "|" + HORIZONTAL_SPLITTER = "-" + + def apply(self, dir: Direction) -> Iterator[Direction]: + match self: + case self.EMPTY: + yield dir + case self.MIRROR: + directions = { + Direction.EAST: Direction.NORTH, + Direction.NORTH: Direction.EAST, + Direction.WEST: Direction.SOUTH, + Direction.SOUTH: Direction.WEST, + } + yield directions[dir] + case self.ANTI_MIRROR: + directions = { + Direction.WEST: Direction.NORTH, + Direction.NORTH: Direction.WEST, + Direction.EAST: Direction.SOUTH, + Direction.SOUTH: Direction.EAST, + } + yield directions[dir] + case self.VERTICAL_SPLITTER: + if dir in (Direction.NORTH, Direction.SOUTH): + yield dir + else: + yield from (Direction.NORTH, Direction.SOUTH) + case self.HORIZONTAL_SPLITTER: + if dir in (Direction.EAST, Direction.WEST): + yield dir + else: + yield from (Direction.EAST, Direction.WEST) + + +class TileMap(NamedTuple): + tiles: dict[Point, Tile] + lines: int + rows: int + + def in_bounds(self, pos: Point) -> bool: + x, y = pos + if x < 0 or x >= self.lines: + return False + if y < 0 or y >= self.rows: + return False + return True + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> TileMap: + res: dict[Point, Tile] = {} + + for x, line in enumerate(input): + for y, c in enumerate(line): + res[Point(x, y)] = Tile(c) + + return TileMap(res, len(input), len(input[0])) + + def compute_energy(map: TileMap, init: tuple[Point, Direction]) -> int: + queue: deque[tuple[Point, Direction]] = deque([init]) + seen: set[tuple[Point, Direction]] = set() + energized: set[Point] = set() + + while queue: + point, dir = queue.popleft() + if (point, dir) in seen: + continue + seen.add((point, dir)) + energized.add(point) + for new_dir in map.tiles[point].apply(dir): + new_pos = new_dir.apply(point) + if not map.in_bounds(new_pos): + continue + queue.append((new_pos, new_dir)) + + return len(energized) + + def compute_inits(map: TileMap) -> Iterator[tuple[Point, Direction]]: + for x in range(map.lines): + yield (Point(x, 0), Direction.EAST) + yield (Point(x, map.rows - 1), Direction.WEST) + for y in range(map.rows): + yield (Point(0, y), Direction.SOUTH) + yield (Point(map.lines - 1, y), Direction.NORTH) + + map = parse(input) + return max(compute_energy(map, init) for init in compute_inits(map)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 1adbc956ac90e55e16f4a6463ec4bd1573a68b7d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 17 Dec 2023 11:59:10 +0000 Subject: [PATCH 442/479] 2023: d17: ex1: add input --- 2023/d17/ex1/input | 141 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 2023/d17/ex1/input diff --git a/2023/d17/ex1/input b/2023/d17/ex1/input new file mode 100644 index 0000000..01feceb --- /dev/null +++ b/2023/d17/ex1/input @@ -0,0 +1,141 @@ +332114151454212113454214512653223255653145556624424154456133366132437365465536664121621126441346245234461242215311265554234431413125424232423 +424122453313324434224115136213521634564424342426236222533671444755341166437735256274463642146521245445525564224535224235252421321153331414212 +413135332143231235543411242346121246426526353322253563266165247116731545675123735113725356164644235243456435165362223324541111145554434255422 +342414155321154351141122633651163361322521331431171711732775134466255552673716661246145621631741136461146333345323514452212522243423331243533 +233122133123434345314435544645431134453126541174227715665316662211115137412561563227455475361474445363563152111331443163553513522255241544413 +311155314135534244231531535261532514433556673217725631772737642444271655435143741351644364131521776726224131145423362141264421135213424444312 +125223544215111353343424155256123365154351463763766674147324253115775277444764475616636627512777314123411653155251461135612231241532431443541 +154322542255554251655461341623214513115361722221264336433413737164732151366715314571755667734463471347653566243234254154662144543222435244125 +252325122542331561151545613663525144424744652635577332743277337361111426356754123713326313135767754125231545141233212414322652635242142211243 +454455312142515231552161246536164222446676131324746654761237342662724443133775752352417235142551513416366647642554343645133342433313112223215 +211321313544336425166555444645646314661414271372414365632613313465526437351145461333343753254644114475234636422562331151621222261343242132553 +333323312524514633125345124531441435312467416662235315752745412217643724364731152373347747421417475252352125265161445435134163426142233353211 +143415113132116416143626162231614424513725134766666676741241522865823673657635526716525717332247166312254667317151665462144364126645223552411 +123334222542663461264564446667515346467312356331546413675457588884644474545872866632331424544647524462746756437435461546521636115321425325224 +535345333562155134222145436426256733221166524375121367788836878623525623827363242436426285231274677542316742253627612345624461262345554521442 +513513214555346252356533625326334371762344355253554747668642823328845258872476637478333343444741446277731137761242516643141361443236463232215 +314525145346116555121632636161213754311442177643444555582648638323545372736247584882637437532357337727176314174617322351326335323111115424155 +142332123435235625634363646646665357435316213755777836867244734747572768533477723538834633673282641347553626573276175764552564465454441435441 +115211236413132455511236635577446251412725323837876686385477828546337857552852634472863357843565343753573547723431623543642234642413143151542 +344114335565255663416177255247156565162253555737563755723446262582337484754524764236238872364836885463427235157556711172742232315152424214355 +322351245444122231555251374126727321177145723432388575878262785645433733687626542747657328463363325266561117334673213464515334316451252323323 +114145243212231145266145633211575313262368663374456836668225838276887736247478522334345632464286642377734773245555273715255363521255411436125 +455425264555563656334547167127221744428428767672557672528634562733434744234767632378343637854563773843778372227556167732575433414361653661645 +523515321446441335631614642677743527678465286472244872478426436773365258245445623486253654722483532674422763615327372421556232261315262663663 +243531332212553542512231776744326572857225588676323528368528574588687496986977437666235744834528878678885244665767573623253644364166116254113 +444444112522431332452677416112527782362277632366487625237276747897354943947465889953376837548526737743346528781622556466746677544446126242133 +551224351455343155254473223427545326426283637545435543486459335566488585644794556748393635283844433672572582847247363644233223765612263324266 +624512252531155611465764114412153772872664238382223677844796388487978588349347899373747553577834454374823787527861133444621766341566356141365 +122513321515254337477661465512352573543734686234338559996944463795463356755575964934753954988266763385387234286423462633175673633153162556456 +536631433532656576652771312522342646633782573233279989744885775639388386544597879884345946975725737282827242738352524521432253763215654523115 +322242133611462672545617461568524454733756842479444543488449547487568897468683955886935535694896858528355443457358667243642313225326142635412 +433165134443115323655412565336574774363263823339637755748738478844753443366543756864599667497478638535364437368324232432351147613376615461324 +255546365535224352467626565444446263832366733855339686844454779545954833997374664863737346696795866578234664656443247566163775227133522126211 +332543346224456342457145637872588878872574934465846438696585998768959393446858386444585949749989395845243437522874257474667424163321432143662 +562336531135536464571531445325786432525654973537497993963876555849853689467557948538984566573893374699522258566835263827361447616765121531241 +134431331273426633773265462863548226445269397663747657533667545839948559886569784664389446348545683389848688445244623781735357464754775332441 +455514441477666641215728225436682865472376638684673865686537967585959697777945778763958683986999446946735832744256768434443442331647672323162 +642551661752757431115132444368754488566587583899343636597956846969766697666696549958595334986455854649598564858883536552667547462457766361136 +523135446552147326745727437763658824294779583474959943837486894449889786848545858986984945998848759695488574225628248774221513366313255152244 +662142534574774471476733285584773353469368338384693894458894844555764768998647478459784635737579344766346566445772776385244757261641646262231 +426164675347223367356542678766487676449383835573944385678679999588547686484865465688679958436853663379986545474734678688476311743671535264562 +636221515617411216247337338427225735479885464746489395486445598697885986665448699866884656794474879996386956934725254526364324475256241275663 +631655547723135622724356638578268487796375786548339985946895559755594954857979446575876457888866863986588685442687887862434325557242465434334 +526561675234753571754873872743282697865877868743798687568577798587569899574484554484486596454938697634387879836757377864647232634674626657136 +224367751471353647528352332475353678438596388378986467455448887646465576695666985755458794657464949967358875375525855268833747673643621712113 +555155247624263644685247526382749435467889975896454465589895886678995785898565848957859844445874878643778658535937624565377735216144455146652 +326237275165115664286248564635235597494984939548556988958465866659979766684556496568777489668689659466945846453722248242466764614544772336545 +252431512527441277652682654526537378589387973677795869974677788748496486946677468975449899885555473979374748343648488332525562346344443772553 +334445255752755383853263265588439634448596738474455889458598988975979996868859879877898797766766846958879864596965328638267846232745551326455 +331776676677775667763658323247548647473346994464947655845774859797686965997669898985478769844957676563749678677496544457376882437561732771415 +524166432536425482552537234634638489648635668489984866757588557998759988879759786984579576979588678858478864969749575527756262527122755635643 +621727645151575887576234428334879934367558864978956787976575789687695598659778579995684454959976779569644787946544773527367553271175577267671 +146536267557111863546535476546756933855578657694848587666677867759855877966869976666895795977754986464958576833534434856257276637677672374622 +627162456571435862223277266645437845769458457477859464885659565779885987687868765787589649788985577888968356376393555423832745685215266467517 +356365425561522443354482823779863564644867657899958444967567857769895796968885877556985858769679467875486466963448536675724876383637637347332 +662617714433245736446788383839477478955657876855994484679589576895957757596689789878757698854677478674545986936783367487553578825131414257161 +332752445446138652863525378663559896379746684495687998757655759676957899686977876787997889474577748675663489587853377638443448848132472112131 +453742717451167763344725476499465974694977569678544576559869769779787858777859878659995587547699787885775974835467735257544662734254664167234 +637433522225172664387548695933565599774766649475487879985879567866859778897575697897755575969866878866559366585534438655344868386256513661571 +546147626464562275655733897739395889457894577877799798775969558887665695975589685557965565588684599794655433543949864872227536744356275446534 +466362637642348545833267889637543575568589757869745856956895658665988768997999655989667957999546697465848679934687374434356755244437463163527 +432241752456735627523255338945585453647447657554545955769795789789997877986787567985578897759678944769468657795794576536268322838744716172531 +362335524521283767267868233894954334695664994778485687755666859567896666877777856977986957755786769546887535444947538736628443346847462743523 +242277366552744663233252489644883664499486849778665576798778978997766697987689796855857957659765978885748744987558355833587345887644235437312 +561476674157528347537548599693576474885768577976886585698957697776687879979969876766765577555667674874858777897543556687327834848556466137735 +266443423617535645753445779387753884547464964579665696566776797688777799889668699855885667595966647668866856763675976465687353888681336245316 +572245756261228737774356774434644334465597956478659678566557786678987687767797677855856669659856465546998943449649767856528226362754511645257 +765454637722232528732727987873694678786897686957758658776958776876669697776896797985686878577656659767548457559453559953286436834721254612345 +715574444332523722776764939533778537899944495848987975789655786679777697866668686698596879975965745866774945968874839792274752686441541427615 +345426643746658264878244879834877886854849486559776688568989799999769977869688867896566869679855957757568478643556858683764734437851357452275 +155264155457638423874255465346979399784764447766558558566789767877968796988868867775556888798564684589499477496386865936552684743662561437775 +556553777462428352772346536564948445645848965477587585797665668668998889899669897695759889687557667557584743537744477835564286662643223525755 +641634624577764727436225779978964774555745645897796877559888677666767998968896788888689868597664985685858554356376665498623746875723662152372 +273464717234862288588878479738499968679778769844967858766886688999898688976778797877666987697667878994996657354955977482446733867376656676652 +551452257437387582588858645358387357746754779495965859595599878879877987668898767897997855656868855556757747486357487665847763562466422346611 +563771242132683432222557436749937783648584568946588665665565698788787787998889676985866968796874695585557699853673538872377582853855131713461 +621754271237543666875247946859748999855959977745986585788867866697696868789869768995576776679784564654855987787897358797454368778485716675345 +164557236272472546822232846668399389759849987667659785676559867986867888878979688978688695876854496969468763957695738688223564746777531171265 +242346713471432688725345548968585493977887799777998877589665998798978979687788866756996567759999475865446943768859868732555538748467434116221 +724542325744422353827368477965435394957587656594657956589558869678779879978997989779557567777576965957979596983484379373273827325462765413315 +134467152455573564745453678895499973399455464974855888996756898968898666769686667565559598686586858797879648838954569323385654838463315425344 +677644725227283525233274374448443847867587946496756687655559798668967889678966568857686688687474797656795664978587359585475743444537567171372 +336331514454173343536876798555466989966569868897467756888959675759587897868888779865575958968754759769695636436637498444722662454277255276665 +245372163442533628423276455934688944899667958898697795685589868988659597757695978985568755897588876768955385979973858688872756554467423674135 +251472373172465268687323637558467886966997454586679595656555799786788685987977899567657589878679656758649535738838795357634278627632741221151 +165461424121142643385468264846788537647578965477849879999585588788675566556988859776968656866748767857679947367996538366526226283326214137262 +552347532473355256876326459866563676749894796886745598856867798578859675999778699689958599985994868557485944545796355254658552388764762637577 +411635777264744624762842767953597944883658696686489566856859985666787779576968666779658795444747587477754964887759644474728635835454465116123 +525225774221277357825768273779533699948575746956759694897959969678678956879656896656877599855484649666456453586543836385766273838732235171565 +413446335411722332567467583938598777437966488478684886785797667899976899669555696776775778568978567578544555855646936463366758257267556526367 +232225126611437885288888224674796768654898896446868958777899786966689959778798898557578584894674968778348499974537656632752837285262221612562 +312524227137512563356783624765555493696544874684948745994767775568987755855875779575947858745547754676685368397837548474384853754524257634625 +164576266612155222885335524447458943676659664764845487449595699877699967897599959997454474895848957865889443963557382768878244863267411634354 +343423173533275137862288876573755898763474747556889894445589898998965697755557969845649449784567454999596856689395535336738467324251433443313 +324642722572242663573535885523747435878468838854477747966756946868979567855589567654976484995966698365838477364437873477732253364252715313424 +633536551523473523243244283326385679995773658874569756469784895788454454466967676647864944477548686957835935734344472886742338655365237743545 +126254446714213213436657334784236857866388445465965986588698754599946596568588549887968594867664769467935498667776266236524482164321464331744 +632122261674245423458774627724266986994837445876996574698444995879887876557659858469744965457586679894948948458686783436673327143364537263243 +465244311333114323725266442638884838436463333596776867596749549964879559765764848754756989656759354743483867679752528468865454711412437437215 +261415356334624227658332247423732949399345845987468987484698858676956555788758758658656776848894849855333685652263222425756836554766646272443 +521646365566326414152826643636235965753596433593485485995795654765798865954954774954854696879635646973347786334722533446758821117733417454123 +252365462474552424777626563728632557857897556978697654768788568859684765969498588674456548639599966588966387644635645878744172627175772722511 +322111677544534553154787663277355446646868855664534468569956798568597597797985774677475959647634668749666469868462232582736411761171527151611 +612342244172321553733876453434327274768778644399663358375677775959999689866565698576678735898955879849469468533635274885381342774377452254623 +651234151461371123426165832588863365476947993573539948648464444454868478568755779686456634875633856784657866623534635827356542713775643236154 +426422164365351275264187473582686768433977556986656756547883959898696745877867456753466554348833684967659438745566626826373666115341437512356 +251224616536545656545722482674755228883867595576787346349774537744798879665975566954395436673954998843688762228354424347472522235531376331326 +335541164543114144761463764542372366287647948934896437773435546559497746964557357657989773374388363578827574482885664583611615165136533323225 +261331415374732264655453647768254758542843666899665464693864936867468988485548354636569486458753866966873563534677586636515154572216163145356 +313232345646561617413414322476366687653335889569688478593764445835478384478864579889578586636387865692637456447655326361775525421537351443252 +354422624313221353436553153273228525734583687565383399578579988847365867834335367495554595854533343462877332872884662534165677211161214245532 +542143423513624235434762263462784556783874775748777548864766786566666483439848384735573868946946858786326267558486871376536352777136111223641 +563426221453513247534322123144884253486238658666956647949649676497797648994455393587476533436988875438823554657527344561756544414561541432165 +142324116651521772664345223478653548388638657544743867958975353393743498698444676463749436355523368338437534752654673372352117774565612455142 +521252364664151234171376543732684442243322874775475946689463578554843486635378489996373438934348323722334326883767125435113461472456453544434 +366456342146455776343221412213427758323428237676455365546898955778897855479458369598384867528536647227825337245572327613615476534655616364436 +456262313325465615634626471552134825254874668258282367564793649864648953456359464348433437556572444858443732283547165236722572136426516552255 +215214555215121531363153365156745726838285476672588458468636756485794378474346453448633724336222848523788322461363427143622643764542154516631 +445435243132162412737127746252357518384582434632727743323776457988789744747556744546232245626842323687453554237454472415624653454464312353566 +413512155566552553344114742623626673426573822753222774627337845846626888678573728525426326742682452368847826463175721614615753615514521215131 +121335422224363443354722134157661571538463676346636753673773667735542264247284835668253673727235386467366265255634467667311151641335353324222 +124223214542653663566665314176475124517877488374766545574687862278742556456474375457627645727273436443464373242226321257155151623466354226535 +224342321546661552253517421437534637164144462465386448554748656436426565223525648357863358822784435247243523427371615216772115551454466464444 +152151341446215313532274524113276662527567472536387628785437566568247675623344644462557726773438776443134255637564367716346225361466131111152 +441131264554242642424433222772464422143526743636387232724335464526838833628275276362774824878543373332675711255316334646112165166145436225355 +222223346255612511131365546422132224534414716137367462626727462537235434658525224753354265433542656353255435456465556334646626646616114541252 +122254524154564644355156315711257331373433572663242435353634872647446868386788243424223288834522715673434774222724734714143326426614126132222 +512124425315656654512332445376341167415722616144652756353244273445678654828624424884532254424714514364625764637237362662611534611466615252341 +144321153255241633164514444655277754717616621362745215268637475632553485326364864874882263216537664313267663452313553535362633636242154324325 +215522151121146641113121366265573756214663745551174365226877835824533746627332877664426625513336257243467577673364646532514644421421452544444 +335313335414162252122432222633336424453112573546364534773326574784656537542222587263555442637622533151434567664221616224322511431465543243151 +554515254153443453616316365142667412367456471655714423572426445365634244714461517246763535321157222422452237455335224412113513116341541551245 +242342552224414663454122443156612324424462742634773552556733543127575614737735454524176471342351442215257671354234543465566226442453421214332 +423332221231152525435143325351441332245166165545746441225161776522365226425741716113757265346324464231517554455663426161163531133151125441514 +424112342444153352442235323533255342273475361517511641775633616543162217257766644611574212127347362451473365646541415632262325644422215452323 +535123215132355441452363223224326111142177116662677154564514756736116151566423375123522315721736346462721611643433515643226113553235433255245 +224211552121124334331251616112654554353552524371574216334214517671732613731631733667464726623341735667366531311523356541525225553551524513511 +133135253512342521415314125243161342522122244673535175332435771431335676512526131661651773762677772541211631242452526663421451534253432541324 +332331532553424153415425566412652656345152461311365447431514137764335267535631223555617762772366325564623566653643641356522511155115525413323 +124122513322542451532212635122623231342565341643435327641416177253251451471617514752111736553524423266211413554453514154155451335251224234321 +114322223311332542521324344432242254215112631121532433351616521421133465333644152516113467545556154614445514451441162115222213523543445151233 From 0e237d6752e5c804580852ea9475d9c2605f03e4 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 17 Dec 2023 11:59:15 +0000 Subject: [PATCH 443/479] 2023: d17: ex1: add solution --- 2023/d17/ex1/ex1.py | 101 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100755 2023/d17/ex1/ex1.py diff --git a/2023/d17/ex1/ex1.py b/2023/d17/ex1/ex1.py new file mode 100755 index 0000000..69750e7 --- /dev/null +++ b/2023/d17/ex1/ex1.py @@ -0,0 +1,101 @@ +#!/usr/bin/env python + +import functools +import heapq +import itertools +import sys +from collections.abc import Iterator +from enum import Enum +from types import NotImplementedType +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +@functools.total_ordering +class Direction(Enum): + NORTH = Point(-1, 0) + SOUTH = Point(1, 0) + EAST = Point(0, 1) + WEST = Point(0, -1) + + def apply(self, pos: Point) -> Point: + dx, dy = self.value + return Point(pos.x + dx, pos.y + dy) + + def __le__(self, other: object) -> bool | NotImplementedType: + if not isinstance(other, Direction): + return NotImplemented + return self.value <= other.value + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> dict[Point, int]: + res: dict[Point, int] = {} + + for x, line in enumerate(input): + for y, c in enumerate(line): + res[Point(x, y)] = int(c) + + return res + + def possible_directions( + dir: Direction, in_a_row: int + ) -> Iterator[tuple[Direction, int]]: + if in_a_row < 3: + yield dir, in_a_row + 1 + DIRECTIONS = { + Direction.NORTH: (Direction.EAST, Direction.WEST), + Direction.SOUTH: (Direction.EAST, Direction.WEST), + Direction.WEST: (Direction.NORTH, Direction.SOUTH), + Direction.EAST: (Direction.NORTH, Direction.SOUTH), + } + yield from zip(DIRECTIONS[dir], itertools.repeat(1)) + + def minimal_path(map: dict[Point, int], start: Point, end: Point) -> int: + class PathNode(NamedTuple): + pos: Point + dir: Direction + in_a_row: int + + QueueNode = tuple[int, PathNode] + + # Start with arbitrary south direction with *0* in a row, to get correct neighbours + queue: list[QueueNode] = [(0, PathNode(start, Direction.SOUTH, 0))] + seen: set[PathNode] = set() + + while queue: + dist, node = heapq.heappop(queue) + if node.pos == end: + return dist + # If we've already seen that exact node before, don't look at it again + if node in seen: + continue + # First time encountering those node conditions, record it + seen.add(node) + for dir, in_a_row in possible_directions(node.dir, node.in_a_row): + new_pos = dir.apply(node.pos) + if new_pos not in map: + continue + new_dist = dist + map[new_pos] + new_node = PathNode(new_pos, dir, in_a_row) + heapq.heappush(queue, (new_dist, new_node)) + + assert False # Sanity check + + map = parse(input) + start = Point(0, 0) + end = Point(len(input) - 1, len(input[0]) - 1) + return minimal_path(map, start, end) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From faf382cb446295a545c8e5431e8ba90c697b013b Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 17 Dec 2023 11:59:21 +0000 Subject: [PATCH 444/479] 2023: d17: ex2: add input --- 2023/d17/ex2/input | 141 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 2023/d17/ex2/input diff --git a/2023/d17/ex2/input b/2023/d17/ex2/input new file mode 100644 index 0000000..01feceb --- /dev/null +++ b/2023/d17/ex2/input @@ -0,0 +1,141 @@ +332114151454212113454214512653223255653145556624424154456133366132437365465536664121621126441346245234461242215311265554234431413125424232423 +424122453313324434224115136213521634564424342426236222533671444755341166437735256274463642146521245445525564224535224235252421321153331414212 +413135332143231235543411242346121246426526353322253563266165247116731545675123735113725356164644235243456435165362223324541111145554434255422 +342414155321154351141122633651163361322521331431171711732775134466255552673716661246145621631741136461146333345323514452212522243423331243533 +233122133123434345314435544645431134453126541174227715665316662211115137412561563227455475361474445363563152111331443163553513522255241544413 +311155314135534244231531535261532514433556673217725631772737642444271655435143741351644364131521776726224131145423362141264421135213424444312 +125223544215111353343424155256123365154351463763766674147324253115775277444764475616636627512777314123411653155251461135612231241532431443541 +154322542255554251655461341623214513115361722221264336433413737164732151366715314571755667734463471347653566243234254154662144543222435244125 +252325122542331561151545613663525144424744652635577332743277337361111426356754123713326313135767754125231545141233212414322652635242142211243 +454455312142515231552161246536164222446676131324746654761237342662724443133775752352417235142551513416366647642554343645133342433313112223215 +211321313544336425166555444645646314661414271372414365632613313465526437351145461333343753254644114475234636422562331151621222261343242132553 +333323312524514633125345124531441435312467416662235315752745412217643724364731152373347747421417475252352125265161445435134163426142233353211 +143415113132116416143626162231614424513725134766666676741241522865823673657635526716525717332247166312254667317151665462144364126645223552411 +123334222542663461264564446667515346467312356331546413675457588884644474545872866632331424544647524462746756437435461546521636115321425325224 +535345333562155134222145436426256733221166524375121367788836878623525623827363242436426285231274677542316742253627612345624461262345554521442 +513513214555346252356533625326334371762344355253554747668642823328845258872476637478333343444741446277731137761242516643141361443236463232215 +314525145346116555121632636161213754311442177643444555582648638323545372736247584882637437532357337727176314174617322351326335323111115424155 +142332123435235625634363646646665357435316213755777836867244734747572768533477723538834633673282641347553626573276175764552564465454441435441 +115211236413132455511236635577446251412725323837876686385477828546337857552852634472863357843565343753573547723431623543642234642413143151542 +344114335565255663416177255247156565162253555737563755723446262582337484754524764236238872364836885463427235157556711172742232315152424214355 +322351245444122231555251374126727321177145723432388575878262785645433733687626542747657328463363325266561117334673213464515334316451252323323 +114145243212231145266145633211575313262368663374456836668225838276887736247478522334345632464286642377734773245555273715255363521255411436125 +455425264555563656334547167127221744428428767672557672528634562733434744234767632378343637854563773843778372227556167732575433414361653661645 +523515321446441335631614642677743527678465286472244872478426436773365258245445623486253654722483532674422763615327372421556232261315262663663 +243531332212553542512231776744326572857225588676323528368528574588687496986977437666235744834528878678885244665767573623253644364166116254113 +444444112522431332452677416112527782362277632366487625237276747897354943947465889953376837548526737743346528781622556466746677544446126242133 +551224351455343155254473223427545326426283637545435543486459335566488585644794556748393635283844433672572582847247363644233223765612263324266 +624512252531155611465764114412153772872664238382223677844796388487978588349347899373747553577834454374823787527861133444621766341566356141365 +122513321515254337477661465512352573543734686234338559996944463795463356755575964934753954988266763385387234286423462633175673633153162556456 +536631433532656576652771312522342646633782573233279989744885775639388386544597879884345946975725737282827242738352524521432253763215654523115 +322242133611462672545617461568524454733756842479444543488449547487568897468683955886935535694896858528355443457358667243642313225326142635412 +433165134443115323655412565336574774363263823339637755748738478844753443366543756864599667497478638535364437368324232432351147613376615461324 +255546365535224352467626565444446263832366733855339686844454779545954833997374664863737346696795866578234664656443247566163775227133522126211 +332543346224456342457145637872588878872574934465846438696585998768959393446858386444585949749989395845243437522874257474667424163321432143662 +562336531135536464571531445325786432525654973537497993963876555849853689467557948538984566573893374699522258566835263827361447616765121531241 +134431331273426633773265462863548226445269397663747657533667545839948559886569784664389446348545683389848688445244623781735357464754775332441 +455514441477666641215728225436682865472376638684673865686537967585959697777945778763958683986999446946735832744256768434443442331647672323162 +642551661752757431115132444368754488566587583899343636597956846969766697666696549958595334986455854649598564858883536552667547462457766361136 +523135446552147326745727437763658824294779583474959943837486894449889786848545858986984945998848759695488574225628248774221513366313255152244 +662142534574774471476733285584773353469368338384693894458894844555764768998647478459784635737579344766346566445772776385244757261641646262231 +426164675347223367356542678766487676449383835573944385678679999588547686484865465688679958436853663379986545474734678688476311743671535264562 +636221515617411216247337338427225735479885464746489395486445598697885986665448699866884656794474879996386956934725254526364324475256241275663 +631655547723135622724356638578268487796375786548339985946895559755594954857979446575876457888866863986588685442687887862434325557242465434334 +526561675234753571754873872743282697865877868743798687568577798587569899574484554484486596454938697634387879836757377864647232634674626657136 +224367751471353647528352332475353678438596388378986467455448887646465576695666985755458794657464949967358875375525855268833747673643621712113 +555155247624263644685247526382749435467889975896454465589895886678995785898565848957859844445874878643778658535937624565377735216144455146652 +326237275165115664286248564635235597494984939548556988958465866659979766684556496568777489668689659466945846453722248242466764614544772336545 +252431512527441277652682654526537378589387973677795869974677788748496486946677468975449899885555473979374748343648488332525562346344443772553 +334445255752755383853263265588439634448596738474455889458598988975979996868859879877898797766766846958879864596965328638267846232745551326455 +331776676677775667763658323247548647473346994464947655845774859797686965997669898985478769844957676563749678677496544457376882437561732771415 +524166432536425482552537234634638489648635668489984866757588557998759988879759786984579576979588678858478864969749575527756262527122755635643 +621727645151575887576234428334879934367558864978956787976575789687695598659778579995684454959976779569644787946544773527367553271175577267671 +146536267557111863546535476546756933855578657694848587666677867759855877966869976666895795977754986464958576833534434856257276637677672374622 +627162456571435862223277266645437845769458457477859464885659565779885987687868765787589649788985577888968356376393555423832745685215266467517 +356365425561522443354482823779863564644867657899958444967567857769895796968885877556985858769679467875486466963448536675724876383637637347332 +662617714433245736446788383839477478955657876855994484679589576895957757596689789878757698854677478674545986936783367487553578825131414257161 +332752445446138652863525378663559896379746684495687998757655759676957899686977876787997889474577748675663489587853377638443448848132472112131 +453742717451167763344725476499465974694977569678544576559869769779787858777859878659995587547699787885775974835467735257544662734254664167234 +637433522225172664387548695933565599774766649475487879985879567866859778897575697897755575969866878866559366585534438655344868386256513661571 +546147626464562275655733897739395889457894577877799798775969558887665695975589685557965565588684599794655433543949864872227536744356275446534 +466362637642348545833267889637543575568589757869745856956895658665988768997999655989667957999546697465848679934687374434356755244437463163527 +432241752456735627523255338945585453647447657554545955769795789789997877986787567985578897759678944769468657795794576536268322838744716172531 +362335524521283767267868233894954334695664994778485687755666859567896666877777856977986957755786769546887535444947538736628443346847462743523 +242277366552744663233252489644883664499486849778665576798778978997766697987689796855857957659765978885748744987558355833587345887644235437312 +561476674157528347537548599693576474885768577976886585698957697776687879979969876766765577555667674874858777897543556687327834848556466137735 +266443423617535645753445779387753884547464964579665696566776797688777799889668699855885667595966647668866856763675976465687353888681336245316 +572245756261228737774356774434644334465597956478659678566557786678987687767797677855856669659856465546998943449649767856528226362754511645257 +765454637722232528732727987873694678786897686957758658776958776876669697776896797985686878577656659767548457559453559953286436834721254612345 +715574444332523722776764939533778537899944495848987975789655786679777697866668686698596879975965745866774945968874839792274752686441541427615 +345426643746658264878244879834877886854849486559776688568989799999769977869688867896566869679855957757568478643556858683764734437851357452275 +155264155457638423874255465346979399784764447766558558566789767877968796988868867775556888798564684589499477496386865936552684743662561437775 +556553777462428352772346536564948445645848965477587585797665668668998889899669897695759889687557667557584743537744477835564286662643223525755 +641634624577764727436225779978964774555745645897796877559888677666767998968896788888689868597664985685858554356376665498623746875723662152372 +273464717234862288588878479738499968679778769844967858766886688999898688976778797877666987697667878994996657354955977482446733867376656676652 +551452257437387582588858645358387357746754779495965859595599878879877987668898767897997855656868855556757747486357487665847763562466422346611 +563771242132683432222557436749937783648584568946588665665565698788787787998889676985866968796874695585557699853673538872377582853855131713461 +621754271237543666875247946859748999855959977745986585788867866697696868789869768995576776679784564654855987787897358797454368778485716675345 +164557236272472546822232846668399389759849987667659785676559867986867888878979688978688695876854496969468763957695738688223564746777531171265 +242346713471432688725345548968585493977887799777998877589665998798978979687788866756996567759999475865446943768859868732555538748467434116221 +724542325744422353827368477965435394957587656594657956589558869678779879978997989779557567777576965957979596983484379373273827325462765413315 +134467152455573564745453678895499973399455464974855888996756898968898666769686667565559598686586858797879648838954569323385654838463315425344 +677644725227283525233274374448443847867587946496756687655559798668967889678966568857686688687474797656795664978587359585475743444537567171372 +336331514454173343536876798555466989966569868897467756888959675759587897868888779865575958968754759769695636436637498444722662454277255276665 +245372163442533628423276455934688944899667958898697795685589868988659597757695978985568755897588876768955385979973858688872756554467423674135 +251472373172465268687323637558467886966997454586679595656555799786788685987977899567657589878679656758649535738838795357634278627632741221151 +165461424121142643385468264846788537647578965477849879999585588788675566556988859776968656866748767857679947367996538366526226283326214137262 +552347532473355256876326459866563676749894796886745598856867798578859675999778699689958599985994868557485944545796355254658552388764762637577 +411635777264744624762842767953597944883658696686489566856859985666787779576968666779658795444747587477754964887759644474728635835454465116123 +525225774221277357825768273779533699948575746956759694897959969678678956879656896656877599855484649666456453586543836385766273838732235171565 +413446335411722332567467583938598777437966488478684886785797667899976899669555696776775778568978567578544555855646936463366758257267556526367 +232225126611437885288888224674796768654898896446868958777899786966689959778798898557578584894674968778348499974537656632752837285262221612562 +312524227137512563356783624765555493696544874684948745994767775568987755855875779575947858745547754676685368397837548474384853754524257634625 +164576266612155222885335524447458943676659664764845487449595699877699967897599959997454474895848957865889443963557382768878244863267411634354 +343423173533275137862288876573755898763474747556889894445589898998965697755557969845649449784567454999596856689395535336738467324251433443313 +324642722572242663573535885523747435878468838854477747966756946868979567855589567654976484995966698365838477364437873477732253364252715313424 +633536551523473523243244283326385679995773658874569756469784895788454454466967676647864944477548686957835935734344472886742338655365237743545 +126254446714213213436657334784236857866388445465965986588698754599946596568588549887968594867664769467935498667776266236524482164321464331744 +632122261674245423458774627724266986994837445876996574698444995879887876557659858469744965457586679894948948458686783436673327143364537263243 +465244311333114323725266442638884838436463333596776867596749549964879559765764848754756989656759354743483867679752528468865454711412437437215 +261415356334624227658332247423732949399345845987468987484698858676956555788758758658656776848894849855333685652263222425756836554766646272443 +521646365566326414152826643636235965753596433593485485995795654765798865954954774954854696879635646973347786334722533446758821117733417454123 +252365462474552424777626563728632557857897556978697654768788568859684765969498588674456548639599966588966387644635645878744172627175772722511 +322111677544534553154787663277355446646868855664534468569956798568597597797985774677475959647634668749666469868462232582736411761171527151611 +612342244172321553733876453434327274768778644399663358375677775959999689866565698576678735898955879849469468533635274885381342774377452254623 +651234151461371123426165832588863365476947993573539948648464444454868478568755779686456634875633856784657866623534635827356542713775643236154 +426422164365351275264187473582686768433977556986656756547883959898696745877867456753466554348833684967659438745566626826373666115341437512356 +251224616536545656545722482674755228883867595576787346349774537744798879665975566954395436673954998843688762228354424347472522235531376331326 +335541164543114144761463764542372366287647948934896437773435546559497746964557357657989773374388363578827574482885664583611615165136533323225 +261331415374732264655453647768254758542843666899665464693864936867468988485548354636569486458753866966873563534677586636515154572216163145356 +313232345646561617413414322476366687653335889569688478593764445835478384478864579889578586636387865692637456447655326361775525421537351443252 +354422624313221353436553153273228525734583687565383399578579988847365867834335367495554595854533343462877332872884662534165677211161214245532 +542143423513624235434762263462784556783874775748777548864766786566666483439848384735573868946946858786326267558486871376536352777136111223641 +563426221453513247534322123144884253486238658666956647949649676497797648994455393587476533436988875438823554657527344561756544414561541432165 +142324116651521772664345223478653548388638657544743867958975353393743498698444676463749436355523368338437534752654673372352117774565612455142 +521252364664151234171376543732684442243322874775475946689463578554843486635378489996373438934348323722334326883767125435113461472456453544434 +366456342146455776343221412213427758323428237676455365546898955778897855479458369598384867528536647227825337245572327613615476534655616364436 +456262313325465615634626471552134825254874668258282367564793649864648953456359464348433437556572444858443732283547165236722572136426516552255 +215214555215121531363153365156745726838285476672588458468636756485794378474346453448633724336222848523788322461363427143622643764542154516631 +445435243132162412737127746252357518384582434632727743323776457988789744747556744546232245626842323687453554237454472415624653454464312353566 +413512155566552553344114742623626673426573822753222774627337845846626888678573728525426326742682452368847826463175721614615753615514521215131 +121335422224363443354722134157661571538463676346636753673773667735542264247284835668253673727235386467366265255634467667311151641335353324222 +124223214542653663566665314176475124517877488374766545574687862278742556456474375457627645727273436443464373242226321257155151623466354226535 +224342321546661552253517421437534637164144462465386448554748656436426565223525648357863358822784435247243523427371615216772115551454466464444 +152151341446215313532274524113276662527567472536387628785437566568247675623344644462557726773438776443134255637564367716346225361466131111152 +441131264554242642424433222772464422143526743636387232724335464526838833628275276362774824878543373332675711255316334646112165166145436225355 +222223346255612511131365546422132224534414716137367462626727462537235434658525224753354265433542656353255435456465556334646626646616114541252 +122254524154564644355156315711257331373433572663242435353634872647446868386788243424223288834522715673434774222724734714143326426614126132222 +512124425315656654512332445376341167415722616144652756353244273445678654828624424884532254424714514364625764637237362662611534611466615252341 +144321153255241633164514444655277754717616621362745215268637475632553485326364864874882263216537664313267663452313553535362633636242154324325 +215522151121146641113121366265573756214663745551174365226877835824533746627332877664426625513336257243467577673364646532514644421421452544444 +335313335414162252122432222633336424453112573546364534773326574784656537542222587263555442637622533151434567664221616224322511431465543243151 +554515254153443453616316365142667412367456471655714423572426445365634244714461517246763535321157222422452237455335224412113513116341541551245 +242342552224414663454122443156612324424462742634773552556733543127575614737735454524176471342351442215257671354234543465566226442453421214332 +423332221231152525435143325351441332245166165545746441225161776522365226425741716113757265346324464231517554455663426161163531133151125441514 +424112342444153352442235323533255342273475361517511641775633616543162217257766644611574212127347362451473365646541415632262325644422215452323 +535123215132355441452363223224326111142177116662677154564514756736116151566423375123522315721736346462721611643433515643226113553235433255245 +224211552121124334331251616112654554353552524371574216334214517671732613731631733667464726623341735667366531311523356541525225553551524513511 +133135253512342521415314125243161342522122244673535175332435771431335676512526131661651773762677772541211631242452526663421451534253432541324 +332331532553424153415425566412652656345152461311365447431514137764335267535631223555617762772366325564623566653643641356522511155115525413323 +124122513322542451532212635122623231342565341643435327641416177253251451471617514752111736553524423266211413554453514154155451335251224234321 +114322223311332542521324344432242254215112631121532433351616521421133465333644152516113467545556154614445514451441162115222213523543445151233 From 7bbf3d026131dd28db15157d0ae39bf985a19ca0 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 17 Dec 2023 11:59:26 +0000 Subject: [PATCH 445/479] 2023: d17: ex2: add solution --- 2023/d17/ex2/ex2.py | 109 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100755 2023/d17/ex2/ex2.py diff --git a/2023/d17/ex2/ex2.py b/2023/d17/ex2/ex2.py new file mode 100755 index 0000000..f4cfc6e --- /dev/null +++ b/2023/d17/ex2/ex2.py @@ -0,0 +1,109 @@ +#!/usr/bin/env python + +import functools +import heapq +import sys +from collections.abc import Iterator +from enum import Enum +from types import NotImplementedType +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +@functools.total_ordering +class Direction(Enum): + NORTH = Point(-1, 0) + SOUTH = Point(1, 0) + EAST = Point(0, 1) + WEST = Point(0, -1) + + def apply(self, pos: Point) -> Point: + dx, dy = self.value + return Point(pos.x + dx, pos.y + dy) + + def __le__(self, other: object) -> bool | NotImplementedType: + if not isinstance(other, Direction): + return NotImplemented + return self.value <= other.value + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> dict[Point, int]: + res: dict[Point, int] = {} + + for x, line in enumerate(input): + for y, c in enumerate(line): + res[Point(x, y)] = int(c) + + return res + + def possible_directions( + pos: Point, dir: Direction, in_a_row: int, map: dict[Point, int] + ) -> Iterator[tuple[Direction, int]]: + if in_a_row < 10: + yield dir, in_a_row + 1 + DIRECTIONS = { + Direction.NORTH: (Direction.EAST, Direction.WEST), + Direction.SOUTH: (Direction.EAST, Direction.WEST), + Direction.WEST: (Direction.NORTH, Direction.SOUTH), + Direction.EAST: (Direction.NORTH, Direction.SOUTH), + } + if in_a_row >= 4: + for new_dir in DIRECTIONS[dir]: + dx, dy = new_dir.value + # Crucible must be able to travel 4 blocks in that direction + if Point(pos.x + 4 * dx, pos.y + 4 * dy) not in map: + continue + yield new_dir, 1 + + def minimal_path(map: dict[Point, int], start: Point, end: Point) -> int: + class PathNode(NamedTuple): + pos: Point + dir: Direction + in_a_row: int + + QueueNode = tuple[int, PathNode] + + # Start with arbitrary all directions with *0* in a row, to get correct neighbours + queue: list[QueueNode] = [ + (0, PathNode(start, Direction.SOUTH, 0)), + (0, PathNode(start, Direction.EAST, 0)), + ] + seen: set[PathNode] = set() + + while queue: + dist, node = heapq.heappop(queue) + if node.pos == end: + return dist + # If we've already seen that exact node before, don't look at it again + if node in seen: + continue + # First time encountering those node conditions, record it + seen.add(node) + for dir, in_a_row in possible_directions(*node, map): + new_pos = dir.apply(node.pos) + if new_pos not in map: + continue + new_dist = dist + map[new_pos] + new_node = PathNode(new_pos, dir, in_a_row) + heapq.heappush(queue, (new_dist, new_node)) + + assert False # Sanity check + + map = parse(input) + start = Point(0, 0) + end = Point(len(input) - 1, len(input[0]) - 1) + return minimal_path(map, start, end) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From bfe11a50f7d56d0aef63ad9b56f12e0ed012a973 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 18 Dec 2023 08:02:53 +0000 Subject: [PATCH 446/479] 2023: d18: ex1: add input --- 2023/d18/ex1/input | 794 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 794 insertions(+) create mode 100644 2023/d18/ex1/input diff --git a/2023/d18/ex1/input b/2023/d18/ex1/input new file mode 100644 index 0000000..6bee4c1 --- /dev/null +++ b/2023/d18/ex1/input @@ -0,0 +1,794 @@ +R 4 (#4b18e0) +U 4 (#0b4f93) +R 4 (#6d70b0) +U 12 (#86edc3) +R 4 (#435460) +U 3 (#07f023) +R 8 (#33dd00) +U 5 (#599aa3) +L 11 (#83c702) +U 5 (#3f0501) +L 7 (#4bf232) +U 9 (#3f0503) +L 2 (#4955d2) +U 5 (#24f2e3) +L 9 (#16abf2) +U 6 (#60f753) +L 3 (#678dd2) +U 3 (#736093) +L 3 (#007482) +D 7 (#446e11) +L 6 (#0482a2) +D 8 (#997fd1) +L 4 (#4891e2) +D 6 (#2547b1) +L 5 (#501bf2) +D 8 (#7ed033) +L 8 (#0dabe2) +U 8 (#7184d3) +L 2 (#748a42) +U 5 (#12e093) +L 7 (#672432) +D 7 (#19c6a3) +L 4 (#1c5c22) +D 2 (#6e8a23) +L 10 (#5cd602) +U 9 (#1d8ff3) +L 7 (#359ce2) +U 6 (#333143) +R 11 (#0422f2) +D 10 (#235323) +R 6 (#64bc72) +U 10 (#6ea5f3) +R 11 (#68df60) +U 10 (#0952c3) +L 4 (#5206d2) +U 6 (#09c2a3) +L 5 (#45f7e0) +U 6 (#6d15e3) +L 6 (#271740) +D 6 (#6d15e1) +L 7 (#2e6a20) +U 9 (#178883) +L 9 (#430370) +U 4 (#2ee7e3) +L 7 (#8bdcf0) +D 9 (#5cebd3) +L 3 (#3d5a50) +D 4 (#5ecc23) +L 8 (#095b52) +U 9 (#3b7121) +L 10 (#8061b2) +U 4 (#3b7123) +L 7 (#209272) +U 4 (#493833) +L 9 (#7d9b02) +U 5 (#283633) +L 3 (#0db702) +U 3 (#437d73) +L 14 (#721282) +U 4 (#059a63) +L 2 (#4630d2) +U 5 (#6c5f43) +L 13 (#2949c2) +U 3 (#590a93) +R 5 (#4f5650) +U 5 (#71c3e3) +L 8 (#308540) +D 15 (#4fbc53) +L 2 (#4fa760) +U 15 (#41d523) +L 8 (#6bd380) +U 6 (#5cb553) +R 6 (#76acc0) +U 10 (#6be3a3) +R 6 (#5d61b0) +D 10 (#6dd101) +R 4 (#04f600) +U 4 (#4ea101) +R 2 (#6c2630) +U 5 (#498ac1) +R 5 (#0667a0) +U 5 (#120ef3) +R 3 (#31c080) +U 5 (#861cd3) +R 11 (#364e90) +D 5 (#6dd103) +R 9 (#6fe5b0) +D 11 (#119d43) +R 6 (#111310) +D 14 (#2ff323) +R 7 (#177432) +U 12 (#0ccbd3) +R 2 (#77c592) +U 9 (#6eee43) +R 10 (#21e622) +U 8 (#0bc513) +L 8 (#5398a0) +U 2 (#53cca3) +L 10 (#463c20) +U 5 (#53cca1) +R 8 (#174b20) +U 11 (#09ddc3) +R 6 (#20c940) +U 11 (#2fc6c3) +R 8 (#7ab1b0) +U 6 (#7ab291) +R 3 (#057160) +U 6 (#008331) +R 11 (#62c440) +U 12 (#3233a1) +R 2 (#1ceaa0) +U 4 (#4ef663) +R 3 (#7e5670) +U 2 (#4ef661) +R 5 (#3ccc40) +U 8 (#6e3531) +L 13 (#3964a0) +U 5 (#68b801) +R 13 (#83d220) +U 5 (#459901) +R 2 (#053a70) +U 6 (#4d18d3) +R 11 (#8a23d0) +U 8 (#4d18d1) +R 9 (#2cce90) +D 14 (#48af61) +L 6 (#045500) +D 6 (#0b4971) +L 8 (#18fa70) +D 7 (#7d8d03) +L 3 (#6ba530) +D 9 (#061783) +R 9 (#2c9c30) +D 13 (#402993) +R 8 (#18e9c0) +D 7 (#51e7a3) +R 15 (#18e9c2) +D 3 (#0ae133) +R 5 (#4929f0) +D 3 (#8d4623) +R 4 (#277680) +U 11 (#034583) +R 7 (#1ea1a0) +D 11 (#6cc5e3) +R 8 (#8894e0) +U 5 (#2fc6c1) +R 6 (#4dd6d0) +U 3 (#7f5b21) +R 11 (#219440) +U 4 (#2db8a1) +R 6 (#4053a0) +U 6 (#2df7e1) +R 12 (#086710) +U 8 (#47c7c1) +R 4 (#41ee90) +U 3 (#1dfa61) +R 3 (#5c3610) +U 7 (#483023) +R 10 (#2b6060) +D 3 (#327133) +R 8 (#2e4b30) +D 14 (#212321) +R 8 (#4bfd00) +D 5 (#5f0b81) +R 4 (#718450) +D 14 (#320dd1) +R 5 (#103630) +D 6 (#911953) +R 4 (#3f6190) +D 7 (#212323) +L 4 (#7f84b0) +D 10 (#2816a1) +R 5 (#026f80) +D 2 (#528ab1) +R 8 (#04e160) +D 11 (#655ca3) +R 2 (#0a1bf0) +D 3 (#6872c3) +R 12 (#7ad510) +D 8 (#72fe63) +R 7 (#109a50) +D 9 (#66ae31) +R 3 (#0828a2) +D 12 (#039eb1) +R 8 (#6f2c60) +D 6 (#46dae1) +R 12 (#76c900) +D 8 (#724711) +L 10 (#0a41a0) +D 8 (#73f301) +L 2 (#029092) +D 5 (#2ee5b3) +R 9 (#794702) +U 9 (#2ee5b1) +R 9 (#745f72) +U 2 (#108e61) +R 4 (#30e792) +U 10 (#099281) +R 11 (#347f32) +U 4 (#319ab1) +L 5 (#44a712) +U 9 (#623681) +L 6 (#3b5002) +U 10 (#25e431) +R 6 (#4f3f22) +U 4 (#226f51) +R 5 (#26f7b2) +U 8 (#588341) +R 4 (#09de02) +D 11 (#423f21) +L 6 (#6c9ee2) +D 10 (#423f23) +R 6 (#3badf2) +D 4 (#2c0a93) +R 4 (#521a32) +U 7 (#4ee803) +R 15 (#47f6d2) +U 2 (#673651) +R 4 (#5c10b2) +U 9 (#4dc641) +L 11 (#4d7032) +U 6 (#299111) +L 8 (#8d06b2) +U 8 (#22e4d1) +L 7 (#7dac02) +U 4 (#58e171) +L 7 (#17e332) +D 12 (#211931) +L 4 (#7e1732) +D 5 (#502911) +L 4 (#88c6c2) +D 5 (#430ba1) +L 3 (#3e4de0) +D 13 (#481b11) +L 5 (#5925e0) +U 4 (#1cecb1) +L 7 (#11ecf0) +U 7 (#634bc1) +R 7 (#6218d2) +U 7 (#7990f3) +L 5 (#576b42) +U 4 (#7990f1) +L 10 (#145832) +U 9 (#609ef1) +L 3 (#0d8822) +U 4 (#2b1f83) +L 3 (#77a562) +U 5 (#2b1f81) +L 6 (#3d05c2) +U 7 (#4b56d1) +L 5 (#1f6272) +U 8 (#916891) +R 6 (#087ce0) +U 6 (#2cf203) +R 12 (#285e60) +U 9 (#6ae623) +R 9 (#8a34a0) +U 9 (#6ae621) +L 9 (#15b200) +U 11 (#40c541) +R 5 (#0c7fc0) +D 7 (#2d5ad3) +R 9 (#42f280) +D 7 (#8140a3) +R 3 (#255770) +D 10 (#8140a1) +R 12 (#4ac260) +D 5 (#2d5ad1) +R 8 (#083780) +U 15 (#40c543) +R 7 (#028ab0) +U 13 (#2cf201) +R 5 (#1461d0) +U 2 (#23bff1) +R 4 (#1a4992) +U 3 (#355fc1) +R 7 (#6cafd2) +U 5 (#355fc3) +R 6 (#226752) +D 6 (#5af021) +R 11 (#526e82) +D 6 (#055ac1) +R 4 (#460a42) +D 3 (#055ac3) +R 6 (#565542) +D 3 (#3cd6a1) +L 7 (#2da922) +D 10 (#708ea3) +R 7 (#687472) +D 4 (#4ec333) +R 4 (#58d602) +U 7 (#4dd3e3) +R 3 (#23a7c0) +U 10 (#51fa83) +R 5 (#23a7c2) +D 5 (#188363) +R 14 (#5bc432) +U 4 (#3f0d23) +R 8 (#27a940) +U 3 (#62a3a3) +R 10 (#27a942) +U 6 (#0ceab3) +R 2 (#4479c2) +U 12 (#8beb63) +L 2 (#0b84a2) +U 3 (#3aa313) +L 7 (#270672) +U 15 (#4bd563) +L 5 (#4d8072) +U 6 (#045183) +R 12 (#08fed2) +U 11 (#52d323) +R 2 (#050992) +U 9 (#618533) +R 4 (#17a282) +D 7 (#08e921) +R 3 (#1a0d22) +D 6 (#0e8541) +R 11 (#61b232) +D 7 (#6635f1) +R 5 (#617832) +D 5 (#08f4f3) +R 2 (#490c22) +D 3 (#234821) +R 3 (#476942) +D 12 (#234823) +R 11 (#31b6d2) +D 4 (#08f4f1) +L 6 (#129582) +D 6 (#507ed1) +R 6 (#1e7010) +D 8 (#5490e1) +R 10 (#093bb0) +D 4 (#7cefc1) +R 9 (#6fe430) +D 3 (#0160b1) +L 8 (#1a8570) +D 2 (#2722f3) +L 4 (#2eb860) +D 12 (#572d83) +L 7 (#556c20) +U 12 (#50d5c1) +L 6 (#3a0932) +D 3 (#0a1701) +L 6 (#2294f0) +D 4 (#5f04e1) +L 13 (#62c590) +D 7 (#5f04e3) +R 6 (#1660e0) +D 2 (#34e001) +R 6 (#23b340) +D 12 (#1e92e1) +R 6 (#786d10) +U 12 (#44f8d1) +R 4 (#786d12) +D 3 (#3f6cf1) +R 3 (#2e2812) +D 3 (#185ac3) +R 3 (#7976e2) +D 14 (#0a5201) +R 4 (#15e3e2) +D 3 (#825221) +R 3 (#699e12) +U 3 (#8ca423) +R 14 (#04ffb2) +U 3 (#185ac1) +R 2 (#0a3482) +U 4 (#59d541) +L 10 (#5b8ab2) +U 4 (#59d543) +L 6 (#395af2) +U 3 (#2fdcb1) +R 7 (#1d5670) +U 3 (#3801c1) +R 6 (#65de30) +U 7 (#522db1) +R 11 (#9a9020) +U 12 (#382413) +R 11 (#55b6c0) +U 8 (#382411) +L 4 (#4549e0) +U 7 (#2f1091) +L 7 (#127550) +U 7 (#3e2ee1) +R 7 (#1b7ba0) +U 5 (#0177e1) +L 10 (#581e30) +U 4 (#0177e3) +L 8 (#287b30) +U 5 (#4667a1) +R 6 (#3a6730) +U 6 (#7575e1) +R 6 (#4d8f90) +U 8 (#06a251) +R 2 (#32a980) +U 5 (#92bbf3) +R 3 (#465200) +D 4 (#1e82a3) +R 7 (#5e49b0) +U 4 (#282471) +R 6 (#95ba62) +U 3 (#3fc1e1) +R 3 (#95ba60) +U 9 (#495841) +R 3 (#3bece0) +D 13 (#06a253) +R 3 (#58ed10) +D 4 (#3c4df3) +R 7 (#830800) +D 10 (#3c4df1) +R 4 (#39bca0) +D 4 (#0e26a1) +R 6 (#09cd40) +D 6 (#725971) +R 10 (#624800) +D 11 (#49ae11) +R 11 (#3ed060) +D 7 (#49ae13) +L 12 (#3e0b20) +D 4 (#569191) +L 3 (#1bb070) +D 7 (#0b1803) +L 10 (#045fa0) +U 6 (#8cb0a3) +L 7 (#57ca40) +D 6 (#146f43) +L 9 (#5ad0b0) +D 3 (#22f873) +R 10 (#249e42) +D 5 (#429003) +R 11 (#35bf52) +D 7 (#162bc1) +R 7 (#5689a2) +D 10 (#162bc3) +R 12 (#286a32) +D 9 (#54b443) +R 10 (#505c32) +D 3 (#831903) +R 7 (#003ab0) +D 11 (#6a9af3) +R 10 (#39f710) +U 11 (#1f31b3) +R 5 (#6fc5c0) +D 4 (#071b73) +R 7 (#3fe110) +D 9 (#5fd6e3) +R 9 (#3fd500) +D 3 (#2fc9b3) +R 6 (#727a40) +D 7 (#531d23) +R 14 (#02afc0) +D 6 (#1e5cb1) +R 4 (#717490) +D 12 (#6efba1) +R 11 (#5996f0) +U 5 (#763861) +L 5 (#444cf0) +U 8 (#763863) +R 7 (#2e2c60) +U 7 (#543fa1) +L 7 (#95e230) +U 3 (#543fa3) +R 5 (#41fd20) +U 3 (#19bf61) +R 5 (#656540) +D 7 (#391283) +R 4 (#33ebc0) +D 13 (#391281) +R 9 (#709320) +D 6 (#498291) +R 3 (#03c942) +D 6 (#3391a1) +R 6 (#5a83e2) +D 5 (#4eaff1) +R 7 (#2ca112) +D 4 (#2de1c1) +L 6 (#8724f0) +D 9 (#4b7fc1) +L 5 (#005232) +U 9 (#322291) +L 7 (#6a7682) +D 4 (#5d2381) +L 5 (#6e5312) +U 13 (#5d2383) +L 8 (#4a5e52) +D 13 (#61a5a1) +L 3 (#2adb12) +D 6 (#1056e3) +L 3 (#74eb12) +U 10 (#1056e1) +L 12 (#4c3122) +D 9 (#02d251) +R 9 (#30a702) +D 7 (#7cd9f1) +R 10 (#56a522) +D 6 (#25e4f1) +R 7 (#720682) +D 3 (#11a711) +R 10 (#4810c0) +U 9 (#7233d1) +R 13 (#47d8b0) +D 5 (#222c51) +R 6 (#270630) +U 9 (#6c2991) +R 5 (#251ce0) +D 9 (#0ce373) +R 5 (#0f3af0) +D 4 (#234033) +L 13 (#399410) +D 3 (#1091f3) +L 11 (#12ab92) +D 3 (#2c05c3) +L 9 (#53cc00) +D 5 (#662eb3) +R 3 (#53cc02) +D 3 (#19fbf3) +R 8 (#12ab90) +D 11 (#13a3c3) +R 10 (#6b7ed0) +D 7 (#480071) +L 10 (#39ba10) +D 12 (#414181) +L 11 (#6be3c0) +D 4 (#308403) +L 4 (#5081d2) +U 3 (#4a1c33) +L 6 (#412360) +U 11 (#5cad03) +L 4 (#412362) +U 11 (#1670a3) +L 8 (#5081d0) +U 7 (#36b3f3) +L 8 (#4a86c0) +D 7 (#1903f1) +L 11 (#5aa690) +U 9 (#88cd01) +L 3 (#3843d0) +U 14 (#4c44d1) +L 8 (#92ea62) +D 5 (#205b31) +L 14 (#2d2130) +D 4 (#1600d1) +L 2 (#5eed20) +D 8 (#504601) +L 9 (#4238f2) +D 10 (#8a3821) +L 3 (#524dd2) +D 6 (#8a3823) +L 3 (#106f82) +U 8 (#3d0d81) +L 6 (#1ec032) +U 6 (#040993) +L 4 (#1ff1d2) +D 14 (#17b973) +L 3 (#3c2ae2) +D 7 (#7c2501) +L 7 (#633cd2) +D 4 (#6530d3) +L 3 (#082de2) +D 7 (#16f433) +L 13 (#89eb52) +D 5 (#17b971) +L 3 (#252512) +U 15 (#040991) +L 2 (#90d092) +U 10 (#0a1021) +L 8 (#1cd900) +U 6 (#4a13d1) +R 10 (#7a6bf2) +U 4 (#4683c1) +R 7 (#7a6bf0) +D 11 (#3a66f1) +R 8 (#488f20) +U 11 (#7135a1) +R 5 (#4cc380) +U 5 (#0bf121) +R 3 (#4c2e80) +U 2 (#7908a1) +R 3 (#259e00) +U 10 (#6bafe3) +L 5 (#52e6d0) +U 4 (#506603) +L 6 (#1fec10) +D 7 (#3a1983) +R 6 (#389e30) +D 2 (#2f7281) +L 6 (#55f170) +D 7 (#4cb8e1) +L 5 (#389e30) +U 6 (#2642e1) +L 10 (#7394e0) +U 3 (#642bf1) +R 10 (#7394e2) +U 7 (#132c01) +L 6 (#3c4a80) +D 4 (#3e4d21) +L 4 (#989ad0) +U 7 (#473211) +L 8 (#0aa900) +D 6 (#3a8a11) +L 12 (#4307a2) +D 9 (#13b0c1) +L 6 (#7e59a2) +D 11 (#00a041) +L 3 (#44b0d2) +D 6 (#0efc51) +L 6 (#8a1302) +D 9 (#160fa1) +L 4 (#4afa62) +D 2 (#68e871) +L 14 (#5ecd60) +D 5 (#6a51d1) +L 5 (#764000) +D 8 (#1a6d61) +L 4 (#713042) +D 14 (#0b92e1) +L 5 (#5b77e2) +D 3 (#0a0581) +R 10 (#212752) +D 3 (#0a0583) +R 14 (#3f0ca2) +D 8 (#13d911) +R 3 (#307832) +D 4 (#72d201) +R 6 (#133522) +U 13 (#6e4581) +R 4 (#70fe22) +D 13 (#082221) +R 7 (#44fff2) +D 4 (#731171) +R 3 (#10eda2) +D 9 (#0e5d31) +L 14 (#37bc32) +D 6 (#3852c3) +L 7 (#5f43c2) +U 13 (#8c7593) +L 9 (#2ff4f2) +U 10 (#1787b3) +L 13 (#68b4a2) +U 3 (#15fd23) +L 3 (#515622) +U 3 (#618313) +L 11 (#2d09d2) +U 10 (#6bb2f3) +L 5 (#1f22a2) +U 10 (#4d8e33) +L 6 (#1cb690) +U 3 (#09c3b3) +L 9 (#214c20) +U 9 (#5bfe23) +L 9 (#848910) +U 10 (#1a73e3) +L 10 (#3d9252) +U 3 (#089003) +R 11 (#7ddbb2) +U 8 (#20c473) +R 15 (#071dc2) +U 7 (#554823) +R 13 (#0cfb42) +U 7 (#1ccaa1) +L 15 (#847822) +U 8 (#5f0271) +L 4 (#03cdd2) +U 10 (#4f69b1) +L 3 (#4b1902) +U 8 (#8129b1) +L 4 (#5e69f2) +D 5 (#1f33b3) +L 5 (#2e2582) +D 13 (#67aea3) +L 4 (#54aba2) +U 3 (#08d7a3) +L 4 (#4eebe0) +D 8 (#030763) +L 9 (#2d4760) +D 14 (#79e223) +L 9 (#7c3342) +D 3 (#334c93) +L 4 (#2b0202) +D 9 (#04d053) +L 2 (#1475a2) +D 7 (#8aed93) +L 8 (#62b4f2) +D 5 (#14c931) +R 11 (#29bc82) +D 3 (#65a951) +R 12 (#656f62) +D 3 (#7a7283) +L 8 (#2bec52) +D 7 (#1a75a3) +L 8 (#988402) +D 4 (#1a75a1) +L 3 (#1aad22) +D 9 (#373923) +L 10 (#7e3ef0) +U 7 (#3e1c93) +L 11 (#3f89d0) +U 6 (#3e1c91) +L 3 (#652e40) +D 9 (#35acc3) +L 7 (#5b0fa0) +U 4 (#46ca63) +L 10 (#079fa0) +U 7 (#391523) +L 3 (#079fa2) +U 3 (#585573) +L 8 (#1f43e0) +D 2 (#403c21) +L 9 (#144b10) +D 5 (#8fa921) +L 5 (#144b12) +U 7 (#084fb1) +L 4 (#661600) +D 6 (#5e06f3) +L 13 (#3f87a0) +D 8 (#3ca8a1) +L 13 (#4214e0) +D 10 (#567b51) +R 4 (#7a3080) +D 8 (#17de11) +R 8 (#644090) +D 12 (#55ba83) +R 3 (#025e60) +D 8 (#554783) +R 6 (#0d2eb0) +D 10 (#552813) +L 6 (#61a7d0) +D 10 (#272cb3) +L 7 (#34d6a0) +D 3 (#36cf03) +R 11 (#14be00) +D 3 (#52b543) +R 4 (#1fa362) +D 11 (#713693) +L 3 (#652112) +D 8 (#5c8463) +L 12 (#4c1362) +D 4 (#66e201) +L 8 (#07caa2) +D 9 (#6ccbd1) +L 3 (#3b9ee2) +D 5 (#5798b1) +L 13 (#4fb342) +U 6 (#231223) +L 2 (#33e3b2) +U 5 (#022ea3) +L 6 (#3f1112) +U 6 (#3dde83) +L 6 (#2732a0) +U 8 (#1e6bc3) +L 8 (#10f4e0) +U 15 (#45e363) +L 3 (#10f4e2) +U 4 (#4c9523) +R 11 (#2732a2) +U 12 (#174303) +L 10 (#5b4532) +U 13 (#6195e1) +L 8 (#7fab60) +U 2 (#1e7dd1) +L 2 (#7fab62) +U 12 (#4da741) +L 4 (#09efc2) +D 5 (#3d0d83) +L 5 (#47d532) +U 6 (#1f7441) +L 12 (#558832) +D 6 (#24e093) +L 4 (#20bfc2) +U 6 (#606283) +L 11 (#639142) +U 2 (#854311) +L 5 (#318ff2) +D 8 (#7037c1) +L 12 (#1ee752) +U 5 (#6bad43) +L 5 (#662cd2) +U 6 (#23fec3) +L 6 (#11cec2) +U 9 (#0c5b23) +L 8 (#91c052) +U 3 (#62e783) +L 6 (#08ee02) +U 11 (#11a283) From ce0bfe769fa2fbc2e5cf3aa8ab49db7a58d541fe Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 18 Dec 2023 08:02:58 +0000 Subject: [PATCH 447/479] 2023: d18: ex1: add solution --- 2023/d18/ex1/ex1.py | 89 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100755 2023/d18/ex1/ex1.py diff --git a/2023/d18/ex1/ex1.py b/2023/d18/ex1/ex1.py new file mode 100755 index 0000000..be11cb2 --- /dev/null +++ b/2023/d18/ex1/ex1.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +import itertools +import sys +from enum import StrEnum +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class Direction(StrEnum): + UP = "U" + DOWN = "D" + LEFT = "L" + RIGHT = "R" + + def apply(self, pos: Point, n: int = 1) -> Point: + DIRECTIONS = { + "U": Point(-1, 0), + "D": Point(1, 0), + "L": Point(0, -1), + "R": Point(0, 1), + } + dx, dy = DIRECTIONS[self.value] + return Point(pos.x + dx * n, pos.y + dy * n) + + +DigPlanStep = tuple[Direction, int] +DigPlan = list[DigPlanStep] + + +def solve(input: list[str]) -> int: + def parse_line(line: str) -> DigPlanStep: + dir, n, _ = line.split() + return Direction(dir), int(n) + + def parse(input: list[str]) -> DigPlan: + return list(map(parse_line, input)) + + def dig_trench(plan: DigPlan) -> list[Point]: + points = [Point(0, 0)] + + for direction, n in plan: + points.append(direction.apply(points[-1], n)) + # The trench should loop back to the start, make sure we don't count it twice + if points[-1] == Point(0, 0): + del points[-1] + + return points + + def lagoon_volume(trench: list[Point]) -> int: + def shoelace_area(points: list[Point]) -> int: + # Must be integer because pipes follow the grid, and can't cut squares in half + return abs( + sum( + (points[i - 1].x * points[i].y) - (points[i].x * points[i - 1].y) + for i in range(len(points)) + ) + // 2 + ) + + def perimeter(points: list[Point]) -> int: + res = 0 + + for p, n in itertools.pairwise(itertools.chain(points, [points[0]])): + res += abs(n.x - p.x) + abs(n.y - p.y) + + return res + + area = shoelace_area(trench) + trench_points = perimeter(trench) + interior_points = area - trench_points // 2 + 1 + return interior_points + trench_points + + plan = parse(input) + trench = dig_trench(plan) + return lagoon_volume(list(trench)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From b806f8dc395ea10e90883c65ecf66270fc493a76 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 18 Dec 2023 08:03:06 +0000 Subject: [PATCH 448/479] 2023: d18: ex2: add input --- 2023/d18/ex2/input | 794 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 794 insertions(+) create mode 100644 2023/d18/ex2/input diff --git a/2023/d18/ex2/input b/2023/d18/ex2/input new file mode 100644 index 0000000..6bee4c1 --- /dev/null +++ b/2023/d18/ex2/input @@ -0,0 +1,794 @@ +R 4 (#4b18e0) +U 4 (#0b4f93) +R 4 (#6d70b0) +U 12 (#86edc3) +R 4 (#435460) +U 3 (#07f023) +R 8 (#33dd00) +U 5 (#599aa3) +L 11 (#83c702) +U 5 (#3f0501) +L 7 (#4bf232) +U 9 (#3f0503) +L 2 (#4955d2) +U 5 (#24f2e3) +L 9 (#16abf2) +U 6 (#60f753) +L 3 (#678dd2) +U 3 (#736093) +L 3 (#007482) +D 7 (#446e11) +L 6 (#0482a2) +D 8 (#997fd1) +L 4 (#4891e2) +D 6 (#2547b1) +L 5 (#501bf2) +D 8 (#7ed033) +L 8 (#0dabe2) +U 8 (#7184d3) +L 2 (#748a42) +U 5 (#12e093) +L 7 (#672432) +D 7 (#19c6a3) +L 4 (#1c5c22) +D 2 (#6e8a23) +L 10 (#5cd602) +U 9 (#1d8ff3) +L 7 (#359ce2) +U 6 (#333143) +R 11 (#0422f2) +D 10 (#235323) +R 6 (#64bc72) +U 10 (#6ea5f3) +R 11 (#68df60) +U 10 (#0952c3) +L 4 (#5206d2) +U 6 (#09c2a3) +L 5 (#45f7e0) +U 6 (#6d15e3) +L 6 (#271740) +D 6 (#6d15e1) +L 7 (#2e6a20) +U 9 (#178883) +L 9 (#430370) +U 4 (#2ee7e3) +L 7 (#8bdcf0) +D 9 (#5cebd3) +L 3 (#3d5a50) +D 4 (#5ecc23) +L 8 (#095b52) +U 9 (#3b7121) +L 10 (#8061b2) +U 4 (#3b7123) +L 7 (#209272) +U 4 (#493833) +L 9 (#7d9b02) +U 5 (#283633) +L 3 (#0db702) +U 3 (#437d73) +L 14 (#721282) +U 4 (#059a63) +L 2 (#4630d2) +U 5 (#6c5f43) +L 13 (#2949c2) +U 3 (#590a93) +R 5 (#4f5650) +U 5 (#71c3e3) +L 8 (#308540) +D 15 (#4fbc53) +L 2 (#4fa760) +U 15 (#41d523) +L 8 (#6bd380) +U 6 (#5cb553) +R 6 (#76acc0) +U 10 (#6be3a3) +R 6 (#5d61b0) +D 10 (#6dd101) +R 4 (#04f600) +U 4 (#4ea101) +R 2 (#6c2630) +U 5 (#498ac1) +R 5 (#0667a0) +U 5 (#120ef3) +R 3 (#31c080) +U 5 (#861cd3) +R 11 (#364e90) +D 5 (#6dd103) +R 9 (#6fe5b0) +D 11 (#119d43) +R 6 (#111310) +D 14 (#2ff323) +R 7 (#177432) +U 12 (#0ccbd3) +R 2 (#77c592) +U 9 (#6eee43) +R 10 (#21e622) +U 8 (#0bc513) +L 8 (#5398a0) +U 2 (#53cca3) +L 10 (#463c20) +U 5 (#53cca1) +R 8 (#174b20) +U 11 (#09ddc3) +R 6 (#20c940) +U 11 (#2fc6c3) +R 8 (#7ab1b0) +U 6 (#7ab291) +R 3 (#057160) +U 6 (#008331) +R 11 (#62c440) +U 12 (#3233a1) +R 2 (#1ceaa0) +U 4 (#4ef663) +R 3 (#7e5670) +U 2 (#4ef661) +R 5 (#3ccc40) +U 8 (#6e3531) +L 13 (#3964a0) +U 5 (#68b801) +R 13 (#83d220) +U 5 (#459901) +R 2 (#053a70) +U 6 (#4d18d3) +R 11 (#8a23d0) +U 8 (#4d18d1) +R 9 (#2cce90) +D 14 (#48af61) +L 6 (#045500) +D 6 (#0b4971) +L 8 (#18fa70) +D 7 (#7d8d03) +L 3 (#6ba530) +D 9 (#061783) +R 9 (#2c9c30) +D 13 (#402993) +R 8 (#18e9c0) +D 7 (#51e7a3) +R 15 (#18e9c2) +D 3 (#0ae133) +R 5 (#4929f0) +D 3 (#8d4623) +R 4 (#277680) +U 11 (#034583) +R 7 (#1ea1a0) +D 11 (#6cc5e3) +R 8 (#8894e0) +U 5 (#2fc6c1) +R 6 (#4dd6d0) +U 3 (#7f5b21) +R 11 (#219440) +U 4 (#2db8a1) +R 6 (#4053a0) +U 6 (#2df7e1) +R 12 (#086710) +U 8 (#47c7c1) +R 4 (#41ee90) +U 3 (#1dfa61) +R 3 (#5c3610) +U 7 (#483023) +R 10 (#2b6060) +D 3 (#327133) +R 8 (#2e4b30) +D 14 (#212321) +R 8 (#4bfd00) +D 5 (#5f0b81) +R 4 (#718450) +D 14 (#320dd1) +R 5 (#103630) +D 6 (#911953) +R 4 (#3f6190) +D 7 (#212323) +L 4 (#7f84b0) +D 10 (#2816a1) +R 5 (#026f80) +D 2 (#528ab1) +R 8 (#04e160) +D 11 (#655ca3) +R 2 (#0a1bf0) +D 3 (#6872c3) +R 12 (#7ad510) +D 8 (#72fe63) +R 7 (#109a50) +D 9 (#66ae31) +R 3 (#0828a2) +D 12 (#039eb1) +R 8 (#6f2c60) +D 6 (#46dae1) +R 12 (#76c900) +D 8 (#724711) +L 10 (#0a41a0) +D 8 (#73f301) +L 2 (#029092) +D 5 (#2ee5b3) +R 9 (#794702) +U 9 (#2ee5b1) +R 9 (#745f72) +U 2 (#108e61) +R 4 (#30e792) +U 10 (#099281) +R 11 (#347f32) +U 4 (#319ab1) +L 5 (#44a712) +U 9 (#623681) +L 6 (#3b5002) +U 10 (#25e431) +R 6 (#4f3f22) +U 4 (#226f51) +R 5 (#26f7b2) +U 8 (#588341) +R 4 (#09de02) +D 11 (#423f21) +L 6 (#6c9ee2) +D 10 (#423f23) +R 6 (#3badf2) +D 4 (#2c0a93) +R 4 (#521a32) +U 7 (#4ee803) +R 15 (#47f6d2) +U 2 (#673651) +R 4 (#5c10b2) +U 9 (#4dc641) +L 11 (#4d7032) +U 6 (#299111) +L 8 (#8d06b2) +U 8 (#22e4d1) +L 7 (#7dac02) +U 4 (#58e171) +L 7 (#17e332) +D 12 (#211931) +L 4 (#7e1732) +D 5 (#502911) +L 4 (#88c6c2) +D 5 (#430ba1) +L 3 (#3e4de0) +D 13 (#481b11) +L 5 (#5925e0) +U 4 (#1cecb1) +L 7 (#11ecf0) +U 7 (#634bc1) +R 7 (#6218d2) +U 7 (#7990f3) +L 5 (#576b42) +U 4 (#7990f1) +L 10 (#145832) +U 9 (#609ef1) +L 3 (#0d8822) +U 4 (#2b1f83) +L 3 (#77a562) +U 5 (#2b1f81) +L 6 (#3d05c2) +U 7 (#4b56d1) +L 5 (#1f6272) +U 8 (#916891) +R 6 (#087ce0) +U 6 (#2cf203) +R 12 (#285e60) +U 9 (#6ae623) +R 9 (#8a34a0) +U 9 (#6ae621) +L 9 (#15b200) +U 11 (#40c541) +R 5 (#0c7fc0) +D 7 (#2d5ad3) +R 9 (#42f280) +D 7 (#8140a3) +R 3 (#255770) +D 10 (#8140a1) +R 12 (#4ac260) +D 5 (#2d5ad1) +R 8 (#083780) +U 15 (#40c543) +R 7 (#028ab0) +U 13 (#2cf201) +R 5 (#1461d0) +U 2 (#23bff1) +R 4 (#1a4992) +U 3 (#355fc1) +R 7 (#6cafd2) +U 5 (#355fc3) +R 6 (#226752) +D 6 (#5af021) +R 11 (#526e82) +D 6 (#055ac1) +R 4 (#460a42) +D 3 (#055ac3) +R 6 (#565542) +D 3 (#3cd6a1) +L 7 (#2da922) +D 10 (#708ea3) +R 7 (#687472) +D 4 (#4ec333) +R 4 (#58d602) +U 7 (#4dd3e3) +R 3 (#23a7c0) +U 10 (#51fa83) +R 5 (#23a7c2) +D 5 (#188363) +R 14 (#5bc432) +U 4 (#3f0d23) +R 8 (#27a940) +U 3 (#62a3a3) +R 10 (#27a942) +U 6 (#0ceab3) +R 2 (#4479c2) +U 12 (#8beb63) +L 2 (#0b84a2) +U 3 (#3aa313) +L 7 (#270672) +U 15 (#4bd563) +L 5 (#4d8072) +U 6 (#045183) +R 12 (#08fed2) +U 11 (#52d323) +R 2 (#050992) +U 9 (#618533) +R 4 (#17a282) +D 7 (#08e921) +R 3 (#1a0d22) +D 6 (#0e8541) +R 11 (#61b232) +D 7 (#6635f1) +R 5 (#617832) +D 5 (#08f4f3) +R 2 (#490c22) +D 3 (#234821) +R 3 (#476942) +D 12 (#234823) +R 11 (#31b6d2) +D 4 (#08f4f1) +L 6 (#129582) +D 6 (#507ed1) +R 6 (#1e7010) +D 8 (#5490e1) +R 10 (#093bb0) +D 4 (#7cefc1) +R 9 (#6fe430) +D 3 (#0160b1) +L 8 (#1a8570) +D 2 (#2722f3) +L 4 (#2eb860) +D 12 (#572d83) +L 7 (#556c20) +U 12 (#50d5c1) +L 6 (#3a0932) +D 3 (#0a1701) +L 6 (#2294f0) +D 4 (#5f04e1) +L 13 (#62c590) +D 7 (#5f04e3) +R 6 (#1660e0) +D 2 (#34e001) +R 6 (#23b340) +D 12 (#1e92e1) +R 6 (#786d10) +U 12 (#44f8d1) +R 4 (#786d12) +D 3 (#3f6cf1) +R 3 (#2e2812) +D 3 (#185ac3) +R 3 (#7976e2) +D 14 (#0a5201) +R 4 (#15e3e2) +D 3 (#825221) +R 3 (#699e12) +U 3 (#8ca423) +R 14 (#04ffb2) +U 3 (#185ac1) +R 2 (#0a3482) +U 4 (#59d541) +L 10 (#5b8ab2) +U 4 (#59d543) +L 6 (#395af2) +U 3 (#2fdcb1) +R 7 (#1d5670) +U 3 (#3801c1) +R 6 (#65de30) +U 7 (#522db1) +R 11 (#9a9020) +U 12 (#382413) +R 11 (#55b6c0) +U 8 (#382411) +L 4 (#4549e0) +U 7 (#2f1091) +L 7 (#127550) +U 7 (#3e2ee1) +R 7 (#1b7ba0) +U 5 (#0177e1) +L 10 (#581e30) +U 4 (#0177e3) +L 8 (#287b30) +U 5 (#4667a1) +R 6 (#3a6730) +U 6 (#7575e1) +R 6 (#4d8f90) +U 8 (#06a251) +R 2 (#32a980) +U 5 (#92bbf3) +R 3 (#465200) +D 4 (#1e82a3) +R 7 (#5e49b0) +U 4 (#282471) +R 6 (#95ba62) +U 3 (#3fc1e1) +R 3 (#95ba60) +U 9 (#495841) +R 3 (#3bece0) +D 13 (#06a253) +R 3 (#58ed10) +D 4 (#3c4df3) +R 7 (#830800) +D 10 (#3c4df1) +R 4 (#39bca0) +D 4 (#0e26a1) +R 6 (#09cd40) +D 6 (#725971) +R 10 (#624800) +D 11 (#49ae11) +R 11 (#3ed060) +D 7 (#49ae13) +L 12 (#3e0b20) +D 4 (#569191) +L 3 (#1bb070) +D 7 (#0b1803) +L 10 (#045fa0) +U 6 (#8cb0a3) +L 7 (#57ca40) +D 6 (#146f43) +L 9 (#5ad0b0) +D 3 (#22f873) +R 10 (#249e42) +D 5 (#429003) +R 11 (#35bf52) +D 7 (#162bc1) +R 7 (#5689a2) +D 10 (#162bc3) +R 12 (#286a32) +D 9 (#54b443) +R 10 (#505c32) +D 3 (#831903) +R 7 (#003ab0) +D 11 (#6a9af3) +R 10 (#39f710) +U 11 (#1f31b3) +R 5 (#6fc5c0) +D 4 (#071b73) +R 7 (#3fe110) +D 9 (#5fd6e3) +R 9 (#3fd500) +D 3 (#2fc9b3) +R 6 (#727a40) +D 7 (#531d23) +R 14 (#02afc0) +D 6 (#1e5cb1) +R 4 (#717490) +D 12 (#6efba1) +R 11 (#5996f0) +U 5 (#763861) +L 5 (#444cf0) +U 8 (#763863) +R 7 (#2e2c60) +U 7 (#543fa1) +L 7 (#95e230) +U 3 (#543fa3) +R 5 (#41fd20) +U 3 (#19bf61) +R 5 (#656540) +D 7 (#391283) +R 4 (#33ebc0) +D 13 (#391281) +R 9 (#709320) +D 6 (#498291) +R 3 (#03c942) +D 6 (#3391a1) +R 6 (#5a83e2) +D 5 (#4eaff1) +R 7 (#2ca112) +D 4 (#2de1c1) +L 6 (#8724f0) +D 9 (#4b7fc1) +L 5 (#005232) +U 9 (#322291) +L 7 (#6a7682) +D 4 (#5d2381) +L 5 (#6e5312) +U 13 (#5d2383) +L 8 (#4a5e52) +D 13 (#61a5a1) +L 3 (#2adb12) +D 6 (#1056e3) +L 3 (#74eb12) +U 10 (#1056e1) +L 12 (#4c3122) +D 9 (#02d251) +R 9 (#30a702) +D 7 (#7cd9f1) +R 10 (#56a522) +D 6 (#25e4f1) +R 7 (#720682) +D 3 (#11a711) +R 10 (#4810c0) +U 9 (#7233d1) +R 13 (#47d8b0) +D 5 (#222c51) +R 6 (#270630) +U 9 (#6c2991) +R 5 (#251ce0) +D 9 (#0ce373) +R 5 (#0f3af0) +D 4 (#234033) +L 13 (#399410) +D 3 (#1091f3) +L 11 (#12ab92) +D 3 (#2c05c3) +L 9 (#53cc00) +D 5 (#662eb3) +R 3 (#53cc02) +D 3 (#19fbf3) +R 8 (#12ab90) +D 11 (#13a3c3) +R 10 (#6b7ed0) +D 7 (#480071) +L 10 (#39ba10) +D 12 (#414181) +L 11 (#6be3c0) +D 4 (#308403) +L 4 (#5081d2) +U 3 (#4a1c33) +L 6 (#412360) +U 11 (#5cad03) +L 4 (#412362) +U 11 (#1670a3) +L 8 (#5081d0) +U 7 (#36b3f3) +L 8 (#4a86c0) +D 7 (#1903f1) +L 11 (#5aa690) +U 9 (#88cd01) +L 3 (#3843d0) +U 14 (#4c44d1) +L 8 (#92ea62) +D 5 (#205b31) +L 14 (#2d2130) +D 4 (#1600d1) +L 2 (#5eed20) +D 8 (#504601) +L 9 (#4238f2) +D 10 (#8a3821) +L 3 (#524dd2) +D 6 (#8a3823) +L 3 (#106f82) +U 8 (#3d0d81) +L 6 (#1ec032) +U 6 (#040993) +L 4 (#1ff1d2) +D 14 (#17b973) +L 3 (#3c2ae2) +D 7 (#7c2501) +L 7 (#633cd2) +D 4 (#6530d3) +L 3 (#082de2) +D 7 (#16f433) +L 13 (#89eb52) +D 5 (#17b971) +L 3 (#252512) +U 15 (#040991) +L 2 (#90d092) +U 10 (#0a1021) +L 8 (#1cd900) +U 6 (#4a13d1) +R 10 (#7a6bf2) +U 4 (#4683c1) +R 7 (#7a6bf0) +D 11 (#3a66f1) +R 8 (#488f20) +U 11 (#7135a1) +R 5 (#4cc380) +U 5 (#0bf121) +R 3 (#4c2e80) +U 2 (#7908a1) +R 3 (#259e00) +U 10 (#6bafe3) +L 5 (#52e6d0) +U 4 (#506603) +L 6 (#1fec10) +D 7 (#3a1983) +R 6 (#389e30) +D 2 (#2f7281) +L 6 (#55f170) +D 7 (#4cb8e1) +L 5 (#389e30) +U 6 (#2642e1) +L 10 (#7394e0) +U 3 (#642bf1) +R 10 (#7394e2) +U 7 (#132c01) +L 6 (#3c4a80) +D 4 (#3e4d21) +L 4 (#989ad0) +U 7 (#473211) +L 8 (#0aa900) +D 6 (#3a8a11) +L 12 (#4307a2) +D 9 (#13b0c1) +L 6 (#7e59a2) +D 11 (#00a041) +L 3 (#44b0d2) +D 6 (#0efc51) +L 6 (#8a1302) +D 9 (#160fa1) +L 4 (#4afa62) +D 2 (#68e871) +L 14 (#5ecd60) +D 5 (#6a51d1) +L 5 (#764000) +D 8 (#1a6d61) +L 4 (#713042) +D 14 (#0b92e1) +L 5 (#5b77e2) +D 3 (#0a0581) +R 10 (#212752) +D 3 (#0a0583) +R 14 (#3f0ca2) +D 8 (#13d911) +R 3 (#307832) +D 4 (#72d201) +R 6 (#133522) +U 13 (#6e4581) +R 4 (#70fe22) +D 13 (#082221) +R 7 (#44fff2) +D 4 (#731171) +R 3 (#10eda2) +D 9 (#0e5d31) +L 14 (#37bc32) +D 6 (#3852c3) +L 7 (#5f43c2) +U 13 (#8c7593) +L 9 (#2ff4f2) +U 10 (#1787b3) +L 13 (#68b4a2) +U 3 (#15fd23) +L 3 (#515622) +U 3 (#618313) +L 11 (#2d09d2) +U 10 (#6bb2f3) +L 5 (#1f22a2) +U 10 (#4d8e33) +L 6 (#1cb690) +U 3 (#09c3b3) +L 9 (#214c20) +U 9 (#5bfe23) +L 9 (#848910) +U 10 (#1a73e3) +L 10 (#3d9252) +U 3 (#089003) +R 11 (#7ddbb2) +U 8 (#20c473) +R 15 (#071dc2) +U 7 (#554823) +R 13 (#0cfb42) +U 7 (#1ccaa1) +L 15 (#847822) +U 8 (#5f0271) +L 4 (#03cdd2) +U 10 (#4f69b1) +L 3 (#4b1902) +U 8 (#8129b1) +L 4 (#5e69f2) +D 5 (#1f33b3) +L 5 (#2e2582) +D 13 (#67aea3) +L 4 (#54aba2) +U 3 (#08d7a3) +L 4 (#4eebe0) +D 8 (#030763) +L 9 (#2d4760) +D 14 (#79e223) +L 9 (#7c3342) +D 3 (#334c93) +L 4 (#2b0202) +D 9 (#04d053) +L 2 (#1475a2) +D 7 (#8aed93) +L 8 (#62b4f2) +D 5 (#14c931) +R 11 (#29bc82) +D 3 (#65a951) +R 12 (#656f62) +D 3 (#7a7283) +L 8 (#2bec52) +D 7 (#1a75a3) +L 8 (#988402) +D 4 (#1a75a1) +L 3 (#1aad22) +D 9 (#373923) +L 10 (#7e3ef0) +U 7 (#3e1c93) +L 11 (#3f89d0) +U 6 (#3e1c91) +L 3 (#652e40) +D 9 (#35acc3) +L 7 (#5b0fa0) +U 4 (#46ca63) +L 10 (#079fa0) +U 7 (#391523) +L 3 (#079fa2) +U 3 (#585573) +L 8 (#1f43e0) +D 2 (#403c21) +L 9 (#144b10) +D 5 (#8fa921) +L 5 (#144b12) +U 7 (#084fb1) +L 4 (#661600) +D 6 (#5e06f3) +L 13 (#3f87a0) +D 8 (#3ca8a1) +L 13 (#4214e0) +D 10 (#567b51) +R 4 (#7a3080) +D 8 (#17de11) +R 8 (#644090) +D 12 (#55ba83) +R 3 (#025e60) +D 8 (#554783) +R 6 (#0d2eb0) +D 10 (#552813) +L 6 (#61a7d0) +D 10 (#272cb3) +L 7 (#34d6a0) +D 3 (#36cf03) +R 11 (#14be00) +D 3 (#52b543) +R 4 (#1fa362) +D 11 (#713693) +L 3 (#652112) +D 8 (#5c8463) +L 12 (#4c1362) +D 4 (#66e201) +L 8 (#07caa2) +D 9 (#6ccbd1) +L 3 (#3b9ee2) +D 5 (#5798b1) +L 13 (#4fb342) +U 6 (#231223) +L 2 (#33e3b2) +U 5 (#022ea3) +L 6 (#3f1112) +U 6 (#3dde83) +L 6 (#2732a0) +U 8 (#1e6bc3) +L 8 (#10f4e0) +U 15 (#45e363) +L 3 (#10f4e2) +U 4 (#4c9523) +R 11 (#2732a2) +U 12 (#174303) +L 10 (#5b4532) +U 13 (#6195e1) +L 8 (#7fab60) +U 2 (#1e7dd1) +L 2 (#7fab62) +U 12 (#4da741) +L 4 (#09efc2) +D 5 (#3d0d83) +L 5 (#47d532) +U 6 (#1f7441) +L 12 (#558832) +D 6 (#24e093) +L 4 (#20bfc2) +U 6 (#606283) +L 11 (#639142) +U 2 (#854311) +L 5 (#318ff2) +D 8 (#7037c1) +L 12 (#1ee752) +U 5 (#6bad43) +L 5 (#662cd2) +U 6 (#23fec3) +L 6 (#11cec2) +U 9 (#0c5b23) +L 8 (#91c052) +U 3 (#62e783) +L 6 (#08ee02) +U 11 (#11a283) From d4aa8d246f6e7e4ba3c420064603b431bf513da6 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 18 Dec 2023 08:03:12 +0000 Subject: [PATCH 449/479] 2023: d18: ex2: add solution --- 2023/d18/ex2/ex2.py | 97 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100755 2023/d18/ex2/ex2.py diff --git a/2023/d18/ex2/ex2.py b/2023/d18/ex2/ex2.py new file mode 100755 index 0000000..8d68781 --- /dev/null +++ b/2023/d18/ex2/ex2.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python + +import itertools +import sys +from enum import StrEnum +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + + +class Direction(StrEnum): + UP = "U" + DOWN = "D" + LEFT = "L" + RIGHT = "R" + + def apply(self, pos: Point, n: int = 1) -> Point: + DIRECTIONS = { + "U": Point(-1, 0), + "D": Point(1, 0), + "L": Point(0, -1), + "R": Point(0, 1), + } + dx, dy = DIRECTIONS[self.value] + return Point(pos.x + dx * n, pos.y + dy * n) + + +DigPlanStep = tuple[Direction, int] +DigPlan = list[DigPlanStep] + + +def solve(input: list[str]) -> int: + def parse_line(line: str) -> DigPlanStep: + _, _, color = line.split() + color = color[2:-1] + n = color[:-1] + dir = { + "0": "R", + "1": "D", + "2": "L", + "3": "U", + }[color[-1]] + return Direction(dir), int(n, base=16) + + def parse(input: list[str]) -> DigPlan: + return list(map(parse_line, input)) + + def dig_trench(plan: DigPlan) -> list[Point]: + points = [Point(0, 0)] + + for direction, n in plan: + points.append(direction.apply(points[-1], n)) + # The trench should loop back to the start, make sure we don't count it twice + if points[-1] == Point(0, 0): + del points[-1] + + return points + + def lagoon_volume(trench: list[Point]) -> int: + def shoelace_area(points: list[Point]) -> int: + # Must be integer because pipes follow the grid, and can't cut squares in half + return abs( + sum( + (points[i - 1].x * points[i].y) - (points[i].x * points[i - 1].y) + for i in range(len(points)) + ) + // 2 + ) + + def perimeter(points: list[Point]) -> int: + res = 0 + + for p, n in itertools.pairwise(itertools.chain(points, [points[0]])): + res += abs(n.x - p.x) + abs(n.y - p.y) + + return res + + area = shoelace_area(trench) + trench_points = perimeter(trench) + interior_points = area - trench_points // 2 + 1 + return interior_points + trench_points + + plan = parse(input) + trench = dig_trench(plan) + return lagoon_volume(list(trench)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From aedb2c4c1455e26eee93ec8803ac7f0447ff0248 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 19 Dec 2023 17:57:51 +0000 Subject: [PATCH 450/479] 2023: d19: ex1: add input --- 2023/d19/ex1/input | 773 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 773 insertions(+) create mode 100644 2023/d19/ex1/input diff --git a/2023/d19/ex1/input b/2023/d19/ex1/input new file mode 100644 index 0000000..cb9070d --- /dev/null +++ b/2023/d19/ex1/input @@ -0,0 +1,773 @@ +pnv{a<2630:R,A} +qpv{x<1782:fng,x<2737:R,A} +btl{s>2396:A,R} +cq{m<3505:A,m<3705:A,a>1266:R,R} +zf{a<363:xql,bgx} +ncc{m<2660:R,x>1277:A,a<1366:R,R} +xql{x>939:R,x>386:R,R} +sqc{s<2972:A,A} +tdq{s>2439:zq,s<2392:qz,s<2422:gss,gzh} +jjl{s<848:R,A} +sb{m<1868:qx,x>2338:kpq,s>1982:jf,hd} +pc{x>1519:A,s<1677:R,s<1789:R,fn} +xm{m<1795:mm,a>1313:xzg,nt} +qrl{x<2554:tjx,s>1612:cj,sq} +df{a<317:A,s<130:R,s<147:R,R} +spp{x<2189:A,A} +qqz{a>2735:A,m>3070:gv,R} +xf{a<1152:A,a>1282:R,s<1142:A,R} +ktg{m>1334:A,x<3202:A,s<939:R,vkx} +hgv{m<648:vm,a<1062:R,x>1854:qs,A} +gz{s>3829:R,a<800:A,R} +tcp{x>3555:A,R} +jgh{m>2442:xrt,x>1879:ct,dn} +qk{x>2955:ln,m<2753:jl,m>3239:gj,kt} +dzz{s<645:A,mfh} +flz{x<3157:A,x<3324:R,A} +qv{m<1163:R,m>1940:A,R} +qfl{a>574:vl,s>2971:qhx,s<2767:tn,tlj} +mlc{s>1250:A,s>1120:R,m>2730:R,A} +hkh{x>2796:A,R} +jn{m<2451:gp,R} +rgh{a<322:R,A} +jr{m>2821:xsl,a>2413:R,R} +zl{x>773:A,a<1392:xf,R} +ndg{a<3811:A,s<2933:A,a>3880:A,R} +hqz{s<1513:A,R} +tlj{m>1531:jc,hq} +rpk{a<159:mjb,lzh} +brs{x>2340:R,x<1218:R,A} +bh{s>45:rsg,m<630:brs,R} +qhx{a>368:fz,s>3161:tp,dq} +xvk{m<1424:dg,m>2965:rk,mqb} +nmm{a<330:R,a<463:A,a<495:R,R} +nxf{x>3610:A,x>3400:A,x<3264:A,R} +ghp{x>1386:jr,lg} +slx{s>3458:A,s<3251:A,R} +crk{s<759:A,m<2715:R,A} +mvm{s>285:fb,s<96:mt,x<1994:sxl,tpx} +gd{a>1402:ft,s<3094:mtv,a<1203:rpx,xm} +bt{a>1843:sp,m<2632:dj,R} +xp{x>502:R,s>2643:A,A} +nf{s<2944:A,a<1266:R,m>2113:R,A} +fbj{m<1833:A,s>3143:A,A} +lp{m>2247:A,x<2896:A,s>1662:A,A} +xl{s>1633:R,s<1562:R,s<1604:A,R} +zjd{x>2566:R,s>3638:R,x<2076:R,R} +qft{a>993:A,m<3431:R,A} +tn{x>1053:fr,s>2699:A,s>2661:nb,xp} +ggd{a>690:R,s<374:R,s>490:A,A} +bg{s<1514:hh,x<3785:R,m<1098:bsv,R} +mk{s>2443:R,a>142:ghz,s<2371:A,hm} +qjf{s<209:zt,s>250:ssm,m<402:R,vbr} +lf{s<3464:A,xb} +mfh{s>975:A,R} +jbf{a<1178:R,m<1644:A,R} +hqx{a<75:A,R} +mt{a>517:rlg,a<337:tgr,bh} +kp{x>243:R,x>162:A,R} +jjd{a>227:R,A} +vzl{m>3320:R,a>747:A,ggd} +bqf{x<392:fj,jld} +lq{x>2656:R,A} +gnx{a<1409:R,x>2669:R,R} +sbk{s>176:kzc,s<134:R,vn} +ftd{m>3310:A,R} +mtv{s>2818:srk,tf} +hvg{a<184:A,a>361:R,m>353:R,A} +dnh{s<2051:hvj,xz} +rk{a>3410:lvm,s<3154:rpq,m<3319:xkb,zb} +bbd{m<1648:R,R} +vn{x<1218:R,R} +rxm{m<3037:A,a<3652:A,a<3783:A,R} +lhr{x<977:R,s<2606:R,a>1061:R,R} +bz{x>356:R,A} +gvs{s>227:R,A} +rxh{s<1996:R,s>2027:R,s>2007:R,A} +vvc{x<2607:R,s<513:xln,s<846:lk,A} +qc{s>2515:tdr,s<2409:R,mgh} +vtj{s<1147:R,s<1283:A,x>2934:A,A} +zt{s>139:R,x>1411:R,s>118:R,R} +dqz{s<1321:A,a<2606:R,a<2895:R,A} +rp{m>2386:R,R} +lt{s>2777:R,s>2705:R,A} +dl{s>312:A,a>137:R,s>259:A,A} +qz{a>663:zm,a>409:kd,R} +nzh{x<3109:xq,a<2613:R,x<3252:ss,R} +nlz{x>3224:A,A} +fkx{x<2574:R,s>960:fps,A} +qh{m>1152:R,a>680:R,s>1682:tg,pr} +hrm{a>546:xhg,m>879:ktg,s>1067:lhg,sl} +hd{a<938:mc,x<1690:vq,R} +szr{m>1603:kcn,s>531:cbn,m<1033:mvm,ch} +jc{s<2856:R,x<1048:A,A} +dj{a>950:A,s<1785:R,m<2205:A,A} +cj{x>3311:jjj,s>1751:pz,m<1872:cvk,qk} +kt{x>2694:tmp,m>2949:R,a>1543:R,A} +xjd{s<3105:A,a>2050:R,m>1463:A,A} +cgg{m<625:R,bgl} +ls{a>475:A,A} +jpr{x<736:sx,s<3350:A,jsk} +dvf{a>1537:qld,s>964:jzj,s<422:hhr,vgs} +tth{m>461:A,m>282:A,m>170:R,R} +hj{s>3109:R,a<124:R,s<2949:A,A} +tng{a>751:A,s>1079:A,x<1326:A,R} +ngx{s<384:lc,dp} +nc{s<1916:A,a>1035:R,s<1922:R,R} +mf{s<205:R,a>166:A,a>94:A,A} +vrr{a>2625:A,x<2277:R,R} +vxx{x>1741:bjm,m>1905:R,m>1559:A,A} +jt{x>3716:R,x>3650:R,R} +lhs{x>2681:A,a<2540:R,R} +lcn{m>755:A,s>1214:R,m<469:R,A} +lln{s<445:R,m<268:R,s<461:A,A} +hm{x>1734:R,s<2410:A,A} +mp{m<711:lkj,A} +nj{m>1713:A,m<1125:A,A} +cb{m<3049:jgk,x>2784:R,R} +krl{a>1348:A,s<628:R,R} +sh{a>1276:R,R} +fn{a>3050:A,a<2792:A,A} +bb{s<163:vsx,s<243:dld,A} +bc{a>2046:jgh,a>914:lng,szr} +lk{x<3283:A,a<1900:R,A} +sl{x<3264:hkh,s>715:cqr,x<3740:znr,nmm} +mq{m<526:bqr,dzf} +vdn{a>790:A,m>2018:R,a>456:mx,A} +cjz{s<832:R,x<1390:R,A} +chn{m<1834:bg,lkh} +bcc{x>917:A,R} +jrf{s>473:xtn,s>424:A,s<393:R,hps} +xpn{x<3290:spz,x>3623:stf,m<764:dqz,A} +fxj{x>1787:xvk,zbk} +nt{m>2968:cq,m>2511:R,sh} +fjh{a>330:A,m>1524:A,m>1492:R,A} +xq{s<1556:R,m>1439:A,A} +km{s>1752:R,R} +qg{a<3374:A,a<3747:A,A} +ps{a>666:R,x<3515:A,m<1018:R,A} +ctm{m<3241:A,R} +gf{s>2707:A,R} +vrp{m<952:pd,A} +in{s>2630:ld,s>1462:nkf,bc} +kzc{m<484:R,m>687:A,A} +rfl{s>2193:kr,x>1357:fm,m<1863:cg,bhz} +rll{s>336:R,s<201:bpt,x<2238:kg,zbx} +bm{x>1200:btl,a>1179:jj,mjv} +tp{m>1670:A,s>3243:R,m>1085:R,R} +mjb{a>58:R,m>2431:A,m<2129:R,R} +ch{m>1301:vmv,hn} +nrn{s>2068:rfl,x<1344:vmk,sb} +thc{s>1780:R,s>1682:phd,pzp} +cnd{x<3374:A,R} +csm{a>446:xrr,a<189:nh,x>450:hdp,pb} +fpl{a>1650:kcz,s<2305:nrn,x>2628:dmx,lj} +dvp{x>2084:lr,s<3287:qfl,m>2644:kf,gvt} +qfh{m<3214:R,x<2287:A,A} +vk{a<3396:hqz,s<1560:qj,s<1592:R,flz} +mx{s>1971:A,x>477:R,s<1954:R,R} +fj{s<303:kp,s<476:R,m>1310:R,R} +qj{s<1527:A,A} +lkj{m<432:A,m>577:R,m<510:R,A} +srk{x<1497:A,a>1169:nf,a>1049:pf,A} +lzh{s>537:A,x>965:A,A} +zq{s<2562:A,x<3107:xv,s>2592:A,R} +lg{m<2702:R,x>582:mv,A} +zcm{a>3555:vdf,s<3451:A,cpm} +dxb{x<3257:rb,x>3685:R,m<2129:ps,bq} +sk{s>1525:R,A} +sn{x<3897:R,s>1539:A,s>1507:A,A} +dmx{m>2059:ccd,tdq} +xvn{m<351:R,x>2393:R,R} +vvd{x>2974:zp,R} +lcc{m>3177:A,s>2384:A,A} +cc{x>2435:A,s<191:ql,R} +pm{a<1388:R,s>2500:R,m>1439:A,ts} +hb{x<2496:R,m<2726:R,x<3383:A,nch} +zgl{s<635:lq,x>3156:pfq,cdz} +mr{x>1745:vrp,zl} +vpp{s<242:tth,s>257:qd,A} +lnk{m<2592:qtm,R} +jbr{x>788:R,x<474:R,s>3470:A,R} +qdv{x>2652:A,m>1433:R,R} +spg{s<2353:R,x>1228:A,x<750:R,A} +lvb{a<473:R,x<3266:R,m<939:A,A} +jrj{m>3129:A,a>662:R,R} +fm{s>2117:R,s<2092:vhn,x<2631:A,A} +ndm{s>365:jrf,vfq} +pv{x>1589:zfz,A} +ckk{s>236:bk,m<3187:A,x<3279:dx,mxp} +pg{a<339:mk,m<2499:qc,ftd} +npc{a>466:A,R} +db{x<1464:lnk,crf} +qx{x<3100:kx,m<1031:R,dgq} +zfq{a>524:A,A} +fjs{x>3200:R,a<146:A,x>2874:lcc,jjd} +zp{a>1395:A,A} +lvm{s<3328:trh,m>3505:R,ghj} +kng{s<2493:bm,m>3452:xgh,fgr} +qq{s>2432:R,A} +mb{m>1445:bcc,a<2795:R,A} +hr{m>1150:R,m>443:cbh,a<640:A,A} +rqn{x>2195:A,a<1290:A,x>1119:R,R} +thv{x>2809:A,x>2419:A,m<571:R,R} +ssr{s<1168:lgk,m<559:dh,a>3139:lbs,xpn} +kg{s>272:R,m<1454:A,R} +dn{x>1084:lz,s>593:bx,bqf} +cf{m<639:A,s<3221:pp,x>3541:ds,fvc} +pp{a<2936:R,x>3345:A,R} +td{a<1277:hgv,x<2074:bht,s>306:gcn,vvd} +cg{x>672:R,R} +fxk{x<3348:A,A} +xtn{m>2134:A,x<1811:A,m>1892:A,A} +tg{m>673:A,m<314:A,R} +kcf{x>608:R,x<205:ntp,R} +tgz{a>1754:A,R} +qt{x>2921:xpd,a>1995:xdf,x<2722:sk,ltt} +dld{x<494:A,s<199:R,R} +mjv{m<3208:A,m<3702:R,s>2384:A,A} +hps{m>2250:R,s<405:R,a<599:A,A} +kjh{a>3337:R,m<464:A,s>1385:A,R} +pz{a>2318:ht,vvp} +rc{s<262:R,x>811:R,A} +ds{x<3721:R,s>3699:R,s>3476:R,A} +ntp{x<77:R,R} +jld{m>951:R,a>3233:rc,a<2643:qjp,A} +mpj{a<666:fkx,lvv} +zfz{x<1630:R,x<1657:R,A} +ck{s<962:zsj,a>3138:hbx,xfc} +bk{m>3452:R,R} +cnj{s>1763:A,a>2468:cnd,s>1690:R,A} +zcz{m<2232:R,s<1682:A,A} +zbx{m>1431:A,x<2914:A,s<258:A,A} +crf{x>1600:R,s<3236:sqc,jqh} +lr{a>481:dxb,m<2629:lpq,x<3259:dd,qqc} +vkx{s<1200:R,a<261:A,R} +qtm{s<3529:R,a<3184:A,m>2279:A,A} +nmv{m>768:R,A} +brt{m>354:R,s<493:R,s<646:R,R} +pzd{a<855:zcz,m<1853:ccv,m<3101:zk,hmd} +sgp{s>3593:R,x<813:A,R} +kvg{m>2928:R,R} +ckp{m>3627:A,R} +dgq{x>3537:R,R} +rlg{x>1387:cqt,m>554:R,a>654:A,jmx} +xgh{s>2546:R,a>1311:A,tc} +sj{a>643:R,a>585:A,x>1738:R,R} +mqb{a<3391:lnm,s>3381:qr,njj} +jgm{s>2750:R,R} +lqp{s>1248:A,R} +gc{m>3241:rqn,m<3136:R,m<3179:R,qkb} +lgp{m>866:A,m>755:A,m>671:ls,vhc} +kvl{x<1422:A,a>3024:A,R} +cdz{a>137:R,R} +rld{a>2992:R,x>2926:A,R} +jj{m>3310:A,m<2977:A,A} +njj{a<3680:cth,ndg} +pfq{m>3025:A,a>193:R,a<87:R,A} +rpq{s<2866:lt,m>3459:cp,pnv} +qkb{x<2298:R,a<1313:R,m<3212:R,A} +jsk{a>2739:A,A} +szz{s>2350:A,A} +xj{s<3270:R,m<2735:A,m>3433:A,R} +jb{s>716:R,x<1196:R,R} +mvv{a>908:gd,dvp} +rfv{s>1017:hrf,x>1232:mp,csm} +hrf{a>604:R,x>1186:R,x<617:kz,glk} +gxb{s<2420:vx,pm} +lhh{m<657:R,x<3667:A,A} +pb{a<287:A,R} +bp{a>1592:ppj,R} +xqb{x>1364:ngd,x<772:mxk,R} +ln{s<1690:lmt,A} +kk{m>3273:A,a<867:R,A} +nx{m>2232:jpg,A} +gx{a>1776:R,R} +xv{a>580:R,A} +dk{m<1515:gr,kvl} +hgl{a>2798:tnf,m>3465:mmm,dzz} +vm{s<397:R,x>2464:A,A} +nkf{s>1890:fpl,qrl} +bsv{a>1977:A,A} +cbn{x>2136:hrm,rfv} +gzh{a<955:lvb,a>1251:qq,x<3426:R,A} +cpm{x<850:A,A} +phd{a<1873:R,R} +ccc{x<1738:A,a>2960:brt,A} +nz{m>1580:A,m>535:rs,a<3608:xvn,bv} +hmd{a<1503:R,x>1671:xl,A} +qs{s>337:R,A} +tjx{a<2514:pzd,x<1218:nxd,x>1675:zgp,qdl} +dzf{m<883:R,s<268:dmr,tgz} +dh{s<1310:A,m>372:kjh,glr} +gj{x<2764:R,ckp} +fr{s<2699:A,m<1878:A,A} +vmk{s>1989:fbc,s<1935:ll,vdn} +vmh{s<2090:A,A} +ss{a>2750:A,A} +bqr{a<1774:A,m<177:R,R} +jk{a<1028:R,s>3587:R,a>1091:R,A} +xln{a>1888:R,s>294:R,R} +zmz{x>1081:R,A} +mpb{s>2362:R,a<467:R,R} +zd{s>3154:R,s>3055:A,A} +nsj{x<1701:A,a>1055:A,A} +xsl{s>511:A,s<282:R,a<2317:R,R} +tgr{m>684:A,s<48:A,pmn} +ghj{s<3589:R,x>2695:R,m>3158:R,A} +kr{s<2240:R,m<2537:qv,m<3458:R,cm} +jx{s>3380:A,a>1102:A,s>3274:A,R} +ngd{m<2862:R,A} +vhn{a<1080:A,s<2081:A,s<2087:A,R} +gm{a<1387:jrj,a<3054:jsb,x>3816:R,jt} +qr{s<3607:R,s>3740:R,s<3694:zjd,A} +sq{x>3517:chn,lrm} +jl{x>2790:lp,m>2443:gnx,A} +cqb{m<3291:R,m<3385:R,x<942:R,A} +ql{x<1292:R,m<1982:R,x>1755:R,R} +fnz{s>792:mr,a<1529:td,mq} +xb{s<3532:R,s<3567:A,A} +bdp{a<3499:A,m<1904:A,m>2112:R,R} +gv{x>604:R,s>3769:R,a>2546:A,R} +fvc{a>2712:R,A} +hh{s>1493:A,a>1779:A,R} +ftr{x>2560:A,x<1662:R,x>2139:R,A} +lpq{a<194:hj,m<1056:qn,m<1753:R,A} +rb{x<2494:R,A} +txh{a<796:A,a>847:A,m>2443:R,A} +tk{m<3086:sbf,m>3574:R,kk} +pvh{a<1254:A,A} +ppj{m>2232:A,a<1757:A,x>812:R,R} +vx{m>1190:szz,spg} +kz{a>230:A,s>1293:A,R} +stf{s<1343:R,R} +xrt{m>3080:hgl,a>2847:vj,ghp} +bf{a<1198:A,A} +zb{x>2686:A,a<2867:vrr,m>3738:ndd,spp} +dc{x<2379:R,a>457:A,R} +zn{a<3249:R,m<3107:R,m>3180:R,A} +kv{s>3704:R,R} +tpx{s<182:mfm,vpp} +mm{x>1494:slx,sz} +lrm{a<1813:rdj,a>2956:vk,a<2277:qt,nzh} +fzr{x>418:R,s<3682:A,A} +hkb{x>224:qvs,a<3369:R,rxm} +pt{s>3351:R,R} +xhg{s<957:R,R} +mtm{m>1488:A,m>1419:R,A} +nh{m<986:A,R} +msz{x>2122:A,x>1082:A,m<992:A,R} +hk{x<3155:npc,mpb} +xdf{m<1884:R,R} +vz{s>3672:R,sj} +fps{a>512:R,s>1158:R,m<3095:R,A} +bqx{m>2983:R,m>2337:A,m>2020:fzr,R} +lqz{a>163:R,m>1175:hqx,a<77:zrb,A} +dts{x<2728:A,x<3473:A,R} +hvf{s<139:R,m<482:R,m<734:A,A} +pl{a>1712:gx,zdz} +rpx{m<1653:hl,m<2556:lpc,qp} +ht{s>1809:A,s>1779:fd,R} +hhk{a<2872:qpv,nz} +dx{m<3625:R,x>2757:A,m<3826:A,A} +shz{x>694:jb,a>1411:A,x>244:krl,A} +xz{a>2779:A,R} +fz{a>475:R,R} +sdp{a>1363:A,R} +knd{a<2848:R,s>3383:jbr,xj} +gmm{s<1779:A,x>1234:A,m>345:A,R} +nxd{m<2019:kcf,x<633:hkb,fc} +fbc{x<750:A,a>1007:R,x<1082:A,R} +gpr{s>154:A,R} +xpj{x>3136:R,x>2671:mtm,zfq} +lpc{x>1928:R,m<2171:jk,A} +hq{a<277:A,R} +fhg{x<1615:R,A} +vsx{x>569:A,R} +qp{a>1091:A,s<3428:xnh,x>2584:R,qft} +mmm{m<3811:R,cjz} +glr{x<3098:R,R} +bht{x<1209:A,a>1367:kxq,R} +prj{x<2013:mb,m>2087:vmh,m<1061:dnh,gb} +dd{a>306:A,A} +kpq{m<2914:rxh,s>1966:nlz,R} +vmv{a<449:cjm,a>634:rll,x<1892:nzz,xpj} +xzg{x<2275:ncc,A} +zdz{a>1510:R,A} +pjn{m>1910:qfh,A} +qd{a>320:A,A} +cp{a<2845:A,x<2968:R,R} +jm{s<3150:rj,a>3314:bqx,s>3614:qqz,knd} +jz{x<3226:A,lhh} +mxp{s>81:R,x>3750:A,m>3590:A,R} +gb{s>2072:A,s<1981:A,x<3200:lhs,R} +vfq{m>2153:R,a<643:dc,a<792:gpr,cl} +trh{m>3392:A,x>2988:R,R} +tdr{s<2570:A,R} +dmr{m<1256:R,A} +qkg{a>713:R,x>867:A,a<643:A,R} +xc{x>2770:R,a<2515:A,s<1259:R,A} +tmp{a>1809:R,a>942:R,A} +bgl{s>1660:A,m>1423:R,s<1630:R,A} +kc{x>2390:bf,x<1059:pvh,x<1895:A,R} +tc{s>2511:R,a<1074:R,R} +lkh{x<3836:R,x>3940:jv,sn} +bjm{s>342:R,a>3165:A,m>1808:R,R} +hhr{m<2980:cc,m>3577:kc,s<184:jsj,gc} +zgp{x<2034:nx,pjn} +sx{x>306:A,a<2711:A,m<850:A,R} +lqg{x>2351:rld,a<3099:A,A} +bv{s<2491:A,m<249:R,A} +ft{a>1886:xjd,s<3269:pl,x<1697:bp,np} +xkb{s>3481:R,s<3263:A,a>2939:zn,pt} +mgh{x<1518:A,x>2108:R,A} +jjj{m<1876:thc,x>3613:gm,x>3437:bt,cnj} +fd{a>3430:R,x<2979:A,A} +tf{s<2703:nj,a>1224:ftr,a<1106:R,jgm} +zm{m<849:R,s>2341:A,m<1280:A,R} +nch{s<1100:R,R} +vq{s<1933:A,x<1561:R,R} +cbh{a>623:A,x<523:A,A} +rdj{s>1550:jbf,s<1497:R,a>932:A,R} +gcn{a<1424:R,R} +jzj{s<1171:hb,slf} +mxk{s<1062:R,s>1266:A,R} +vhf{a<2740:jjl,R} +lj{a<934:pg,m>2585:kng,gxb} +pq{m>2513:R,A} +vl{m<2010:R,s<2957:qkg,x<1175:zd,R} +ld{a<2237:mvv,fxj} +bgx{s<3944:R,A} +cqr{x<3595:R,x>3795:A,x<3671:A,A} +bx{x>636:gfl,s<983:vhf,ff} +rs{x>1579:R,a>3475:A,s>2511:R,A} +sz{s>3646:R,R} +pmn{x>1539:A,A} +gvt{a<546:sgp,a>695:hdl,x<1233:hr,vz} +jsj{s<105:A,a<1240:nsj,x<1500:A,R} +mdk{s<130:R,a<563:R,A} +jmx{a>603:R,s<41:A,A} +vcp{m>730:qg,R} +cl{a<836:A,R} +qjp{s<283:R,x>803:R,a<2283:A,A} +cqt{m>417:A,m>266:R,x>2900:R,A} +kf{s<3586:lf,s<3846:kv,zf} +qdl{m>1930:pc,x<1509:vcp,pv} +mc{m<2937:R,s<1930:A,a>390:A,R} +sxl{a<340:xxv,a<621:sbk,x<891:bb,qjf} +jv{s>1529:A,a<2108:A,s<1494:A,A} +zsj{x>2818:A,a>2925:bdp,A} +lz{x<1604:dk,s>880:vnf,m>954:vxx,ccc} +zk{a<1521:R,s<1702:R,R} +xnh{x>2153:R,s<3238:R,x<914:R,R} +kcz{s>2296:hhk,prj} +gr{x<1259:A,s<776:R,a<2702:A,A} +ssm{a<734:A,R} +vgs{x>1485:cb,a>1244:shz,jn} +jf{x>1956:R,A} +bhz{s<2114:gcv,gt} +rj{s>2827:R,m>3227:gf,m>2511:R,A} +hn{a>386:gvs,lqz} +fc{x>865:zmz,xk} +lnm{a>2827:rv,s>3525:px,m<2330:fbj,A} +vd{a<1181:R,s>2382:A,R} +gmx{a>638:vzl,x>2091:ckk,cqf} +rsg{a<432:A,m>392:R,R} +slf{a<1236:qtb,sdp} +vbr{m<712:R,a>785:A,x>1393:R,R} +gp{m>2108:R,A} +kx{s>1974:A,m<941:R,x>2212:A,R} +tpr{s<402:R,R} +vfb{x>1558:zgl,rpk} +qtb{a<1126:A,x<1551:A,A} +vfv{m<2751:A,a>792:R,x>3384:R,A} +rv{s>3267:A,a>3050:R,A} +jqh{m<2802:R,x>1517:A,m>3555:R,R} +zrb{a<29:A,A} +qvs{a>3460:A,R} +xfc{m>1552:xc,m<1118:vtj,m<1343:dts,qdv} +ghz{s<2396:R,R} +mv{s<859:A,R} +nb{a>311:A,m<2508:A,R} +dp{x>2605:R,x>2179:A,A} +dg{a>3288:jz,x<2829:nmv,cf} +lmt{a>1859:A,x<3172:A,m<3051:R,A} +hbx{s<1132:A,s>1343:R,mjk} +fb{x>1481:khb,m<566:vs,lgp} +ltt{m<1817:A,x>2809:R,A} +lng{m<1451:fnz,dvf} +sp{a<3159:A,m<3061:R,x>3524:R,A} +cn{s<3359:R,A} +jgk{s>647:R,x>2716:A,A} +vnf{x>1731:lqp,m>1250:lqs,R} +kd{x>3161:A,x>2922:A,R} +jsb{a<2292:R,s>1782:R,R} +ct{m>893:ck,s>737:ssr,ngx} +xxv{x<960:A,x<1435:R,mf} +ccd{s>2444:tk,a>600:nft,a<355:fjs,hk} +hdp{x<886:R,a<315:R,s>817:A,A} +mcl{x>1479:crk,s>917:mlc,A} +fng{m>1498:A,s>2431:R,A} +qld{a>1781:vvc,s<844:fhg,rp} +vvp{a<1484:A,A} +sg{a>2999:zcm,jpr} +khb{a>410:R,tpr} +kxq{s>301:R,A} +lgk{a>3037:A,a>2390:thv,R} +gss{x<3357:A,A} +vs{s<404:A,a<548:hvg,s>482:R,lln} +ccv{s<1665:A,a>1628:km,m>875:tr,gmm} +vhc{x<871:R,s>388:R,A} +qn{m>579:R,x>3125:A,x>2759:R,A} +dq{m>1918:A,a<172:R,x>1349:R,A} +bq{a<759:R,a>819:A,s<3288:R,A} +mjk{a<3562:R,a<3716:A,A} +cjm{m<1454:R,s<187:A,a<256:dl,fjh} +xk{a<3463:R,x>754:R,a>3650:A,R} +vj{a>3232:mcl,s<598:lqg,xqb} +zbk{m<1827:sg,x>1184:db,jm} +ndd{m<3911:A,a>3080:A,a<2996:R,R} +tnf{s<961:xs,x>1532:A,m>3522:A,cqb} +znr{s<597:R,s<666:R,R} +np{x>2742:fxk,A} +xpd{x>3136:A,a>2086:A,x>2997:R,R} +hdl{s>3542:gz,x>944:hs,bbd} +nft{x<3396:R,m>3126:vd,pq} +pr{a>419:A,a>243:R,A} +fgr{a>1184:R,s<2567:A,s<2590:R,lhr} +vdf{s<3350:A,A} +xs{a<3237:R,s>338:R,m<3679:R,R} +mfm{x<3090:df,nxf} +nzz{s<331:mdk,s>409:R,A} +tr{s<1743:R,x>936:A,x>362:A,R} +sbf{s>2521:R,R} +pzp{a<1728:R,R} +glk{a>351:A,x>867:A,A} +jpg{m<3010:R,m<3478:R,s>1647:R,A} +spz{a>2607:A,s>1333:A,a<2305:A,R} +gt{s>2151:A,m>2995:R,A} +ff{a>3010:A,m>1179:bz,lcn} +cvk{a<1930:qh,cgg} +gfl{s<1019:A,x>840:R,A} +xrr{x<631:R,R} +lvv{s<881:txh,x<2522:tng,s<1109:vfv,kvg} +ts{a<1524:A,A} +hl{s<3584:jx,s<3771:A,a<1065:msz,R} +cqf{s>350:ctm,s<182:A,A} +cm{x>2056:A,x>1026:R,a<946:A,R} +ll{x>459:nc,a>945:R,R} +hs{a>784:R,m>1014:R,R} +lqs{m<1973:A,m<2168:R,m>2340:A,A} +lbs{s>1323:A,m>718:R,A} +px{m<2194:A,a>2538:R,a<2365:A,R} +pd{m<476:A,s<1186:R,x<2630:R,A} +kcn{a<355:vfb,s>570:mpj,m<2618:ndm,gmx} +lc{x>3258:tcp,x<2482:hvf,m<507:R,A} +lhg{m<567:A,rgh} +gcv{x>597:R,m>3047:R,m>2314:R,A} +cth{m>2292:R,A} +pf{m<1678:A,x<2338:A,A} +hvj{a>2790:R,x<2727:R,a<2232:A,R} +bpt{x<2602:R,R} +qqc{m<3472:cn,A} + +{x=1691,m=2832,a=1861,s=2722} +{x=1323,m=500,a=189,s=322} +{x=1650,m=26,a=322,s=1579} +{x=1176,m=1444,a=470,s=100} +{x=1714,m=1825,a=3429,s=1961} +{x=1107,m=133,a=36,s=1487} +{x=46,m=997,a=1512,s=1304} +{x=11,m=194,a=215,s=1000} +{x=921,m=2809,a=544,s=1593} +{x=202,m=203,a=40,s=104} +{x=1232,m=2102,a=666,s=679} +{x=70,m=350,a=94,s=264} +{x=2037,m=1015,a=3001,s=1221} +{x=96,m=540,a=686,s=138} +{x=1186,m=2459,a=470,s=3194} +{x=1144,m=59,a=3193,s=520} +{x=254,m=2234,a=1119,s=5} +{x=2979,m=154,a=1684,s=2303} +{x=573,m=138,a=1567,s=2914} +{x=361,m=143,a=1163,s=2996} +{x=1412,m=1218,a=1248,s=1255} +{x=583,m=1,a=133,s=1203} +{x=205,m=964,a=95,s=460} +{x=763,m=60,a=126,s=1095} +{x=1328,m=2904,a=67,s=76} +{x=1155,m=27,a=254,s=977} +{x=131,m=2544,a=368,s=298} +{x=1002,m=507,a=1287,s=224} +{x=349,m=1553,a=502,s=2106} +{x=1550,m=1556,a=1485,s=171} +{x=1390,m=330,a=235,s=516} +{x=1322,m=1984,a=98,s=182} +{x=472,m=449,a=28,s=3333} +{x=296,m=447,a=588,s=1863} +{x=325,m=2557,a=346,s=843} +{x=529,m=44,a=211,s=736} +{x=2226,m=444,a=179,s=194} +{x=155,m=584,a=5,s=461} +{x=595,m=1586,a=650,s=527} +{x=24,m=34,a=1084,s=1187} +{x=1157,m=1256,a=14,s=232} +{x=2423,m=60,a=1070,s=3013} +{x=2336,m=393,a=26,s=112} +{x=3260,m=227,a=1312,s=163} +{x=2094,m=75,a=43,s=1741} +{x=270,m=2166,a=964,s=45} +{x=1742,m=4,a=574,s=752} +{x=1839,m=189,a=503,s=796} +{x=1047,m=163,a=983,s=660} +{x=389,m=2269,a=1453,s=55} +{x=632,m=245,a=114,s=1752} +{x=30,m=195,a=483,s=90} +{x=2307,m=13,a=637,s=2864} +{x=1790,m=122,a=1979,s=482} +{x=16,m=296,a=2426,s=2718} +{x=88,m=2106,a=1744,s=18} +{x=614,m=258,a=1792,s=675} +{x=464,m=128,a=1600,s=540} +{x=1466,m=10,a=1698,s=337} +{x=1368,m=84,a=1120,s=737} +{x=163,m=20,a=746,s=795} +{x=2331,m=12,a=4,s=49} +{x=466,m=121,a=63,s=1424} +{x=635,m=1239,a=1074,s=519} +{x=954,m=372,a=648,s=1565} +{x=1508,m=102,a=2749,s=293} +{x=81,m=332,a=104,s=1926} +{x=3211,m=2227,a=899,s=1027} +{x=866,m=2067,a=564,s=256} +{x=681,m=2466,a=724,s=1192} +{x=425,m=2176,a=406,s=1763} +{x=72,m=946,a=115,s=1000} +{x=71,m=469,a=589,s=115} +{x=2161,m=173,a=707,s=2988} +{x=1580,m=2347,a=396,s=672} +{x=1503,m=271,a=59,s=324} +{x=2420,m=1038,a=217,s=2948} +{x=1784,m=196,a=2399,s=42} +{x=1097,m=1284,a=110,s=51} +{x=3122,m=1207,a=49,s=419} +{x=180,m=779,a=1846,s=138} +{x=734,m=1765,a=1674,s=831} +{x=266,m=25,a=20,s=1442} +{x=1783,m=369,a=2218,s=766} +{x=199,m=19,a=385,s=9} +{x=86,m=212,a=51,s=74} +{x=688,m=671,a=108,s=1025} +{x=1647,m=1964,a=94,s=2255} +{x=9,m=1553,a=466,s=511} +{x=17,m=409,a=411,s=708} +{x=215,m=337,a=213,s=1380} +{x=20,m=521,a=2612,s=1753} +{x=113,m=44,a=528,s=2022} +{x=1396,m=139,a=960,s=1355} +{x=2537,m=2042,a=1731,s=1287} +{x=300,m=1552,a=298,s=266} +{x=1449,m=266,a=711,s=755} +{x=448,m=11,a=1075,s=2561} +{x=863,m=2396,a=795,s=921} +{x=278,m=1351,a=1235,s=77} +{x=715,m=803,a=847,s=541} +{x=23,m=3078,a=501,s=42} +{x=1801,m=2452,a=973,s=2206} +{x=1511,m=392,a=2747,s=58} +{x=937,m=1197,a=619,s=468} +{x=1938,m=915,a=154,s=277} +{x=176,m=1129,a=171,s=509} +{x=140,m=1418,a=1834,s=576} +{x=503,m=545,a=2640,s=1237} +{x=2055,m=3326,a=141,s=2} +{x=177,m=965,a=69,s=508} +{x=47,m=361,a=1507,s=1463} +{x=1220,m=1580,a=1733,s=34} +{x=1816,m=705,a=1208,s=14} +{x=125,m=1578,a=511,s=495} +{x=328,m=172,a=2514,s=536} +{x=826,m=1399,a=588,s=1265} +{x=817,m=1535,a=80,s=17} +{x=129,m=642,a=136,s=619} +{x=1793,m=2369,a=2431,s=7} +{x=1707,m=382,a=2194,s=147} +{x=188,m=504,a=625,s=1200} +{x=113,m=2415,a=1774,s=1899} +{x=624,m=398,a=44,s=1465} +{x=1139,m=254,a=769,s=667} +{x=152,m=6,a=307,s=566} +{x=16,m=1022,a=491,s=299} +{x=1893,m=706,a=7,s=560} +{x=1309,m=647,a=268,s=1017} +{x=470,m=666,a=3080,s=201} +{x=1434,m=1297,a=105,s=1178} +{x=2941,m=651,a=903,s=1667} +{x=917,m=230,a=17,s=938} +{x=1819,m=347,a=30,s=2116} +{x=734,m=440,a=1760,s=203} +{x=31,m=321,a=126,s=607} +{x=1685,m=1380,a=1491,s=2853} +{x=127,m=1344,a=511,s=2273} +{x=1286,m=742,a=504,s=1217} +{x=1897,m=1684,a=181,s=2429} +{x=1168,m=549,a=1420,s=2295} +{x=485,m=1818,a=1715,s=1043} +{x=1590,m=2520,a=403,s=1694} +{x=493,m=3088,a=945,s=23} +{x=201,m=1021,a=406,s=358} +{x=475,m=2228,a=942,s=34} +{x=2569,m=117,a=1121,s=401} +{x=1342,m=187,a=318,s=619} +{x=307,m=717,a=752,s=407} +{x=27,m=3660,a=2557,s=2584} +{x=1827,m=592,a=89,s=1472} +{x=346,m=197,a=2899,s=1044} +{x=375,m=641,a=424,s=2181} +{x=456,m=400,a=96,s=782} +{x=221,m=975,a=1559,s=30} +{x=50,m=423,a=1902,s=2272} +{x=1542,m=480,a=496,s=888} +{x=1236,m=345,a=10,s=1654} +{x=42,m=392,a=800,s=656} +{x=789,m=42,a=392,s=641} +{x=1141,m=979,a=1581,s=1186} +{x=418,m=290,a=193,s=358} +{x=127,m=2879,a=1135,s=2318} +{x=886,m=356,a=6,s=3111} +{x=44,m=33,a=1345,s=3718} +{x=265,m=2086,a=1608,s=523} +{x=4,m=202,a=1814,s=1290} +{x=3089,m=266,a=438,s=1945} +{x=94,m=84,a=1480,s=778} +{x=1889,m=514,a=66,s=1715} +{x=2542,m=3329,a=507,s=1473} +{x=264,m=1950,a=1045,s=295} +{x=356,m=1479,a=479,s=610} +{x=35,m=2046,a=12,s=1138} +{x=643,m=623,a=5,s=1729} +{x=85,m=1026,a=1223,s=1474} +{x=145,m=1766,a=1872,s=27} +{x=352,m=251,a=1761,s=127} +{x=2810,m=1497,a=2690,s=1472} +{x=91,m=192,a=632,s=2} +{x=1075,m=104,a=372,s=423} +{x=345,m=1334,a=89,s=559} +{x=145,m=117,a=428,s=1215} +{x=1491,m=1643,a=286,s=61} +{x=1811,m=864,a=245,s=806} +{x=158,m=397,a=115,s=245} +{x=155,m=3337,a=389,s=1198} +{x=972,m=728,a=1262,s=2466} +{x=1822,m=1166,a=681,s=816} +{x=24,m=270,a=1509,s=241} +{x=2149,m=259,a=2187,s=880} +{x=1274,m=1312,a=513,s=143} +{x=632,m=1080,a=13,s=67} +{x=21,m=2680,a=2236,s=384} +{x=19,m=680,a=874,s=1306} +{x=252,m=1265,a=589,s=105} +{x=9,m=226,a=1061,s=159} +{x=669,m=682,a=889,s=82} +{x=44,m=264,a=370,s=893} +{x=303,m=1084,a=83,s=195} From b1bfdee3307ea70aee91310d8695a98ce8db7d99 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 19 Dec 2023 17:57:57 +0000 Subject: [PATCH 451/479] 2023: d19: ex1: add solution --- 2023/d19/ex1/ex1.py | 91 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100755 2023/d19/ex1/ex1.py diff --git a/2023/d19/ex1/ex1.py b/2023/d19/ex1/ex1.py new file mode 100755 index 0000000..3c7fd93 --- /dev/null +++ b/2023/d19/ex1/ex1.py @@ -0,0 +1,91 @@ +#!/usr/bin/env python + +import sys +from enum import StrEnum +from typing import NamedTuple + + +class Attribute(StrEnum): + COOL = "x" + MUSIC = "m" + AERODYNAMIC = "a" + SHINY = "s" + + +Part = dict[Attribute, int] + + +class Rule(NamedTuple): + attr: Attribute + cmp: str + n: int + success: str + failure: str + + def apply(self, part: Part) -> str: + COMP = { + "<": lambda x: x < self.n, + ">": lambda x: x > self.n, + } + if COMP[self.cmp](part[self.attr]): + return self.success + return self.failure + + +Workflow = dict[str, Rule] + + +def solve(input: str) -> int: + def parse_rules(rules: list[str]) -> Workflow: + def parse_line(line: str) -> Workflow: + name, rules = line.split("{") + rules = rules[:-1] # Remove trailing '}' + # I translate one rule into a succession of pass/fail transitions + res: Workflow = {} + raw = rules.split(",") + + for i, rule in enumerate(raw[:-1]): + test, success = rule.split(":") + attr = Attribute(test[0]) + cmp = test[1] + n = int(test[2:]) + failure = raw[-1] if (i == len(raw) - 2) else f"{name}_{i + 1}" + rule_name = name if i == 0 else f"{name}_{i}" + res[rule_name] = Rule(attr, cmp, n, success, failure) + + return res + + return { + name: rule for line in map(parse_line, rules) for name, rule in line.items() + } + + def parse_parts(parts: list[str]) -> list[Part]: + def parse_part(line: str) -> Part: + line = line[1:-1] # Remove braces + values = { + Attribute(name): int(n) + for name, n in map(lambda x: x.split("="), line.split(",")) + } + return values + + return [parse_part(line) for line in parts] + + def apply_workflow(part: Part, rules: Workflow) -> bool: + state = "in" + while state not in ("R", "A"): + state = rules[state].apply(part) + return state == "A" + + paragraphs = input.split("\n\n") + rules = parse_rules(paragraphs[0].splitlines()) + parts = parse_parts(paragraphs[1].splitlines()) + return sum(sum(part.values()) for part in parts if apply_workflow(part, rules)) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() From 03f8a5567bd73996435018aafacac88045f5a40d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 19 Dec 2023 17:58:03 +0000 Subject: [PATCH 452/479] 2023: d19: ex2: add input --- 2023/d19/ex2/input | 773 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 773 insertions(+) create mode 100644 2023/d19/ex2/input diff --git a/2023/d19/ex2/input b/2023/d19/ex2/input new file mode 100644 index 0000000..cb9070d --- /dev/null +++ b/2023/d19/ex2/input @@ -0,0 +1,773 @@ +pnv{a<2630:R,A} +qpv{x<1782:fng,x<2737:R,A} +btl{s>2396:A,R} +cq{m<3505:A,m<3705:A,a>1266:R,R} +zf{a<363:xql,bgx} +ncc{m<2660:R,x>1277:A,a<1366:R,R} +xql{x>939:R,x>386:R,R} +sqc{s<2972:A,A} +tdq{s>2439:zq,s<2392:qz,s<2422:gss,gzh} +jjl{s<848:R,A} +sb{m<1868:qx,x>2338:kpq,s>1982:jf,hd} +pc{x>1519:A,s<1677:R,s<1789:R,fn} +xm{m<1795:mm,a>1313:xzg,nt} +qrl{x<2554:tjx,s>1612:cj,sq} +df{a<317:A,s<130:R,s<147:R,R} +spp{x<2189:A,A} +qqz{a>2735:A,m>3070:gv,R} +xf{a<1152:A,a>1282:R,s<1142:A,R} +ktg{m>1334:A,x<3202:A,s<939:R,vkx} +hgv{m<648:vm,a<1062:R,x>1854:qs,A} +gz{s>3829:R,a<800:A,R} +tcp{x>3555:A,R} +jgh{m>2442:xrt,x>1879:ct,dn} +qk{x>2955:ln,m<2753:jl,m>3239:gj,kt} +dzz{s<645:A,mfh} +flz{x<3157:A,x<3324:R,A} +qv{m<1163:R,m>1940:A,R} +qfl{a>574:vl,s>2971:qhx,s<2767:tn,tlj} +mlc{s>1250:A,s>1120:R,m>2730:R,A} +hkh{x>2796:A,R} +jn{m<2451:gp,R} +rgh{a<322:R,A} +jr{m>2821:xsl,a>2413:R,R} +zl{x>773:A,a<1392:xf,R} +ndg{a<3811:A,s<2933:A,a>3880:A,R} +hqz{s<1513:A,R} +tlj{m>1531:jc,hq} +rpk{a<159:mjb,lzh} +brs{x>2340:R,x<1218:R,A} +bh{s>45:rsg,m<630:brs,R} +qhx{a>368:fz,s>3161:tp,dq} +xvk{m<1424:dg,m>2965:rk,mqb} +nmm{a<330:R,a<463:A,a<495:R,R} +nxf{x>3610:A,x>3400:A,x<3264:A,R} +ghp{x>1386:jr,lg} +slx{s>3458:A,s<3251:A,R} +crk{s<759:A,m<2715:R,A} +mvm{s>285:fb,s<96:mt,x<1994:sxl,tpx} +gd{a>1402:ft,s<3094:mtv,a<1203:rpx,xm} +bt{a>1843:sp,m<2632:dj,R} +xp{x>502:R,s>2643:A,A} +nf{s<2944:A,a<1266:R,m>2113:R,A} +fbj{m<1833:A,s>3143:A,A} +lp{m>2247:A,x<2896:A,s>1662:A,A} +xl{s>1633:R,s<1562:R,s<1604:A,R} +zjd{x>2566:R,s>3638:R,x<2076:R,R} +qft{a>993:A,m<3431:R,A} +tn{x>1053:fr,s>2699:A,s>2661:nb,xp} +ggd{a>690:R,s<374:R,s>490:A,A} +bg{s<1514:hh,x<3785:R,m<1098:bsv,R} +mk{s>2443:R,a>142:ghz,s<2371:A,hm} +qjf{s<209:zt,s>250:ssm,m<402:R,vbr} +lf{s<3464:A,xb} +mfh{s>975:A,R} +jbf{a<1178:R,m<1644:A,R} +hqx{a<75:A,R} +mt{a>517:rlg,a<337:tgr,bh} +kp{x>243:R,x>162:A,R} +jjd{a>227:R,A} +vzl{m>3320:R,a>747:A,ggd} +bqf{x<392:fj,jld} +lq{x>2656:R,A} +gnx{a<1409:R,x>2669:R,R} +sbk{s>176:kzc,s<134:R,vn} +ftd{m>3310:A,R} +mtv{s>2818:srk,tf} +hvg{a<184:A,a>361:R,m>353:R,A} +dnh{s<2051:hvj,xz} +rk{a>3410:lvm,s<3154:rpq,m<3319:xkb,zb} +bbd{m<1648:R,R} +vn{x<1218:R,R} +rxm{m<3037:A,a<3652:A,a<3783:A,R} +lhr{x<977:R,s<2606:R,a>1061:R,R} +bz{x>356:R,A} +gvs{s>227:R,A} +rxh{s<1996:R,s>2027:R,s>2007:R,A} +vvc{x<2607:R,s<513:xln,s<846:lk,A} +qc{s>2515:tdr,s<2409:R,mgh} +vtj{s<1147:R,s<1283:A,x>2934:A,A} +zt{s>139:R,x>1411:R,s>118:R,R} +dqz{s<1321:A,a<2606:R,a<2895:R,A} +rp{m>2386:R,R} +lt{s>2777:R,s>2705:R,A} +dl{s>312:A,a>137:R,s>259:A,A} +qz{a>663:zm,a>409:kd,R} +nzh{x<3109:xq,a<2613:R,x<3252:ss,R} +nlz{x>3224:A,A} +fkx{x<2574:R,s>960:fps,A} +qh{m>1152:R,a>680:R,s>1682:tg,pr} +hrm{a>546:xhg,m>879:ktg,s>1067:lhg,sl} +hd{a<938:mc,x<1690:vq,R} +szr{m>1603:kcn,s>531:cbn,m<1033:mvm,ch} +jc{s<2856:R,x<1048:A,A} +dj{a>950:A,s<1785:R,m<2205:A,A} +cj{x>3311:jjj,s>1751:pz,m<1872:cvk,qk} +kt{x>2694:tmp,m>2949:R,a>1543:R,A} +xjd{s<3105:A,a>2050:R,m>1463:A,A} +cgg{m<625:R,bgl} +ls{a>475:A,A} +jpr{x<736:sx,s<3350:A,jsk} +dvf{a>1537:qld,s>964:jzj,s<422:hhr,vgs} +tth{m>461:A,m>282:A,m>170:R,R} +hj{s>3109:R,a<124:R,s<2949:A,A} +tng{a>751:A,s>1079:A,x<1326:A,R} +ngx{s<384:lc,dp} +nc{s<1916:A,a>1035:R,s<1922:R,R} +mf{s<205:R,a>166:A,a>94:A,A} +vrr{a>2625:A,x<2277:R,R} +vxx{x>1741:bjm,m>1905:R,m>1559:A,A} +jt{x>3716:R,x>3650:R,R} +lhs{x>2681:A,a<2540:R,R} +lcn{m>755:A,s>1214:R,m<469:R,A} +lln{s<445:R,m<268:R,s<461:A,A} +hm{x>1734:R,s<2410:A,A} +mp{m<711:lkj,A} +nj{m>1713:A,m<1125:A,A} +cb{m<3049:jgk,x>2784:R,R} +krl{a>1348:A,s<628:R,R} +sh{a>1276:R,R} +fn{a>3050:A,a<2792:A,A} +bb{s<163:vsx,s<243:dld,A} +bc{a>2046:jgh,a>914:lng,szr} +lk{x<3283:A,a<1900:R,A} +sl{x<3264:hkh,s>715:cqr,x<3740:znr,nmm} +mq{m<526:bqr,dzf} +vdn{a>790:A,m>2018:R,a>456:mx,A} +cjz{s<832:R,x<1390:R,A} +chn{m<1834:bg,lkh} +bcc{x>917:A,R} +jrf{s>473:xtn,s>424:A,s<393:R,hps} +xpn{x<3290:spz,x>3623:stf,m<764:dqz,A} +fxj{x>1787:xvk,zbk} +nt{m>2968:cq,m>2511:R,sh} +fjh{a>330:A,m>1524:A,m>1492:R,A} +xq{s<1556:R,m>1439:A,A} +km{s>1752:R,R} +qg{a<3374:A,a<3747:A,A} +ps{a>666:R,x<3515:A,m<1018:R,A} +ctm{m<3241:A,R} +gf{s>2707:A,R} +vrp{m<952:pd,A} +in{s>2630:ld,s>1462:nkf,bc} +kzc{m<484:R,m>687:A,A} +rfl{s>2193:kr,x>1357:fm,m<1863:cg,bhz} +rll{s>336:R,s<201:bpt,x<2238:kg,zbx} +bm{x>1200:btl,a>1179:jj,mjv} +tp{m>1670:A,s>3243:R,m>1085:R,R} +mjb{a>58:R,m>2431:A,m<2129:R,R} +ch{m>1301:vmv,hn} +nrn{s>2068:rfl,x<1344:vmk,sb} +thc{s>1780:R,s>1682:phd,pzp} +cnd{x<3374:A,R} +csm{a>446:xrr,a<189:nh,x>450:hdp,pb} +fpl{a>1650:kcz,s<2305:nrn,x>2628:dmx,lj} +dvp{x>2084:lr,s<3287:qfl,m>2644:kf,gvt} +qfh{m<3214:R,x<2287:A,A} +vk{a<3396:hqz,s<1560:qj,s<1592:R,flz} +mx{s>1971:A,x>477:R,s<1954:R,R} +fj{s<303:kp,s<476:R,m>1310:R,R} +qj{s<1527:A,A} +lkj{m<432:A,m>577:R,m<510:R,A} +srk{x<1497:A,a>1169:nf,a>1049:pf,A} +lzh{s>537:A,x>965:A,A} +zq{s<2562:A,x<3107:xv,s>2592:A,R} +lg{m<2702:R,x>582:mv,A} +zcm{a>3555:vdf,s<3451:A,cpm} +dxb{x<3257:rb,x>3685:R,m<2129:ps,bq} +sk{s>1525:R,A} +sn{x<3897:R,s>1539:A,s>1507:A,A} +dmx{m>2059:ccd,tdq} +xvn{m<351:R,x>2393:R,R} +vvd{x>2974:zp,R} +lcc{m>3177:A,s>2384:A,A} +cc{x>2435:A,s<191:ql,R} +pm{a<1388:R,s>2500:R,m>1439:A,ts} +hb{x<2496:R,m<2726:R,x<3383:A,nch} +zgl{s<635:lq,x>3156:pfq,cdz} +mr{x>1745:vrp,zl} +vpp{s<242:tth,s>257:qd,A} +lnk{m<2592:qtm,R} +jbr{x>788:R,x<474:R,s>3470:A,R} +qdv{x>2652:A,m>1433:R,R} +spg{s<2353:R,x>1228:A,x<750:R,A} +lvb{a<473:R,x<3266:R,m<939:A,A} +jrj{m>3129:A,a>662:R,R} +fm{s>2117:R,s<2092:vhn,x<2631:A,A} +ndm{s>365:jrf,vfq} +pv{x>1589:zfz,A} +ckk{s>236:bk,m<3187:A,x<3279:dx,mxp} +pg{a<339:mk,m<2499:qc,ftd} +npc{a>466:A,R} +db{x<1464:lnk,crf} +qx{x<3100:kx,m<1031:R,dgq} +zfq{a>524:A,A} +fjs{x>3200:R,a<146:A,x>2874:lcc,jjd} +zp{a>1395:A,A} +lvm{s<3328:trh,m>3505:R,ghj} +kng{s<2493:bm,m>3452:xgh,fgr} +qq{s>2432:R,A} +mb{m>1445:bcc,a<2795:R,A} +hr{m>1150:R,m>443:cbh,a<640:A,A} +rqn{x>2195:A,a<1290:A,x>1119:R,R} +thv{x>2809:A,x>2419:A,m<571:R,R} +ssr{s<1168:lgk,m<559:dh,a>3139:lbs,xpn} +kg{s>272:R,m<1454:A,R} +dn{x>1084:lz,s>593:bx,bqf} +cf{m<639:A,s<3221:pp,x>3541:ds,fvc} +pp{a<2936:R,x>3345:A,R} +td{a<1277:hgv,x<2074:bht,s>306:gcn,vvd} +cg{x>672:R,R} +fxk{x<3348:A,A} +xtn{m>2134:A,x<1811:A,m>1892:A,A} +tg{m>673:A,m<314:A,R} +kcf{x>608:R,x<205:ntp,R} +tgz{a>1754:A,R} +qt{x>2921:xpd,a>1995:xdf,x<2722:sk,ltt} +dld{x<494:A,s<199:R,R} +mjv{m<3208:A,m<3702:R,s>2384:A,A} +hps{m>2250:R,s<405:R,a<599:A,A} +kjh{a>3337:R,m<464:A,s>1385:A,R} +pz{a>2318:ht,vvp} +rc{s<262:R,x>811:R,A} +ds{x<3721:R,s>3699:R,s>3476:R,A} +ntp{x<77:R,R} +jld{m>951:R,a>3233:rc,a<2643:qjp,A} +mpj{a<666:fkx,lvv} +zfz{x<1630:R,x<1657:R,A} +ck{s<962:zsj,a>3138:hbx,xfc} +bk{m>3452:R,R} +cnj{s>1763:A,a>2468:cnd,s>1690:R,A} +zcz{m<2232:R,s<1682:A,A} +zbx{m>1431:A,x<2914:A,s<258:A,A} +crf{x>1600:R,s<3236:sqc,jqh} +lr{a>481:dxb,m<2629:lpq,x<3259:dd,qqc} +vkx{s<1200:R,a<261:A,R} +qtm{s<3529:R,a<3184:A,m>2279:A,A} +nmv{m>768:R,A} +brt{m>354:R,s<493:R,s<646:R,R} +pzd{a<855:zcz,m<1853:ccv,m<3101:zk,hmd} +sgp{s>3593:R,x<813:A,R} +kvg{m>2928:R,R} +ckp{m>3627:A,R} +dgq{x>3537:R,R} +rlg{x>1387:cqt,m>554:R,a>654:A,jmx} +xgh{s>2546:R,a>1311:A,tc} +sj{a>643:R,a>585:A,x>1738:R,R} +mqb{a<3391:lnm,s>3381:qr,njj} +jgm{s>2750:R,R} +lqp{s>1248:A,R} +gc{m>3241:rqn,m<3136:R,m<3179:R,qkb} +lgp{m>866:A,m>755:A,m>671:ls,vhc} +kvl{x<1422:A,a>3024:A,R} +cdz{a>137:R,R} +rld{a>2992:R,x>2926:A,R} +jj{m>3310:A,m<2977:A,A} +njj{a<3680:cth,ndg} +pfq{m>3025:A,a>193:R,a<87:R,A} +rpq{s<2866:lt,m>3459:cp,pnv} +qkb{x<2298:R,a<1313:R,m<3212:R,A} +jsk{a>2739:A,A} +szz{s>2350:A,A} +xj{s<3270:R,m<2735:A,m>3433:A,R} +jb{s>716:R,x<1196:R,R} +mvv{a>908:gd,dvp} +rfv{s>1017:hrf,x>1232:mp,csm} +hrf{a>604:R,x>1186:R,x<617:kz,glk} +gxb{s<2420:vx,pm} +lhh{m<657:R,x<3667:A,A} +pb{a<287:A,R} +bp{a>1592:ppj,R} +xqb{x>1364:ngd,x<772:mxk,R} +ln{s<1690:lmt,A} +kk{m>3273:A,a<867:R,A} +nx{m>2232:jpg,A} +gx{a>1776:R,R} +xv{a>580:R,A} +dk{m<1515:gr,kvl} +hgl{a>2798:tnf,m>3465:mmm,dzz} +vm{s<397:R,x>2464:A,A} +nkf{s>1890:fpl,qrl} +bsv{a>1977:A,A} +cbn{x>2136:hrm,rfv} +gzh{a<955:lvb,a>1251:qq,x<3426:R,A} +cpm{x<850:A,A} +phd{a<1873:R,R} +ccc{x<1738:A,a>2960:brt,A} +nz{m>1580:A,m>535:rs,a<3608:xvn,bv} +hmd{a<1503:R,x>1671:xl,A} +qs{s>337:R,A} +tjx{a<2514:pzd,x<1218:nxd,x>1675:zgp,qdl} +dzf{m<883:R,s<268:dmr,tgz} +dh{s<1310:A,m>372:kjh,glr} +gj{x<2764:R,ckp} +fr{s<2699:A,m<1878:A,A} +vmk{s>1989:fbc,s<1935:ll,vdn} +vmh{s<2090:A,A} +ss{a>2750:A,A} +bqr{a<1774:A,m<177:R,R} +jk{a<1028:R,s>3587:R,a>1091:R,A} +xln{a>1888:R,s>294:R,R} +zmz{x>1081:R,A} +mpb{s>2362:R,a<467:R,R} +zd{s>3154:R,s>3055:A,A} +nsj{x<1701:A,a>1055:A,A} +xsl{s>511:A,s<282:R,a<2317:R,R} +tgr{m>684:A,s<48:A,pmn} +ghj{s<3589:R,x>2695:R,m>3158:R,A} +kr{s<2240:R,m<2537:qv,m<3458:R,cm} +jx{s>3380:A,a>1102:A,s>3274:A,R} +ngd{m<2862:R,A} +vhn{a<1080:A,s<2081:A,s<2087:A,R} +gm{a<1387:jrj,a<3054:jsb,x>3816:R,jt} +qr{s<3607:R,s>3740:R,s<3694:zjd,A} +sq{x>3517:chn,lrm} +jl{x>2790:lp,m>2443:gnx,A} +cqb{m<3291:R,m<3385:R,x<942:R,A} +ql{x<1292:R,m<1982:R,x>1755:R,R} +fnz{s>792:mr,a<1529:td,mq} +xb{s<3532:R,s<3567:A,A} +bdp{a<3499:A,m<1904:A,m>2112:R,R} +gv{x>604:R,s>3769:R,a>2546:A,R} +fvc{a>2712:R,A} +hh{s>1493:A,a>1779:A,R} +ftr{x>2560:A,x<1662:R,x>2139:R,A} +lpq{a<194:hj,m<1056:qn,m<1753:R,A} +rb{x<2494:R,A} +txh{a<796:A,a>847:A,m>2443:R,A} +tk{m<3086:sbf,m>3574:R,kk} +pvh{a<1254:A,A} +ppj{m>2232:A,a<1757:A,x>812:R,R} +vx{m>1190:szz,spg} +kz{a>230:A,s>1293:A,R} +stf{s<1343:R,R} +xrt{m>3080:hgl,a>2847:vj,ghp} +bf{a<1198:A,A} +zb{x>2686:A,a<2867:vrr,m>3738:ndd,spp} +dc{x<2379:R,a>457:A,R} +zn{a<3249:R,m<3107:R,m>3180:R,A} +kv{s>3704:R,R} +tpx{s<182:mfm,vpp} +mm{x>1494:slx,sz} +lrm{a<1813:rdj,a>2956:vk,a<2277:qt,nzh} +fzr{x>418:R,s<3682:A,A} +hkb{x>224:qvs,a<3369:R,rxm} +pt{s>3351:R,R} +xhg{s<957:R,R} +mtm{m>1488:A,m>1419:R,A} +nh{m<986:A,R} +msz{x>2122:A,x>1082:A,m<992:A,R} +hk{x<3155:npc,mpb} +xdf{m<1884:R,R} +vz{s>3672:R,sj} +fps{a>512:R,s>1158:R,m<3095:R,A} +bqx{m>2983:R,m>2337:A,m>2020:fzr,R} +lqz{a>163:R,m>1175:hqx,a<77:zrb,A} +dts{x<2728:A,x<3473:A,R} +hvf{s<139:R,m<482:R,m<734:A,A} +pl{a>1712:gx,zdz} +rpx{m<1653:hl,m<2556:lpc,qp} +ht{s>1809:A,s>1779:fd,R} +hhk{a<2872:qpv,nz} +dx{m<3625:R,x>2757:A,m<3826:A,A} +shz{x>694:jb,a>1411:A,x>244:krl,A} +xz{a>2779:A,R} +fz{a>475:R,R} +sdp{a>1363:A,R} +knd{a<2848:R,s>3383:jbr,xj} +gmm{s<1779:A,x>1234:A,m>345:A,R} +nxd{m<2019:kcf,x<633:hkb,fc} +fbc{x<750:A,a>1007:R,x<1082:A,R} +gpr{s>154:A,R} +xpj{x>3136:R,x>2671:mtm,zfq} +lpc{x>1928:R,m<2171:jk,A} +hq{a<277:A,R} +fhg{x<1615:R,A} +vsx{x>569:A,R} +qp{a>1091:A,s<3428:xnh,x>2584:R,qft} +mmm{m<3811:R,cjz} +glr{x<3098:R,R} +bht{x<1209:A,a>1367:kxq,R} +prj{x<2013:mb,m>2087:vmh,m<1061:dnh,gb} +dd{a>306:A,A} +kpq{m<2914:rxh,s>1966:nlz,R} +vmv{a<449:cjm,a>634:rll,x<1892:nzz,xpj} +xzg{x<2275:ncc,A} +zdz{a>1510:R,A} +pjn{m>1910:qfh,A} +qd{a>320:A,A} +cp{a<2845:A,x<2968:R,R} +jm{s<3150:rj,a>3314:bqx,s>3614:qqz,knd} +jz{x<3226:A,lhh} +mxp{s>81:R,x>3750:A,m>3590:A,R} +gb{s>2072:A,s<1981:A,x<3200:lhs,R} +vfq{m>2153:R,a<643:dc,a<792:gpr,cl} +trh{m>3392:A,x>2988:R,R} +tdr{s<2570:A,R} +dmr{m<1256:R,A} +qkg{a>713:R,x>867:A,a<643:A,R} +xc{x>2770:R,a<2515:A,s<1259:R,A} +tmp{a>1809:R,a>942:R,A} +bgl{s>1660:A,m>1423:R,s<1630:R,A} +kc{x>2390:bf,x<1059:pvh,x<1895:A,R} +tc{s>2511:R,a<1074:R,R} +lkh{x<3836:R,x>3940:jv,sn} +bjm{s>342:R,a>3165:A,m>1808:R,R} +hhr{m<2980:cc,m>3577:kc,s<184:jsj,gc} +zgp{x<2034:nx,pjn} +sx{x>306:A,a<2711:A,m<850:A,R} +lqg{x>2351:rld,a<3099:A,A} +bv{s<2491:A,m<249:R,A} +ft{a>1886:xjd,s<3269:pl,x<1697:bp,np} +xkb{s>3481:R,s<3263:A,a>2939:zn,pt} +mgh{x<1518:A,x>2108:R,A} +jjj{m<1876:thc,x>3613:gm,x>3437:bt,cnj} +fd{a>3430:R,x<2979:A,A} +tf{s<2703:nj,a>1224:ftr,a<1106:R,jgm} +zm{m<849:R,s>2341:A,m<1280:A,R} +nch{s<1100:R,R} +vq{s<1933:A,x<1561:R,R} +cbh{a>623:A,x<523:A,A} +rdj{s>1550:jbf,s<1497:R,a>932:A,R} +gcn{a<1424:R,R} +jzj{s<1171:hb,slf} +mxk{s<1062:R,s>1266:A,R} +vhf{a<2740:jjl,R} +lj{a<934:pg,m>2585:kng,gxb} +pq{m>2513:R,A} +vl{m<2010:R,s<2957:qkg,x<1175:zd,R} +ld{a<2237:mvv,fxj} +bgx{s<3944:R,A} +cqr{x<3595:R,x>3795:A,x<3671:A,A} +bx{x>636:gfl,s<983:vhf,ff} +rs{x>1579:R,a>3475:A,s>2511:R,A} +sz{s>3646:R,R} +pmn{x>1539:A,A} +gvt{a<546:sgp,a>695:hdl,x<1233:hr,vz} +jsj{s<105:A,a<1240:nsj,x<1500:A,R} +mdk{s<130:R,a<563:R,A} +jmx{a>603:R,s<41:A,A} +vcp{m>730:qg,R} +cl{a<836:A,R} +qjp{s<283:R,x>803:R,a<2283:A,A} +cqt{m>417:A,m>266:R,x>2900:R,A} +kf{s<3586:lf,s<3846:kv,zf} +qdl{m>1930:pc,x<1509:vcp,pv} +mc{m<2937:R,s<1930:A,a>390:A,R} +sxl{a<340:xxv,a<621:sbk,x<891:bb,qjf} +jv{s>1529:A,a<2108:A,s<1494:A,A} +zsj{x>2818:A,a>2925:bdp,A} +lz{x<1604:dk,s>880:vnf,m>954:vxx,ccc} +zk{a<1521:R,s<1702:R,R} +xnh{x>2153:R,s<3238:R,x<914:R,R} +kcz{s>2296:hhk,prj} +gr{x<1259:A,s<776:R,a<2702:A,A} +ssm{a<734:A,R} +vgs{x>1485:cb,a>1244:shz,jn} +jf{x>1956:R,A} +bhz{s<2114:gcv,gt} +rj{s>2827:R,m>3227:gf,m>2511:R,A} +hn{a>386:gvs,lqz} +fc{x>865:zmz,xk} +lnm{a>2827:rv,s>3525:px,m<2330:fbj,A} +vd{a<1181:R,s>2382:A,R} +gmx{a>638:vzl,x>2091:ckk,cqf} +rsg{a<432:A,m>392:R,R} +slf{a<1236:qtb,sdp} +vbr{m<712:R,a>785:A,x>1393:R,R} +gp{m>2108:R,A} +kx{s>1974:A,m<941:R,x>2212:A,R} +tpr{s<402:R,R} +vfb{x>1558:zgl,rpk} +qtb{a<1126:A,x<1551:A,A} +vfv{m<2751:A,a>792:R,x>3384:R,A} +rv{s>3267:A,a>3050:R,A} +jqh{m<2802:R,x>1517:A,m>3555:R,R} +zrb{a<29:A,A} +qvs{a>3460:A,R} +xfc{m>1552:xc,m<1118:vtj,m<1343:dts,qdv} +ghz{s<2396:R,R} +mv{s<859:A,R} +nb{a>311:A,m<2508:A,R} +dp{x>2605:R,x>2179:A,A} +dg{a>3288:jz,x<2829:nmv,cf} +lmt{a>1859:A,x<3172:A,m<3051:R,A} +hbx{s<1132:A,s>1343:R,mjk} +fb{x>1481:khb,m<566:vs,lgp} +ltt{m<1817:A,x>2809:R,A} +lng{m<1451:fnz,dvf} +sp{a<3159:A,m<3061:R,x>3524:R,A} +cn{s<3359:R,A} +jgk{s>647:R,x>2716:A,A} +vnf{x>1731:lqp,m>1250:lqs,R} +kd{x>3161:A,x>2922:A,R} +jsb{a<2292:R,s>1782:R,R} +ct{m>893:ck,s>737:ssr,ngx} +xxv{x<960:A,x<1435:R,mf} +ccd{s>2444:tk,a>600:nft,a<355:fjs,hk} +hdp{x<886:R,a<315:R,s>817:A,A} +mcl{x>1479:crk,s>917:mlc,A} +fng{m>1498:A,s>2431:R,A} +qld{a>1781:vvc,s<844:fhg,rp} +vvp{a<1484:A,A} +sg{a>2999:zcm,jpr} +khb{a>410:R,tpr} +kxq{s>301:R,A} +lgk{a>3037:A,a>2390:thv,R} +gss{x<3357:A,A} +vs{s<404:A,a<548:hvg,s>482:R,lln} +ccv{s<1665:A,a>1628:km,m>875:tr,gmm} +vhc{x<871:R,s>388:R,A} +qn{m>579:R,x>3125:A,x>2759:R,A} +dq{m>1918:A,a<172:R,x>1349:R,A} +bq{a<759:R,a>819:A,s<3288:R,A} +mjk{a<3562:R,a<3716:A,A} +cjm{m<1454:R,s<187:A,a<256:dl,fjh} +xk{a<3463:R,x>754:R,a>3650:A,R} +vj{a>3232:mcl,s<598:lqg,xqb} +zbk{m<1827:sg,x>1184:db,jm} +ndd{m<3911:A,a>3080:A,a<2996:R,R} +tnf{s<961:xs,x>1532:A,m>3522:A,cqb} +znr{s<597:R,s<666:R,R} +np{x>2742:fxk,A} +xpd{x>3136:A,a>2086:A,x>2997:R,R} +hdl{s>3542:gz,x>944:hs,bbd} +nft{x<3396:R,m>3126:vd,pq} +pr{a>419:A,a>243:R,A} +fgr{a>1184:R,s<2567:A,s<2590:R,lhr} +vdf{s<3350:A,A} +xs{a<3237:R,s>338:R,m<3679:R,R} +mfm{x<3090:df,nxf} +nzz{s<331:mdk,s>409:R,A} +tr{s<1743:R,x>936:A,x>362:A,R} +sbf{s>2521:R,R} +pzp{a<1728:R,R} +glk{a>351:A,x>867:A,A} +jpg{m<3010:R,m<3478:R,s>1647:R,A} +spz{a>2607:A,s>1333:A,a<2305:A,R} +gt{s>2151:A,m>2995:R,A} +ff{a>3010:A,m>1179:bz,lcn} +cvk{a<1930:qh,cgg} +gfl{s<1019:A,x>840:R,A} +xrr{x<631:R,R} +lvv{s<881:txh,x<2522:tng,s<1109:vfv,kvg} +ts{a<1524:A,A} +hl{s<3584:jx,s<3771:A,a<1065:msz,R} +cqf{s>350:ctm,s<182:A,A} +cm{x>2056:A,x>1026:R,a<946:A,R} +ll{x>459:nc,a>945:R,R} +hs{a>784:R,m>1014:R,R} +lqs{m<1973:A,m<2168:R,m>2340:A,A} +lbs{s>1323:A,m>718:R,A} +px{m<2194:A,a>2538:R,a<2365:A,R} +pd{m<476:A,s<1186:R,x<2630:R,A} +kcn{a<355:vfb,s>570:mpj,m<2618:ndm,gmx} +lc{x>3258:tcp,x<2482:hvf,m<507:R,A} +lhg{m<567:A,rgh} +gcv{x>597:R,m>3047:R,m>2314:R,A} +cth{m>2292:R,A} +pf{m<1678:A,x<2338:A,A} +hvj{a>2790:R,x<2727:R,a<2232:A,R} +bpt{x<2602:R,R} +qqc{m<3472:cn,A} + +{x=1691,m=2832,a=1861,s=2722} +{x=1323,m=500,a=189,s=322} +{x=1650,m=26,a=322,s=1579} +{x=1176,m=1444,a=470,s=100} +{x=1714,m=1825,a=3429,s=1961} +{x=1107,m=133,a=36,s=1487} +{x=46,m=997,a=1512,s=1304} +{x=11,m=194,a=215,s=1000} +{x=921,m=2809,a=544,s=1593} +{x=202,m=203,a=40,s=104} +{x=1232,m=2102,a=666,s=679} +{x=70,m=350,a=94,s=264} +{x=2037,m=1015,a=3001,s=1221} +{x=96,m=540,a=686,s=138} +{x=1186,m=2459,a=470,s=3194} +{x=1144,m=59,a=3193,s=520} +{x=254,m=2234,a=1119,s=5} +{x=2979,m=154,a=1684,s=2303} +{x=573,m=138,a=1567,s=2914} +{x=361,m=143,a=1163,s=2996} +{x=1412,m=1218,a=1248,s=1255} +{x=583,m=1,a=133,s=1203} +{x=205,m=964,a=95,s=460} +{x=763,m=60,a=126,s=1095} +{x=1328,m=2904,a=67,s=76} +{x=1155,m=27,a=254,s=977} +{x=131,m=2544,a=368,s=298} +{x=1002,m=507,a=1287,s=224} +{x=349,m=1553,a=502,s=2106} +{x=1550,m=1556,a=1485,s=171} +{x=1390,m=330,a=235,s=516} +{x=1322,m=1984,a=98,s=182} +{x=472,m=449,a=28,s=3333} +{x=296,m=447,a=588,s=1863} +{x=325,m=2557,a=346,s=843} +{x=529,m=44,a=211,s=736} +{x=2226,m=444,a=179,s=194} +{x=155,m=584,a=5,s=461} +{x=595,m=1586,a=650,s=527} +{x=24,m=34,a=1084,s=1187} +{x=1157,m=1256,a=14,s=232} +{x=2423,m=60,a=1070,s=3013} +{x=2336,m=393,a=26,s=112} +{x=3260,m=227,a=1312,s=163} +{x=2094,m=75,a=43,s=1741} +{x=270,m=2166,a=964,s=45} +{x=1742,m=4,a=574,s=752} +{x=1839,m=189,a=503,s=796} +{x=1047,m=163,a=983,s=660} +{x=389,m=2269,a=1453,s=55} +{x=632,m=245,a=114,s=1752} +{x=30,m=195,a=483,s=90} +{x=2307,m=13,a=637,s=2864} +{x=1790,m=122,a=1979,s=482} +{x=16,m=296,a=2426,s=2718} +{x=88,m=2106,a=1744,s=18} +{x=614,m=258,a=1792,s=675} +{x=464,m=128,a=1600,s=540} +{x=1466,m=10,a=1698,s=337} +{x=1368,m=84,a=1120,s=737} +{x=163,m=20,a=746,s=795} +{x=2331,m=12,a=4,s=49} +{x=466,m=121,a=63,s=1424} +{x=635,m=1239,a=1074,s=519} +{x=954,m=372,a=648,s=1565} +{x=1508,m=102,a=2749,s=293} +{x=81,m=332,a=104,s=1926} +{x=3211,m=2227,a=899,s=1027} +{x=866,m=2067,a=564,s=256} +{x=681,m=2466,a=724,s=1192} +{x=425,m=2176,a=406,s=1763} +{x=72,m=946,a=115,s=1000} +{x=71,m=469,a=589,s=115} +{x=2161,m=173,a=707,s=2988} +{x=1580,m=2347,a=396,s=672} +{x=1503,m=271,a=59,s=324} +{x=2420,m=1038,a=217,s=2948} +{x=1784,m=196,a=2399,s=42} +{x=1097,m=1284,a=110,s=51} +{x=3122,m=1207,a=49,s=419} +{x=180,m=779,a=1846,s=138} +{x=734,m=1765,a=1674,s=831} +{x=266,m=25,a=20,s=1442} +{x=1783,m=369,a=2218,s=766} +{x=199,m=19,a=385,s=9} +{x=86,m=212,a=51,s=74} +{x=688,m=671,a=108,s=1025} +{x=1647,m=1964,a=94,s=2255} +{x=9,m=1553,a=466,s=511} +{x=17,m=409,a=411,s=708} +{x=215,m=337,a=213,s=1380} +{x=20,m=521,a=2612,s=1753} +{x=113,m=44,a=528,s=2022} +{x=1396,m=139,a=960,s=1355} +{x=2537,m=2042,a=1731,s=1287} +{x=300,m=1552,a=298,s=266} +{x=1449,m=266,a=711,s=755} +{x=448,m=11,a=1075,s=2561} +{x=863,m=2396,a=795,s=921} +{x=278,m=1351,a=1235,s=77} +{x=715,m=803,a=847,s=541} +{x=23,m=3078,a=501,s=42} +{x=1801,m=2452,a=973,s=2206} +{x=1511,m=392,a=2747,s=58} +{x=937,m=1197,a=619,s=468} +{x=1938,m=915,a=154,s=277} +{x=176,m=1129,a=171,s=509} +{x=140,m=1418,a=1834,s=576} +{x=503,m=545,a=2640,s=1237} +{x=2055,m=3326,a=141,s=2} +{x=177,m=965,a=69,s=508} +{x=47,m=361,a=1507,s=1463} +{x=1220,m=1580,a=1733,s=34} +{x=1816,m=705,a=1208,s=14} +{x=125,m=1578,a=511,s=495} +{x=328,m=172,a=2514,s=536} +{x=826,m=1399,a=588,s=1265} +{x=817,m=1535,a=80,s=17} +{x=129,m=642,a=136,s=619} +{x=1793,m=2369,a=2431,s=7} +{x=1707,m=382,a=2194,s=147} +{x=188,m=504,a=625,s=1200} +{x=113,m=2415,a=1774,s=1899} +{x=624,m=398,a=44,s=1465} +{x=1139,m=254,a=769,s=667} +{x=152,m=6,a=307,s=566} +{x=16,m=1022,a=491,s=299} +{x=1893,m=706,a=7,s=560} +{x=1309,m=647,a=268,s=1017} +{x=470,m=666,a=3080,s=201} +{x=1434,m=1297,a=105,s=1178} +{x=2941,m=651,a=903,s=1667} +{x=917,m=230,a=17,s=938} +{x=1819,m=347,a=30,s=2116} +{x=734,m=440,a=1760,s=203} +{x=31,m=321,a=126,s=607} +{x=1685,m=1380,a=1491,s=2853} +{x=127,m=1344,a=511,s=2273} +{x=1286,m=742,a=504,s=1217} +{x=1897,m=1684,a=181,s=2429} +{x=1168,m=549,a=1420,s=2295} +{x=485,m=1818,a=1715,s=1043} +{x=1590,m=2520,a=403,s=1694} +{x=493,m=3088,a=945,s=23} +{x=201,m=1021,a=406,s=358} +{x=475,m=2228,a=942,s=34} +{x=2569,m=117,a=1121,s=401} +{x=1342,m=187,a=318,s=619} +{x=307,m=717,a=752,s=407} +{x=27,m=3660,a=2557,s=2584} +{x=1827,m=592,a=89,s=1472} +{x=346,m=197,a=2899,s=1044} +{x=375,m=641,a=424,s=2181} +{x=456,m=400,a=96,s=782} +{x=221,m=975,a=1559,s=30} +{x=50,m=423,a=1902,s=2272} +{x=1542,m=480,a=496,s=888} +{x=1236,m=345,a=10,s=1654} +{x=42,m=392,a=800,s=656} +{x=789,m=42,a=392,s=641} +{x=1141,m=979,a=1581,s=1186} +{x=418,m=290,a=193,s=358} +{x=127,m=2879,a=1135,s=2318} +{x=886,m=356,a=6,s=3111} +{x=44,m=33,a=1345,s=3718} +{x=265,m=2086,a=1608,s=523} +{x=4,m=202,a=1814,s=1290} +{x=3089,m=266,a=438,s=1945} +{x=94,m=84,a=1480,s=778} +{x=1889,m=514,a=66,s=1715} +{x=2542,m=3329,a=507,s=1473} +{x=264,m=1950,a=1045,s=295} +{x=356,m=1479,a=479,s=610} +{x=35,m=2046,a=12,s=1138} +{x=643,m=623,a=5,s=1729} +{x=85,m=1026,a=1223,s=1474} +{x=145,m=1766,a=1872,s=27} +{x=352,m=251,a=1761,s=127} +{x=2810,m=1497,a=2690,s=1472} +{x=91,m=192,a=632,s=2} +{x=1075,m=104,a=372,s=423} +{x=345,m=1334,a=89,s=559} +{x=145,m=117,a=428,s=1215} +{x=1491,m=1643,a=286,s=61} +{x=1811,m=864,a=245,s=806} +{x=158,m=397,a=115,s=245} +{x=155,m=3337,a=389,s=1198} +{x=972,m=728,a=1262,s=2466} +{x=1822,m=1166,a=681,s=816} +{x=24,m=270,a=1509,s=241} +{x=2149,m=259,a=2187,s=880} +{x=1274,m=1312,a=513,s=143} +{x=632,m=1080,a=13,s=67} +{x=21,m=2680,a=2236,s=384} +{x=19,m=680,a=874,s=1306} +{x=252,m=1265,a=589,s=105} +{x=9,m=226,a=1061,s=159} +{x=669,m=682,a=889,s=82} +{x=44,m=264,a=370,s=893} +{x=303,m=1084,a=83,s=195} From 49dc83b67f6761d449c0b4a0a50d8e99058c1231 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Tue, 19 Dec 2023 17:58:14 +0000 Subject: [PATCH 453/479] 2023: d19: ex2: add solution --- 2023/d19/ex2/ex2.py | 103 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100755 2023/d19/ex2/ex2.py diff --git a/2023/d19/ex2/ex2.py b/2023/d19/ex2/ex2.py new file mode 100755 index 0000000..57fe19f --- /dev/null +++ b/2023/d19/ex2/ex2.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python + +import math +import sys +from collections.abc import Iterator +from enum import StrEnum +from typing import NamedTuple, Optional + + +class Attribute(StrEnum): + COOL = "x" + MUSIC = "m" + AERODYNAMIC = "a" + SHINY = "s" + + +Extant = tuple[int, int] +Extants = dict[Attribute, Extant] + + +class Rule(NamedTuple): + attr: Attribute + cmp: str + n: int + success: str + failure: str + + def apply(self, extants: Extants) -> Iterator[tuple[str, Extants]]: + min, max = extants[self.attr] + win: Optional[Extant] = None + lose: Optional[Extant] = None + match self.cmp: + case "<": + if min < self.n: + win = min, self.n - 1 + if self.n <= max: + lose = self.n, max + case ">": + if min <= self.n: + lose = min, self.n + if self.n < max: + win = self.n + 1, max + for attr, extant in ( + (self.success, win), + (self.failure, lose), + ): + if extant is None: + continue + yield attr, extants | {self.attr: extant} + + +Workflow = dict[str, Rule] + + +def solve(input: str) -> int: + def parse_rules(rules: list[str]) -> Workflow: + def parse_line(line: str) -> Workflow: + name, rules = line.split("{") + rules = rules[:-1] # Remove trailing '}' + # I translate one rule into a succession of pass/fail transitions + res: Workflow = {} + raw = rules.split(",") + + for i, rule in enumerate(raw[:-1]): + test, success = rule.split(":") + attr = Attribute(test[0]) + cmp = test[1] + n = int(test[2:]) + failure = raw[-1] if (i == len(raw) - 2) else f"{name}_{i + 1}" + rule_name = name if i == 0 else f"{name}_{i}" + res[rule_name] = Rule(attr, cmp, n, success, failure) + + return res + + return { + name: rule for line in map(parse_line, rules) for name, rule in line.items() + } + + def explore_workflow(rules: Workflow) -> int: + def recurse(state: str, extants: Extants) -> int: + if state == "R": + return 0 + if state == "A": + return math.prod((max - min + 1) for min, max in extants.values()) + return sum( + recurse(new_state, new_extant) + for new_state, new_extant in rules[state].apply(extants) + ) + + return recurse("in", {attr: (1, 4000) for attr in Attribute}) + + paragraphs = input.split("\n\n") + rules = parse_rules(paragraphs[0].splitlines()) + return explore_workflow(rules) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() From 5a11d5ca5cfb350bdbb23f26083687db5456e8ec Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 20 Dec 2023 11:18:33 +0100 Subject: [PATCH 454/479] 2023: d20: ex1: add input --- 2023/d20/ex1/input | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 2023/d20/ex1/input diff --git a/2023/d20/ex1/input b/2023/d20/ex1/input new file mode 100644 index 0000000..5447f5f --- /dev/null +++ b/2023/d20/ex1/input @@ -0,0 +1,58 @@ +%fl -> tf, gz +%xb -> hl, tl +%mq -> tf, fl +%px -> hl, tm +%dp -> xv +broadcaster -> js, ng, lb, gr +&ql -> rx +%gk -> hm +%vp -> vf, sn +%fp -> xb +&lr -> ss, rm, dc, js, gk, dp, bq +%xl -> gx, lr +%xx -> hb +%cb -> jg +&hl -> nj, lb, tl, xx, hb, fp, mf +%vr -> tf, hq +%bq -> gk +%jg -> qn +%hb -> qk +%qk -> hs, hl +%gz -> tf +%rm -> hj +&tf -> cb, jg, fz, gr, zj, qn, kb +%qn -> td +%js -> lr, dc +%qb -> nc +%zj -> vr +%td -> tf, zj +%tl -> kg +%gx -> lr +%hm -> lr, rd +&fh -> ql +%nj -> xx +%hq -> kb, tf +%kg -> px, hl +%dc -> dp +%vf -> th, sn +&mf -> ql +%tm -> hl +&fz -> ql +%xd -> tn, sn +%ng -> vp, sn +%th -> qb +%rd -> xl, lr +%bt -> xd, sn +%tv -> sn +%nl -> bt +%hs -> fp, hl +%xv -> rm, lr +%tn -> sn, tv +%hj -> lr, bq +&ss -> ql +%sd -> nl +&sn -> sd, fh, th, qb, nl, ng, nc +%kb -> mq +%lb -> nj, hl +%gr -> tf, cb +%nc -> sd From 4ccebd33abc9d26c7f565d7e055bec2687ead645 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 20 Dec 2023 11:18:38 +0100 Subject: [PATCH 455/479] 2023: d20: ex1: add solution --- 2023/d20/ex1/ex1.py | 104 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100755 2023/d20/ex1/ex1.py diff --git a/2023/d20/ex1/ex1.py b/2023/d20/ex1/ex1.py new file mode 100755 index 0000000..7c29abb --- /dev/null +++ b/2023/d20/ex1/ex1.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python + +import enum +import math +import sys +from collections import defaultdict, deque +from typing import NamedTuple + + +class ModuleType(enum.StrEnum): + FLIP_FLOP = "%" + CONJUNCTION = "&" + BROADCAST = "broadcaster" + + +class Pulse(enum.IntEnum): + LOW = 0 + HIGH = 1 + + +class Rule(NamedTuple): + module_type: ModuleType + destinations: list[str] + + +Modules = dict[str, Rule] + + +def solve(input: list[str]) -> int: + def parse_rule(line: str) -> tuple[str, Rule]: + module, outputs = line.split(" -> ") + + name: str + module_type: ModuleType + + if module != "broadcaster": + name = module[1:] + module_type = ModuleType(module[0]) + else: + name = module + module_type = ModuleType(module) + + return name, Rule(module_type, outputs.split(", ")) + + def parse(input: list[str]) -> Modules: + return dict(map(parse_rule, input)) + + def compute_inputs(modules: Modules) -> dict[str, list[str]]: + inputs: dict[str, list[str]] = defaultdict(list) + + for src, rule in modules.items(): + for dst in rule.destinations: + inputs[dst].append(src) + + return inputs + + def count_pulses(modules: Modules, button_pushes: int) -> tuple[int, int]: + inputs = compute_inputs(modules) + total_pulses = {pulse: 0 for pulse in Pulse} + last_pulse: dict[str, Pulse] = defaultdict(lambda: Pulse.LOW) + + for _ in range(button_pushes): + queue: deque[tuple[Pulse, str]] = deque([(Pulse.LOW, "broadcaster")]) + + while queue: + pulse, name = queue.popleft() + total_pulses[pulse] += 1 + mod = modules.get(name) + + # This is for unknown outputs + if mod is None: + continue + + new_pulse: Pulse + match mod.module_type: + case ModuleType.FLIP_FLOP: + if pulse == Pulse.HIGH: + continue + new_pulse = Pulse(1 - last_pulse[name]) + case ModuleType.CONJUNCTION: + high_inputs = all( + last_pulse[input] == Pulse.HIGH for input in inputs[name] + ) + new_pulse = Pulse.LOW if high_inputs else Pulse.HIGH + case ModuleType.BROADCAST: + new_pulse = pulse + + last_pulse[name] = new_pulse + for dst in mod.destinations: + queue.append((new_pulse, dst)) + + return total_pulses[Pulse.LOW], total_pulses[Pulse.HIGH] + + modules = parse(input) + return math.prod(count_pulses(modules, 1000)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 8e31abf2b22caeaa57fd35cb723c63e868c49e26 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 20 Dec 2023 11:18:43 +0100 Subject: [PATCH 456/479] 2023: d20: ex2: add input --- 2023/d20/ex2/input | 58 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 2023/d20/ex2/input diff --git a/2023/d20/ex2/input b/2023/d20/ex2/input new file mode 100644 index 0000000..5447f5f --- /dev/null +++ b/2023/d20/ex2/input @@ -0,0 +1,58 @@ +%fl -> tf, gz +%xb -> hl, tl +%mq -> tf, fl +%px -> hl, tm +%dp -> xv +broadcaster -> js, ng, lb, gr +&ql -> rx +%gk -> hm +%vp -> vf, sn +%fp -> xb +&lr -> ss, rm, dc, js, gk, dp, bq +%xl -> gx, lr +%xx -> hb +%cb -> jg +&hl -> nj, lb, tl, xx, hb, fp, mf +%vr -> tf, hq +%bq -> gk +%jg -> qn +%hb -> qk +%qk -> hs, hl +%gz -> tf +%rm -> hj +&tf -> cb, jg, fz, gr, zj, qn, kb +%qn -> td +%js -> lr, dc +%qb -> nc +%zj -> vr +%td -> tf, zj +%tl -> kg +%gx -> lr +%hm -> lr, rd +&fh -> ql +%nj -> xx +%hq -> kb, tf +%kg -> px, hl +%dc -> dp +%vf -> th, sn +&mf -> ql +%tm -> hl +&fz -> ql +%xd -> tn, sn +%ng -> vp, sn +%th -> qb +%rd -> xl, lr +%bt -> xd, sn +%tv -> sn +%nl -> bt +%hs -> fp, hl +%xv -> rm, lr +%tn -> sn, tv +%hj -> lr, bq +&ss -> ql +%sd -> nl +&sn -> sd, fh, th, qb, nl, ng, nc +%kb -> mq +%lb -> nj, hl +%gr -> tf, cb +%nc -> sd From e4c930c2facc2727037aaa475896bb1f5967b697 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Wed, 20 Dec 2023 11:18:49 +0100 Subject: [PATCH 457/479] 2023: d20: ex2: add solution --- 2023/d20/ex2/ex2.py | 128 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100755 2023/d20/ex2/ex2.py diff --git a/2023/d20/ex2/ex2.py b/2023/d20/ex2/ex2.py new file mode 100755 index 0000000..16d81b5 --- /dev/null +++ b/2023/d20/ex2/ex2.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python + +import enum +import itertools +import math +import sys +from collections import defaultdict, deque +from typing import NamedTuple + + +class ModuleType(enum.StrEnum): + FLIP_FLOP = "%" + CONJUNCTION = "&" + BROADCAST = "broadcaster" + + +class Pulse(enum.IntEnum): + LOW = 0 + HIGH = 1 + + +class Rule(NamedTuple): + module_type: ModuleType + destinations: list[str] + + +Modules = dict[str, Rule] + + +def solve(input: list[str]) -> int: + def parse_rule(line: str) -> tuple[str, Rule]: + module, outputs = line.split(" -> ") + + name: str + module_type: ModuleType + + if module != "broadcaster": + name = module[1:] + module_type = ModuleType(module[0]) + else: + name = module + module_type = ModuleType(module) + + return name, Rule(module_type, outputs.split(", ")) + + def parse(input: list[str]) -> Modules: + return dict(map(parse_rule, input)) + + def compute_inputs(modules: Modules) -> dict[str, list[str]]: + inputs: dict[str, list[str]] = defaultdict(list) + + for src, rule in modules.items(): + for dst in rule.destinations: + inputs[dst].append(src) + + return inputs + + def count_buttons(modules: Modules) -> int: + def count_buttons_for( + wanted_src: str, + wanted_dst: str, + pulse_wanted: Pulse, + ) -> int: + inputs = compute_inputs(modules) + last_pulse: dict[str, Pulse] = defaultdict(lambda: Pulse.LOW) + + for i in itertools.count(start=1): + queue: deque[tuple[Pulse, str]] = deque([(Pulse.LOW, "broadcaster")]) + + while queue: + pulse, name = queue.popleft() + + mod = modules.get(name) + + # This is for unknown outputs + if mod is None: + continue + + new_pulse: Pulse + match mod.module_type: + case ModuleType.FLIP_FLOP: + if pulse == Pulse.HIGH: + continue + new_pulse = Pulse(1 - last_pulse[name]) + case ModuleType.CONJUNCTION: + high_inputs = all( + last_pulse[input] == Pulse.HIGH + for input in inputs[name] + ) + new_pulse = Pulse.LOW if high_inputs else Pulse.HIGH + case ModuleType.BROADCAST: + new_pulse = pulse + + last_pulse[name] = new_pulse + for dst in mod.destinations: + queue.append((new_pulse, dst)) + # We found the pulse we wanted, report the number of button presses + if ( + new_pulse == pulse_wanted + and name == wanted_src + and dst == wanted_dst + ): + return i + + assert False # Sanity check + + inputs = compute_inputs(modules) + # The input has a single conjunction leading to "rx" + # So we want to compute when all of *its* inputs are high at the same time + assert len(inputs["rx"]) == 1 # Sanity check + rx_input = inputs["rx"][0] + assert modules[rx_input].module_type == ModuleType.CONJUNCTION # Sanity check + # Shortcut: assume that the high pulse output is cyclic + return math.lcm( + *(count_buttons_for(mod, rx_input, Pulse.HIGH) for mod in inputs[rx_input]) + ) + + modules = parse(input) + return count_buttons(modules) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From ba345ca59d0f3b12b07e6f09820533827bd4c6cf Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 21 Dec 2023 10:53:43 +0100 Subject: [PATCH 458/479] 2023: d21: ex1: add input --- 2023/d21/ex1/input | 131 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 2023/d21/ex1/input diff --git a/2023/d21/ex1/input b/2023/d21/ex1/input new file mode 100644 index 0000000..9d056c5 --- /dev/null +++ b/2023/d21/ex1/input @@ -0,0 +1,131 @@ +................................................................................................................................... +....#.............#...............#.......#..........#..................##..........#.....#..................##...#...#..........#. +...............#......#........#.......#........#.........................#.....#........#........#...#....#....#.........#....##.. +..#........#........#.##........#....#...#.....................................#................#.#...#..#....................#.... +...................#.............#........#.....#........#.........................#.......#...#.........#...........#...........#. +...##.#....#...#.#..#....#.......##..#.....#..#..#......#.......#.........#.#.......#....#........#.....#.#...#................#... +............#....#.........#.#..............##..................................#.#.......#.#..........#...#..#.#......##..#....... +..................#...##............#.....#.....#.....#......................#..#.............................#....##..#...#.#..... +............#.............#.........#........................##..............#.#....#.............#..........#.....#............... +................#..#...##........#...#............#..................#.........#.....#..............#....#................#........ +.#...#...#..#.#...#............#....#..#.#.........#............#.#.#..#..................#.##....#.............#.................. +....#..#....#......#..#..##...#.#..#...##.........................#...................#..........#..#.......#...##.....#.....#..... +....................#..........................##................................#.....................#................#.....#.##. +..............#..............#..#..#.......#....#....................................#.........#..........#.#...............#.##... +........#......#.#.........#.......#..........#..................................................................#........#..#..#.. +.................#.......##.......##......#..................#..#.......#....................#....#............#.......#.......#.#. +.....##.......#......#...#.#....#..#.................#.#....#.....#.............................#..#.........#.#.................#. +.......................#.....#...##...##..................................#....................##....##..........#..#.............. +.#.......#....##.....#........#..............................#.....#....#.....................#........#..#..#.......#.#....#....#. +....#..#............#.........#...........................#.........##....#..#...................#..............#........#......##. +......##.................#..#.....................#...........................#.........................#...................#...... +.....#...##.........#........#.##....###..................#........#..........................#.####................#.....#...#.... +.#....#...#........#....#.............#................#.................##...#....#................#..#...#.....#............#.... +....##.#.#.....#......#.......##.....#..........#........#..............#...#....#.................#.....#....#.................... +.....#..............#.##..#.......#..........##..........................#.#.........#..........#....##....#.........#.#........... +.....#..#........#.#..........#...#.................#...........#.....#.........................#.#............#................... +.......#...........#..........#......................#........................##.....##............#........#..................##.. +....#........................................#..#.....................#...#.#...#......................#...#....#................#. +....#.##......#........#.....................#.........#...................#...#....#.#..............###..................###...... +..#...........#.....#....#..#.#............#...........#........#.....#.#................................#.......##....##.......... +...##.###.....................#............#.....#..#.#..............##..#.##..#.....#...................#.#......#....#........... +.##....#............#....#.............#...#.#.............#..##.............#......................##.##..................#..#.... +...#.....##.........#..##..............#..#........##..#.#................#...#.#.#....#..................#..............#......... +..........#....#.#.....#.................#...#............#.#......#...........#..........##..#...............#...#...##..#.#...... +..............#.....................#....#..#.##...#.......#.#..#.....#..................#................#........................ +......#.#.......#.....#...........##.................#......#........#.#........#..........#..##.........#...#.......#..#.......... +........................#..........#..#..................#...................#..#..##...##..#...................#.............#.... +...............#...#......................#....#...#..............##....#......#......#...#..#..................................... +......#...#...###..#..#...................#...#.#............#......#...##....#.........#..#.....#.........#.#........##........... +.#...#.........................##..##................#.....##.#...#........#.....#..#....##.........#..................#..#........ +..#......#.........#..........##..#......##.#................................................#.......#.........................#.#. +......#....#..#.#..#.............#..............#.........#........#.....#.#..#......#.#.........................#..............#.. +.........................................#........#..................#...##.......#..........#........#..........#..#.............. +..#..........#............................#...#.....#....#..................#......................#.#..........#.##......#...#.... +...........................................#.....#..#....#........#.....#........#......#...#...................................#.. +..#..#...#.#..................#.#.............#..........#....#.....#......#......##.#..#...#.##....#....................#.....#... +..#..##..........................#........#....#..........#........#..........#..#.#..............#..#......................#.#.... +....#...#.#.#..........#......................................#.......#...................##..#..#..................#.....#........ +............................#............##.#..............#.......#.#...#....#.........#....#......#........................#..... +..#.........#...............#.......#....#..........#.....#.................#..#...##.#......................................#..... +.......#...#.................#..................#......#....#..##...#.........#.#.#..........#...##..#.#...................#....... +.........................#.............#....#...#.#.#....#.....#...............#........#.#...#..#..........#............#......... +.......##.............##............#..###..#.#..#..##....#...#......##..#...#........#....#..#..........#..#..#..........#........ +..#..............#..##.......#...#........##.......................#..................#...........##........#.#..............#..... +.#...#.............................#.#.......#....................#.......#..........#...................#....#...##............... +..................####.#............###.....#.##..#...............#.............#..#..........#...............................#..#. +.....................#....#.......#......#......#......#..................#..#....#..........#....#..............#..#.............. +.............#.#.##..#..#.....#.....##........##..#.#.........#......#..#.........##......#........#.........#...#...#............. +.#..........#..#.........#...#..##.........#........###......#....##...........#......#.#......................#.....#............. +..#.........##.#..#.#..........#.............................#.............##......#..#.............#.....#...#....#............... +.#......................#.....................###..#.#.....#..........#..#.#.#....#.......#..#.........#........................... +..........#......#....#..#....##..........#..........#.#...................#.................#....#.....#......#..........#........ +.........................#.....#.....#........................#.........#.#...#............................#.....#................. +........#........#.........................##...............#.#.#......#......#......#..#.........#.....#.................#........ +...............##..........#...........................#.....#....#.....#.#...................#.............#...............#...... +.................................................................S................................................................. +.................##...#....#..........#..##..##..........#......#..#..............##...#.#......#......#......#..#.......#......... +..........#.........#.#...#..#....#.#.............#..#..#...........#.............#...........##.#...........#.......##............ +........#............#.#..........#..##.#.#...............#.....#......#...#...#....#......#........#.............#.......#........ +..........#...............#..#.................##.....#............#....###....#.............#................#...#................ +.#..............#.....##.#....#...#..#.##.......................#.#....#.......#.#............#........#.....#..##...##............ +.##.........#...................##.....#....#.......#.............##.......#...................#...........#.......#....#.......... +............#..#...#.....#....#...........#.#......#.#..#.........#.#....#..................##............#........................ +.............#..#...#....#......#......#......................#....#......###..........#..#.#..#...##....#..#...................... +...#.........#..........#..#.........................##...........#......#............#..#.#.....##............#..#.#........#..#.. +....#.#........##......................#.#.#.#..#.....#..#....##...#....##...#.#...#......#......................#................. +.....##..................#..........#.....##.....##..........#.#..#.......#.#...#.........#.......#..........#....#..........#.#... +...........................#..........#...#......#.#..#........#...#...............................#.#.#...#.....#..........#...##. +.....................#..##.##.....#......#.........#..##...#...............#.#.#........#..#...#...........#...#................... +..........#.........#..#.....#.......#.....###......#.....#.........#......#...............#.........#.........#................... +.......##..#..............#.........#.....#.......#...##.###...........#.#..........##.........................................#... +..#.....#..................#.#..........#..#..##....#...............#..............#.........##.........###.#...........#....##.... +.#....#.....#.................#...#..........#.........#....#..............#.........##......#...#..........#........#.#.......#... +..............#.......................##.......##.......#..#.........#.....#....................................................#.. +...#..#......#.............#....##..........#.#.......#...............#................###...#....#......#.........#.....#.....#... +....#..........#..........#..........#.....#..............#.......##......................#..#.#...............................#... +.#......#.....................................##.#..........................#.....#.#..#.#..........##.......................#...#. +......#........#.............#...........#.#............#.#.#...................#.##......#.#...................#....#..#..#....... +.#.........##.....#.............#...........#.......#.......#.....##..###.....#...........#.......................#.#.............. +....##.........#.............................#.....##........#......#........#................#...#......................#......... +..................#...............##...............##.....#..#.#........#.....#.....#........#...#..#.........#.#.....#......#.#... +..................#.............##..#...............#....#.........##..#..........#......#....#.................##..#..#......#..#. +.........###.......#................#....##.....#...#...........#.............................#...#................#............... +...#......#...#...#...#...................#....#.#......#..#..#...#....#..#....................#..............#.................#.. +......................#.............##..#....#...#..............#...................#..#.......#..............###................#. +..#........#.#............#..............#.......##......................#..............#..................#..#..#...........#..... +.#........#..............................#..........................................#..........#.......#.............#.#.......#... +.............#..#....#......#.......#.#.................................##...............................#....#......#............. +.#.#...#...#....#...#......#................#..#.......#..#.##..............#...........#....#.......#............#....#.........#. +...#.............#....#............................#........##.........##..........#..............................#.....#.......#.. +....#......#....#......#...................#.........#.......##.......................#..................###........###.......#.... +..........#...#......#........#..........#.........#.......#....#............#.....##......................#...........#..##..#.#.. +.###.#.##......#.#........................#.#..#...................#.......#....#................##...#..#...#..#..#.###....#...... +.....#.#......................................#.............#......#............................#.................................. +..................#...............##.................#.........................#.................#.......#..##.#..##.....#..#...... +...........#.........#.#...#....#.......................#.........#............#.#...#............##............#.................. +.....#........#.............#..#..................#..#......#...#.#.......#.....................#.................................. +..................#.#..............##..........#..........##....................................#.#............#.#.....#........#.. +.....#.#.##....#..............#..........................#......#....#...#.....................................#...#..#.#.....#.... +....#.#.........##.....................#...........................#......#.......#........#.#.#..#..#.......#....#..#......#...#.. +............#.......#.............#......#...............#......#.##.....#..#......................#....#.....#...........#..##.... +...#...#....#..#...##.......#.....#.....................##.....#..............#.............#...#....#..##.#....#........###..#.... +.....#..............#....#.......#..........................#..........................#..##.....#...##................##.......... +...#........#..#.#............##............#.........###....#.#.....#....#.............##................#.......#..##.......#.#.. +...........#.........#..#...........#...................#......#.....#.....................#...........#.....#..................... +...#..#...##...............#..................#.............##......##...............#...#............#.........#..#...#.......#... +......#...........#............##.#.#...#...............#..#......##...........................#...#..#.#.......#.....#.........##. +...........#.#..#................#.......#......#............#..#.....#...............#....#.......#.#..#.#......#....#............ +...#..............................................................#................#.....#......................................... +.................##.....................#.#....#..............#....................................#..............#.#.............. +.............##.............#..##..................#..............#............#.................#........................#.#...... +...........................#.....#..#..##.....##............#..#.......................#.....#..#.....#..#.....#........#....#..... +..........#.................#........#.......................................#.#...#..###...###.#...........#...#.................. +..#....#.........#....#.........#....#.....#...................#............#....#.......#...#......#......#.#..........##..#...... +...#........................#..#...........#...##..........................###................#.#.......#..................#....... +.......#.#............#.......#.....#.............................#.........#......#......................#........#...#.......#... +.#.#..#.........................#..........#......................................#...........#..#...............#......##......... +...#..............#......#.##....##.#...#..........##............................#.#.#........#.#........#....##.............#..... +....................#...............#..#........#...........................................##..........#.#.....#....#.#...#....... +.......................#........##..............#........#....................#.......#...#....#...........##........#....#.....#.. +................................................................................................................................... From bd30ae97ed1d00618c5da74e15463d38043c1777 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 21 Dec 2023 10:53:48 +0100 Subject: [PATCH 459/479] 2023: d21: ex1: add solution --- 2023/d21/ex1/ex1.py | 73 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100755 2023/d21/ex1/ex1.py diff --git a/2023/d21/ex1/ex1.py b/2023/d21/ex1/ex1.py new file mode 100755 index 0000000..d5bc5ed --- /dev/null +++ b/2023/d21/ex1/ex1.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python + +import sys +from collections import defaultdict, deque +from typing import NamedTuple, Optional + + +class Point(NamedTuple): + x: int + y: int + + +GardenPoints = set[Point] + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> tuple[GardenPoints, Point]: + start: Optional[Point] = None + points: GardenPoints = set() + + for x, line in enumerate(input): + for y, c in enumerate(line): + if c == "#": + continue + if c == "S": + start = Point(x, y) + points.add(Point(x, y)) + + assert start is not None # Sanity check + return points, start + + def explore(points: GardenPoints, start: Point) -> dict[Point, int]: + res: dict[Point, int] = {} + queue: deque[tuple[Point, int]] = deque([(start, 0)]) + + while queue: + point, dist = queue.popleft() + # If we already saw the point, then we saw it at a smaller distance + if point in res: + continue + # If it's not an actual garden point (rocks, out-of-bounds), don't log it + if point not in points: + continue + res[point] = dist + for dx, dy in ( + (-1, 0), + (1, 0), + (0, -1), + (0, 1), + ): + queue.append((Point(point.x + dx, point.y + dy), dist + 1)) + + return res + + def reachable_in(distances: dict[Point, int], steps: int) -> set[Point]: + inverse_dist: dict[int, list[Point]] = defaultdict(list) + for p, dist in distances.items(): + inverse_dist[dist].append(p) + + return set(p for i in range(steps % 2, steps + 1, 2) for p in inverse_dist[i]) + + points, start = parse(input) + distances = explore(points, start) + return len(reachable_in(distances, 64)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 0605f5e47fdb7b65c563f9eadab9ca4db5beb7fb Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 21 Dec 2023 10:53:56 +0100 Subject: [PATCH 460/479] 2023: d21: ex2: add input --- 2023/d21/ex2/input | 131 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 2023/d21/ex2/input diff --git a/2023/d21/ex2/input b/2023/d21/ex2/input new file mode 100644 index 0000000..9d056c5 --- /dev/null +++ b/2023/d21/ex2/input @@ -0,0 +1,131 @@ +................................................................................................................................... +....#.............#...............#.......#..........#..................##..........#.....#..................##...#...#..........#. +...............#......#........#.......#........#.........................#.....#........#........#...#....#....#.........#....##.. +..#........#........#.##........#....#...#.....................................#................#.#...#..#....................#.... +...................#.............#........#.....#........#.........................#.......#...#.........#...........#...........#. +...##.#....#...#.#..#....#.......##..#.....#..#..#......#.......#.........#.#.......#....#........#.....#.#...#................#... +............#....#.........#.#..............##..................................#.#.......#.#..........#...#..#.#......##..#....... +..................#...##............#.....#.....#.....#......................#..#.............................#....##..#...#.#..... +............#.............#.........#........................##..............#.#....#.............#..........#.....#............... +................#..#...##........#...#............#..................#.........#.....#..............#....#................#........ +.#...#...#..#.#...#............#....#..#.#.........#............#.#.#..#..................#.##....#.............#.................. +....#..#....#......#..#..##...#.#..#...##.........................#...................#..........#..#.......#...##.....#.....#..... +....................#..........................##................................#.....................#................#.....#.##. +..............#..............#..#..#.......#....#....................................#.........#..........#.#...............#.##... +........#......#.#.........#.......#..........#..................................................................#........#..#..#.. +.................#.......##.......##......#..................#..#.......#....................#....#............#.......#.......#.#. +.....##.......#......#...#.#....#..#.................#.#....#.....#.............................#..#.........#.#.................#. +.......................#.....#...##...##..................................#....................##....##..........#..#.............. +.#.......#....##.....#........#..............................#.....#....#.....................#........#..#..#.......#.#....#....#. +....#..#............#.........#...........................#.........##....#..#...................#..............#........#......##. +......##.................#..#.....................#...........................#.........................#...................#...... +.....#...##.........#........#.##....###..................#........#..........................#.####................#.....#...#.... +.#....#...#........#....#.............#................#.................##...#....#................#..#...#.....#............#.... +....##.#.#.....#......#.......##.....#..........#........#..............#...#....#.................#.....#....#.................... +.....#..............#.##..#.......#..........##..........................#.#.........#..........#....##....#.........#.#........... +.....#..#........#.#..........#...#.................#...........#.....#.........................#.#............#................... +.......#...........#..........#......................#........................##.....##............#........#..................##.. +....#........................................#..#.....................#...#.#...#......................#...#....#................#. +....#.##......#........#.....................#.........#...................#...#....#.#..............###..................###...... +..#...........#.....#....#..#.#............#...........#........#.....#.#................................#.......##....##.......... +...##.###.....................#............#.....#..#.#..............##..#.##..#.....#...................#.#......#....#........... +.##....#............#....#.............#...#.#.............#..##.............#......................##.##..................#..#.... +...#.....##.........#..##..............#..#........##..#.#................#...#.#.#....#..................#..............#......... +..........#....#.#.....#.................#...#............#.#......#...........#..........##..#...............#...#...##..#.#...... +..............#.....................#....#..#.##...#.......#.#..#.....#..................#................#........................ +......#.#.......#.....#...........##.................#......#........#.#........#..........#..##.........#...#.......#..#.......... +........................#..........#..#..................#...................#..#..##...##..#...................#.............#.... +...............#...#......................#....#...#..............##....#......#......#...#..#..................................... +......#...#...###..#..#...................#...#.#............#......#...##....#.........#..#.....#.........#.#........##........... +.#...#.........................##..##................#.....##.#...#........#.....#..#....##.........#..................#..#........ +..#......#.........#..........##..#......##.#................................................#.......#.........................#.#. +......#....#..#.#..#.............#..............#.........#........#.....#.#..#......#.#.........................#..............#.. +.........................................#........#..................#...##.......#..........#........#..........#..#.............. +..#..........#............................#...#.....#....#..................#......................#.#..........#.##......#...#.... +...........................................#.....#..#....#........#.....#........#......#...#...................................#.. +..#..#...#.#..................#.#.............#..........#....#.....#......#......##.#..#...#.##....#....................#.....#... +..#..##..........................#........#....#..........#........#..........#..#.#..............#..#......................#.#.... +....#...#.#.#..........#......................................#.......#...................##..#..#..................#.....#........ +............................#............##.#..............#.......#.#...#....#.........#....#......#........................#..... +..#.........#...............#.......#....#..........#.....#.................#..#...##.#......................................#..... +.......#...#.................#..................#......#....#..##...#.........#.#.#..........#...##..#.#...................#....... +.........................#.............#....#...#.#.#....#.....#...............#........#.#...#..#..........#............#......... +.......##.............##............#..###..#.#..#..##....#...#......##..#...#........#....#..#..........#..#..#..........#........ +..#..............#..##.......#...#........##.......................#..................#...........##........#.#..............#..... +.#...#.............................#.#.......#....................#.......#..........#...................#....#...##............... +..................####.#............###.....#.##..#...............#.............#..#..........#...............................#..#. +.....................#....#.......#......#......#......#..................#..#....#..........#....#..............#..#.............. +.............#.#.##..#..#.....#.....##........##..#.#.........#......#..#.........##......#........#.........#...#...#............. +.#..........#..#.........#...#..##.........#........###......#....##...........#......#.#......................#.....#............. +..#.........##.#..#.#..........#.............................#.............##......#..#.............#.....#...#....#............... +.#......................#.....................###..#.#.....#..........#..#.#.#....#.......#..#.........#........................... +..........#......#....#..#....##..........#..........#.#...................#.................#....#.....#......#..........#........ +.........................#.....#.....#........................#.........#.#...#............................#.....#................. +........#........#.........................##...............#.#.#......#......#......#..#.........#.....#.................#........ +...............##..........#...........................#.....#....#.....#.#...................#.............#...............#...... +.................................................................S................................................................. +.................##...#....#..........#..##..##..........#......#..#..............##...#.#......#......#......#..#.......#......... +..........#.........#.#...#..#....#.#.............#..#..#...........#.............#...........##.#...........#.......##............ +........#............#.#..........#..##.#.#...............#.....#......#...#...#....#......#........#.............#.......#........ +..........#...............#..#.................##.....#............#....###....#.............#................#...#................ +.#..............#.....##.#....#...#..#.##.......................#.#....#.......#.#............#........#.....#..##...##............ +.##.........#...................##.....#....#.......#.............##.......#...................#...........#.......#....#.......... +............#..#...#.....#....#...........#.#......#.#..#.........#.#....#..................##............#........................ +.............#..#...#....#......#......#......................#....#......###..........#..#.#..#...##....#..#...................... +...#.........#..........#..#.........................##...........#......#............#..#.#.....##............#..#.#........#..#.. +....#.#........##......................#.#.#.#..#.....#..#....##...#....##...#.#...#......#......................#................. +.....##..................#..........#.....##.....##..........#.#..#.......#.#...#.........#.......#..........#....#..........#.#... +...........................#..........#...#......#.#..#........#...#...............................#.#.#...#.....#..........#...##. +.....................#..##.##.....#......#.........#..##...#...............#.#.#........#..#...#...........#...#................... +..........#.........#..#.....#.......#.....###......#.....#.........#......#...............#.........#.........#................... +.......##..#..............#.........#.....#.......#...##.###...........#.#..........##.........................................#... +..#.....#..................#.#..........#..#..##....#...............#..............#.........##.........###.#...........#....##.... +.#....#.....#.................#...#..........#.........#....#..............#.........##......#...#..........#........#.#.......#... +..............#.......................##.......##.......#..#.........#.....#....................................................#.. +...#..#......#.............#....##..........#.#.......#...............#................###...#....#......#.........#.....#.....#... +....#..........#..........#..........#.....#..............#.......##......................#..#.#...............................#... +.#......#.....................................##.#..........................#.....#.#..#.#..........##.......................#...#. +......#........#.............#...........#.#............#.#.#...................#.##......#.#...................#....#..#..#....... +.#.........##.....#.............#...........#.......#.......#.....##..###.....#...........#.......................#.#.............. +....##.........#.............................#.....##........#......#........#................#...#......................#......... +..................#...............##...............##.....#..#.#........#.....#.....#........#...#..#.........#.#.....#......#.#... +..................#.............##..#...............#....#.........##..#..........#......#....#.................##..#..#......#..#. +.........###.......#................#....##.....#...#...........#.............................#...#................#............... +...#......#...#...#...#...................#....#.#......#..#..#...#....#..#....................#..............#.................#.. +......................#.............##..#....#...#..............#...................#..#.......#..............###................#. +..#........#.#............#..............#.......##......................#..............#..................#..#..#...........#..... +.#........#..............................#..........................................#..........#.......#.............#.#.......#... +.............#..#....#......#.......#.#.................................##...............................#....#......#............. +.#.#...#...#....#...#......#................#..#.......#..#.##..............#...........#....#.......#............#....#.........#. +...#.............#....#............................#........##.........##..........#..............................#.....#.......#.. +....#......#....#......#...................#.........#.......##.......................#..................###........###.......#.... +..........#...#......#........#..........#.........#.......#....#............#.....##......................#...........#..##..#.#.. +.###.#.##......#.#........................#.#..#...................#.......#....#................##...#..#...#..#..#.###....#...... +.....#.#......................................#.............#......#............................#.................................. +..................#...............##.................#.........................#.................#.......#..##.#..##.....#..#...... +...........#.........#.#...#....#.......................#.........#............#.#...#............##............#.................. +.....#........#.............#..#..................#..#......#...#.#.......#.....................#.................................. +..................#.#..............##..........#..........##....................................#.#............#.#.....#........#.. +.....#.#.##....#..............#..........................#......#....#...#.....................................#...#..#.#.....#.... +....#.#.........##.....................#...........................#......#.......#........#.#.#..#..#.......#....#..#......#...#.. +............#.......#.............#......#...............#......#.##.....#..#......................#....#.....#...........#..##.... +...#...#....#..#...##.......#.....#.....................##.....#..............#.............#...#....#..##.#....#........###..#.... +.....#..............#....#.......#..........................#..........................#..##.....#...##................##.......... +...#........#..#.#............##............#.........###....#.#.....#....#.............##................#.......#..##.......#.#.. +...........#.........#..#...........#...................#......#.....#.....................#...........#.....#..................... +...#..#...##...............#..................#.............##......##...............#...#............#.........#..#...#.......#... +......#...........#............##.#.#...#...............#..#......##...........................#...#..#.#.......#.....#.........##. +...........#.#..#................#.......#......#............#..#.....#...............#....#.......#.#..#.#......#....#............ +...#..............................................................#................#.....#......................................... +.................##.....................#.#....#..............#....................................#..............#.#.............. +.............##.............#..##..................#..............#............#.................#........................#.#...... +...........................#.....#..#..##.....##............#..#.......................#.....#..#.....#..#.....#........#....#..... +..........#.................#........#.......................................#.#...#..###...###.#...........#...#.................. +..#....#.........#....#.........#....#.....#...................#............#....#.......#...#......#......#.#..........##..#...... +...#........................#..#...........#...##..........................###................#.#.......#..................#....... +.......#.#............#.......#.....#.............................#.........#......#......................#........#...#.......#... +.#.#..#.........................#..........#......................................#...........#..#...............#......##......... +...#..............#......#.##....##.#...#..........##............................#.#.#........#.#........#....##.............#..... +....................#...............#..#........#...........................................##..........#.#.....#....#.#...#....... +.......................#........##..............#........#....................#.......#...#....#...........##........#....#.....#.. +................................................................................................................................... From 23fb211e9241aa95a0b3b392e29cab2fcd888591 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Thu, 21 Dec 2023 10:54:01 +0100 Subject: [PATCH 461/479] 2023: d21: ex2: add solution --- 2023/d21/ex2/ex2.py | 95 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100755 2023/d21/ex2/ex2.py diff --git a/2023/d21/ex2/ex2.py b/2023/d21/ex2/ex2.py new file mode 100755 index 0000000..9cf3791 --- /dev/null +++ b/2023/d21/ex2/ex2.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +import sys +from typing import Iterator, NamedTuple, Optional + + +class Point(NamedTuple): + x: int + y: int + + +GardenPoints = set[Point] + +GRID_SIZE = 131 +MID_GRID = 65 +STEPS = 26501365 + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> tuple[GardenPoints, Point]: + start: Optional[Point] = None + points: GardenPoints = set() + + for x, line in enumerate(input): + for y, c in enumerate(line): + if c == "#": + continue + if c == "S": + start = Point(x, y) + points.add(Point(x, y)) + + assert start is not None # Sanity check + return points, start + + def step(points: GardenPoints, positions: set[Point]) -> set[Point]: + res: set[Point] = set() + + for p in positions: + for dx, dy in ( + (-1, 0), + (1, 0), + (0, -1), + (0, 1), + ): + x = p.x + dx + y = p.y + dy + # Check if the *wrapped* point is part of the garden + px = (x + GRID_SIZE) % GRID_SIZE + py = (y + GRID_SIZE) % GRID_SIZE + if Point(px, py) not in points: + continue + res.add(Point(x, y)) + + return res + + def compute_quadratic(points: GardenPoints, start: Point) -> int: + def iterate() -> Iterator[int]: + positions = {start} + while True: + yield len(positions) + positions = step(points, positions) + + values: list[tuple[int, int]] = [] + for i, num in enumerate(iterate()): + if i % GRID_SIZE != MID_GRID: + continue + values.append((i, num)) + if len(values) == 3: + break + + # Lagrange interpolation + (x1, y1), (x2, y2), (x3, y3) = values + x = STEPS + return ( + 0 + # Use integer division as it happens to work in our case + + ((x - x2) * (x - x3)) * y1 // ((x1 - x2) * (x1 - x3)) + + ((x - x1) * (x - x3)) * y2 // ((x2 - x1) * (x2 - x3)) + + ((x - x1) * (x - x2)) * y3 // ((x3 - x1) * (x3 - x2)) + ) + + assert len(input) == GRID_SIZE # Sanity check + assert len(input[0]) == GRID_SIZE # Sanity check + points, start = parse(input) + assert start == Point(MID_GRID, MID_GRID) # Sanity check + return compute_quadratic(points, start) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 27e5a815ba4d885e9aa1df3dfba5a9652bdd3b1c Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 22 Dec 2023 15:29:27 +0100 Subject: [PATCH 462/479] 2023: d22: ex1: add input --- 2023/d22/ex1/input | 1233 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1233 insertions(+) create mode 100644 2023/d22/ex1/input diff --git a/2023/d22/ex1/input b/2023/d22/ex1/input new file mode 100644 index 0000000..6209227 --- /dev/null +++ b/2023/d22/ex1/input @@ -0,0 +1,1233 @@ +4,6,74~4,6,76 +0,3,277~0,4,277 +7,4,124~7,6,124 +5,1,268~5,1,269 +6,8,273~6,8,274 +8,0,268~8,0,270 +5,5,84~5,7,84 +1,9,196~3,9,196 +7,3,214~9,3,214 +6,2,171~8,2,171 +6,4,122~7,4,122 +1,2,177~1,5,177 +5,1,31~5,2,31 +1,3,196~1,6,196 +0,7,93~0,8,93 +0,5,267~0,6,267 +7,2,256~9,2,256 +3,8,40~4,8,40 +3,7,289~6,7,289 +7,5,269~7,7,269 +8,1,191~8,3,191 +3,0,190~5,0,190 +4,8,278~6,8,278 +8,6,25~8,9,25 +1,1,109~1,4,109 +4,6,270~4,7,270 +7,3,302~7,3,304 +6,0,108~8,0,108 +8,1,87~8,1,88 +6,6,94~6,8,94 +4,6,137~7,6,137 +3,4,20~3,7,20 +6,8,206~9,8,206 +6,9,266~8,9,266 +3,0,9~3,1,9 +9,0,82~9,3,82 +0,5,210~0,5,213 +5,5,303~7,5,303 +5,9,202~7,9,202 +8,3,256~8,6,256 +4,1,273~4,4,273 +6,6,1~6,7,1 +4,5,42~4,7,42 +5,6,183~7,6,183 +4,0,261~4,2,261 +3,3,271~5,3,271 +6,1,76~7,1,76 +5,2,59~7,2,59 +6,5,203~8,5,203 +4,6,278~6,6,278 +1,8,271~4,8,271 +6,4,279~7,4,279 +2,6,78~5,6,78 +9,7,112~9,9,112 +9,7,110~9,8,110 +6,2,208~9,2,208 +4,3,89~4,6,89 +2,7,93~2,9,93 +1,3,259~1,3,261 +5,3,45~7,3,45 +0,6,41~2,6,41 +3,8,42~5,8,42 +1,0,179~1,2,179 +1,1,283~3,1,283 +1,3,178~3,3,178 +3,5,182~3,7,182 +6,6,111~6,8,111 +1,0,106~1,2,106 +7,2,299~7,4,299 +8,7,88~8,9,88 +2,5,184~5,5,184 +1,0,2~2,0,2 +4,4,165~4,4,167 +1,9,116~2,9,116 +3,4,195~4,4,195 +8,5,150~8,7,150 +9,7,90~9,9,90 +1,7,31~1,9,31 +4,2,63~4,5,63 +5,0,271~5,0,274 +3,2,158~3,3,158 +4,4,150~4,5,150 +2,1,188~5,1,188 +2,2,35~2,4,35 +1,0,219~1,2,219 +1,6,98~3,6,98 +5,4,213~5,5,213 +7,1,120~7,3,120 +4,0,222~6,0,222 +7,2,112~9,2,112 +1,2,200~4,2,200 +2,3,165~2,4,165 +1,3,112~2,3,112 +0,3,189~2,3,189 +6,5,103~8,5,103 +2,6,176~3,6,176 +0,6,32~2,6,32 +2,2,297~2,4,297 +6,3,73~7,3,73 +8,4,231~8,6,231 +5,2,57~7,2,57 +8,6,180~8,9,180 +6,9,282~7,9,282 +0,0,65~0,2,65 +2,7,276~2,8,276 +1,8,191~2,8,191 +4,0,187~4,2,187 +5,6,214~8,6,214 +8,7,267~8,8,267 +2,1,246~4,1,246 +7,6,40~7,8,40 +6,2,248~6,4,248 +3,6,23~4,6,23 +9,6,181~9,8,181 +0,7,112~2,7,112 +3,4,147~4,4,147 +1,0,89~3,0,89 +5,2,172~7,2,172 +6,6,110~8,6,110 +6,5,133~6,7,133 +3,3,84~5,3,84 +9,4,128~9,6,128 +6,6,206~6,7,206 +7,2,131~7,3,131 +7,8,267~7,9,267 +7,1,12~7,3,12 +0,6,102~0,9,102 +2,8,96~4,8,96 +3,9,75~3,9,77 +3,0,70~3,3,70 +8,5,107~8,7,107 +4,7,173~5,7,173 +5,7,136~7,7,136 +1,1,57~2,1,57 +8,9,216~8,9,219 +3,4,267~3,6,267 +4,6,185~5,6,185 +2,2,16~2,5,16 +6,4,289~6,6,289 +1,5,255~3,5,255 +0,7,189~2,7,189 +7,4,234~7,7,234 +0,7,5~0,9,5 +0,5,214~0,5,217 +5,3,61~5,5,61 +1,9,193~3,9,193 +3,2,262~6,2,262 +5,4,291~5,5,291 +4,8,17~7,8,17 +9,6,45~9,7,45 +1,5,279~3,5,279 +0,1,7~0,2,7 +6,4,208~9,4,208 +0,3,49~0,6,49 +3,6,58~3,6,60 +6,1,55~8,1,55 +3,6,25~4,6,25 +3,6,57~5,6,57 +0,1,188~0,4,188 +0,0,262~0,1,262 +7,9,214~9,9,214 +9,6,70~9,7,70 +3,4,131~5,4,131 +5,7,224~5,9,224 +1,9,33~3,9,33 +5,1,185~5,4,185 +9,2,191~9,4,191 +2,5,201~5,5,201 +2,6,61~4,6,61 +8,7,215~9,7,215 +9,0,217~9,1,217 +3,2,56~3,4,56 +0,1,215~0,3,215 +1,4,45~1,6,45 +2,0,32~4,0,32 +5,9,173~7,9,173 +8,1,168~8,3,168 +5,5,167~6,5,167 +1,6,35~4,6,35 +2,6,54~4,6,54 +9,4,254~9,7,254 +7,0,80~8,0,80 +0,1,57~0,2,57 +5,9,276~5,9,278 +3,0,193~5,0,193 +0,6,202~3,6,202 +5,6,288~7,6,288 +0,7,218~0,7,219 +3,1,115~6,1,115 +0,3,276~2,3,276 +6,6,227~6,8,227 +8,4,224~8,7,224 +5,3,161~5,5,161 +4,3,26~6,3,26 +7,5,315~9,5,315 +6,6,41~9,6,41 +6,2,54~6,4,54 +6,9,279~7,9,279 +2,2,270~2,4,270 +3,7,84~3,8,84 +0,6,266~1,6,266 +2,4,164~4,4,164 +7,5,212~7,7,212 +6,2,75~6,2,76 +1,7,284~2,7,284 +6,7,300~7,7,300 +8,3,258~8,5,258 +7,8,205~9,8,205 +5,4,251~5,5,251 +1,2,205~1,4,205 +6,0,137~6,1,137 +1,7,102~2,7,102 +5,5,202~5,7,202 +7,7,179~7,9,179 +4,5,174~4,7,174 +7,6,13~7,8,13 +4,6,212~4,8,212 +0,7,222~0,8,222 +6,7,21~8,7,21 +7,5,17~9,5,17 +4,0,29~4,2,29 +1,7,253~1,7,254 +2,6,169~2,6,171 +1,5,164~4,5,164 +3,2,247~6,2,247 +3,3,295~3,3,296 +8,2,15~9,2,15 +2,4,34~2,6,34 +7,2,128~7,5,128 +0,4,189~3,4,189 +0,2,56~0,5,56 +1,7,114~1,9,114 +1,4,102~3,4,102 +3,2,272~3,4,272 +6,5,294~7,5,294 +2,3,81~4,3,81 +9,2,253~9,3,253 +5,2,43~5,4,43 +7,2,301~7,3,301 +6,5,320~8,5,320 +3,7,22~3,9,22 +2,8,35~5,8,35 +8,5,295~9,5,295 +6,9,68~7,9,68 +6,1,234~6,3,234 +5,8,67~7,8,67 +5,0,243~7,0,243 +5,0,118~5,2,118 +3,6,9~5,6,9 +4,3,275~4,6,275 +3,2,127~4,2,127 +6,6,247~6,8,247 +3,4,124~6,4,124 +4,3,274~5,3,274 +1,3,91~1,5,91 +4,6,64~4,8,64 +0,5,270~0,8,270 +4,4,103~6,4,103 +5,5,249~7,5,249 +2,0,52~5,0,52 +4,2,189~4,5,189 +8,1,241~8,2,241 +1,3,294~3,3,294 +8,0,1~8,0,2 +6,5,165~6,9,165 +3,5,41~3,7,41 +3,3,254~3,5,254 +2,6,105~2,7,105 +3,3,106~4,3,106 +7,9,268~9,9,268 +2,5,81~2,8,81 +0,6,199~0,8,199 +3,1,212~3,4,212 +5,5,63~5,6,63 +5,2,49~6,2,49 +6,8,39~6,9,39 +8,9,7~8,9,9 +7,7,24~7,9,24 +5,8,47~8,8,47 +5,5,187~5,5,189 +8,6,273~8,9,273 +8,9,185~9,9,185 +4,6,171~4,8,171 +2,7,191~4,7,191 +2,0,168~2,3,168 +5,1,68~5,3,68 +7,6,91~7,9,91 +8,1,13~8,3,13 +6,2,202~6,3,202 +6,0,200~6,1,200 +4,3,252~4,4,252 +5,0,93~5,2,93 +7,6,237~7,8,237 +0,8,33~2,8,33 +0,0,86~0,2,86 +8,6,226~8,6,229 +0,4,1~2,4,1 +2,0,122~2,3,122 +5,3,69~8,3,69 +2,8,46~4,8,46 +6,5,66~9,5,66 +7,6,294~9,6,294 +8,6,113~8,8,113 +5,1,163~5,4,163 +1,6,269~4,6,269 +8,6,207~8,7,207 +7,4,213~9,4,213 +2,6,22~2,8,22 +0,5,83~0,8,83 +0,2,210~0,4,210 +6,6,167~6,8,167 +5,4,171~7,4,171 +0,0,281~4,0,281 +5,0,270~5,2,270 +6,2,118~9,2,118 +5,0,53~6,0,53 +4,2,13~4,4,13 +2,6,52~5,6,52 +1,5,203~4,5,203 +7,5,14~7,7,14 +7,2,258~7,2,260 +6,2,193~6,3,193 +7,9,180~7,9,181 +6,3,307~6,5,307 +8,4,281~8,6,281 +4,2,107~7,2,107 +6,6,205~8,6,205 +6,7,51~6,8,51 +8,5,5~8,8,5 +9,6,295~9,7,295 +8,2,85~8,4,85 +0,2,268~0,5,268 +3,3,173~5,3,173 +8,3,285~8,5,285 +5,9,175~7,9,175 +3,7,194~5,7,194 +9,3,256~9,5,256 +9,1,80~9,4,80 +6,1,100~6,3,100 +6,6,88~8,6,88 +2,7,15~5,7,15 +2,2,180~2,5,180 +0,8,70~0,9,70 +0,2,221~0,3,221 +7,7,16~9,7,16 +3,1,101~5,1,101 +8,8,29~9,8,29 +3,0,80~5,0,80 +2,3,291~4,3,291 +4,6,243~7,6,243 +1,0,118~4,0,118 +4,2,78~4,5,78 +5,9,67~7,9,67 +1,8,192~4,8,192 +5,3,259~5,5,259 +6,4,5~8,4,5 +5,4,132~5,5,132 +0,7,85~0,9,85 +1,9,201~4,9,201 +8,6,24~8,7,24 +2,1,249~3,1,249 +0,5,209~0,8,209 +7,4,317~7,6,317 +0,5,37~2,5,37 +3,5,185~5,5,185 +7,5,292~7,7,292 +6,2,266~6,3,266 +1,3,42~1,3,44 +4,6,245~4,8,245 +1,3,45~2,3,45 +7,5,167~7,6,167 +4,8,3~4,8,3 +5,4,205~7,4,205 +4,5,308~7,5,308 +2,0,77~5,0,77 +5,1,47~5,3,47 +9,2,193~9,4,193 +1,9,194~4,9,194 +4,7,12~4,9,12 +3,2,211~3,5,211 +4,7,182~6,7,182 +7,1,14~9,1,14 +0,6,99~0,7,99 +8,0,273~8,1,273 +2,4,268~4,4,268 +5,2,28~5,2,28 +6,9,19~8,9,19 +1,3,55~1,5,55 +6,1,245~6,4,245 +4,8,214~4,8,216 +3,2,188~3,2,190 +5,9,17~7,9,17 +1,8,284~1,9,284 +9,7,269~9,9,269 +4,7,200~4,9,200 +0,4,184~0,7,184 +5,2,50~5,4,50 +9,6,108~9,9,108 +4,0,277~4,1,277 +6,6,220~6,8,220 +6,3,251~6,5,251 +1,0,240~1,4,240 +0,0,199~0,4,199 +4,1,139~5,1,139 +2,4,291~4,4,291 +2,4,294~2,6,294 +5,6,73~8,6,73 +0,6,62~0,8,62 +5,6,167~5,8,167 +5,5,135~5,5,138 +0,8,282~0,9,282 +7,4,274~7,6,274 +7,2,185~9,2,185 +4,3,269~5,3,269 +6,4,262~6,4,265 +0,9,104~0,9,106 +3,5,128~3,5,129 +5,5,205~8,5,205 +8,3,147~8,5,147 +2,5,168~2,6,168 +6,4,126~6,4,128 +4,0,311~8,0,311 +6,0,211~6,3,211 +6,1,185~6,2,185 +6,3,290~7,3,290 +6,9,233~6,9,234 +5,1,244~5,1,247 +4,2,249~4,3,249 +0,0,123~2,0,123 +1,2,182~1,3,182 +7,0,140~7,2,140 +8,8,85~8,9,85 +6,0,14~6,3,14 +0,4,181~0,7,181 +1,4,197~1,7,197 +3,0,76~3,2,76 +7,5,131~8,5,131 +7,4,77~7,7,77 +0,7,283~1,7,283 +5,0,205~8,0,205 +3,6,155~3,8,155 +8,6,68~8,6,70 +6,0,254~7,0,254 +7,3,126~9,3,126 +1,7,94~4,7,94 +8,3,11~8,6,11 +5,6,45~5,8,45 +8,4,86~8,7,86 +7,8,292~9,8,292 +2,9,227~5,9,227 +1,7,108~4,7,108 +7,0,253~7,2,253 +2,4,167~2,7,167 +3,6,135~6,6,135 +3,7,287~6,7,287 +4,2,291~5,2,291 +5,5,269~6,5,269 +7,2,141~7,4,141 +4,9,21~6,9,21 +1,5,22~1,5,25 +3,8,296~3,8,298 +1,7,111~1,8,111 +0,9,217~1,9,217 +7,4,79~9,4,79 +0,6,207~0,8,207 +3,4,209~3,5,209 +3,4,152~3,6,152 +2,5,20~2,7,20 +7,0,187~7,3,187 +5,4,129~5,6,129 +8,1,254~8,1,257 +2,0,106~3,0,106 +6,5,248~8,5,248 +5,8,92~7,8,92 +9,6,274~9,8,274 +6,2,121~6,4,121 +4,0,112~4,2,112 +3,0,63~3,2,63 +1,5,239~1,6,239 +0,6,7~0,8,7 +6,7,135~8,7,135 +6,7,67~9,7,67 +1,2,83~1,5,83 +6,7,240~7,7,240 +7,5,8~9,5,8 +4,1,23~4,4,23 +3,2,277~3,2,279 +4,0,219~4,2,219 +4,1,237~6,1,237 +1,6,280~1,7,280 +2,4,197~2,5,197 +6,9,237~9,9,237 +7,8,70~8,8,70 +0,4,180~1,4,180 +4,6,180~5,6,180 +0,5,259~4,5,259 +5,2,236~7,2,236 +7,9,98~8,9,98 +0,8,88~1,8,88 +1,0,80~2,0,80 +9,2,129~9,3,129 +6,5,282~8,5,282 +9,5,282~9,5,285 +6,6,223~8,6,223 +6,6,268~6,8,268 +7,9,65~9,9,65 +6,0,150~6,0,152 +5,3,231~6,3,231 +2,1,99~4,1,99 +7,0,298~7,3,298 +2,8,198~2,8,199 +5,1,95~5,3,95 +8,4,13~8,4,15 +2,0,195~3,0,195 +5,8,2~8,8,2 +7,2,1~7,4,1 +1,6,101~3,6,101 +9,3,235~9,5,235 +9,5,105~9,8,105 +1,5,126~3,5,126 +4,7,279~7,7,279 +6,2,252~6,3,252 +7,4,32~7,6,32 +2,8,114~4,8,114 +4,2,309~4,4,309 +8,2,50~8,2,50 +0,0,64~3,0,64 +2,0,213~2,1,213 +7,5,79~7,7,79 +9,3,9~9,3,12 +9,6,42~9,7,42 +0,3,82~2,3,82 +7,5,313~7,6,313 +4,3,60~4,5,60 +0,8,203~2,8,203 +6,1,1~8,1,1 +6,1,52~8,1,52 +3,2,87~3,5,87 +6,7,282~8,7,282 +1,2,88~3,2,88 +3,7,264~3,8,264 +1,0,217~1,2,217 +5,7,284~7,7,284 +7,2,269~7,2,271 +7,4,278~9,4,278 +0,9,2~2,9,2 +2,2,272~2,4,272 +2,2,260~5,2,260 +1,6,278~1,8,278 +1,3,48~1,4,48 +2,2,52~4,2,52 +5,6,300~6,6,300 +6,7,33~8,7,33 +2,5,75~4,5,75 +1,8,277~1,9,277 +1,5,270~1,6,270 +7,3,60~7,4,60 +7,8,203~7,9,203 +5,7,208~5,9,208 +3,1,240~4,1,240 +4,7,86~4,7,90 +8,2,49~8,4,49 +9,3,127~9,4,127 +1,0,216~4,0,216 +5,1,311~7,1,311 +4,1,243~6,1,243 +9,2,55~9,4,55 +5,0,143~8,0,143 +0,3,212~0,4,212 +5,6,239~5,6,241 +0,4,135~2,4,135 +1,7,251~3,7,251 +0,0,218~0,2,218 +5,8,271~6,8,271 +1,5,199~3,5,199 +9,1,195~9,2,195 +3,0,11~3,0,13 +2,3,171~4,3,171 +2,7,5~4,7,5 +7,7,289~7,8,289 +6,6,235~6,7,235 +6,4,57~9,4,57 +2,3,124~2,5,124 +0,7,100~3,7,100 +2,9,34~5,9,34 +5,2,256~5,2,258 +0,6,203~3,6,203 +5,1,208~5,4,208 +0,3,271~0,4,271 +6,0,310~6,3,310 +2,2,109~4,2,109 +3,4,192~3,4,192 +9,0,215~9,2,215 +4,0,136~4,3,136 +4,4,41~6,4,41 +4,7,83~7,7,83 +2,3,22~4,3,22 +5,7,175~7,7,175 +6,6,170~6,9,170 +3,5,46~3,7,46 +7,4,48~7,6,48 +9,0,286~9,1,286 +2,2,278~2,2,280 +4,2,125~4,4,125 +5,3,301~5,6,301 +0,8,67~2,8,67 +3,1,72~3,1,74 +0,3,174~2,3,174 +8,0,146~9,0,146 +7,0,189~7,2,189 +5,2,209~7,2,209 +6,6,84~6,8,84 +2,6,190~2,9,190 +4,7,99~4,9,99 +1,7,43~3,7,43 +8,5,267~8,6,267 +5,7,281~8,7,281 +5,0,210~5,2,210 +3,9,268~3,9,270 +8,5,134~8,5,136 +6,1,214~8,1,214 +8,1,70~8,3,70 +2,1,21~2,4,21 +8,8,4~8,9,4 +8,5,249~9,5,249 +3,0,208~3,2,208 +4,7,41~4,9,41 +5,3,97~6,3,97 +8,3,312~8,5,312 +2,0,33~2,0,36 +7,3,192~7,4,192 +5,5,66~5,5,67 +9,1,211~9,2,211 +5,4,294~5,4,296 +9,3,279~9,5,279 +8,3,82~8,5,82 +5,3,65~5,5,65 +4,4,11~4,6,11 +0,1,66~2,1,66 +4,6,186~4,6,186 +2,2,183~2,2,185 +4,5,294~5,5,294 +4,0,105~7,0,105 +4,0,270~4,1,270 +6,5,77~6,8,77 +8,6,264~8,7,264 +1,0,115~4,0,115 +7,2,194~7,2,196 +3,5,77~3,5,77 +4,9,265~6,9,265 +5,7,263~5,9,263 +6,1,216~6,4,216 +6,8,49~8,8,49 +6,5,297~6,7,297 +6,7,178~9,7,178 +1,4,26~1,6,26 +5,6,60~8,6,60 +5,2,103~6,2,103 +5,6,170~5,6,173 +8,4,270~8,6,270 +4,2,26~7,2,26 +4,7,167~4,7,169 +4,5,59~5,5,59 +6,4,45~9,4,45 +6,0,51~6,2,51 +0,7,89~3,7,89 +3,3,28~3,4,28 +0,0,128~0,0,128 +1,6,231~4,6,231 +6,3,284~9,3,284 +6,4,202~6,6,202 +7,5,113~7,6,113 +0,4,54~1,4,54 +1,0,228~2,0,228 +2,4,156~4,4,156 +6,2,2~6,4,2 +8,4,141~8,5,141 +2,8,86~4,8,86 +0,7,9~0,9,9 +6,2,223~8,2,223 +3,5,253~5,5,253 +1,4,235~3,4,235 +6,9,198~6,9,201 +1,6,241~3,6,241 +5,5,101~5,7,101 +2,8,14~6,8,14 +4,3,124~6,3,124 +7,4,144~7,4,147 +8,6,138~8,8,138 +1,2,210~1,4,210 +6,3,190~8,3,190 +3,6,92~3,7,92 +1,3,93~2,3,93 +5,9,230~7,9,230 +2,7,42~3,7,42 +4,9,230~4,9,231 +5,8,274~5,9,274 +6,5,179~6,7,179 +0,8,281~2,8,281 +1,4,199~1,4,199 +8,1,313~8,4,313 +0,0,1~0,2,1 +5,7,205~7,7,205 +1,7,198~1,7,201 +4,3,260~4,5,260 +2,6,111~2,8,111 +3,6,291~5,6,291 +4,1,89~4,2,89 +3,1,86~3,3,86 +0,5,57~0,8,57 +3,1,62~4,1,62 +9,1,5~9,3,5 +8,4,47~8,6,47 +4,7,206~5,7,206 +5,6,236~5,8,236 +0,5,186~0,7,186 +7,2,193~8,2,193 +7,5,286~7,7,286 +4,5,58~4,6,58 +3,5,22~4,5,22 +0,3,36~2,3,36 +0,0,125~1,0,125 +5,1,70~5,2,70 +3,2,54~3,5,54 +0,5,1~0,6,1 +7,2,227~7,4,227 +7,5,5~7,8,5 +2,0,226~3,0,226 +5,0,246~7,0,246 +3,1,43~3,2,43 +0,5,206~0,7,206 +2,0,225~2,2,225 +3,4,233~3,6,233 +4,4,36~4,7,36 +3,2,275~3,4,275 +9,1,63~9,4,63 +0,3,88~0,5,88 +3,1,225~3,3,225 +6,4,291~9,4,291 +6,5,226~6,7,226 +1,4,296~2,4,296 +3,1,96~6,1,96 +0,8,198~1,8,198 +1,8,230~1,9,230 +7,0,220~7,1,220 +4,4,304~5,4,304 +0,1,282~0,3,282 +3,3,149~3,4,149 +3,1,34~5,1,34 +4,1,207~4,3,207 +0,1,124~3,1,124 +0,3,208~1,3,208 +6,6,75~8,6,75 +7,6,62~7,9,62 +1,4,237~1,6,237 +6,2,239~8,2,239 +5,2,310~5,4,310 +7,2,114~7,3,114 +5,7,18~6,7,18 +7,5,250~7,8,250 +5,1,3~5,4,3 +3,3,155~6,3,155 +8,4,277~8,7,277 +4,3,132~4,3,134 +4,3,263~4,3,263 +2,1,315~5,1,315 +8,8,28~9,8,28 +3,9,100~5,9,100 +1,0,105~3,0,105 +7,7,64~7,8,64 +0,2,40~3,2,40 +0,0,104~2,0,104 +8,0,207~8,2,207 +4,1,133~6,1,133 +3,2,183~7,2,183 +3,7,2~3,7,2 +4,7,70~7,7,70 +7,6,252~8,6,252 +8,5,165~8,6,165 +1,9,236~3,9,236 +4,0,50~4,3,50 +9,3,215~9,4,215 +4,8,37~7,8,37 +8,1,10~8,2,10 +6,7,183~6,8,183 +2,2,114~5,2,114 +6,5,104~9,5,104 +5,4,51~5,6,51 +4,5,165~4,8,165 +6,1,264~6,3,264 +7,1,255~7,1,257 +9,0,7~9,4,7 +5,9,94~7,9,94 +4,3,262~7,3,262 +5,1,201~7,1,201 +4,8,238~5,8,238 +4,7,267~6,7,267 +4,1,55~4,3,55 +3,3,154~3,5,154 +9,6,213~9,9,213 +6,1,167~6,4,167 +8,6,209~8,8,209 +3,4,25~4,4,25 +5,2,225~8,2,225 +2,7,248~4,7,248 +4,4,72~4,6,72 +8,0,289~9,0,289 +0,3,257~3,3,257 +5,2,62~6,2,62 +9,4,86~9,4,88 +0,5,257~2,5,257 +5,5,211~6,5,211 +5,9,231~6,9,231 +0,9,213~0,9,216 +9,0,218~9,0,219 +0,6,52~0,8,52 +5,3,289~5,6,289 +1,6,43~3,6,43 +6,7,237~6,8,237 +8,7,80~8,9,80 +2,2,222~4,2,222 +4,6,7~4,8,7 +8,0,264~8,0,265 +2,0,101~2,2,101 +1,5,79~3,5,79 +5,5,262~6,5,262 +3,3,73~3,4,73 +8,6,63~8,8,63 +2,3,19~5,3,19 +4,3,286~6,3,286 +4,4,161~4,7,161 +2,6,225~6,6,225 +0,7,212~0,9,212 +4,9,197~6,9,197 +6,9,71~6,9,75 +6,4,52~6,6,52 +5,2,294~6,2,294 +5,3,165~5,5,165 +8,6,116~8,8,116 +5,2,253~5,4,253 +4,6,136~5,6,136 +6,0,203~6,3,203 +4,6,233~7,6,233 +9,1,212~9,2,212 +6,1,247~9,1,247 +7,7,277~7,9,277 +7,6,255~7,7,255 +1,4,179~3,4,179 +1,1,222~3,1,222 +0,0,201~0,2,201 +8,3,36~8,6,36 +0,7,272~0,9,272 +4,0,56~6,0,56 +4,5,45~4,6,45 +2,6,270~2,8,270 +3,5,43~5,5,43 +9,3,316~9,6,316 +5,6,164~5,9,164 +3,4,228~3,6,228 +8,9,239~9,9,239 +6,5,4~6,7,4 +1,2,135~1,2,136 +6,2,13~6,3,13 +1,1,60~1,1,61 +3,0,187~3,2,187 +4,1,8~7,1,8 +9,2,282~9,4,282 +1,7,17~4,7,17 +8,8,64~9,8,64 +9,6,272~9,8,272 +1,3,297~1,5,297 +1,1,6~5,1,6 +7,0,240~7,2,240 +4,0,33~6,0,33 +2,7,25~2,7,27 +8,4,9~8,6,9 +0,7,96~0,9,96 +6,5,209~9,5,209 +3,3,307~5,3,307 +3,7,211~5,7,211 +4,2,87~4,4,87 +5,2,73~5,2,73 +4,6,241~4,8,241 +5,6,270~6,6,270 +3,5,23~3,5,25 +6,1,299~6,4,299 +6,0,4~8,0,4 +2,1,204~5,1,204 +4,1,75~6,1,75 +5,2,165~8,2,165 +2,0,229~2,0,231 +4,2,307~5,2,307 +7,0,97~9,0,97 +8,4,16~8,4,18 +4,0,272~4,0,275 +2,1,223~2,3,223 +1,8,274~1,9,274 +5,0,130~5,2,130 +1,8,195~2,8,195 +9,1,9~9,2,9 +7,2,7~7,4,7 +5,2,250~8,2,250 +6,4,285~6,4,287 +1,0,170~4,0,170 +3,3,309~3,6,309 +2,6,264~4,6,264 +3,7,109~5,7,109 +0,7,98~2,7,98 +5,7,239~5,9,239 +0,8,115~2,8,115 +4,4,222~6,4,222 +6,7,110~8,7,110 +4,5,237~4,8,237 +3,2,180~3,4,180 +3,1,312~3,3,312 +9,5,183~9,7,183 +4,7,72~4,8,72 +9,5,258~9,5,260 +2,4,159~5,4,159 +6,1,72~6,4,72 +0,1,261~0,4,261 +0,1,175~0,3,175 +1,2,46~1,5,46 +2,1,224~2,3,224 +2,6,273~2,7,273 +4,0,186~4,3,186 +0,4,51~1,4,51 +6,1,312~7,1,312 +3,7,266~3,9,266 +0,6,80~2,6,80 +3,7,262~5,7,262 +7,3,288~8,3,288 +2,8,200~3,8,200 +1,6,29~1,8,29 +8,1,297~8,2,297 +4,8,217~6,8,217 +5,5,35~8,5,35 +3,5,234~3,7,234 +5,5,3~5,7,3 +4,5,16~6,5,16 +8,3,293~8,5,293 +9,0,188~9,2,188 +2,2,206~2,5,206 +1,6,47~3,6,47 +1,5,1~1,8,1 +7,6,138~7,9,138 +6,9,14~9,9,14 +7,1,139~7,3,139 +1,9,118~1,9,121 +2,8,82~4,8,82 +0,4,197~0,6,197 +4,1,142~4,4,142 +3,7,295~3,9,295 +6,3,230~9,3,230 +3,4,261~3,5,261 +2,6,214~4,6,214 +7,2,230~7,2,233 +7,2,211~7,4,211 +5,6,5~5,7,5 +5,5,164~8,5,164 +2,4,183~5,4,183 +7,8,82~9,8,82 +3,0,90~5,0,90 +4,1,293~4,3,293 +7,7,85~7,9,85 +6,1,220~6,4,220 +6,7,276~8,7,276 +8,1,243~8,5,243 +6,3,101~6,5,101 +0,7,217~0,8,217 +6,0,110~9,0,110 +9,7,89~9,9,89 +3,1,2~3,2,2 +6,5,304~8,5,304 +7,2,28~7,4,28 +2,5,14~4,5,14 +9,1,238~9,3,238 +7,2,61~9,2,61 +8,2,210~9,2,210 +2,4,100~5,4,100 +7,0,78~7,2,78 +0,9,10~0,9,13 +3,8,193~5,8,193 +7,0,219~8,0,219 +9,7,296~9,7,297 +1,7,101~4,7,101 +1,7,39~4,7,39 +8,2,1~8,2,3 +8,1,86~8,3,86 +8,2,262~8,2,264 +6,3,196~6,5,196 +2,1,282~3,1,282 +2,1,277~2,3,277 +0,7,90~3,7,90 +1,5,92~1,5,94 +2,6,62~5,6,62 +5,4,284~8,4,284 +4,6,177~4,7,177 +5,1,136~7,1,136 +3,3,187~4,3,187 +6,7,27~9,7,27 +2,5,83~2,6,83 +9,4,46~9,4,49 +3,3,179~4,3,179 +7,0,130~9,0,130 +1,2,139~1,4,139 +0,4,185~0,6,185 +3,6,74~3,9,74 +1,8,233~1,8,235 +5,4,256~5,6,256 +9,7,86~9,7,86 +1,3,81~1,5,81 +9,3,233~9,4,233 +3,9,296~6,9,296 +7,6,30~7,8,30 +3,0,267~5,0,267 +0,3,44~0,6,44 +0,6,193~3,6,193 +5,6,19~5,7,19 +0,2,91~0,4,91 +3,9,230~3,9,233 +6,1,79~7,1,79 +1,2,130~3,2,130 +6,2,169~6,4,169 +7,6,97~7,9,97 +7,2,266~7,3,266 +7,8,141~9,8,141 +1,3,88~1,7,88 +0,6,95~0,8,95 +7,9,100~7,9,101 +9,1,2~9,1,4 +6,5,267~7,5,267 +6,5,37~6,6,37 +8,0,261~8,3,261 +5,8,3~6,8,3 +0,6,174~2,6,174 +3,7,24~3,8,24 +4,8,223~6,8,223 +5,0,275~6,0,275 +6,4,44~7,4,44 +1,1,206~3,1,206 +5,2,21~5,3,21 +3,6,93~3,6,95 +0,6,38~4,6,38 +8,1,253~8,4,253 +9,4,133~9,6,133 +0,6,195~3,6,195 +6,8,168~8,8,168 +6,2,296~8,2,296 +4,6,131~7,6,131 +4,8,10~6,8,10 +3,3,189~3,3,191 +9,1,258~9,2,258 +3,0,197~3,0,200 +4,0,223~6,0,223 +3,2,197~3,4,197 +1,2,89~2,2,89 +3,8,272~4,8,272 +7,2,264~7,3,264 +0,1,4~3,1,4 +2,2,261~2,5,261 +8,1,5~8,3,5 +3,2,66~3,2,66 +4,2,289~4,4,289 +3,0,186~3,2,186 +2,6,215~2,8,215 +4,1,61~4,3,61 +7,3,123~9,3,123 +6,2,117~8,2,117 +9,3,251~9,6,251 +2,8,206~3,8,206 +8,4,306~8,7,306 +7,5,25~7,7,25 +9,1,84~9,4,84 +1,5,20~1,8,20 +7,0,50~7,4,50 +2,1,52~5,1,52 +7,7,47~9,7,47 +0,4,59~0,6,59 +7,7,42~8,7,42 +4,3,130~5,3,130 +2,5,196~2,6,196 +6,5,64~6,5,65 +0,1,279~2,1,279 +6,7,116~7,7,116 +0,6,64~1,6,64 +0,0,121~2,0,121 +3,8,65~4,8,65 +0,2,142~2,2,142 +3,9,13~6,9,13 +0,8,216~3,8,216 +7,5,208~9,5,208 +3,8,44~3,9,44 +4,6,69~4,7,69 +8,2,259~8,5,259 +0,2,260~0,6,260 +2,6,37~4,6,37 +8,4,65~8,6,65 +9,4,108~9,5,108 +7,6,93~8,6,93 +5,9,92~7,9,92 +6,5,62~6,6,62 +5,1,239~5,2,239 +4,8,81~4,9,81 +8,0,128~8,2,128 +4,3,107~4,3,109 +6,5,19~6,6,19 +4,7,67~4,8,67 +9,5,83~9,8,83 +7,4,193~7,4,196 +9,4,129~9,4,131 +1,3,203~4,3,203 +9,1,81~9,2,81 +9,5,1~9,5,3 +3,5,236~3,5,239 +3,6,261~3,8,261 +4,1,10~6,1,10 +5,1,266~5,3,266 +1,0,126~1,0,128 +4,6,80~4,9,80 +5,8,12~7,8,12 +0,6,263~1,6,263 +4,2,91~4,5,91 +7,8,210~9,8,210 +7,8,291~7,9,291 +9,2,130~9,3,130 +9,1,285~9,2,285 +2,1,54~2,4,54 +0,1,83~0,3,83 +5,5,110~8,5,110 +5,0,96~7,0,96 +8,1,246~9,1,246 +5,6,59~7,6,59 +6,8,275~6,8,275 +6,0,148~9,0,148 +2,6,258~5,6,258 +1,2,133~1,5,133 +0,6,271~0,8,271 +9,2,18~9,5,18 +9,5,185~9,6,185 +5,5,311~8,5,311 +9,7,271~9,9,271 +3,3,305~5,3,305 +4,5,266~6,5,266 +9,6,215~9,6,216 +4,2,65~4,3,65 +1,7,46~1,9,46 +2,0,43~2,2,43 +5,9,269~6,9,269 +3,7,292~5,7,292 +3,4,278~3,6,278 +2,4,208~4,4,208 +6,5,139~8,5,139 +5,2,304~5,3,304 +1,8,66~3,8,66 +6,6,245~8,6,245 +4,4,145~4,5,145 +7,8,88~7,9,88 +5,6,184~7,6,184 +5,2,127~5,4,127 +6,2,201~6,3,201 +8,1,7~8,4,7 +4,2,46~6,2,46 +3,2,5~3,2,6 +5,4,261~6,4,261 +0,3,46~0,6,46 +3,1,57~3,2,57 +5,9,205~5,9,206 +1,1,39~1,4,39 +1,0,242~1,1,242 +8,1,16~8,1,19 +6,1,188~6,1,190 +2,4,92~4,4,92 +6,6,51~7,6,51 +4,2,48~4,4,48 +5,3,219~7,3,219 +8,9,182~8,9,182 +1,1,40~2,1,40 +9,3,91~9,4,91 +4,0,104~4,3,104 +5,2,10~7,2,10 +2,1,275~2,3,275 +5,3,99~5,6,99 +0,4,85~0,5,85 +5,9,36~7,9,36 +4,0,279~4,1,279 +1,0,10~3,0,10 +2,1,207~3,1,207 +4,3,234~4,6,234 +2,0,71~5,0,71 +8,6,78~8,7,78 +4,9,102~4,9,105 +2,6,73~4,6,73 +3,6,162~6,6,162 +6,1,199~6,4,199 +4,7,226~4,8,226 +8,0,217~8,2,217 +4,5,265~4,8,265 +6,2,110~8,2,110 +2,5,179~2,7,179 +6,8,173~8,8,173 +3,0,36~5,0,36 +7,5,271~7,7,271 +6,6,114~6,9,114 +1,0,67~3,0,67 +1,0,86~1,3,86 +5,0,140~5,2,140 +5,0,265~5,2,265 +5,2,87~5,3,87 +6,7,250~6,9,250 +4,4,37~4,4,38 +8,7,227~8,8,227 +2,1,210~2,3,210 +8,1,220~8,1,222 +1,9,228~3,9,228 +5,7,16~5,8,16 +0,0,8~0,1,8 +0,3,200~3,3,200 +8,3,89~9,3,89 +3,8,37~3,8,39 +1,4,136~1,5,136 +5,1,277~5,3,277 +6,4,246~6,5,246 +5,9,15~8,9,15 +8,5,261~8,7,261 +8,2,127~8,3,127 +2,1,3~2,4,3 +8,2,144~8,4,144 +7,4,53~9,4,53 +3,3,138~6,3,138 +6,9,63~8,9,63 +3,6,204~5,6,204 +3,5,179~3,6,179 From fa9ba51cd45ffb757eb61ea71c3535dd133ea853 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 22 Dec 2023 15:29:36 +0100 Subject: [PATCH 463/479] 2023: d22: ex1: add solution --- 2023/d22/ex1/ex1.py | 128 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100755 2023/d22/ex1/ex1.py diff --git a/2023/d22/ex1/ex1.py b/2023/d22/ex1/ex1.py new file mode 100755 index 0000000..1e2eaa5 --- /dev/null +++ b/2023/d22/ex1/ex1.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python + +import dataclasses +import sys +from collections import defaultdict +from collections.abc import Iterator +from typing import NamedTuple + + +def sign(x: int) -> int: + if x == 0: + return 0 + return 1 if x > 0 else -1 + + +class Point(NamedTuple): + x: int + y: int + z: int + + def fall(self, delta: int = 0) -> "Point": + assert delta <= self.z # Sanity check + return self._replace(z=self.z - delta) + + +@dataclasses.dataclass +class Brick: + top_left: Point + bot_right: Point + + def __post_init__(self) -> None: + assert self.top_left.z >= self.bot_right.z # Sanity check + + def orientation(self) -> Point: + return Point( + sign(self.bot_right.x - self.top_left.x), + sign(self.bot_right.y - self.top_left.y), + sign(self.bot_right.z - self.top_left.z), + ) + + def blocks(self) -> Iterator[Point]: + p = self.top_left + dx, dy, dz = self.orientation() + while p != self.bot_right: + yield p + p = Point(p.x + dx, p.y + dy, p.z + dz) + yield self.bot_right + + def fall(self, delta: int = 0) -> "Brick": + assert delta >= 0 # Sanity check + return Brick(self.top_left.fall(delta), self.bot_right.fall(delta)) + + +class TowerMap(NamedTuple): + supports: dict[int, set[int]] + supported_by: dict[int, set[int]] + num_bricks: int + + @classmethod + def compute_support(cls, tower: dict[Point, int]) -> "TowerMap": + supports: dict[int, set[int]] = defaultdict(set) + supported_by: dict[int, set[int]] = defaultdict(set) + + for p, i in tower.items(): + under = p.fall(1) + support = tower.get(under) + # No supporting brick + if support is None: + continue + # Don't count the brick as supporting itself + if support == i: + continue + supports[support].add(i) + supported_by[i].add(support) + + return cls( + supports=dict(supports), + supported_by=dict(supported_by), + num_bricks=max(supports.keys() | supported_by.keys()) + 1, + ) + + +def solve(input: list[str]) -> int: + def parse_brick(line: str) -> Brick: + a, b = (Point._make(map(int, p.split(","))) for p in line.split("~")) + if a < b: + a, b = b, a + return Brick(a, b) + + # Returns which point in space belongs to which brick index + def drop(snapshots: list[Brick]) -> dict[Point, int]: + # Re-order by lowest height + snapshots = sorted(snapshots, key=lambda b: b.bot_right.z) + # By default the ground is at 0, index with Point(p.x, p.y, 0) + heights: dict[Point, int] = defaultdict(int) + res: dict[Point, int] = {} + + for i, brick in enumerate(snapshots): + z = max(heights[p.fall(p.z)] for p in brick.blocks()) + 1 + assert brick.bot_right.z >= z # Sanity check + delta = brick.bot_right.z - z # Drop it to the top of the pile + brick = brick.fall(delta) + # Record the height of the brick for every block composing it + for p in brick.blocks(): + res[p] = i + heights[p.fall(p.z)] = brick.top_left.z + + return res + + def can_disintegrate(tower_map: TowerMap, brick: int) -> bool: + for on_top in tower_map.supports.get(brick, set()): + if len(tower_map.supported_by[on_top]) == 1: + return False + return True + + snapshots = [parse_brick(line) for line in input] + tower = drop(snapshots) + tower_map = TowerMap.compute_support(tower) + return sum(can_disintegrate(tower_map, i) for i in range(tower_map.num_bricks)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 789b19ad0c85ab2ac13cca556067f6355f3f4b82 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 22 Dec 2023 15:30:19 +0100 Subject: [PATCH 464/479] 2023: d22: ex2: add input --- 2023/d22/ex2/input | 1233 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1233 insertions(+) create mode 100644 2023/d22/ex2/input diff --git a/2023/d22/ex2/input b/2023/d22/ex2/input new file mode 100644 index 0000000..6209227 --- /dev/null +++ b/2023/d22/ex2/input @@ -0,0 +1,1233 @@ +4,6,74~4,6,76 +0,3,277~0,4,277 +7,4,124~7,6,124 +5,1,268~5,1,269 +6,8,273~6,8,274 +8,0,268~8,0,270 +5,5,84~5,7,84 +1,9,196~3,9,196 +7,3,214~9,3,214 +6,2,171~8,2,171 +6,4,122~7,4,122 +1,2,177~1,5,177 +5,1,31~5,2,31 +1,3,196~1,6,196 +0,7,93~0,8,93 +0,5,267~0,6,267 +7,2,256~9,2,256 +3,8,40~4,8,40 +3,7,289~6,7,289 +7,5,269~7,7,269 +8,1,191~8,3,191 +3,0,190~5,0,190 +4,8,278~6,8,278 +8,6,25~8,9,25 +1,1,109~1,4,109 +4,6,270~4,7,270 +7,3,302~7,3,304 +6,0,108~8,0,108 +8,1,87~8,1,88 +6,6,94~6,8,94 +4,6,137~7,6,137 +3,4,20~3,7,20 +6,8,206~9,8,206 +6,9,266~8,9,266 +3,0,9~3,1,9 +9,0,82~9,3,82 +0,5,210~0,5,213 +5,5,303~7,5,303 +5,9,202~7,9,202 +8,3,256~8,6,256 +4,1,273~4,4,273 +6,6,1~6,7,1 +4,5,42~4,7,42 +5,6,183~7,6,183 +4,0,261~4,2,261 +3,3,271~5,3,271 +6,1,76~7,1,76 +5,2,59~7,2,59 +6,5,203~8,5,203 +4,6,278~6,6,278 +1,8,271~4,8,271 +6,4,279~7,4,279 +2,6,78~5,6,78 +9,7,112~9,9,112 +9,7,110~9,8,110 +6,2,208~9,2,208 +4,3,89~4,6,89 +2,7,93~2,9,93 +1,3,259~1,3,261 +5,3,45~7,3,45 +0,6,41~2,6,41 +3,8,42~5,8,42 +1,0,179~1,2,179 +1,1,283~3,1,283 +1,3,178~3,3,178 +3,5,182~3,7,182 +6,6,111~6,8,111 +1,0,106~1,2,106 +7,2,299~7,4,299 +8,7,88~8,9,88 +2,5,184~5,5,184 +1,0,2~2,0,2 +4,4,165~4,4,167 +1,9,116~2,9,116 +3,4,195~4,4,195 +8,5,150~8,7,150 +9,7,90~9,9,90 +1,7,31~1,9,31 +4,2,63~4,5,63 +5,0,271~5,0,274 +3,2,158~3,3,158 +4,4,150~4,5,150 +2,1,188~5,1,188 +2,2,35~2,4,35 +1,0,219~1,2,219 +1,6,98~3,6,98 +5,4,213~5,5,213 +7,1,120~7,3,120 +4,0,222~6,0,222 +7,2,112~9,2,112 +1,2,200~4,2,200 +2,3,165~2,4,165 +1,3,112~2,3,112 +0,3,189~2,3,189 +6,5,103~8,5,103 +2,6,176~3,6,176 +0,6,32~2,6,32 +2,2,297~2,4,297 +6,3,73~7,3,73 +8,4,231~8,6,231 +5,2,57~7,2,57 +8,6,180~8,9,180 +6,9,282~7,9,282 +0,0,65~0,2,65 +2,7,276~2,8,276 +1,8,191~2,8,191 +4,0,187~4,2,187 +5,6,214~8,6,214 +8,7,267~8,8,267 +2,1,246~4,1,246 +7,6,40~7,8,40 +6,2,248~6,4,248 +3,6,23~4,6,23 +9,6,181~9,8,181 +0,7,112~2,7,112 +3,4,147~4,4,147 +1,0,89~3,0,89 +5,2,172~7,2,172 +6,6,110~8,6,110 +6,5,133~6,7,133 +3,3,84~5,3,84 +9,4,128~9,6,128 +6,6,206~6,7,206 +7,2,131~7,3,131 +7,8,267~7,9,267 +7,1,12~7,3,12 +0,6,102~0,9,102 +2,8,96~4,8,96 +3,9,75~3,9,77 +3,0,70~3,3,70 +8,5,107~8,7,107 +4,7,173~5,7,173 +5,7,136~7,7,136 +1,1,57~2,1,57 +8,9,216~8,9,219 +3,4,267~3,6,267 +4,6,185~5,6,185 +2,2,16~2,5,16 +6,4,289~6,6,289 +1,5,255~3,5,255 +0,7,189~2,7,189 +7,4,234~7,7,234 +0,7,5~0,9,5 +0,5,214~0,5,217 +5,3,61~5,5,61 +1,9,193~3,9,193 +3,2,262~6,2,262 +5,4,291~5,5,291 +4,8,17~7,8,17 +9,6,45~9,7,45 +1,5,279~3,5,279 +0,1,7~0,2,7 +6,4,208~9,4,208 +0,3,49~0,6,49 +3,6,58~3,6,60 +6,1,55~8,1,55 +3,6,25~4,6,25 +3,6,57~5,6,57 +0,1,188~0,4,188 +0,0,262~0,1,262 +7,9,214~9,9,214 +9,6,70~9,7,70 +3,4,131~5,4,131 +5,7,224~5,9,224 +1,9,33~3,9,33 +5,1,185~5,4,185 +9,2,191~9,4,191 +2,5,201~5,5,201 +2,6,61~4,6,61 +8,7,215~9,7,215 +9,0,217~9,1,217 +3,2,56~3,4,56 +0,1,215~0,3,215 +1,4,45~1,6,45 +2,0,32~4,0,32 +5,9,173~7,9,173 +8,1,168~8,3,168 +5,5,167~6,5,167 +1,6,35~4,6,35 +2,6,54~4,6,54 +9,4,254~9,7,254 +7,0,80~8,0,80 +0,1,57~0,2,57 +5,9,276~5,9,278 +3,0,193~5,0,193 +0,6,202~3,6,202 +5,6,288~7,6,288 +0,7,218~0,7,219 +3,1,115~6,1,115 +0,3,276~2,3,276 +6,6,227~6,8,227 +8,4,224~8,7,224 +5,3,161~5,5,161 +4,3,26~6,3,26 +7,5,315~9,5,315 +6,6,41~9,6,41 +6,2,54~6,4,54 +6,9,279~7,9,279 +2,2,270~2,4,270 +3,7,84~3,8,84 +0,6,266~1,6,266 +2,4,164~4,4,164 +7,5,212~7,7,212 +6,2,75~6,2,76 +1,7,284~2,7,284 +6,7,300~7,7,300 +8,3,258~8,5,258 +7,8,205~9,8,205 +5,4,251~5,5,251 +1,2,205~1,4,205 +6,0,137~6,1,137 +1,7,102~2,7,102 +5,5,202~5,7,202 +7,7,179~7,9,179 +4,5,174~4,7,174 +7,6,13~7,8,13 +4,6,212~4,8,212 +0,7,222~0,8,222 +6,7,21~8,7,21 +7,5,17~9,5,17 +4,0,29~4,2,29 +1,7,253~1,7,254 +2,6,169~2,6,171 +1,5,164~4,5,164 +3,2,247~6,2,247 +3,3,295~3,3,296 +8,2,15~9,2,15 +2,4,34~2,6,34 +7,2,128~7,5,128 +0,4,189~3,4,189 +0,2,56~0,5,56 +1,7,114~1,9,114 +1,4,102~3,4,102 +3,2,272~3,4,272 +6,5,294~7,5,294 +2,3,81~4,3,81 +9,2,253~9,3,253 +5,2,43~5,4,43 +7,2,301~7,3,301 +6,5,320~8,5,320 +3,7,22~3,9,22 +2,8,35~5,8,35 +8,5,295~9,5,295 +6,9,68~7,9,68 +6,1,234~6,3,234 +5,8,67~7,8,67 +5,0,243~7,0,243 +5,0,118~5,2,118 +3,6,9~5,6,9 +4,3,275~4,6,275 +3,2,127~4,2,127 +6,6,247~6,8,247 +3,4,124~6,4,124 +4,3,274~5,3,274 +1,3,91~1,5,91 +4,6,64~4,8,64 +0,5,270~0,8,270 +4,4,103~6,4,103 +5,5,249~7,5,249 +2,0,52~5,0,52 +4,2,189~4,5,189 +8,1,241~8,2,241 +1,3,294~3,3,294 +8,0,1~8,0,2 +6,5,165~6,9,165 +3,5,41~3,7,41 +3,3,254~3,5,254 +2,6,105~2,7,105 +3,3,106~4,3,106 +7,9,268~9,9,268 +2,5,81~2,8,81 +0,6,199~0,8,199 +3,1,212~3,4,212 +5,5,63~5,6,63 +5,2,49~6,2,49 +6,8,39~6,9,39 +8,9,7~8,9,9 +7,7,24~7,9,24 +5,8,47~8,8,47 +5,5,187~5,5,189 +8,6,273~8,9,273 +8,9,185~9,9,185 +4,6,171~4,8,171 +2,7,191~4,7,191 +2,0,168~2,3,168 +5,1,68~5,3,68 +7,6,91~7,9,91 +8,1,13~8,3,13 +6,2,202~6,3,202 +6,0,200~6,1,200 +4,3,252~4,4,252 +5,0,93~5,2,93 +7,6,237~7,8,237 +0,8,33~2,8,33 +0,0,86~0,2,86 +8,6,226~8,6,229 +0,4,1~2,4,1 +2,0,122~2,3,122 +5,3,69~8,3,69 +2,8,46~4,8,46 +6,5,66~9,5,66 +7,6,294~9,6,294 +8,6,113~8,8,113 +5,1,163~5,4,163 +1,6,269~4,6,269 +8,6,207~8,7,207 +7,4,213~9,4,213 +2,6,22~2,8,22 +0,5,83~0,8,83 +0,2,210~0,4,210 +6,6,167~6,8,167 +5,4,171~7,4,171 +0,0,281~4,0,281 +5,0,270~5,2,270 +6,2,118~9,2,118 +5,0,53~6,0,53 +4,2,13~4,4,13 +2,6,52~5,6,52 +1,5,203~4,5,203 +7,5,14~7,7,14 +7,2,258~7,2,260 +6,2,193~6,3,193 +7,9,180~7,9,181 +6,3,307~6,5,307 +8,4,281~8,6,281 +4,2,107~7,2,107 +6,6,205~8,6,205 +6,7,51~6,8,51 +8,5,5~8,8,5 +9,6,295~9,7,295 +8,2,85~8,4,85 +0,2,268~0,5,268 +3,3,173~5,3,173 +8,3,285~8,5,285 +5,9,175~7,9,175 +3,7,194~5,7,194 +9,3,256~9,5,256 +9,1,80~9,4,80 +6,1,100~6,3,100 +6,6,88~8,6,88 +2,7,15~5,7,15 +2,2,180~2,5,180 +0,8,70~0,9,70 +0,2,221~0,3,221 +7,7,16~9,7,16 +3,1,101~5,1,101 +8,8,29~9,8,29 +3,0,80~5,0,80 +2,3,291~4,3,291 +4,6,243~7,6,243 +1,0,118~4,0,118 +4,2,78~4,5,78 +5,9,67~7,9,67 +1,8,192~4,8,192 +5,3,259~5,5,259 +6,4,5~8,4,5 +5,4,132~5,5,132 +0,7,85~0,9,85 +1,9,201~4,9,201 +8,6,24~8,7,24 +2,1,249~3,1,249 +0,5,209~0,8,209 +7,4,317~7,6,317 +0,5,37~2,5,37 +3,5,185~5,5,185 +7,5,292~7,7,292 +6,2,266~6,3,266 +1,3,42~1,3,44 +4,6,245~4,8,245 +1,3,45~2,3,45 +7,5,167~7,6,167 +4,8,3~4,8,3 +5,4,205~7,4,205 +4,5,308~7,5,308 +2,0,77~5,0,77 +5,1,47~5,3,47 +9,2,193~9,4,193 +1,9,194~4,9,194 +4,7,12~4,9,12 +3,2,211~3,5,211 +4,7,182~6,7,182 +7,1,14~9,1,14 +0,6,99~0,7,99 +8,0,273~8,1,273 +2,4,268~4,4,268 +5,2,28~5,2,28 +6,9,19~8,9,19 +1,3,55~1,5,55 +6,1,245~6,4,245 +4,8,214~4,8,216 +3,2,188~3,2,190 +5,9,17~7,9,17 +1,8,284~1,9,284 +9,7,269~9,9,269 +4,7,200~4,9,200 +0,4,184~0,7,184 +5,2,50~5,4,50 +9,6,108~9,9,108 +4,0,277~4,1,277 +6,6,220~6,8,220 +6,3,251~6,5,251 +1,0,240~1,4,240 +0,0,199~0,4,199 +4,1,139~5,1,139 +2,4,291~4,4,291 +2,4,294~2,6,294 +5,6,73~8,6,73 +0,6,62~0,8,62 +5,6,167~5,8,167 +5,5,135~5,5,138 +0,8,282~0,9,282 +7,4,274~7,6,274 +7,2,185~9,2,185 +4,3,269~5,3,269 +6,4,262~6,4,265 +0,9,104~0,9,106 +3,5,128~3,5,129 +5,5,205~8,5,205 +8,3,147~8,5,147 +2,5,168~2,6,168 +6,4,126~6,4,128 +4,0,311~8,0,311 +6,0,211~6,3,211 +6,1,185~6,2,185 +6,3,290~7,3,290 +6,9,233~6,9,234 +5,1,244~5,1,247 +4,2,249~4,3,249 +0,0,123~2,0,123 +1,2,182~1,3,182 +7,0,140~7,2,140 +8,8,85~8,9,85 +6,0,14~6,3,14 +0,4,181~0,7,181 +1,4,197~1,7,197 +3,0,76~3,2,76 +7,5,131~8,5,131 +7,4,77~7,7,77 +0,7,283~1,7,283 +5,0,205~8,0,205 +3,6,155~3,8,155 +8,6,68~8,6,70 +6,0,254~7,0,254 +7,3,126~9,3,126 +1,7,94~4,7,94 +8,3,11~8,6,11 +5,6,45~5,8,45 +8,4,86~8,7,86 +7,8,292~9,8,292 +2,9,227~5,9,227 +1,7,108~4,7,108 +7,0,253~7,2,253 +2,4,167~2,7,167 +3,6,135~6,6,135 +3,7,287~6,7,287 +4,2,291~5,2,291 +5,5,269~6,5,269 +7,2,141~7,4,141 +4,9,21~6,9,21 +1,5,22~1,5,25 +3,8,296~3,8,298 +1,7,111~1,8,111 +0,9,217~1,9,217 +7,4,79~9,4,79 +0,6,207~0,8,207 +3,4,209~3,5,209 +3,4,152~3,6,152 +2,5,20~2,7,20 +7,0,187~7,3,187 +5,4,129~5,6,129 +8,1,254~8,1,257 +2,0,106~3,0,106 +6,5,248~8,5,248 +5,8,92~7,8,92 +9,6,274~9,8,274 +6,2,121~6,4,121 +4,0,112~4,2,112 +3,0,63~3,2,63 +1,5,239~1,6,239 +0,6,7~0,8,7 +6,7,135~8,7,135 +6,7,67~9,7,67 +1,2,83~1,5,83 +6,7,240~7,7,240 +7,5,8~9,5,8 +4,1,23~4,4,23 +3,2,277~3,2,279 +4,0,219~4,2,219 +4,1,237~6,1,237 +1,6,280~1,7,280 +2,4,197~2,5,197 +6,9,237~9,9,237 +7,8,70~8,8,70 +0,4,180~1,4,180 +4,6,180~5,6,180 +0,5,259~4,5,259 +5,2,236~7,2,236 +7,9,98~8,9,98 +0,8,88~1,8,88 +1,0,80~2,0,80 +9,2,129~9,3,129 +6,5,282~8,5,282 +9,5,282~9,5,285 +6,6,223~8,6,223 +6,6,268~6,8,268 +7,9,65~9,9,65 +6,0,150~6,0,152 +5,3,231~6,3,231 +2,1,99~4,1,99 +7,0,298~7,3,298 +2,8,198~2,8,199 +5,1,95~5,3,95 +8,4,13~8,4,15 +2,0,195~3,0,195 +5,8,2~8,8,2 +7,2,1~7,4,1 +1,6,101~3,6,101 +9,3,235~9,5,235 +9,5,105~9,8,105 +1,5,126~3,5,126 +4,7,279~7,7,279 +6,2,252~6,3,252 +7,4,32~7,6,32 +2,8,114~4,8,114 +4,2,309~4,4,309 +8,2,50~8,2,50 +0,0,64~3,0,64 +2,0,213~2,1,213 +7,5,79~7,7,79 +9,3,9~9,3,12 +9,6,42~9,7,42 +0,3,82~2,3,82 +7,5,313~7,6,313 +4,3,60~4,5,60 +0,8,203~2,8,203 +6,1,1~8,1,1 +6,1,52~8,1,52 +3,2,87~3,5,87 +6,7,282~8,7,282 +1,2,88~3,2,88 +3,7,264~3,8,264 +1,0,217~1,2,217 +5,7,284~7,7,284 +7,2,269~7,2,271 +7,4,278~9,4,278 +0,9,2~2,9,2 +2,2,272~2,4,272 +2,2,260~5,2,260 +1,6,278~1,8,278 +1,3,48~1,4,48 +2,2,52~4,2,52 +5,6,300~6,6,300 +6,7,33~8,7,33 +2,5,75~4,5,75 +1,8,277~1,9,277 +1,5,270~1,6,270 +7,3,60~7,4,60 +7,8,203~7,9,203 +5,7,208~5,9,208 +3,1,240~4,1,240 +4,7,86~4,7,90 +8,2,49~8,4,49 +9,3,127~9,4,127 +1,0,216~4,0,216 +5,1,311~7,1,311 +4,1,243~6,1,243 +9,2,55~9,4,55 +5,0,143~8,0,143 +0,3,212~0,4,212 +5,6,239~5,6,241 +0,4,135~2,4,135 +1,7,251~3,7,251 +0,0,218~0,2,218 +5,8,271~6,8,271 +1,5,199~3,5,199 +9,1,195~9,2,195 +3,0,11~3,0,13 +2,3,171~4,3,171 +2,7,5~4,7,5 +7,7,289~7,8,289 +6,6,235~6,7,235 +6,4,57~9,4,57 +2,3,124~2,5,124 +0,7,100~3,7,100 +2,9,34~5,9,34 +5,2,256~5,2,258 +0,6,203~3,6,203 +5,1,208~5,4,208 +0,3,271~0,4,271 +6,0,310~6,3,310 +2,2,109~4,2,109 +3,4,192~3,4,192 +9,0,215~9,2,215 +4,0,136~4,3,136 +4,4,41~6,4,41 +4,7,83~7,7,83 +2,3,22~4,3,22 +5,7,175~7,7,175 +6,6,170~6,9,170 +3,5,46~3,7,46 +7,4,48~7,6,48 +9,0,286~9,1,286 +2,2,278~2,2,280 +4,2,125~4,4,125 +5,3,301~5,6,301 +0,8,67~2,8,67 +3,1,72~3,1,74 +0,3,174~2,3,174 +8,0,146~9,0,146 +7,0,189~7,2,189 +5,2,209~7,2,209 +6,6,84~6,8,84 +2,6,190~2,9,190 +4,7,99~4,9,99 +1,7,43~3,7,43 +8,5,267~8,6,267 +5,7,281~8,7,281 +5,0,210~5,2,210 +3,9,268~3,9,270 +8,5,134~8,5,136 +6,1,214~8,1,214 +8,1,70~8,3,70 +2,1,21~2,4,21 +8,8,4~8,9,4 +8,5,249~9,5,249 +3,0,208~3,2,208 +4,7,41~4,9,41 +5,3,97~6,3,97 +8,3,312~8,5,312 +2,0,33~2,0,36 +7,3,192~7,4,192 +5,5,66~5,5,67 +9,1,211~9,2,211 +5,4,294~5,4,296 +9,3,279~9,5,279 +8,3,82~8,5,82 +5,3,65~5,5,65 +4,4,11~4,6,11 +0,1,66~2,1,66 +4,6,186~4,6,186 +2,2,183~2,2,185 +4,5,294~5,5,294 +4,0,105~7,0,105 +4,0,270~4,1,270 +6,5,77~6,8,77 +8,6,264~8,7,264 +1,0,115~4,0,115 +7,2,194~7,2,196 +3,5,77~3,5,77 +4,9,265~6,9,265 +5,7,263~5,9,263 +6,1,216~6,4,216 +6,8,49~8,8,49 +6,5,297~6,7,297 +6,7,178~9,7,178 +1,4,26~1,6,26 +5,6,60~8,6,60 +5,2,103~6,2,103 +5,6,170~5,6,173 +8,4,270~8,6,270 +4,2,26~7,2,26 +4,7,167~4,7,169 +4,5,59~5,5,59 +6,4,45~9,4,45 +6,0,51~6,2,51 +0,7,89~3,7,89 +3,3,28~3,4,28 +0,0,128~0,0,128 +1,6,231~4,6,231 +6,3,284~9,3,284 +6,4,202~6,6,202 +7,5,113~7,6,113 +0,4,54~1,4,54 +1,0,228~2,0,228 +2,4,156~4,4,156 +6,2,2~6,4,2 +8,4,141~8,5,141 +2,8,86~4,8,86 +0,7,9~0,9,9 +6,2,223~8,2,223 +3,5,253~5,5,253 +1,4,235~3,4,235 +6,9,198~6,9,201 +1,6,241~3,6,241 +5,5,101~5,7,101 +2,8,14~6,8,14 +4,3,124~6,3,124 +7,4,144~7,4,147 +8,6,138~8,8,138 +1,2,210~1,4,210 +6,3,190~8,3,190 +3,6,92~3,7,92 +1,3,93~2,3,93 +5,9,230~7,9,230 +2,7,42~3,7,42 +4,9,230~4,9,231 +5,8,274~5,9,274 +6,5,179~6,7,179 +0,8,281~2,8,281 +1,4,199~1,4,199 +8,1,313~8,4,313 +0,0,1~0,2,1 +5,7,205~7,7,205 +1,7,198~1,7,201 +4,3,260~4,5,260 +2,6,111~2,8,111 +3,6,291~5,6,291 +4,1,89~4,2,89 +3,1,86~3,3,86 +0,5,57~0,8,57 +3,1,62~4,1,62 +9,1,5~9,3,5 +8,4,47~8,6,47 +4,7,206~5,7,206 +5,6,236~5,8,236 +0,5,186~0,7,186 +7,2,193~8,2,193 +7,5,286~7,7,286 +4,5,58~4,6,58 +3,5,22~4,5,22 +0,3,36~2,3,36 +0,0,125~1,0,125 +5,1,70~5,2,70 +3,2,54~3,5,54 +0,5,1~0,6,1 +7,2,227~7,4,227 +7,5,5~7,8,5 +2,0,226~3,0,226 +5,0,246~7,0,246 +3,1,43~3,2,43 +0,5,206~0,7,206 +2,0,225~2,2,225 +3,4,233~3,6,233 +4,4,36~4,7,36 +3,2,275~3,4,275 +9,1,63~9,4,63 +0,3,88~0,5,88 +3,1,225~3,3,225 +6,4,291~9,4,291 +6,5,226~6,7,226 +1,4,296~2,4,296 +3,1,96~6,1,96 +0,8,198~1,8,198 +1,8,230~1,9,230 +7,0,220~7,1,220 +4,4,304~5,4,304 +0,1,282~0,3,282 +3,3,149~3,4,149 +3,1,34~5,1,34 +4,1,207~4,3,207 +0,1,124~3,1,124 +0,3,208~1,3,208 +6,6,75~8,6,75 +7,6,62~7,9,62 +1,4,237~1,6,237 +6,2,239~8,2,239 +5,2,310~5,4,310 +7,2,114~7,3,114 +5,7,18~6,7,18 +7,5,250~7,8,250 +5,1,3~5,4,3 +3,3,155~6,3,155 +8,4,277~8,7,277 +4,3,132~4,3,134 +4,3,263~4,3,263 +2,1,315~5,1,315 +8,8,28~9,8,28 +3,9,100~5,9,100 +1,0,105~3,0,105 +7,7,64~7,8,64 +0,2,40~3,2,40 +0,0,104~2,0,104 +8,0,207~8,2,207 +4,1,133~6,1,133 +3,2,183~7,2,183 +3,7,2~3,7,2 +4,7,70~7,7,70 +7,6,252~8,6,252 +8,5,165~8,6,165 +1,9,236~3,9,236 +4,0,50~4,3,50 +9,3,215~9,4,215 +4,8,37~7,8,37 +8,1,10~8,2,10 +6,7,183~6,8,183 +2,2,114~5,2,114 +6,5,104~9,5,104 +5,4,51~5,6,51 +4,5,165~4,8,165 +6,1,264~6,3,264 +7,1,255~7,1,257 +9,0,7~9,4,7 +5,9,94~7,9,94 +4,3,262~7,3,262 +5,1,201~7,1,201 +4,8,238~5,8,238 +4,7,267~6,7,267 +4,1,55~4,3,55 +3,3,154~3,5,154 +9,6,213~9,9,213 +6,1,167~6,4,167 +8,6,209~8,8,209 +3,4,25~4,4,25 +5,2,225~8,2,225 +2,7,248~4,7,248 +4,4,72~4,6,72 +8,0,289~9,0,289 +0,3,257~3,3,257 +5,2,62~6,2,62 +9,4,86~9,4,88 +0,5,257~2,5,257 +5,5,211~6,5,211 +5,9,231~6,9,231 +0,9,213~0,9,216 +9,0,218~9,0,219 +0,6,52~0,8,52 +5,3,289~5,6,289 +1,6,43~3,6,43 +6,7,237~6,8,237 +8,7,80~8,9,80 +2,2,222~4,2,222 +4,6,7~4,8,7 +8,0,264~8,0,265 +2,0,101~2,2,101 +1,5,79~3,5,79 +5,5,262~6,5,262 +3,3,73~3,4,73 +8,6,63~8,8,63 +2,3,19~5,3,19 +4,3,286~6,3,286 +4,4,161~4,7,161 +2,6,225~6,6,225 +0,7,212~0,9,212 +4,9,197~6,9,197 +6,9,71~6,9,75 +6,4,52~6,6,52 +5,2,294~6,2,294 +5,3,165~5,5,165 +8,6,116~8,8,116 +5,2,253~5,4,253 +4,6,136~5,6,136 +6,0,203~6,3,203 +4,6,233~7,6,233 +9,1,212~9,2,212 +6,1,247~9,1,247 +7,7,277~7,9,277 +7,6,255~7,7,255 +1,4,179~3,4,179 +1,1,222~3,1,222 +0,0,201~0,2,201 +8,3,36~8,6,36 +0,7,272~0,9,272 +4,0,56~6,0,56 +4,5,45~4,6,45 +2,6,270~2,8,270 +3,5,43~5,5,43 +9,3,316~9,6,316 +5,6,164~5,9,164 +3,4,228~3,6,228 +8,9,239~9,9,239 +6,5,4~6,7,4 +1,2,135~1,2,136 +6,2,13~6,3,13 +1,1,60~1,1,61 +3,0,187~3,2,187 +4,1,8~7,1,8 +9,2,282~9,4,282 +1,7,17~4,7,17 +8,8,64~9,8,64 +9,6,272~9,8,272 +1,3,297~1,5,297 +1,1,6~5,1,6 +7,0,240~7,2,240 +4,0,33~6,0,33 +2,7,25~2,7,27 +8,4,9~8,6,9 +0,7,96~0,9,96 +6,5,209~9,5,209 +3,3,307~5,3,307 +3,7,211~5,7,211 +4,2,87~4,4,87 +5,2,73~5,2,73 +4,6,241~4,8,241 +5,6,270~6,6,270 +3,5,23~3,5,25 +6,1,299~6,4,299 +6,0,4~8,0,4 +2,1,204~5,1,204 +4,1,75~6,1,75 +5,2,165~8,2,165 +2,0,229~2,0,231 +4,2,307~5,2,307 +7,0,97~9,0,97 +8,4,16~8,4,18 +4,0,272~4,0,275 +2,1,223~2,3,223 +1,8,274~1,9,274 +5,0,130~5,2,130 +1,8,195~2,8,195 +9,1,9~9,2,9 +7,2,7~7,4,7 +5,2,250~8,2,250 +6,4,285~6,4,287 +1,0,170~4,0,170 +3,3,309~3,6,309 +2,6,264~4,6,264 +3,7,109~5,7,109 +0,7,98~2,7,98 +5,7,239~5,9,239 +0,8,115~2,8,115 +4,4,222~6,4,222 +6,7,110~8,7,110 +4,5,237~4,8,237 +3,2,180~3,4,180 +3,1,312~3,3,312 +9,5,183~9,7,183 +4,7,72~4,8,72 +9,5,258~9,5,260 +2,4,159~5,4,159 +6,1,72~6,4,72 +0,1,261~0,4,261 +0,1,175~0,3,175 +1,2,46~1,5,46 +2,1,224~2,3,224 +2,6,273~2,7,273 +4,0,186~4,3,186 +0,4,51~1,4,51 +6,1,312~7,1,312 +3,7,266~3,9,266 +0,6,80~2,6,80 +3,7,262~5,7,262 +7,3,288~8,3,288 +2,8,200~3,8,200 +1,6,29~1,8,29 +8,1,297~8,2,297 +4,8,217~6,8,217 +5,5,35~8,5,35 +3,5,234~3,7,234 +5,5,3~5,7,3 +4,5,16~6,5,16 +8,3,293~8,5,293 +9,0,188~9,2,188 +2,2,206~2,5,206 +1,6,47~3,6,47 +1,5,1~1,8,1 +7,6,138~7,9,138 +6,9,14~9,9,14 +7,1,139~7,3,139 +1,9,118~1,9,121 +2,8,82~4,8,82 +0,4,197~0,6,197 +4,1,142~4,4,142 +3,7,295~3,9,295 +6,3,230~9,3,230 +3,4,261~3,5,261 +2,6,214~4,6,214 +7,2,230~7,2,233 +7,2,211~7,4,211 +5,6,5~5,7,5 +5,5,164~8,5,164 +2,4,183~5,4,183 +7,8,82~9,8,82 +3,0,90~5,0,90 +4,1,293~4,3,293 +7,7,85~7,9,85 +6,1,220~6,4,220 +6,7,276~8,7,276 +8,1,243~8,5,243 +6,3,101~6,5,101 +0,7,217~0,8,217 +6,0,110~9,0,110 +9,7,89~9,9,89 +3,1,2~3,2,2 +6,5,304~8,5,304 +7,2,28~7,4,28 +2,5,14~4,5,14 +9,1,238~9,3,238 +7,2,61~9,2,61 +8,2,210~9,2,210 +2,4,100~5,4,100 +7,0,78~7,2,78 +0,9,10~0,9,13 +3,8,193~5,8,193 +7,0,219~8,0,219 +9,7,296~9,7,297 +1,7,101~4,7,101 +1,7,39~4,7,39 +8,2,1~8,2,3 +8,1,86~8,3,86 +8,2,262~8,2,264 +6,3,196~6,5,196 +2,1,282~3,1,282 +2,1,277~2,3,277 +0,7,90~3,7,90 +1,5,92~1,5,94 +2,6,62~5,6,62 +5,4,284~8,4,284 +4,6,177~4,7,177 +5,1,136~7,1,136 +3,3,187~4,3,187 +6,7,27~9,7,27 +2,5,83~2,6,83 +9,4,46~9,4,49 +3,3,179~4,3,179 +7,0,130~9,0,130 +1,2,139~1,4,139 +0,4,185~0,6,185 +3,6,74~3,9,74 +1,8,233~1,8,235 +5,4,256~5,6,256 +9,7,86~9,7,86 +1,3,81~1,5,81 +9,3,233~9,4,233 +3,9,296~6,9,296 +7,6,30~7,8,30 +3,0,267~5,0,267 +0,3,44~0,6,44 +0,6,193~3,6,193 +5,6,19~5,7,19 +0,2,91~0,4,91 +3,9,230~3,9,233 +6,1,79~7,1,79 +1,2,130~3,2,130 +6,2,169~6,4,169 +7,6,97~7,9,97 +7,2,266~7,3,266 +7,8,141~9,8,141 +1,3,88~1,7,88 +0,6,95~0,8,95 +7,9,100~7,9,101 +9,1,2~9,1,4 +6,5,267~7,5,267 +6,5,37~6,6,37 +8,0,261~8,3,261 +5,8,3~6,8,3 +0,6,174~2,6,174 +3,7,24~3,8,24 +4,8,223~6,8,223 +5,0,275~6,0,275 +6,4,44~7,4,44 +1,1,206~3,1,206 +5,2,21~5,3,21 +3,6,93~3,6,95 +0,6,38~4,6,38 +8,1,253~8,4,253 +9,4,133~9,6,133 +0,6,195~3,6,195 +6,8,168~8,8,168 +6,2,296~8,2,296 +4,6,131~7,6,131 +4,8,10~6,8,10 +3,3,189~3,3,191 +9,1,258~9,2,258 +3,0,197~3,0,200 +4,0,223~6,0,223 +3,2,197~3,4,197 +1,2,89~2,2,89 +3,8,272~4,8,272 +7,2,264~7,3,264 +0,1,4~3,1,4 +2,2,261~2,5,261 +8,1,5~8,3,5 +3,2,66~3,2,66 +4,2,289~4,4,289 +3,0,186~3,2,186 +2,6,215~2,8,215 +4,1,61~4,3,61 +7,3,123~9,3,123 +6,2,117~8,2,117 +9,3,251~9,6,251 +2,8,206~3,8,206 +8,4,306~8,7,306 +7,5,25~7,7,25 +9,1,84~9,4,84 +1,5,20~1,8,20 +7,0,50~7,4,50 +2,1,52~5,1,52 +7,7,47~9,7,47 +0,4,59~0,6,59 +7,7,42~8,7,42 +4,3,130~5,3,130 +2,5,196~2,6,196 +6,5,64~6,5,65 +0,1,279~2,1,279 +6,7,116~7,7,116 +0,6,64~1,6,64 +0,0,121~2,0,121 +3,8,65~4,8,65 +0,2,142~2,2,142 +3,9,13~6,9,13 +0,8,216~3,8,216 +7,5,208~9,5,208 +3,8,44~3,9,44 +4,6,69~4,7,69 +8,2,259~8,5,259 +0,2,260~0,6,260 +2,6,37~4,6,37 +8,4,65~8,6,65 +9,4,108~9,5,108 +7,6,93~8,6,93 +5,9,92~7,9,92 +6,5,62~6,6,62 +5,1,239~5,2,239 +4,8,81~4,9,81 +8,0,128~8,2,128 +4,3,107~4,3,109 +6,5,19~6,6,19 +4,7,67~4,8,67 +9,5,83~9,8,83 +7,4,193~7,4,196 +9,4,129~9,4,131 +1,3,203~4,3,203 +9,1,81~9,2,81 +9,5,1~9,5,3 +3,5,236~3,5,239 +3,6,261~3,8,261 +4,1,10~6,1,10 +5,1,266~5,3,266 +1,0,126~1,0,128 +4,6,80~4,9,80 +5,8,12~7,8,12 +0,6,263~1,6,263 +4,2,91~4,5,91 +7,8,210~9,8,210 +7,8,291~7,9,291 +9,2,130~9,3,130 +9,1,285~9,2,285 +2,1,54~2,4,54 +0,1,83~0,3,83 +5,5,110~8,5,110 +5,0,96~7,0,96 +8,1,246~9,1,246 +5,6,59~7,6,59 +6,8,275~6,8,275 +6,0,148~9,0,148 +2,6,258~5,6,258 +1,2,133~1,5,133 +0,6,271~0,8,271 +9,2,18~9,5,18 +9,5,185~9,6,185 +5,5,311~8,5,311 +9,7,271~9,9,271 +3,3,305~5,3,305 +4,5,266~6,5,266 +9,6,215~9,6,216 +4,2,65~4,3,65 +1,7,46~1,9,46 +2,0,43~2,2,43 +5,9,269~6,9,269 +3,7,292~5,7,292 +3,4,278~3,6,278 +2,4,208~4,4,208 +6,5,139~8,5,139 +5,2,304~5,3,304 +1,8,66~3,8,66 +6,6,245~8,6,245 +4,4,145~4,5,145 +7,8,88~7,9,88 +5,6,184~7,6,184 +5,2,127~5,4,127 +6,2,201~6,3,201 +8,1,7~8,4,7 +4,2,46~6,2,46 +3,2,5~3,2,6 +5,4,261~6,4,261 +0,3,46~0,6,46 +3,1,57~3,2,57 +5,9,205~5,9,206 +1,1,39~1,4,39 +1,0,242~1,1,242 +8,1,16~8,1,19 +6,1,188~6,1,190 +2,4,92~4,4,92 +6,6,51~7,6,51 +4,2,48~4,4,48 +5,3,219~7,3,219 +8,9,182~8,9,182 +1,1,40~2,1,40 +9,3,91~9,4,91 +4,0,104~4,3,104 +5,2,10~7,2,10 +2,1,275~2,3,275 +5,3,99~5,6,99 +0,4,85~0,5,85 +5,9,36~7,9,36 +4,0,279~4,1,279 +1,0,10~3,0,10 +2,1,207~3,1,207 +4,3,234~4,6,234 +2,0,71~5,0,71 +8,6,78~8,7,78 +4,9,102~4,9,105 +2,6,73~4,6,73 +3,6,162~6,6,162 +6,1,199~6,4,199 +4,7,226~4,8,226 +8,0,217~8,2,217 +4,5,265~4,8,265 +6,2,110~8,2,110 +2,5,179~2,7,179 +6,8,173~8,8,173 +3,0,36~5,0,36 +7,5,271~7,7,271 +6,6,114~6,9,114 +1,0,67~3,0,67 +1,0,86~1,3,86 +5,0,140~5,2,140 +5,0,265~5,2,265 +5,2,87~5,3,87 +6,7,250~6,9,250 +4,4,37~4,4,38 +8,7,227~8,8,227 +2,1,210~2,3,210 +8,1,220~8,1,222 +1,9,228~3,9,228 +5,7,16~5,8,16 +0,0,8~0,1,8 +0,3,200~3,3,200 +8,3,89~9,3,89 +3,8,37~3,8,39 +1,4,136~1,5,136 +5,1,277~5,3,277 +6,4,246~6,5,246 +5,9,15~8,9,15 +8,5,261~8,7,261 +8,2,127~8,3,127 +2,1,3~2,4,3 +8,2,144~8,4,144 +7,4,53~9,4,53 +3,3,138~6,3,138 +6,9,63~8,9,63 +3,6,204~5,6,204 +3,5,179~3,6,179 From a1c64e606ece853cba313624c222bc0b5d31e456 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Fri, 22 Dec 2023 15:30:25 +0100 Subject: [PATCH 465/479] 2023: d22: ex2: add solution --- 2023/d22/ex2/ex2.py | 157 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100755 2023/d22/ex2/ex2.py diff --git a/2023/d22/ex2/ex2.py b/2023/d22/ex2/ex2.py new file mode 100755 index 0000000..c9ce5d4 --- /dev/null +++ b/2023/d22/ex2/ex2.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python + +import dataclasses +import sys +from collections import defaultdict +from collections.abc import Iterator +from typing import NamedTuple + + +def sign(x: int) -> int: + if x == 0: + return 0 + return 1 if x > 0 else -1 + + +class Point(NamedTuple): + x: int + y: int + z: int + + def fall(self, delta: int = 0) -> "Point": + assert delta <= self.z # Sanity check + return self._replace(z=self.z - delta) + + +@dataclasses.dataclass +class Brick: + top_left: Point + bot_right: Point + + def __post_init__(self) -> None: + assert self.top_left.z >= self.bot_right.z # Sanity check + + def orientation(self) -> Point: + return Point( + sign(self.bot_right.x - self.top_left.x), + sign(self.bot_right.y - self.top_left.y), + sign(self.bot_right.z - self.top_left.z), + ) + + def blocks(self) -> Iterator[Point]: + p = self.top_left + dx, dy, dz = self.orientation() + while p != self.bot_right: + yield p + p = Point(p.x + dx, p.y + dy, p.z + dz) + yield self.bot_right + + def fall(self, delta: int = 0) -> "Brick": + assert delta >= 0 # Sanity check + return Brick(self.top_left.fall(delta), self.bot_right.fall(delta)) + + +class TowerMap(NamedTuple): + supports: dict[int, set[int]] + supported_by: dict[int, set[int]] + num_bricks: int + + @classmethod + def compute_support(cls, tower: dict[Point, int]) -> "TowerMap": + supports: dict[int, set[int]] = defaultdict(set) + supported_by: dict[int, set[int]] = defaultdict(set) + + for p, i in tower.items(): + under = p.fall(1) + support = tower.get(under) + # No supporting brick + if support is None: + continue + # Don't count the brick as supporting itself + if support == i: + continue + supports[support].add(i) + supported_by[i].add(support) + + return cls( + supports=dict(supports), + supported_by=dict(supported_by), + num_bricks=max(supports.keys() | supported_by.keys()) + 1, + ) + + def roots(self) -> set[int]: + return {p for p in range(self.num_bricks) if p not in self.supported_by} + + # From bottom to top of tower + def topo_sort(self) -> list[int]: + res: list[int] = [] + nodes = self.roots() + seen: set[int] = set() + + while nodes: + node = nodes.pop() + res.append(node) + seen.add(node) + for child in self.supports.get(node, set()): + if len(self.supported_by[child] - seen) == 0: + nodes.add(child) + + assert set(res) == set(range(self.num_bricks)) # Sanity check + # NOTE: from construction, the topo_sort is just list(range(self.num_bricks)) + # But I'd rather do the actual algorithm for completeness + return res + + +def solve(input: list[str]) -> int: + def parse_brick(line: str) -> Brick: + a, b = (Point._make(map(int, p.split(","))) for p in line.split("~")) + if a < b: + a, b = b, a + return Brick(a, b) + + # Returns which point in space belongs to which brick index + def drop(snapshots: list[Brick]) -> dict[Point, int]: + # Re-order by lowest height + snapshots = sorted(snapshots, key=lambda b: b.bot_right.z) + # By default the ground is at 0, index with Point(p.x, p.y, 0) + heights: dict[Point, int] = defaultdict(int) + res: dict[Point, int] = {} + + for i, brick in enumerate(snapshots): + z = max(heights[p.fall(p.z)] for p in brick.blocks()) + 1 + assert brick.bot_right.z >= z # Sanity check + delta = brick.bot_right.z - z # Drop it to the top of the pile + brick = brick.fall(delta) + # Record the height of the brick for every block composing it + for p in brick.blocks(): + res[p] = i + heights[p.fall(p.z)] = brick.top_left.z + + return res + + def disintegrate(tower_map: TowerMap, brick: int) -> int: + fallen = {brick} + + for b in tower_map.topo_sort(): + parents = tower_map.supported_by.get(b, set()) + # Bricks on the floor shouldn't fall + if len(parents) == 0: + continue + if all(parent in fallen for parent in parents): + fallen.add(b) + + return len(fallen) - 1 # Don't count the disintegrated brick + + snapshots = [parse_brick(line) for line in input] + tower = drop(snapshots) + tower_map = TowerMap.compute_support(tower) + return sum(disintegrate(tower_map, i) for i in range(tower_map.num_bricks)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From f07d58e9f2354b126e451b959d935e9fbbb9421e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 23 Dec 2023 10:57:08 +0100 Subject: [PATCH 466/479] 2023: d23: ex1: add input --- 2023/d23/ex1/input | 141 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 2023/d23/ex1/input diff --git a/2023/d23/ex1/input b/2023/d23/ex1/input new file mode 100644 index 0000000..8a1a97e --- /dev/null +++ b/2023/d23/ex1/input @@ -0,0 +1,141 @@ +#.########################################################################################################################################### +#.#...#...#...#...#...#.........#.......#...#.......#...###...###...#...#...#...###...#...#...#...#.....###...#...###...#.....#...#...#...### +#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#####.#.#.#.#####.#.#.###.#.###.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.###.###.#.#.#.###.#.#.###.#.#.#.#.#.#.### +#.#.#.#.#.#.#.#.#.#.#...#.......#.....#.#.#.#.....#...#...#.#.#...#.#.#...#.#.#...#.#.#.#.#.#.#.#.#.#...#...#.#.#...#.#.#...#.#.#...#...#...# +#.#.#.#.#v#.#.#.#.#.#####.###########.#.#.#.#####.#######.#.#.#.###.#.#####.#.###.#.#.#.#.#.#.#.#.#.#.###.###.#.###.#.#.###.#.#.###########.# +#...#...#.>.#...#...#.....#...#...#...#...#...#...#.......#.#...#...#.#.....#...#.#.#...#.#.#.#.#...#...#...#.#.#...#.#.###.#.#.#...........# +#########v###########.#####.#.#.#.#.#########.#.###.#######.#####.###.#.#######.#.#.#####.#.#.#.#######.###.#.#.#.###.#.###.#.#.#.########### +#...#...#.#...........#...#.#.#.#.#.......#...#...#.#...###.#.....###.#.#...###.#.#.....#.#.#.#.#.......#...#...#...#.#...#.#.#.#.#...#...### +#.#.#.#.#.#.###########.#.#.#.#.#.#######.#.#####.#.#.#.###.#.#######.#.#.#.###.#.#####.#.#.#.#.#.#######.#########.#.###.#.#.#.#.#.#.#.#.### +#.#...#...#...#...###...#...#.#.#.###...#.#.#...#.#.#.#.#...#...>.>.#.#.#.#.#...#.#...#.#.#.#.#.#.#...###.....#####.#.#...#.#.#.#...#...#...# +#.###########.#.#.###.#######.#.#.###.#.#.#.#.#.#.#.#.#.#.#######v#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#######.#####.#.#.###.#.#.###########.# +#.........###.#.#...#...#.....#.#.....#.#.#...#.#.#.#.#.#...#.....#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.>.>...#.....#...#.....#...#...#.......# +#########.###.#.###.###.#.#####.#######.#.#####.#.#.#.#.###.#.#########.#.#.###.#.#.#.#.#.#.#.#.#.#.###v###.#####.###############.#.#.####### +#####...#.#...#...#...#.#.#...#.......#.#.....#.#.#...#.#...#.#...###...#.#.#...#...#.#.#.#.#...#.#...#...#...#...###...#...###...#.#.......# +#####.#.#.#.#####.###.#.#.#.#.#######.#.#####.#.#.#####.#.###.#.#.###.###.#.#.#######.#.#.#.#####.###.###.###.#.#####.#.#.#.###.###.#######.# +#.....#...#.......###.#.#...#.#.>.>...#.......#...#...#.#...#...#...#.....#.#.#...###...#.#.#.....#...###...#...#.....#...#.....###...#.....# +#.###################.#.#####.#.#v#################.#.#.###.#######.#######.#.#.#.#######.#.#.#####.#######.#####.###################.#.##### +#...........#.........#.#.....#.#...#...###...###...#.#.#...###...#.....#...#...#.......#.#.#.#...#.#.....#.....#...#.............#...#.....# +###########.#.#########.#.#####.###.#.#.###.#.###.###.#.#.#####.#.#####.#.#############.#.#.#.#.#.#.#.###.#####.###.#.###########.#.#######.# +#...........#.....#...#.#.#...#.#...#.#.....#.....#...#.#.#...#.#.......#.>.>.....#.....#.#.#.#.#...#.#...#...#...#.#.#...........#...#.....# +#.###############.#.#.#.#.#.#.#.#.###.#############.###.#.#.#.#.###########v#####.#.#####.#.#.#.#####.#.###.#.###.#.#.#.#############.#.##### +#.........#.....#.#.#.#.#...#...#.....#.....#.....#...#...#.#...#...###...#.....#.#.....#...#...#...#.#.#...#.....#...#.............#.#.....# +#########.#.###.#.#.#.#.###############.###.#.###.###.#####.#####.#.###.#.#####.#.#####.#########.#.#.#.#.#########################.#.#####.# +#.........#.#...#...#...###.....#...###...#.#...#.....#.....#...#.#.....#.#.....#...#...#...###...#...#.#.........#...###...........#...#...# +#.#########.#.#############.###.#.#.#####.#.###.#######.#####.#.#.#######.#.#######.#.###.#.###.#######.#########.#.#.###.#############.#.### +#.......#...#.#...#.....#...#...#.#.#...#.#.....#...###.......#...#.......#.......#...#...#...#.......#.........#...#.#...#...........#.#...# +#######.#.###.#.#.#.###.#.###.###.#.#.#.#.#######.#.###############.#############.#####.#####.#######.#########.#####.#.###.#########.#.###.# +#.......#...#.#.#.#...#.#...#.###.#.#.#.#.###...#.#.....###...#.....#...###.......#...#...#...#...###.#.......#.#.....#.....#.........#.....# +#.#########.#.#.#.###.#.###.#.###.#.#.#.#v###.#.#.#####.###.#.#.#####.#.###.#######.#.###.#.###.#.###.#.#####.#.#.###########v############### +#.........#.#.#.#.#...#...#.#...#.#.#.#.>.>...#.#.#.....#...#.#.......#.#...#...###.#...#.#...#.#...#...#.....#...#...#...#.>.#...#...#...### +#########.#.#.#.#.#.#####.#.###.#.#.#.###v#####.#.#.#####.###.#########.#.###.#.###.###.#.###.#.###.#####.#########.#.#.#.#.#v#.#.#.#.#.#.### +#.........#.#...#.#...###.#.###.#.#...#...###...#.#.#...#...#.#...#.....#...#.#.###.#...#...#.#.#...#...#...###...#.#.#.#.#.#...#.#.#...#...# +#.#########.#####.###.###.#.###.#.#####.#####.###.#.#.#.###.#.#.#.#v#######v#.#.###.#.#####.#.#.#.###.#.###v###.#.#.#.#.#.#.#####.#.#######.# +#.#...#...#.#...#.#...#...#.#...#.#...#.....#.....#.#.#...#.#.#.#.>.>...#.>.>.#...#.#.#...#.#.#.#.#...#...>.>...#.#.#.#.#...###...#.#.......# +#.#.#v#.#.#.#.#.#.#.###.###.#.###.#.#.#####.#######.#.###.#.#.#.###v###.#.#v#####.#.#.#.#.#.#.#.#.#.#######v#####.#.#.#.#######.###.#.####### +#.#.#.>.#.#...#.#...#...#...#.....#.#.#...#.......#.#...#.#.#.#.#...#...#.#.#...#.#.#.#.#.#.#.#.#.#.#.....#.....#...#.#.###...#...#.#.#...### +#.#.#v###.#####.#####.###.#########.#.#.#.#######.#.###.#.#.#.#.#.###.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#####.#####.#.###.#.###.#.#.#.#.### +#...#...#.......#...#...#...#.......#...#.....#...#.....#...#...#...#.....#...#.#.#.#.#.#...#.#.#.#.#...#.....#.#.....#...#.#.....#.#...#...# +#######.#########.#.###.###.#.###############.#.###################.###########.#.#.#.#.#####.#.#.#.###.#####.#.#.#######.#.#######.#######.# +#.......#.........#...#.#...#.............#...#...#.....###...#...#...#.........#...#...#.....#.#...###.....#.#.#.....#...#.#.......#.....#.# +#.#######.###########.#.#.###############.#.#####.#.###.###.#.#.#.###.#.#################.#####.###########.#.#.#####.#.###.#.#######.###.#.# +#.......#.#.....#.....#...#...#...#.....#.#.......#...#.###.#.#.#...#.#...#...#...#...###.....#.#...........#.#.....#.#.#...#.#.....#...#.#.# +#######.#.#.###.#.#########.#.#.#.#.###.#.###########.#.###.#.#.###.#.###.#.#.#.#.#.#.#######.#.#.###########.#####.#.#.#.###.#.###.###.#.#.# +#.......#.#...#.#.#.....#...#...#...###...#...#.......#.....#.#...#...###...#...#...#.......#...#...........#.......#...#.....#...#.#...#.#.# +#.#######.###.#.#.#.###.#.#################.#.#.#############.###.#########################.###############.#####################.#.#.###.#.# +#...#.....#...#...#.#...#...................#.#.............#...#.#...###...#...............#...#...........###...###...#.........#...#...#.# +###.#.#####.#######.#.#######################.#############.###.#.#.#.###.#.#.###############.#.#.#############.#.###.#.#.#############.###.# +###...#...#.....###.#.#...#...#...........#...#.............###.#...#...#.#...#.....#.........#.#...............#.#...#.#.......#...###.....# +#######.#.#####.###.#.#.#.#.#.#.#########.#.###.###############.#######.#.#####.###.#.#########.#################.#.###.#######.#.#.######### +#####...#.......#...#.#.#.#.#.#.........#...###.............###.......#.#.#...#...#.#...#.......#...........#.....#...#.....###...#.....#...# +#####.###########.###.#.#.#.#.#########.###################.#########.#.#.#.#.###.#.###.#.#######.#########.#.#######.#####.###########.#.#.# +#.....#.....#...#...#.#.#.#.#.#...#.....###...#.....#.......#...#...#...#...#.....#.#...#.......#.........#...#...#...#.....#.......#...#.#.# +#.#####.###.#.#.###.#.#.#.#.#.#.#.#v#######.#.#.###.#.#######.#.#.#.###############.#.#########.#########.#####.#.#.###.#####.#####.#.###.#.# +#.......###.#.#...#.#.#.#.#.#.#.#.>.>.#####.#.#.#...#...#####.#.#.#.###...#...#...#...###.....#.#.....#...#...#.#.#...#.#...#...#...#.....#.# +###########.#.###.#.#.#.#.#.#.#.###v#.#####.#.#.#.#####v#####.#.#.#.###.#.#.#.#.#.#######.###.#.#.###.#v###.#.#.#.###.#.#.#.###v#.#########.# +#...........#...#.#.#.#.#.#.#.#.#...#...#...#.#.#.....>.>.###.#.#.#...#.#.#.#.#.#...#.....###...#...#.>.>.#.#.#.#.#...#.#.#...>.#...#...#...# +#.#############.#.#.#.#.#.#.#.#.#.#####.#.###.#.#######v#.###.#.#.###.#.#.#.#.#.###.#.#############.###v#.#.#.#.#.#.###.#.#####v###.#.#.#.### +#...........#...#.#.#.#.#.#.#...#...###.#.###...#.......#...#.#.#.#...#.#.#.#.#.#...#.....#...#...#.#...#...#...#.#.###...###...###...#...### +###########v#.###.#.#.#.#.#.#######.###.#.#######.#########.#.#.#.#.###.#.#.#.#.#.#######v#.#.#.#.#.#.###########.#.#########.############### +#.......###.>.###.#.#.#.#.#.###...#...#.#.......#.........#.#.#.#.#...#.#.#.#.#.#...#...>.>.#.#.#.#.#...#...#...#...#####...#.#...#...#.....# +#.#####.###v#####.#.#.#.#.#.###.#.###.#.#######.#########.#.#.#.#.###.#.#.#.#.#.###.#.###v###.#.#.#.###.#.#.#.#.#########.#.#.#.#.#.#.#.###.# +#.#...#.....#...#...#...#.#.#...#.....#.........#...#.....#.#.#...#...#.#.#.#.#.#...#.#...###.#.#.#...#...#...#...#.......#.#...#...#...#...# +#.#.#.#######.#.#########.#.#.###################.#.#.#####.#.#####.###.#.#.#.#.#.###.#.#####.#.#.###.###########.#.#######.#############.### +#.#.#.#.......#.........#...#.....#...........#...#.#.....#.#.#.....#...#.#.#.#.#.#...#.....#...#.#...#...........#.#.....#...............### +#.#.#.#.###############.#########.#.#########.#.###.#####.#.#.#.#####.###.#.#.#.#.#.#######.#####.#.###.###########.#.###.################### +#...#.#.#.............#...#.......#.#.........#...#.......#...#.......#...#.#.#.#.#.#.......#...#...###.....#...###...#...#.................# +#####.#.#.###########.###.#.#######.#.###########.#####################.###.#.#.#.#.#.#######.#.###########.#.#.#######.###.###############.# +#.....#.#.........###.....#...#.....#...........#.....#...###.......#...#...#...#...#.........#.#...........#.#.......#.....#.......#.......# +#.#####.#########.###########.#.###############.#####.#.#.###.#####.#.###.#####################.#.###########.#######.#######.#####.#.####### +#.....#.#.........#.....#...#...#...............#####...#.....#.....#...#.#.....................#.............#.......###.....#...#...#.....# +#####.#.#.#########.###.#.#.#####.#############################.#######.#.#.###################################.#########.#####.#.#####.###.# +#...#...#.........#.#...#.#.#...#...............#...............###...#...#.......#.....#...#...#...#.........#.....#.....#...#.#.......#...# +#.#.#############.#.#.###.#.#.#.###############.#.#################.#.###########.#.###.#.#.#.#.#.#.#.#######.#####.#.#####.#.#.#########.### +#.#.............#...#...#.#.#.#.#...#...........#...................#.#.....#.....#.#...#.#.#.#.#.#.#.......#.......#.....#.#...#.....#...### +#.#############.#######.#.#.#.#.#.#.#.###############################.#.###.#.#####.#.###.#.#.#.#.#.#######.#############.#.#####.###.#.##### +#.............#...#.....#.#.#.#.#.#.#.#.........#...............#.....#...#.#.......#.....#...#.#.#.###.....#...###...###...#.....###...##### +#############.###.#.#####.#.#.#.#.#.#.#.#######.#.#############.#.#######.#.###################.#.#.###.#####.#.###.#.#######v############### +#.............###...#...#.#...#...#.#...#.......#.....#...#...#...#...###.#.#...#...###...#.....#.#...#.....#.#.#...#...#...>.#.............# +#.###################.#.#.#########.#####.###########.#.#.#.#.#####.#.###.#.#.#.#.#.###.#.#.#####.###.#####.#.#.#.#####.#.###v#.###########.# +#.....#...#...#...###.#.#...#.......#...#.#...###...#...#...#...#...#...#.#.#.#.#.#.....#...#...#...#.#...#.#.#.#...#...#.###...#...........# +#####.#.#.#.#.#.#.###.#.###.#.#######.#.#v#.#.###.#.###########.#.#####.#.#.#.#.#.###########.#.###.#.#.#.#v#.#.###.#.###.#######.########### +#.....#.#...#.#.#.....#.#...#.#.....#.#.>.>.#...#.#.#...........#.#.....#.#.#.#.#.......#...#.#.#...#.#.#.>.>.#.....#.....#.......#...#...### +#.#####.#####.#.#######.#.###.#.###.#.###v#####.#.#.#v###########.#.#####.#.#.#.#######.#.#.#.#.#.###.#.###v###############.#######.#.#.#.### +#...#...#.....#.......#...#...#.#...#.#...###...#.#.>.>...#.....#.#...###.#.#.#.#...###...#.#.#...###.#...#.#.......###...#.....#...#.#.#.### +###.#.###.###########.#####.###.#.###.#.#####.###.###v###.#.###.#.###.###.#.#.#.#.#.#######.#.#######.###.#.#.#####.###.#.#####.#.###.#.#.### +#...#.#...#...###...#.....#...#.#.....#.#...#...#...#...#...#...#.#...#...#.#.#.#.#.#.....#.#.......#.#...#.#.#.....#...#.......#.#...#.#...# +#.###.#.###.#v###.#.#####.###.#.#######.#.#.###.###.###.#####.###.#.###.###.#.#.#.#.#.###.#.#######.#.#.###.#.#.#####.###########.#.###.###.# +#...#.#...#.#.>...#.......#...#.###...#...#...#.#...###.....#...#.#...#.#...#.#.#.#.#...#...#...#...#...#...#.#.#...#.....#.......#...#.#...# +###.#.###.#.#v#############.###.###.#.#######.#.#.#########.###.#.###.#.#.###.#.#.#.###v#####.#.#.#######.###.#.#.#.#####.#.#########.#.#.### +#...#.###...#...........###.#...#...#.......#.#...#.........###...#...#.#...#.#.#.#...>.>.#...#.#.......#...#.#...#.....#.#.#.........#.#.### +#.###.#################.###.#.###.#########.#.#####.###############.###.###.#.#.#.#####v#.#.###.#######.###.#.#########.#.#.#.#########.#.### +#.....#...#.........#...#...#...#.........#.#.#.....#.....#####...#...#.###.#.#.#.#...#.#.#...#.#...#...#...#.#.........#...#...#...#...#...# +#######.#.#.#######.#.###.#####.#########.#.#.#.#####.###.#####.#.###.#.###.#.#.#.#.#.#.#.###.#.#.#.#.###.###.#.###############.#.#.#.#####.# +#####...#.#...#...#...###.......###.......#...#.....#.###...#...#.#...#...#.#.#.#.#.#...#.....#...#.#.###.....#.........#...###...#.#.#.....# +#####.###.###.#.#.#################.###############.#.#####.#.###.#.#####.#.#.#.#.#.###############.#.#################.#.#.#######.#.#.##### +###...#...###...#.....#.....#.....#.............#...#.###...#.#...#.......#...#.#.#.#.............#...#...###...#.......#.#.#...#...#.#.....# +###.###.#############.#.###.#.###.#############.#.###.###.###.#.###############.#.#.#.###########.#####.#.###.#.#.#######.#.#.#.#.###.#####.# +#...#...###.....#.....#.#...#...#.#...........#.#...#.#...#...#...#.....#.....#...#...#.........#.#.....#.....#...#.....#.#.#.#.#.....#...#.# +#.###.#####.###.#v#####.#.#####.#.#.#########.#.###.#.#.###.#####.#.###.#.###.#########.#######.#.#.###############.###.#.#.#.#.#######v#.#.# +#...#.....#.#...#.>.....#.#...#.#.#.#...#####...###...#.....#...#...#...#.#...#...#...#.......#...#...............#...#...#.#.#.#...#.>.#.#.# +###.#####.#.#.###v#######.#.#.#.#.#.#.#.#####################.#.#####.###.#.###.#.#.#.#######.###################.###.#####.#.#.#.#.#.#v#.#.# +#...#...#...#.#...###.....#.#.#.#.#...#.....#...#...#.......#.#.#...#...#.#...#.#...#.........#...###...........#.#...###...#.#...#...#.#...# +#.###.#.#####.#.#####.#####.#.#.#.#########.#.#.#.#.#.#####.#.#.#.#.###.#.###.#.###############.#.###.#########.#.#.#####.###.#########.##### +#.....#...#...#.#.....#.....#.#.#...###.....#.#.#.#.#...#...#.#...#.....#.#...#.................#...#.....#...#...#.....#.....#.....###...### +#########.#.###.#.#####.#####.#.###.###.#####.#.#.#.###.#.###.###########.#.#######################.#####.#.#.#########.#######.###.#####.### +#.........#.#...#...#...#.....#.#...#...#...#.#...#.###.#.#...#.....#...#.#.###...###...#...........#...#...#.......#...#...###...#.#...#...# +#.#########.#.#####.#.###.#####.#.###.###.#.#.#####.###.#.#.###.###.#.#.#.#.###.#.###.#.#v###########.#.###########.#.###.#.#####.#.#.#.###.# +#.......###.#.....#.#.#...#.....#...#.....#.#.#.....#...#.#.....#...#.#.#.#.#...#.#...#.>.>.#...#...#.#.###...###...#...#.#.......#...#.#...# +#######.###.#####.#.#.#.###.#######.#######.#.#.#####.###.#######.###.#.#.#.#.###.#.#####v#.#.#.#.#.#.#.###.#.###v#####.#.#############.#.### +#.......#...#.....#.#.#...#.#...###...#.....#.#.#...#.#...#...###.###.#.#.#...###...#...#.#.#.#.#.#.#.#.#...#...>.>.#...#.............#.#.### +#.#######.###.#####.#.###.#.#.#.#####.#v#####.#.#.#.#.#.###.#.###v###.#.#.###########.#.#.#.#.#.#.#.#.#.#.#######v#.#.###############.#.#.### +#.......#.....#####.#.###...#.#.#...#.>.>...#.#.#.#.#.#.#...#...>.>.#.#...###...###...#...#...#.#.#...#...#...#...#.#...#.............#...### +#######.###########.#.#######.#.#.#.###v###.#.#.#.#.#.#.#.#######v#.#.#######.#.###.###########.#.#########.#.#.###.###.#.################### +#.....#.........#...#.#...#...#.#.#.#...###.#.#.#.#...#...###.....#...#.......#.....#.........#...#.........#...###.#...#.#.....#...#.......# +#.###.#########.#.###.#.#.#.###.#.#.#.#####.#.#.#.###########.#########.#############.#######.#####.###############.#.###.#.###.#.#.#.#####.# +#...#...........#.....#.#.#...#.#.#.#.....#.#.#.#.###...#...#.........#.#...#.........#.......#...#.#.......#...###...###...###...#...#.....# +###.###################.#.###.#.#.#.#####.#.#.#.#.###.#.#.#.#########.#.#.#.#.#########.#######.#.#.#.#####.#.#.#######################.##### +###.........#...#...###.#.....#.#.#.......#...#.#.#...#...#.###...#...#.#.#.#.#.......#.#...#...#.#...#.....#.#.#...#...###...#.........##### +###########.#.#.#.#.###.#######.#.#############.#.#.#######.###.#.#.###.#.#.#.#.#####.#.#.#.#.###.#####.#####.#.#.#.#.#.###.#.#.############# +#.....#.....#.#...#...#...#...#.#...........###...#.......#...#.#.#...#...#.#.#.....#...#.#.#.#...#...#.......#.#.#...#.#...#.#.............# +#.###.#.#####.#######.###.#.#.#.###########.#############.###.#.#.###.#####.#.#####.#####.#.#.#.###.#.#########.#.#####.#.###.#############.# +#...#...#...#...#.....#...#.#.#...#.......#...#...........###.#.#.....#...#.#.#.....#...#.#.#.#.###.#.#...#.....#.#.....#...#...........#...# +###.#####.#.###.#.#####.###.#.###.#.#####.###.#.#############.#.#######.#.#.#.#.#####.#.#.#.#.#.###.#.#.#.#v#####.#.#######.###########.#.### +#...#...#.#...#.#.#...#.....#...#.#.#...#.....#.......#.....#...###...#.#.#...#.....#.#...#.#.#...#.#.#.#.>.>.#...#.#.....#...........#...### +#.###.#.#.###.#.#.#.#.#########.#.#.#.#.#############.#.###.#######.#.#.#.#########.#.#####.#.###.#.#.#.#####.#.###.#.###.###########.####### +#...#.#...#...#.#.#.#.#.........#...#.#...#...#.....#...#...#.....#.#...#...#...#...#.###...#...#.#.#...###...#.#...#.#...###.........#...### +###.#.#####.###.#.#.#.#.#############.###.#.#.#.###.#####.###.###.#.#######.#.#.#.###.###.#####.#.#.#######.###.#.###.#.#####.#########.#.### +###.#...###.....#...#.#.#.....###...#.#...#.#.#...#.#.....###...#.#...#.....#.#.#...#...#...#...#.#.......#...#.#...#.#.#...#.........#.#.### +###.###.#############.#.#.###.###.#.#.#.###.#.###.#.#.#########.#.###.#.#####.#.###v###.###.#.###.#######.###.#.###.#.#.#.#.#########.#.#.### +###...#...#...........#...###.....#...#.#...#.###.#.#.......###.#.#...#.#...#.#.#.>.>.#.#...#...#.#.....#...#...###.#.#.#.#.###.......#.#.### +#####.###.#.###########################.#.###.###.#.#######.###.#.#.###.#.#.#.#.#.###.#.#.#####.#.#.###.###.#######.#.#.#.#.###.#######.#.### +#####.....#...........#...###...........#...#.#...#.#.......#...#.#.###.#.#...#.#...#.#.#.....#.#...###...#.#.......#.#...#...#...#...#.#...# +#####################.#.#.###v#############.#.#.###.#.#######.###.#.###.#.#####.###.#.#.#####.#.#########.#.#.#######.#######.###.#.#.#.###.# +#.....................#.#.#.>.>.###...#...#.#.#.#...#.....#...#...#...#.#.#.....#...#.#.#.....#...#.....#...#.......#.###.....#...#.#.#.#...# +#.#####################.#.#.###.###.#.#.#.#.#.#.#.#######v#.###.#####.#.#.#.#####.###.#.#.#######.#.###.###########.#.###.#####v###.#.#.#.### +#...#.....#...........#.#.#.#...#...#.#.#.#.#.#.#.#.....>.>.#...#...#.#.#.#.....#.###.#.#.......#...#...#...........#...#.....>.#...#.#.#.### +###.#.###.#.#########.#.#.#.#.###.###.#.#.#.#.#.#.#.#########.###.#.#.#.#.#####.#.###.#.#######.#####.###.#############.#######v#.###.#.#.### +#...#.#...#.#.........#.#.#.#.#...###.#.#.#.#.#.#.#.........#...#.#.#.#.#.#.....#...#.#.#.......#.....###...#.....#...#.#.......#...#.#.#.### +#.###.#.###.#.#########.#.#.#.#.#####.#.#.#.#.#.#.#########.###.#.#.#.#.#.#.#######.#.#.#.#######.#########.#.###.#.#.#.#.#########.#.#.#.### +#.....#.....#...........#...#...#####...#...#...#...........###...#...#...#.........#...#.........#########...###...#...#...........#...#...# +###########################################################################################################################################.# From 314e8943674ff889da64eea7dc51f74ff9bdd62f Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 23 Dec 2023 10:57:13 +0100 Subject: [PATCH 467/479] 2023: d23: ex1: add solution --- 2023/d23/ex1/ex1.py | 93 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100755 2023/d23/ex1/ex1.py diff --git a/2023/d23/ex1/ex1.py b/2023/d23/ex1/ex1.py new file mode 100755 index 0000000..2385fca --- /dev/null +++ b/2023/d23/ex1/ex1.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python + +import enum +import sys +from collections.abc import Iterator +from typing import NamedTuple, Optional + + +class Point(NamedTuple): + x: int + y: int + + +class Cell(enum.StrEnum): + PATH = "." + NORTH_SLOPE = "^" + SOUTH_SLOPE = "v" + WEST_SLOPE = "<" + EAST_SLOPE = ">" + + def neighbours(self) -> Iterator[Point]: + match self: + case self.PATH: + yield from ( + Point(-1, 0), + Point(1, 0), + Point(0, -1), + Point(0, 1), + ) + case self.NORTH_SLOPE: + yield Point(-1, 0) + case self.SOUTH_SLOPE: + yield Point(1, 0) + case self.WEST_SLOPE: + yield Point(0, -1) + case self.EAST_SLOPE: + yield Point(0, 1) + + def apply(self, pos: Point) -> Iterator[Point]: + for dx, dy in self.neighbours(): + yield Point(pos.x + dx, pos.y + dy) + + +Trails = dict[Point, Cell] + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> Trails: + res: Trails = {} + + for x, line in enumerate(input): + for y, c in enumerate(line): + if c == "#": + continue + res[Point(x, y)] = Cell(c) + + return res + + def explore(trails: Trails, start: Point, dest: Point) -> int: + def recurse(start: Point, seen: set[Point]) -> Optional[int]: + if start == dest: + return 0 + if start not in trails: + return None + next_step = ( + recurse(n, seen | {n}) + for n in trails[start].apply(start) + if n not in seen + ) + distances = [dist for dist in next_step if dist is not None] + if not distances: + return None + return max(distances) + 1 + + res = recurse(start, {start}) + assert res is not None # Sanity check + return res + + trails = parse(input) + start, dest = Point(0, 1), Point(len(input) - 1, len(input[0]) - 2) + assert start in trails # Sanity check + assert dest in trails # Sanity check + sys.setrecursionlimit(10_000) + return explore(trails, start, dest) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 1a6bc7c2c70f9b1b47354e305d9a49b4b721fdb6 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 23 Dec 2023 10:57:18 +0100 Subject: [PATCH 468/479] 2023: d23: ex2: add input --- 2023/d23/ex2/input | 141 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 2023/d23/ex2/input diff --git a/2023/d23/ex2/input b/2023/d23/ex2/input new file mode 100644 index 0000000..8a1a97e --- /dev/null +++ b/2023/d23/ex2/input @@ -0,0 +1,141 @@ +#.########################################################################################################################################### +#.#...#...#...#...#...#.........#.......#...#.......#...###...###...#...#...#...###...#...#...#...#.....###...#...###...#.....#...#...#...### +#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#####.#.#.#.#####.#.#.###.#.###.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.###.###.#.#.#.###.#.#.###.#.#.#.#.#.#.### +#.#.#.#.#.#.#.#.#.#.#...#.......#.....#.#.#.#.....#...#...#.#.#...#.#.#...#.#.#...#.#.#.#.#.#.#.#.#.#...#...#.#.#...#.#.#...#.#.#...#...#...# +#.#.#.#.#v#.#.#.#.#.#####.###########.#.#.#.#####.#######.#.#.#.###.#.#####.#.###.#.#.#.#.#.#.#.#.#.#.###.###.#.###.#.#.###.#.#.###########.# +#...#...#.>.#...#...#.....#...#...#...#...#...#...#.......#.#...#...#.#.....#...#.#.#...#.#.#.#.#...#...#...#.#.#...#.#.###.#.#.#...........# +#########v###########.#####.#.#.#.#.#########.#.###.#######.#####.###.#.#######.#.#.#####.#.#.#.#######.###.#.#.#.###.#.###.#.#.#.########### +#...#...#.#...........#...#.#.#.#.#.......#...#...#.#...###.#.....###.#.#...###.#.#.....#.#.#.#.#.......#...#...#...#.#...#.#.#.#.#...#...### +#.#.#.#.#.#.###########.#.#.#.#.#.#######.#.#####.#.#.#.###.#.#######.#.#.#.###.#.#####.#.#.#.#.#.#######.#########.#.###.#.#.#.#.#.#.#.#.### +#.#...#...#...#...###...#...#.#.#.###...#.#.#...#.#.#.#.#...#...>.>.#.#.#.#.#...#.#...#.#.#.#.#.#.#...###.....#####.#.#...#.#.#.#...#...#...# +#.###########.#.#.###.#######.#.#.###.#.#.#.#.#.#.#.#.#.#.#######v#.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#.#######.#####.#.#.###.#.#.###########.# +#.........###.#.#...#...#.....#.#.....#.#.#...#.#.#.#.#.#...#.....#...#.#.#.#...#.#.#.#.#.#.#.#.#.#.#.>.>...#.....#...#.....#...#...#.......# +#########.###.#.###.###.#.#####.#######.#.#####.#.#.#.#.###.#.#########.#.#.###.#.#.#.#.#.#.#.#.#.#.###v###.#####.###############.#.#.####### +#####...#.#...#...#...#.#.#...#.......#.#.....#.#.#...#.#...#.#...###...#.#.#...#...#.#.#.#.#...#.#...#...#...#...###...#...###...#.#.......# +#####.#.#.#.#####.###.#.#.#.#.#######.#.#####.#.#.#####.#.###.#.#.###.###.#.#.#######.#.#.#.#####.###.###.###.#.#####.#.#.#.###.###.#######.# +#.....#...#.......###.#.#...#.#.>.>...#.......#...#...#.#...#...#...#.....#.#.#...###...#.#.#.....#...###...#...#.....#...#.....###...#.....# +#.###################.#.#####.#.#v#################.#.#.###.#######.#######.#.#.#.#######.#.#.#####.#######.#####.###################.#.##### +#...........#.........#.#.....#.#...#...###...###...#.#.#...###...#.....#...#...#.......#.#.#.#...#.#.....#.....#...#.............#...#.....# +###########.#.#########.#.#####.###.#.#.###.#.###.###.#.#.#####.#.#####.#.#############.#.#.#.#.#.#.#.###.#####.###.#.###########.#.#######.# +#...........#.....#...#.#.#...#.#...#.#.....#.....#...#.#.#...#.#.......#.>.>.....#.....#.#.#.#.#...#.#...#...#...#.#.#...........#...#.....# +#.###############.#.#.#.#.#.#.#.#.###.#############.###.#.#.#.#.###########v#####.#.#####.#.#.#.#####.#.###.#.###.#.#.#.#############.#.##### +#.........#.....#.#.#.#.#...#...#.....#.....#.....#...#...#.#...#...###...#.....#.#.....#...#...#...#.#.#...#.....#...#.............#.#.....# +#########.#.###.#.#.#.#.###############.###.#.###.###.#####.#####.#.###.#.#####.#.#####.#########.#.#.#.#.#########################.#.#####.# +#.........#.#...#...#...###.....#...###...#.#...#.....#.....#...#.#.....#.#.....#...#...#...###...#...#.#.........#...###...........#...#...# +#.#########.#.#############.###.#.#.#####.#.###.#######.#####.#.#.#######.#.#######.#.###.#.###.#######.#########.#.#.###.#############.#.### +#.......#...#.#...#.....#...#...#.#.#...#.#.....#...###.......#...#.......#.......#...#...#...#.......#.........#...#.#...#...........#.#...# +#######.#.###.#.#.#.###.#.###.###.#.#.#.#.#######.#.###############.#############.#####.#####.#######.#########.#####.#.###.#########.#.###.# +#.......#...#.#.#.#...#.#...#.###.#.#.#.#.###...#.#.....###...#.....#...###.......#...#...#...#...###.#.......#.#.....#.....#.........#.....# +#.#########.#.#.#.###.#.###.#.###.#.#.#.#v###.#.#.#####.###.#.#.#####.#.###.#######.#.###.#.###.#.###.#.#####.#.#.###########v############### +#.........#.#.#.#.#...#...#.#...#.#.#.#.>.>...#.#.#.....#...#.#.......#.#...#...###.#...#.#...#.#...#...#.....#...#...#...#.>.#...#...#...### +#########.#.#.#.#.#.#####.#.###.#.#.#.###v#####.#.#.#####.###.#########.#.###.#.###.###.#.###.#.###.#####.#########.#.#.#.#.#v#.#.#.#.#.#.### +#.........#.#...#.#...###.#.###.#.#...#...###...#.#.#...#...#.#...#.....#...#.#.###.#...#...#.#.#...#...#...###...#.#.#.#.#.#...#.#.#...#...# +#.#########.#####.###.###.#.###.#.#####.#####.###.#.#.#.###.#.#.#.#v#######v#.#.###.#.#####.#.#.#.###.#.###v###.#.#.#.#.#.#.#####.#.#######.# +#.#...#...#.#...#.#...#...#.#...#.#...#.....#.....#.#.#...#.#.#.#.>.>...#.>.>.#...#.#.#...#.#.#.#.#...#...>.>...#.#.#.#.#...###...#.#.......# +#.#.#v#.#.#.#.#.#.#.###.###.#.###.#.#.#####.#######.#.###.#.#.#.###v###.#.#v#####.#.#.#.#.#.#.#.#.#.#######v#####.#.#.#.#######.###.#.####### +#.#.#.>.#.#...#.#...#...#...#.....#.#.#...#.......#.#...#.#.#.#.#...#...#.#.#...#.#.#.#.#.#.#.#.#.#.#.....#.....#...#.#.###...#...#.#.#...### +#.#.#v###.#####.#####.###.#########.#.#.#.#######.#.###.#.#.#.#.#.###.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.#####.#####.#.###.#.###.#.#.#.#.### +#...#...#.......#...#...#...#.......#...#.....#...#.....#...#...#...#.....#...#.#.#.#.#.#...#.#.#.#.#...#.....#.#.....#...#.#.....#.#...#...# +#######.#########.#.###.###.#.###############.#.###################.###########.#.#.#.#.#####.#.#.#.###.#####.#.#.#######.#.#######.#######.# +#.......#.........#...#.#...#.............#...#...#.....###...#...#...#.........#...#...#.....#.#...###.....#.#.#.....#...#.#.......#.....#.# +#.#######.###########.#.#.###############.#.#####.#.###.###.#.#.#.###.#.#################.#####.###########.#.#.#####.#.###.#.#######.###.#.# +#.......#.#.....#.....#...#...#...#.....#.#.......#...#.###.#.#.#...#.#...#...#...#...###.....#.#...........#.#.....#.#.#...#.#.....#...#.#.# +#######.#.#.###.#.#########.#.#.#.#.###.#.###########.#.###.#.#.###.#.###.#.#.#.#.#.#.#######.#.#.###########.#####.#.#.#.###.#.###.###.#.#.# +#.......#.#...#.#.#.....#...#...#...###...#...#.......#.....#.#...#...###...#...#...#.......#...#...........#.......#...#.....#...#.#...#.#.# +#.#######.###.#.#.#.###.#.#################.#.#.#############.###.#########################.###############.#####################.#.#.###.#.# +#...#.....#...#...#.#...#...................#.#.............#...#.#...###...#...............#...#...........###...###...#.........#...#...#.# +###.#.#####.#######.#.#######################.#############.###.#.#.#.###.#.#.###############.#.#.#############.#.###.#.#.#############.###.# +###...#...#.....###.#.#...#...#...........#...#.............###.#...#...#.#...#.....#.........#.#...............#.#...#.#.......#...###.....# +#######.#.#####.###.#.#.#.#.#.#.#########.#.###.###############.#######.#.#####.###.#.#########.#################.#.###.#######.#.#.######### +#####...#.......#...#.#.#.#.#.#.........#...###.............###.......#.#.#...#...#.#...#.......#...........#.....#...#.....###...#.....#...# +#####.###########.###.#.#.#.#.#########.###################.#########.#.#.#.#.###.#.###.#.#######.#########.#.#######.#####.###########.#.#.# +#.....#.....#...#...#.#.#.#.#.#...#.....###...#.....#.......#...#...#...#...#.....#.#...#.......#.........#...#...#...#.....#.......#...#.#.# +#.#####.###.#.#.###.#.#.#.#.#.#.#.#v#######.#.#.###.#.#######.#.#.#.###############.#.#########.#########.#####.#.#.###.#####.#####.#.###.#.# +#.......###.#.#...#.#.#.#.#.#.#.#.>.>.#####.#.#.#...#...#####.#.#.#.###...#...#...#...###.....#.#.....#...#...#.#.#...#.#...#...#...#.....#.# +###########.#.###.#.#.#.#.#.#.#.###v#.#####.#.#.#.#####v#####.#.#.#.###.#.#.#.#.#.#######.###.#.#.###.#v###.#.#.#.###.#.#.#.###v#.#########.# +#...........#...#.#.#.#.#.#.#.#.#...#...#...#.#.#.....>.>.###.#.#.#...#.#.#.#.#.#...#.....###...#...#.>.>.#.#.#.#.#...#.#.#...>.#...#...#...# +#.#############.#.#.#.#.#.#.#.#.#.#####.#.###.#.#######v#.###.#.#.###.#.#.#.#.#.###.#.#############.###v#.#.#.#.#.#.###.#.#####v###.#.#.#.### +#...........#...#.#.#.#.#.#.#...#...###.#.###...#.......#...#.#.#.#...#.#.#.#.#.#...#.....#...#...#.#...#...#...#.#.###...###...###...#...### +###########v#.###.#.#.#.#.#.#######.###.#.#######.#########.#.#.#.#.###.#.#.#.#.#.#######v#.#.#.#.#.#.###########.#.#########.############### +#.......###.>.###.#.#.#.#.#.###...#...#.#.......#.........#.#.#.#.#...#.#.#.#.#.#...#...>.>.#.#.#.#.#...#...#...#...#####...#.#...#...#.....# +#.#####.###v#####.#.#.#.#.#.###.#.###.#.#######.#########.#.#.#.#.###.#.#.#.#.#.###.#.###v###.#.#.#.###.#.#.#.#.#########.#.#.#.#.#.#.#.###.# +#.#...#.....#...#...#...#.#.#...#.....#.........#...#.....#.#.#...#...#.#.#.#.#.#...#.#...###.#.#.#...#...#...#...#.......#.#...#...#...#...# +#.#.#.#######.#.#########.#.#.###################.#.#.#####.#.#####.###.#.#.#.#.#.###.#.#####.#.#.###.###########.#.#######.#############.### +#.#.#.#.......#.........#...#.....#...........#...#.#.....#.#.#.....#...#.#.#.#.#.#...#.....#...#.#...#...........#.#.....#...............### +#.#.#.#.###############.#########.#.#########.#.###.#####.#.#.#.#####.###.#.#.#.#.#.#######.#####.#.###.###########.#.###.################### +#...#.#.#.............#...#.......#.#.........#...#.......#...#.......#...#.#.#.#.#.#.......#...#...###.....#...###...#...#.................# +#####.#.#.###########.###.#.#######.#.###########.#####################.###.#.#.#.#.#.#######.#.###########.#.#.#######.###.###############.# +#.....#.#.........###.....#...#.....#...........#.....#...###.......#...#...#...#...#.........#.#...........#.#.......#.....#.......#.......# +#.#####.#########.###########.#.###############.#####.#.#.###.#####.#.###.#####################.#.###########.#######.#######.#####.#.####### +#.....#.#.........#.....#...#...#...............#####...#.....#.....#...#.#.....................#.............#.......###.....#...#...#.....# +#####.#.#.#########.###.#.#.#####.#############################.#######.#.#.###################################.#########.#####.#.#####.###.# +#...#...#.........#.#...#.#.#...#...............#...............###...#...#.......#.....#...#...#...#.........#.....#.....#...#.#.......#...# +#.#.#############.#.#.###.#.#.#.###############.#.#################.#.###########.#.###.#.#.#.#.#.#.#.#######.#####.#.#####.#.#.#########.### +#.#.............#...#...#.#.#.#.#...#...........#...................#.#.....#.....#.#...#.#.#.#.#.#.#.......#.......#.....#.#...#.....#...### +#.#############.#######.#.#.#.#.#.#.#.###############################.#.###.#.#####.#.###.#.#.#.#.#.#######.#############.#.#####.###.#.##### +#.............#...#.....#.#.#.#.#.#.#.#.........#...............#.....#...#.#.......#.....#...#.#.#.###.....#...###...###...#.....###...##### +#############.###.#.#####.#.#.#.#.#.#.#.#######.#.#############.#.#######.#.###################.#.#.###.#####.#.###.#.#######v############### +#.............###...#...#.#...#...#.#...#.......#.....#...#...#...#...###.#.#...#...###...#.....#.#...#.....#.#.#...#...#...>.#.............# +#.###################.#.#.#########.#####.###########.#.#.#.#.#####.#.###.#.#.#.#.#.###.#.#.#####.###.#####.#.#.#.#####.#.###v#.###########.# +#.....#...#...#...###.#.#...#.......#...#.#...###...#...#...#...#...#...#.#.#.#.#.#.....#...#...#...#.#...#.#.#.#...#...#.###...#...........# +#####.#.#.#.#.#.#.###.#.###.#.#######.#.#v#.#.###.#.###########.#.#####.#.#.#.#.#.###########.#.###.#.#.#.#v#.#.###.#.###.#######.########### +#.....#.#...#.#.#.....#.#...#.#.....#.#.>.>.#...#.#.#...........#.#.....#.#.#.#.#.......#...#.#.#...#.#.#.>.>.#.....#.....#.......#...#...### +#.#####.#####.#.#######.#.###.#.###.#.###v#####.#.#.#v###########.#.#####.#.#.#.#######.#.#.#.#.#.###.#.###v###############.#######.#.#.#.### +#...#...#.....#.......#...#...#.#...#.#...###...#.#.>.>...#.....#.#...###.#.#.#.#...###...#.#.#...###.#...#.#.......###...#.....#...#.#.#.### +###.#.###.###########.#####.###.#.###.#.#####.###.###v###.#.###.#.###.###.#.#.#.#.#.#######.#.#######.###.#.#.#####.###.#.#####.#.###.#.#.### +#...#.#...#...###...#.....#...#.#.....#.#...#...#...#...#...#...#.#...#...#.#.#.#.#.#.....#.#.......#.#...#.#.#.....#...#.......#.#...#.#...# +#.###.#.###.#v###.#.#####.###.#.#######.#.#.###.###.###.#####.###.#.###.###.#.#.#.#.#.###.#.#######.#.#.###.#.#.#####.###########.#.###.###.# +#...#.#...#.#.>...#.......#...#.###...#...#...#.#...###.....#...#.#...#.#...#.#.#.#.#...#...#...#...#...#...#.#.#...#.....#.......#...#.#...# +###.#.###.#.#v#############.###.###.#.#######.#.#.#########.###.#.###.#.#.###.#.#.#.###v#####.#.#.#######.###.#.#.#.#####.#.#########.#.#.### +#...#.###...#...........###.#...#...#.......#.#...#.........###...#...#.#...#.#.#.#...>.>.#...#.#.......#...#.#...#.....#.#.#.........#.#.### +#.###.#################.###.#.###.#########.#.#####.###############.###.###.#.#.#.#####v#.#.###.#######.###.#.#########.#.#.#.#########.#.### +#.....#...#.........#...#...#...#.........#.#.#.....#.....#####...#...#.###.#.#.#.#...#.#.#...#.#...#...#...#.#.........#...#...#...#...#...# +#######.#.#.#######.#.###.#####.#########.#.#.#.#####.###.#####.#.###.#.###.#.#.#.#.#.#.#.###.#.#.#.#.###.###.#.###############.#.#.#.#####.# +#####...#.#...#...#...###.......###.......#...#.....#.###...#...#.#...#...#.#.#.#.#.#...#.....#...#.#.###.....#.........#...###...#.#.#.....# +#####.###.###.#.#.#################.###############.#.#####.#.###.#.#####.#.#.#.#.#.###############.#.#################.#.#.#######.#.#.##### +###...#...###...#.....#.....#.....#.............#...#.###...#.#...#.......#...#.#.#.#.............#...#...###...#.......#.#.#...#...#.#.....# +###.###.#############.#.###.#.###.#############.#.###.###.###.#.###############.#.#.#.###########.#####.#.###.#.#.#######.#.#.#.#.###.#####.# +#...#...###.....#.....#.#...#...#.#...........#.#...#.#...#...#...#.....#.....#...#...#.........#.#.....#.....#...#.....#.#.#.#.#.....#...#.# +#.###.#####.###.#v#####.#.#####.#.#.#########.#.###.#.#.###.#####.#.###.#.###.#########.#######.#.#.###############.###.#.#.#.#.#######v#.#.# +#...#.....#.#...#.>.....#.#...#.#.#.#...#####...###...#.....#...#...#...#.#...#...#...#.......#...#...............#...#...#.#.#.#...#.>.#.#.# +###.#####.#.#.###v#######.#.#.#.#.#.#.#.#####################.#.#####.###.#.###.#.#.#.#######.###################.###.#####.#.#.#.#.#.#v#.#.# +#...#...#...#.#...###.....#.#.#.#.#...#.....#...#...#.......#.#.#...#...#.#...#.#...#.........#...###...........#.#...###...#.#...#...#.#...# +#.###.#.#####.#.#####.#####.#.#.#.#########.#.#.#.#.#.#####.#.#.#.#.###.#.###.#.###############.#.###.#########.#.#.#####.###.#########.##### +#.....#...#...#.#.....#.....#.#.#...###.....#.#.#.#.#...#...#.#...#.....#.#...#.................#...#.....#...#...#.....#.....#.....###...### +#########.#.###.#.#####.#####.#.###.###.#####.#.#.#.###.#.###.###########.#.#######################.#####.#.#.#########.#######.###.#####.### +#.........#.#...#...#...#.....#.#...#...#...#.#...#.###.#.#...#.....#...#.#.###...###...#...........#...#...#.......#...#...###...#.#...#...# +#.#########.#.#####.#.###.#####.#.###.###.#.#.#####.###.#.#.###.###.#.#.#.#.###.#.###.#.#v###########.#.###########.#.###.#.#####.#.#.#.###.# +#.......###.#.....#.#.#...#.....#...#.....#.#.#.....#...#.#.....#...#.#.#.#.#...#.#...#.>.>.#...#...#.#.###...###...#...#.#.......#...#.#...# +#######.###.#####.#.#.#.###.#######.#######.#.#.#####.###.#######.###.#.#.#.#.###.#.#####v#.#.#.#.#.#.#.###.#.###v#####.#.#############.#.### +#.......#...#.....#.#.#...#.#...###...#.....#.#.#...#.#...#...###.###.#.#.#...###...#...#.#.#.#.#.#.#.#.#...#...>.>.#...#.............#.#.### +#.#######.###.#####.#.###.#.#.#.#####.#v#####.#.#.#.#.#.###.#.###v###.#.#.###########.#.#.#.#.#.#.#.#.#.#.#######v#.#.###############.#.#.### +#.......#.....#####.#.###...#.#.#...#.>.>...#.#.#.#.#.#.#...#...>.>.#.#...###...###...#...#...#.#.#...#...#...#...#.#...#.............#...### +#######.###########.#.#######.#.#.#.###v###.#.#.#.#.#.#.#.#######v#.#.#######.#.###.###########.#.#########.#.#.###.###.#.################### +#.....#.........#...#.#...#...#.#.#.#...###.#.#.#.#...#...###.....#...#.......#.....#.........#...#.........#...###.#...#.#.....#...#.......# +#.###.#########.#.###.#.#.#.###.#.#.#.#####.#.#.#.###########.#########.#############.#######.#####.###############.#.###.#.###.#.#.#.#####.# +#...#...........#.....#.#.#...#.#.#.#.....#.#.#.#.###...#...#.........#.#...#.........#.......#...#.#.......#...###...###...###...#...#.....# +###.###################.#.###.#.#.#.#####.#.#.#.#.###.#.#.#.#########.#.#.#.#.#########.#######.#.#.#.#####.#.#.#######################.##### +###.........#...#...###.#.....#.#.#.......#...#.#.#...#...#.###...#...#.#.#.#.#.......#.#...#...#.#...#.....#.#.#...#...###...#.........##### +###########.#.#.#.#.###.#######.#.#############.#.#.#######.###.#.#.###.#.#.#.#.#####.#.#.#.#.###.#####.#####.#.#.#.#.#.###.#.#.############# +#.....#.....#.#...#...#...#...#.#...........###...#.......#...#.#.#...#...#.#.#.....#...#.#.#.#...#...#.......#.#.#...#.#...#.#.............# +#.###.#.#####.#######.###.#.#.#.###########.#############.###.#.#.###.#####.#.#####.#####.#.#.#.###.#.#########.#.#####.#.###.#############.# +#...#...#...#...#.....#...#.#.#...#.......#...#...........###.#.#.....#...#.#.#.....#...#.#.#.#.###.#.#...#.....#.#.....#...#...........#...# +###.#####.#.###.#.#####.###.#.###.#.#####.###.#.#############.#.#######.#.#.#.#.#####.#.#.#.#.#.###.#.#.#.#v#####.#.#######.###########.#.### +#...#...#.#...#.#.#...#.....#...#.#.#...#.....#.......#.....#...###...#.#.#...#.....#.#...#.#.#...#.#.#.#.>.>.#...#.#.....#...........#...### +#.###.#.#.###.#.#.#.#.#########.#.#.#.#.#############.#.###.#######.#.#.#.#########.#.#####.#.###.#.#.#.#####.#.###.#.###.###########.####### +#...#.#...#...#.#.#.#.#.........#...#.#...#...#.....#...#...#.....#.#...#...#...#...#.###...#...#.#.#...###...#.#...#.#...###.........#...### +###.#.#####.###.#.#.#.#.#############.###.#.#.#.###.#####.###.###.#.#######.#.#.#.###.###.#####.#.#.#######.###.#.###.#.#####.#########.#.### +###.#...###.....#...#.#.#.....###...#.#...#.#.#...#.#.....###...#.#...#.....#.#.#...#...#...#...#.#.......#...#.#...#.#.#...#.........#.#.### +###.###.#############.#.#.###.###.#.#.#.###.#.###.#.#.#########.#.###.#.#####.#.###v###.###.#.###.#######.###.#.###.#.#.#.#.#########.#.#.### +###...#...#...........#...###.....#...#.#...#.###.#.#.......###.#.#...#.#...#.#.#.>.>.#.#...#...#.#.....#...#...###.#.#.#.#.###.......#.#.### +#####.###.#.###########################.#.###.###.#.#######.###.#.#.###.#.#.#.#.#.###.#.#.#####.#.#.###.###.#######.#.#.#.#.###.#######.#.### +#####.....#...........#...###...........#...#.#...#.#.......#...#.#.###.#.#...#.#...#.#.#.....#.#...###...#.#.......#.#...#...#...#...#.#...# +#####################.#.#.###v#############.#.#.###.#.#######.###.#.###.#.#####.###.#.#.#####.#.#########.#.#.#######.#######.###.#.#.#.###.# +#.....................#.#.#.>.>.###...#...#.#.#.#...#.....#...#...#...#.#.#.....#...#.#.#.....#...#.....#...#.......#.###.....#...#.#.#.#...# +#.#####################.#.#.###.###.#.#.#.#.#.#.#.#######v#.###.#####.#.#.#.#####.###.#.#.#######.#.###.###########.#.###.#####v###.#.#.#.### +#...#.....#...........#.#.#.#...#...#.#.#.#.#.#.#.#.....>.>.#...#...#.#.#.#.....#.###.#.#.......#...#...#...........#...#.....>.#...#.#.#.### +###.#.###.#.#########.#.#.#.#.###.###.#.#.#.#.#.#.#.#########.###.#.#.#.#.#####.#.###.#.#######.#####.###.#############.#######v#.###.#.#.### +#...#.#...#.#.........#.#.#.#.#...###.#.#.#.#.#.#.#.........#...#.#.#.#.#.#.....#...#.#.#.......#.....###...#.....#...#.#.......#...#.#.#.### +#.###.#.###.#.#########.#.#.#.#.#####.#.#.#.#.#.#.#########.###.#.#.#.#.#.#.#######.#.#.#.#######.#########.#.###.#.#.#.#.#########.#.#.#.### +#.....#.....#...........#...#...#####...#...#...#...........###...#...#...#.........#...#.........#########...###...#...#...........#...#...# +###########################################################################################################################################.# From 7b0a96776597d1cc0688ea4f57f1c31a6405d196 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 23 Dec 2023 10:57:23 +0100 Subject: [PATCH 469/479] 2023: d23: ex2: add solution --- 2023/d23/ex2/ex2.py | 104 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100755 2023/d23/ex2/ex2.py diff --git a/2023/d23/ex2/ex2.py b/2023/d23/ex2/ex2.py new file mode 100755 index 0000000..fadce89 --- /dev/null +++ b/2023/d23/ex2/ex2.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python + +import copy +import sys +from collections.abc import Iterator +from typing import NamedTuple, Optional + + +class Point(NamedTuple): + x: int + y: int + + def neighbours(self) -> Iterator["Point"]: + for dx, dy in ( + (-1, 0), + (1, 0), + (0, -1), + (0, 1), + ): + yield Point(self.x + dx, self.y + dy) + + +Trails = set[Point] +Graph = dict[Point, dict[Point, int]] + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> Trails: + res: Trails = set() + + for x, line in enumerate(input): + for y, c in enumerate(line): + if c == "#": + continue + res.add(Point(x, y)) + + return res + + def to_graph(trails: Trails) -> Graph: + graph: Graph = {p: {} for p in trails} + + for p in trails: + for n in p.neighbours(): + if n not in trails: + continue + graph[p][n] = 1 + + return graph + + # Remove every node which has exactly two neighbours (i.e: straight lines) + def condense_graph(graph: Graph) -> Graph: + graph = copy.deepcopy(graph) + nodes = list(graph.keys()) + + for n in nodes: + if len(graph[n]) != 2: + continue + (n1, d1), (n2, d2) = graph[n].items() + del graph[n1][n] + del graph[n2][n] + del graph[n] + graph[n1][n2] = d1 + d2 + graph[n2][n1] = d1 + d2 + + return graph + + def explore(graph: Graph, start: Point, end: Point) -> int: + def recurse(start: Point, seen: set[Point]) -> Optional[int]: + if start == end: + return 0 + if start not in graph: + return None + next_step = ( + (dist, recurse(n, seen | {n})) + for n, dist in graph[start].items() + if n not in seen + ) + distances = [ + (dist + steps) for dist, steps in next_step if steps is not None + ] + if not distances: + return None + return max(distances) + + res = recurse(start, {start}) + assert res is not None # Sanity check + return res + + trails = parse(input) + graph = to_graph(trails) + graph = condense_graph(graph) + start, dest = Point(0, 1), Point(len(input) - 1, len(input[0]) - 2) + assert start in graph # Sanity check + assert dest in graph # Sanity check + return explore(graph, start, dest) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From fa6c3351b07770b9298508b1334ef1c9dd6f4e6b Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 24 Dec 2023 13:35:10 +0100 Subject: [PATCH 470/479] 2023: d24: ex1: add input --- 2023/d24/ex1/input | 300 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 2023/d24/ex1/input diff --git a/2023/d24/ex1/input b/2023/d24/ex1/input new file mode 100644 index 0000000..9b50e17 --- /dev/null +++ b/2023/d24/ex1/input @@ -0,0 +1,300 @@ +260346828765750, 357833641339849, 229809969824403 @ 64, -114, 106 +340220726383465, 393110064924024, 226146987100003 @ -79, -61, 158 +11361697274707, 101596061919750, 46099495948720 @ 328, 162, 333 +360204609690721, 527678808395772, 271703202326380 @ -132, -458, 20 +228800225183261, 405333190838676, 284309641117406 @ 29, -233, 35 +347686754070960, 372761595433127, 227908656106580 @ -134, 452, 245 +420404387574505, 320613771806244, 282039825133426 @ -209, -99, 24 +239697674964055, 219683531868878, 291640535034286 @ 36, 12, 18 +270083622615715, 298192739573649, 450720525831403 @ 71, 50, -394 +210388952361528, 202933503071430, 369359171934512 @ 62, 13, -71 +323626194439723, 331061672127276, 297678575959794 @ -45, 7, -61 +304808549150934, 383205509992906, 523319353604760 @ -22, -163, -463 +187934586489225, 219381841648824, 260929087075428 @ 73, -29, 61 +334112509601119, 400144558186712, 244055841518098 @ 18, 155, 66 +246253930315613, 304696957680568, 94020244355048 @ 53, -63, 311 +342955905222035, 388277972401036, 257476145906070 @ -94, -111, 34 +327736098163477, 330547943777790, 153376586381074 @ -71, -90, 230 +261048582174545, 197767231455944, 278362708671168 @ -10, -13, 43 +262232829717925, 400052820669654, 363505406595748 @ 25, -212, -101 +324188029882468, 362855685632781, 234741485808022 @ 110, 502, 163 +205507378373754, 312370561869725, 214016656029865 @ 148, -46, 132 +239592601431541, 142078397267946, 285236791773286 @ 17, 58, 34 +144373393337221, 188196109756908, 173981678832424 @ 99, -22, 149 +288873332238259, 312782225890490, 274590086150334 @ 18, -6, 14 +186182198786950, 402152186162636, 135534511498564 @ 96, -225, 213 +231239063521245, 186020667465684, 343869538475528 @ 13, -20, -19 +250272260456639, 161173847651144, 288550442540870 @ 10, 51, 28 +296318163416530, 282047552083869, 393397156658776 @ 116, 426, -591 +324596493713872, 398326967096844, 254282763206956 @ 32, -9, 5 +215625978065245, 203168177356104, 420679288194328 @ 35, -25, -104 +191086370171245, 60115319750904, 146260480280128 @ 243, 573, 296 +322860700705485, 459545877374104, 448537560287088 @ -59, -309, -299 +314822321873915, 398359415059524, 264470104210778 @ 140, 49, -94 +269210714892168, 256327147227716, 398338379562592 @ 52, 95, -231 +302666483817653, 275410751736752, 326439099654152 @ -40, -40, -37 +270142822739620, 344779311267669, 324492644181298 @ 52, -80, -85 +374865332232522, 402789242720040, 323870419231066 @ -182, -173, -141 +243208589268314, 367086212824621, 199057002427101 @ 140, -102, 184 +250464382830742, 135024447362895, 320243825003503 @ -8, 24, 6 +355922778067984, 378321615748686, 241250226323332 @ -130, -107, 85 +316218511102785, 354948779738048, 394814158202160 @ 86, 273, -913 +321455854706509, 396440824238416, 314920648255344 @ 9, -75, -257 +169378410757153, 225633601154640, 335902593841960 @ 104, -23, -27 +310941798903565, 333771112844784, 286883552058694 @ 101, 351, -182 +411974191700116, 414045748557315, 447602203181716 @ -232, -222, -323 +282375423819373, 240799415094852, 287697942997588 @ -23, -28, 26 +424528361387804, 462909748733920, 382166946506320 @ -278, -325, -231 +163339958801001, 272115353229508, 302748903558972 @ 230, 32, -28 +258865845218325, 331436090977439, 237682017090608 @ 37, -100, 89 +302915997518781, 347231423515616, 296218913365336 @ -43, -147, 9 +201550834032262, 308185564073751, 181635624713110 @ 224, 24, 219 +326879140563285, 302444228750105, 363158049251869 @ -59, 38, -192 +199437546908251, 165065778022384, 281783000883451 @ 135, 171, 18 +275634964575007, 320652660558480, 161650608601594 @ 82, 39, 294 +299888387753175, 162477657523014, 431376299337848 @ -46, 58, -143 +392193811586581, 352294886790018, 355391098486984 @ -187, -111, -127 +368009114122653, 158595116827656, 240204738709240 @ -127, 64, 84 +235057921833792, 208902653782308, 369261469240150 @ 10, -41, -45 +333864628161721, 403967975589003, 236655090656734 @ 17, 100, 147 +315707153676205, 346742558497233, 239838980741152 @ -19, -16, 89 +265733060020157, 382781265854024, 325370365767928 @ 44, -169, -69 +244493835144625, 206378827546980, 278922806636032 @ 216, 460, -33 +336468228693530, 357997678992397, 445536876104649 @ -64, 78, -800 +334116663241987, 417641320056889, 460730643073845 @ -81, -234, -296 +283712214409060, 217794347554444, 318592790485419 @ 6, 111, -50 +181035782538969, 34330093599444, 116481838981164 @ 59, 121, 203 +267636391438175, 116019071284224, 274907016053068 @ -13, 91, 45 +359932116674365, 372724315764974, 242720827369528 @ -195, 137, 81 +413732861285365, 274346810098864, 265789907811328 @ -234, 50, 36 +353859733044440, 444601519540446, 186716148862678 @ -124, -287, 231 +266823502975823, 342804454729090, 139439752620420 @ 62, -72, 295 +299232903030949, 283130841945486, 266625316859842 @ -27, -23, 43 +275731283415043, 290995753064250, 269990654468416 @ 12, -32, 37 +284336299470177, 363011315559156, 245656891783664 @ 65, -65, 73 +300184773969053, 264674528467624, 288447324797656 @ -35, -19, 15 +364327543902318, 203179466147145, 202143114372903 @ -160, 454, 206 +240582515099049, 257855786814120, 267367130583972 @ 95, 67, 35 +322071439136631, 320755095987098, 240900218113582 @ -62, -76, 84 +407030376195355, 238248420347409, 280351241837773 @ -197, 44, 22 +363480833508100, 302741435647038, 374292309644818 @ -184, 337, -509 +305986467673468, 242537468667456, 312444331887847 @ 32, 395, -156 +252027155370005, 237764087612499, 383247340881198 @ 5, -44, -77 +372582774757039, 423473229980586, 294285328077664 @ -173, -231, -55 +284005653462811, 279636127688541, 343422083098399 @ 23, 50, -122 +307762320034081, 264568258469028, 248848044023842 @ -57, -71, 74 +356296354200217, 324248100646422, 270336780779350 @ -125, -18, 20 +310365295172069, 398733724603568, 271146207120040 @ 38, -112, -33 +332525984343205, 424881352868134, 234357444969968 @ 33, -126, 173 +352583954626249, 349239276790500, 353167414266244 @ -116, -82, -152 +297714119036800, 324271023294864, 362116453319623 @ -10, -53, -146 +285957271760765, 299826994507224, 268344479706678 @ 13, -5, 32 +243189693681529, 258702209578860, 199942339459600 @ 190, 242, 203 +326701397847709, 290194546332360, 296193493706296 @ -43, 195, -87 +292362934918391, 337984495256987, 353443507882303 @ 7, -66, -144 +329560214366727, 287131872509690, 283601935331544 @ -58, 144, -31 +419657717017333, 394749569068172, 492465483328742 @ -207, -207, -278 +424741311206371, 418004503651488, 366948667795378 @ -212, -241, -94 +289511348263829, 369752819333130, 313407769490726 @ 73, -56, -140 +317864241152929, 333597843545268, 280181752022452 @ -20, 40, -30 +159013055331421, 197040084742216, 154846454650744 @ 129, 27, 189 +310161956929405, 317608137512664, 286534497733492 @ -19, 11, -21 +328398331752021, 408235207737374, 277347063815996 @ 37, -19, -211 +352713775673581, 329046721759478, 139004188330392 @ -123, 50, 385 +303904706761629, 256397200765768, 300376317070392 @ -37, 8, -7 +273217189299031, 372821204372277, 128406796773907 @ 95, -92, 392 +152269575075685, 112586975003184, 246776862071728 @ 138, 132, 76 +316077180975508, 285040325144306, 333644269613969 @ -48, 5, -82 +291214477117667, 139137384078822, 239703215510530 @ -46, 28, 84 +282383815400461, 202954623809304, 225038200055848 @ 24, 196, 116 +168593234159600, 148914293359439, 291033865957193 @ 94, 48, 28 +398831545490785, 308451835604503, 274399283929173 @ -159, -126, 46 +240709939960879, 308439888753675, 278202135723646 @ 59, -72, 27 +279404244431973, 251750459409020, 95468761809964 @ 35, 114, 384 +420662877939440, 344775968361866, 525951427053175 @ -274, -55, -570 +327071630965000, 395761942422854, 262797011894253 @ 114, 245, -164 +334223852961341, 422841882209224, 241141724398936 @ 38, -69, 102 +331008090348665, 334101214652224, 233563791181228 @ -68, -31, 102 +365681210920495, 502432633101754, 311612110753818 @ -138, -388, -46 +349308710499373, 385266962186136, 265604633087480 @ -150, 292, -163 +302146562278813, 327132561288801, 243383000145796 @ 157, 400, 77 +253538164543510, 405218794636794, 381768323339290 @ 96, -199, -217 +235161774756385, 227712177337092, 326407943699224 @ 16, -48, -7 +236032878960545, 237730556620694, 427906712868538 @ 17, -55, -117 +329543688711978, 407035805550239, 145778919294318 @ -82, -234, 191 +179368688878425, 325143400816138, 366229488873984 @ 131, -112, -91 +371231992850378, 316638751988811, 236103319042700 @ -212, 244, 109 +339808454446741, 351596138940235, 279082311533963 @ -75, 170, -104 +351596216557693, 415490735560152, 387962665814524 @ -123, -193, -412 +278688411144475, 219677637474000, 280342089549808 @ -29, -37, 41 +227585847055153, 347006074356246, 373749729539980 @ 67, -140, -105 +312933684342933, 200941440991884, 335002534040332 @ -61, 16, -30 +280319712864331, 341572097476173, 270405943273150 @ 119, 58, -13 +334263217258791, 436302126934828, 368237906560810 @ -86, -267, -78 +258254831954108, 147783583066962, 333731768562520 @ -8, 37, -15 +355801879637895, 341787614777264, 302534030878548 @ -122, -73, -41 +131266234587925, 22532917085508, 198037908529672 @ 111, 140, 125 +341625668908842, 329754211784895, 301962684556755 @ -92, -8, -62 +105063826836925, 158508866142744, 351476391746242 @ 141, 11, -28 +412949842167537, 462762493467832, 334895606045844 @ -220, -313, -82 +329069085317565, 377407266331234, 426073969564998 @ -19, 44, -868 +217418593657566, 204726057801614, 242720827369528 @ 70, 41, 81 +338084512203857, 410004688486632, 239975437178400 @ -38, -5, 107 +379384638630079, 369543475974252, 402174952375396 @ -200, -71, -381 +386154908209069, 395639474455092, 280370845418350 @ -235, -131, -42 +275382644671282, 36951187740642, 151193435620480 @ 40, 537, 265 +356619952566811, 324712560155565, 331988520420058 @ -141, 124, -229 +358547496942130, 408300560102454, 267115051708363 @ -172, -115, -46 +346306312397521, 383668766131808, 228673142584364 @ -108, 5, 152 +359754386397630, 458720322718534, 559318866468353 @ -118, -295, -314 +351347143979005, 365572803517800, 259774637417128 @ -119, -57, 31 +302183764989621, 364256687909996, 265155690823964 @ 35, -36, 10 +330924340196260, 296427648577092, 141164605133864 @ -84, -113, 193 +364641746578165, 515395099355088, 306019572461464 @ -174, -558, -155 +339224696083261, 358367099969064, 263593215134050 @ -83, -29, 18 +193992358862501, 185968153834072, 367909202669970 @ 97, 59, -82 +336367817216524, 421844251871834, 247462114434092 @ 18, -39, 13 +161312373767566, 150227310716099, 291400675391663 @ 108, 56, 26 +231266455520539, 145495597439120, 287703190551144 @ 42, 95, 25 +206550308007613, 468743856845808, 162840383607640 @ 53, -303, 169 +429512031935863, 262967063704113, 273355464244561 @ -185, -92, 50 +380308299578381, 391625299100696, 505418060665704 @ -181, -163, -521 +330850564652410, 441663420225969, 416132167014268 @ -52, -282, -515 +375615981345391, 246897309609150, 541040247329687 @ -141, -11, -322 +257612492222965, 491419444805616, 398469152274232 @ 26, -346, -143 +292985656154761, 317945193289904, 184697849249204 @ 60, 101, 260 +232877219665201, 405217862288709, 271226801912872 @ 89, -214, 33 +348259631347512, 204238531298826, 312600183336479 @ -106, 169, -50 +268746780353590, 281608151109144, 383837866458733 @ 126, 195, -338 +122524059468689, 287919639112272, 167740167865852 @ 203, -65, 183 +312459888298897, 326923346974976, 225415511869904 @ 27, 167, 149 +319608062021405, 211487145992136, 254111710998584 @ -64, 49, 65 +242932724018775, 99557446164529, 454532431171443 @ 7, 84, -140 +257306506153525, 384718831609032, 260164650130816 @ 6, -205, 60 +346820458626153, 114882415853663, 188792118714110 @ -103, 294, 175 +313007300086521, 358742568002607, 296850115847834 @ -7, -38, -77 +178290472099096, 100952248470583, 338895184944207 @ 162, 260, -70 +232626084330181, 190661053821264, 325127462135648 @ 30, 16, -14 +372111394423630, 360975162645164, 266126939035668 @ -132, -177, 53 +448046725470493, 357813853076325, 323596691049628 @ -227, -170, -19 +241095145890565, 149424858214964, 213990140128028 @ 81, 233, 131 +335893091355037, 420535970089352, 269657513849720 @ 9, -52, -256 +344781417999610, 437369362040334, 233000501863018 @ -102, -263, 195 +317912587490765, 356977339413256, 421028144913168 @ -49, -117, -254 +349219513788590, 431309506759549, 505578881772528 @ -104, -262, -199 +301801136650301, 321621066036596, 298591305543704 @ 5, 14, -55 +197415955491805, 446870993170456, 251710862420360 @ 81, -280, 70 +328275156333949, 224085796039851, 111193637396461 @ -67, 152, 340 +333989052779735, 163119706265934, 181122434623568 @ -86, 70, 157 +318880316206670, 372095178926389, 267474120557491 @ 16, 26, -30 +308122992582769, 210364537012149, 317548450311542 @ -63, -44, 7 +348091459536315, 236767606013484, 310471779320178 @ -109, 295, -109 +341518034630073, 288253587957497, 238209449374690 @ -95, -70, 87 +340212283132345, 393453588795138, 268600848335248 @ -69, 40, -99 +280974192791863, 258914295404854, 280705588435520 @ -12, -24, 29 +282538583056945, 227062101647424, 243979447408168 @ 98, 401, 77 +288833639276521, 496224937883232, 345769934484472 @ 48, -423, -191 +255548451712998, 156282887184168, 316053658342303 @ -8, 19, 6 +285854755263325, 24984747817020, 476670900347380 @ -19, 294, -238 +212112768985246, 234501742570219, 124155071921577 @ 54, -34, 218 +338869855674325, 386664870421884, 174537446814868 @ -45, 220, 732 +304602699119581, 247415356610292, 237730462264480 @ -51, -40, 87 +201522270417337, 285205884453340, 399540925660236 @ 108, -48, -146 +326757229359428, 287469465594148, 258423126039770 @ -56, 95, 43 +333951128919449, 331322625326732, 453397225792116 @ -73, -7, -437 +292988972896088, 332905942698000, 252990122356426 @ 172, 283, 27 +384958618115821, 247508925135802, 401083403479964 @ -147, -43, -107 +281596559976835, 382226933972694, 280187261925958 @ 74, -116, -22 +347338880183865, 322738236098574, 448691665190778 @ -113, 304, -944 +264955694979067, 403952665234368, 153053196172780 @ 98, -185, 303 +307782647476363, 347773192266981, 271590305749501 @ 27, 40, -18 +367152045806920, 234243125497029, 252417867018223 @ -134, 46, 66 +291454116512653, 164941797533448, 386772051012232 @ -43, 19, -71 +244648686644621, 74473321237288, 423822977537712 @ 67, 335, -220 +371738115903269, 322834069329616, 327860913687192 @ -200, 158, -235 +306768194985703, 387225033930552, 320815377161014 @ 62, -53, -252 +314261905759726, 359781050506104, 334488218815414 @ -68, -189, -13 +272373310391389, 340174705578844, 270905323294753 @ 93, -9, 6 +217782060320639, 239743874379665, 75868546325352 @ 59, -22, 289 +375894419111917, 291779701795464, 439527813829720 @ -172, 71, -377 +489310372402870, 369981901801572, 334584256505716 @ -244, -201, -11 +257287473074670, 248009697251629, 291838103346963 @ 20, -10, 14 +145816820913779, 235003443009532, 348328300988480 @ 187, 23, -71 +345816222735610, 360157990964114, 299937550423123 @ -108, 273, -318 +198350092222519, 292429071608601, 336794186804518 @ 103, -68, -49 +224117248246469, 256297365293626, 431101666985804 @ 25, -82, -113 +110752387242301, 184626622675488, 288176733731296 @ 189, 43, 25 +326386961847376, 380573313647966, 266642825749899 @ -30, -51, -10 +128348548472147, 111177263615478, 63927760725468 @ 167, 133, 301 +286769988964609, 239257934452668, 200225830580262 @ 147, 577, 262 +337769607994122, 285274570185288, 298358572970588 @ -82, 115, -59 +292165954153983, 324666184042451, 243761085630574 @ 203, 384, 75 +320912056048390, 123348286817445, 257833508272936 @ -74, 64, 65 +275106210350605, 341850774826676, 304041305857796 @ 21, -103, -25 +328442104512972, 322558730340121, 489791000831846 @ -52, 68, -641 +339487928899561, 487418253546930, 498243712822242 @ -81, -446, -832 +313331026360933, 89709042465912, 204146867542768 @ -6, 769, 196 +236706269641310, 293781162907014, 364847958773123 @ 112, 13, -158 +279538407522829, 550131597783768, 19696530142084 @ -11, -421, 383 +293211307380926, 66094240565832, 430550575300350 @ -46, 115, -113 +333271637399793, 378355761107144, 214818391269928 @ 22, 371, 381 +325843512544115, 345217705337008, 292415233095689 @ -49, -21, -52 +420441557359870, 544064033960014, 314667303990353 @ -252, -483, -64 +268021405413465, 141044605679204, 314940805901424 @ 26, 216, -37 +260570202145320, 286363783957099, 11222456353998 @ 70, 36, 547 +319692915981775, 345999953400321, 189560446260662 @ 171, 730, 659 +179836906988840, 161203920328134, 39447901645168 @ 76, 25, 297 +350563758679413, 170556089358608, 247112200983672 @ -110, 218, 73 +334834073919370, 431635295115685, 207831261623386 @ -54, -240, 243 +361548280279369, 514189435413504, 398272723391668 @ -157, -529, -449 +370493312287576, 369938091892587, 473584283816371 @ -172, -78, -568 +303398968194050, 329366057677029, 243711831026538 @ -16, -50, 79 +270438813902908, 181490663000820, 289337244663856 @ -10, 39, 25 +254400483963875, 307642322287124, 244804645542848 @ 74, -19, 77 +312146397234765, 425334009313609, 517539480249663 @ -19, -238, -598 +113152039807619, 170070593691318, 157094384321022 @ 155, 25, 175 +275763389008533, 328212728463508, 74579605699968 @ 175, 168, 751 +195679788641677, 146550228445368, 280886425143448 @ 252, 418, -9 +331428536369057, 248257965259956, 174388217330008 @ -76, 64, 201 +281502442529605, 315900614706024, 293545970458528 @ -6, -89, 6 +519947284600358, 495701506799977, 419122501309588 @ -278, -328, -99 +172419326257043, 226353669769664, 351368934567462 @ 80, -49, -32 +333706656973399, 229744717806640, 313816869852676 @ -78, 135, -57 +267110402141650, 334660667695204, 295521975932789 @ 96, -9, -52 +216242569512810, 464422278901794, 343577846341774 @ 46, -299, -33 +229078419153034, 153290184037422, 330424902401150 @ 30, 49, -17 +198482350250745, 256015754330784, 229632043763513 @ 113, -5, 100 +322342956622625, 251344925510174, 281036336770388 @ -55, 101, 5 +286653289685853, 135859734501602, 298784647322574 @ -35, 65, 19 +114350058038805, 256004530503232, 295548005515368 @ 206, -28, 11 +267152206820407, 208276927258334, 265366704385984 @ 24, 96, 45 +443347397696629, 432287272587360, 333152076807796 @ -205, -263, -16 +288113563819415, 368647980128949, 49381325869643 @ 11, -134, 458 +217051686880615, 396484783975299, 247977484403728 @ 95, -206, 73 +261955486249395, 213440321942711, 282504619066439 @ 11, 30, 28 +214851418383385, 353352589684520, 69821891934088 @ 36, -181, 261 +211609119179538, 309269445218725, 261017025857522 @ 148, -30, 47 +318311090115901, 253689393162648, 244445467490848 @ -23, 265, 76 +296107616866830, 302129547578124, 283898755233783 @ 8, 31, -10 +133307131141155, 208333592171909, 289852225700998 @ 143, -6, 27 +331131130717605, 450517268725624, 357079438353828 @ 7, -369, -824 +355952604648953, 347503897397628, 320112678217674 @ -121, -95, -68 +328870765387125, 338472631582090, 302600646110641 @ -59, -15, -72 +326694164461003, 399342005912190, 256114962145246 @ 118, 200, -82 +309971204357293, 351186397545063, 309670007599705 @ 13, 12, -136 +300655266617485, 264279702750096, 413188486071736 @ -29, 8, -191 +349273400687770, 405472194021129, 160563578253598 @ -122, -112, 479 +288009504704101, 133540166340720, 189529189481656 @ 88, 738, 257 +318448889127518, 416349712478154, 237218397927819 @ 10, -179, 104 +220627166761237, 276302047504788, 412602211652320 @ 95, -16, -185 +433765655562877, 447565923223816, 455098276440024 @ -228, -283, -226 +349499197910978, 273042374600336, 161722557881602 @ -106, -37, 195 +237911712305755, 31778891691315, 380349689977690 @ 11, 150, -61 +317838779215960, 284602693333544, 348099634409958 @ -60, -45, -73 +246758131645855, 62136719247558, 177190186553584 @ 86, 442, 205 +441789526685301, 266733891477927, 336243814605428 @ -203, -86, -19 +322304061345021, 385318425241968, 285881931602400 @ 5, -23, -121 +272335950995355, 98284487215684, 346429929262348 @ -28, 65, -21 +249239072203677, 216041964124516, 322374425884550 @ 29, 29, -26 +254887883472677, 321843066365532, 298590923399276 @ 47, -80, -10 +109646561831065, 179014251500964, 294694065764008 @ 136, -10, 29 From 5ebf620992629982ea97f3351b5ae1a40170f160 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 24 Dec 2023 13:35:15 +0100 Subject: [PATCH 471/479] 2023: d24: ex1: add solution --- 2023/d24/ex1/ex1.py | 78 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100755 2023/d24/ex1/ex1.py diff --git a/2023/d24/ex1/ex1.py b/2023/d24/ex1/ex1.py new file mode 100755 index 0000000..0145669 --- /dev/null +++ b/2023/d24/ex1/ex1.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python + +import itertools +import sys +from decimal import Decimal +from typing import NamedTuple + + +class Point(NamedTuple): + x: int + y: int + z: int + + +class HailStone(NamedTuple): + pos: Point + vel: Point + + +def solve(input: list[str]) -> int: + def parse_line(line: str) -> HailStone: + pos, vel = line.split(" @ ") + return HailStone( + Point(*map(int, pos.split(", "))), Point(*map(int, vel.split(", "))) + ) + + def parse(input: list[str]) -> list[HailStone]: + return [parse_line(line) for line in input] + + def intersections(hailstones: list[HailStone], boundaries: tuple[int, int]) -> int: + def intersects(a: HailStone, b: HailStone) -> bool: + # According to wikipedia, if: + # x = a_px + t * a_vx = b_px + u * b_vx + # y = a_py + t * a_vy = b_py + u * b_vy + # then: + # t = ((a_px-b_px)*(-b_vy) - (a_py-b_py)*(-b_vx)) / ((-a_vx)*(-b_vy) - (-a_vy)*(-b_vx)) + # u = ((a_px-b_px)*(-a_vy) - (a_py-b_py)*(-a_vx)) / ((-a_vx)*(-b_vy) - (-a_vy)*(-b_vx)) + (a_px, a_py, _), (a_vx, a_vy, _) = a + (b_px, b_py, _), (b_vx, b_vy, _) = b + + # Use rationals for extra precision, just in case + denom = Decimal(a_vx * b_vy - a_vy * b_vx) + + # Parallel lines + if denom == 0: + return False + + t = ((a_px - b_px) * (-b_vy) - (a_py - b_py) * (-b_vx)) / denom + u = ((a_px - b_px) * (-a_vy) - (a_py - b_py) * (-a_vx)) / denom + + # Intersects in the past + if t < 0 or u < 0: + return False + + x = a_px + t * a_vx + y = a_py + t * a_vy + + # Outside our observation area + if not boundaries[0] <= x <= boundaries[1]: + return False + if not boundaries[0] <= y <= boundaries[1]: + return False + + return True + + return sum(intersects(a, b) for a, b in itertools.combinations(hailstones, 2)) + + hailstones = parse(input) + return intersections(hailstones, (200000000000000, 400000000000000)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From df75f1c5d2cc16b0b5e6b7199c7424e6af8b9425 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 24 Dec 2023 13:35:20 +0100 Subject: [PATCH 472/479] 2023: d24: ex2: add input --- 2023/d24/ex2/input | 300 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) create mode 100644 2023/d24/ex2/input diff --git a/2023/d24/ex2/input b/2023/d24/ex2/input new file mode 100644 index 0000000..9b50e17 --- /dev/null +++ b/2023/d24/ex2/input @@ -0,0 +1,300 @@ +260346828765750, 357833641339849, 229809969824403 @ 64, -114, 106 +340220726383465, 393110064924024, 226146987100003 @ -79, -61, 158 +11361697274707, 101596061919750, 46099495948720 @ 328, 162, 333 +360204609690721, 527678808395772, 271703202326380 @ -132, -458, 20 +228800225183261, 405333190838676, 284309641117406 @ 29, -233, 35 +347686754070960, 372761595433127, 227908656106580 @ -134, 452, 245 +420404387574505, 320613771806244, 282039825133426 @ -209, -99, 24 +239697674964055, 219683531868878, 291640535034286 @ 36, 12, 18 +270083622615715, 298192739573649, 450720525831403 @ 71, 50, -394 +210388952361528, 202933503071430, 369359171934512 @ 62, 13, -71 +323626194439723, 331061672127276, 297678575959794 @ -45, 7, -61 +304808549150934, 383205509992906, 523319353604760 @ -22, -163, -463 +187934586489225, 219381841648824, 260929087075428 @ 73, -29, 61 +334112509601119, 400144558186712, 244055841518098 @ 18, 155, 66 +246253930315613, 304696957680568, 94020244355048 @ 53, -63, 311 +342955905222035, 388277972401036, 257476145906070 @ -94, -111, 34 +327736098163477, 330547943777790, 153376586381074 @ -71, -90, 230 +261048582174545, 197767231455944, 278362708671168 @ -10, -13, 43 +262232829717925, 400052820669654, 363505406595748 @ 25, -212, -101 +324188029882468, 362855685632781, 234741485808022 @ 110, 502, 163 +205507378373754, 312370561869725, 214016656029865 @ 148, -46, 132 +239592601431541, 142078397267946, 285236791773286 @ 17, 58, 34 +144373393337221, 188196109756908, 173981678832424 @ 99, -22, 149 +288873332238259, 312782225890490, 274590086150334 @ 18, -6, 14 +186182198786950, 402152186162636, 135534511498564 @ 96, -225, 213 +231239063521245, 186020667465684, 343869538475528 @ 13, -20, -19 +250272260456639, 161173847651144, 288550442540870 @ 10, 51, 28 +296318163416530, 282047552083869, 393397156658776 @ 116, 426, -591 +324596493713872, 398326967096844, 254282763206956 @ 32, -9, 5 +215625978065245, 203168177356104, 420679288194328 @ 35, -25, -104 +191086370171245, 60115319750904, 146260480280128 @ 243, 573, 296 +322860700705485, 459545877374104, 448537560287088 @ -59, -309, -299 +314822321873915, 398359415059524, 264470104210778 @ 140, 49, -94 +269210714892168, 256327147227716, 398338379562592 @ 52, 95, -231 +302666483817653, 275410751736752, 326439099654152 @ -40, -40, -37 +270142822739620, 344779311267669, 324492644181298 @ 52, -80, -85 +374865332232522, 402789242720040, 323870419231066 @ -182, -173, -141 +243208589268314, 367086212824621, 199057002427101 @ 140, -102, 184 +250464382830742, 135024447362895, 320243825003503 @ -8, 24, 6 +355922778067984, 378321615748686, 241250226323332 @ -130, -107, 85 +316218511102785, 354948779738048, 394814158202160 @ 86, 273, -913 +321455854706509, 396440824238416, 314920648255344 @ 9, -75, -257 +169378410757153, 225633601154640, 335902593841960 @ 104, -23, -27 +310941798903565, 333771112844784, 286883552058694 @ 101, 351, -182 +411974191700116, 414045748557315, 447602203181716 @ -232, -222, -323 +282375423819373, 240799415094852, 287697942997588 @ -23, -28, 26 +424528361387804, 462909748733920, 382166946506320 @ -278, -325, -231 +163339958801001, 272115353229508, 302748903558972 @ 230, 32, -28 +258865845218325, 331436090977439, 237682017090608 @ 37, -100, 89 +302915997518781, 347231423515616, 296218913365336 @ -43, -147, 9 +201550834032262, 308185564073751, 181635624713110 @ 224, 24, 219 +326879140563285, 302444228750105, 363158049251869 @ -59, 38, -192 +199437546908251, 165065778022384, 281783000883451 @ 135, 171, 18 +275634964575007, 320652660558480, 161650608601594 @ 82, 39, 294 +299888387753175, 162477657523014, 431376299337848 @ -46, 58, -143 +392193811586581, 352294886790018, 355391098486984 @ -187, -111, -127 +368009114122653, 158595116827656, 240204738709240 @ -127, 64, 84 +235057921833792, 208902653782308, 369261469240150 @ 10, -41, -45 +333864628161721, 403967975589003, 236655090656734 @ 17, 100, 147 +315707153676205, 346742558497233, 239838980741152 @ -19, -16, 89 +265733060020157, 382781265854024, 325370365767928 @ 44, -169, -69 +244493835144625, 206378827546980, 278922806636032 @ 216, 460, -33 +336468228693530, 357997678992397, 445536876104649 @ -64, 78, -800 +334116663241987, 417641320056889, 460730643073845 @ -81, -234, -296 +283712214409060, 217794347554444, 318592790485419 @ 6, 111, -50 +181035782538969, 34330093599444, 116481838981164 @ 59, 121, 203 +267636391438175, 116019071284224, 274907016053068 @ -13, 91, 45 +359932116674365, 372724315764974, 242720827369528 @ -195, 137, 81 +413732861285365, 274346810098864, 265789907811328 @ -234, 50, 36 +353859733044440, 444601519540446, 186716148862678 @ -124, -287, 231 +266823502975823, 342804454729090, 139439752620420 @ 62, -72, 295 +299232903030949, 283130841945486, 266625316859842 @ -27, -23, 43 +275731283415043, 290995753064250, 269990654468416 @ 12, -32, 37 +284336299470177, 363011315559156, 245656891783664 @ 65, -65, 73 +300184773969053, 264674528467624, 288447324797656 @ -35, -19, 15 +364327543902318, 203179466147145, 202143114372903 @ -160, 454, 206 +240582515099049, 257855786814120, 267367130583972 @ 95, 67, 35 +322071439136631, 320755095987098, 240900218113582 @ -62, -76, 84 +407030376195355, 238248420347409, 280351241837773 @ -197, 44, 22 +363480833508100, 302741435647038, 374292309644818 @ -184, 337, -509 +305986467673468, 242537468667456, 312444331887847 @ 32, 395, -156 +252027155370005, 237764087612499, 383247340881198 @ 5, -44, -77 +372582774757039, 423473229980586, 294285328077664 @ -173, -231, -55 +284005653462811, 279636127688541, 343422083098399 @ 23, 50, -122 +307762320034081, 264568258469028, 248848044023842 @ -57, -71, 74 +356296354200217, 324248100646422, 270336780779350 @ -125, -18, 20 +310365295172069, 398733724603568, 271146207120040 @ 38, -112, -33 +332525984343205, 424881352868134, 234357444969968 @ 33, -126, 173 +352583954626249, 349239276790500, 353167414266244 @ -116, -82, -152 +297714119036800, 324271023294864, 362116453319623 @ -10, -53, -146 +285957271760765, 299826994507224, 268344479706678 @ 13, -5, 32 +243189693681529, 258702209578860, 199942339459600 @ 190, 242, 203 +326701397847709, 290194546332360, 296193493706296 @ -43, 195, -87 +292362934918391, 337984495256987, 353443507882303 @ 7, -66, -144 +329560214366727, 287131872509690, 283601935331544 @ -58, 144, -31 +419657717017333, 394749569068172, 492465483328742 @ -207, -207, -278 +424741311206371, 418004503651488, 366948667795378 @ -212, -241, -94 +289511348263829, 369752819333130, 313407769490726 @ 73, -56, -140 +317864241152929, 333597843545268, 280181752022452 @ -20, 40, -30 +159013055331421, 197040084742216, 154846454650744 @ 129, 27, 189 +310161956929405, 317608137512664, 286534497733492 @ -19, 11, -21 +328398331752021, 408235207737374, 277347063815996 @ 37, -19, -211 +352713775673581, 329046721759478, 139004188330392 @ -123, 50, 385 +303904706761629, 256397200765768, 300376317070392 @ -37, 8, -7 +273217189299031, 372821204372277, 128406796773907 @ 95, -92, 392 +152269575075685, 112586975003184, 246776862071728 @ 138, 132, 76 +316077180975508, 285040325144306, 333644269613969 @ -48, 5, -82 +291214477117667, 139137384078822, 239703215510530 @ -46, 28, 84 +282383815400461, 202954623809304, 225038200055848 @ 24, 196, 116 +168593234159600, 148914293359439, 291033865957193 @ 94, 48, 28 +398831545490785, 308451835604503, 274399283929173 @ -159, -126, 46 +240709939960879, 308439888753675, 278202135723646 @ 59, -72, 27 +279404244431973, 251750459409020, 95468761809964 @ 35, 114, 384 +420662877939440, 344775968361866, 525951427053175 @ -274, -55, -570 +327071630965000, 395761942422854, 262797011894253 @ 114, 245, -164 +334223852961341, 422841882209224, 241141724398936 @ 38, -69, 102 +331008090348665, 334101214652224, 233563791181228 @ -68, -31, 102 +365681210920495, 502432633101754, 311612110753818 @ -138, -388, -46 +349308710499373, 385266962186136, 265604633087480 @ -150, 292, -163 +302146562278813, 327132561288801, 243383000145796 @ 157, 400, 77 +253538164543510, 405218794636794, 381768323339290 @ 96, -199, -217 +235161774756385, 227712177337092, 326407943699224 @ 16, -48, -7 +236032878960545, 237730556620694, 427906712868538 @ 17, -55, -117 +329543688711978, 407035805550239, 145778919294318 @ -82, -234, 191 +179368688878425, 325143400816138, 366229488873984 @ 131, -112, -91 +371231992850378, 316638751988811, 236103319042700 @ -212, 244, 109 +339808454446741, 351596138940235, 279082311533963 @ -75, 170, -104 +351596216557693, 415490735560152, 387962665814524 @ -123, -193, -412 +278688411144475, 219677637474000, 280342089549808 @ -29, -37, 41 +227585847055153, 347006074356246, 373749729539980 @ 67, -140, -105 +312933684342933, 200941440991884, 335002534040332 @ -61, 16, -30 +280319712864331, 341572097476173, 270405943273150 @ 119, 58, -13 +334263217258791, 436302126934828, 368237906560810 @ -86, -267, -78 +258254831954108, 147783583066962, 333731768562520 @ -8, 37, -15 +355801879637895, 341787614777264, 302534030878548 @ -122, -73, -41 +131266234587925, 22532917085508, 198037908529672 @ 111, 140, 125 +341625668908842, 329754211784895, 301962684556755 @ -92, -8, -62 +105063826836925, 158508866142744, 351476391746242 @ 141, 11, -28 +412949842167537, 462762493467832, 334895606045844 @ -220, -313, -82 +329069085317565, 377407266331234, 426073969564998 @ -19, 44, -868 +217418593657566, 204726057801614, 242720827369528 @ 70, 41, 81 +338084512203857, 410004688486632, 239975437178400 @ -38, -5, 107 +379384638630079, 369543475974252, 402174952375396 @ -200, -71, -381 +386154908209069, 395639474455092, 280370845418350 @ -235, -131, -42 +275382644671282, 36951187740642, 151193435620480 @ 40, 537, 265 +356619952566811, 324712560155565, 331988520420058 @ -141, 124, -229 +358547496942130, 408300560102454, 267115051708363 @ -172, -115, -46 +346306312397521, 383668766131808, 228673142584364 @ -108, 5, 152 +359754386397630, 458720322718534, 559318866468353 @ -118, -295, -314 +351347143979005, 365572803517800, 259774637417128 @ -119, -57, 31 +302183764989621, 364256687909996, 265155690823964 @ 35, -36, 10 +330924340196260, 296427648577092, 141164605133864 @ -84, -113, 193 +364641746578165, 515395099355088, 306019572461464 @ -174, -558, -155 +339224696083261, 358367099969064, 263593215134050 @ -83, -29, 18 +193992358862501, 185968153834072, 367909202669970 @ 97, 59, -82 +336367817216524, 421844251871834, 247462114434092 @ 18, -39, 13 +161312373767566, 150227310716099, 291400675391663 @ 108, 56, 26 +231266455520539, 145495597439120, 287703190551144 @ 42, 95, 25 +206550308007613, 468743856845808, 162840383607640 @ 53, -303, 169 +429512031935863, 262967063704113, 273355464244561 @ -185, -92, 50 +380308299578381, 391625299100696, 505418060665704 @ -181, -163, -521 +330850564652410, 441663420225969, 416132167014268 @ -52, -282, -515 +375615981345391, 246897309609150, 541040247329687 @ -141, -11, -322 +257612492222965, 491419444805616, 398469152274232 @ 26, -346, -143 +292985656154761, 317945193289904, 184697849249204 @ 60, 101, 260 +232877219665201, 405217862288709, 271226801912872 @ 89, -214, 33 +348259631347512, 204238531298826, 312600183336479 @ -106, 169, -50 +268746780353590, 281608151109144, 383837866458733 @ 126, 195, -338 +122524059468689, 287919639112272, 167740167865852 @ 203, -65, 183 +312459888298897, 326923346974976, 225415511869904 @ 27, 167, 149 +319608062021405, 211487145992136, 254111710998584 @ -64, 49, 65 +242932724018775, 99557446164529, 454532431171443 @ 7, 84, -140 +257306506153525, 384718831609032, 260164650130816 @ 6, -205, 60 +346820458626153, 114882415853663, 188792118714110 @ -103, 294, 175 +313007300086521, 358742568002607, 296850115847834 @ -7, -38, -77 +178290472099096, 100952248470583, 338895184944207 @ 162, 260, -70 +232626084330181, 190661053821264, 325127462135648 @ 30, 16, -14 +372111394423630, 360975162645164, 266126939035668 @ -132, -177, 53 +448046725470493, 357813853076325, 323596691049628 @ -227, -170, -19 +241095145890565, 149424858214964, 213990140128028 @ 81, 233, 131 +335893091355037, 420535970089352, 269657513849720 @ 9, -52, -256 +344781417999610, 437369362040334, 233000501863018 @ -102, -263, 195 +317912587490765, 356977339413256, 421028144913168 @ -49, -117, -254 +349219513788590, 431309506759549, 505578881772528 @ -104, -262, -199 +301801136650301, 321621066036596, 298591305543704 @ 5, 14, -55 +197415955491805, 446870993170456, 251710862420360 @ 81, -280, 70 +328275156333949, 224085796039851, 111193637396461 @ -67, 152, 340 +333989052779735, 163119706265934, 181122434623568 @ -86, 70, 157 +318880316206670, 372095178926389, 267474120557491 @ 16, 26, -30 +308122992582769, 210364537012149, 317548450311542 @ -63, -44, 7 +348091459536315, 236767606013484, 310471779320178 @ -109, 295, -109 +341518034630073, 288253587957497, 238209449374690 @ -95, -70, 87 +340212283132345, 393453588795138, 268600848335248 @ -69, 40, -99 +280974192791863, 258914295404854, 280705588435520 @ -12, -24, 29 +282538583056945, 227062101647424, 243979447408168 @ 98, 401, 77 +288833639276521, 496224937883232, 345769934484472 @ 48, -423, -191 +255548451712998, 156282887184168, 316053658342303 @ -8, 19, 6 +285854755263325, 24984747817020, 476670900347380 @ -19, 294, -238 +212112768985246, 234501742570219, 124155071921577 @ 54, -34, 218 +338869855674325, 386664870421884, 174537446814868 @ -45, 220, 732 +304602699119581, 247415356610292, 237730462264480 @ -51, -40, 87 +201522270417337, 285205884453340, 399540925660236 @ 108, -48, -146 +326757229359428, 287469465594148, 258423126039770 @ -56, 95, 43 +333951128919449, 331322625326732, 453397225792116 @ -73, -7, -437 +292988972896088, 332905942698000, 252990122356426 @ 172, 283, 27 +384958618115821, 247508925135802, 401083403479964 @ -147, -43, -107 +281596559976835, 382226933972694, 280187261925958 @ 74, -116, -22 +347338880183865, 322738236098574, 448691665190778 @ -113, 304, -944 +264955694979067, 403952665234368, 153053196172780 @ 98, -185, 303 +307782647476363, 347773192266981, 271590305749501 @ 27, 40, -18 +367152045806920, 234243125497029, 252417867018223 @ -134, 46, 66 +291454116512653, 164941797533448, 386772051012232 @ -43, 19, -71 +244648686644621, 74473321237288, 423822977537712 @ 67, 335, -220 +371738115903269, 322834069329616, 327860913687192 @ -200, 158, -235 +306768194985703, 387225033930552, 320815377161014 @ 62, -53, -252 +314261905759726, 359781050506104, 334488218815414 @ -68, -189, -13 +272373310391389, 340174705578844, 270905323294753 @ 93, -9, 6 +217782060320639, 239743874379665, 75868546325352 @ 59, -22, 289 +375894419111917, 291779701795464, 439527813829720 @ -172, 71, -377 +489310372402870, 369981901801572, 334584256505716 @ -244, -201, -11 +257287473074670, 248009697251629, 291838103346963 @ 20, -10, 14 +145816820913779, 235003443009532, 348328300988480 @ 187, 23, -71 +345816222735610, 360157990964114, 299937550423123 @ -108, 273, -318 +198350092222519, 292429071608601, 336794186804518 @ 103, -68, -49 +224117248246469, 256297365293626, 431101666985804 @ 25, -82, -113 +110752387242301, 184626622675488, 288176733731296 @ 189, 43, 25 +326386961847376, 380573313647966, 266642825749899 @ -30, -51, -10 +128348548472147, 111177263615478, 63927760725468 @ 167, 133, 301 +286769988964609, 239257934452668, 200225830580262 @ 147, 577, 262 +337769607994122, 285274570185288, 298358572970588 @ -82, 115, -59 +292165954153983, 324666184042451, 243761085630574 @ 203, 384, 75 +320912056048390, 123348286817445, 257833508272936 @ -74, 64, 65 +275106210350605, 341850774826676, 304041305857796 @ 21, -103, -25 +328442104512972, 322558730340121, 489791000831846 @ -52, 68, -641 +339487928899561, 487418253546930, 498243712822242 @ -81, -446, -832 +313331026360933, 89709042465912, 204146867542768 @ -6, 769, 196 +236706269641310, 293781162907014, 364847958773123 @ 112, 13, -158 +279538407522829, 550131597783768, 19696530142084 @ -11, -421, 383 +293211307380926, 66094240565832, 430550575300350 @ -46, 115, -113 +333271637399793, 378355761107144, 214818391269928 @ 22, 371, 381 +325843512544115, 345217705337008, 292415233095689 @ -49, -21, -52 +420441557359870, 544064033960014, 314667303990353 @ -252, -483, -64 +268021405413465, 141044605679204, 314940805901424 @ 26, 216, -37 +260570202145320, 286363783957099, 11222456353998 @ 70, 36, 547 +319692915981775, 345999953400321, 189560446260662 @ 171, 730, 659 +179836906988840, 161203920328134, 39447901645168 @ 76, 25, 297 +350563758679413, 170556089358608, 247112200983672 @ -110, 218, 73 +334834073919370, 431635295115685, 207831261623386 @ -54, -240, 243 +361548280279369, 514189435413504, 398272723391668 @ -157, -529, -449 +370493312287576, 369938091892587, 473584283816371 @ -172, -78, -568 +303398968194050, 329366057677029, 243711831026538 @ -16, -50, 79 +270438813902908, 181490663000820, 289337244663856 @ -10, 39, 25 +254400483963875, 307642322287124, 244804645542848 @ 74, -19, 77 +312146397234765, 425334009313609, 517539480249663 @ -19, -238, -598 +113152039807619, 170070593691318, 157094384321022 @ 155, 25, 175 +275763389008533, 328212728463508, 74579605699968 @ 175, 168, 751 +195679788641677, 146550228445368, 280886425143448 @ 252, 418, -9 +331428536369057, 248257965259956, 174388217330008 @ -76, 64, 201 +281502442529605, 315900614706024, 293545970458528 @ -6, -89, 6 +519947284600358, 495701506799977, 419122501309588 @ -278, -328, -99 +172419326257043, 226353669769664, 351368934567462 @ 80, -49, -32 +333706656973399, 229744717806640, 313816869852676 @ -78, 135, -57 +267110402141650, 334660667695204, 295521975932789 @ 96, -9, -52 +216242569512810, 464422278901794, 343577846341774 @ 46, -299, -33 +229078419153034, 153290184037422, 330424902401150 @ 30, 49, -17 +198482350250745, 256015754330784, 229632043763513 @ 113, -5, 100 +322342956622625, 251344925510174, 281036336770388 @ -55, 101, 5 +286653289685853, 135859734501602, 298784647322574 @ -35, 65, 19 +114350058038805, 256004530503232, 295548005515368 @ 206, -28, 11 +267152206820407, 208276927258334, 265366704385984 @ 24, 96, 45 +443347397696629, 432287272587360, 333152076807796 @ -205, -263, -16 +288113563819415, 368647980128949, 49381325869643 @ 11, -134, 458 +217051686880615, 396484783975299, 247977484403728 @ 95, -206, 73 +261955486249395, 213440321942711, 282504619066439 @ 11, 30, 28 +214851418383385, 353352589684520, 69821891934088 @ 36, -181, 261 +211609119179538, 309269445218725, 261017025857522 @ 148, -30, 47 +318311090115901, 253689393162648, 244445467490848 @ -23, 265, 76 +296107616866830, 302129547578124, 283898755233783 @ 8, 31, -10 +133307131141155, 208333592171909, 289852225700998 @ 143, -6, 27 +331131130717605, 450517268725624, 357079438353828 @ 7, -369, -824 +355952604648953, 347503897397628, 320112678217674 @ -121, -95, -68 +328870765387125, 338472631582090, 302600646110641 @ -59, -15, -72 +326694164461003, 399342005912190, 256114962145246 @ 118, 200, -82 +309971204357293, 351186397545063, 309670007599705 @ 13, 12, -136 +300655266617485, 264279702750096, 413188486071736 @ -29, 8, -191 +349273400687770, 405472194021129, 160563578253598 @ -122, -112, 479 +288009504704101, 133540166340720, 189529189481656 @ 88, 738, 257 +318448889127518, 416349712478154, 237218397927819 @ 10, -179, 104 +220627166761237, 276302047504788, 412602211652320 @ 95, -16, -185 +433765655562877, 447565923223816, 455098276440024 @ -228, -283, -226 +349499197910978, 273042374600336, 161722557881602 @ -106, -37, 195 +237911712305755, 31778891691315, 380349689977690 @ 11, 150, -61 +317838779215960, 284602693333544, 348099634409958 @ -60, -45, -73 +246758131645855, 62136719247558, 177190186553584 @ 86, 442, 205 +441789526685301, 266733891477927, 336243814605428 @ -203, -86, -19 +322304061345021, 385318425241968, 285881931602400 @ 5, -23, -121 +272335950995355, 98284487215684, 346429929262348 @ -28, 65, -21 +249239072203677, 216041964124516, 322374425884550 @ 29, 29, -26 +254887883472677, 321843066365532, 298590923399276 @ 47, -80, -10 +109646561831065, 179014251500964, 294694065764008 @ 136, -10, 29 From ee84fa576d88539fd3315d3861fba4446bb6b672 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sun, 24 Dec 2023 13:35:25 +0100 Subject: [PATCH 473/479] 2023: d24: ex2: add solution --- 2023/d24/ex2/ex2.py | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 2023/d24/ex2/ex2.py diff --git a/2023/d24/ex2/ex2.py b/2023/d24/ex2/ex2.py new file mode 100755 index 0000000..83ad213 --- /dev/null +++ b/2023/d24/ex2/ex2.py @@ -0,0 +1,65 @@ +#!/usr/bin/env python + +import sys +from typing import NamedTuple + +import z3 + + +class Point(NamedTuple): + x: int + y: int + z: int + + +class HailStone(NamedTuple): + pos: Point + vel: Point + + +def solve(input: list[str]) -> int: + def parse_line(line: str) -> HailStone: + pos, vel = line.split(" @ ") + return HailStone( + Point(*map(int, pos.split(", "))), Point(*map(int, vel.split(", "))) + ) + + def parse(input: list[str]) -> list[HailStone]: + return [parse_line(line) for line in input] + + # Bringing out the big guns to solve this + def run_z3(hailstones: list[HailStone]) -> HailStone: + solver = z3.Solver() + + px, py, pz = (z3.Int(f"stone_p{coord}") for coord in ("x", "y", "z")) + vx, vy, vz = (z3.Int(f"stone_v{coord}") for coord in ("x", "y", "z")) + + for i, other in enumerate(hailstones): + t = z3.Int(f"t_{i}") + # Must be in the future + solver.add(t >= 0) + # Must hit the hailstone + solver.add((px + vx * t) == (other.pos.x + other.vel.x * t)) + solver.add((py + vy * t) == (other.pos.y + other.vel.y * t)) + solver.add((pz + vz * t) == (other.pos.z + other.vel.z * t)) + + assert solver.check() == z3.sat # Sanity check + + model = solver.model() + return HailStone( + Point(*(model.eval(v).as_long() for v in (px, py, pz))), # type: ignore + Point(*(model.eval(v).as_long() for v in (vx, vy, vz))), # type: ignore + ) + + hailstones = parse(input) + stone = run_z3(hailstones) + return sum(stone.pos) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From 8424bbb2bb26cc5433f26290775064a4478bb356 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 25 Dec 2023 17:20:09 +0100 Subject: [PATCH 474/479] 2023: d25: ex1: add input --- 2023/d25/ex1/input | 1262 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1262 insertions(+) create mode 100644 2023/d25/ex1/input diff --git a/2023/d25/ex1/input b/2023/d25/ex1/input new file mode 100644 index 0000000..4b678e2 --- /dev/null +++ b/2023/d25/ex1/input @@ -0,0 +1,1262 @@ +pcf: vqq glr rpx qcm +qkb: ccc lxr ppx +vnm: frl +scx: czr +zqg: lbj xkk +qvs: zgv vfq pqp qbl rpt zcq +sxm: rgj +vrd: hbb trd fgh +dbh: crj hjx bkj +psx: sxc +dsx: bjf zrx pld +dqn: kxm +lst: fzr +mzv: gcq bkh mqg +lzm: fdl jpf qxt +xfs: zdh thc rxd cjm +lqk: zth +mbn: skp pxv zgv bpn +kzg: mgc vnc zdt +rdl: pql ptt jfm hsp zvl hhx +nbj: tqk qhx +rzr: cfk pdh +bdm: ppx jcr tgp mhl +glr: bzl snq drq prc +qds: glk jvn ntx +kqq: ftz blr hlr kvd +fsd: hbs +czr: rms +sgv: kzb tvs qxx +mdz: rtk txr cqr +nvc: vsr kzb +bkp: msz vpn fzr +fbq: txq sbn +xgq: dng xlh cqb +qsq: vvr vqz xpv nlm +dhk: bqm fvg cjm +khs: dqq tfb +blm: lqb rcq dmr knp +vfb: tjm ltb lcd vss xvg +psn: hrb hzt dhk hdg +dtl: jgv +tgf: rnk +jlj: rhq vmq scj fsp klg +nbt: khg dvg plf +cng: gsf +mrr: bht +pbf: pxl zbf +zpm: tfc jrm jfl crs hsp +sfh: pmh jfl nhf vct +fdl: jtj +qtl: kvn glk cjv lrd +pmv: mpj mmp +qfv: nph klg kxm cmj vxd pqx +mjn: jfk pql +prc: nzf rjt +qnc: kbt nth +cml: gzg lpz pxs tvd lvf +nxl: mgg tnt msz +rqp: bkj nbg +cfb: slr bmv mnf tgp bfm +sff: flz nlq jtc rkz +jzk: txm +tnt: szr ljs +jhm: sms gll +tjm: vvz qsf +psh: qsf +ftf: rkn rcz ddg hbx +jfl: rll +pxp: dtc nqq cqb sjd bdg +hfm: xzs krk jpj hbs fvg +fvk: gnv bjh +rxt: dlr sbg +qhk: dqp tzz smc rxh +tbf: tdl +vms: sgl +mps: fth kqs pnr fbq +srg: ndj gdq +vzk: ggd dms vdh zdt +dkj: drk zmv kkb sjs +hzg: drn cmp gxf mkr +pqm: gmf krk vvc ldb +dpb: sdj bgh plm +pnq: fxt mxg +mlc: brv hld mzz +cxx: vrx zcx xxv +crj: lxr vgl +stj: tsm xxv jpj ccl +zcl: fvz ntx +dpd: brv sms frx +snm: lnn bqx nqm kdr +vdx: fbm cqr fpg pdh +qjv: vhd vms +xhm: lhz kkv lcq +zgk: fkc vmb vjj vtg jqs +ftr: crq ntc bsr +rst: cxm +xxm: mld +qxj: nhf dns +lhr: znp +tfx: lgs skp fdl dsb +mzr: qps +kjt: kzb xbb +tzs: cfk sdg +xqr: lbl pdv +bjf: vsz lft +xnh: tfv lnz +tqk: kzn +tht: dld kqh cng rlc +tsd: kng ndm +thn: gkg +xth: bns zgv fth bfg kzc +fjx: kxm +smx: tjq pmv nbj hdj +zdt: xtp zkp hpf +zcm: njk vtl fvk +jbj: nrg bng jqs vgl +czm: fdr zbf dkt +rfk: rbm grf zqb +pxn: cjv jfl +zxp: dvt qvk cfv pst +lrc: dpp jcr ldh bth +djx: hpg dlm +gvv: rlc ppn gjp mdv +ddb: xgx rft +qrx: ckt bdg mmh +jxk: psh dbp cbn dvz +bxk: mrq jzk cpv pqh +vvc: nqm ngd gzm +drd: tzj jgc nzf rxx +cdn: jhh pxl xdc lgk +zjz: ldr cfb bfm +kkb: qnn dmp +ctv: tfb gbh +cvd: rhq rcn hcx +gxb: dfn vzc +jtv: jjz bqm +dfb: fqz zmr pnr nlq +ptr: dfv lqm +dvg: clp +qgz: qzq tlk jzt kqg +qct: lbv gxh vdh +hpg: hck +dlr: jvj +jgv: mmh +mmp: hck +krk: lqb +ksr: ggd fzr dsm +ncb: rxt kqs hhx mnp +zcx: knr mkm +zfr: gxb dsm xqg +hpr: txx gpg +bzf: dvm +qjp: qsh +qgh: sjd cpv chv pxl +vnk: pxl sqs glp +gkr: vtg bnj bng tdf +sxq: ltl ksb plm +lcl: njk zjl tsm +vkq: xzj dvm +brz: drl str +nlk: jnc +zpj: rjz psh zvt +vct: frl pql +tfp: zsm rsl jtc smt +drx: xzk dzt +hrb: kzs clp +vbs: pbf zzh qlp +hqc: crc pcb kml +qld: hqf cxm rlc vkd +zjb: mft mnc xpv kjc +plv: zfr fqq fgq xkh +brr: fbb mdz dpd hrb +qzq: rhd zgn +zgb: fft ksj jcn +qgr: cmj bsr trc +kdr: qns fsj rpx frx +nqk: mtv zpj pbg nvh xvv +kzz: blv gzm +pld: pqx rcn +pvm: qnd +sfq: gkt +nqb: mkm kzs +dpl: qxf jvn fbq qxj +lrn: jcr +gkg: nsz +gkz: rlf cbh vcr lzm +ktf: hbz ncs qnd knm dmm +lhl: mgc qnx +xjk: mqg hlh +fzv: dbk tdf +gxh: dns +kfh: dsb +xqg: flz +ztz: jfv thn +kpv: hgx tqt vhq pxx nmz +bbt: lgs jhh +xnj: dlr mbz +nzl: ggb lsx +zqz: psx +dlb: brz rgm +jjf: bzf qfh cdf xbt +pzr: nqq cqd sfk +nzf: mdv +kmn: fvk lbm +pnb: jcn +lkh: qkl gjp fkc txr +fft: bmt +tpn: vmk mjn qtv +hbb: chn +tbx: ckf rfq szr vmz +fqv: mbg ncs vjj cxm +dgb: qxj trf gxt nlm ntx +gmf: hkd rlc +hzh: scj bxz mrv xgf +zmm: rcl +hpt: ltt lft sjg qpl +czv: vms lqm zlb +fsk: nvc ztm rqp drl +rqq: fxc nxk vbs +ggb: fsq kcv +kjb: pkd +dfn: qnx gqf +htg: dzv sxx krm +ptt: zpp +sns: rmd vgf qbq +fcj: cxq +tkb: ldh pgx ccl +fml: rcz znp cqs +flg: pst glb nfs tvs jhm vck +jgk: bmt vdv mvr qxx dcv +bqv: chz gfh znd +zzh: ljs qsf +chp: jvj +hhg: cnh +dgl: rdc gzm xjh lrn +czf: dvz ntx +ncr: bbx +vhk: pvm mkm khg +pls: mcd knm +bmv: sbz gjp ncr +cxp: kzs lrn rdx pjg vgl fkl jpr ltx +scm: zbf vvr +rtz: jrr gdv +ndn: tgh +ccc: jtr +rmq: ldb dlb htj +dbp: qxt kxh +dmk: bbx hmj +fhq: hbx jvj mfh vnv +shg: btd +pdl: gzm +vfg: bbt +jjm: kxh xbl +znq: vcn cvc lgn +bcm: jsz rdg rlx +bdf: tqg xmc +vqz: chp vfq +jdl: rll xzz bkh kdl +ljf: kpd pfk scx kdk cxd +zqs: shg hxt vsc ctp +fks: svd vgn mrq +xgx: vvz +xxv: lzx +lbj: zbf +znd: tfv +npm: nxz qxx dxb +jqp: czv ngd pgx txv +cgf: frn rtz qgh rfk +rhq: jcr cdc +fhx: zpp tbx dbc +nnb: ldr +rpv: gxd dtd ctg sfh +fth: jzt rkn +qzx: pmv mtj pgl jzk +xhk: qtt qml vnm fqq dlm +hkx: jgl xqg nzn fpf +xbh: jcr brv zcm dvg +zpf: vzv mdn ksr fcj dlm +nxp: bhs zlj +ksb: fnx qnd +zhz: hxt rjz txq msz +gkx: pbp xtp lfx ptt +lgp: vfg mqg qnx ctn +hjh: sjs flz +hjx: pvm +glm: xgf pch gll pvx +lpz: gxf ptt kfz +fdr: qlp jtj llk ptv qff +tqp: jkt sfs +btx: cqp bpf kpv zkd +zrh: jsv nzf qvk jjz fpg +hms: xxm +vzg: cdc jnj +qkp: plf pbd cmr mhc +vtc: gkt zjl +psv: tdd fqq +kvn: jkm pgv +nbc: tfv rdk +cqd: dpb btc +jgl: rzb +lll: rcl +skf: xgf zpq +mcd: tqg lkm +kqh: bjh xbt hbz +ldn: zmm tsd ksj +jqq: xrv +qfh: qkb txv +mpt: fft hgq jjf ltl +cqk: nbj lgk chz rkz rtb +htj: jqs kzb +jlx: tgf ddb +prq: knm dzv rdc jsv +sgh: njr dzv cxx khs +plb: zjm jsl vfg zqg +rnj: hrj dng +dzb: zlb xqp qvk +txf: pgl +sxt: mdv qvk vbc +jqm: jcr lbl qjv +qcq: rst cdf msm vhd hzt +dnr: sgl qgr rdp snl grb pbd +hmx: bpv bjh mhc vtl +xdk: qnn mgg glk fjc mft +ldh: txr +chl: hhj pnb pzr bpx +ckf: qff kfh +cvk: cfk pjg fzf mfg +zln: zzh xxm +ggx: pbd rqp +vsr: bqx bhs +rjz: nrs cxz +zkd: grf gfc +bbx: qbc +rkp: vct +vtg: qsh +gzb: dct rmk xmp znq hkl +lzx: pdh +jzt: qds lnz +mcp: ckf xlc lrd hbc jkt +brl: qbc cfk +xmp: czk zvg +ddg: lhr +sbz: gpm +djv: tzx xbb kns fsp +qhb: xnx kxh vsc hxz +qff: cqs kmj qml +hck: zvg +kqd: bhs +lmv: zfm mlk zrg +dng: zgn +xdj: pvm csq jcn +xmm: qml vpn bkp gqk dns +ggg: cxq +mdr: qlp tcp +hkl: lhr ccv +mhf: vtg qvx dbk vsz bng +gpg: xrv jfq +mfl: psd mgg vvr gfx +csj: nqf svb jtr +hlh: txq +bjd: mtv fdr nmg xlx +fpk: pmh thn tnt +dqf: ltl cbg mfg chs +fzf: sjg czr +bmt: krm +brv: bbf +fsp: jvb svb +mfd: ltl pqx +fvz: dtd +chn: rzt +bqk: hxz lcd jrm brh +xkh: lql pxn mlk +ltx: qkl blv +mxc: ddg cjh ggd +hxm: mpt tcm rxh fmn +nbx: zsh jxf nxr rsd +dll: xzs qdm cpq vbc +rtb: qzq tqt bdg +trd: zsm +sfl: szh gdq +rjp: tcp svd +npk: bzh btc kjt hhj +jrg: ltt skf hbq nbt +txd: zfm rll rzt ccb +sqb: str +mbz: gxd +brk: qdr sck dqq +ptl: fzr +pdq: ljs zrg clk +bpf: sfs +xss: tch smk fjh pnj +gfl: fsn zcq jzr hxt +bqn: xbz jrr hbn hxz +fxd: rsq +tln: rjt vxd tkg qkx +pml: hrt dbk rmt vmb +rqv: zgb rxh +bht: xnj +jfk: brh +zcf: chn xkk flz +jsl: dcq msz gxh +vsh: mbg dqn ntc hzm lft +sms: bbx xbt +tpb: rgl rzm vcr sct +zqj: blv zlj vmq +lch: jnj mcd kzz +ctm: ggg fgk sns +sps: pdl mbg +zcj: qpv +lkm: vkf +mvr: dfv vsr zrb +thq: btk gbb fks bns +hrt: fcs fck zgf +pvr: rdk tpn qmk xlx +xxq: hld mpb +qmk: mpj +fdh: qlb pns vmq +xlc: gfc qpv qps +qmz: kkc ptx cdp vgh +jvn: nkr +vdv: thc fbm +jfj: vvz txq xnj czf +ztc: vxd kqd zrx rpn +sxx: ndm +hsc: ggb rzt hkl hgd +nmg: jqq rjp +jhh: zvt +gqk: rqq znp xrv +rdc: zmm +mxg: nqm +fxt: krm htj dgr +xvg: fgk fgn jzr hms +pxd: pzv xnh hbb +gbh: fsj +pns: nrg +qvd: rms tvs ksh rsm +xrk: pgl rkp clk tjm zsm +fnj: nkr lpr qxs jgl +rnk: qps +kqg: ptb +fpd: gvt rst nlk mnf gzp +tdf: vzg fsd +flx: rgm +jvr: mcl mbz +rgn: rzm cdp zzh sfx +dcj: zpq +mcl: glk bcx +qtf: rcl snh +grb: nff +bjh: fdq +dld: cfb pvt ptc +chz: thx jqq +djt: rzb svd lgk hrj bbt mdb +tzj: ldr nlk +hqx: jvb +qtd: pns pvx zks qjb +plk: pls txv pgb zlq +dcq: hvb xqv +mst: dcq cgq mnp hlh +fss: dvm +lts: smt ppl nnl lhl +fvc: nhf nnl ctm clk kmj pxd +dcv: bsr vjj jcr +jbb: rjz rnk njb +rnf: qml +blk: tbf sbn sqf kfh nzg rnj +pzv: kqg fnn +vlc: flx ltx qvk hmv +xqp: xmc +jhg: zps drq nxz +lkc: dvm zxh dqf thc +khg: gpm bzl +xpv: gls +nhh: lck +mbc: pld rpx tkt bxp gvv +bff: gvv xjm nqf btc +rnb: qft vlf cdc bzf +bpv: bdv mdx +kbt: mdn +tcm: snl +tfv: sjd +btc: ngf +ntm: dcj mfg +jdv: fsq xxm rdg pxn +fkt: cbn grh +zsh: sdj brx +fjc: nzl +shj: kzn gfh qnn +jtc: jfv +nsh: pzr nhh kpd xqp cvd +xvf: txm gxt +bxz: brx snm +pcb: qxt tdd +xjh: bqx +rdt: kcv frn zmv +dtq: qfb pkl chs nmf +nqf: zbk sfq +dkt: cjv qmk +nqq: hbs prc +rsd: klg kxm dmk +llk: lvp tbf tqp +rpx: svb +pxs: qxs vhp mrc lxg +hgn: xmc lzx rms +pst: vkf lqm +bxp: dxb +lss: tkb lqg dhg zpv +glb: vrx scc +chv: zsm +vcl: dtl jgv dmg nnz fdg +kfm: mjp vlg +fhn: hxs rdb ckb jqz +lsx: zcl +msm: bdv tch +qfs: fgn tbf gdv +hdg: mkj vkq pnb dld +fvd: xhp chz tvd htd +bcp: psh fcj brh +qvx: qpl zpq nxr +gsr: hgn gzp qvk lkl tlt +mxz: fmn mql vsb krt +rcz: vrg dcq +kdl: rfq tvd lgt +zrj: gdt kfz xcp mhx jfk +nms: lnv gkr jvb hbq +gns: snl vvc gzp mjp brx +zks: qkl +gmt: gqf +dhg: dpr +xvm: zzc +jlq: jrm +vjs: tpr cxn rdx lmh qdr bkj vhd rmq +gbb: tmm dbc +rxx: tlj gbh +kjp: zjl dpd brl +jgc: tzx pgx pdc +nxk: vzc xkk vmz +ktb: xbb ndj xvq dbz pzn +ctn: sxc jrm +lvv: rcl +qbl: grh zsm +cbh: gqz gsc +pvt: xnb bzh +cfv: rsq +qfg: xlf hbn nsz fbz +mlp: ggh xxq zbc dvt +qgg: btd rtr mtv +btd: gxd +dxs: lzx ftz njk mnf +lqg: ztm jxf +qtv: vcr +hvn: lsx jkm vvr nzd +xzs: mzz fxd plm +zzc: kqg fxl +tlk: jdq rhd jhv pbp +hld: ppx +gcf: pvx +szr: rdg mft +pdc: dsx krk snq qqf +rzm: mnc +mnp: jfv xqv +tdd: vvz +tpr: hld czv vzq +kml: nzd rhd +skn: xvf tqp sss +tlv: nxq +cvg: ksq zls lfx rft +lxh: ntv mkr jhv hgd +jxr: svd czk nzn mlk htd +pxx: cfm szt jhh +njj: dcj kqh vzq +hlr: pqx +jrm: fdb +sct: clk zmv pqp +cnd: xlx tgh +rsl: fsn +fpf: zkp +sbq: hmj hhz grd rgm +vgs: fsj zxh rpn kfm +qns: mpb +cmj: jnc +nbh: fsq +kzc: gxh lfc tfc +rsm: kcx jtv +ccv: dbc +bhq: fbz pmv szt +shz: kkc zqs svn btd +zpk: rft vfq tgf +jpf: ptv +tpt: lnv cfb nxp krm +dfh: dpd trg vrx xjr +jbm: xtf cdf zrx xsv +vxj: htc bzx qsh +nvk: tgf hbx dks shg gcq +rjq: rhc jqm cnq +bgh: pvx str +ght: lcd gqg tqk rcc +hhx: txf +psg: gkx cqs flz +hbc: jtc qnc +nvx: svt rtk qnr nqb +qbv: zps pgb +xms: cbn zpj +kdj: rtb qbq tlv +vsd: mfd pvt dhg +xcf: drq +qqb: pqm thc jtr crq +cxn: jjd svb fcm +lql: svn pbf mft mdr +zlx: pld cng dbh tsc scc +jck: mmh +sdg: xmr ppx +cqp: rnf nnl cbn +gtz: mxg ccl xpk qdh zcx +zpp: sjd +dfz: fxn cgq tdl mdn hfp +hzm: ltl +zrs: pgb +xrm: mql dzt hbq +hbx: tqp +kxq: rmd rmk rgl +tqg: hbz +vjj: bqm +lcd: dmn +hvl: gxl zrg xpv gfx spt +vrh: qtf zks zsd vkn +rbv: kzb gsf +zbk: rdc +ldb: fkc +vqq: gnv zmm lkm +mkj: sjg +dbz: gtf pnq +jsp: sxg hzm zkt bpx jpj +snq: rms cxm +ndc: vmk znd zln rdk +xkq: jkt vsc fdb +tph: psg ddg czm lgn +sxh: bzx pcf +rmt: mql qtf ldb cqd +qrk: bth hmv csq bxp rqp +nph: nld +pnn: znr zvt lxh tlk zmv +gpt: lgs znp hlh mrq +xqz: nqt clp tcm +gfh: sxp jfq +xpf: ctg kfh fvz dkd +vzt: tcm hbq lck tzz +mrq: xqv +cxd: cmj xxq xxv +dvt: ctv +mrv: htc lcl sps sck krt +crs: dfl mlf xgx +xbl: frh fgq rft +xzk: rbv qcp +dbk: gpm cbg +kfl: zlj gnv +ngk: sck sqb scx zcx +xvq: qkx drq lqm +nlf: jnj +fgn: xnx +ktr: qnc hjh fxl +xmh: zcx ptr fjx mtl +rkk: crj lft fjx hgq zqj +pzn: zpq sfl bzh mjs +hxs: frn +vvl: hxt hms hxs mnc +mlf: frh +qcm: kpp dqn +bkh: qmf +thx: mfh gsc +zvm: xhk kmj zqb +clc: njj tgd mdv dcj +xmg: csj xrq xcg bnb +tvq: cgq cfm +rln: ggh ksh hjx brk plf lrn +tkg: kpp zks +vqh: xjh nqb qbv vlg +bdg: fnn +mdb: jqq pql vnk +cdp: rcb gfx +xgh: sbd jfq +bpj: plf kxm rhc sms +kls: jlx sqf fxc zln +clk: chv +nmz: dvz pgv +jpr: nbt +mpf: nth ccv htl scm +pct: qjp fjh rqv vrh bzf xdv +rfq: cmp +kns: nqm +pgx: tgp grb +gzp: qjp +nxq: vcn +gzh: tzg tlv +hbd: csq zpt sxg bgh +fds: xrb zjb vcn gqz +fbm: ppn fxd +zpc: zkt zbc ncs kmn +jxq: dlb rjq ccc jtr +jjd: nff tsc qkz sfk +str: sjg +zlb: mql hqf jpj +gbm: hhs vpn gzg ddb psv xvm zcj +vmk: ndn jcp jlg bns +hgx: qtv fgq zqz cfm +dmg: vhp jtj +lrd: svn nbj +bng: qsh +kcx: lll ndm +hsp: mmh +xcp: hcs bhq qhx +dkq: fzv cnq npm fjh knp +nmt: kdc qcm +dlg: qds fqz gvn vld +mnc: vnm +rvt: jcn trc jsv bdf +xcq: dks rsl kzn gvn +zmx: lst ckf czf +hfq: zmx qfs mgc sqs +gcc: tqk lks rkp +nnp: drl pvm +mbg: drl +cqb: pnr +rpr: rhc hgn fck zrs +ppl: njb bht tvq +pnp: tsc rxd zgb szh +bfg: sjs +ntc: tzx dxb +xpk: ccc gcf rtk +rgl: sxp hjh frh sss mnp +tdl: jck +vkt: fxm hjx vdv hlr pls qcp +tkh: kjb nqt tsc rvx +hrl: rtr sfx vpq tdd jvn +nmf: ztm ndj +zxh: pdh xcg +zjm: cpv cxz +dmm: rtk +mrk: xdj pdh bdf sdg +rdb: zcj kxg +smk: hqx mpb +zbc: gjp nlf +plf: dxb +gll: mpb xcg +dmd: ckf vnv gcd nkr +nxr: mxg rvx +tch: frx +fbb: fsp qcz sbz tsm hmj +ztm: cdf vbc drx +bpn: rcb rdb ckf +dpp: qcz trc vtc +gdt: qml ggb +vmb: xjh dzt lvv lqg bbf +nsb: svt zxh ngf +jfm: ptm nrm rmk +jdm: lhr bpg mbh chn mtv +gcd: bqr lgz +jhv: drn tqt +srd: kqg rzm fxc +trc: txr str +sgr: khs scc dkq kng +gqg: hrj djr dks +slr: qjb sgv tkg +ddv: smc ntm cpq xqz +bmx: lck gcf qpl +zrg: rnk +rdm: bfg fnn ctk vfq +hzt: qcz vkn +lfc: grx +nfs: jpr vmb +fjh: ntm +zpr: hrn cnq mlc rhq +hrn: pkl vgl +msj: qdr nsb qnr hxc jxf njz +dmr: pkl kzb +njr: dfv pnq +bjk: lvv dbz hrt rjt +qqm: vkf ggh glb nff +nzg: vpq zls +gxf: cgq +bpx: jcs bbx +dtm: fds htd flz xbz +mld: fsq +pbd: jjz +ptm: vrg sbn jdq kjc +jqz: dkt sdf bcm sfx jvr +fbz: ssl xlh +vkb: vpn hkl qtt vpq +khb: mrr vcn tdj gxb +drn: bns +jjv: jtc ptb gxt shj +qxs: rcb +qvl: txf ckt nkr htl vqz +pcp: rgj lgt frn jbr +jcp: hpm fxn nlq +trf: vpt +dms: kfz fdb +jzb: pgv cnh +pgb: scx qxx +rdx: bmt dgr +xsv: xqr srg pct +pbh: vdx scj sfk rdc +dct: kns pmh jck +klf: gfx +glp: dsg qxj xcq +nld: rxd +shc: qmk +zpq: tqg +qhm: smc xqp cxd rsq sfq +ctk: rzb cqs jfv +lhz: lmv ptv +dcs: gzh qgg gpg fpf lxg bkh +ptv: ptb +gzg: mdr +sbg: ccv jgv +tvd: dvz +qdh: thc chs +fgb: dmk rvr qfh tzs +vrx: ptc +fxn: ptl fxl +ksj: pdv gtf +lcq: jgv sxm zgv +njz: mhl gcf jtv +crc: nbh mqg +nff: tzx +kxg: ndq dkj llk +hbn: qgh nhf +gxt: mdn +qbb: fqz zcj fvz dmn +bsp: lzm rnf cfm +pkd: hhj xzj bjh +qmb: kdl shc cvv fgn +kmq: nmt hft bqm qcz +xkf: nxq fjc qpm ckt +zcq: jlq mcl +hzj: zjm qpc crc nzl +lnv: vkn +kpd: htj xnb +zcz: fsd bqm nbg tln +lmh: pkl +ntv: kjc hbx jgl +szt: kcv bcx znd rdg +zrt: tsd hlr nlk nnp nph +cnq: tkt +bgm: kpp mdv fsp +bfm: rms +mhc: bzx +zxg: qpm xvm zvg nlm +bpg: xgh mdr +cqr: jsv bqm +hfp: jfq sxm +gfc: sxp +vss: mld tlv nzd mlf nlm fml +lzv: xlh vct ltb +kch: fxn rjz dkd lvp pxv +cmr: jnj dqp hcx srg +ktc: ths rsq kjb zpt +hhk: dbp dsg tzg njb +trg: vbc jtr xzj +hcs: zth cnd +nnz: hck dmp bpf djx +scc: lck +lvc: zzc blk psv mhx +xbz: qtv lzv +bqq: tqg qkz kdc +ngd: hqx +grd: fkc vhk hgq +jcs: zrs qft vxj +sbd: hpg +qjb: crq kfl +szh: hkd +frn: zkd hsp dbc +gvn: zzh sxp +mjs: fdq lnv +xxz: cgq mgg jpg shc rfq +mkm: ggx +jqr: sjm fsn hms zqz vrg +jpg: mlf +ksq: ktr ssl blk lpm gls +xrb: nzl tcp mzr +xtp: mrc hhk +qft: xjm frx +cfk: dzt bbf +lbn: vkb gbb +htq: ggg bpg kzg nzg +vhq: sxc +bsz: rcn pdl glm grd +qjq: kxq nvk tmm jfj +ftd: kkv gcd mdr mjz +rbg: pql hvb zkp jgl +phj: fxd gmf qdh ldn +rjh: fft sxt kdr nbg +drk: cnh +xhp: bsp qct zhj +xlf: lhz nmg +dbf: gpm vtc nzf hqf +snh: drl cjm fxm xmc +lsp: qnn +ppn: zlj xcf +xcd: dmn xbc vhq sqs czm +lbm: gkt pkl +qbt: sbd jtj vzc +cst: hxs fgh jxr lbn +llz: lbj psd zfm xqg fbq +nvh: dns tfv txx +zjn: rdx ldh bkj qkz nvc +pnj: nlf vdv lch +zvq: rgm msm tlj sps +pfk: tcm rsm pls +fnv: fxl xlx tfv +qdb: rnb vbx flx qjv +nln: jvr dng txb ksv +vvh: vzg hzm zrx ptr +rmd: lvf chv jvn +pbg: dfn gfc gdv +vbb: vlf ptc qnr bmg fpg +hbs: gsf lxr qjp +tsm: qbc +txb: jbb dtl hhg qbq +mvd: rqv mjp vvh bqx +xzz: zkp trd +jxb: pns ksq hhj jqm sck snl +tlj: nlf zpv +mhm: vfg tzg qpc gxd +xbr: txx mrq tqp ksq +zpt: fbm pjg mkj nmt fsd +ksz: nbh jvj drk vrd +zhj: mdn mjn pnr +hjp: bhs dqn rxh qbv drx +qdm: kqq nhh vzt +ssk: xzz xms lvf lsz +fxc: cnh +cpq: mjs kcx +lgz: gcq pbp +xkk: mmh +kdc: zbk lll +dkg: dtc xvv +fqz: srd lgz grx jjm +rjt: vkf +mtj: mmp pmh btd +xmr: qqf bxp czr +lvf: fxn +rzt: vzc +tfc: qhx lqk +hpm: lgk rtb vvr +zmv: rkz +gdl: jrr gcq gcc +bmg: nqm rbv +klg: dmm +shs: chs xjr qsd rsm +jsz: ckf czk tqt htl +jvd: qsf zhz +vll: rjp gvn jfq cjv +vhp: gkg dks +znr: ptl mzv mbz +tdj: lhr fcj xvm xqv +bzh: ksb +fbg: dmr ccc +qfb: gnv zbc xqr +xbb: kzs +ckn: ggg mcl sjs qbt gdl +sck: hjx +tsc: sfq +qpc: lvp +lfd: sgb xnx xms jpg bcp +lgt: bbt vbs txf +mrc: sxm lsp +dsg: nxl jlg mlk fsn +dkd: lsx ptb +qpl: fck +jrr: dsb +pzt: lbm tkt jjd qbc +bnj: hbz bng +sxg: sqb sfq +fpg: lxr +tzz: qkl qdr +xrq: scc kdk mhl fvg +bth: fdq dpr +fsn: trf kkc +fxx: xpv lxg smt +mkr: lqk tnt +rpt: kxh gqf kbt +mpj: lbj +qtt: zth mdr +zvz: bff dqq cnq csq +qkx: pnb hgn fcm +htd: zgn +ldf: lll bpv bsr knr vlf +pzg: kkb ggb rnf +vld: psx frl +nzn: tdd thx +fhm: kns xxq fsj txv +pxg: svt vms dmm lmh +qlb: pch zsh fkl qnd +nlm: nzd +hgq: hbs +nbg: bzx +sjm: dkg nvk xnx +fcm: knr htc hqf +qlz: kmn nqt zlb sgl +nrm: jlq ptx fkt +hdj: mft xlh rsl +vzv: gqz mnc zhz pzg +vlg: zpq jqs +vfq: jdq +vkd: krt qkb hbs bpv +jzr: qpc dvz +vgn: txm jlx hvb mcl +zqb: cpv ptx tzg +sgb: qbl txf ndn +qfj: rst qsh bfm fss nfs +lzp: rtr gdt fgh vhs +mjz: lfx htl fpf +klq: tbf fqq ndn xgq +nzb: ndq hhx gcc svd zpj +xzj: tfb +pch: nxz qvx fzf +xdv: kjp rnb qxx +zlq: nrg zbk nnb +rvr: sxx hss ccl +cpk: dkg djx fxx +cmp: skn nth +bmn: hkd tvs xcf pdl +gzm: cdc +qbq: jsl +mdg: zvt rdk mbh +psd: drn +hhh: vnk jjm fhx ptv xcp jzb dtm ztz tgh +gxl: sqf kzn +pbc: fgk qsf sjs vvz +fdx: jcs dpr xcf +dzl: nbc dfb dtd ljs xrb +cxq: glk brh +lft: mbg +bnn: rdt vld qzx jqq +dfl: hsp frl +nxz: czr +ggd: jfq fgq +krt: zbc +scj: rgm lnn +knm: pdv +ksv: vnv xvf tvq +vhs: bns fxl sbd +fvg: dzv +cjm: khg ctv +gdd: sfs txm jnv +gff: xgx lst hhg xlx hfp +gvt: vsd hcx zgx +xdc: cnd tcp ccv +lgs: zgn gkg +snn: lhl qxs mfh nbc +ckb: mzr pdq mpj +zmr: fkt xrv mrr +hhj: ngd +hxz: tfv +mmr: mtj pzv tgh vrg +qpm: rhd hbc vqm gvk +ckt: njb dfl +mhx: gvk mld ctg fzr +hjm: fbg ndm mfd jsv +sdf: gxf lsp tfv +rkn: jzk zcl brh +lbl: pkl +lhv: qbc fjx jcr vkf +tsp: xlf vhq spt pdq nbh +zls: jfv +qvv: qbv bdv plm mfg +zpv: csq qxx +qsd: nph hld bdf +fgt: xzk qpl xzj zgx +qxf: zvm fpk fdl +jtj: nsz +kpj: ncr njk cfk +smp: bfg scm dms ctk gxl sbg +fdg: kmj xbz rzb +tmb: kzz nld ksj zjl +pks: fzv sxq ngf dpp +lgn: shc kkc +vpt: txm rtr +dqp: lck bzx +qbh: lfc gzh pcb +kjr: bpf chp jlg xnh +xbc: hdj vcr xdc +kng: brz tfb +pbp: qhx +xjm: str +ckp: pdv bqq cng xrm +sgl: nnb +vql: jvd psx xcq qnx +fnn: kbt +cvc: bcx xvv ctn rjp zpk +mbh: skp dlr +ccb: pzv dsb shg +vgf: gsc ddb zkp hpm ptl +jpp: rcz lnz chp +hgd: czf zzc rkp +lks: grx dtl xnj +klv: vnv kdj qrx nxq flz +gkv: htc kqd xgf +jnv: xkq bht mgc +kcv: vqm +txs: vvr rnj pxv jvd +hkd: gkt +btk: vct zqz spt +rvn: xhm kvn tcp rll +qcp: fkl +qnx: nsz +vck: ndj nnb nzf knr +dtc: zfm drk vpt +bnb: sfq bxz gvv +rsp: nhh htg lmh kpj fdh jnc lqb +sfx: gdd ktr +ctp: zqz pgl sbn +cvv: vnm gsc znp +mjp: vlf +jrp: jgv grh qps tfc +tvs: kpp +fcs: dzb kfl gtf xtf +gqz: mqg +zgv: lsp jpf +ktm: sbz mkj dpb mnf xjm +lkl: vzg sxh vhk +lbv: bcx tdl skp +zrb: dpr jhm +jxf: gtf +blv: dgr +hcx: kzz +zsd: bdv dbh fss +hmv: xbt gpm +cxz: jhh +dfv: cfk xxv +gdq: nxp ptc +vtd: kfz zcf kbt +dmp: gmt +flp: hvb kml thn +dqq: vkq fnx dqn +ltt: mcd dgr +bpd: dfl hpr ggb xnh +rcc: jpp sfs lxg xkh +hpf: mpj jrr gcd mgc hbb +fnx: kpp +rlf: pbf zzc zls +tlt: qxx qkz tzs +sqs: xjk +vmf: rnk frh rtr +pxv: jlg +znp: vqm +crh: bpg rxt nrs smt +xch: qjb qqf prc +mtl: bnj rcq xch +kcz: sxx jnc brl kns +kvd: qqf vxd rzr +xjr: kjt +ths: dvg hrn hmj +rfh: fdx nqt qnr fbg +tmm: vqm jfk sxc pgl +knp: rgm gpm +txx: lst +pqh: gzg xbl sqf +vzc: lfx +kkv: jtc plb +gpf: sxg sfq rcn +ftz: bzl jtr +kdk: bqm njr +hrj: jdq +ngf: bjf +rmk: fnn zcf +tdc: qzx czk grh hqc lcq lbn mxc +vbx: jhg zrs vsz ggh +gvk: glk sss lqk rgj tlv +vmz: gdv dmn xkk +cjv: ctg vtd vld zqb +zps: sgv rcq +zdh: kjt kdk lvv +rlx: lfc nbj rzm +bqr: gqf qxj jlq grf +qcs: zqg btk grf mmp +tgd: lqm gsf kjb +hss: rzr gtf mdz +qlp: zvg +zgf: zrb sfk sfl dvm bgm +bsr: kng sdj +hmj: qns +dsm: cxz gcq +rcr: ldn xjr zkt skf +ldr: fmn lkm mdx +tkt: nph +vsb: mnf ftr dhc ggx +dzs: bbf jjz nmf bjf +mzz: nqm nnp +dtd: jck gls +mdx: hqx rqp +ssl: sjd lfc nmz +lgb: pcf vtc mhc hld +fxm: nld fck xxv +qkt: xmp smt ndn hrj +ltb: vpt klf +rdp: tzj sxh ncs dbz +xgf: knr +rdk: nlq +vzp: fnx gpf nbg jpr +pqp: zkp mzr +xzf: hpr lsz rtz cpk kjc nnl psd rdg +brx: pjg +kqs: qgh trd +xnb: jcn qcp +skp: dms +nrs: trf xvv +smc: jsv +rvx: plm vhd gnv +djr: msz dms qxt +rbm: lhz grx chp +lsz: dmp ltc +cjh: hpg bqv rdg +qmf: zgn pnr lvp +xgj: zjz nlf szh hfm hkd +cbg: fkl kqh +xtf: krm ncr +jkt: jfv +mhl: qvx bmg vkn +rll: fdb +qpv: kbt xkk +tjq: nlm vgh dmg +ndq: pgv +hxc: clp tzx jvb +hhs: ztz klq jpf +dhc: lqb kqd crq +jbr: ksz qmf mtj +zgx: rxx jjz sqb +vzq: rhc sdj +svb: gzm +fgk: gcd lnz +stq: flp cqb fnv hhg +vdh: xjk rcb klf +vnc: rgj vsc gmt +ckh: nth nsz jxk sss jzb +vtl: kfm vms nrg +dxp: mdg xgh mfh spt +pjc: vmf gkx hcs xjk +lpm: dlm ptx mrr jpg +vgh: cbh jfv ndq +hhz: btc vlf xzj lbl +svt: mpb +mmh: gls +jkm: vpq nbh +dvj: fjc svn qbh jlx +rpn: jsv rcq grb +ltc: mdg zpp gxh +hrq: flx xcg zkt ldn +qqf: clp bzl +rxd: fdq +fgh: sjd rkz zth +tgp: kqd +vmq: gbh vsz dvt lnv +pmc: cfv gkv chs fmn +hft: dhg zcx dvt +ksh: bqm smk vqh bmx +blr: scc cfv qdr +rcq: tch +lnn: qns fss +zvl: xmp dbp hfp +lpr: dms gmt klf From fb13cf95c3853e91c95943393bbe423c21fd5d3a Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 25 Dec 2023 17:20:26 +0100 Subject: [PATCH 475/479] 2023: d25: ex1: add solution --- 2023/d25/ex1/ex1.py | 125 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100755 2023/d25/ex1/ex1.py diff --git a/2023/d25/ex1/ex1.py b/2023/d25/ex1/ex1.py new file mode 100755 index 0000000..8b35f11 --- /dev/null +++ b/2023/d25/ex1/ex1.py @@ -0,0 +1,125 @@ +#!/usr/bin/env python + +import copy +import random +import sys +from collections import Counter, defaultdict +from typing import cast + +Graph = dict[str, Counter[str]] + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> Graph: + res: Graph = defaultdict(Counter) + + for line in input: + node, destinations = line.split(": ") + for dest in destinations.split(): + res[node][dest] = 1 + res[dest][node] = 1 + + return res + + def contract_edge(graph: Graph, s: str, t: str) -> None: + assert s != t # Sanity check + assert s in graph # Sanity check + assert t in graph # Sanity check + + # Merge the edges + graph[s] += graph[t] + # Don't count the potential t-s edge + del graph[s][s] + # Remove t from the graph + for other in graph[t].keys(): + del graph[other][t] + del graph[t] + # Update the neighbours values + for other, v in graph[s].items(): + graph[other][s] = v + + # Stoer-Wagner algorithm + def min_cut_exact(graph: Graph) -> tuple[set[str], set[str]]: + def phase(graph: Graph) -> tuple[str, str, int]: + assert len(graph) >= 2 # Sanity check + + candidates = set(graph.keys()) + start = candidates.pop() + found = [start] + cut_weight: list[int] = [] + + while candidates: + (weight, node) = max( + (sum(graph[node][other] for other in found), node) + for node in candidates + ) + candidates.discard(node) + found.append(node) + cut_weight.append(weight) + + return found[-2], found[-1], cut_weight[-1] + + partition: set[str] = set() + g = copy.deepcopy(graph) + + # Initialize our best weight/parition + best_weight = cast(int, float("inf")) + best_partition = set(partition) + + while len(g) > 1: + s, t, w = phase(g) + partition.add(t) + contract_edge(g, s, t) + if w < best_weight: + best_weight = w + best_partition = set(partition) + + return best_partition, graph.keys() - best_partition + + def min_cut_karger(graph: Graph, target: int) -> tuple[set[str], set[str]]: + assert len(graph) >= 2 # Sanity check + + original_edges = [ + (source, dest) + for source, destinations in graph.items() + for dest in destinations + if source < dest + ] + + while True: + g = copy.deepcopy(graph) + contracted = {v: v for v in graph} + while len(g) > 2: + s, t = (contracted[v] for v in random.choice(original_edges)) + if s == t: + continue + contract_edge(g, s, t) + # Hacky union-find-ish algorithm, for laziness + for k, v in contracted.items(): + if v != t: + continue + contracted[k] = s + # Pick a partition at random here + node = next(iter(g)) + # Check that we met our target + if g[node].total() > target: + continue + partition = {n for n, parent in contracted.items() if parent == node} + return partition, graph.keys() - partition + + graph = parse(input) + # The exact algorithm is very slow on big graphs, at which point Karger's algorithm is better + if len(graph) < 100: + left, right = min_cut_exact(graph) + else: + left, right = min_cut_karger(graph, 3) + return len(left) * len(right) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() From c02a05a0ff909b30be29dd194ec442db87323df5 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 25 Dec 2023 17:20:34 +0100 Subject: [PATCH 476/479] 2023: d25: ex2: add input --- 2023/d25/ex2/input | 1262 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1262 insertions(+) create mode 100644 2023/d25/ex2/input diff --git a/2023/d25/ex2/input b/2023/d25/ex2/input new file mode 100644 index 0000000..4b678e2 --- /dev/null +++ b/2023/d25/ex2/input @@ -0,0 +1,1262 @@ +pcf: vqq glr rpx qcm +qkb: ccc lxr ppx +vnm: frl +scx: czr +zqg: lbj xkk +qvs: zgv vfq pqp qbl rpt zcq +sxm: rgj +vrd: hbb trd fgh +dbh: crj hjx bkj +psx: sxc +dsx: bjf zrx pld +dqn: kxm +lst: fzr +mzv: gcq bkh mqg +lzm: fdl jpf qxt +xfs: zdh thc rxd cjm +lqk: zth +mbn: skp pxv zgv bpn +kzg: mgc vnc zdt +rdl: pql ptt jfm hsp zvl hhx +nbj: tqk qhx +rzr: cfk pdh +bdm: ppx jcr tgp mhl +glr: bzl snq drq prc +qds: glk jvn ntx +kqq: ftz blr hlr kvd +fsd: hbs +czr: rms +sgv: kzb tvs qxx +mdz: rtk txr cqr +nvc: vsr kzb +bkp: msz vpn fzr +fbq: txq sbn +xgq: dng xlh cqb +qsq: vvr vqz xpv nlm +dhk: bqm fvg cjm +khs: dqq tfb +blm: lqb rcq dmr knp +vfb: tjm ltb lcd vss xvg +psn: hrb hzt dhk hdg +dtl: jgv +tgf: rnk +jlj: rhq vmq scj fsp klg +nbt: khg dvg plf +cng: gsf +mrr: bht +pbf: pxl zbf +zpm: tfc jrm jfl crs hsp +sfh: pmh jfl nhf vct +fdl: jtj +qtl: kvn glk cjv lrd +pmv: mpj mmp +qfv: nph klg kxm cmj vxd pqx +mjn: jfk pql +prc: nzf rjt +qnc: kbt nth +cml: gzg lpz pxs tvd lvf +nxl: mgg tnt msz +rqp: bkj nbg +cfb: slr bmv mnf tgp bfm +sff: flz nlq jtc rkz +jzk: txm +tnt: szr ljs +jhm: sms gll +tjm: vvz qsf +psh: qsf +ftf: rkn rcz ddg hbx +jfl: rll +pxp: dtc nqq cqb sjd bdg +hfm: xzs krk jpj hbs fvg +fvk: gnv bjh +rxt: dlr sbg +qhk: dqp tzz smc rxh +tbf: tdl +vms: sgl +mps: fth kqs pnr fbq +srg: ndj gdq +vzk: ggd dms vdh zdt +dkj: drk zmv kkb sjs +hzg: drn cmp gxf mkr +pqm: gmf krk vvc ldb +dpb: sdj bgh plm +pnq: fxt mxg +mlc: brv hld mzz +cxx: vrx zcx xxv +crj: lxr vgl +stj: tsm xxv jpj ccl +zcl: fvz ntx +dpd: brv sms frx +snm: lnn bqx nqm kdr +vdx: fbm cqr fpg pdh +qjv: vhd vms +xhm: lhz kkv lcq +zgk: fkc vmb vjj vtg jqs +ftr: crq ntc bsr +rst: cxm +xxm: mld +qxj: nhf dns +lhr: znp +tfx: lgs skp fdl dsb +mzr: qps +kjt: kzb xbb +tzs: cfk sdg +xqr: lbl pdv +bjf: vsz lft +xnh: tfv lnz +tqk: kzn +tht: dld kqh cng rlc +tsd: kng ndm +thn: gkg +xth: bns zgv fth bfg kzc +fjx: kxm +smx: tjq pmv nbj hdj +zdt: xtp zkp hpf +zcm: njk vtl fvk +jbj: nrg bng jqs vgl +czm: fdr zbf dkt +rfk: rbm grf zqb +pxn: cjv jfl +zxp: dvt qvk cfv pst +lrc: dpp jcr ldh bth +djx: hpg dlm +gvv: rlc ppn gjp mdv +ddb: xgx rft +qrx: ckt bdg mmh +jxk: psh dbp cbn dvz +bxk: mrq jzk cpv pqh +vvc: nqm ngd gzm +drd: tzj jgc nzf rxx +cdn: jhh pxl xdc lgk +zjz: ldr cfb bfm +kkb: qnn dmp +ctv: tfb gbh +cvd: rhq rcn hcx +gxb: dfn vzc +jtv: jjz bqm +dfb: fqz zmr pnr nlq +ptr: dfv lqm +dvg: clp +qgz: qzq tlk jzt kqg +qct: lbv gxh vdh +hpg: hck +dlr: jvj +jgv: mmh +mmp: hck +krk: lqb +ksr: ggd fzr dsm +ncb: rxt kqs hhx mnp +zcx: knr mkm +zfr: gxb dsm xqg +hpr: txx gpg +bzf: dvm +qjp: qsh +qgh: sjd cpv chv pxl +vnk: pxl sqs glp +gkr: vtg bnj bng tdf +sxq: ltl ksb plm +lcl: njk zjl tsm +vkq: xzj dvm +brz: drl str +nlk: jnc +zpj: rjz psh zvt +vct: frl pql +tfp: zsm rsl jtc smt +drx: xzk dzt +hrb: kzs clp +vbs: pbf zzh qlp +hqc: crc pcb kml +qld: hqf cxm rlc vkd +zjb: mft mnc xpv kjc +plv: zfr fqq fgq xkh +brr: fbb mdz dpd hrb +qzq: rhd zgn +zgb: fft ksj jcn +qgr: cmj bsr trc +kdr: qns fsj rpx frx +nqk: mtv zpj pbg nvh xvv +kzz: blv gzm +pld: pqx rcn +pvm: qnd +sfq: gkt +nqb: mkm kzs +dpl: qxf jvn fbq qxj +lrn: jcr +gkg: nsz +gkz: rlf cbh vcr lzm +ktf: hbz ncs qnd knm dmm +lhl: mgc qnx +xjk: mqg hlh +fzv: dbk tdf +gxh: dns +kfh: dsb +xqg: flz +ztz: jfv thn +kpv: hgx tqt vhq pxx nmz +bbt: lgs jhh +xnj: dlr mbz +nzl: ggb lsx +zqz: psx +dlb: brz rgm +jjf: bzf qfh cdf xbt +pzr: nqq cqd sfk +nzf: mdv +kmn: fvk lbm +pnb: jcn +lkh: qkl gjp fkc txr +fft: bmt +tpn: vmk mjn qtv +hbb: chn +tbx: ckf rfq szr vmz +fqv: mbg ncs vjj cxm +dgb: qxj trf gxt nlm ntx +gmf: hkd rlc +hzh: scj bxz mrv xgf +zmm: rcl +hpt: ltt lft sjg qpl +czv: vms lqm zlb +fsk: nvc ztm rqp drl +rqq: fxc nxk vbs +ggb: fsq kcv +kjb: pkd +dfn: qnx gqf +htg: dzv sxx krm +ptt: zpp +sns: rmd vgf qbq +fcj: cxq +tkb: ldh pgx ccl +fml: rcz znp cqs +flg: pst glb nfs tvs jhm vck +jgk: bmt vdv mvr qxx dcv +bqv: chz gfh znd +zzh: ljs qsf +chp: jvj +hhg: cnh +dgl: rdc gzm xjh lrn +czf: dvz ntx +ncr: bbx +vhk: pvm mkm khg +pls: mcd knm +bmv: sbz gjp ncr +cxp: kzs lrn rdx pjg vgl fkl jpr ltx +scm: zbf vvr +rtz: jrr gdv +ndn: tgh +ccc: jtr +rmq: ldb dlb htj +dbp: qxt kxh +dmk: bbx hmj +fhq: hbx jvj mfh vnv +shg: btd +pdl: gzm +vfg: bbt +jjm: kxh xbl +znq: vcn cvc lgn +bcm: jsz rdg rlx +bdf: tqg xmc +vqz: chp vfq +jdl: rll xzz bkh kdl +ljf: kpd pfk scx kdk cxd +zqs: shg hxt vsc ctp +fks: svd vgn mrq +xgx: vvz +xxv: lzx +lbj: zbf +znd: tfv +npm: nxz qxx dxb +jqp: czv ngd pgx txv +cgf: frn rtz qgh rfk +rhq: jcr cdc +fhx: zpp tbx dbc +nnb: ldr +rpv: gxd dtd ctg sfh +fth: jzt rkn +qzx: pmv mtj pgl jzk +xhk: qtt qml vnm fqq dlm +hkx: jgl xqg nzn fpf +xbh: jcr brv zcm dvg +zpf: vzv mdn ksr fcj dlm +nxp: bhs zlj +ksb: fnx qnd +zhz: hxt rjz txq msz +gkx: pbp xtp lfx ptt +lgp: vfg mqg qnx ctn +hjh: sjs flz +hjx: pvm +glm: xgf pch gll pvx +lpz: gxf ptt kfz +fdr: qlp jtj llk ptv qff +tqp: jkt sfs +btx: cqp bpf kpv zkd +zrh: jsv nzf qvk jjz fpg +hms: xxm +vzg: cdc jnj +qkp: plf pbd cmr mhc +vtc: gkt zjl +psv: tdd fqq +kvn: jkm pgv +nbc: tfv rdk +cqd: dpb btc +jgl: rzb +lll: rcl +skf: xgf zpq +mcd: tqg lkm +kqh: bjh xbt hbz +ldn: zmm tsd ksj +jqq: xrv +qfh: qkb txv +mpt: fft hgq jjf ltl +cqk: nbj lgk chz rkz rtb +htj: jqs kzb +jlx: tgf ddb +prq: knm dzv rdc jsv +sgh: njr dzv cxx khs +plb: zjm jsl vfg zqg +rnj: hrj dng +dzb: zlb xqp qvk +txf: pgl +sxt: mdv qvk vbc +jqm: jcr lbl qjv +qcq: rst cdf msm vhd hzt +dnr: sgl qgr rdp snl grb pbd +hmx: bpv bjh mhc vtl +xdk: qnn mgg glk fjc mft +ldh: txr +chl: hhj pnb pzr bpx +ckf: qff kfh +cvk: cfk pjg fzf mfg +zln: zzh xxm +ggx: pbd rqp +vsr: bqx bhs +rjz: nrs cxz +zkd: grf gfc +bbx: qbc +rkp: vct +vtg: qsh +gzb: dct rmk xmp znq hkl +lzx: pdh +jzt: qds lnz +mcp: ckf xlc lrd hbc jkt +brl: qbc cfk +xmp: czk zvg +ddg: lhr +sbz: gpm +djv: tzx xbb kns fsp +qhb: xnx kxh vsc hxz +qff: cqs kmj qml +hck: zvg +kqd: bhs +lmv: zfm mlk zrg +dng: zgn +xdj: pvm csq jcn +xmm: qml vpn bkp gqk dns +ggg: cxq +mdr: qlp tcp +hkl: lhr ccv +mhf: vtg qvx dbk vsz bng +gpg: xrv jfq +mfl: psd mgg vvr gfx +csj: nqf svb jtr +hlh: txq +bjd: mtv fdr nmg xlx +fpk: pmh thn tnt +dqf: ltl cbg mfg chs +fzf: sjg czr +bmt: krm +brv: bbf +fsp: jvb svb +mfd: ltl pqx +fvz: dtd +chn: rzt +bqk: hxz lcd jrm brh +xkh: lql pxn mlk +ltx: qkl blv +mxc: ddg cjh ggd +hxm: mpt tcm rxh fmn +nbx: zsh jxf nxr rsd +dll: xzs qdm cpq vbc +rtb: qzq tqt bdg +trd: zsm +sfl: szh gdq +rjp: tcp svd +npk: bzh btc kjt hhj +jrg: ltt skf hbq nbt +txd: zfm rll rzt ccb +sqb: str +mbz: gxd +brk: qdr sck dqq +ptl: fzr +pdq: ljs zrg clk +bpf: sfs +xss: tch smk fjh pnj +gfl: fsn zcq jzr hxt +bqn: xbz jrr hbn hxz +fxd: rsq +tln: rjt vxd tkg qkx +pml: hrt dbk rmt vmb +rqv: zgb rxh +bht: xnj +jfk: brh +zcf: chn xkk flz +jsl: dcq msz gxh +vsh: mbg dqn ntc hzm lft +sms: bbx xbt +tpb: rgl rzm vcr sct +zqj: blv zlj vmq +lch: jnj mcd kzz +ctm: ggg fgk sns +sps: pdl mbg +zcj: qpv +lkm: vkf +mvr: dfv vsr zrb +thq: btk gbb fks bns +hrt: fcs fck zgf +pvr: rdk tpn qmk xlx +xxq: hld mpb +qmk: mpj +fdh: qlb pns vmq +xlc: gfc qpv qps +qmz: kkc ptx cdp vgh +jvn: nkr +vdv: thc fbm +jfj: vvz txq xnj czf +ztc: vxd kqd zrx rpn +sxx: ndm +hsc: ggb rzt hkl hgd +nmg: jqq rjp +jhh: zvt +gqk: rqq znp xrv +rdc: zmm +mxg: nqm +fxt: krm htj dgr +xvg: fgk fgn jzr hms +pxd: pzv xnh hbb +gbh: fsj +pns: nrg +qvd: rms tvs ksh rsm +xrk: pgl rkp clk tjm zsm +fnj: nkr lpr qxs jgl +rnk: qps +kqg: ptb +fpd: gvt rst nlk mnf gzp +tdf: vzg fsd +flx: rgm +jvr: mcl mbz +rgn: rzm cdp zzh sfx +dcj: zpq +mcl: glk bcx +qtf: rcl snh +grb: nff +bjh: fdq +dld: cfb pvt ptc +chz: thx jqq +djt: rzb svd lgk hrj bbt mdb +tzj: ldr nlk +hqx: jvb +qtd: pns pvx zks qjb +plk: pls txv pgb zlq +dcq: hvb xqv +mst: dcq cgq mnp hlh +fss: dvm +lts: smt ppl nnl lhl +fvc: nhf nnl ctm clk kmj pxd +dcv: bsr vjj jcr +jbb: rjz rnk njb +rnf: qml +blk: tbf sbn sqf kfh nzg rnj +pzv: kqg fnn +vlc: flx ltx qvk hmv +xqp: xmc +jhg: zps drq nxz +lkc: dvm zxh dqf thc +khg: gpm bzl +xpv: gls +nhh: lck +mbc: pld rpx tkt bxp gvv +bff: gvv xjm nqf btc +rnb: qft vlf cdc bzf +bpv: bdv mdx +kbt: mdn +tcm: snl +tfv: sjd +btc: ngf +ntm: dcj mfg +jdv: fsq xxm rdg pxn +fkt: cbn grh +zsh: sdj brx +fjc: nzl +shj: kzn gfh qnn +jtc: jfv +nsh: pzr nhh kpd xqp cvd +xvf: txm gxt +bxz: brx snm +pcb: qxt tdd +xjh: bqx +rdt: kcv frn zmv +dtq: qfb pkl chs nmf +nqf: zbk sfq +dkt: cjv qmk +nqq: hbs prc +rsd: klg kxm dmk +llk: lvp tbf tqp +rpx: svb +pxs: qxs vhp mrc lxg +hgn: xmc lzx rms +pst: vkf lqm +bxp: dxb +lss: tkb lqg dhg zpv +glb: vrx scc +chv: zsm +vcl: dtl jgv dmg nnz fdg +kfm: mjp vlg +fhn: hxs rdb ckb jqz +lsx: zcl +msm: bdv tch +qfs: fgn tbf gdv +hdg: mkj vkq pnb dld +fvd: xhp chz tvd htd +bcp: psh fcj brh +qvx: qpl zpq nxr +gsr: hgn gzp qvk lkl tlt +mxz: fmn mql vsb krt +rcz: vrg dcq +kdl: rfq tvd lgt +zrj: gdt kfz xcp mhx jfk +nms: lnv gkr jvb hbq +gns: snl vvc gzp mjp brx +zks: qkl +gmt: gqf +dhg: dpr +xvm: zzc +jlq: jrm +vjs: tpr cxn rdx lmh qdr bkj vhd rmq +gbb: tmm dbc +rxx: tlj gbh +kjp: zjl dpd brl +jgc: tzx pgx pdc +nxk: vzc xkk vmz +ktb: xbb ndj xvq dbz pzn +ctn: sxc jrm +lvv: rcl +qbl: grh zsm +cbh: gqz gsc +pvt: xnb bzh +cfv: rsq +qfg: xlf hbn nsz fbz +mlp: ggh xxq zbc dvt +qgg: btd rtr mtv +btd: gxd +dxs: lzx ftz njk mnf +lqg: ztm jxf +qtv: vcr +hvn: lsx jkm vvr nzd +xzs: mzz fxd plm +zzc: kqg fxl +tlk: jdq rhd jhv pbp +hld: ppx +gcf: pvx +szr: rdg mft +pdc: dsx krk snq qqf +rzm: mnc +mnp: jfv xqv +tdd: vvz +tpr: hld czv vzq +kml: nzd rhd +skn: xvf tqp sss +tlv: nxq +cvg: ksq zls lfx rft +lxh: ntv mkr jhv hgd +jxr: svd czk nzn mlk htd +pxx: cfm szt jhh +njj: dcj kqh vzq +hlr: pqx +jrm: fdb +sct: clk zmv pqp +cnd: xlx tgh +rsl: fsn +fpf: zkp +sbq: hmj hhz grd rgm +vgs: fsj zxh rpn kfm +qns: mpb +cmj: jnc +nbh: fsq +kzc: gxh lfc tfc +rsm: kcx jtv +ccv: dbc +bhq: fbz pmv szt +shz: kkc zqs svn btd +zpk: rft vfq tgf +jpf: ptv +tpt: lnv cfb nxp krm +dfh: dpd trg vrx xjr +jbm: xtf cdf zrx xsv +vxj: htc bzx qsh +nvk: tgf hbx dks shg gcq +rjq: rhc jqm cnq +bgh: pvx str +ght: lcd gqg tqk rcc +hhx: txf +psg: gkx cqs flz +hbc: jtc qnc +nvx: svt rtk qnr nqb +qbv: zps pgb +xms: cbn zpj +kdj: rtb qbq tlv +vsd: mfd pvt dhg +xcf: drq +qqb: pqm thc jtr crq +cxn: jjd svb fcm +lql: svn pbf mft mdr +zlx: pld cng dbh tsc scc +jck: mmh +sdg: xmr ppx +cqp: rnf nnl cbn +gtz: mxg ccl xpk qdh zcx +zpp: sjd +dfz: fxn cgq tdl mdn hfp +hzm: ltl +zrs: pgb +xrm: mql dzt hbq +hbx: tqp +kxq: rmd rmk rgl +tqg: hbz +vjj: bqm +lcd: dmn +hvl: gxl zrg xpv gfx spt +vrh: qtf zks zsd vkn +rbv: kzb gsf +zbk: rdc +ldb: fkc +vqq: gnv zmm lkm +mkj: sjg +dbz: gtf pnq +jsp: sxg hzm zkt bpx jpj +snq: rms cxm +ndc: vmk znd zln rdk +xkq: jkt vsc fdb +tph: psg ddg czm lgn +sxh: bzx pcf +rmt: mql qtf ldb cqd +qrk: bth hmv csq bxp rqp +nph: nld +pnn: znr zvt lxh tlk zmv +gpt: lgs znp hlh mrq +xqz: nqt clp tcm +gfh: sxp jfq +xpf: ctg kfh fvz dkd +vzt: tcm hbq lck tzz +mrq: xqv +cxd: cmj xxq xxv +dvt: ctv +mrv: htc lcl sps sck krt +crs: dfl mlf xgx +xbl: frh fgq rft +xzk: rbv qcp +dbk: gpm cbg +kfl: zlj gnv +ngk: sck sqb scx zcx +xvq: qkx drq lqm +nlf: jnj +fgn: xnx +ktr: qnc hjh fxl +xmh: zcx ptr fjx mtl +rkk: crj lft fjx hgq zqj +pzn: zpq sfl bzh mjs +hxs: frn +vvl: hxt hms hxs mnc +mlf: frh +qcm: kpp dqn +bkh: qmf +thx: mfh gsc +zvm: xhk kmj zqb +clc: njj tgd mdv dcj +xmg: csj xrq xcg bnb +tvq: cgq cfm +rln: ggh ksh hjx brk plf lrn +tkg: kpp zks +vqh: xjh nqb qbv vlg +bdg: fnn +mdb: jqq pql vnk +cdp: rcb gfx +xgh: sbd jfq +bpj: plf kxm rhc sms +kls: jlx sqf fxc zln +clk: chv +nmz: dvz pgv +jpr: nbt +mpf: nth ccv htl scm +pct: qjp fjh rqv vrh bzf xdv +rfq: cmp +kns: nqm +pgx: tgp grb +gzp: qjp +nxq: vcn +gzh: tzg tlv +hbd: csq zpt sxg bgh +fds: xrb zjb vcn gqz +fbm: ppn fxd +zpc: zkt zbc ncs kmn +jxq: dlb rjq ccc jtr +jjd: nff tsc qkz sfk +str: sjg +zlb: mql hqf jpj +gbm: hhs vpn gzg ddb psv xvm zcj +vmk: ndn jcp jlg bns +hgx: qtv fgq zqz cfm +dmg: vhp jtj +lrd: svn nbj +bng: qsh +kcx: lll ndm +hsp: mmh +xcp: hcs bhq qhx +dkq: fzv cnq npm fjh knp +nmt: kdc qcm +dlg: qds fqz gvn vld +mnc: vnm +rvt: jcn trc jsv bdf +xcq: dks rsl kzn gvn +zmx: lst ckf czf +hfq: zmx qfs mgc sqs +gcc: tqk lks rkp +nnp: drl pvm +mbg: drl +cqb: pnr +rpr: rhc hgn fck zrs +ppl: njb bht tvq +pnp: tsc rxd zgb szh +bfg: sjs +ntc: tzx dxb +xpk: ccc gcf rtk +rgl: sxp hjh frh sss mnp +tdl: jck +vkt: fxm hjx vdv hlr pls qcp +tkh: kjb nqt tsc rvx +hrl: rtr sfx vpq tdd jvn +nmf: ztm ndj +zxh: pdh xcg +zjm: cpv cxz +dmm: rtk +mrk: xdj pdh bdf sdg +rdb: zcj kxg +smk: hqx mpb +zbc: gjp nlf +plf: dxb +gll: mpb xcg +dmd: ckf vnv gcd nkr +nxr: mxg rvx +tch: frx +fbb: fsp qcz sbz tsm hmj +ztm: cdf vbc drx +bpn: rcb rdb ckf +dpp: qcz trc vtc +gdt: qml ggb +vmb: xjh dzt lvv lqg bbf +nsb: svt zxh ngf +jfm: ptm nrm rmk +jdm: lhr bpg mbh chn mtv +gcd: bqr lgz +jhv: drn tqt +srd: kqg rzm fxc +trc: txr str +sgr: khs scc dkq kng +gqg: hrj djr dks +slr: qjb sgv tkg +ddv: smc ntm cpq xqz +bmx: lck gcf qpl +zrg: rnk +rdm: bfg fnn ctk vfq +hzt: qcz vkn +lfc: grx +nfs: jpr vmb +fjh: ntm +zpr: hrn cnq mlc rhq +hrn: pkl vgl +msj: qdr nsb qnr hxc jxf njz +dmr: pkl kzb +njr: dfv pnq +bjk: lvv dbz hrt rjt +qqm: vkf ggh glb nff +nzg: vpq zls +gxf: cgq +bpx: jcs bbx +dtm: fds htd flz xbz +mld: fsq +pbd: jjz +ptm: vrg sbn jdq kjc +jqz: dkt sdf bcm sfx jvr +fbz: ssl xlh +vkb: vpn hkl qtt vpq +khb: mrr vcn tdj gxb +drn: bns +jjv: jtc ptb gxt shj +qxs: rcb +qvl: txf ckt nkr htl vqz +pcp: rgj lgt frn jbr +jcp: hpm fxn nlq +trf: vpt +dms: kfz fdb +jzb: pgv cnh +pgb: scx qxx +rdx: bmt dgr +xsv: xqr srg pct +pbh: vdx scj sfk rdc +dct: kns pmh jck +klf: gfx +glp: dsg qxj xcq +nld: rxd +shc: qmk +zpq: tqg +qhm: smc xqp cxd rsq sfq +ctk: rzb cqs jfv +lhz: lmv ptv +dcs: gzh qgg gpg fpf lxg bkh +ptv: ptb +gzg: mdr +sbg: ccv jgv +tvd: dvz +qdh: thc chs +fgb: dmk rvr qfh tzs +vrx: ptc +fxn: ptl fxl +ksj: pdv gtf +lcq: jgv sxm zgv +njz: mhl gcf jtv +crc: nbh mqg +nff: tzx +kxg: ndq dkj llk +hbn: qgh nhf +gxt: mdn +qbb: fqz zcj fvz dmn +bsp: lzm rnf cfm +pkd: hhj xzj bjh +qmb: kdl shc cvv fgn +kmq: nmt hft bqm qcz +xkf: nxq fjc qpm ckt +zcq: jlq mcl +hzj: zjm qpc crc nzl +lnv: vkn +kpd: htj xnb +zcz: fsd bqm nbg tln +lmh: pkl +ntv: kjc hbx jgl +szt: kcv bcx znd rdg +zrt: tsd hlr nlk nnp nph +cnq: tkt +bgm: kpp mdv fsp +bfm: rms +mhc: bzx +zxg: qpm xvm zvg nlm +bpg: xgh mdr +cqr: jsv bqm +hfp: jfq sxm +gfc: sxp +vss: mld tlv nzd mlf nlm fml +lzv: xlh vct ltb +kch: fxn rjz dkd lvp pxv +cmr: jnj dqp hcx srg +ktc: ths rsq kjb zpt +hhk: dbp dsg tzg njb +trg: vbc jtr xzj +hcs: zth cnd +nnz: hck dmp bpf djx +scc: lck +lvc: zzc blk psv mhx +xbz: qtv lzv +bqq: tqg qkz kdc +ngd: hqx +grd: fkc vhk hgq +jcs: zrs qft vxj +sbd: hpg +qjb: crq kfl +szh: hkd +frn: zkd hsp dbc +gvn: zzh sxp +mjs: fdq lnv +xxz: cgq mgg jpg shc rfq +mkm: ggx +jqr: sjm fsn hms zqz vrg +jpg: mlf +ksq: ktr ssl blk lpm gls +xrb: nzl tcp mzr +xtp: mrc hhk +qft: xjm frx +cfk: dzt bbf +lbn: vkb gbb +htq: ggg bpg kzg nzg +vhq: sxc +bsz: rcn pdl glm grd +qjq: kxq nvk tmm jfj +ftd: kkv gcd mdr mjz +rbg: pql hvb zkp jgl +phj: fxd gmf qdh ldn +rjh: fft sxt kdr nbg +drk: cnh +xhp: bsp qct zhj +xlf: lhz nmg +dbf: gpm vtc nzf hqf +snh: drl cjm fxm xmc +lsp: qnn +ppn: zlj xcf +xcd: dmn xbc vhq sqs czm +lbm: gkt pkl +qbt: sbd jtj vzc +cst: hxs fgh jxr lbn +llz: lbj psd zfm xqg fbq +nvh: dns tfv txx +zjn: rdx ldh bkj qkz nvc +pnj: nlf vdv lch +zvq: rgm msm tlj sps +pfk: tcm rsm pls +fnv: fxl xlx tfv +qdb: rnb vbx flx qjv +nln: jvr dng txb ksv +vvh: vzg hzm zrx ptr +rmd: lvf chv jvn +pbg: dfn gfc gdv +vbb: vlf ptc qnr bmg fpg +hbs: gsf lxr qjp +tsm: qbc +txb: jbb dtl hhg qbq +mvd: rqv mjp vvh bqx +xzz: zkp trd +jxb: pns ksq hhj jqm sck snl +tlj: nlf zpv +mhm: vfg tzg qpc gxd +xbr: txx mrq tqp ksq +zpt: fbm pjg mkj nmt fsd +ksz: nbh jvj drk vrd +zhj: mdn mjn pnr +hjp: bhs dqn rxh qbv drx +qdm: kqq nhh vzt +ssk: xzz xms lvf lsz +fxc: cnh +cpq: mjs kcx +lgz: gcq pbp +xkk: mmh +kdc: zbk lll +dkg: dtc xvv +fqz: srd lgz grx jjm +rjt: vkf +mtj: mmp pmh btd +xmr: qqf bxp czr +lvf: fxn +rzt: vzc +tfc: qhx lqk +hpm: lgk rtb vvr +zmv: rkz +gdl: jrr gcq gcc +bmg: nqm rbv +klg: dmm +shs: chs xjr qsd rsm +jsz: ckf czk tqt htl +jvd: qsf zhz +vll: rjp gvn jfq cjv +vhp: gkg dks +znr: ptl mzv mbz +tdj: lhr fcj xvm xqv +bzh: ksb +fbg: dmr ccc +qfb: gnv zbc xqr +xbb: kzs +ckn: ggg mcl sjs qbt gdl +sck: hjx +tsc: sfq +qpc: lvp +lfd: sgb xnx xms jpg bcp +lgt: bbt vbs txf +mrc: sxm lsp +dsg: nxl jlg mlk fsn +dkd: lsx ptb +qpl: fck +jrr: dsb +pzt: lbm tkt jjd qbc +bnj: hbz bng +sxg: sqb sfq +fpg: lxr +tzz: qkl qdr +xrq: scc kdk mhl fvg +bth: fdq dpr +fsn: trf kkc +fxx: xpv lxg smt +mkr: lqk tnt +rpt: kxh gqf kbt +mpj: lbj +qtt: zth mdr +zvz: bff dqq cnq csq +qkx: pnb hgn fcm +htd: zgn +ldf: lll bpv bsr knr vlf +pzg: kkb ggb rnf +vld: psx frl +nzn: tdd thx +fhm: kns xxq fsj txv +pxg: svt vms dmm lmh +qlb: pch zsh fkl qnd +nlm: nzd +hgq: hbs +nbg: bzx +sjm: dkg nvk xnx +fcm: knr htc hqf +qlz: kmn nqt zlb sgl +nrm: jlq ptx fkt +hdj: mft xlh rsl +vzv: gqz mnc zhz pzg +vlg: zpq jqs +vfq: jdq +vkd: krt qkb hbs bpv +jzr: qpc dvz +vgn: txm jlx hvb mcl +zqb: cpv ptx tzg +sgb: qbl txf ndn +qfj: rst qsh bfm fss nfs +lzp: rtr gdt fgh vhs +mjz: lfx htl fpf +klq: tbf fqq ndn xgq +nzb: ndq hhx gcc svd zpj +xzj: tfb +pch: nxz qvx fzf +xdv: kjp rnb qxx +zlq: nrg zbk nnb +rvr: sxx hss ccl +cpk: dkg djx fxx +cmp: skn nth +bmn: hkd tvs xcf pdl +gzm: cdc +qbq: jsl +mdg: zvt rdk mbh +psd: drn +hhh: vnk jjm fhx ptv xcp jzb dtm ztz tgh +gxl: sqf kzn +pbc: fgk qsf sjs vvz +fdx: jcs dpr xcf +dzl: nbc dfb dtd ljs xrb +cxq: glk brh +lft: mbg +bnn: rdt vld qzx jqq +dfl: hsp frl +nxz: czr +ggd: jfq fgq +krt: zbc +scj: rgm lnn +knm: pdv +ksv: vnv xvf tvq +vhs: bns fxl sbd +fvg: dzv +cjm: khg ctv +gdd: sfs txm jnv +gff: xgx lst hhg xlx hfp +gvt: vsd hcx zgx +xdc: cnd tcp ccv +lgs: zgn gkg +snn: lhl qxs mfh nbc +ckb: mzr pdq mpj +zmr: fkt xrv mrr +hhj: ngd +hxz: tfv +mmr: mtj pzv tgh vrg +qpm: rhd hbc vqm gvk +ckt: njb dfl +mhx: gvk mld ctg fzr +hjm: fbg ndm mfd jsv +sdf: gxf lsp tfv +rkn: jzk zcl brh +lbl: pkl +lhv: qbc fjx jcr vkf +tsp: xlf vhq spt pdq nbh +zls: jfv +qvv: qbv bdv plm mfg +zpv: csq qxx +qsd: nph hld bdf +fgt: xzk qpl xzj zgx +qxf: zvm fpk fdl +jtj: nsz +kpj: ncr njk cfk +smp: bfg scm dms ctk gxl sbg +fdg: kmj xbz rzb +tmb: kzz nld ksj zjl +pks: fzv sxq ngf dpp +lgn: shc kkc +vpt: txm rtr +dqp: lck bzx +qbh: lfc gzh pcb +kjr: bpf chp jlg xnh +xbc: hdj vcr xdc +kng: brz tfb +pbp: qhx +xjm: str +ckp: pdv bqq cng xrm +sgl: nnb +vql: jvd psx xcq qnx +fnn: kbt +cvc: bcx xvv ctn rjp zpk +mbh: skp dlr +ccb: pzv dsb shg +vgf: gsc ddb zkp hpm ptl +jpp: rcz lnz chp +hgd: czf zzc rkp +lks: grx dtl xnj +klv: vnv kdj qrx nxq flz +gkv: htc kqd xgf +jnv: xkq bht mgc +kcv: vqm +txs: vvr rnj pxv jvd +hkd: gkt +btk: vct zqz spt +rvn: xhm kvn tcp rll +qcp: fkl +qnx: nsz +vck: ndj nnb nzf knr +dtc: zfm drk vpt +bnb: sfq bxz gvv +rsp: nhh htg lmh kpj fdh jnc lqb +sfx: gdd ktr +ctp: zqz pgl sbn +cvv: vnm gsc znp +mjp: vlf +jrp: jgv grh qps tfc +tvs: kpp +fcs: dzb kfl gtf xtf +gqz: mqg +zgv: lsp jpf +ktm: sbz mkj dpb mnf xjm +lkl: vzg sxh vhk +lbv: bcx tdl skp +zrb: dpr jhm +jxf: gtf +blv: dgr +hcx: kzz +zsd: bdv dbh fss +hmv: xbt gpm +cxz: jhh +dfv: cfk xxv +gdq: nxp ptc +vtd: kfz zcf kbt +dmp: gmt +flp: hvb kml thn +dqq: vkq fnx dqn +ltt: mcd dgr +bpd: dfl hpr ggb xnh +rcc: jpp sfs lxg xkh +hpf: mpj jrr gcd mgc hbb +fnx: kpp +rlf: pbf zzc zls +tlt: qxx qkz tzs +sqs: xjk +vmf: rnk frh rtr +pxv: jlg +znp: vqm +crh: bpg rxt nrs smt +xch: qjb qqf prc +mtl: bnj rcq xch +kcz: sxx jnc brl kns +kvd: qqf vxd rzr +xjr: kjt +ths: dvg hrn hmj +rfh: fdx nqt qnr fbg +tmm: vqm jfk sxc pgl +knp: rgm gpm +txx: lst +pqh: gzg xbl sqf +vzc: lfx +kkv: jtc plb +gpf: sxg sfq rcn +ftz: bzl jtr +kdk: bqm njr +hrj: jdq +ngf: bjf +rmk: fnn zcf +tdc: qzx czk grh hqc lcq lbn mxc +vbx: jhg zrs vsz ggh +gvk: glk sss lqk rgj tlv +vmz: gdv dmn xkk +cjv: ctg vtd vld zqb +zps: sgv rcq +zdh: kjt kdk lvv +rlx: lfc nbj rzm +bqr: gqf qxj jlq grf +qcs: zqg btk grf mmp +tgd: lqm gsf kjb +hss: rzr gtf mdz +qlp: zvg +zgf: zrb sfk sfl dvm bgm +bsr: kng sdj +hmj: qns +dsm: cxz gcq +rcr: ldn xjr zkt skf +ldr: fmn lkm mdx +tkt: nph +vsb: mnf ftr dhc ggx +dzs: bbf jjz nmf bjf +mzz: nqm nnp +dtd: jck gls +mdx: hqx rqp +ssl: sjd lfc nmz +lgb: pcf vtc mhc hld +fxm: nld fck xxv +qkt: xmp smt ndn hrj +ltb: vpt klf +rdp: tzj sxh ncs dbz +xgf: knr +rdk: nlq +vzp: fnx gpf nbg jpr +pqp: zkp mzr +xzf: hpr lsz rtz cpk kjc nnl psd rdg +brx: pjg +kqs: qgh trd +xnb: jcn qcp +skp: dms +nrs: trf xvv +smc: jsv +rvx: plm vhd gnv +djr: msz dms qxt +rbm: lhz grx chp +lsz: dmp ltc +cjh: hpg bqv rdg +qmf: zgn pnr lvp +xgj: zjz nlf szh hfm hkd +cbg: fkl kqh +xtf: krm ncr +jkt: jfv +mhl: qvx bmg vkn +rll: fdb +qpv: kbt xkk +tjq: nlm vgh dmg +ndq: pgv +hxc: clp tzx jvb +hhs: ztz klq jpf +dhc: lqb kqd crq +jbr: ksz qmf mtj +zgx: rxx jjz sqb +vzq: rhc sdj +svb: gzm +fgk: gcd lnz +stq: flp cqb fnv hhg +vdh: xjk rcb klf +vnc: rgj vsc gmt +ckh: nth nsz jxk sss jzb +vtl: kfm vms nrg +dxp: mdg xgh mfh spt +pjc: vmf gkx hcs xjk +lpm: dlm ptx mrr jpg +vgh: cbh jfv ndq +hhz: btc vlf xzj lbl +svt: mpb +mmh: gls +jkm: vpq nbh +dvj: fjc svn qbh jlx +rpn: jsv rcq grb +ltc: mdg zpp gxh +hrq: flx xcg zkt ldn +qqf: clp bzl +rxd: fdq +fgh: sjd rkz zth +tgp: kqd +vmq: gbh vsz dvt lnv +pmc: cfv gkv chs fmn +hft: dhg zcx dvt +ksh: bqm smk vqh bmx +blr: scc cfv qdr +rcq: tch +lnn: qns fss +zvl: xmp dbp hfp +lpr: dms gmt klf From 601b40e7d4c737e9a04ed228885559915ad63fcc Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Mon, 25 Dec 2023 17:20:40 +0100 Subject: [PATCH 477/479] 2023: d25: ex2: add solution --- 2023/d25/ex2/ex2.py | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100755 2023/d25/ex2/ex2.py diff --git a/2023/d25/ex2/ex2.py b/2023/d25/ex2/ex2.py new file mode 100755 index 0000000..918e0ec --- /dev/null +++ b/2023/d25/ex2/ex2.py @@ -0,0 +1,9 @@ +#!/usr/bin/env python + + +def main() -> None: + print("There is no part two...") + + +if __name__ == "__main__": + main() From 94befa4d1b9b0eb0e96873c76ce2cb423c9d3f16 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 23 Nov 2024 18:42:21 +0000 Subject: [PATCH 478/479] nix: bump flake inputs --- 2019/d04/ex1/ex1.py | 2 +- 2019/d04/ex2/ex2.py | 2 +- 2021/d11/ex1/ex1.py | 2 +- 2021/d11/ex2/ex2.py | 2 +- 2021/d12/ex1/ex1.py | 2 +- 2021/d12/ex2/ex2.py | 2 +- 2021/d25/ex1/ex1.py | 10 +++++----- 2022/d12/ex1/ex1.py | 2 +- 2022/d12/ex2/ex2.py | 2 +- flake.lock | 33 +++++++++++++++------------------ flake.nix | 1 - 11 files changed, 28 insertions(+), 32 deletions(-) diff --git a/2019/d04/ex1/ex1.py b/2019/d04/ex1/ex1.py index 460b7d8..49bb589 100755 --- a/2019/d04/ex1/ex1.py +++ b/2019/d04/ex1/ex1.py @@ -7,7 +7,7 @@ def is_valid_password(p: int) -> bool: digits = str(p) def has_adjacent_digit(): - for (a, b) in zip(digits, digits[1:]): + for a, b in zip(digits, digits[1:]): if a == b: return True return False diff --git a/2019/d04/ex2/ex2.py b/2019/d04/ex2/ex2.py index 883abf9..a54ccfe 100755 --- a/2019/d04/ex2/ex2.py +++ b/2019/d04/ex2/ex2.py @@ -8,7 +8,7 @@ def is_valid_password(p: int) -> bool: def has_unique_adjacent_digit(): counts = {d: 0 for d in range(10)} - for (a, b) in zip(digits, digits[1:]): + for a, b in zip(digits, digits[1:]): if a == b: counts[int(a)] += 1 return any(count == 1 for count in counts.values()) diff --git a/2021/d11/ex1/ex1.py b/2021/d11/ex1/ex1.py index d84d69e..c6bf0be 100755 --- a/2021/d11/ex1/ex1.py +++ b/2021/d11/ex1/ex1.py @@ -38,7 +38,7 @@ def solve(input: List[str]) -> int: # Second step, do flashes has_flashed: Set[Point] = set() while len(flashes := (excited(levels) - has_flashed)) > 0: - for (i, j) in flashes: + for i, j in flashes: has_flashed.add((i, j)) for x, y in neighbours_of((i, j)): levels[x][y] += 1 diff --git a/2021/d11/ex2/ex2.py b/2021/d11/ex2/ex2.py index 39e5092..8f95f55 100755 --- a/2021/d11/ex2/ex2.py +++ b/2021/d11/ex2/ex2.py @@ -38,7 +38,7 @@ def solve(input: List[str]) -> int: # Second step, do flashes has_flashed: Set[Point] = set() while len(flashes := (excited(levels) - has_flashed)) > 0: - for (i, j) in flashes: + for i, j in flashes: has_flashed.add((i, j)) for x, y in neighbours_of((i, j)): levels[x][y] += 1 diff --git a/2021/d12/ex1/ex1.py b/2021/d12/ex1/ex1.py index 4e731a0..6108876 100755 --- a/2021/d12/ex1/ex1.py +++ b/2021/d12/ex1/ex1.py @@ -11,7 +11,7 @@ def solve(input: List[str]) -> int: def parse() -> Map: res: Map = defaultdict(set) - for (start, to) in map(lambda s: s.split("-"), input): + for start, to in map(lambda s: s.split("-"), input): res[start].add(to) res[to].add(start) diff --git a/2021/d12/ex2/ex2.py b/2021/d12/ex2/ex2.py index 86a2c10..b30d9b8 100755 --- a/2021/d12/ex2/ex2.py +++ b/2021/d12/ex2/ex2.py @@ -11,7 +11,7 @@ def solve(input: List[str]) -> int: def parse() -> Map: res: Map = defaultdict(set) - for (start, to) in map(lambda s: s.split("-"), input): + for start, to in map(lambda s: s.split("-"), input): res[start].add(to) res[to].add(start) diff --git a/2021/d25/ex1/ex1.py b/2021/d25/ex1/ex1.py index c785a12..ed01bf2 100755 --- a/2021/d25/ex1/ex1.py +++ b/2021/d25/ex1/ex1.py @@ -60,11 +60,11 @@ def solve(input: List[str]) -> int: for x in range(map.dimensions.x): print( "".join( - "v" - if Point(x, y) in map.south - else ">" - if Point(x, y) in map.east - else "." + ( + "v" + if Point(x, y) in map.south + else ">" if Point(x, y) in map.east else "." + ) for y in range(map.dimensions.y) ) ) diff --git a/2022/d12/ex1/ex1.py b/2022/d12/ex1/ex1.py index 9e1c372..3e78cfc 100755 --- a/2022/d12/ex1/ex1.py +++ b/2022/d12/ex1/ex1.py @@ -20,7 +20,7 @@ class HeightMap: def reachable_neighbours(self, p: Point) -> Iterator[Point]: reachable_height = self.heights[p.x][p.y] + 1 - for (dx, dy) in ((-1, 0), (1, 0), (0, -1), (0, 1)): + for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)): x, y = p.x + dx, p.y + dy if x < 0 or x >= len(self.heights): continue diff --git a/2022/d12/ex2/ex2.py b/2022/d12/ex2/ex2.py index 657f807..0a713b3 100755 --- a/2022/d12/ex2/ex2.py +++ b/2022/d12/ex2/ex2.py @@ -20,7 +20,7 @@ class HeightMap: def reachable_neighbours(self, p: Point) -> Iterator[Point]: reachable_height = self.heights[p.x][p.y] + 1 - for (dx, dy) in ((-1, 0), (1, 0), (0, -1), (0, 1)): + for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)): x, y = p.x + dx, p.y + dy if x < 0 or x >= len(self.heights): continue diff --git a/flake.lock b/flake.lock index ffbe623..d2cf81b 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "flake-compat": { "flake": false, "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", + "lastModified": 1696426674, + "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", "owner": "edolstra", "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", "type": "github" }, "original": { @@ -21,11 +21,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1694529238, - "narHash": "sha256-zsNZZGTGnMOf9YpHKJqMSsa0dXbfmxeoJ7xHlrt+xmY=", + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", "owner": "numtide", "repo": "flake-utils", - "rev": "ff7b65b44d01cf9ba6a71320833626af21126384", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", "type": "github" }, "original": { @@ -43,11 +43,11 @@ ] }, "locked": { - "lastModified": 1660459072, - "narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=", + "lastModified": 1709087332, + "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", "owner": "hercules-ci", "repo": "gitignore.nix", - "rev": "a20de23b925fd8264fd7fad6454652e142fd7f73", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", "type": "github" }, "original": { @@ -58,11 +58,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1701336116, - "narHash": "sha256-kEmpezCR/FpITc6yMbAh4WrOCiT2zg5pSjnKrq51h5Y=", + "lastModified": 1731890469, + "narHash": "sha256-D1FNZ70NmQEwNxpSSdTXCSklBH1z2isPR84J6DQrJGs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "f5c27c6136db4d76c30e533c20517df6864c46ee", + "rev": "5083ec887760adfe12af64830a66807423a859a7", "type": "github" }, "original": { @@ -75,9 +75,6 @@ "pre-commit-hooks": { "inputs": { "flake-compat": "flake-compat", - "flake-utils": [ - "futils" - ], "gitignore": "gitignore", "nixpkgs": [ "nixpkgs" @@ -87,11 +84,11 @@ ] }, "locked": { - "lastModified": 1700922917, - "narHash": "sha256-ej2fch/T584b5K9sk1UhmZF7W6wEfDHuoUYpFN8dtvM=", + "lastModified": 1732021966, + "narHash": "sha256-mnTbjpdqF0luOkou8ZFi2asa1N3AA2CchR/RqCNmsGE=", "owner": "cachix", "repo": "pre-commit-hooks.nix", - "rev": "e5ee5c5f3844550c01d2131096c7271cec5e9b78", + "rev": "3308484d1a443fc5bc92012435d79e80458fe43c", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 6334931..36616f8 100644 --- a/flake.nix +++ b/flake.nix @@ -22,7 +22,6 @@ repo = "pre-commit-hooks.nix"; ref = "master"; inputs = { - flake-utils.follows = "futils"; nixpkgs.follows = "nixpkgs"; nixpkgs-stable.follows = "nixpkgs"; }; From 43650ade44930f4b6ce9dbddc4a44698b955e8fb Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 23 Nov 2024 18:45:57 +0000 Subject: [PATCH 479/479] nix: migrate to 'ruff' formatting Having just the one tool is better. Incidentally, this fixes the ternary formatting, which was messed up in recent `black` versions. --- .isort.cfg | 2 -- 2020/d17/ex1/ex1.py | 1 - 2020/d17/ex2/ex2.py | 1 - 2021/d25/ex1/ex1.py | 4 +++- 2022/d07/ex1/ex1.py | 1 - 2022/d07/ex2/ex2.py | 1 - flake.nix | 15 +++++---------- 7 files changed, 8 insertions(+), 17 deletions(-) delete mode 100644 .isort.cfg diff --git a/.isort.cfg b/.isort.cfg deleted file mode 100644 index b9fb3f3..0000000 --- a/.isort.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[settings] -profile=black diff --git a/2020/d17/ex1/ex1.py b/2020/d17/ex1/ex1.py index dd9efee..03bf46b 100755 --- a/2020/d17/ex1/ex1.py +++ b/2020/d17/ex1/ex1.py @@ -41,7 +41,6 @@ def update(grid: Grid) -> Grid: def solve(grid: Grid) -> int: - for __ in range(6): grid = update(grid) diff --git a/2020/d17/ex2/ex2.py b/2020/d17/ex2/ex2.py index 8589288..ba979a1 100755 --- a/2020/d17/ex2/ex2.py +++ b/2020/d17/ex2/ex2.py @@ -41,7 +41,6 @@ def update(grid: Grid) -> Grid: def solve(grid: Grid) -> int: - for __ in range(6): grid = update(grid) diff --git a/2021/d25/ex1/ex1.py b/2021/d25/ex1/ex1.py index ed01bf2..5d6f612 100755 --- a/2021/d25/ex1/ex1.py +++ b/2021/d25/ex1/ex1.py @@ -63,7 +63,9 @@ def solve(input: List[str]) -> int: ( "v" if Point(x, y) in map.south - else ">" if Point(x, y) in map.east else "." + else ">" + if Point(x, y) in map.east + else "." ) for y in range(map.dimensions.y) ) diff --git a/2022/d07/ex1/ex1.py b/2022/d07/ex1/ex1.py index 43e49f1..fcd28d4 100755 --- a/2022/d07/ex1/ex1.py +++ b/2022/d07/ex1/ex1.py @@ -8,7 +8,6 @@ FileSystem = dict[str, Union[int, "FileSystem"]] def solve(input: list[str]) -> int: def build_tree(input: list[str], i: int = 0) -> tuple[FileSystem, int]: - fs: FileSystem = {} while i < len(input): diff --git a/2022/d07/ex2/ex2.py b/2022/d07/ex2/ex2.py index 9886cf0..6a6d447 100755 --- a/2022/d07/ex2/ex2.py +++ b/2022/d07/ex2/ex2.py @@ -8,7 +8,6 @@ FileSystem = dict[str, Union[int, "FileSystem"]] def solve(input: list[str]) -> int: def build_tree(input: list[str], i: int = 0) -> tuple[FileSystem, int]: - fs: FileSystem = {} while i < len(input): diff --git a/flake.nix b/flake.nix index 36616f8..066f6db 100644 --- a/flake.nix +++ b/flake.nix @@ -39,17 +39,13 @@ src = self; hooks = { - black = { - enable = true; - }; - - isort = { - enable = true; - }; - nixpkgs-fmt = { enable = true; }; + + ruff-format = { + enable = true; + }; }; }; }; @@ -57,12 +53,11 @@ devShell = pkgs.mkShell { buildInputs = with pkgs; [ (python3.withPackages (ps: with ps; [ - black - isort mypy z3 ])) pyright + ruff ]; inherit (self.checks.${system}.pre-commit) shellHook;