diff --git a/.envrc b/.envrc index c23bb91..3550a30 100644 --- a/.envrc +++ b/.envrc @@ -1,7 +1 @@ -use_flake() { - watch_file flake.nix - watch_file flake.lock - eval "$(nix print-dev-env)" -} - use flake 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/2019/d03/ex2/ex2.py b/2019/d03/ex2/ex2.py index a0abfac..077f2e3 100755 --- a/2019/d03/ex2/ex2.py +++ b/2019/d03/ex2/ex2.py @@ -2,7 +2,7 @@ import sys from fractions import Fraction -from typing import Dict, List, NamedTuple, Optional +from typing import List, NamedTuple, Optional class Point(NamedTuple): diff --git a/2019/d05/ex1/ex1.py b/2019/d05/ex1/ex1.py index 09dac02..fe46167 100755 --- a/2019/d05/ex1/ex1.py +++ b/2019/d05/ex1/ex1.py @@ -1,7 +1,5 @@ #!/usr/bin/env python -import sys -from copy import deepcopy from enum import IntEnum from typing import List, NamedTuple diff --git a/2019/d07/ex2/ex2.py b/2019/d07/ex2/ex2.py index c239eaa..8f5e209 100755 --- a/2019/d07/ex2/ex2.py +++ b/2019/d07/ex2/ex2.py @@ -5,7 +5,7 @@ import sys from copy import deepcopy from dataclasses import dataclass, field from enum import IntEnum -from typing import Callable, List, NamedTuple +from typing import List, NamedTuple class ParameterMode(IntEnum): diff --git a/2019/d09/ex1/ex1.py b/2019/d09/ex1/ex1.py index 6f54dec..9a2df1e 100755 --- a/2019/d09/ex1/ex1.py +++ b/2019/d09/ex1/ex1.py @@ -1,11 +1,10 @@ #!/usr/bin/env python -import itertools import sys from copy import deepcopy from dataclasses import dataclass, field from enum import IntEnum -from typing import Callable, List, NamedTuple +from typing import List, NamedTuple class ParameterMode(IntEnum): diff --git a/2019/d09/ex2/ex2.py b/2019/d09/ex2/ex2.py index 598f628..7c8be67 100755 --- a/2019/d09/ex2/ex2.py +++ b/2019/d09/ex2/ex2.py @@ -1,11 +1,10 @@ #!/usr/bin/env python -import itertools import sys from copy import deepcopy from dataclasses import dataclass, field from enum import IntEnum -from typing import Callable, List, NamedTuple +from typing import List, NamedTuple class ParameterMode(IntEnum): diff --git a/2019/d10/ex2/ex2.py b/2019/d10/ex2/ex2.py index 60f115a..480234e 100755 --- a/2019/d10/ex2/ex2.py +++ b/2019/d10/ex2/ex2.py @@ -4,7 +4,6 @@ import sys from cmath import phase from itertools import groupby from math import gcd, pi -from pprint import pprint from typing import NamedTuple, Set, Tuple diff --git a/2019/d13/ex1/ex1.py b/2019/d13/ex1/ex1.py index 1bf7e8c..924ffb7 100755 --- a/2019/d13/ex1/ex1.py +++ b/2019/d13/ex1/ex1.py @@ -3,7 +3,7 @@ import sys from dataclasses import dataclass, field from enum import IntEnum -from typing import Dict, Iterable, List, NamedTuple, Tuple, TypeVar +from typing import Iterable, List, NamedTuple, Tuple, TypeVar class ParameterMode(IntEnum): diff --git a/2019/d13/ex2/ex2.py b/2019/d13/ex2/ex2.py index 9fb669f..af0d24f 100755 --- a/2019/d13/ex2/ex2.py +++ b/2019/d13/ex2/ex2.py @@ -3,7 +3,7 @@ import sys from dataclasses import dataclass, field from enum import IntEnum -from typing import Dict, Iterable, List, NamedTuple, Tuple, TypeVar +from typing import Iterable, List, NamedTuple, Tuple, TypeVar class ParameterMode(IntEnum): diff --git a/2019/d16/ex2/ex2.py b/2019/d16/ex2/ex2.py index a13a0bf..317d157 100755 --- a/2019/d16/ex2/ex2.py +++ b/2019/d16/ex2/ex2.py @@ -2,8 +2,6 @@ import sys from functools import reduce -from itertools import chain, cycle -from typing import Iterable, List def main() -> None: diff --git a/2019/d19/ex2/ex2.py b/2019/d19/ex2/ex2.py index 138e45b..8dd132c 100755 --- a/2019/d19/ex2/ex2.py +++ b/2019/d19/ex2/ex2.py @@ -4,7 +4,7 @@ import sys from copy import deepcopy from dataclasses import dataclass, field from enum import IntEnum -from typing import Iterator, List, NamedTuple, Tuple +from typing import List, NamedTuple class ParameterMode(IntEnum): diff --git a/2020/d07/ex2/ex2.py b/2020/d07/ex2/ex2.py index 107d737..a955087 100755 --- a/2020/d07/ex2/ex2.py +++ b/2020/d07/ex2/ex2.py @@ -2,8 +2,6 @@ import re import sys -from collections import defaultdict -from copy import deepcopy from dataclasses import dataclass from typing import Dict, List, Set, Tuple 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/2020/d18/ex2/ex2.py b/2020/d18/ex2/ex2.py index 94f13ed..a83161c 100755 --- a/2020/d18/ex2/ex2.py +++ b/2020/d18/ex2/ex2.py @@ -1,7 +1,7 @@ #!/usr/bin/env python import sys -from typing import Callable, Dict, List +from typing import List """ E : T [ * T ]* diff --git a/2020/d20/ex2/ex2.py b/2020/d20/ex2/ex2.py index e923806..c9e06a7 100755 --- a/2020/d20/ex2/ex2.py +++ b/2020/d20/ex2/ex2.py @@ -5,7 +5,6 @@ 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]] diff --git a/2020/d23/ex1/ex1.py b/2020/d23/ex1/ex1.py index faae133..2d7ff20 100755 --- a/2020/d23/ex1/ex1.py +++ b/2020/d23/ex1/ex1.py @@ -2,7 +2,7 @@ import itertools import sys -from typing import List, Tuple +from typing import List def solve(circle: List[int]) -> int: diff --git a/2020/d23/ex2/ex2.py b/2020/d23/ex2/ex2.py index 90c8c81..8993dcb 100755 --- a/2020/d23/ex2/ex2.py +++ b/2020/d23/ex2/ex2.py @@ -2,7 +2,7 @@ import itertools import sys -from typing import List, Tuple +from typing import List def solve(circle: List[int]) -> int: diff --git a/2020/d24/ex2/ex2.py b/2020/d24/ex2/ex2.py index 17728b2..ef749f9 100755 --- a/2020/d24/ex2/ex2.py +++ b/2020/d24/ex2/ex2.py @@ -3,7 +3,6 @@ import itertools import sys from collections import defaultdict -from copy import deepcopy from typing import Dict, Iterator, List, Tuple Offset = Tuple[int, int] diff --git a/2021/d01/ex1/ex1.py b/2021/d01/ex1/ex1.py index 24cc5d1..3853ce4 100755 --- a/2021/d01/ex1/ex1.py +++ b/2021/d01/ex1/ex1.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from typing import List diff --git a/2021/d02/ex1/ex1.py b/2021/d02/ex1/ex1.py index f28dd77..f891b43 100755 --- a/2021/d02/ex1/ex1.py +++ b/2021/d02/ex1/ex1.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from typing import List diff --git a/2021/d02/ex2/ex2.py b/2021/d02/ex2/ex2.py index b48215c..8843639 100755 --- a/2021/d02/ex2/ex2.py +++ b/2021/d02/ex2/ex2.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from typing import List diff --git a/2021/d03/ex1/ex1.py b/2021/d03/ex1/ex1.py index ed2eeb7..7519004 100755 --- a/2021/d03/ex1/ex1.py +++ b/2021/d03/ex1/ex1.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from typing import List diff --git a/2021/d03/ex2/ex2.py b/2021/d03/ex2/ex2.py index 9c6515b..acf0ff2 100755 --- a/2021/d03/ex2/ex2.py +++ b/2021/d03/ex2/ex2.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from copy import deepcopy from typing import List diff --git a/2021/d06/ex1/ex1.py b/2021/d06/ex1/ex1.py index 5eec9ce..65abb44 100755 --- a/2021/d06/ex1/ex1.py +++ b/2021/d06/ex1/ex1.py @@ -3,7 +3,6 @@ import itertools import sys from collections import Counter -from dataclasses import dataclass from typing import Iterator, List, TypeVar T = TypeVar("T") diff --git a/2021/d06/ex2/ex2.py b/2021/d06/ex2/ex2.py index 2e64423..bb40805 100755 --- a/2021/d06/ex2/ex2.py +++ b/2021/d06/ex2/ex2.py @@ -3,7 +3,6 @@ import itertools import sys from collections import Counter -from dataclasses import dataclass from typing import Iterator, List, TypeVar T = TypeVar("T") diff --git a/2021/d07/ex1/ex1.py b/2021/d07/ex1/ex1.py index 4205009..2b8a8a9 100755 --- a/2021/d07/ex1/ex1.py +++ b/2021/d07/ex1/ex1.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from typing import List diff --git a/2021/d07/ex2/ex2.py b/2021/d07/ex2/ex2.py index 56b818c..8eec5ef 100755 --- a/2021/d07/ex2/ex2.py +++ b/2021/d07/ex2/ex2.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from math import ceil, floor from typing import List diff --git a/2021/d08/ex2/ex2.py b/2021/d08/ex2/ex2.py index 1553e29..c22b23b 100755 --- a/2021/d08/ex2/ex2.py +++ b/2021/d08/ex2/ex2.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from dataclasses import dataclass from typing import Dict, List, Set diff --git a/2021/d09/ex1/ex1.py b/2021/d09/ex1/ex1.py index cf7d7d6..e84e893 100755 --- a/2021/d09/ex1/ex1.py +++ b/2021/d09/ex1/ex1.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from typing import Iterator, List, Tuple diff --git a/2021/d09/ex2/ex2.py b/2021/d09/ex2/ex2.py index 451883a..0311995 100755 --- a/2021/d09/ex2/ex2.py +++ b/2021/d09/ex2/ex2.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from typing import Iterator, List, Tuple diff --git a/2021/d10/ex1/ex1.py b/2021/d10/ex1/ex1.py index 4667d43..6770222 100755 --- a/2021/d10/ex1/ex1.py +++ b/2021/d10/ex1/ex1.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from typing import List, Optional, cast diff --git a/2021/d10/ex2/ex2.py b/2021/d10/ex2/ex2.py index 27de8ac..d100b0f 100755 --- a/2021/d10/ex2/ex2.py +++ b/2021/d10/ex2/ex2.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from typing import Iterator, List, Optional diff --git a/2021/d11/ex1/ex1.py b/2021/d11/ex1/ex1.py index 619bd27..c6bf0be 100755 --- a/2021/d11/ex1/ex1.py +++ b/2021/d11/ex1/ex1.py @@ -2,7 +2,6 @@ import itertools import sys -from copy import deepcopy from typing import Iterator, List, Set, Tuple Grid = List[List[int]] diff --git a/2021/d11/ex2/ex2.py b/2021/d11/ex2/ex2.py index d4ce118..8f95f55 100755 --- a/2021/d11/ex2/ex2.py +++ b/2021/d11/ex2/ex2.py @@ -2,7 +2,6 @@ import itertools import sys -from copy import deepcopy from typing import Iterator, List, Set, Tuple Grid = List[List[int]] diff --git a/2021/d12/ex1/ex1.py b/2021/d12/ex1/ex1.py index 1887c7d..6108876 100755 --- a/2021/d12/ex1/ex1.py +++ b/2021/d12/ex1/ex1.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from collections import defaultdict from typing import Dict, List, Set diff --git a/2021/d12/ex2/ex2.py b/2021/d12/ex2/ex2.py index bc5a527..b30d9b8 100755 --- a/2021/d12/ex2/ex2.py +++ b/2021/d12/ex2/ex2.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import itertools import sys from collections import defaultdict from typing import Dict, List, Set diff --git a/2021/d15/ex1/ex1.py b/2021/d15/ex1/ex1.py index d7c5e88..4399aba 100755 --- a/2021/d15/ex1/ex1.py +++ b/2021/d15/ex1/ex1.py @@ -1,9 +1,8 @@ #!/usr/bin/env python import heapq -import itertools import sys -from typing import Iterator, List, NamedTuple, Set, Tuple +from typing import Iterator, List, NamedTuple, Set class Point(NamedTuple): diff --git a/2021/d15/ex2/ex2.py b/2021/d15/ex2/ex2.py index 0fa89b8..c2bbd30 100755 --- a/2021/d15/ex2/ex2.py +++ b/2021/d15/ex2/ex2.py @@ -1,9 +1,8 @@ #!/usr/bin/env python import heapq -import itertools import sys -from typing import Iterator, List, NamedTuple, Set, Tuple +from typing import Iterator, List, NamedTuple, Set class Point(NamedTuple): diff --git a/2021/d16/ex1/ex1.py b/2021/d16/ex1/ex1.py index d65fec5..1978196 100755 --- a/2021/d16/ex1/ex1.py +++ b/2021/d16/ex1/ex1.py @@ -5,7 +5,7 @@ import functools import itertools import sys from dataclasses import dataclass -from typing import Iterable, Iterator, List, Tuple, TypeVar +from typing import Iterable, Iterator, List, Tuple RawPacket = List[bool] diff --git a/2021/d16/ex2/ex2.py b/2021/d16/ex2/ex2.py index 7ecb73a..bb9ad4e 100755 --- a/2021/d16/ex2/ex2.py +++ b/2021/d16/ex2/ex2.py @@ -6,7 +6,7 @@ import itertools import math import sys from dataclasses import dataclass -from typing import Callable, Dict, Iterable, Iterator, List, Tuple, TypeVar +from typing import Callable, Dict, Iterable, Iterator, List, Tuple RawPacket = List[bool] diff --git a/2021/d17/ex1/ex1.py b/2021/d17/ex1/ex1.py index d58a72e..00bbca2 100755 --- a/2021/d17/ex1/ex1.py +++ b/2021/d17/ex1/ex1.py @@ -1,7 +1,6 @@ #!/usr/bin/env python import itertools -import math import sys from typing import Iterator, List, NamedTuple diff --git a/2021/d17/ex2/ex2.py b/2021/d17/ex2/ex2.py index e2beb9a..bc7dab1 100755 --- a/2021/d17/ex2/ex2.py +++ b/2021/d17/ex2/ex2.py @@ -1,7 +1,5 @@ #!/usr/bin/env python -import itertools -import math import sys from typing import Iterator, List, NamedTuple diff --git a/2021/d18/ex2/ex2.py b/2021/d18/ex2/ex2.py index 56c8d48..c0a37a7 100755 --- a/2021/d18/ex2/ex2.py +++ b/2021/d18/ex2/ex2.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import functools import itertools import sys from copy import deepcopy diff --git a/2021/d19/ex1/ex1.py b/2021/d19/ex1/ex1.py index 922e709..e42af3c 100755 --- a/2021/d19/ex1/ex1.py +++ b/2021/d19/ex1/ex1.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import functools import itertools import sys from dataclasses import dataclass diff --git a/2021/d19/ex2/ex2.py b/2021/d19/ex2/ex2.py index 1ad850a..ff4f6ad 100755 --- a/2021/d19/ex2/ex2.py +++ b/2021/d19/ex2/ex2.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import functools import itertools import sys from dataclasses import dataclass diff --git a/2021/d22/ex1/ex1.py b/2021/d22/ex1/ex1.py index 662dd49..dac1513 100755 --- a/2021/d22/ex1/ex1.py +++ b/2021/d22/ex1/ex1.py @@ -3,7 +3,7 @@ import functools import itertools import sys -from typing import Iterator, List, NamedTuple, Optional, Set, Tuple, cast +from typing import List, NamedTuple, Optional, Set, Tuple class Point(NamedTuple): diff --git a/2021/d22/ex2/ex2.py b/2021/d22/ex2/ex2.py index 4753b54..3c7d2c5 100755 --- a/2021/d22/ex2/ex2.py +++ b/2021/d22/ex2/ex2.py @@ -3,7 +3,7 @@ import functools import itertools import sys -from typing import Iterator, List, NamedTuple, Optional, Set, Tuple, cast +from typing import List, NamedTuple, Optional, Set, Tuple class Point(NamedTuple): diff --git a/2021/d23/ex1/ex1.py b/2021/d23/ex1/ex1.py index 4d585cd..0b99d71 100755 --- a/2021/d23/ex1/ex1.py +++ b/2021/d23/ex1/ex1.py @@ -3,7 +3,7 @@ import enum import functools import sys -from typing import Iterator, List, NamedTuple, Optional, Tuple, cast +from typing import Iterator, List, NamedTuple, Optional, Tuple class Point(NamedTuple): diff --git a/2021/d23/ex2/ex2.py b/2021/d23/ex2/ex2.py index 1ea1d8f..8c077d9 100755 --- a/2021/d23/ex2/ex2.py +++ b/2021/d23/ex2/ex2.py @@ -3,7 +3,7 @@ import enum import functools import sys -from typing import Iterator, List, NamedTuple, Optional, Tuple, cast +from typing import Iterator, List, NamedTuple, Optional, Tuple class Point(NamedTuple): diff --git a/2021/d25/ex1/ex1.py b/2021/d25/ex1/ex1.py index 6a2aef8..5d6f612 100755 --- a/2021/d25/ex1/ex1.py +++ b/2021/d25/ex1/ex1.py @@ -1,9 +1,8 @@ #!/usr/bin/env python -import enum import itertools import sys -from typing import Iterable, Iterator, List, NamedTuple, Set +from typing import List, NamedTuple, Set class Point(NamedTuple): @@ -64,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/2022/d18/ex2/ex2.py b/2022/d18/ex2/ex2.py index 6f7bfcb..57f8b5a 100755 --- a/2022/d18/ex2/ex2.py +++ b/2022/d18/ex2/ex2.py @@ -2,7 +2,6 @@ import itertools import sys -from collections import deque from collections.abc import Iterator from typing import NamedTuple diff --git a/2022/d21/ex1/ex1.py b/2022/d21/ex1/ex1.py index 7c12836..e9c4727 100755 --- a/2022/d21/ex1/ex1.py +++ b/2022/d21/ex1/ex1.py @@ -25,7 +25,7 @@ class Operator(str, enum.Enum): class Monkey: def get_value(self, monkeys: dict[str, "Monkey"]) -> int: - raise NotImplemented + raise NotImplementedError @dataclasses.dataclass diff --git a/2022/d21/ex2/ex2.py b/2022/d21/ex2/ex2.py index ec9ca8d..386a187 100755 --- a/2022/d21/ex2/ex2.py +++ b/2022/d21/ex2/ex2.py @@ -93,7 +93,7 @@ class MathObserver: class Monkey: def get_value(self, monkeys: dict[str, "Monkey"]) -> Num: - raise NotImplemented + raise NotImplementedError @dataclasses.dataclass diff --git a/2023/d02/ex2/ex2.py b/2023/d02/ex2/ex2.py index 309753e..32c3a34 100755 --- a/2023/d02/ex2/ex2.py +++ b/2023/d02/ex2/ex2.py @@ -1,8 +1,6 @@ #!/usr/bin/env python -import functools import math -import operator as op import sys from collections import Counter from enum import StrEnum diff --git a/2023/d14/ex2/ex2.py b/2023/d14/ex2/ex2.py index 090724f..b7b0222 100755 --- a/2023/d14/ex2/ex2.py +++ b/2023/d14/ex2/ex2.py @@ -1,6 +1,5 @@ #!/usr/bin/env python -import dataclasses import itertools import sys from enum import StrEnum diff --git a/2023/d17/ex2/ex2.py b/2023/d17/ex2/ex2.py index a643534..f4cfc6e 100755 --- a/2023/d17/ex2/ex2.py +++ b/2023/d17/ex2/ex2.py @@ -2,7 +2,6 @@ import functools import heapq -import itertools import sys from collections.abc import Iterator from enum import Enum diff --git a/2024/d01/ex1/ex1.py b/2024/d01/ex1/ex1.py new file mode 100755 index 0000000..df14c6a --- /dev/null +++ b/2024/d01/ex1/ex1.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> tuple[list[int], list[int]]: + left, right = [], [] + for line in input: + lhs, rhs = line.split() + left.append(int(lhs)) + right.append(int(rhs)) + return left, right + + left, right = parse(input) + return sum(abs(lhs - rhs) for lhs, rhs in zip(sorted(left), sorted(right))) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2024/d01/ex1/input b/2024/d01/ex1/input new file mode 100644 index 0000000..9739f09 --- /dev/null +++ b/2024/d01/ex1/input @@ -0,0 +1,1000 @@ +15131 78158 +32438 35057 +12503 57702 +73808 43128 +57168 71761 +97870 29344 +18072 79079 +55097 92997 +36615 67927 +63626 85851 +19535 91599 +20386 53482 +32817 55364 +90111 84813 +81180 13958 +20278 82963 +71822 70030 +36650 74064 +96658 93643 +48953 12223 +87910 32104 +15586 46936 +59112 47057 +36552 32104 +54311 15545 +14521 35085 +46924 41818 +79287 17659 +91525 46171 +77523 63000 +14229 61327 +20514 77151 +30019 35029 +78834 57168 +96186 92129 +99772 60459 +62659 23209 +44811 97907 +41778 46924 +39724 54539 +56672 11103 +37872 44088 +67848 46924 +55337 58014 +48137 34267 +57761 47261 +90770 82701 +87830 32104 +14118 43916 +64511 97016 +67927 26386 +76032 55621 +46116 43948 +96284 26386 +51398 32104 +52363 45099 +84966 24105 +29725 47057 +92179 73851 +77151 57702 +31670 23131 +83560 34930 +62543 62129 +88635 55364 +14456 87507 +62848 35057 +31081 15535 +20287 11590 +58199 55876 +78634 63263 +21931 62559 +96294 23071 +18891 21157 +54875 35057 +40666 75460 +68475 71547 +93112 57702 +17780 50710 +89025 82701 +10487 77363 +14442 67828 +18287 10668 +73030 47436 +88998 81809 +47512 43866 +49438 52980 +62202 13958 +42062 33002 +35797 54746 +61308 74313 +98706 85679 +51049 29787 +96082 47057 +82102 77395 +91642 37908 +86709 16527 +11536 39339 +57804 77151 +58098 58014 +29840 37272 +68500 77570 +18840 17486 +42529 62129 +74868 62855 +48556 44088 +64424 35057 +87547 70030 +25349 55364 +24698 95115 +29610 37403 +10024 93643 +80179 44088 +86009 67277 +75396 28216 +18309 37500 +14754 67927 +98264 13958 +28294 77151 +50417 96240 +27171 12050 +79907 32187 +94597 73714 +36251 58014 +42293 43948 +22552 46924 +18765 85646 +65758 37771 +16028 74814 +15096 32104 +27990 62738 +91867 23131 +48177 62129 +43833 67927 +91992 96240 +25767 58014 +56422 35328 +39281 87024 +85701 70030 +40915 95206 +25378 23022 +17827 44745 +74880 31126 +51583 56967 +14996 82701 +24393 64040 +13557 31621 +87102 77151 +57922 50349 +18436 82701 +36961 68507 +33558 18947 +29752 24528 +88141 99508 +65521 66940 +98636 24754 +83809 23131 +13839 85851 +81470 35057 +93818 69550 +72210 82295 +10853 84284 +78121 55200 +28208 85199 +75892 13111 +62655 18720 +59696 86838 +18410 26693 +82521 30547 +68047 85199 +59444 62129 +73400 82753 +52751 25250 +94229 67927 +44728 45424 +84688 47457 +54885 53247 +66708 85987 +16610 19000 +52212 47057 +33467 90494 +11933 34797 +11426 23370 +98122 11318 +24974 98740 +89866 61735 +63042 84601 +97878 62129 +86324 88329 +93550 65587 +21893 32872 +32422 82701 +97593 95724 +79956 43017 +18574 66940 +69417 70030 +20527 62986 +32901 78479 +76892 14216 +80784 20119 +70030 46924 +45455 19210 +84089 55364 +51290 32104 +78084 35819 +19446 43664 +83281 82701 +88850 60032 +41737 26655 +28334 87060 +57007 63359 +35230 79052 +97142 62408 +71663 44088 +21967 56111 +73266 70030 +37751 73992 +71909 10908 +49256 76543 +87879 10005 +18958 99715 +33674 26386 +88578 16115 +38184 92129 +23162 94507 +94689 27138 +50188 23236 +73498 92740 +80946 14521 +20434 62129 +96199 54539 +97269 74914 +75164 56409 +63802 46857 +85851 39471 +13886 21128 +82608 43875 +47631 35057 +41955 83525 +41722 49739 +80210 73310 +72032 29229 +99588 19663 +75340 68873 +72016 64274 +87488 54539 +54539 89609 +92646 49227 +92493 92129 +51219 62129 +94294 66940 +35339 82701 +60625 25516 +71044 38554 +65428 57974 +47057 38596 +79756 64175 +25694 69619 +96457 13207 +13870 77151 +61984 33464 +14480 55364 +31924 14216 +33548 35819 +66463 52868 +36209 21830 +38146 62515 +43109 93643 +39326 73266 +67802 83861 +80246 93894 +32312 70030 +67288 20405 +11591 84936 +17019 49240 +45637 58014 +63060 82442 +96782 87050 +49139 57325 +13278 38425 +10622 58014 +70609 55364 +37494 57385 +50253 77151 +30770 88060 +48235 27041 +77045 46924 +36713 60284 +36647 73266 +21913 37190 +84907 76623 +83140 58014 +40049 38908 +96240 49588 +91375 20178 +44851 53224 +85957 77812 +31141 62129 +73469 75003 +54379 73141 +90253 26386 +37361 83861 +77965 86183 +44088 98740 +65748 44088 +92167 27474 +34050 39710 +53845 35057 +39439 70030 +56254 80666 +81736 35057 +22481 41619 +94515 47057 +40865 47438 +94090 94307 +25243 99699 +70472 44088 +92113 36000 +84122 44088 +75877 47057 +46967 98088 +89199 62129 +45284 61031 +25894 24258 +81546 49603 +18098 62129 +35845 58264 +30136 84643 +79351 85199 +91114 29608 +10796 73266 +80157 13958 +13776 34799 +32867 82701 +72659 83316 +70346 32104 +82707 26071 +93643 88453 +56487 73266 +17461 80601 +74189 35819 +89473 80231 +89648 29082 +21185 91451 +45756 24922 +13958 92570 +49766 46924 +71014 15764 +78218 47624 +36683 52276 +12805 18935 +89940 75569 +92619 62002 +26109 85199 +85199 47057 +74790 77094 +61077 44984 +21011 24325 +91299 35819 +13145 92130 +74616 25253 +68242 57168 +88099 29422 +98816 50970 +92627 32104 +60619 54539 +18592 99696 +97961 85199 +37971 86471 +76808 65290 +26960 44025 +21159 18065 +21820 51610 +87396 13958 +51739 69215 +36150 67927 +36428 77167 +81368 85546 +36684 74331 +87943 57127 +83934 39052 +93369 57168 +25759 23805 +90295 85638 +33748 35057 +23965 56026 +18136 47566 +97136 87779 +11751 98740 +77584 72651 +47535 14216 +35157 40935 +38666 20886 +49584 34431 +70553 57619 +41660 90498 +34861 70030 +97329 82739 +83411 32104 +74970 72228 +36340 26425 +40870 92129 +96019 35057 +35996 62535 +35750 17289 +44648 26386 +14216 68378 +41202 76995 +28670 44197 +12646 99599 +30412 91461 +18596 74757 +38836 73266 +63846 70555 +84175 23131 +36177 25567 +76440 41764 +89469 30895 +28950 43948 +93707 70030 +93976 73909 +15262 31486 +86652 23131 +65454 88787 +76119 46924 +44343 98685 +29424 46693 +97543 32104 +73497 76030 +87093 58014 +49551 16528 +45191 73266 +21283 34339 +27141 73266 +20255 57702 +48823 35838 +74136 57964 +18194 80112 +37794 96240 +46775 98740 +52309 42291 +12317 39213 +98269 96240 +82747 89172 +28972 54579 +40842 85851 +24862 46924 +90115 29514 +97189 85851 +60429 85233 +35563 99130 +42174 69145 +62129 12281 +87307 72432 +54431 47057 +32208 43948 +36159 92837 +92813 16218 +30956 87764 +81881 16847 +82389 14216 +81627 46027 +12133 59074 +83315 88230 +17677 82701 +11309 32104 +24911 35927 +77700 98147 +43948 53055 +82304 22718 +94870 55364 +67575 85199 +49305 93182 +15751 15044 +66060 26171 +30935 41610 +28356 32565 +18811 12256 +64019 23131 +34225 17638 +15964 13958 +21017 44088 +34116 81436 +52676 32857 +95338 16079 +78527 46924 +93795 85851 +12924 64525 +85065 79359 +45073 47356 +30072 43948 +98834 32104 +57372 73266 +83929 79432 +90423 82701 +22832 98740 +48430 59406 +73629 93643 +26263 94506 +94074 14216 +26414 98740 +56951 55364 +50559 43948 +63550 31546 +90368 63317 +32146 46924 +47438 57185 +58449 43948 +47368 85851 +32574 15690 +83798 92129 +14115 48770 +81573 66940 +51307 52219 +13174 47057 +36828 67828 +38526 44088 +44179 54539 +52115 89989 +78802 62495 +34661 14805 +32323 59466 +27132 30442 +79104 63409 +63502 46386 +97485 55364 +93125 45846 +22160 14216 +94150 21543 +16960 75856 +41717 62129 +16797 13241 +16286 31406 +81133 73266 +62615 36776 +38433 47057 +17558 77268 +31164 99409 +98740 37183 +16053 46924 +83861 14216 +89754 14216 +90249 14216 +45631 44427 +79425 67927 +41085 82701 +61288 93605 +66018 98413 +22664 49595 +48544 78826 +24552 57029 +13795 59246 +17199 69353 +33038 93573 +37670 50912 +22237 40613 +93548 92536 +71344 90698 +95400 97202 +16457 29422 +79172 12325 +87249 25678 +32398 57782 +42920 65021 +20491 17593 +29343 15560 +51134 56929 +87045 18964 +16859 67927 +50451 23131 +88013 99947 +79869 26386 +17158 13958 +47399 93686 +32349 20008 +88683 69537 +49926 93643 +86432 89768 +82719 35057 +56739 92864 +95877 43633 +69037 59576 +95747 72337 +15660 23131 +13684 67506 +87807 24977 +45695 44088 +14570 23131 +45507 96958 +79826 46189 +86233 96377 +57051 96244 +16227 70718 +66940 87229 +16621 77709 +67736 19049 +36049 43120 +27324 13585 +89099 46924 +80234 73266 +30105 82570 +42497 85199 +20275 47057 +84842 67828 +18545 31766 +22010 89576 +44172 33974 +11085 32612 +48341 28004 +94313 14216 +65788 46924 +27317 92981 +68318 70030 +56329 60704 +29327 91745 +53630 57702 +24518 82701 +96364 81945 +95503 47057 +41188 40000 +16708 20405 +31294 30878 +33264 98085 +64245 96240 +14497 26073 +77398 21420 +16427 72248 +26395 46924 +22620 93997 +17321 12686 +26035 72607 +58951 54463 +38225 30571 +89267 35057 +30825 66365 +98399 67169 +80743 46924 +80557 91342 +35024 72939 +53184 15700 +71001 47443 +97339 33591 +96913 78805 +42578 73266 +53465 82681 +74719 75723 +96923 58014 +92916 71872 +26229 14521 +42662 96240 +81620 47057 +46956 29400 +39197 98476 +30330 45605 +57702 20507 +82062 62129 +37754 10380 +97560 40495 +45988 54539 +42413 38989 +58786 26969 +41724 60576 +55364 69527 +64004 44088 +87772 31704 +65614 23131 +44781 53388 +78305 40217 +32629 36036 +78238 51508 +61460 14216 +46112 96240 +61748 90420 +41222 62129 +14622 23131 +12228 54539 +95242 60673 +46228 69114 +80525 75711 +45245 46098 +67491 58014 +52166 83687 +38396 67828 +31358 43948 +55034 37772 +56827 46924 +79835 93798 +89347 58014 +82227 18043 +63832 32104 +62004 10083 +26506 92531 +69651 29640 +72433 82716 +40513 63891 +18717 92129 +30405 23131 +74331 44088 +72157 67849 +74767 54539 +30847 35819 +18242 20586 +69756 67844 +72005 57702 +92985 86192 +35084 52372 +73020 92992 +48804 93643 +75034 57702 +67280 55364 +13826 44088 +58014 28935 +26965 41912 +32785 70621 +67828 88974 +24669 12565 +83563 46791 +24440 98740 +85814 99882 +96689 89250 +83424 99433 +86597 92129 +35057 19703 +90254 75605 +27503 45668 +80689 57779 +85142 43542 +47144 32104 +81029 55196 +88306 85851 +44736 91531 +44675 70030 +56611 75708 +99455 48355 +76675 46015 +58779 43948 +87090 93643 +28546 78920 +60401 31361 +25679 91728 +40839 57168 +36746 43948 +79132 82701 +66132 61087 +68819 36117 +36538 12235 +27205 76760 +24399 23139 +44240 45473 +35819 96240 +12508 99554 +76682 43948 +92401 85296 +86766 41706 +96643 27209 +53030 85851 +10426 29096 +47697 20405 +68686 82701 +55276 98740 +88787 14521 +68667 54484 +88551 82701 +86242 93860 +33643 17327 +19228 49220 +94076 63820 +66464 95977 +32020 57329 +39310 47057 +45805 82325 +62915 96018 +13011 60296 +88834 40986 +82701 44460 +79163 37444 +57767 47909 +21571 56724 +48453 66228 +92533 20251 +71231 43948 +26769 54336 +71828 96240 +14891 30317 +92462 74559 +57405 62129 +64689 45242 +14673 75437 +37392 12408 +88004 68886 +11897 85851 +35121 19747 +65978 46924 +59214 35819 +69160 82701 +86199 78031 +84182 79283 +46746 70030 +93280 31194 +78233 42061 +31751 44088 +92129 41105 +81082 44088 +69123 85851 +20505 66320 +41538 43948 +64819 28581 +20294 73266 +48547 31547 +47633 15882 +96892 58776 +22150 41774 +18701 93643 +61229 42035 +78415 32104 +66928 65236 +35556 79431 +33671 62129 +96468 87478 +50427 58131 +25039 99100 +80962 32104 +69045 62129 +32104 75645 +59924 23131 +18240 70030 +88763 58014 +60348 43980 +20717 51159 +81946 79855 +20510 68239 +37273 43948 +99008 54986 +13046 53592 +87961 14216 +16856 87339 +13289 29653 +81110 65830 +25077 66583 +53154 96594 +22799 77151 +44901 98740 +80985 40597 +39889 66837 +32167 67057 +46469 19487 +42664 77151 +28717 67927 +48319 23742 +20405 63271 +99160 68742 +37312 86445 +49441 84577 +42459 77403 +76352 25777 +42818 73266 +96351 89012 +55426 69362 +44989 93643 +68109 67066 +87896 81830 +73110 89259 +41918 35819 +46805 73266 +61826 43948 +32096 54757 +26386 22428 +70847 17131 +63265 63742 +66807 18158 +29422 36229 +56355 37525 +22577 46924 +99518 44088 +16441 66929 +26818 76171 +18649 85851 +76731 61187 +30590 91024 +90428 58160 +16076 67927 +13553 37915 +91615 32416 +36190 63670 +49749 49989 +62226 58313 +25075 46700 +30720 89560 +20085 28489 +95853 74174 +94343 35819 +18518 80833 +98111 86331 +63474 33979 +24642 67927 +76558 23131 +26475 58014 +80306 58014 +92346 48193 +20270 95402 +23131 43948 +23638 60254 +86655 57352 +58258 45523 +34945 61572 +33250 96240 +84692 11925 +74810 80726 +50681 52269 +79610 73266 +30424 17447 +14983 82701 +37491 93643 +36576 73266 +31400 92479 +74498 62129 +19311 85090 +78393 54666 +44638 35057 +71239 35819 +33836 77370 +87014 35057 +49752 31956 +89676 85199 +31538 14521 +54931 18949 +78700 85199 +57624 83620 +55476 42249 +36922 23131 +83133 96903 +33766 38715 +90922 92129 +84184 85199 +84873 98740 +30986 46301 +66208 66981 +76128 44088 +54499 46924 +11089 73266 +63966 66921 +24165 60756 +65766 13958 +98485 92129 +31557 32104 +62423 44088 +54888 52459 +61829 75842 +26964 63459 +63722 32104 +71060 45395 +60721 85952 +14154 56940 +71805 82701 +74964 80051 +23705 85348 +27306 30788 +57026 35057 +95790 30087 +47055 67481 +20026 75622 +92097 12792 +22924 38758 +30454 42427 +77910 99903 +20644 30998 +51589 39385 +83392 76104 +92902 93643 +44609 42484 +82287 20771 +88814 15393 +39082 73266 +37969 85199 +57693 96633 +43012 93643 +29944 78876 +68317 66940 +33738 58014 +17794 98740 +41165 47180 +14871 41373 +42771 43164 +82391 29055 +79484 53019 +58189 29804 +19422 82701 +48923 83734 +76839 85851 +71377 23080 +50558 44088 +25393 45650 +39296 84954 +84189 57168 +85258 22386 +30912 13039 +77881 48653 +67451 46924 +47082 89946 +91778 85851 +99760 37363 diff --git a/2024/d01/ex2/ex2.py b/2024/d01/ex2/ex2.py new file mode 100755 index 0000000..2f51f10 --- /dev/null +++ b/2024/d01/ex2/ex2.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import sys + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> tuple[list[int], list[int]]: + left, right = [], [] + for line in input: + lhs, rhs = line.split() + left.append(int(lhs)) + right.append(int(rhs)) + return left, right + + left, right = parse(input) + return sum(lhs * right.count(lhs) for lhs in left) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2024/d01/ex2/input b/2024/d01/ex2/input new file mode 100644 index 0000000..9739f09 --- /dev/null +++ b/2024/d01/ex2/input @@ -0,0 +1,1000 @@ +15131 78158 +32438 35057 +12503 57702 +73808 43128 +57168 71761 +97870 29344 +18072 79079 +55097 92997 +36615 67927 +63626 85851 +19535 91599 +20386 53482 +32817 55364 +90111 84813 +81180 13958 +20278 82963 +71822 70030 +36650 74064 +96658 93643 +48953 12223 +87910 32104 +15586 46936 +59112 47057 +36552 32104 +54311 15545 +14521 35085 +46924 41818 +79287 17659 +91525 46171 +77523 63000 +14229 61327 +20514 77151 +30019 35029 +78834 57168 +96186 92129 +99772 60459 +62659 23209 +44811 97907 +41778 46924 +39724 54539 +56672 11103 +37872 44088 +67848 46924 +55337 58014 +48137 34267 +57761 47261 +90770 82701 +87830 32104 +14118 43916 +64511 97016 +67927 26386 +76032 55621 +46116 43948 +96284 26386 +51398 32104 +52363 45099 +84966 24105 +29725 47057 +92179 73851 +77151 57702 +31670 23131 +83560 34930 +62543 62129 +88635 55364 +14456 87507 +62848 35057 +31081 15535 +20287 11590 +58199 55876 +78634 63263 +21931 62559 +96294 23071 +18891 21157 +54875 35057 +40666 75460 +68475 71547 +93112 57702 +17780 50710 +89025 82701 +10487 77363 +14442 67828 +18287 10668 +73030 47436 +88998 81809 +47512 43866 +49438 52980 +62202 13958 +42062 33002 +35797 54746 +61308 74313 +98706 85679 +51049 29787 +96082 47057 +82102 77395 +91642 37908 +86709 16527 +11536 39339 +57804 77151 +58098 58014 +29840 37272 +68500 77570 +18840 17486 +42529 62129 +74868 62855 +48556 44088 +64424 35057 +87547 70030 +25349 55364 +24698 95115 +29610 37403 +10024 93643 +80179 44088 +86009 67277 +75396 28216 +18309 37500 +14754 67927 +98264 13958 +28294 77151 +50417 96240 +27171 12050 +79907 32187 +94597 73714 +36251 58014 +42293 43948 +22552 46924 +18765 85646 +65758 37771 +16028 74814 +15096 32104 +27990 62738 +91867 23131 +48177 62129 +43833 67927 +91992 96240 +25767 58014 +56422 35328 +39281 87024 +85701 70030 +40915 95206 +25378 23022 +17827 44745 +74880 31126 +51583 56967 +14996 82701 +24393 64040 +13557 31621 +87102 77151 +57922 50349 +18436 82701 +36961 68507 +33558 18947 +29752 24528 +88141 99508 +65521 66940 +98636 24754 +83809 23131 +13839 85851 +81470 35057 +93818 69550 +72210 82295 +10853 84284 +78121 55200 +28208 85199 +75892 13111 +62655 18720 +59696 86838 +18410 26693 +82521 30547 +68047 85199 +59444 62129 +73400 82753 +52751 25250 +94229 67927 +44728 45424 +84688 47457 +54885 53247 +66708 85987 +16610 19000 +52212 47057 +33467 90494 +11933 34797 +11426 23370 +98122 11318 +24974 98740 +89866 61735 +63042 84601 +97878 62129 +86324 88329 +93550 65587 +21893 32872 +32422 82701 +97593 95724 +79956 43017 +18574 66940 +69417 70030 +20527 62986 +32901 78479 +76892 14216 +80784 20119 +70030 46924 +45455 19210 +84089 55364 +51290 32104 +78084 35819 +19446 43664 +83281 82701 +88850 60032 +41737 26655 +28334 87060 +57007 63359 +35230 79052 +97142 62408 +71663 44088 +21967 56111 +73266 70030 +37751 73992 +71909 10908 +49256 76543 +87879 10005 +18958 99715 +33674 26386 +88578 16115 +38184 92129 +23162 94507 +94689 27138 +50188 23236 +73498 92740 +80946 14521 +20434 62129 +96199 54539 +97269 74914 +75164 56409 +63802 46857 +85851 39471 +13886 21128 +82608 43875 +47631 35057 +41955 83525 +41722 49739 +80210 73310 +72032 29229 +99588 19663 +75340 68873 +72016 64274 +87488 54539 +54539 89609 +92646 49227 +92493 92129 +51219 62129 +94294 66940 +35339 82701 +60625 25516 +71044 38554 +65428 57974 +47057 38596 +79756 64175 +25694 69619 +96457 13207 +13870 77151 +61984 33464 +14480 55364 +31924 14216 +33548 35819 +66463 52868 +36209 21830 +38146 62515 +43109 93643 +39326 73266 +67802 83861 +80246 93894 +32312 70030 +67288 20405 +11591 84936 +17019 49240 +45637 58014 +63060 82442 +96782 87050 +49139 57325 +13278 38425 +10622 58014 +70609 55364 +37494 57385 +50253 77151 +30770 88060 +48235 27041 +77045 46924 +36713 60284 +36647 73266 +21913 37190 +84907 76623 +83140 58014 +40049 38908 +96240 49588 +91375 20178 +44851 53224 +85957 77812 +31141 62129 +73469 75003 +54379 73141 +90253 26386 +37361 83861 +77965 86183 +44088 98740 +65748 44088 +92167 27474 +34050 39710 +53845 35057 +39439 70030 +56254 80666 +81736 35057 +22481 41619 +94515 47057 +40865 47438 +94090 94307 +25243 99699 +70472 44088 +92113 36000 +84122 44088 +75877 47057 +46967 98088 +89199 62129 +45284 61031 +25894 24258 +81546 49603 +18098 62129 +35845 58264 +30136 84643 +79351 85199 +91114 29608 +10796 73266 +80157 13958 +13776 34799 +32867 82701 +72659 83316 +70346 32104 +82707 26071 +93643 88453 +56487 73266 +17461 80601 +74189 35819 +89473 80231 +89648 29082 +21185 91451 +45756 24922 +13958 92570 +49766 46924 +71014 15764 +78218 47624 +36683 52276 +12805 18935 +89940 75569 +92619 62002 +26109 85199 +85199 47057 +74790 77094 +61077 44984 +21011 24325 +91299 35819 +13145 92130 +74616 25253 +68242 57168 +88099 29422 +98816 50970 +92627 32104 +60619 54539 +18592 99696 +97961 85199 +37971 86471 +76808 65290 +26960 44025 +21159 18065 +21820 51610 +87396 13958 +51739 69215 +36150 67927 +36428 77167 +81368 85546 +36684 74331 +87943 57127 +83934 39052 +93369 57168 +25759 23805 +90295 85638 +33748 35057 +23965 56026 +18136 47566 +97136 87779 +11751 98740 +77584 72651 +47535 14216 +35157 40935 +38666 20886 +49584 34431 +70553 57619 +41660 90498 +34861 70030 +97329 82739 +83411 32104 +74970 72228 +36340 26425 +40870 92129 +96019 35057 +35996 62535 +35750 17289 +44648 26386 +14216 68378 +41202 76995 +28670 44197 +12646 99599 +30412 91461 +18596 74757 +38836 73266 +63846 70555 +84175 23131 +36177 25567 +76440 41764 +89469 30895 +28950 43948 +93707 70030 +93976 73909 +15262 31486 +86652 23131 +65454 88787 +76119 46924 +44343 98685 +29424 46693 +97543 32104 +73497 76030 +87093 58014 +49551 16528 +45191 73266 +21283 34339 +27141 73266 +20255 57702 +48823 35838 +74136 57964 +18194 80112 +37794 96240 +46775 98740 +52309 42291 +12317 39213 +98269 96240 +82747 89172 +28972 54579 +40842 85851 +24862 46924 +90115 29514 +97189 85851 +60429 85233 +35563 99130 +42174 69145 +62129 12281 +87307 72432 +54431 47057 +32208 43948 +36159 92837 +92813 16218 +30956 87764 +81881 16847 +82389 14216 +81627 46027 +12133 59074 +83315 88230 +17677 82701 +11309 32104 +24911 35927 +77700 98147 +43948 53055 +82304 22718 +94870 55364 +67575 85199 +49305 93182 +15751 15044 +66060 26171 +30935 41610 +28356 32565 +18811 12256 +64019 23131 +34225 17638 +15964 13958 +21017 44088 +34116 81436 +52676 32857 +95338 16079 +78527 46924 +93795 85851 +12924 64525 +85065 79359 +45073 47356 +30072 43948 +98834 32104 +57372 73266 +83929 79432 +90423 82701 +22832 98740 +48430 59406 +73629 93643 +26263 94506 +94074 14216 +26414 98740 +56951 55364 +50559 43948 +63550 31546 +90368 63317 +32146 46924 +47438 57185 +58449 43948 +47368 85851 +32574 15690 +83798 92129 +14115 48770 +81573 66940 +51307 52219 +13174 47057 +36828 67828 +38526 44088 +44179 54539 +52115 89989 +78802 62495 +34661 14805 +32323 59466 +27132 30442 +79104 63409 +63502 46386 +97485 55364 +93125 45846 +22160 14216 +94150 21543 +16960 75856 +41717 62129 +16797 13241 +16286 31406 +81133 73266 +62615 36776 +38433 47057 +17558 77268 +31164 99409 +98740 37183 +16053 46924 +83861 14216 +89754 14216 +90249 14216 +45631 44427 +79425 67927 +41085 82701 +61288 93605 +66018 98413 +22664 49595 +48544 78826 +24552 57029 +13795 59246 +17199 69353 +33038 93573 +37670 50912 +22237 40613 +93548 92536 +71344 90698 +95400 97202 +16457 29422 +79172 12325 +87249 25678 +32398 57782 +42920 65021 +20491 17593 +29343 15560 +51134 56929 +87045 18964 +16859 67927 +50451 23131 +88013 99947 +79869 26386 +17158 13958 +47399 93686 +32349 20008 +88683 69537 +49926 93643 +86432 89768 +82719 35057 +56739 92864 +95877 43633 +69037 59576 +95747 72337 +15660 23131 +13684 67506 +87807 24977 +45695 44088 +14570 23131 +45507 96958 +79826 46189 +86233 96377 +57051 96244 +16227 70718 +66940 87229 +16621 77709 +67736 19049 +36049 43120 +27324 13585 +89099 46924 +80234 73266 +30105 82570 +42497 85199 +20275 47057 +84842 67828 +18545 31766 +22010 89576 +44172 33974 +11085 32612 +48341 28004 +94313 14216 +65788 46924 +27317 92981 +68318 70030 +56329 60704 +29327 91745 +53630 57702 +24518 82701 +96364 81945 +95503 47057 +41188 40000 +16708 20405 +31294 30878 +33264 98085 +64245 96240 +14497 26073 +77398 21420 +16427 72248 +26395 46924 +22620 93997 +17321 12686 +26035 72607 +58951 54463 +38225 30571 +89267 35057 +30825 66365 +98399 67169 +80743 46924 +80557 91342 +35024 72939 +53184 15700 +71001 47443 +97339 33591 +96913 78805 +42578 73266 +53465 82681 +74719 75723 +96923 58014 +92916 71872 +26229 14521 +42662 96240 +81620 47057 +46956 29400 +39197 98476 +30330 45605 +57702 20507 +82062 62129 +37754 10380 +97560 40495 +45988 54539 +42413 38989 +58786 26969 +41724 60576 +55364 69527 +64004 44088 +87772 31704 +65614 23131 +44781 53388 +78305 40217 +32629 36036 +78238 51508 +61460 14216 +46112 96240 +61748 90420 +41222 62129 +14622 23131 +12228 54539 +95242 60673 +46228 69114 +80525 75711 +45245 46098 +67491 58014 +52166 83687 +38396 67828 +31358 43948 +55034 37772 +56827 46924 +79835 93798 +89347 58014 +82227 18043 +63832 32104 +62004 10083 +26506 92531 +69651 29640 +72433 82716 +40513 63891 +18717 92129 +30405 23131 +74331 44088 +72157 67849 +74767 54539 +30847 35819 +18242 20586 +69756 67844 +72005 57702 +92985 86192 +35084 52372 +73020 92992 +48804 93643 +75034 57702 +67280 55364 +13826 44088 +58014 28935 +26965 41912 +32785 70621 +67828 88974 +24669 12565 +83563 46791 +24440 98740 +85814 99882 +96689 89250 +83424 99433 +86597 92129 +35057 19703 +90254 75605 +27503 45668 +80689 57779 +85142 43542 +47144 32104 +81029 55196 +88306 85851 +44736 91531 +44675 70030 +56611 75708 +99455 48355 +76675 46015 +58779 43948 +87090 93643 +28546 78920 +60401 31361 +25679 91728 +40839 57168 +36746 43948 +79132 82701 +66132 61087 +68819 36117 +36538 12235 +27205 76760 +24399 23139 +44240 45473 +35819 96240 +12508 99554 +76682 43948 +92401 85296 +86766 41706 +96643 27209 +53030 85851 +10426 29096 +47697 20405 +68686 82701 +55276 98740 +88787 14521 +68667 54484 +88551 82701 +86242 93860 +33643 17327 +19228 49220 +94076 63820 +66464 95977 +32020 57329 +39310 47057 +45805 82325 +62915 96018 +13011 60296 +88834 40986 +82701 44460 +79163 37444 +57767 47909 +21571 56724 +48453 66228 +92533 20251 +71231 43948 +26769 54336 +71828 96240 +14891 30317 +92462 74559 +57405 62129 +64689 45242 +14673 75437 +37392 12408 +88004 68886 +11897 85851 +35121 19747 +65978 46924 +59214 35819 +69160 82701 +86199 78031 +84182 79283 +46746 70030 +93280 31194 +78233 42061 +31751 44088 +92129 41105 +81082 44088 +69123 85851 +20505 66320 +41538 43948 +64819 28581 +20294 73266 +48547 31547 +47633 15882 +96892 58776 +22150 41774 +18701 93643 +61229 42035 +78415 32104 +66928 65236 +35556 79431 +33671 62129 +96468 87478 +50427 58131 +25039 99100 +80962 32104 +69045 62129 +32104 75645 +59924 23131 +18240 70030 +88763 58014 +60348 43980 +20717 51159 +81946 79855 +20510 68239 +37273 43948 +99008 54986 +13046 53592 +87961 14216 +16856 87339 +13289 29653 +81110 65830 +25077 66583 +53154 96594 +22799 77151 +44901 98740 +80985 40597 +39889 66837 +32167 67057 +46469 19487 +42664 77151 +28717 67927 +48319 23742 +20405 63271 +99160 68742 +37312 86445 +49441 84577 +42459 77403 +76352 25777 +42818 73266 +96351 89012 +55426 69362 +44989 93643 +68109 67066 +87896 81830 +73110 89259 +41918 35819 +46805 73266 +61826 43948 +32096 54757 +26386 22428 +70847 17131 +63265 63742 +66807 18158 +29422 36229 +56355 37525 +22577 46924 +99518 44088 +16441 66929 +26818 76171 +18649 85851 +76731 61187 +30590 91024 +90428 58160 +16076 67927 +13553 37915 +91615 32416 +36190 63670 +49749 49989 +62226 58313 +25075 46700 +30720 89560 +20085 28489 +95853 74174 +94343 35819 +18518 80833 +98111 86331 +63474 33979 +24642 67927 +76558 23131 +26475 58014 +80306 58014 +92346 48193 +20270 95402 +23131 43948 +23638 60254 +86655 57352 +58258 45523 +34945 61572 +33250 96240 +84692 11925 +74810 80726 +50681 52269 +79610 73266 +30424 17447 +14983 82701 +37491 93643 +36576 73266 +31400 92479 +74498 62129 +19311 85090 +78393 54666 +44638 35057 +71239 35819 +33836 77370 +87014 35057 +49752 31956 +89676 85199 +31538 14521 +54931 18949 +78700 85199 +57624 83620 +55476 42249 +36922 23131 +83133 96903 +33766 38715 +90922 92129 +84184 85199 +84873 98740 +30986 46301 +66208 66981 +76128 44088 +54499 46924 +11089 73266 +63966 66921 +24165 60756 +65766 13958 +98485 92129 +31557 32104 +62423 44088 +54888 52459 +61829 75842 +26964 63459 +63722 32104 +71060 45395 +60721 85952 +14154 56940 +71805 82701 +74964 80051 +23705 85348 +27306 30788 +57026 35057 +95790 30087 +47055 67481 +20026 75622 +92097 12792 +22924 38758 +30454 42427 +77910 99903 +20644 30998 +51589 39385 +83392 76104 +92902 93643 +44609 42484 +82287 20771 +88814 15393 +39082 73266 +37969 85199 +57693 96633 +43012 93643 +29944 78876 +68317 66940 +33738 58014 +17794 98740 +41165 47180 +14871 41373 +42771 43164 +82391 29055 +79484 53019 +58189 29804 +19422 82701 +48923 83734 +76839 85851 +71377 23080 +50558 44088 +25393 45650 +39296 84954 +84189 57168 +85258 22386 +30912 13039 +77881 48653 +67451 46924 +47082 89946 +91778 85851 +99760 37363 diff --git a/2024/d02/ex1/ex1.py b/2024/d02/ex1/ex1.py new file mode 100755 index 0000000..053df71 --- /dev/null +++ b/2024/d02/ex1/ex1.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python + +import itertools +import sys + +Report = list[int] + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> list[Report]: + return [[int(n) for n in line.split()] for line in input] + + def is_safe(report: Report) -> bool: + def is_increasing_safe(report: Report): + for a, b in itertools.pairwise(report): + if not 1 <= (b - a) <= 3: + return False + return True + + return is_increasing_safe(report) or is_increasing_safe(report[::-1]) + + return sum(is_safe(report) for report in parse(input)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2024/d02/ex1/input b/2024/d02/ex1/input new file mode 100644 index 0000000..b046d53 --- /dev/null +++ b/2024/d02/ex1/input @@ -0,0 +1,1000 @@ +2 5 6 8 6 +87 89 90 93 96 99 99 +13 14 15 18 19 23 +67 69 71 72 73 76 82 +29 32 30 31 34 35 37 +54 56 54 57 54 +70 73 75 74 77 79 81 81 +53 55 56 59 62 61 65 +90 93 95 92 99 +58 61 61 64 67 +36 37 37 39 42 39 +32 35 38 40 40 40 +17 19 19 21 22 23 25 29 +9 11 12 12 14 20 +20 22 26 27 28 29 +75 78 82 84 87 84 +78 79 83 85 88 91 91 +30 31 32 36 40 +68 69 72 76 79 82 88 +29 31 37 38 40 43 45 46 +23 26 31 34 32 +59 61 62 69 72 72 +39 40 42 49 50 53 55 59 +60 61 63 68 71 78 +27 25 26 27 30 31 +92 89 90 91 92 91 +25 24 26 28 28 +45 44 47 49 52 56 +45 44 47 48 55 +13 11 9 11 14 16 19 +70 69 71 68 70 73 72 +25 24 26 27 29 28 28 +43 41 43 42 43 44 48 +15 13 15 14 16 19 24 +26 23 26 28 28 31 +81 79 79 81 84 85 84 +15 12 15 15 15 +83 82 85 85 87 91 +33 31 32 32 39 +84 82 85 89 90 +67 64 67 71 72 75 78 76 +17 15 19 22 23 25 25 +44 42 43 47 51 +6 3 7 8 9 16 +39 36 38 43 44 45 48 50 +93 92 93 98 99 96 +19 16 19 20 22 25 31 31 +56 53 55 60 61 62 65 69 +19 18 21 23 28 30 35 +84 84 85 86 89 +44 44 45 48 47 +48 48 50 53 53 +84 84 85 86 89 91 94 98 +21 21 23 24 26 33 +38 38 40 37 39 +41 41 43 40 37 +6 6 3 6 9 10 10 +32 32 34 35 36 35 37 41 +54 54 52 53 55 56 61 +86 86 88 88 91 92 95 96 +42 42 42 43 44 46 47 46 +24 24 24 26 27 28 28 +38 38 39 39 43 +21 21 24 27 27 28 33 +52 52 54 57 61 62 +60 60 61 65 64 +45 45 46 47 51 54 57 57 +27 27 31 33 34 37 38 42 +21 21 22 26 27 34 +52 52 58 59 60 63 65 66 +47 47 54 56 57 56 +57 57 60 63 64 65 70 70 +39 39 42 47 50 53 56 60 +22 22 25 27 30 37 40 45 +8 12 15 16 18 19 22 +56 60 62 65 67 68 66 +78 82 83 85 88 89 89 +4 8 10 13 14 18 +80 84 86 88 90 91 96 +31 35 34 36 38 39 +33 37 40 43 44 46 43 40 +48 52 53 55 56 55 57 57 +66 70 67 68 69 72 76 +63 67 70 71 73 74 72 78 +36 40 40 43 45 +1 5 5 7 6 +61 65 67 68 71 74 74 74 +68 72 73 73 74 78 +37 41 42 44 44 47 48 53 +65 69 70 71 75 76 +13 17 18 20 23 27 30 27 +8 12 14 18 21 22 22 +7 11 12 15 19 21 24 28 +24 28 32 35 36 41 +59 63 66 71 72 +15 19 20 26 25 +25 29 34 36 36 +32 36 37 42 43 46 48 52 +8 12 19 20 22 28 +17 24 25 28 29 31 34 +74 81 82 85 83 +67 72 73 76 77 77 +22 27 30 33 34 37 38 42 +13 19 21 24 26 28 33 +50 57 58 57 60 63 +16 21 24 26 27 25 28 27 +84 91 89 91 92 95 95 +50 56 54 57 59 60 64 +4 9 11 13 16 14 19 +14 20 23 24 24 27 +64 70 73 73 72 +40 47 48 48 51 52 55 55 +80 86 86 88 91 93 95 99 +63 70 71 71 78 +20 26 30 31 34 37 39 40 +61 68 69 73 74 77 78 77 +64 71 74 76 79 81 85 85 +14 19 21 24 28 32 +3 10 12 14 16 18 22 29 +7 12 14 17 20 23 29 31 +49 56 62 65 67 65 +68 75 80 83 85 86 89 89 +51 58 59 65 68 70 74 +44 51 54 60 62 63 66 73 +33 32 29 26 29 +53 50 49 46 46 +55 54 53 52 50 49 46 42 +18 15 14 11 8 7 1 +52 50 47 49 47 46 45 42 +11 10 7 6 9 6 4 5 +90 89 88 90 88 88 +86 85 84 81 80 81 77 +26 24 26 25 24 22 17 +34 33 30 28 28 27 24 22 +34 32 29 27 27 30 +5 4 2 1 1 1 +41 38 36 35 35 32 31 27 +90 89 89 87 86 80 +81 80 77 73 72 +60 58 57 53 51 52 +98 96 95 92 88 88 +60 59 55 54 53 51 47 +68 66 62 59 52 +34 33 28 25 22 +37 34 31 26 24 22 20 21 +90 88 87 81 81 +51 49 43 40 38 34 +41 38 37 34 32 30 23 17 +53 56 54 53 52 50 48 45 +36 37 35 34 33 32 31 33 +83 84 83 82 82 +89 90 87 86 82 +72 75 72 69 66 63 58 +19 21 20 19 17 19 16 +91 94 93 96 97 +57 59 57 54 53 55 54 54 +77 80 81 80 78 75 74 70 +81 82 79 77 76 77 71 +83 84 83 83 81 79 76 +59 62 59 57 57 60 +84 87 86 84 84 83 83 +41 43 41 38 38 34 +74 75 73 73 67 +79 82 79 77 76 75 71 69 +46 49 45 44 45 +70 71 70 66 66 +34 36 35 32 28 24 +60 61 57 54 49 +15 17 14 8 7 6 5 +17 18 16 11 14 +91 93 86 83 81 80 80 +40 41 35 33 29 +31 34 32 30 25 24 17 +71 71 70 68 67 66 +65 65 64 61 58 57 60 +37 37 35 33 30 27 26 26 +67 67 66 65 61 +86 86 85 82 81 74 +95 95 92 95 92 +58 58 55 54 56 53 54 +37 37 35 32 33 30 28 28 +56 56 53 51 48 49 45 +33 33 30 29 28 31 26 +37 37 37 35 34 31 29 +26 26 26 25 28 +67 67 67 64 64 +80 80 77 77 73 +47 47 47 44 41 36 +54 54 52 50 46 45 42 41 +52 52 50 46 43 46 +38 38 34 32 31 29 29 +99 99 97 95 91 90 89 85 +26 26 24 20 18 16 14 8 +16 16 14 11 9 4 2 +78 78 75 73 67 69 +37 37 35 28 28 +83 83 80 79 73 69 +59 59 57 55 52 47 40 +57 53 52 51 49 +45 41 40 39 37 39 +99 95 93 92 90 89 86 86 +59 55 53 50 47 43 +59 55 52 49 44 +52 48 50 48 46 +96 92 90 87 90 89 91 +60 56 54 51 52 52 +17 13 11 13 11 10 6 +66 62 61 60 63 56 +72 68 65 65 62 +45 41 38 38 39 +56 52 49 48 48 48 +58 54 51 51 50 46 +69 65 62 59 59 58 53 +93 89 88 85 81 80 +38 34 32 28 30 +22 18 17 13 11 11 +49 45 42 40 37 35 31 27 +70 66 63 60 56 51 +71 67 64 58 57 56 54 51 +89 85 78 76 73 71 70 72 +67 63 62 59 56 49 47 47 +88 84 82 75 72 69 68 64 +46 42 40 37 35 28 25 20 +79 74 73 70 68 66 64 +58 53 52 49 51 +30 24 22 19 19 +61 54 53 50 47 45 41 +75 70 67 65 59 +89 83 86 84 81 +29 24 23 20 17 18 21 +17 11 9 6 4 6 6 +93 88 90 88 84 +53 48 46 45 42 45 44 38 +22 17 14 13 10 10 9 +65 58 57 56 56 55 53 55 +35 30 29 29 26 26 +19 14 12 11 10 10 8 4 +70 65 62 60 60 59 57 51 +98 91 88 86 84 80 78 +41 36 34 30 29 31 +45 38 37 33 33 +55 49 46 42 39 36 35 31 +78 72 69 65 64 62 55 +97 91 84 82 79 77 76 +95 89 82 81 83 +43 37 35 34 28 25 24 24 +87 82 77 74 71 67 +56 49 48 45 40 39 34 +89 90 88 85 84 84 77 +35 39 41 42 43 44 41 47 +45 44 43 39 36 34 34 +9 8 12 13 15 22 +74 72 73 75 76 78 81 85 +53 53 50 52 50 48 51 +98 98 96 92 88 +87 87 84 82 83 80 78 74 +74 70 67 70 68 66 68 +78 74 71 68 64 61 56 +53 53 50 48 47 +52 47 47 44 41 40 37 37 +78 78 79 80 81 83 +76 80 79 82 83 84 88 +47 43 41 38 34 32 30 27 +43 43 42 37 36 +30 37 40 44 51 +76 82 85 89 93 +63 58 57 54 53 52 54 +40 40 40 43 46 49 49 +66 68 66 65 64 63 63 +69 69 69 72 69 +52 59 60 61 63 68 +69 64 62 60 59 54 52 45 +86 81 79 77 77 73 +63 58 56 54 53 49 +55 53 50 53 55 58 60 57 +56 62 65 63 66 67 +63 64 61 55 52 51 48 48 +67 64 67 74 78 +23 19 16 12 9 5 +17 17 14 12 9 2 +20 13 11 7 4 6 +41 37 35 30 28 25 +13 13 12 10 6 6 +34 30 28 26 24 19 +69 71 70 68 68 66 62 +93 93 92 89 88 86 81 77 +52 53 57 59 60 61 63 63 +92 91 90 87 87 84 77 +66 66 69 72 79 81 +78 73 72 73 71 70 +54 49 46 45 44 39 +64 70 73 76 77 77 +37 37 38 39 43 41 +63 67 70 76 79 81 83 83 +68 67 69 69 70 74 +57 56 55 54 50 46 +28 29 30 30 33 30 +57 55 57 60 62 65 +84 84 88 91 97 +19 19 17 15 14 13 15 +1 2 5 12 15 16 17 15 +80 87 90 91 91 93 91 +52 56 58 63 64 62 +94 90 87 85 82 79 78 76 +24 24 25 31 33 34 36 36 +80 86 86 88 93 +93 94 92 93 95 98 +17 21 23 25 25 30 +37 31 31 29 27 25 23 20 +41 34 32 29 29 27 30 +39 39 40 43 46 43 +18 18 16 16 12 +17 17 20 23 25 29 31 35 +50 50 57 58 65 +14 14 13 13 15 +45 42 43 45 50 53 +49 46 47 53 55 56 59 58 +30 32 30 28 24 20 +34 33 34 32 35 39 +62 58 56 56 53 53 +34 33 27 24 22 +37 39 32 29 26 22 +90 86 88 86 83 +34 30 27 24 18 18 +78 75 72 69 71 69 67 67 +64 64 68 69 72 73 76 76 +21 19 20 23 26 33 33 +58 54 52 49 43 45 +78 78 75 74 73 72 72 +29 31 28 29 27 24 17 +46 49 51 53 51 56 +38 38 35 33 31 24 27 +69 69 66 65 64 62 58 59 +53 59 60 67 70 +88 90 89 85 83 82 +14 14 12 11 7 +18 25 27 29 31 34 32 +70 70 73 71 71 +39 43 50 53 55 57 +95 93 95 93 92 90 88 89 +95 90 86 85 85 +30 36 40 42 43 +50 54 55 56 57 57 60 +83 84 81 79 78 80 78 +56 63 64 67 71 71 +26 25 22 20 21 +85 82 84 83 77 +69 69 69 66 60 +35 36 33 27 24 27 +29 27 24 17 16 16 +8 6 3 5 12 +23 24 23 21 20 22 +3 5 2 3 4 1 +55 55 57 59 59 66 +31 28 29 32 32 33 36 +27 33 30 31 31 +25 28 30 27 29 30 31 35 +47 50 48 51 51 +9 15 17 19 18 20 21 18 +16 15 13 14 11 10 +76 80 80 82 82 +47 42 40 37 36 36 34 27 +17 22 23 26 33 33 +48 42 40 39 42 43 +56 61 66 67 68 66 +81 78 74 71 68 67 65 60 +84 84 88 89 90 93 96 98 +84 84 83 81 79 80 73 +22 18 19 17 10 +36 42 42 44 47 50 50 +38 38 39 41 44 46 47 47 +97 92 91 90 88 81 78 75 +77 80 77 76 73 69 71 +31 30 35 38 41 48 +79 75 75 73 66 +28 32 35 39 40 43 +29 30 28 26 24 21 23 19 +65 64 68 71 72 75 +72 78 80 77 79 80 84 +62 55 54 53 48 46 45 45 +49 45 43 41 38 35 34 34 +55 53 51 51 49 48 45 48 +8 12 13 16 18 19 23 20 +72 78 82 83 82 +50 53 49 48 48 +22 26 29 32 37 43 +48 45 42 39 37 35 33 33 +64 70 73 76 80 +22 26 28 32 33 34 35 35 +75 78 79 82 88 +75 74 75 76 78 84 +10 10 12 19 23 +6 8 13 15 19 +73 71 69 68 65 66 62 +84 85 83 83 81 80 +81 81 84 81 78 76 74 +46 45 46 49 46 48 48 +65 65 62 60 60 58 57 57 +48 50 52 58 60 63 66 66 +37 34 27 26 23 22 19 21 +48 52 54 54 56 59 61 65 +43 46 44 45 46 +12 16 17 20 23 25 27 34 +40 37 37 36 32 +59 63 66 67 71 +54 54 56 55 58 62 +48 51 51 54 56 56 +45 44 40 39 37 +78 72 73 72 68 +25 21 20 18 16 18 +32 30 30 32 33 35 33 +51 53 46 44 43 42 41 36 +21 14 11 14 11 8 3 +50 50 52 50 57 +5 7 10 14 15 16 17 15 +37 38 37 34 31 +75 78 79 80 84 85 91 +29 28 25 21 20 18 16 17 +24 24 21 17 15 12 +48 44 44 43 40 +14 18 20 24 26 28 29 35 +15 14 14 17 17 +61 61 63 65 68 71 75 +56 55 57 57 63 +3 5 6 9 11 15 19 +90 83 82 78 76 75 74 73 +87 87 85 87 90 93 +67 73 75 77 83 85 90 +19 20 22 24 26 +66 64 63 61 58 55 52 +63 65 68 69 71 74 75 +63 60 58 55 52 49 46 +32 30 28 27 25 +74 73 71 70 69 68 +28 25 22 21 19 17 15 12 +59 56 54 53 50 47 +50 49 46 45 42 39 38 +57 58 60 61 62 64 +4 5 6 7 10 12 15 +6 7 10 12 14 17 +36 39 42 44 47 49 52 54 +53 51 48 45 44 43 41 +70 73 75 78 80 81 84 87 +57 58 61 64 66 67 +29 32 35 37 38 40 +31 29 26 23 21 18 16 +41 39 37 36 35 32 30 29 +93 90 89 87 84 83 82 +44 42 41 38 35 +68 65 62 60 57 56 +19 17 14 12 9 6 +33 31 29 26 23 22 +26 29 30 33 34 37 40 +23 25 28 29 31 32 35 +63 66 67 70 71 +26 24 21 18 17 15 +87 84 81 78 77 74 71 +18 17 16 14 13 12 10 7 +2 5 6 7 10 13 15 18 +41 42 45 47 48 51 52 +22 24 26 27 29 30 32 35 +65 63 62 60 58 55 53 50 +33 36 37 40 42 43 44 +87 89 91 93 96 97 98 +17 18 21 22 23 +85 83 81 80 77 75 74 +33 30 27 24 22 20 17 +28 29 31 33 34 35 37 +17 20 22 23 24 26 +33 36 38 40 43 44 46 48 +29 28 25 22 19 18 +38 35 33 32 29 28 27 +54 51 50 48 47 +88 91 92 95 97 99 +43 42 41 39 36 33 31 +42 44 45 48 49 50 51 53 +72 74 77 78 81 84 87 89 +72 70 67 65 64 63 62 60 +24 22 19 17 14 13 +72 74 76 77 80 82 83 +9 10 12 15 17 19 +64 65 68 69 72 +65 63 60 59 58 56 54 +67 70 71 72 75 76 77 80 +4 6 8 10 13 14 +35 33 32 30 27 26 23 22 +52 51 49 46 45 44 41 +39 41 43 44 45 +50 53 55 57 58 59 62 64 +58 61 64 65 66 69 +10 8 7 4 3 2 +92 89 87 85 82 +76 77 80 81 84 85 86 +82 85 86 87 90 92 +22 21 18 16 13 +82 83 85 88 91 93 95 +38 39 41 42 44 46 49 50 +25 27 30 33 36 39 41 44 +48 50 51 52 53 56 +97 95 92 89 88 +60 62 64 65 67 68 +55 57 60 62 64 66 67 68 +34 33 32 31 28 26 25 +72 70 68 65 64 61 59 +76 78 80 81 82 +29 27 25 23 21 18 17 +87 84 83 80 77 75 74 73 +69 70 73 76 78 +74 73 70 69 66 64 +49 50 53 56 58 60 63 66 +56 55 53 50 49 +30 28 25 22 19 18 +97 95 93 91 88 87 +76 75 74 73 72 +39 40 43 44 45 48 51 +33 30 27 24 21 +45 47 49 52 55 +46 48 50 52 55 +46 44 41 38 37 35 34 31 +54 52 51 50 47 45 43 +43 42 41 38 37 36 35 +14 17 20 21 23 26 28 29 +47 46 44 41 40 38 +71 73 74 75 77 79 81 84 +10 12 13 14 16 19 22 +75 72 71 70 67 64 +60 59 57 54 52 49 +60 61 64 66 69 70 72 75 +47 44 41 40 39 37 34 33 +65 63 60 58 55 53 50 +82 83 85 87 88 89 +40 38 37 36 33 30 27 +53 52 50 48 46 45 +72 70 69 68 67 66 +14 17 19 21 24 25 26 +94 93 90 88 85 +65 68 70 73 75 77 +68 66 65 64 62 +83 81 78 76 75 72 69 66 +1 3 5 6 9 10 11 13 +30 29 27 24 21 19 17 +93 90 88 85 84 81 80 +29 31 34 35 38 40 +33 34 36 39 42 +65 68 69 70 71 74 75 +51 54 56 57 58 61 64 65 +68 70 72 75 77 78 79 82 +94 93 91 88 85 +60 57 54 53 51 49 46 +43 45 46 47 50 53 56 57 +64 67 69 72 74 76 78 79 +47 46 45 44 43 40 39 +45 42 41 38 35 33 30 +12 10 9 8 6 +3 6 9 10 12 13 16 +74 73 70 69 66 63 61 59 +21 19 17 15 12 10 9 6 +45 44 42 41 39 37 +35 33 30 28 27 24 +8 9 10 11 12 13 15 17 +50 51 54 57 60 +75 74 73 71 70 68 +60 58 55 52 49 +49 51 54 55 57 58 +23 26 28 29 32 34 +15 13 10 7 4 +51 52 55 57 59 61 62 +73 71 68 67 64 +77 75 74 71 70 69 67 +60 58 56 53 52 50 48 46 +17 19 20 23 25 26 27 30 +19 22 24 27 28 29 30 32 +60 62 65 66 67 68 71 74 +14 15 16 17 18 21 24 +73 75 77 79 81 82 83 +7 9 10 11 13 +58 60 61 62 65 +84 83 82 81 79 76 75 73 +29 28 27 26 23 21 20 +95 94 92 91 89 86 +93 90 87 86 83 81 79 +68 71 72 75 76 78 +68 67 65 63 62 +30 31 33 36 39 40 42 45 +96 93 91 90 88 85 +14 15 18 21 22 +84 81 78 76 74 71 +32 31 30 29 28 27 26 +61 58 56 55 54 51 +6 7 9 10 11 12 15 +74 77 79 80 83 84 85 88 +29 30 31 34 36 38 39 40 +41 44 46 47 48 51 53 +85 86 89 92 94 97 +79 78 77 76 73 70 69 +87 85 82 79 77 76 75 +71 74 76 77 80 82 84 85 +83 85 87 90 93 94 96 +96 95 94 93 92 +8 10 12 15 16 18 20 +76 73 72 71 69 66 63 +75 76 78 81 82 84 87 88 +29 30 32 34 36 +78 77 75 74 73 71 69 67 +92 90 87 86 83 +32 33 36 37 39 41 43 +53 56 59 60 63 65 67 68 +55 53 52 50 47 46 45 43 +30 27 25 23 22 19 16 14 +74 73 70 68 65 62 +99 97 96 93 90 87 +12 14 15 16 17 19 +65 63 62 59 57 55 52 50 +37 36 35 34 31 30 27 24 +36 39 41 42 43 44 46 49 +2 3 5 8 10 12 15 +79 80 81 82 85 88 +16 15 14 11 8 7 +84 83 81 79 78 76 +24 23 22 21 20 +25 22 20 17 16 14 12 +52 53 56 59 60 61 62 +69 68 67 66 65 64 62 +82 79 76 74 71 68 65 62 +12 9 8 7 6 5 +42 39 37 36 34 +74 71 68 67 64 +77 78 80 81 84 87 89 +34 37 39 40 43 46 +3 4 7 9 12 15 16 +71 69 68 66 65 64 +65 64 63 61 60 +60 63 64 67 70 72 +52 49 46 43 42 41 +58 59 61 62 64 67 68 71 +42 45 47 49 51 +15 13 11 10 7 5 2 +45 42 41 38 36 33 +13 16 19 22 24 26 +45 42 40 38 35 33 +59 58 57 56 55 53 +66 63 61 58 55 53 +19 20 22 24 26 29 +64 65 67 68 69 +82 80 77 74 71 +88 85 83 81 79 76 75 74 +26 28 29 31 34 36 37 39 +38 39 42 44 45 47 48 51 +1 4 7 9 10 +74 77 79 81 82 84 86 89 +60 62 65 67 69 70 +3 4 5 6 9 10 13 +55 52 50 49 47 46 +16 13 11 10 8 6 +59 61 63 66 68 69 72 +79 77 74 73 71 70 67 65 +29 30 33 36 39 +80 83 86 88 91 92 94 95 +12 13 15 18 20 21 23 26 +22 24 27 29 32 34 35 37 +73 72 69 68 66 64 62 +12 9 8 5 4 +92 89 87 85 84 81 +40 41 42 43 44 47 49 51 +48 49 50 52 54 55 56 59 +22 23 25 28 31 +79 82 84 86 88 89 91 93 +88 87 84 81 80 79 76 +47 50 53 55 56 +88 89 92 93 94 95 96 +1 4 7 10 11 12 +69 70 72 74 75 78 80 82 +68 69 72 73 76 79 +5 6 8 10 13 16 +87 85 83 82 79 76 74 73 +40 42 45 47 49 +41 39 37 36 34 32 29 26 +36 33 31 28 26 24 23 +87 90 91 93 96 +35 34 31 28 26 25 23 20 +82 80 77 74 71 68 67 65 +59 56 53 50 48 +46 45 44 42 41 +79 76 73 70 68 67 64 63 +94 92 90 87 86 84 82 +22 21 18 15 14 13 11 +94 92 89 88 86 83 +80 79 78 76 73 +4 7 9 10 12 14 15 18 +81 83 86 89 91 +49 52 53 56 58 +55 58 61 63 65 +71 68 66 65 64 63 62 +54 57 60 63 65 +55 52 49 48 46 43 +60 59 57 55 52 49 48 47 +41 44 45 48 50 53 54 +47 45 43 41 38 35 34 32 +25 23 21 20 18 15 12 +54 53 50 47 44 43 40 +32 35 38 41 43 46 48 +54 53 52 49 46 44 +44 42 41 39 37 34 +64 66 69 71 73 76 77 79 +81 82 84 86 88 91 92 95 +17 14 12 10 8 5 4 +74 77 79 82 85 88 +66 68 69 70 73 +58 56 55 54 53 50 47 46 +39 37 35 33 31 30 28 +8 11 14 15 17 18 +59 60 61 63 66 +68 65 63 62 60 +51 48 45 44 41 38 36 +75 78 80 82 85 88 +89 87 85 82 79 78 +16 13 11 8 6 5 3 +20 17 14 12 11 9 +34 32 31 29 27 25 +91 88 86 84 81 79 +79 81 82 85 86 88 90 +97 95 93 92 91 90 +85 82 80 78 75 74 73 70 +66 68 71 74 76 77 80 +90 88 87 85 82 79 78 +38 41 42 44 46 +13 14 17 20 23 25 28 +84 85 88 90 91 +62 61 60 59 58 +59 62 63 66 67 +21 22 24 25 26 28 +79 76 75 73 72 69 68 66 +28 27 24 23 21 18 15 14 +52 49 47 45 42 41 38 35 +84 81 80 79 78 76 +78 77 75 72 70 +79 80 82 83 86 +75 77 79 81 82 85 +53 55 58 59 60 +76 73 71 69 66 63 +73 76 77 80 81 84 86 +23 20 17 15 12 11 10 +77 74 73 71 70 69 67 66 +38 35 32 30 28 25 23 +92 89 88 86 85 83 81 +95 92 89 87 84 83 +27 28 29 32 33 35 37 40 +12 10 8 5 3 1 +29 31 33 35 36 37 +19 20 23 24 27 30 +91 88 86 83 82 81 +31 34 36 37 38 39 42 +63 66 69 70 72 75 +63 65 68 71 72 75 78 +71 70 67 66 65 62 +22 24 27 30 32 34 37 +46 47 48 51 52 53 +26 24 22 19 18 17 +39 41 43 44 46 47 49 +47 45 44 42 40 +66 67 68 71 74 75 77 +1 2 3 6 7 9 10 +74 76 79 82 84 85 +86 85 82 80 78 77 76 +48 47 45 44 41 38 35 33 +63 64 66 69 71 +86 85 83 82 81 80 +49 46 45 42 41 38 37 36 +37 38 39 40 41 +81 78 75 72 70 68 +4 5 7 10 11 14 16 18 +51 53 56 57 60 63 65 67 +88 85 82 81 78 77 74 +27 30 31 33 34 35 +35 32 31 30 29 28 25 +60 59 56 55 53 51 48 +89 91 94 96 98 +65 66 69 72 74 75 77 +40 43 45 46 48 +41 43 46 48 50 53 56 57 +13 16 18 19 22 23 25 28 +57 54 52 51 48 45 42 40 +35 38 40 42 45 47 48 +25 26 29 32 34 37 39 41 +31 32 34 36 38 39 +15 16 18 20 23 25 +6 8 11 12 14 17 19 21 +86 85 83 81 79 76 74 +2 3 5 8 10 +63 65 68 71 73 75 +5 6 7 10 12 14 15 16 +85 88 89 92 95 +58 55 52 49 46 +10 9 7 5 2 +65 68 69 70 71 73 76 78 +96 93 90 88 87 86 83 +51 54 56 57 60 61 64 66 +17 18 21 24 25 +40 39 37 34 32 29 26 +30 32 33 35 37 +16 19 22 25 27 28 29 +8 7 5 4 1 +99 98 97 96 95 94 93 +85 87 89 92 95 98 +57 60 62 64 65 67 +37 34 31 29 27 25 24 +49 50 51 54 55 57 +8 9 11 13 15 +72 73 74 75 77 +7 9 12 13 15 +29 30 33 34 37 40 43 +77 78 79 80 81 83 85 +72 73 76 77 80 +44 43 41 39 37 34 33 +17 20 23 24 26 28 30 31 +80 77 76 74 73 +53 56 58 59 60 61 +78 75 73 70 69 66 64 +14 16 17 20 22 25 28 +16 15 12 10 9 8 5 2 +34 32 29 26 23 20 19 18 +7 8 9 12 14 17 18 +49 52 54 57 58 +46 45 43 42 40 +47 44 43 41 39 36 +61 58 56 55 52 +50 53 55 58 61 63 64 +37 38 40 42 45 46 48 50 +12 14 15 18 21 22 +62 61 58 55 54 53 +61 64 67 70 73 75 78 79 +81 84 86 88 90 92 93 +13 11 10 9 8 6 +21 20 17 16 15 13 11 8 +34 33 31 28 25 22 21 20 +12 9 6 3 2 +10 11 12 13 16 18 +17 18 21 22 25 +48 51 53 54 57 +57 58 61 62 64 +84 86 87 90 92 95 +61 59 56 53 50 48 47 +31 34 35 36 37 40 43 45 +89 86 83 81 80 78 77 76 +11 13 14 15 16 +29 32 35 36 37 39 40 +26 27 28 29 32 33 +34 37 40 43 44 +68 70 73 76 78 79 +61 58 57 54 53 52 49 +88 86 83 82 79 +21 19 17 14 13 12 10 +67 66 63 60 59 56 55 +54 55 58 60 61 +75 76 77 78 79 80 83 +72 74 75 78 80 +15 17 19 20 22 23 +62 61 58 56 53 51 +80 79 76 75 72 69 +74 75 78 79 80 +47 44 41 38 36 34 31 +24 22 21 19 16 14 +49 48 45 44 41 +52 53 54 56 58 61 +4 5 7 9 11 14 17 +52 54 55 57 58 59 60 +92 91 90 87 86 85 +38 37 34 33 30 +27 28 31 32 34 36 +87 85 82 80 78 75 72 69 +6 8 9 12 14 16 18 +65 68 71 74 77 +35 34 33 31 28 27 +58 57 55 54 53 52 50 47 +19 16 13 11 8 7 5 4 +43 41 39 38 35 34 31 29 +50 47 44 42 39 37 34 +58 56 53 51 48 47 +19 21 24 26 27 30 +80 79 78 77 75 73 +11 10 8 7 5 +64 66 69 70 73 74 76 +43 41 40 38 37 35 32 29 +88 87 85 83 82 80 77 76 +72 75 78 81 84 87 90 93 +83 82 79 78 75 74 73 71 +81 78 77 74 72 +43 40 39 36 35 32 30 +13 11 10 9 8 6 3 +51 52 53 56 57 +64 66 67 69 70 +98 95 93 91 89 +50 49 46 44 43 40 39 +87 85 82 80 79 77 75 73 +73 72 70 67 65 +60 61 64 67 69 70 71 +66 65 63 61 59 57 56 53 +75 74 71 69 67 +88 86 85 83 81 79 76 75 +28 27 25 22 20 18 15 12 +20 21 24 27 29 30 32 +38 37 34 33 30 28 26 24 +81 79 76 75 72 69 67 +92 89 86 85 82 81 80 +52 51 49 47 44 43 +26 23 20 18 15 +50 47 45 44 42 41 38 35 +69 67 65 63 61 58 +38 35 34 33 31 29 26 +63 62 61 58 55 52 +16 19 21 23 25 28 31 33 +56 57 58 60 63 +9 7 6 4 2 +64 65 67 69 70 71 +79 76 74 72 69 66 +35 36 37 39 40 41 42 +5 8 10 11 12 +52 51 49 48 47 +29 32 34 36 39 40 42 +78 76 73 70 67 66 +16 15 13 10 7 +38 35 34 33 32 29 28 +90 88 85 84 81 78 75 74 +22 24 26 29 32 33 34 37 +53 54 55 56 57 58 59 61 +9 11 12 14 17 20 23 +84 81 80 77 76 73 71 +31 28 25 22 21 +15 18 19 21 22 24 +24 22 20 18 15 12 9 6 +27 28 30 32 35 36 +99 97 95 92 89 86 84 82 +31 28 26 23 22 19 +58 61 62 65 67 69 +33 30 27 24 23 22 +21 18 17 16 15 14 +25 27 29 32 34 +45 43 42 40 38 36 33 31 +20 18 16 15 13 11 +76 74 73 71 70 69 66 +88 89 90 93 95 97 99 +55 52 51 50 48 46 43 +48 50 52 55 57 58 59 62 +60 63 64 66 68 +53 52 49 48 47 44 42 39 +85 83 80 78 75 +39 40 43 44 46 49 52 +10 11 12 15 18 21 +46 47 50 52 55 56 +68 67 66 65 62 61 60 +28 29 32 34 35 36 38 +17 16 14 13 10 +38 41 42 43 44 +59 57 54 52 50 48 47 +81 80 77 74 71 68 66 63 +44 42 41 39 36 35 32 31 +7 10 11 14 16 18 +50 52 53 55 57 60 63 64 +57 60 61 64 67 +46 44 43 42 40 38 35 32 +63 60 59 58 55 +19 22 24 25 26 27 28 30 +2 3 4 6 9 10 +19 18 17 16 14 +85 84 81 80 78 77 +82 81 79 78 75 73 +66 63 62 60 59 57 55 +99 96 95 92 89 +41 44 46 48 51 53 +46 45 42 41 40 39 38 +52 53 54 56 57 +75 73 71 70 69 +93 90 88 86 84 +39 36 34 33 32 29 28 +46 43 40 37 34 33 +99 96 94 93 92 89 +73 75 76 79 80 81 +63 66 68 71 72 73 76 79 +68 65 62 59 57 56 54 +81 80 77 74 73 71 70 68 +14 13 10 9 6 4 1 +75 77 79 80 82 83 84 +1 3 5 8 9 +36 35 33 30 27 25 22 19 +73 72 69 67 66 65 64 +80 82 83 86 88 90 +62 60 57 56 54 52 49 +78 77 76 75 72 +22 24 26 27 29 31 34 +13 15 18 21 23 +12 15 18 20 22 24 27 29 +29 26 23 20 18 +63 60 57 54 52 49 48 +21 20 19 16 15 14 11 9 +37 34 33 32 30 28 +57 55 53 52 49 48 46 45 +13 15 17 18 19 +50 53 56 59 61 64 67 +59 58 56 55 52 49 +26 28 29 31 32 34 diff --git a/2024/d02/ex2/ex2.py b/2024/d02/ex2/ex2.py new file mode 100755 index 0000000..237af7c --- /dev/null +++ b/2024/d02/ex2/ex2.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python + +import itertools +import sys + +Report = list[int] + + +def solve(input: list[str]) -> int: + def parse(input: list[str]) -> list[Report]: + return [[int(n) for n in line.split()] for line in input] + + def is_safe(report: Report) -> bool: + def is_increasing_safe(report: Report): + for a, b in itertools.pairwise(report): + if not 1 <= (b - a) <= 3: + return False + return True + + return is_increasing_safe(report) or is_increasing_safe(report[::-1]) + + # Dampening by brute force + def is_dampened_safe(report: Report) -> bool: + for i in range(len(report)): + dampened_report = report[:i] + report[i + 1 :] + if is_safe(dampened_report): + return True + return False + + return sum(is_dampened_safe(report) for report in parse(input)) + + +def main() -> None: + input = sys.stdin.read().splitlines() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2024/d02/ex2/input b/2024/d02/ex2/input new file mode 100644 index 0000000..b046d53 --- /dev/null +++ b/2024/d02/ex2/input @@ -0,0 +1,1000 @@ +2 5 6 8 6 +87 89 90 93 96 99 99 +13 14 15 18 19 23 +67 69 71 72 73 76 82 +29 32 30 31 34 35 37 +54 56 54 57 54 +70 73 75 74 77 79 81 81 +53 55 56 59 62 61 65 +90 93 95 92 99 +58 61 61 64 67 +36 37 37 39 42 39 +32 35 38 40 40 40 +17 19 19 21 22 23 25 29 +9 11 12 12 14 20 +20 22 26 27 28 29 +75 78 82 84 87 84 +78 79 83 85 88 91 91 +30 31 32 36 40 +68 69 72 76 79 82 88 +29 31 37 38 40 43 45 46 +23 26 31 34 32 +59 61 62 69 72 72 +39 40 42 49 50 53 55 59 +60 61 63 68 71 78 +27 25 26 27 30 31 +92 89 90 91 92 91 +25 24 26 28 28 +45 44 47 49 52 56 +45 44 47 48 55 +13 11 9 11 14 16 19 +70 69 71 68 70 73 72 +25 24 26 27 29 28 28 +43 41 43 42 43 44 48 +15 13 15 14 16 19 24 +26 23 26 28 28 31 +81 79 79 81 84 85 84 +15 12 15 15 15 +83 82 85 85 87 91 +33 31 32 32 39 +84 82 85 89 90 +67 64 67 71 72 75 78 76 +17 15 19 22 23 25 25 +44 42 43 47 51 +6 3 7 8 9 16 +39 36 38 43 44 45 48 50 +93 92 93 98 99 96 +19 16 19 20 22 25 31 31 +56 53 55 60 61 62 65 69 +19 18 21 23 28 30 35 +84 84 85 86 89 +44 44 45 48 47 +48 48 50 53 53 +84 84 85 86 89 91 94 98 +21 21 23 24 26 33 +38 38 40 37 39 +41 41 43 40 37 +6 6 3 6 9 10 10 +32 32 34 35 36 35 37 41 +54 54 52 53 55 56 61 +86 86 88 88 91 92 95 96 +42 42 42 43 44 46 47 46 +24 24 24 26 27 28 28 +38 38 39 39 43 +21 21 24 27 27 28 33 +52 52 54 57 61 62 +60 60 61 65 64 +45 45 46 47 51 54 57 57 +27 27 31 33 34 37 38 42 +21 21 22 26 27 34 +52 52 58 59 60 63 65 66 +47 47 54 56 57 56 +57 57 60 63 64 65 70 70 +39 39 42 47 50 53 56 60 +22 22 25 27 30 37 40 45 +8 12 15 16 18 19 22 +56 60 62 65 67 68 66 +78 82 83 85 88 89 89 +4 8 10 13 14 18 +80 84 86 88 90 91 96 +31 35 34 36 38 39 +33 37 40 43 44 46 43 40 +48 52 53 55 56 55 57 57 +66 70 67 68 69 72 76 +63 67 70 71 73 74 72 78 +36 40 40 43 45 +1 5 5 7 6 +61 65 67 68 71 74 74 74 +68 72 73 73 74 78 +37 41 42 44 44 47 48 53 +65 69 70 71 75 76 +13 17 18 20 23 27 30 27 +8 12 14 18 21 22 22 +7 11 12 15 19 21 24 28 +24 28 32 35 36 41 +59 63 66 71 72 +15 19 20 26 25 +25 29 34 36 36 +32 36 37 42 43 46 48 52 +8 12 19 20 22 28 +17 24 25 28 29 31 34 +74 81 82 85 83 +67 72 73 76 77 77 +22 27 30 33 34 37 38 42 +13 19 21 24 26 28 33 +50 57 58 57 60 63 +16 21 24 26 27 25 28 27 +84 91 89 91 92 95 95 +50 56 54 57 59 60 64 +4 9 11 13 16 14 19 +14 20 23 24 24 27 +64 70 73 73 72 +40 47 48 48 51 52 55 55 +80 86 86 88 91 93 95 99 +63 70 71 71 78 +20 26 30 31 34 37 39 40 +61 68 69 73 74 77 78 77 +64 71 74 76 79 81 85 85 +14 19 21 24 28 32 +3 10 12 14 16 18 22 29 +7 12 14 17 20 23 29 31 +49 56 62 65 67 65 +68 75 80 83 85 86 89 89 +51 58 59 65 68 70 74 +44 51 54 60 62 63 66 73 +33 32 29 26 29 +53 50 49 46 46 +55 54 53 52 50 49 46 42 +18 15 14 11 8 7 1 +52 50 47 49 47 46 45 42 +11 10 7 6 9 6 4 5 +90 89 88 90 88 88 +86 85 84 81 80 81 77 +26 24 26 25 24 22 17 +34 33 30 28 28 27 24 22 +34 32 29 27 27 30 +5 4 2 1 1 1 +41 38 36 35 35 32 31 27 +90 89 89 87 86 80 +81 80 77 73 72 +60 58 57 53 51 52 +98 96 95 92 88 88 +60 59 55 54 53 51 47 +68 66 62 59 52 +34 33 28 25 22 +37 34 31 26 24 22 20 21 +90 88 87 81 81 +51 49 43 40 38 34 +41 38 37 34 32 30 23 17 +53 56 54 53 52 50 48 45 +36 37 35 34 33 32 31 33 +83 84 83 82 82 +89 90 87 86 82 +72 75 72 69 66 63 58 +19 21 20 19 17 19 16 +91 94 93 96 97 +57 59 57 54 53 55 54 54 +77 80 81 80 78 75 74 70 +81 82 79 77 76 77 71 +83 84 83 83 81 79 76 +59 62 59 57 57 60 +84 87 86 84 84 83 83 +41 43 41 38 38 34 +74 75 73 73 67 +79 82 79 77 76 75 71 69 +46 49 45 44 45 +70 71 70 66 66 +34 36 35 32 28 24 +60 61 57 54 49 +15 17 14 8 7 6 5 +17 18 16 11 14 +91 93 86 83 81 80 80 +40 41 35 33 29 +31 34 32 30 25 24 17 +71 71 70 68 67 66 +65 65 64 61 58 57 60 +37 37 35 33 30 27 26 26 +67 67 66 65 61 +86 86 85 82 81 74 +95 95 92 95 92 +58 58 55 54 56 53 54 +37 37 35 32 33 30 28 28 +56 56 53 51 48 49 45 +33 33 30 29 28 31 26 +37 37 37 35 34 31 29 +26 26 26 25 28 +67 67 67 64 64 +80 80 77 77 73 +47 47 47 44 41 36 +54 54 52 50 46 45 42 41 +52 52 50 46 43 46 +38 38 34 32 31 29 29 +99 99 97 95 91 90 89 85 +26 26 24 20 18 16 14 8 +16 16 14 11 9 4 2 +78 78 75 73 67 69 +37 37 35 28 28 +83 83 80 79 73 69 +59 59 57 55 52 47 40 +57 53 52 51 49 +45 41 40 39 37 39 +99 95 93 92 90 89 86 86 +59 55 53 50 47 43 +59 55 52 49 44 +52 48 50 48 46 +96 92 90 87 90 89 91 +60 56 54 51 52 52 +17 13 11 13 11 10 6 +66 62 61 60 63 56 +72 68 65 65 62 +45 41 38 38 39 +56 52 49 48 48 48 +58 54 51 51 50 46 +69 65 62 59 59 58 53 +93 89 88 85 81 80 +38 34 32 28 30 +22 18 17 13 11 11 +49 45 42 40 37 35 31 27 +70 66 63 60 56 51 +71 67 64 58 57 56 54 51 +89 85 78 76 73 71 70 72 +67 63 62 59 56 49 47 47 +88 84 82 75 72 69 68 64 +46 42 40 37 35 28 25 20 +79 74 73 70 68 66 64 +58 53 52 49 51 +30 24 22 19 19 +61 54 53 50 47 45 41 +75 70 67 65 59 +89 83 86 84 81 +29 24 23 20 17 18 21 +17 11 9 6 4 6 6 +93 88 90 88 84 +53 48 46 45 42 45 44 38 +22 17 14 13 10 10 9 +65 58 57 56 56 55 53 55 +35 30 29 29 26 26 +19 14 12 11 10 10 8 4 +70 65 62 60 60 59 57 51 +98 91 88 86 84 80 78 +41 36 34 30 29 31 +45 38 37 33 33 +55 49 46 42 39 36 35 31 +78 72 69 65 64 62 55 +97 91 84 82 79 77 76 +95 89 82 81 83 +43 37 35 34 28 25 24 24 +87 82 77 74 71 67 +56 49 48 45 40 39 34 +89 90 88 85 84 84 77 +35 39 41 42 43 44 41 47 +45 44 43 39 36 34 34 +9 8 12 13 15 22 +74 72 73 75 76 78 81 85 +53 53 50 52 50 48 51 +98 98 96 92 88 +87 87 84 82 83 80 78 74 +74 70 67 70 68 66 68 +78 74 71 68 64 61 56 +53 53 50 48 47 +52 47 47 44 41 40 37 37 +78 78 79 80 81 83 +76 80 79 82 83 84 88 +47 43 41 38 34 32 30 27 +43 43 42 37 36 +30 37 40 44 51 +76 82 85 89 93 +63 58 57 54 53 52 54 +40 40 40 43 46 49 49 +66 68 66 65 64 63 63 +69 69 69 72 69 +52 59 60 61 63 68 +69 64 62 60 59 54 52 45 +86 81 79 77 77 73 +63 58 56 54 53 49 +55 53 50 53 55 58 60 57 +56 62 65 63 66 67 +63 64 61 55 52 51 48 48 +67 64 67 74 78 +23 19 16 12 9 5 +17 17 14 12 9 2 +20 13 11 7 4 6 +41 37 35 30 28 25 +13 13 12 10 6 6 +34 30 28 26 24 19 +69 71 70 68 68 66 62 +93 93 92 89 88 86 81 77 +52 53 57 59 60 61 63 63 +92 91 90 87 87 84 77 +66 66 69 72 79 81 +78 73 72 73 71 70 +54 49 46 45 44 39 +64 70 73 76 77 77 +37 37 38 39 43 41 +63 67 70 76 79 81 83 83 +68 67 69 69 70 74 +57 56 55 54 50 46 +28 29 30 30 33 30 +57 55 57 60 62 65 +84 84 88 91 97 +19 19 17 15 14 13 15 +1 2 5 12 15 16 17 15 +80 87 90 91 91 93 91 +52 56 58 63 64 62 +94 90 87 85 82 79 78 76 +24 24 25 31 33 34 36 36 +80 86 86 88 93 +93 94 92 93 95 98 +17 21 23 25 25 30 +37 31 31 29 27 25 23 20 +41 34 32 29 29 27 30 +39 39 40 43 46 43 +18 18 16 16 12 +17 17 20 23 25 29 31 35 +50 50 57 58 65 +14 14 13 13 15 +45 42 43 45 50 53 +49 46 47 53 55 56 59 58 +30 32 30 28 24 20 +34 33 34 32 35 39 +62 58 56 56 53 53 +34 33 27 24 22 +37 39 32 29 26 22 +90 86 88 86 83 +34 30 27 24 18 18 +78 75 72 69 71 69 67 67 +64 64 68 69 72 73 76 76 +21 19 20 23 26 33 33 +58 54 52 49 43 45 +78 78 75 74 73 72 72 +29 31 28 29 27 24 17 +46 49 51 53 51 56 +38 38 35 33 31 24 27 +69 69 66 65 64 62 58 59 +53 59 60 67 70 +88 90 89 85 83 82 +14 14 12 11 7 +18 25 27 29 31 34 32 +70 70 73 71 71 +39 43 50 53 55 57 +95 93 95 93 92 90 88 89 +95 90 86 85 85 +30 36 40 42 43 +50 54 55 56 57 57 60 +83 84 81 79 78 80 78 +56 63 64 67 71 71 +26 25 22 20 21 +85 82 84 83 77 +69 69 69 66 60 +35 36 33 27 24 27 +29 27 24 17 16 16 +8 6 3 5 12 +23 24 23 21 20 22 +3 5 2 3 4 1 +55 55 57 59 59 66 +31 28 29 32 32 33 36 +27 33 30 31 31 +25 28 30 27 29 30 31 35 +47 50 48 51 51 +9 15 17 19 18 20 21 18 +16 15 13 14 11 10 +76 80 80 82 82 +47 42 40 37 36 36 34 27 +17 22 23 26 33 33 +48 42 40 39 42 43 +56 61 66 67 68 66 +81 78 74 71 68 67 65 60 +84 84 88 89 90 93 96 98 +84 84 83 81 79 80 73 +22 18 19 17 10 +36 42 42 44 47 50 50 +38 38 39 41 44 46 47 47 +97 92 91 90 88 81 78 75 +77 80 77 76 73 69 71 +31 30 35 38 41 48 +79 75 75 73 66 +28 32 35 39 40 43 +29 30 28 26 24 21 23 19 +65 64 68 71 72 75 +72 78 80 77 79 80 84 +62 55 54 53 48 46 45 45 +49 45 43 41 38 35 34 34 +55 53 51 51 49 48 45 48 +8 12 13 16 18 19 23 20 +72 78 82 83 82 +50 53 49 48 48 +22 26 29 32 37 43 +48 45 42 39 37 35 33 33 +64 70 73 76 80 +22 26 28 32 33 34 35 35 +75 78 79 82 88 +75 74 75 76 78 84 +10 10 12 19 23 +6 8 13 15 19 +73 71 69 68 65 66 62 +84 85 83 83 81 80 +81 81 84 81 78 76 74 +46 45 46 49 46 48 48 +65 65 62 60 60 58 57 57 +48 50 52 58 60 63 66 66 +37 34 27 26 23 22 19 21 +48 52 54 54 56 59 61 65 +43 46 44 45 46 +12 16 17 20 23 25 27 34 +40 37 37 36 32 +59 63 66 67 71 +54 54 56 55 58 62 +48 51 51 54 56 56 +45 44 40 39 37 +78 72 73 72 68 +25 21 20 18 16 18 +32 30 30 32 33 35 33 +51 53 46 44 43 42 41 36 +21 14 11 14 11 8 3 +50 50 52 50 57 +5 7 10 14 15 16 17 15 +37 38 37 34 31 +75 78 79 80 84 85 91 +29 28 25 21 20 18 16 17 +24 24 21 17 15 12 +48 44 44 43 40 +14 18 20 24 26 28 29 35 +15 14 14 17 17 +61 61 63 65 68 71 75 +56 55 57 57 63 +3 5 6 9 11 15 19 +90 83 82 78 76 75 74 73 +87 87 85 87 90 93 +67 73 75 77 83 85 90 +19 20 22 24 26 +66 64 63 61 58 55 52 +63 65 68 69 71 74 75 +63 60 58 55 52 49 46 +32 30 28 27 25 +74 73 71 70 69 68 +28 25 22 21 19 17 15 12 +59 56 54 53 50 47 +50 49 46 45 42 39 38 +57 58 60 61 62 64 +4 5 6 7 10 12 15 +6 7 10 12 14 17 +36 39 42 44 47 49 52 54 +53 51 48 45 44 43 41 +70 73 75 78 80 81 84 87 +57 58 61 64 66 67 +29 32 35 37 38 40 +31 29 26 23 21 18 16 +41 39 37 36 35 32 30 29 +93 90 89 87 84 83 82 +44 42 41 38 35 +68 65 62 60 57 56 +19 17 14 12 9 6 +33 31 29 26 23 22 +26 29 30 33 34 37 40 +23 25 28 29 31 32 35 +63 66 67 70 71 +26 24 21 18 17 15 +87 84 81 78 77 74 71 +18 17 16 14 13 12 10 7 +2 5 6 7 10 13 15 18 +41 42 45 47 48 51 52 +22 24 26 27 29 30 32 35 +65 63 62 60 58 55 53 50 +33 36 37 40 42 43 44 +87 89 91 93 96 97 98 +17 18 21 22 23 +85 83 81 80 77 75 74 +33 30 27 24 22 20 17 +28 29 31 33 34 35 37 +17 20 22 23 24 26 +33 36 38 40 43 44 46 48 +29 28 25 22 19 18 +38 35 33 32 29 28 27 +54 51 50 48 47 +88 91 92 95 97 99 +43 42 41 39 36 33 31 +42 44 45 48 49 50 51 53 +72 74 77 78 81 84 87 89 +72 70 67 65 64 63 62 60 +24 22 19 17 14 13 +72 74 76 77 80 82 83 +9 10 12 15 17 19 +64 65 68 69 72 +65 63 60 59 58 56 54 +67 70 71 72 75 76 77 80 +4 6 8 10 13 14 +35 33 32 30 27 26 23 22 +52 51 49 46 45 44 41 +39 41 43 44 45 +50 53 55 57 58 59 62 64 +58 61 64 65 66 69 +10 8 7 4 3 2 +92 89 87 85 82 +76 77 80 81 84 85 86 +82 85 86 87 90 92 +22 21 18 16 13 +82 83 85 88 91 93 95 +38 39 41 42 44 46 49 50 +25 27 30 33 36 39 41 44 +48 50 51 52 53 56 +97 95 92 89 88 +60 62 64 65 67 68 +55 57 60 62 64 66 67 68 +34 33 32 31 28 26 25 +72 70 68 65 64 61 59 +76 78 80 81 82 +29 27 25 23 21 18 17 +87 84 83 80 77 75 74 73 +69 70 73 76 78 +74 73 70 69 66 64 +49 50 53 56 58 60 63 66 +56 55 53 50 49 +30 28 25 22 19 18 +97 95 93 91 88 87 +76 75 74 73 72 +39 40 43 44 45 48 51 +33 30 27 24 21 +45 47 49 52 55 +46 48 50 52 55 +46 44 41 38 37 35 34 31 +54 52 51 50 47 45 43 +43 42 41 38 37 36 35 +14 17 20 21 23 26 28 29 +47 46 44 41 40 38 +71 73 74 75 77 79 81 84 +10 12 13 14 16 19 22 +75 72 71 70 67 64 +60 59 57 54 52 49 +60 61 64 66 69 70 72 75 +47 44 41 40 39 37 34 33 +65 63 60 58 55 53 50 +82 83 85 87 88 89 +40 38 37 36 33 30 27 +53 52 50 48 46 45 +72 70 69 68 67 66 +14 17 19 21 24 25 26 +94 93 90 88 85 +65 68 70 73 75 77 +68 66 65 64 62 +83 81 78 76 75 72 69 66 +1 3 5 6 9 10 11 13 +30 29 27 24 21 19 17 +93 90 88 85 84 81 80 +29 31 34 35 38 40 +33 34 36 39 42 +65 68 69 70 71 74 75 +51 54 56 57 58 61 64 65 +68 70 72 75 77 78 79 82 +94 93 91 88 85 +60 57 54 53 51 49 46 +43 45 46 47 50 53 56 57 +64 67 69 72 74 76 78 79 +47 46 45 44 43 40 39 +45 42 41 38 35 33 30 +12 10 9 8 6 +3 6 9 10 12 13 16 +74 73 70 69 66 63 61 59 +21 19 17 15 12 10 9 6 +45 44 42 41 39 37 +35 33 30 28 27 24 +8 9 10 11 12 13 15 17 +50 51 54 57 60 +75 74 73 71 70 68 +60 58 55 52 49 +49 51 54 55 57 58 +23 26 28 29 32 34 +15 13 10 7 4 +51 52 55 57 59 61 62 +73 71 68 67 64 +77 75 74 71 70 69 67 +60 58 56 53 52 50 48 46 +17 19 20 23 25 26 27 30 +19 22 24 27 28 29 30 32 +60 62 65 66 67 68 71 74 +14 15 16 17 18 21 24 +73 75 77 79 81 82 83 +7 9 10 11 13 +58 60 61 62 65 +84 83 82 81 79 76 75 73 +29 28 27 26 23 21 20 +95 94 92 91 89 86 +93 90 87 86 83 81 79 +68 71 72 75 76 78 +68 67 65 63 62 +30 31 33 36 39 40 42 45 +96 93 91 90 88 85 +14 15 18 21 22 +84 81 78 76 74 71 +32 31 30 29 28 27 26 +61 58 56 55 54 51 +6 7 9 10 11 12 15 +74 77 79 80 83 84 85 88 +29 30 31 34 36 38 39 40 +41 44 46 47 48 51 53 +85 86 89 92 94 97 +79 78 77 76 73 70 69 +87 85 82 79 77 76 75 +71 74 76 77 80 82 84 85 +83 85 87 90 93 94 96 +96 95 94 93 92 +8 10 12 15 16 18 20 +76 73 72 71 69 66 63 +75 76 78 81 82 84 87 88 +29 30 32 34 36 +78 77 75 74 73 71 69 67 +92 90 87 86 83 +32 33 36 37 39 41 43 +53 56 59 60 63 65 67 68 +55 53 52 50 47 46 45 43 +30 27 25 23 22 19 16 14 +74 73 70 68 65 62 +99 97 96 93 90 87 +12 14 15 16 17 19 +65 63 62 59 57 55 52 50 +37 36 35 34 31 30 27 24 +36 39 41 42 43 44 46 49 +2 3 5 8 10 12 15 +79 80 81 82 85 88 +16 15 14 11 8 7 +84 83 81 79 78 76 +24 23 22 21 20 +25 22 20 17 16 14 12 +52 53 56 59 60 61 62 +69 68 67 66 65 64 62 +82 79 76 74 71 68 65 62 +12 9 8 7 6 5 +42 39 37 36 34 +74 71 68 67 64 +77 78 80 81 84 87 89 +34 37 39 40 43 46 +3 4 7 9 12 15 16 +71 69 68 66 65 64 +65 64 63 61 60 +60 63 64 67 70 72 +52 49 46 43 42 41 +58 59 61 62 64 67 68 71 +42 45 47 49 51 +15 13 11 10 7 5 2 +45 42 41 38 36 33 +13 16 19 22 24 26 +45 42 40 38 35 33 +59 58 57 56 55 53 +66 63 61 58 55 53 +19 20 22 24 26 29 +64 65 67 68 69 +82 80 77 74 71 +88 85 83 81 79 76 75 74 +26 28 29 31 34 36 37 39 +38 39 42 44 45 47 48 51 +1 4 7 9 10 +74 77 79 81 82 84 86 89 +60 62 65 67 69 70 +3 4 5 6 9 10 13 +55 52 50 49 47 46 +16 13 11 10 8 6 +59 61 63 66 68 69 72 +79 77 74 73 71 70 67 65 +29 30 33 36 39 +80 83 86 88 91 92 94 95 +12 13 15 18 20 21 23 26 +22 24 27 29 32 34 35 37 +73 72 69 68 66 64 62 +12 9 8 5 4 +92 89 87 85 84 81 +40 41 42 43 44 47 49 51 +48 49 50 52 54 55 56 59 +22 23 25 28 31 +79 82 84 86 88 89 91 93 +88 87 84 81 80 79 76 +47 50 53 55 56 +88 89 92 93 94 95 96 +1 4 7 10 11 12 +69 70 72 74 75 78 80 82 +68 69 72 73 76 79 +5 6 8 10 13 16 +87 85 83 82 79 76 74 73 +40 42 45 47 49 +41 39 37 36 34 32 29 26 +36 33 31 28 26 24 23 +87 90 91 93 96 +35 34 31 28 26 25 23 20 +82 80 77 74 71 68 67 65 +59 56 53 50 48 +46 45 44 42 41 +79 76 73 70 68 67 64 63 +94 92 90 87 86 84 82 +22 21 18 15 14 13 11 +94 92 89 88 86 83 +80 79 78 76 73 +4 7 9 10 12 14 15 18 +81 83 86 89 91 +49 52 53 56 58 +55 58 61 63 65 +71 68 66 65 64 63 62 +54 57 60 63 65 +55 52 49 48 46 43 +60 59 57 55 52 49 48 47 +41 44 45 48 50 53 54 +47 45 43 41 38 35 34 32 +25 23 21 20 18 15 12 +54 53 50 47 44 43 40 +32 35 38 41 43 46 48 +54 53 52 49 46 44 +44 42 41 39 37 34 +64 66 69 71 73 76 77 79 +81 82 84 86 88 91 92 95 +17 14 12 10 8 5 4 +74 77 79 82 85 88 +66 68 69 70 73 +58 56 55 54 53 50 47 46 +39 37 35 33 31 30 28 +8 11 14 15 17 18 +59 60 61 63 66 +68 65 63 62 60 +51 48 45 44 41 38 36 +75 78 80 82 85 88 +89 87 85 82 79 78 +16 13 11 8 6 5 3 +20 17 14 12 11 9 +34 32 31 29 27 25 +91 88 86 84 81 79 +79 81 82 85 86 88 90 +97 95 93 92 91 90 +85 82 80 78 75 74 73 70 +66 68 71 74 76 77 80 +90 88 87 85 82 79 78 +38 41 42 44 46 +13 14 17 20 23 25 28 +84 85 88 90 91 +62 61 60 59 58 +59 62 63 66 67 +21 22 24 25 26 28 +79 76 75 73 72 69 68 66 +28 27 24 23 21 18 15 14 +52 49 47 45 42 41 38 35 +84 81 80 79 78 76 +78 77 75 72 70 +79 80 82 83 86 +75 77 79 81 82 85 +53 55 58 59 60 +76 73 71 69 66 63 +73 76 77 80 81 84 86 +23 20 17 15 12 11 10 +77 74 73 71 70 69 67 66 +38 35 32 30 28 25 23 +92 89 88 86 85 83 81 +95 92 89 87 84 83 +27 28 29 32 33 35 37 40 +12 10 8 5 3 1 +29 31 33 35 36 37 +19 20 23 24 27 30 +91 88 86 83 82 81 +31 34 36 37 38 39 42 +63 66 69 70 72 75 +63 65 68 71 72 75 78 +71 70 67 66 65 62 +22 24 27 30 32 34 37 +46 47 48 51 52 53 +26 24 22 19 18 17 +39 41 43 44 46 47 49 +47 45 44 42 40 +66 67 68 71 74 75 77 +1 2 3 6 7 9 10 +74 76 79 82 84 85 +86 85 82 80 78 77 76 +48 47 45 44 41 38 35 33 +63 64 66 69 71 +86 85 83 82 81 80 +49 46 45 42 41 38 37 36 +37 38 39 40 41 +81 78 75 72 70 68 +4 5 7 10 11 14 16 18 +51 53 56 57 60 63 65 67 +88 85 82 81 78 77 74 +27 30 31 33 34 35 +35 32 31 30 29 28 25 +60 59 56 55 53 51 48 +89 91 94 96 98 +65 66 69 72 74 75 77 +40 43 45 46 48 +41 43 46 48 50 53 56 57 +13 16 18 19 22 23 25 28 +57 54 52 51 48 45 42 40 +35 38 40 42 45 47 48 +25 26 29 32 34 37 39 41 +31 32 34 36 38 39 +15 16 18 20 23 25 +6 8 11 12 14 17 19 21 +86 85 83 81 79 76 74 +2 3 5 8 10 +63 65 68 71 73 75 +5 6 7 10 12 14 15 16 +85 88 89 92 95 +58 55 52 49 46 +10 9 7 5 2 +65 68 69 70 71 73 76 78 +96 93 90 88 87 86 83 +51 54 56 57 60 61 64 66 +17 18 21 24 25 +40 39 37 34 32 29 26 +30 32 33 35 37 +16 19 22 25 27 28 29 +8 7 5 4 1 +99 98 97 96 95 94 93 +85 87 89 92 95 98 +57 60 62 64 65 67 +37 34 31 29 27 25 24 +49 50 51 54 55 57 +8 9 11 13 15 +72 73 74 75 77 +7 9 12 13 15 +29 30 33 34 37 40 43 +77 78 79 80 81 83 85 +72 73 76 77 80 +44 43 41 39 37 34 33 +17 20 23 24 26 28 30 31 +80 77 76 74 73 +53 56 58 59 60 61 +78 75 73 70 69 66 64 +14 16 17 20 22 25 28 +16 15 12 10 9 8 5 2 +34 32 29 26 23 20 19 18 +7 8 9 12 14 17 18 +49 52 54 57 58 +46 45 43 42 40 +47 44 43 41 39 36 +61 58 56 55 52 +50 53 55 58 61 63 64 +37 38 40 42 45 46 48 50 +12 14 15 18 21 22 +62 61 58 55 54 53 +61 64 67 70 73 75 78 79 +81 84 86 88 90 92 93 +13 11 10 9 8 6 +21 20 17 16 15 13 11 8 +34 33 31 28 25 22 21 20 +12 9 6 3 2 +10 11 12 13 16 18 +17 18 21 22 25 +48 51 53 54 57 +57 58 61 62 64 +84 86 87 90 92 95 +61 59 56 53 50 48 47 +31 34 35 36 37 40 43 45 +89 86 83 81 80 78 77 76 +11 13 14 15 16 +29 32 35 36 37 39 40 +26 27 28 29 32 33 +34 37 40 43 44 +68 70 73 76 78 79 +61 58 57 54 53 52 49 +88 86 83 82 79 +21 19 17 14 13 12 10 +67 66 63 60 59 56 55 +54 55 58 60 61 +75 76 77 78 79 80 83 +72 74 75 78 80 +15 17 19 20 22 23 +62 61 58 56 53 51 +80 79 76 75 72 69 +74 75 78 79 80 +47 44 41 38 36 34 31 +24 22 21 19 16 14 +49 48 45 44 41 +52 53 54 56 58 61 +4 5 7 9 11 14 17 +52 54 55 57 58 59 60 +92 91 90 87 86 85 +38 37 34 33 30 +27 28 31 32 34 36 +87 85 82 80 78 75 72 69 +6 8 9 12 14 16 18 +65 68 71 74 77 +35 34 33 31 28 27 +58 57 55 54 53 52 50 47 +19 16 13 11 8 7 5 4 +43 41 39 38 35 34 31 29 +50 47 44 42 39 37 34 +58 56 53 51 48 47 +19 21 24 26 27 30 +80 79 78 77 75 73 +11 10 8 7 5 +64 66 69 70 73 74 76 +43 41 40 38 37 35 32 29 +88 87 85 83 82 80 77 76 +72 75 78 81 84 87 90 93 +83 82 79 78 75 74 73 71 +81 78 77 74 72 +43 40 39 36 35 32 30 +13 11 10 9 8 6 3 +51 52 53 56 57 +64 66 67 69 70 +98 95 93 91 89 +50 49 46 44 43 40 39 +87 85 82 80 79 77 75 73 +73 72 70 67 65 +60 61 64 67 69 70 71 +66 65 63 61 59 57 56 53 +75 74 71 69 67 +88 86 85 83 81 79 76 75 +28 27 25 22 20 18 15 12 +20 21 24 27 29 30 32 +38 37 34 33 30 28 26 24 +81 79 76 75 72 69 67 +92 89 86 85 82 81 80 +52 51 49 47 44 43 +26 23 20 18 15 +50 47 45 44 42 41 38 35 +69 67 65 63 61 58 +38 35 34 33 31 29 26 +63 62 61 58 55 52 +16 19 21 23 25 28 31 33 +56 57 58 60 63 +9 7 6 4 2 +64 65 67 69 70 71 +79 76 74 72 69 66 +35 36 37 39 40 41 42 +5 8 10 11 12 +52 51 49 48 47 +29 32 34 36 39 40 42 +78 76 73 70 67 66 +16 15 13 10 7 +38 35 34 33 32 29 28 +90 88 85 84 81 78 75 74 +22 24 26 29 32 33 34 37 +53 54 55 56 57 58 59 61 +9 11 12 14 17 20 23 +84 81 80 77 76 73 71 +31 28 25 22 21 +15 18 19 21 22 24 +24 22 20 18 15 12 9 6 +27 28 30 32 35 36 +99 97 95 92 89 86 84 82 +31 28 26 23 22 19 +58 61 62 65 67 69 +33 30 27 24 23 22 +21 18 17 16 15 14 +25 27 29 32 34 +45 43 42 40 38 36 33 31 +20 18 16 15 13 11 +76 74 73 71 70 69 66 +88 89 90 93 95 97 99 +55 52 51 50 48 46 43 +48 50 52 55 57 58 59 62 +60 63 64 66 68 +53 52 49 48 47 44 42 39 +85 83 80 78 75 +39 40 43 44 46 49 52 +10 11 12 15 18 21 +46 47 50 52 55 56 +68 67 66 65 62 61 60 +28 29 32 34 35 36 38 +17 16 14 13 10 +38 41 42 43 44 +59 57 54 52 50 48 47 +81 80 77 74 71 68 66 63 +44 42 41 39 36 35 32 31 +7 10 11 14 16 18 +50 52 53 55 57 60 63 64 +57 60 61 64 67 +46 44 43 42 40 38 35 32 +63 60 59 58 55 +19 22 24 25 26 27 28 30 +2 3 4 6 9 10 +19 18 17 16 14 +85 84 81 80 78 77 +82 81 79 78 75 73 +66 63 62 60 59 57 55 +99 96 95 92 89 +41 44 46 48 51 53 +46 45 42 41 40 39 38 +52 53 54 56 57 +75 73 71 70 69 +93 90 88 86 84 +39 36 34 33 32 29 28 +46 43 40 37 34 33 +99 96 94 93 92 89 +73 75 76 79 80 81 +63 66 68 71 72 73 76 79 +68 65 62 59 57 56 54 +81 80 77 74 73 71 70 68 +14 13 10 9 6 4 1 +75 77 79 80 82 83 84 +1 3 5 8 9 +36 35 33 30 27 25 22 19 +73 72 69 67 66 65 64 +80 82 83 86 88 90 +62 60 57 56 54 52 49 +78 77 76 75 72 +22 24 26 27 29 31 34 +13 15 18 21 23 +12 15 18 20 22 24 27 29 +29 26 23 20 18 +63 60 57 54 52 49 48 +21 20 19 16 15 14 11 9 +37 34 33 32 30 28 +57 55 53 52 49 48 46 45 +13 15 17 18 19 +50 53 56 59 61 64 67 +59 58 56 55 52 49 +26 28 29 31 32 34 diff --git a/2024/d03/ex1/ex1.py b/2024/d03/ex1/ex1.py new file mode 100755 index 0000000..627157b --- /dev/null +++ b/2024/d03/ex1/ex1.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +import dataclasses +import re +import sys + + +@dataclasses.dataclass +class MulInstruction: + lhs: int + rhs: int + + def calc(self) -> int: + return self.lhs * self.rhs + + +def solve(input: str) -> int: + def parse(input: str) -> list[MulInstruction]: + res: list[MulInstruction] = [] + + MUL_REGEX = re.compile(r"mul\((\d+),(\d+)\)") + for match in MUL_REGEX.finditer(input): + res.append(MulInstruction(int(match.group(1)), int(match.group(2)))) + + return res + + return sum(inst.calc() for inst in parse(input)) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2024/d03/ex1/input b/2024/d03/ex1/input new file mode 100644 index 0000000..c154b5c --- /dev/null +++ b/2024/d03/ex1/input @@ -0,0 +1,6 @@ +}}+{where()mul(873,602) mul(954,447)^where()~mul(548,799)-#why():$from()(!mul(660,615):where()mul(596,918)how()[what()how()who()]@mul(594,699)$>$&why()mul(951,813)mul(948,41)]mul(699,225)>mul(840,275):@~^@%^select()mul(695,594)what()->-mul(409,636)@ {++mul(999,290)when(339,689),[+[+?mul(558,848)how(),what()&}]{mul(344,337)$)$]+,$,,why()do()::select()^:mul(796,16)mul(526,718) mul(66,417)#@>~do()why()from()/select()when():&mul(8,111);!where()do()}@mul(433,239)*}how() {^!do()#^mul(167,905)-&%(mul(979,711)when()]who()'?mul(523,172)[^what(844,455)'what()[/~@mul(928,776)where()]&/mul(587,380)who()/when()how()from(),}#}mul(97,952)select(837,505)~@>~%mul(486,198)^!mul(968,779)do()[mul(206,321);,where()where())how()}/mul(6,867)-&what()(mul(683,583)^(mul(244,555)^where()(how()what()?-[,who()mul(827,305);&,!$*?mul(793,452)^ )+(%-where()who()from()@who(){*mul(592,919)/:what():who()mul(213,139)what()$!?*how(934,24)$-who()(mul(661,7)?from(),}/who()mul(876,585)how()why():when()[@@mul(433,918)why()why(),*{who()when()who()mul(144,14/#(don't()@(@{~why()[who()mul(394,492)where()/mul(508,797)-mul(150,832)+$@why()(why()~mul(527,236)!:@!^&!mul(324>?!from()where())mul(731,184)#(}who()'mul(666,377)how()(;mul(346,141)^select()/@[$how()@]?mul(702,502,^where()<}[mul(872,308)+^!<@from() {:mul(537,974)%when()when()%mul(563,805)select()>how()>^';mul(643,555))where(290,606)who()?mul(656,803),?$/*?when()}@ mul(228,902)~/from(){where()what()>@~mul(849,93)~+select()?-^}mul(115,425)${what()mul(219,305)how()])from()select()~]~mul(41,659)<'{where():#+)$mul(447,137)where(120,771)$@why()#mul(457,857)<$from()$(who()@?mul(644,914)}mul(936,442);{*(why()mul(804,26);don't()why(),+*how() @:mul(668,778)%select() who() (,where()mul(66,974)^)when():$who()mul(832,615)#mul(572,646)where()how()what()when(673,330)where()when()&/mul(820,446)$why()where()mul(86,788)^~what()'mul(76,413)&'how()mul(616,424)what()select()}from()(/;mul(651,36)!{ mul[*mul(469,702)who()?;mul(331,879)?*from(54,751)who()#+[ mul(182,296)where(607,734){mul(920,190) :mul(660,732)^who()who()*'!mul(3,615)+{why(168,603)when(), mul(254,713); where()*from()~ !!#mul(897,311)]mul(629;what(280,32)>mul(194,563)^&mulwho()when()'!what()why()?'}}!mul(414,213)$when()]+{why()mul(606,917)how()*?^,mul(292,543)>mul(326,145)*(&!;^:!#'mul;#@~where()%;,from()select()mul(39,372)~[when()what()!+#who()]~mul(905,968from(843,581)(from()from()~what()how()when()mul(768,210)*mul(68,62)mul(777,345%{/select()%mul(458,251));what())how()where()how()when()mul(810,199)<~mul(252,749)don't()mul(915,327)(: mul(608,270)<%[!}-&mul(328,665)from()>*)how()mul(836,471)mul(270,799);(why();&~~mul(598,772)from()>mul(409,297)$mul(469,982)mul(457,665):@>{don't()why()<+,mul(293,172select(816,987)}why()mul(372,420)why()%mul(105,735),<]{mul?{$;>from()what()-$;mul(348,90)from()what()~mul(634,662)^do()$@]*)~,&mul(226,996)when()%]what()!@/&mul(322,135);who() &^select()*&}mul(967,104)from()}'who(701,7)~%[mul(687,163)@:+:mul(382,128)mul(831,450)mul(485,444)%^what()what()[$what()@}do()-%?'mul(204,152);$'/mul(63,376)mul(387,70)~@'{,':why()(%{how()who()]',from()'how()why()mul(42,665)%'# [}mul(684,645){{%'mul(115,930)mul(552,181)mul(762,163)mul(202,193)+*[mul(525,337)+}-:](?^#mul(466,861)/do()'(;mul(860,319);mul(48,137){when() ~:< from()mul(3,497)?when()< #?^@do()>;/?:mul(522,894)+{+mul(419,20)mul(139,677)where(119,273)*what()[^?mul(563,549)how()<@'%mul(560,434)what()where(),mul(886,302)mul(632,393)*what()!}{mul(769,651)'(mul(267,514)-[how()^:mul(64,902)when()mul(356,352# ;'mul(267,302)#(mul@;~+mul(471,643)!from())!what()from()~mul(429,997)/-mul(401,220)>{]what()what()@select()},mul(294,298)how()mul(230,3)/&what()]>]!how()/mul(888,907)](#>~}+#mul(17,816)/[+when()>from()]^:mul(94,85) +#)'{mul(531,103){ {where()what()from()mul(127,712))what()!%from()'/how()*when(940,337)mul(259,916)+}!-}[mul(703,780++;select()?why()[{mul(221,199)+mul(303,268)$don't()'[what();^mul(542,561);who()&,mul(68,800)[<'{}why()?^from()mul(26,194)?]who():;mul(641,921)#&where()mul(539,571)select()]~%%]when())mul(833,642);mul(209,564)}<^)when()mul(648,430/(#)/?(';where()what()mul(818,526) ]!what()do() <;:mulfrom() @-mul(764,627)#/mul(887,607), do()$(},#^}}from()how()mul(184,287)where()$^mul(859,310){who()how()mul(692,592){>?&mul(223,912)what()^@ {{^@/mul(736,965)$)]];-#@&mul(600,145)~/}*-}how()mul(893,646):where()}mul(205,416)what()from()mul(35,844)mul(94,245))/<#+mul(189,780)from()how()#< ^don't()why()&who()where(){ >:mul(638,986)*+< ;mul(131,393),how(419,400)*@how()mul(856,729)who()$$[$[select()~{(when()$mul(613,175)}mul(503,337)~)what() mul:!-*}?~who()-mul(649,886)+how(738,973)when()[(mul(593,702)where()%%^(]who()mul(456,697)%~^'when()how()mul(789,446)mul(737,439)mul(830,910):>why()when()how()'?]why()>do()#'&why()'from()mul(972,441):mul(157,521)mul(43,224):$who()>select()how()mul(52,740)'mul(136,716)select()mul(613,433)]>$^when()why()where()how();mul(978,314))$mul(695,29)}mul(778,660){how()<+$?mul(402,606)select()+~$do()mul(262,94)how()why()))#'^$@mul}mul(201,86)*select()mul(876,626)why()mul(174,750)where()(from()(mul(433,335)]@mul(29,940) :~what()$}where()select()mul(416,920)^&%<~^mul(276,648)mul(636,17);why()}-}mul(810,73)<@} how():from(900,831)what()mul(241,497)select()when()'&{mul(603,108):[,mul(941,454) $@mul>@<}'[, $mul(510,523)where(), ~];mul(584,102)' do()why()<&select(812,485)!mul(538,458)who()why()^'select(){{why()mul(773,196)when()why(713,26){,!do()?why()!when(),?mul(234,541)mul(558]!(%;}'-mul(721,55) +(<%@$?mul(856,705]>!#'++why() >#!/usr/bin/perlfrom()mul(147,188)where()what()mul(221,687)/)from()'[{mul(9,723)[{/?who()where()mul(113,227)> ~>$)mul(663,198)&[>#mul(567,600)]when()$@select())(%<&mul(472,423)#when()>(/]select()$;how(511,981)mul(785,371}-how():$where()(?~mul(731,455)mul(810,191);who()(@>,? !$mul(534,231&don't();]why();,#;where()[,mul(190,923) }when()mul :mul(525,573<{what() *$?from()from(){mul(885,340)why()>mul(398,414)?[where()$why()from())mul(988,667)mul(828,197)'why()/%*when()/*mul(799,415)where()]<~ ?>'-don't()^[(' ]%^~%mul(122,243)why();[how(951,959)how(435,882)~*-#don't()why()[what()what()'mul(218,944)!)&>'(where()+mul(686,595)#&when()mul(916,990))what()mul(414,411)>why()&select()!}why() ?>mul(820,386)select()mul(324,473)mul(690,413)!>$why()mul(23,907)who()%mul(579,551)where()when()how()?~&@-why()>mul(359,283)[don't() }mul(238,664)!]~^^#(why()mul(128,702)mul(750,811)what()',do()'@where()select()from(),/+&mul(640,613),&%+why()^from()from()*mul(314~${~*how()?what() mul(593,269)who()*mul(865,609)what()@~$+mul(784,462))],;;'what(){mul(902,580)when()<{~ ?>~how()mul(22,360)]mul(650,584)#select()!(why()/;+when()mul(173,450)where()mul(126,232)(?@/^how()why()who()mul(148,272)&?when()where()]mul(93,105)?!}!:@!mul(428,270)- where(179,717)>@!-,how()why()don't()!where()who()$:mul(472,276)<'&where()mul(334,580)'/-?+;(-mul(78,731)select()mul(584,89)*/>don't()/;''~how()?# how(261,707)$],mul(983,656)*> mul(340,628)]*][[/mul(193,206)(})~mul*/-#mul(976,903)%#why()$}-&mul(734,303)what()[from()*-/why()do()&why()!*]@from()&when()mul(339,902)from()([,[*^?how()mul(2,449)when()how()why()mul(799,379)-!#-mul(704,107)mul(205,807) :mul(787,710)mul(575,659)when(),];~'!mul(755,669){+&%$-,where()}# mul(555,644);^who()!}mul(341:@#{mul(135,278)where()how()what();where()mul(439,633),]$how()why()mul(708,508)where()%{why(744,659)mul(700--(why()*%/where()#<@don't()$?mul(39what(),#})$ select()how()~mul(847,132){)what(134,971)what(336,162))&/what()mul(470,625)#mul(275,789)where()<]mul(15,846)when()from()mul(21,575)%from()^when()when() ~(+select()what()mul(554,360)from()]~mul(785,136)}%#:?mul(117,254)who()do()% %;%-from(747,86)how()^/mul(313,607)why()mul(678,806),(mul(226,595)#%mul(415,823)']mul(873,709)#;select()'<> *mul(121,496)why()who()what()?where()mul(590,916)',/@what()how()?%mul(477,943)when()who()/';%mul(654,383)select()*why()'^select()]select()&mul(433,312);//~++what()&![]mul(532,452) + +*<@;mul(470,836why()who()select()#when()select()where()from(812,299)mul(469,324) select()why(){mul(891,321);'&$%@{mul(792,73)$$[who()>[[from():mul>why()?how()mul(522,233)([%select()mul(195,940)&mul(368,872)~}{who();!!>^^mul(920,394)^,select():?!%[mul(477,578): what()~!/select())who()/mul(976,739)>;who()who(43,925)&when()>>;+mul(857,247) mul(442,620){;mul(393,289)-!*mul(848,511)?how()}@mul(290,212))(~+#~:mul(150]*/>who()[>?:<]*[;+what()where()mul(307,698);;from()~%;where(84,170)[${mul(158,165):[what()^select()mul(977,383)'*@>/;:mul(920,657)*how()when()mul(816,293)select()~$+^+mul(420,667);(^where());mul(402,31)]mul(272,313)^>mul(161,164)@$$mul(260,136)&@}* > -mul(380,442)^#*!don't())?(;@mul(209/%(>,how()^mul(423,410)from()-mul(381,141)+~-)mul(674,158)^:what()>(^)who()mul*^,mul(74,315)!-),mul(341,503)where()/;*)why()),what()&mul(624,435)mul(880,482)}where():]why()mul(367,134)when()(when()mul(166,251)@+,who(),mul(610,271)+>)(mul(455,461)>&@-()from()+]mul(232,944)&,@when()@]mul(523,215)mul(876,836) mul(335,254)<#-{from()^mul(153,522)what(52,828)who()where()from()from()@&>$mul,!&what()^>*{'mul(670,505)$mul&&/(mul(672,267)mul(540,120)<$[->!}mul(234,539)!%]who(){mul(30,143)*mul(545,761)where()'!how(935,4)who()%'{~mul(673,752why()what()^:mul(111,407)from()}mul(860,90)#who()/^!how()-!{!mul(217,327)what()!'where()mul(729,143)where()!how()#mul(362,874)$how()how()->who()~^mul(315,718)!'-@~mul(206,449):/[??#mul(185,796)]~mul(597,268);) >select()from()?)<*mul(516,734)when()what()select()#$select()-?,$mul(366,627)%*{mul(62,39)^/$from()+mul(250+~select()!from(){mul(981,151)#}mul(92,876))how()who(363,963)mul(827,341)::how()~&mul(407,705)#+>mul(576,849)mul(482,236)(^* who(),what()mul(544%who()('>*!$@,}mul(113,286)when()'from(685,677)do()%from(614,566)-select()$,-mul(234,452)}>[&who(){#from()&don't()why()select(645,338):why(840,833)+#mul(874,529)}>what()select()why()mul(168,89)}{*when()}do()when()*?$^;?)]mul(811,383)!mul(770,725):!*#[from()from()from(487,367);:mul(564,858)(mul(248,563)*:;'mul??mul(254,676)+where()from()?'[){ how()mul(250,339))'!')where()}from()why()-*!mul(740,619)~$when(370,81)where()%-#;^mul(291;^<-mul(266,422)@%select()/why() [mul(794,513)where()>{+mul(944,970)!why();mul(968,484)/what()who()mul(285,45)when()who()^when(),mul(728,164),#/[)mul(568,114)%@:select() /*!mul(763,536)?@mul(506,503))do()@)^/mul(763,386)/why()how()from(417,323)>what() where()mul(260,628)?:'+$why()+@&mul(697,677)+]when():mul(246,278) + $mul(48,81)mul(266,777)who())@*~!?)# mul(843,750}mul(940,128)mul(477,389)who()}:when())<[when()mul(838,845)~mul(464,153)why(166,536){/&,~mul(282,701) -!?from();mul(101,631)from()/mul(236,985)why(458,58)do()&*&>how()mul(310,399) :{}^]don't()->when()from()+ mul(389,902)why(301,687) select()}> who()mul(265,840)/mul(652,469)~where()what(){<>~mul(792,402);> $+@select(747,467)[mul(720,836)%what(984,399)[select()-+{}}mul(757,143)-)%from(),)+where()mul(810,426)#who()^@mul,]-'(^^>mul(30,409),)from() mul(916,685what()how(){#/mul(494,862)-&mul(814,480)!&what()*mul(315,311)!when() @}*%#mul(571,122)~*mul(717,593))/mul(633,314)<^{[%{when()-,{mul(571,721):?,@~]select(){mul(275,614),select()/{[@mul(965,299)what()?$where()(#,(?mul(642,519),+~*]mul(830,103)/]:mul(61,609)from()where()from()([mul(808,331)$mul(885,259)))}mul(902,561)$*:mul(320,613)[where()}mul(374,288)~mul(720,106)*~$mul(967,879),who()[what()}when()/#$-mul(81,187)mul(368,22);];<}- @{mul(882,60)#select()when()mul(144,567);what(),,#don't(){+from()'! mul(608,319)(mul(225,187)%%(<,@#+%select()mul(130,278)!select()}'@mul(353,117)]%'-^/?^mul(799,639)who()}-[>mul(495,249)where()*,)~mul(768,867)why()mul(305,695)don't()?]where() ?#@(who()mul(748,367)why()+[mul(643,18)})mul(343,964){'mul(287,548)?%do(),from();/?';select()mul(97,411)!!{?mul(105,759)how())how()@mul(663,882)~[mul(709,411)@;]what()when()mul(267,470)&mul(857,988)}/]^-select()]^:where()do()why()where()]-*mul(566,77)-#mul(217,308)what()~~(select()&mul(462,131)<+]%how()select()mul(242,763)'select()why()mul(316,185)[when()/ mul(584,440)from() diff --git a/2024/d03/ex2/ex2.py b/2024/d03/ex2/ex2.py new file mode 100755 index 0000000..f85fb47 --- /dev/null +++ b/2024/d03/ex2/ex2.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python + +import dataclasses +import re +import sys + + +@dataclasses.dataclass +class MulInstruction: + lhs: int + rhs: int + + def calc(self) -> int: + return self.lhs * self.rhs + + +def solve(input: str) -> int: + def parse(input: str) -> list[MulInstruction]: + res: list[MulInstruction] = [] + + MUL_REGEX = re.compile(r"do\(\)|don't\(\)|mul\((\d+),(\d+)\)") + do = True + for match in MUL_REGEX.finditer(input): + if match.group(0) in ("do()", "don't()"): + do = match.group(0) == "do()" + continue + if not do: + continue + res.append(MulInstruction(int(match.group(1)), int(match.group(2)))) + + return res + + return sum(inst.calc() for inst in parse(input)) + + +def main() -> None: + input = sys.stdin.read() + print(solve(input)) + + +if __name__ == "__main__": + main() diff --git a/2024/d03/ex2/input b/2024/d03/ex2/input new file mode 100644 index 0000000..c154b5c --- /dev/null +++ b/2024/d03/ex2/input @@ -0,0 +1,6 @@ +}}+{where()mul(873,602) mul(954,447)^where()~mul(548,799)-#why():$from()(!mul(660,615):where()mul(596,918)how()[what()how()who()]@mul(594,699)$>$&why()mul(951,813)mul(948,41)]mul(699,225)>mul(840,275):@~^@%^select()mul(695,594)what()->-mul(409,636)@ {++mul(999,290)when(339,689),[+[+?mul(558,848)how(),what()&}]{mul(344,337)$)$]+,$,,why()do()::select()^:mul(796,16)mul(526,718) mul(66,417)#@>~do()why()from()/select()when():&mul(8,111);!where()do()}@mul(433,239)*}how() {^!do()#^mul(167,905)-&%(mul(979,711)when()]who()'?mul(523,172)[^what(844,455)'what()[/~@mul(928,776)where()]&/mul(587,380)who()/when()how()from(),}#}mul(97,952)select(837,505)~@>~%mul(486,198)^!mul(968,779)do()[mul(206,321);,where()where())how()}/mul(6,867)-&what()(mul(683,583)^(mul(244,555)^where()(how()what()?-[,who()mul(827,305);&,!$*?mul(793,452)^ )+(%-where()who()from()@who(){*mul(592,919)/:what():who()mul(213,139)what()$!?*how(934,24)$-who()(mul(661,7)?from(),}/who()mul(876,585)how()why():when()[@@mul(433,918)why()why(),*{who()when()who()mul(144,14/#(don't()@(@{~why()[who()mul(394,492)where()/mul(508,797)-mul(150,832)+$@why()(why()~mul(527,236)!:@!^&!mul(324>?!from()where())mul(731,184)#(}who()'mul(666,377)how()(;mul(346,141)^select()/@[$how()@]?mul(702,502,^where()<}[mul(872,308)+^!<@from() {:mul(537,974)%when()when()%mul(563,805)select()>how()>^';mul(643,555))where(290,606)who()?mul(656,803),?$/*?when()}@ mul(228,902)~/from(){where()what()>@~mul(849,93)~+select()?-^}mul(115,425)${what()mul(219,305)how()])from()select()~]~mul(41,659)<'{where():#+)$mul(447,137)where(120,771)$@why()#mul(457,857)<$from()$(who()@?mul(644,914)}mul(936,442);{*(why()mul(804,26);don't()why(),+*how() @:mul(668,778)%select() who() (,where()mul(66,974)^)when():$who()mul(832,615)#mul(572,646)where()how()what()when(673,330)where()when()&/mul(820,446)$why()where()mul(86,788)^~what()'mul(76,413)&'how()mul(616,424)what()select()}from()(/;mul(651,36)!{ mul[*mul(469,702)who()?;mul(331,879)?*from(54,751)who()#+[ mul(182,296)where(607,734){mul(920,190) :mul(660,732)^who()who()*'!mul(3,615)+{why(168,603)when(), mul(254,713); where()*from()~ !!#mul(897,311)]mul(629;what(280,32)>mul(194,563)^&mulwho()when()'!what()why()?'}}!mul(414,213)$when()]+{why()mul(606,917)how()*?^,mul(292,543)>mul(326,145)*(&!;^:!#'mul;#@~where()%;,from()select()mul(39,372)~[when()what()!+#who()]~mul(905,968from(843,581)(from()from()~what()how()when()mul(768,210)*mul(68,62)mul(777,345%{/select()%mul(458,251));what())how()where()how()when()mul(810,199)<~mul(252,749)don't()mul(915,327)(: mul(608,270)<%[!}-&mul(328,665)from()>*)how()mul(836,471)mul(270,799);(why();&~~mul(598,772)from()>mul(409,297)$mul(469,982)mul(457,665):@>{don't()why()<+,mul(293,172select(816,987)}why()mul(372,420)why()%mul(105,735),<]{mul?{$;>from()what()-$;mul(348,90)from()what()~mul(634,662)^do()$@]*)~,&mul(226,996)when()%]what()!@/&mul(322,135);who() &^select()*&}mul(967,104)from()}'who(701,7)~%[mul(687,163)@:+:mul(382,128)mul(831,450)mul(485,444)%^what()what()[$what()@}do()-%?'mul(204,152);$'/mul(63,376)mul(387,70)~@'{,':why()(%{how()who()]',from()'how()why()mul(42,665)%'# [}mul(684,645){{%'mul(115,930)mul(552,181)mul(762,163)mul(202,193)+*[mul(525,337)+}-:](?^#mul(466,861)/do()'(;mul(860,319);mul(48,137){when() ~:< from()mul(3,497)?when()< #?^@do()>;/?:mul(522,894)+{+mul(419,20)mul(139,677)where(119,273)*what()[^?mul(563,549)how()<@'%mul(560,434)what()where(),mul(886,302)mul(632,393)*what()!}{mul(769,651)'(mul(267,514)-[how()^:mul(64,902)when()mul(356,352# ;'mul(267,302)#(mul@;~+mul(471,643)!from())!what()from()~mul(429,997)/-mul(401,220)>{]what()what()@select()},mul(294,298)how()mul(230,3)/&what()]>]!how()/mul(888,907)](#>~}+#mul(17,816)/[+when()>from()]^:mul(94,85) +#)'{mul(531,103){ {where()what()from()mul(127,712))what()!%from()'/how()*when(940,337)mul(259,916)+}!-}[mul(703,780++;select()?why()[{mul(221,199)+mul(303,268)$don't()'[what();^mul(542,561);who()&,mul(68,800)[<'{}why()?^from()mul(26,194)?]who():;mul(641,921)#&where()mul(539,571)select()]~%%]when())mul(833,642);mul(209,564)}<^)when()mul(648,430/(#)/?(';where()what()mul(818,526) ]!what()do() <;:mulfrom() @-mul(764,627)#/mul(887,607), do()$(},#^}}from()how()mul(184,287)where()$^mul(859,310){who()how()mul(692,592){>?&mul(223,912)what()^@ {{^@/mul(736,965)$)]];-#@&mul(600,145)~/}*-}how()mul(893,646):where()}mul(205,416)what()from()mul(35,844)mul(94,245))/<#+mul(189,780)from()how()#< ^don't()why()&who()where(){ >:mul(638,986)*+< ;mul(131,393),how(419,400)*@how()mul(856,729)who()$$[$[select()~{(when()$mul(613,175)}mul(503,337)~)what() mul:!-*}?~who()-mul(649,886)+how(738,973)when()[(mul(593,702)where()%%^(]who()mul(456,697)%~^'when()how()mul(789,446)mul(737,439)mul(830,910):>why()when()how()'?]why()>do()#'&why()'from()mul(972,441):mul(157,521)mul(43,224):$who()>select()how()mul(52,740)'mul(136,716)select()mul(613,433)]>$^when()why()where()how();mul(978,314))$mul(695,29)}mul(778,660){how()<+$?mul(402,606)select()+~$do()mul(262,94)how()why()))#'^$@mul}mul(201,86)*select()mul(876,626)why()mul(174,750)where()(from()(mul(433,335)]@mul(29,940) :~what()$}where()select()mul(416,920)^&%<~^mul(276,648)mul(636,17);why()}-}mul(810,73)<@} how():from(900,831)what()mul(241,497)select()when()'&{mul(603,108):[,mul(941,454) $@mul>@<}'[, $mul(510,523)where(), ~];mul(584,102)' do()why()<&select(812,485)!mul(538,458)who()why()^'select(){{why()mul(773,196)when()why(713,26){,!do()?why()!when(),?mul(234,541)mul(558]!(%;}'-mul(721,55) +(<%@$?mul(856,705]>!#'++why() >#!/usr/bin/perlfrom()mul(147,188)where()what()mul(221,687)/)from()'[{mul(9,723)[{/?who()where()mul(113,227)> ~>$)mul(663,198)&[>#mul(567,600)]when()$@select())(%<&mul(472,423)#when()>(/]select()$;how(511,981)mul(785,371}-how():$where()(?~mul(731,455)mul(810,191);who()(@>,? !$mul(534,231&don't();]why();,#;where()[,mul(190,923) }when()mul :mul(525,573<{what() *$?from()from(){mul(885,340)why()>mul(398,414)?[where()$why()from())mul(988,667)mul(828,197)'why()/%*when()/*mul(799,415)where()]<~ ?>'-don't()^[(' ]%^~%mul(122,243)why();[how(951,959)how(435,882)~*-#don't()why()[what()what()'mul(218,944)!)&>'(where()+mul(686,595)#&when()mul(916,990))what()mul(414,411)>why()&select()!}why() ?>mul(820,386)select()mul(324,473)mul(690,413)!>$why()mul(23,907)who()%mul(579,551)where()when()how()?~&@-why()>mul(359,283)[don't() }mul(238,664)!]~^^#(why()mul(128,702)mul(750,811)what()',do()'@where()select()from(),/+&mul(640,613),&%+why()^from()from()*mul(314~${~*how()?what() mul(593,269)who()*mul(865,609)what()@~$+mul(784,462))],;;'what(){mul(902,580)when()<{~ ?>~how()mul(22,360)]mul(650,584)#select()!(why()/;+when()mul(173,450)where()mul(126,232)(?@/^how()why()who()mul(148,272)&?when()where()]mul(93,105)?!}!:@!mul(428,270)- where(179,717)>@!-,how()why()don't()!where()who()$:mul(472,276)<'&where()mul(334,580)'/-?+;(-mul(78,731)select()mul(584,89)*/>don't()/;''~how()?# how(261,707)$],mul(983,656)*> mul(340,628)]*][[/mul(193,206)(})~mul*/-#mul(976,903)%#why()$}-&mul(734,303)what()[from()*-/why()do()&why()!*]@from()&when()mul(339,902)from()([,[*^?how()mul(2,449)when()how()why()mul(799,379)-!#-mul(704,107)mul(205,807) :mul(787,710)mul(575,659)when(),];~'!mul(755,669){+&%$-,where()}# mul(555,644);^who()!}mul(341:@#{mul(135,278)where()how()what();where()mul(439,633),]$how()why()mul(708,508)where()%{why(744,659)mul(700--(why()*%/where()#<@don't()$?mul(39what(),#})$ select()how()~mul(847,132){)what(134,971)what(336,162))&/what()mul(470,625)#mul(275,789)where()<]mul(15,846)when()from()mul(21,575)%from()^when()when() ~(+select()what()mul(554,360)from()]~mul(785,136)}%#:?mul(117,254)who()do()% %;%-from(747,86)how()^/mul(313,607)why()mul(678,806),(mul(226,595)#%mul(415,823)']mul(873,709)#;select()'<> *mul(121,496)why()who()what()?where()mul(590,916)',/@what()how()?%mul(477,943)when()who()/';%mul(654,383)select()*why()'^select()]select()&mul(433,312);//~++what()&![]mul(532,452) + +*<@;mul(470,836why()who()select()#when()select()where()from(812,299)mul(469,324) select()why(){mul(891,321);'&$%@{mul(792,73)$$[who()>[[from():mul>why()?how()mul(522,233)([%select()mul(195,940)&mul(368,872)~}{who();!!>^^mul(920,394)^,select():?!%[mul(477,578): what()~!/select())who()/mul(976,739)>;who()who(43,925)&when()>>;+mul(857,247) mul(442,620){;mul(393,289)-!*mul(848,511)?how()}@mul(290,212))(~+#~:mul(150]*/>who()[>?:<]*[;+what()where()mul(307,698);;from()~%;where(84,170)[${mul(158,165):[what()^select()mul(977,383)'*@>/;:mul(920,657)*how()when()mul(816,293)select()~$+^+mul(420,667);(^where());mul(402,31)]mul(272,313)^>mul(161,164)@$$mul(260,136)&@}* > -mul(380,442)^#*!don't())?(;@mul(209/%(>,how()^mul(423,410)from()-mul(381,141)+~-)mul(674,158)^:what()>(^)who()mul*^,mul(74,315)!-),mul(341,503)where()/;*)why()),what()&mul(624,435)mul(880,482)}where():]why()mul(367,134)when()(when()mul(166,251)@+,who(),mul(610,271)+>)(mul(455,461)>&@-()from()+]mul(232,944)&,@when()@]mul(523,215)mul(876,836) mul(335,254)<#-{from()^mul(153,522)what(52,828)who()where()from()from()@&>$mul,!&what()^>*{'mul(670,505)$mul&&/(mul(672,267)mul(540,120)<$[->!}mul(234,539)!%]who(){mul(30,143)*mul(545,761)where()'!how(935,4)who()%'{~mul(673,752why()what()^:mul(111,407)from()}mul(860,90)#who()/^!how()-!{!mul(217,327)what()!'where()mul(729,143)where()!how()#mul(362,874)$how()how()->who()~^mul(315,718)!'-@~mul(206,449):/[??#mul(185,796)]~mul(597,268);) >select()from()?)<*mul(516,734)when()what()select()#$select()-?,$mul(366,627)%*{mul(62,39)^/$from()+mul(250+~select()!from(){mul(981,151)#}mul(92,876))how()who(363,963)mul(827,341)::how()~&mul(407,705)#+>mul(576,849)mul(482,236)(^* who(),what()mul(544%who()('>*!$@,}mul(113,286)when()'from(685,677)do()%from(614,566)-select()$,-mul(234,452)}>[&who(){#from()&don't()why()select(645,338):why(840,833)+#mul(874,529)}>what()select()why()mul(168,89)}{*when()}do()when()*?$^;?)]mul(811,383)!mul(770,725):!*#[from()from()from(487,367);:mul(564,858)(mul(248,563)*:;'mul??mul(254,676)+where()from()?'[){ how()mul(250,339))'!')where()}from()why()-*!mul(740,619)~$when(370,81)where()%-#;^mul(291;^<-mul(266,422)@%select()/why() [mul(794,513)where()>{+mul(944,970)!why();mul(968,484)/what()who()mul(285,45)when()who()^when(),mul(728,164),#/[)mul(568,114)%@:select() /*!mul(763,536)?@mul(506,503))do()@)^/mul(763,386)/why()how()from(417,323)>what() where()mul(260,628)?:'+$why()+@&mul(697,677)+]when():mul(246,278) + $mul(48,81)mul(266,777)who())@*~!?)# mul(843,750}mul(940,128)mul(477,389)who()}:when())<[when()mul(838,845)~mul(464,153)why(166,536){/&,~mul(282,701) -!?from();mul(101,631)from()/mul(236,985)why(458,58)do()&*&>how()mul(310,399) :{}^]don't()->when()from()+ mul(389,902)why(301,687) select()}> who()mul(265,840)/mul(652,469)~where()what(){<>~mul(792,402);> $+@select(747,467)[mul(720,836)%what(984,399)[select()-+{}}mul(757,143)-)%from(),)+where()mul(810,426)#who()^@mul,]-'(^^>mul(30,409),)from() mul(916,685what()how(){#/mul(494,862)-&mul(814,480)!&what()*mul(315,311)!when() @}*%#mul(571,122)~*mul(717,593))/mul(633,314)<^{[%{when()-,{mul(571,721):?,@~]select(){mul(275,614),select()/{[@mul(965,299)what()?$where()(#,(?mul(642,519),+~*]mul(830,103)/]:mul(61,609)from()where()from()([mul(808,331)$mul(885,259)))}mul(902,561)$*:mul(320,613)[where()}mul(374,288)~mul(720,106)*~$mul(967,879),who()[what()}when()/#$-mul(81,187)mul(368,22);];<}- @{mul(882,60)#select()when()mul(144,567);what(),,#don't(){+from()'! mul(608,319)(mul(225,187)%%(<,@#+%select()mul(130,278)!select()}'@mul(353,117)]%'-^/?^mul(799,639)who()}-[>mul(495,249)where()*,)~mul(768,867)why()mul(305,695)don't()?]where() ?#@(who()mul(748,367)why()+[mul(643,18)})mul(343,964){'mul(287,548)?%do(),from();/?';select()mul(97,411)!!{?mul(105,759)how())how()@mul(663,882)~[mul(709,411)@;]what()when()mul(267,470)&mul(857,988)}/]^-select()]^:where()do()why()where()]-*mul(566,77)-#mul(217,308)what()~~(select()&mul(462,131)<+]%how()select()mul(242,763)'select()why()mul(316,185)[when()/ mul(584,440)from() diff --git a/flake.nix b/flake.nix index 36616f8..dc747a0 100644 --- a/flake.nix +++ b/flake.nix @@ -39,17 +39,17 @@ src = self; hooks = { - black = { - enable = true; - }; - - isort = { - enable = true; - }; - nixpkgs-fmt = { enable = true; }; + + ruff = { + enable = true; + }; + + ruff-format = { + enable = true; + }; }; }; }; @@ -57,12 +57,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; diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 0000000..a34e1ec --- /dev/null +++ b/ruff.toml @@ -0,0 +1,8 @@ +[lint] +extend-select = [ + "I", # Import sorting is a lint check +] +ignore = [ + "E731", # Assigning lambdas is sometimes more readable + "E741", # Ambiguous variable names are good enough actually +]