Compare commits

...

49 commits

Author SHA1 Message Date
Bruno BELANYI 98f700304a 2021: d13: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 33ac0a0ef7 2021: d13: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 2653c113c6 2021: d13: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI e86edd3ac5 2021: d13: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 6d6e912dbd 2021: d12: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 3e10ae4592 2021: d12: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 7c71e71c9b 2021: d12: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 729f00ade8 2021: d12: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 9d81eec57c 2021: d11: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 9d869389d3 2021: d11: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI bb829a7c63 2021: d11: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI bd9ac08665 2021: d11: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 3cc7725710 2021: d10: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI de7a1e5845 2021: d10: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI c4e280470c 2021: d10: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 51a6918e58 2021: d10: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI b267f9ffaf 2021: d09: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 98f960ad29 2021: d09: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI e3655069e2 2021: d09: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI ad92d95fd4 2021: d09: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 8080b1af90 2021: d08: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 2d32ff35fc 2021: d08: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 1ef5ea9f5a 2021: d08: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 9482b211a7 2021: d08: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 7baac920f0 2021: d07: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 07dea5a686 2021: d07: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 127c13e162 2021: d07: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 2c8baf5722 2021: d07: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI d965e869f3 2021: d06: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI c9aabe6500 2021: d06: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI db366100bf 2021: d06: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 1ad6c51ca4 2021: d06: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 9721b7d614 2021: d05: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI f3ece04967 2021: d05: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 634d057fd7 2021: d05: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 5c76967db8 2021: d05: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 943db5516d 2021: d04: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 648faefa84 2021: d04: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 6cfd253d9a 2021: d04: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 56cb23a39b 2021: d04: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 7d72fb6974 2021: d03: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 3849629175 2021: d03: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI d4aec63da5 2021: d03: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 4f3f276f52 2021: d03: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI dd83d8ca96 2021: d02: ex2: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI d647f2776f 2021: d02: ex2: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI 1681d65a2a 2021: d02: ex1: add solution 2021-12-13 14:27:09 +01:00
Bruno BELANYI 8592509eba 2021: d02: ex1: add input 2021-12-13 14:27:09 +01:00
Bruno BELANYI ac3bef16fc 2021: d01: ex2: add solution 2021-12-13 14:27:09 +01:00
49 changed files with 10179 additions and 0 deletions

30
2021/d01/ex2/ex2.py Executable file
View file

@ -0,0 +1,30 @@
#!/usr/bin/env python
import collections
import itertools
import sys
from typing import List
def sliding_window(iterable, n):
it = iter(iterable)
window = collections.deque(itertools.islice(it, n), maxlen=n)
if len(window) == n:
yield tuple(window)
for x in it:
window.append(x)
yield tuple(window)
def solve(input: List[int]) -> int:
windowed = [sum(window) for window in sliding_window(input, 3)]
return sum(prev < cur for (prev, cur) in zip(windowed, windowed[1:]))
def main() -> None:
input = [int(line) for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

32
2021/d02/ex1/ex1.py Executable file
View file

@ -0,0 +1,32 @@
#!/usr/bin/env python
import itertools
import sys
from typing import List
def solve(input: List[str]) -> int:
x, y = 0, 0
for instruction in input:
dir, length_ = instruction.split(" ")
length = int(length_)
if dir == "forward":
x += length
elif dir == "down":
y += length
elif dir == "up":
y -= length
else:
assert False
return x * y
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

1000
2021/d02/ex1/input Normal file

File diff suppressed because it is too large Load diff

33
2021/d02/ex2/ex2.py Executable file
View file

@ -0,0 +1,33 @@
#!/usr/bin/env python
import itertools
import sys
from typing import List
def solve(input: List[str]) -> int:
x, y, aim = 0, 0, 0
for instruction in input:
dir, length_ = instruction.split(" ")
length = int(length_)
if dir == "forward":
x += length
y += length * aim
elif dir == "down":
aim += length
elif dir == "up":
aim -= length
else:
assert False
return x * y
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

1000
2021/d02/ex2/input Normal file

File diff suppressed because it is too large Load diff

30
2021/d03/ex1/ex1.py Executable file
View file

@ -0,0 +1,30 @@
#!/usr/bin/env python
import itertools
import sys
from typing import List
def solve(input: List[int]) -> int:
gamma, epsilon = 0, 0
bit = 1
while any(map(bool, input)):
num_bits = sum(n % 2 for n in input)
if num_bits >= len(input) / 2:
gamma += bit
else:
epsilon += bit
input = [n // 2 for n in input]
bit *= 2
return gamma * epsilon
def main() -> None:
input = [int(line, 2) for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

1000
2021/d03/ex1/input Normal file

File diff suppressed because it is too large Load diff

68
2021/d03/ex2/ex2.py Executable file
View file

@ -0,0 +1,68 @@
#!/usr/bin/env python
import itertools
import sys
from copy import deepcopy
from typing import List
def solve(input: List[int]) -> int:
def highest_pow2(n: int) -> int:
return len(bin(n)) - 2 - 1 # '0b' prefix, and off-by-one
def count_bits_at(input: List[int], bit: int) -> int:
return sum((n & pow(2, bit)) != 0 for n in input)
def filter_by_bit_value(input: List[int], bit: int, value: int) -> List[int]:
# Simplify the filter by mapping the value to the actual power of 2
if value != 0:
value = pow(2, bit)
return list(filter(lambda n: (n & pow(2, bit)) == value, input))
def filter_oxygen(input: List[int], bit: int) -> List[int]:
# No further processing needed
if len(input) <= 1:
return input
num_bits = count_bits_at(input, bit)
# Keep 1s on equality
if num_bits >= len(input) / 2:
return filter_by_bit_value(input, bit, 1)
else:
return filter_by_bit_value(input, bit, 0)
def filter_co2(input: List[int], bit: int) -> List[int]:
# No further processing needed
if len(input) <= 1:
return input
num_bits = count_bits_at(input, bit)
# Keep 0s on equality
if num_bits < len(input) / 2:
return filter_by_bit_value(input, bit, 1)
else:
return filter_by_bit_value(input, bit, 0)
oxygen, co2 = 0, 0
max_bit = max(highest_pow2(n) for n in input)
oxygen_input, co2_input = deepcopy(input), deepcopy(input)
for bit in range(max_bit, -1, -1):
oxygen_input = filter_oxygen(oxygen_input, bit)
co2_input = filter_co2(co2_input, bit)
if len(oxygen_input) == 1:
oxygen = oxygen_input[0]
if len(co2_input) == 1:
co2 = co2_input[0]
return oxygen * co2
def main() -> None:
input = [int(line, 2) for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

1000
2021/d03/ex2/input Normal file

File diff suppressed because it is too large Load diff

59
2021/d04/ex1/ex1.py Executable file
View file

@ -0,0 +1,59 @@
#!/usr/bin/env python
import itertools
import sys
from typing import List, Tuple
Board = List[List[int]]
def solve(input: List[str]) -> int:
def parse_input() -> Tuple[List[int], List[Board]]:
def listify(line: str, delim: str = " ") -> List[int]:
return [int(n) for n in line.split(delim) if n != ""]
draw_order = listify(input[0], delim=",")
boards: List[Board] = []
for l in input[1:]:
if l == "":
boards.append([])
continue
boards[-1].append(listify(l))
return draw_order, boards
def bingo(board: Board, draw: List[int]) -> bool:
assert len(board) == len(board[0])
def line(l: int) -> bool:
return all(n in draw for n in board[l])
def row(r: int) -> bool:
return all(board[i][r] in draw for i in range(len(board)))
lines = [line(i) for i in range(len(board))]
rows = [row(i) for i in range(len(board[0]))]
return any(itertools.chain(lines, rows))
draw_order, boards = parse_input()
draw = []
for d in draw_order:
draw.append(d)
for b in boards:
if not bingo(b, draw):
continue
return d * sum(n for n in itertools.chain.from_iterable(b) if n not in draw)
# Sanity check
assert False
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

601
2021/d04/ex1/input Normal file
View file

@ -0,0 +1,601 @@
85,84,30,15,46,71,64,45,13,90,63,89,62,25,87,68,73,47,65,78,2,27,67,95,88,99,96,17,42,31,91,98,57,28,38,93,43,0,55,49,22,24,82,54,59,52,3,26,9,32,4,48,39,50,80,21,5,1,23,10,58,34,12,35,74,8,6,79,40,76,86,69,81,61,14,92,97,19,7,51,33,11,77,75,20,70,29,36,60,18,56,37,72,41,94,44,83,66,16,53
78 13 8 62 67
42 89 97 16 65
5 12 73 50 56
45 10 63 41 64
49 1 95 71 17
60 25 66 82 22
94 45 68 5 12
46 44 48 31 34
10 56 37 96 81
99 39 84 32 6
11 86 77 36 2
57 68 27 74 4
81 92 49 37 51
78 43 94 46 63
13 52 72 17 44
88 13 81 21 20
80 99 23 37 53
44 68 15 38 55
84 48 82 97 6
4 43 52 72 31
39 62 45 86 44
12 17 16 7 6
84 42 82 34 85
19 77 9 48 98
21 99 67 26 69
1 75 50 5 44
3 28 62 17 43
14 52 64 77 81
32 89 7 11 70
38 36 71 45 58
53 32 35 69 63
6 21 75 64 96
10 89 15 48 26
23 20 43 57 33
18 49 51 47 74
20 79 9 74 13
52 28 77 26 43
57 83 4 25 70
90 1 30 53 38
56 66 82 35 51
12 3 31 93 8
20 27 51 78 9
29 46 82 85 75
15 76 91 70 63
59 39 13 43 79
46 35 15 13 2
65 69 97 77 87
64 59 94 88 40
34 79 92 93 58
47 28 74 82 29
32 38 24 68 12
8 78 79 89 43
67 54 6 98 48
1 14 83 15 37
44 10 97 74 33
9 95 2 99 1
8 42 60 56 40
32 11 71 14 80
77 6 68 46 48
98 70 39 44 62
43 94 41 13 15
96 99 35 27 8
22 75 73 17 90
62 23 5 88 3
10 52 61 60 57
31 62 74 3 79
15 49 60 28 71
66 2 11 36 41
34 80 33 94 75
64 56 84 70 16
98 94 68 32 26
61 7 52 66 18
40 20 82 81 74
28 36 89 14 35
71 11 44 13 72
81 30 6 86 37
46 45 64 83 62
7 70 38 51 15
91 41 26 40 4
87 0 82 74 60
83 99 26 69 1
6 98 53 31 43
82 64 42 90 34
87 62 11 40 39
77 51 2 30 97
96 5 24 44 32
48 92 78 74 76
99 33 93 97 49
45 8 88 66 59
52 64 29 60 82
69 23 59 96 71
14 93 21 44 62
65 84 2 39 1
0 68 38 81 4
48 31 26 60 34
24 46 44 52 98
65 23 31 89 5
34 79 75 96 41
76 28 90 12 11
68 29 38 70 50
51 0 45 23 20
44 49 12 31 7
41 26 46 75 92
90 30 72 95 55
87 57 10 99 40
25 67 80 74 44
3 82 27 81 11
33 42 97 57 70
19 94 0 2 49
6 90 60 29 58
79 59 96 68 14
38 70 65 66 69
36 75 20 18 29
64 88 35 61 43
57 76 62 23 25
60 9 81 94 62
73 20 87 72 14
95 63 42 51 13
75 83 32 30 66
97 6 80 82 17
3 88 31 43 68
20 78 47 10 91
14 42 40 74 39
5 32 16 97 1
9 33 49 70 36
77 31 65 27 52
49 74 57 25 66
24 4 39 33 1
23 14 19 2 21
80 71 29 81 91
32 68 47 3 88
1 97 99 28 80
2 25 18 31 51
26 10 73 34 40
8 55 45 36 37
79 81 33 94 51
84 4 91 0 69
49 80 35 67 20
98 48 64 38 30
25 83 45 97 42
18 5 84 94 50
36 47 2 52 65
39 77 83 37 80
51 88 15 12 31
87 17 68 48 67
39 95 30 8 86
45 57 40 51 60
85 88 33 93 25
76 52 37 68 6
11 80 69 19 71
6 71 25 66 54
33 17 98 63 20
27 14 44 43 18
68 10 50 35 65
61 3 83 12 13
46 21 43 15 19
99 82 8 95 80
1 10 45 58 53
23 94 50 66 52
57 98 26 77 90
11 50 55 28 79
4 3 26 57 56
68 86 10 87 69
32 35 89 63 29
66 27 33 8 30
23 34 94 93 47
7 71 9 52 50
45 79 13 43 86
0 51 17 6 26
4 82 44 38 37
49 24 16 64 32
46 84 3 29 51
71 82 33 61 26
15 5 94 86 41
63 36 10 67 43
94 17 3 71 91
93 50 88 36 27
54 68 7 8 34
9 92 37 45 52
47 29 70 10 69
79 27 30 0 12
51 70 19 89 20
2 42 64 21 49
48 39 1 3 56
98 35 95 82 72
91 71 65 95 44
26 72 92 59 43
61 93 6 4 90
76 31 8 1 29
82 64 89 22 45
55 4 1 42 87
88 34 67 83 45
22 23 98 24 12
74 72 49 32 25
73 7 19 26 3
0 43 50 57 80
68 21 87 1 91
60 6 81 78 99
35 98 72 49 16
36 25 13 48 22
59 1 26 3 71
43 55 50 7 16
5 64 29 38 84
41 23 60 19 24
85 58 49 98 33
80 48 3 65 38
30 97 96 45 7
6 85 8 90 40
37 78 84 16 24
69 11 43 64 63
28 14 19 1 97
37 39 86 23 64
20 67 85 65 90
54 51 59 91 43
17 30 11 24 7
22 88 27 43 10
35 3 72 52 57
61 54 28 69 37
71 78 96 82 81
33 39 32 40 7
50 60 69 33 57
84 22 95 74 6
90 94 71 45 68
72 86 77 9 24
73 12 89 13 1
66 35 36 87 73
77 96 52 47 68
63 4 83 20 95
17 70 9 18 50
98 40 25 60 26
31 37 81 34 56
3 15 43 51 35
67 70 1 20 12
80 54 69 17 88
65 91 60 8 53
76 23 87 41 18
49 58 92 98 25
77 53 44 17 27
67 28 37 66 95
59 39 33 4 34
0 25 2 5 22
26 85 90 51 21
31 79 10 41 45
69 56 1 67 40
59 98 99 89 6
95 67 72 52 78
88 61 96 11 43
34 73 53 54 8
71 3 70 42 58
12 82 97 68 98
20 10 13 74 89
82 25 45 92 61
58 62 0 22 57
68 90 36 18 75
48 39 69 4 52
40 3 86 33 98
30 67 39 7 69
80 64 77 54 51
24 49 6 68 61
62 94 1 26 50
89 88 7 21 87
83 10 78 27 97
35 62 86 13 38
28 80 19 36 75
98 93 47 33 57
22 88 35 79 85
98 96 89 69 17
37 62 57 39 1
99 10 55 50 71
65 94 67 4 63
7 83 51 95 98
56 93 62 85 9
72 14 44 70 67
42 4 65 37 54
47 82 1 60 55
0 73 60 25 64
90 11 93 85 89
80 97 86 76 96
43 92 88 72 44
62 87 81 34 49
47 27 89 98 68
86 76 14 96 17
21 4 41 74 29
18 82 33 34 20
30 62 95 42 51
45 4 70 20 53
66 39 43 82 1
54 30 68 77 42
61 41 65 94 35
25 78 22 26 46
70 73 44 48 61
69 7 85 47 89
91 22 12 98 11
25 60 58 46 54
5 37 83 62 65
47 62 30 70 40
86 9 64 61 0
27 63 90 88 17
18 71 42 33 93
91 14 81 4 31
81 7 22 94 55
99 90 60 9 46
65 2 47 1 73
78 76 75 19 88
63 51 86 56 49
25 27 12 22 30
87 75 16 4 32
19 73 5 20 52
18 6 34 94 31
23 96 84 26 66
23 69 51 35 5
13 76 99 89 82
88 3 50 54 33
19 59 92 84 34
64 80 42 40 60
15 91 92 60 36
46 40 53 34 27
13 35 96 16 42
4 61 81 56 24
85 21 7 99 20
32 37 19 21 28
66 7 96 46 88
23 52 25 50 22
53 62 34 81 27
98 31 14 40 49
23 43 71 61 12
8 94 91 74 7
67 2 59 77 4
39 18 97 41 21
55 15 31 9 38
29 69 52 16 75
71 15 34 79 86
62 57 48 44 54
11 32 96 13 60
56 77 26 68 82
93 57 21 94 31
29 4 59 24 40
13 99 34 96 91
70 55 47 62 51
33 32 19 69 71
76 80 1 57 20
13 28 72 27 79
40 21 71 37 85
26 12 67 33 99
11 41 62 18 64
23 22 92 69 86
38 79 47 56 83
74 46 1 95 24
93 71 28 54 52
94 51 33 57 73
17 96 4 81 76
67 20 24 21 70
28 77 3 74 10
45 78 18 7 15
8 48 27 58 13
51 58 59 73 35
13 7 92 15 98
75 26 1 49 24
91 85 44 34 74
64 2 20 72 90
46 89 50 54 79
9 60 98 36 78
91 16 80 92 20
77 69 13 76 75
95 41 45 3 40
86 7 67 20 99
14 18 97 70 0
81 27 89 30 3
39 37 56 42 32
35 71 49 8 73
60 67 61 6 86
25 41 24 29 88
98 3 90 56 87
45 22 84 70 99
53 59 27 26 57
17 4 11 41 66
28 39 27 54 89
3 78 37 93 29
95 23 86 51 40
75 67 71 57 92
60 41 91 89 52
68 46 83 62 1
18 21 72 19 35
55 34 11 16 75
32 71 61 78 50
27 38 70 48 93
16 2 80 17 63
97 89 55 86 85
54 5 41 33 60
51 95 12 67 37
72 17 74 6 41
53 19 8 12 92
39 84 82 63 48
22 21 87 13 32
40 34 64 15 31
75 2 46 64 99
26 72 79 90 76
85 68 10 28 67
20 34 81 12 83
92 1 65 43 71
49 80 85 54 9
31 40 22 94 51
12 73 43 68 98
78 91 70 3 28
47 59 69 99 62
46 56 28 73 20
5 29 69 68 22
64 12 8 52 92
36 44 90 72 0
76 48 33 86 66
99 61 97 17 74
32 52 44 42 9
57 67 36 41 31
68 1 50 22 11
73 12 21 48 62
44 53 77 88 87
27 99 59 98 74
33 66 51 14 34
29 30 60 49 80
47 84 36 12 71
29 89 54 59 70
87 65 77 38 25
40 17 41 9 30
45 27 0 5 24
52 8 35 68 10
16 41 66 87 76
94 70 51 48 96
90 73 98 89 91
4 46 30 28 63
68 45 37 80 57
19 11 46 41 14
94 48 66 86 9
42 90 56 70 21
95 54 74 30 87
81 89 49 60 34
18 90 79 64 98
27 74 59 53 11
96 45 17 14 23
9 60 30 42 12
97 21 31 5 41
98 63 51 92 64
55 30 46 22 91
8 73 61 57 67
37 60 49 31 10
80 99 77 11 82
52 69 77 41 8
94 11 78 62 28
91 39 96 79 3
44 88 37 0 47
6 80 49 98 48
93 2 70 26 4
47 8 94 12 3
10 7 24 40 23
49 84 50 56 44
41 53 96 1 85
76 78 70 24 75
71 19 85 77 25
21 44 58 45 64
40 38 9 50 61
79 42 86 37 6
34 39 94 84 0
90 80 78 54 49
13 81 87 60 56
74 59 75 41 28
29 67 66 44 20
50 66 43 39 16
88 94 60 70 64
63 80 56 69 36
53 48 32 22 79
59 77 20 30 67
70 56 80 12 11
35 55 40 71 87
84 27 96 46 85
20 23 26 29 14
58 37 21 75 68
78 23 13 37 94
65 44 54 43 38
29 60 83 1 57
98 2 75 12 14
92 25 48 9 52
64 37 93 48 34
22 81 58 5 13
63 80 2 67 53
62 52 79 41 44
83 75 96 91 88
1 54 88 45 90
81 78 19 8 40
17 74 69 87 33
9 64 85 50 71
92 38 65 82 41
2 62 96 60 81
51 1 34 48 25
78 13 74 65 42
46 64 57 19 72
85 88 53 68 76
57 95 40 92 27
65 37 42 90 9
17 72 78 43 45
87 28 48 81 79
7 4 24 67 70

69
2021/d04/ex2/ex2.py Executable file
View file

@ -0,0 +1,69 @@
#!/usr/bin/env python
import itertools
import sys
from typing import List, Tuple
Board = List[List[int]]
def solve(input: List[str]) -> int:
def parse_input() -> Tuple[List[int], List[Board]]:
def listify(line: str, delim: str = " ") -> List[int]:
return [int(n) for n in line.split(delim) if n != ""]
draw_order = listify(input[0], delim=",")
boards: List[Board] = []
for l in input[1:]:
if l == "":
boards.append([])
continue
boards[-1].append(listify(l))
return draw_order, boards
def bingo(board: Board, draw: List[int]) -> bool:
assert len(board) == len(board[0])
def line(l: int) -> bool:
return all(n in draw for n in board[l])
def row(r: int) -> bool:
return all(board[i][r] in draw for i in range(len(board)))
lines = [line(i) for i in range(len(board))]
rows = [row(i) for i in range(len(board[0]))]
return any(itertools.chain(lines, rows))
draw_order, boards = parse_input()
draw = []
losers = set(range(len(boards)))
for d in draw_order:
draw.append(d)
for i, b in enumerate(boards):
# Stop early if we already know this board wins
if i not in losers:
continue
if not bingo(b, draw):
continue
# Discard winners until the last one
if len(losers) != 1:
losers.discard(i)
continue
# At thid point, we must be looking at the last winning board
return d * sum(n for n in itertools.chain.from_iterable(b) if n not in draw)
# Sanity check
assert False
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

601
2021/d04/ex2/input Normal file
View file

@ -0,0 +1,601 @@
85,84,30,15,46,71,64,45,13,90,63,89,62,25,87,68,73,47,65,78,2,27,67,95,88,99,96,17,42,31,91,98,57,28,38,93,43,0,55,49,22,24,82,54,59,52,3,26,9,32,4,48,39,50,80,21,5,1,23,10,58,34,12,35,74,8,6,79,40,76,86,69,81,61,14,92,97,19,7,51,33,11,77,75,20,70,29,36,60,18,56,37,72,41,94,44,83,66,16,53
78 13 8 62 67
42 89 97 16 65
5 12 73 50 56
45 10 63 41 64
49 1 95 71 17
60 25 66 82 22
94 45 68 5 12
46 44 48 31 34
10 56 37 96 81
99 39 84 32 6
11 86 77 36 2
57 68 27 74 4
81 92 49 37 51
78 43 94 46 63
13 52 72 17 44
88 13 81 21 20
80 99 23 37 53
44 68 15 38 55
84 48 82 97 6
4 43 52 72 31
39 62 45 86 44
12 17 16 7 6
84 42 82 34 85
19 77 9 48 98
21 99 67 26 69
1 75 50 5 44
3 28 62 17 43
14 52 64 77 81
32 89 7 11 70
38 36 71 45 58
53 32 35 69 63
6 21 75 64 96
10 89 15 48 26
23 20 43 57 33
18 49 51 47 74
20 79 9 74 13
52 28 77 26 43
57 83 4 25 70
90 1 30 53 38
56 66 82 35 51
12 3 31 93 8
20 27 51 78 9
29 46 82 85 75
15 76 91 70 63
59 39 13 43 79
46 35 15 13 2
65 69 97 77 87
64 59 94 88 40
34 79 92 93 58
47 28 74 82 29
32 38 24 68 12
8 78 79 89 43
67 54 6 98 48
1 14 83 15 37
44 10 97 74 33
9 95 2 99 1
8 42 60 56 40
32 11 71 14 80
77 6 68 46 48
98 70 39 44 62
43 94 41 13 15
96 99 35 27 8
22 75 73 17 90
62 23 5 88 3
10 52 61 60 57
31 62 74 3 79
15 49 60 28 71
66 2 11 36 41
34 80 33 94 75
64 56 84 70 16
98 94 68 32 26
61 7 52 66 18
40 20 82 81 74
28 36 89 14 35
71 11 44 13 72
81 30 6 86 37
46 45 64 83 62
7 70 38 51 15
91 41 26 40 4
87 0 82 74 60
83 99 26 69 1
6 98 53 31 43
82 64 42 90 34
87 62 11 40 39
77 51 2 30 97
96 5 24 44 32
48 92 78 74 76
99 33 93 97 49
45 8 88 66 59
52 64 29 60 82
69 23 59 96 71
14 93 21 44 62
65 84 2 39 1
0 68 38 81 4
48 31 26 60 34
24 46 44 52 98
65 23 31 89 5
34 79 75 96 41
76 28 90 12 11
68 29 38 70 50
51 0 45 23 20
44 49 12 31 7
41 26 46 75 92
90 30 72 95 55
87 57 10 99 40
25 67 80 74 44
3 82 27 81 11
33 42 97 57 70
19 94 0 2 49
6 90 60 29 58
79 59 96 68 14
38 70 65 66 69
36 75 20 18 29
64 88 35 61 43
57 76 62 23 25
60 9 81 94 62
73 20 87 72 14
95 63 42 51 13
75 83 32 30 66
97 6 80 82 17
3 88 31 43 68
20 78 47 10 91
14 42 40 74 39
5 32 16 97 1
9 33 49 70 36
77 31 65 27 52
49 74 57 25 66
24 4 39 33 1
23 14 19 2 21
80 71 29 81 91
32 68 47 3 88
1 97 99 28 80
2 25 18 31 51
26 10 73 34 40
8 55 45 36 37
79 81 33 94 51
84 4 91 0 69
49 80 35 67 20
98 48 64 38 30
25 83 45 97 42
18 5 84 94 50
36 47 2 52 65
39 77 83 37 80
51 88 15 12 31
87 17 68 48 67
39 95 30 8 86
45 57 40 51 60
85 88 33 93 25
76 52 37 68 6
11 80 69 19 71
6 71 25 66 54
33 17 98 63 20
27 14 44 43 18
68 10 50 35 65
61 3 83 12 13
46 21 43 15 19
99 82 8 95 80
1 10 45 58 53
23 94 50 66 52
57 98 26 77 90
11 50 55 28 79
4 3 26 57 56
68 86 10 87 69
32 35 89 63 29
66 27 33 8 30
23 34 94 93 47
7 71 9 52 50
45 79 13 43 86
0 51 17 6 26
4 82 44 38 37
49 24 16 64 32
46 84 3 29 51
71 82 33 61 26
15 5 94 86 41
63 36 10 67 43
94 17 3 71 91
93 50 88 36 27
54 68 7 8 34
9 92 37 45 52
47 29 70 10 69
79 27 30 0 12
51 70 19 89 20
2 42 64 21 49
48 39 1 3 56
98 35 95 82 72
91 71 65 95 44
26 72 92 59 43
61 93 6 4 90
76 31 8 1 29
82 64 89 22 45
55 4 1 42 87
88 34 67 83 45
22 23 98 24 12
74 72 49 32 25
73 7 19 26 3
0 43 50 57 80
68 21 87 1 91
60 6 81 78 99
35 98 72 49 16
36 25 13 48 22
59 1 26 3 71
43 55 50 7 16
5 64 29 38 84
41 23 60 19 24
85 58 49 98 33
80 48 3 65 38
30 97 96 45 7
6 85 8 90 40
37 78 84 16 24
69 11 43 64 63
28 14 19 1 97
37 39 86 23 64
20 67 85 65 90
54 51 59 91 43
17 30 11 24 7
22 88 27 43 10
35 3 72 52 57
61 54 28 69 37
71 78 96 82 81
33 39 32 40 7
50 60 69 33 57
84 22 95 74 6
90 94 71 45 68
72 86 77 9 24
73 12 89 13 1
66 35 36 87 73
77 96 52 47 68
63 4 83 20 95
17 70 9 18 50
98 40 25 60 26
31 37 81 34 56
3 15 43 51 35
67 70 1 20 12
80 54 69 17 88
65 91 60 8 53
76 23 87 41 18
49 58 92 98 25
77 53 44 17 27
67 28 37 66 95
59 39 33 4 34
0 25 2 5 22
26 85 90 51 21
31 79 10 41 45
69 56 1 67 40
59 98 99 89 6
95 67 72 52 78
88 61 96 11 43
34 73 53 54 8
71 3 70 42 58
12 82 97 68 98
20 10 13 74 89
82 25 45 92 61
58 62 0 22 57
68 90 36 18 75
48 39 69 4 52
40 3 86 33 98
30 67 39 7 69
80 64 77 54 51
24 49 6 68 61
62 94 1 26 50
89 88 7 21 87
83 10 78 27 97
35 62 86 13 38
28 80 19 36 75
98 93 47 33 57
22 88 35 79 85
98 96 89 69 17
37 62 57 39 1
99 10 55 50 71
65 94 67 4 63
7 83 51 95 98
56 93 62 85 9
72 14 44 70 67
42 4 65 37 54
47 82 1 60 55
0 73 60 25 64
90 11 93 85 89
80 97 86 76 96
43 92 88 72 44
62 87 81 34 49
47 27 89 98 68
86 76 14 96 17
21 4 41 74 29
18 82 33 34 20
30 62 95 42 51
45 4 70 20 53
66 39 43 82 1
54 30 68 77 42
61 41 65 94 35
25 78 22 26 46
70 73 44 48 61
69 7 85 47 89
91 22 12 98 11
25 60 58 46 54
5 37 83 62 65
47 62 30 70 40
86 9 64 61 0
27 63 90 88 17
18 71 42 33 93
91 14 81 4 31
81 7 22 94 55
99 90 60 9 46
65 2 47 1 73
78 76 75 19 88
63 51 86 56 49
25 27 12 22 30
87 75 16 4 32
19 73 5 20 52
18 6 34 94 31
23 96 84 26 66
23 69 51 35 5
13 76 99 89 82
88 3 50 54 33
19 59 92 84 34
64 80 42 40 60
15 91 92 60 36
46 40 53 34 27
13 35 96 16 42
4 61 81 56 24
85 21 7 99 20
32 37 19 21 28
66 7 96 46 88
23 52 25 50 22
53 62 34 81 27
98 31 14 40 49
23 43 71 61 12
8 94 91 74 7
67 2 59 77 4
39 18 97 41 21
55 15 31 9 38
29 69 52 16 75
71 15 34 79 86
62 57 48 44 54
11 32 96 13 60
56 77 26 68 82
93 57 21 94 31
29 4 59 24 40
13 99 34 96 91
70 55 47 62 51
33 32 19 69 71
76 80 1 57 20
13 28 72 27 79
40 21 71 37 85
26 12 67 33 99
11 41 62 18 64
23 22 92 69 86
38 79 47 56 83
74 46 1 95 24
93 71 28 54 52
94 51 33 57 73
17 96 4 81 76
67 20 24 21 70
28 77 3 74 10
45 78 18 7 15
8 48 27 58 13
51 58 59 73 35
13 7 92 15 98
75 26 1 49 24
91 85 44 34 74
64 2 20 72 90
46 89 50 54 79
9 60 98 36 78
91 16 80 92 20
77 69 13 76 75
95 41 45 3 40
86 7 67 20 99
14 18 97 70 0
81 27 89 30 3
39 37 56 42 32
35 71 49 8 73
60 67 61 6 86
25 41 24 29 88
98 3 90 56 87
45 22 84 70 99
53 59 27 26 57
17 4 11 41 66
28 39 27 54 89
3 78 37 93 29
95 23 86 51 40
75 67 71 57 92
60 41 91 89 52
68 46 83 62 1
18 21 72 19 35
55 34 11 16 75
32 71 61 78 50
27 38 70 48 93
16 2 80 17 63
97 89 55 86 85
54 5 41 33 60
51 95 12 67 37
72 17 74 6 41
53 19 8 12 92
39 84 82 63 48
22 21 87 13 32
40 34 64 15 31
75 2 46 64 99
26 72 79 90 76
85 68 10 28 67
20 34 81 12 83
92 1 65 43 71
49 80 85 54 9
31 40 22 94 51
12 73 43 68 98
78 91 70 3 28
47 59 69 99 62
46 56 28 73 20
5 29 69 68 22
64 12 8 52 92
36 44 90 72 0
76 48 33 86 66
99 61 97 17 74
32 52 44 42 9
57 67 36 41 31
68 1 50 22 11
73 12 21 48 62
44 53 77 88 87
27 99 59 98 74
33 66 51 14 34
29 30 60 49 80
47 84 36 12 71
29 89 54 59 70
87 65 77 38 25
40 17 41 9 30
45 27 0 5 24
52 8 35 68 10
16 41 66 87 76
94 70 51 48 96
90 73 98 89 91
4 46 30 28 63
68 45 37 80 57
19 11 46 41 14
94 48 66 86 9
42 90 56 70 21
95 54 74 30 87
81 89 49 60 34
18 90 79 64 98
27 74 59 53 11
96 45 17 14 23
9 60 30 42 12
97 21 31 5 41
98 63 51 92 64
55 30 46 22 91
8 73 61 57 67
37 60 49 31 10
80 99 77 11 82
52 69 77 41 8
94 11 78 62 28
91 39 96 79 3
44 88 37 0 47
6 80 49 98 48
93 2 70 26 4
47 8 94 12 3
10 7 24 40 23
49 84 50 56 44
41 53 96 1 85
76 78 70 24 75
71 19 85 77 25
21 44 58 45 64
40 38 9 50 61
79 42 86 37 6
34 39 94 84 0
90 80 78 54 49
13 81 87 60 56
74 59 75 41 28
29 67 66 44 20
50 66 43 39 16
88 94 60 70 64
63 80 56 69 36
53 48 32 22 79
59 77 20 30 67
70 56 80 12 11
35 55 40 71 87
84 27 96 46 85
20 23 26 29 14
58 37 21 75 68
78 23 13 37 94
65 44 54 43 38
29 60 83 1 57
98 2 75 12 14
92 25 48 9 52
64 37 93 48 34
22 81 58 5 13
63 80 2 67 53
62 52 79 41 44
83 75 96 91 88
1 54 88 45 90
81 78 19 8 40
17 74 69 87 33
9 64 85 50 71
92 38 65 82 41
2 62 96 60 81
51 1 34 48 25
78 13 74 65 42
46 64 57 19 72
85 88 53 68 76
57 95 40 92 27
65 37 42 90 9
17 72 78 43 45
87 28 48 81 79
7 4 24 67 70

63
2021/d05/ex1/ex1.py Executable file
View file

@ -0,0 +1,63 @@
#!/usr/bin/env python
import itertools
import sys
from collections import Counter
from typing import Iterable, List, Tuple, NamedTuple
class Point(NamedTuple):
x: int
y: int
Line = Tuple[Point, Point]
def solve(input: List[str]) -> int:
def parse_line(line: str) -> Line:
def parse_point(point: str) -> Point:
x, y = map(int, point.split(","))
return Point(x, y)
p1, p2 = map(parse_point, line.split(" -> "))
return (p1, p2)
def is_of_interest(line: Line) -> bool:
p1, p2 = line
return p1.x == p2.x or p1.y == p2.y
def line_to_points(line: Line) -> Iterable[Point]:
def inclusive_range_any_order(a: int, b: int) -> Iterable[int]:
if a < b:
yield from range(a, b + 1)
else:
yield from range(a, b - 1, -1)
p1, p2 = line
if p1.x == p2.x:
for y in inclusive_range_any_order(p1.y, p2.y):
yield Point(p1.x, y)
return
if p1.y == p2.y:
for x in inclusive_range_any_order(p1.x, p2.x):
yield Point(x, p1.y)
return
assert False # Sanity check
lines = list(filter(is_of_interest, map(parse_line, input)))
counts = Counter(itertools.chain.from_iterable(line_to_points(l) for l in lines))
return sum(counts[p] > 1 for p in counts)
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

500
2021/d05/ex1/input Normal file
View file

@ -0,0 +1,500 @@
284,294 -> 733,743
625,347 -> 653,375
561,848 -> 561,181
836,102 -> 836,339
946,941 -> 22,17
18,954 -> 956,16
370,142 -> 370,700
990,966 -> 677,966
366,603 -> 366,465
728,942 -> 57,271
615,493 -> 847,493
584,281 -> 301,281
125,356 -> 301,180
941,569 -> 555,183
151,116 -> 509,116
41,18 -> 841,818
627,670 -> 627,630
965,472 -> 965,100
93,404 -> 330,641
475,963 -> 475,514
389,389 -> 389,326
842,565 -> 842,576
454,700 -> 650,700
73,810 -> 73,319
450,212 -> 450,284
316,392 -> 316,697
915,592 -> 578,592
622,485 -> 434,485
109,853 -> 952,10
305,73 -> 305,222
27,489 -> 157,489
191,979 -> 867,979
527,329 -> 527,292
301,645 -> 301,162
639,730 -> 176,730
46,964 -> 46,458
727,422 -> 435,714
28,552 -> 404,552
33,108 -> 33,21
227,249 -> 327,249
414,903 -> 784,903
69,422 -> 888,422
422,924 -> 103,605
793,353 -> 450,10
714,682 -> 714,972
201,745 -> 410,745
408,713 -> 408,847
174,842 -> 818,198
863,353 -> 775,353
199,780 -> 670,780
877,947 -> 340,410
163,202 -> 163,91
955,919 -> 955,585
836,271 -> 533,271
258,366 -> 728,836
582,749 -> 582,12
80,40 -> 80,704
287,213 -> 287,635
390,546 -> 390,194
837,511 -> 538,810
473,281 -> 902,281
851,865 -> 731,745
918,59 -> 445,532
796,215 -> 796,248
875,111 -> 604,111
660,805 -> 538,805
507,850 -> 145,850
585,861 -> 585,52
426,74 -> 700,348
206,405 -> 529,405
418,333 -> 418,17
368,457 -> 33,792
186,81 -> 957,852
505,283 -> 113,283
20,878 -> 462,878
750,237 -> 69,918
15,280 -> 358,623
798,981 -> 500,683
965,970 -> 22,970
950,970 -> 148,970
660,392 -> 660,884
862,405 -> 862,527
801,283 -> 801,361
71,837 -> 136,837
651,438 -> 945,144
524,607 -> 614,517
348,955 -> 138,955
957,164 -> 404,717
531,581 -> 454,504
710,185 -> 710,271
822,86 -> 822,966
745,233 -> 490,488
350,823 -> 663,823
824,67 -> 447,444
846,667 -> 796,617
666,24 -> 666,906
640,39 -> 640,145
654,481 -> 985,481
581,894 -> 416,729
443,11 -> 697,11
318,627 -> 799,146
113,78 -> 891,856
181,149 -> 179,151
451,74 -> 451,262
458,726 -> 314,726
218,662 -> 533,662
965,108 -> 527,108
782,481 -> 896,367
557,927 -> 557,938
506,242 -> 941,677
948,778 -> 948,629
567,816 -> 567,956
323,773 -> 323,364
864,980 -> 864,12
611,699 -> 611,886
613,392 -> 901,104
528,905 -> 156,905
632,206 -> 798,40
338,237 -> 919,818
256,889 -> 11,644
835,52 -> 55,832
464,144 -> 322,144
254,747 -> 254,509
866,892 -> 866,916
827,946 -> 30,149
899,84 -> 177,806
134,634 -> 357,634
781,492 -> 244,492
817,762 -> 817,976
818,749 -> 818,860
262,480 -> 263,480
409,576 -> 409,698
242,151 -> 981,890
149,519 -> 149,557
42,990 -> 42,930
687,974 -> 50,337
758,382 -> 465,382
760,861 -> 760,934
17,835 -> 17,915
645,923 -> 645,648
702,116 -> 72,746
153,162 -> 955,964
185,101 -> 918,834
554,179 -> 554,353
879,673 -> 879,949
368,13 -> 368,512
582,105 -> 591,114
146,291 -> 600,745
609,538 -> 930,538
320,604 -> 320,146
566,698 -> 443,575
167,708 -> 844,31
712,630 -> 712,421
912,930 -> 64,82
980,931 -> 87,38
23,893 -> 888,28
640,435 -> 676,435
701,516 -> 190,516
684,145 -> 62,767
127,471 -> 91,435
685,197 -> 78,197
103,493 -> 103,522
309,986 -> 309,850
938,270 -> 938,300
295,72 -> 354,72
948,889 -> 948,455
254,733 -> 254,175
95,329 -> 942,329
19,672 -> 19,445
206,807 -> 206,934
886,961 -> 886,690
117,386 -> 117,292
199,59 -> 668,528
299,263 -> 299,878
28,295 -> 638,905
10,140 -> 276,406
279,526 -> 921,526
485,128 -> 856,499
418,398 -> 186,398
296,577 -> 296,521
514,261 -> 10,765
691,673 -> 776,758
131,430 -> 152,430
858,85 -> 62,85
394,846 -> 270,970
827,913 -> 827,376
634,669 -> 910,669
12,53 -> 945,986
782,467 -> 782,421
159,832 -> 109,832
793,807 -> 79,93
120,584 -> 356,584
645,16 -> 645,355
526,685 -> 217,376
296,305 -> 296,929
954,144 -> 954,839
748,88 -> 103,733
523,804 -> 473,754
524,316 -> 524,756
696,183 -> 912,183
288,564 -> 55,797
568,103 -> 568,348
468,626 -> 682,412
163,163 -> 961,961
762,824 -> 27,89
623,625 -> 32,34
865,343 -> 490,718
259,458 -> 259,33
944,660 -> 944,176
781,804 -> 826,759
15,702 -> 15,553
403,310 -> 918,825
438,734 -> 835,734
825,13 -> 825,245
129,611 -> 370,611
49,939 -> 172,939
687,906 -> 687,532
629,482 -> 273,126
727,218 -> 424,218
447,451 -> 233,451
142,779 -> 813,779
527,27 -> 527,804
482,55 -> 482,200
39,264 -> 806,264
884,636 -> 458,636
467,121 -> 199,389
856,925 -> 856,666
666,359 -> 378,359
11,946 -> 705,946
491,281 -> 940,730
86,112 -> 918,944
974,807 -> 974,707
445,67 -> 914,536
953,394 -> 953,822
468,398 -> 157,87
231,620 -> 231,646
979,869 -> 979,911
450,330 -> 450,79
675,659 -> 617,659
66,181 -> 66,723
181,406 -> 181,192
908,334 -> 908,526
254,891 -> 282,891
777,791 -> 127,141
469,58 -> 694,58
954,957 -> 566,569
957,957 -> 123,123
741,359 -> 741,986
763,526 -> 763,101
857,427 -> 600,170
527,756 -> 490,719
625,249 -> 397,249
798,702 -> 712,702
868,75 -> 868,853
332,296 -> 332,629
211,829 -> 100,940
12,139 -> 12,218
655,978 -> 655,242
99,852 -> 855,96
486,267 -> 486,855
474,90 -> 474,244
948,491 -> 186,491
896,59 -> 278,677
295,732 -> 629,732
860,936 -> 860,556
143,790 -> 143,26
371,847 -> 395,847
739,301 -> 739,44
384,716 -> 748,716
848,423 -> 848,923
855,23 -> 218,660
381,805 -> 381,438
451,610 -> 91,610
906,957 -> 191,957
118,675 -> 169,675
836,818 -> 95,818
368,945 -> 825,488
165,299 -> 899,299
392,327 -> 926,861
663,16 -> 131,548
630,302 -> 888,302
206,869 -> 206,331
979,413 -> 979,204
894,860 -> 62,28
444,897 -> 962,379
550,158 -> 550,885
845,736 -> 811,736
846,857 -> 12,857
981,730 -> 981,154
694,835 -> 88,835
21,101 -> 21,385
19,960 -> 964,15
283,721 -> 450,721
59,136 -> 758,835
287,313 -> 719,313
471,252 -> 849,630
682,189 -> 168,189
10,921 -> 774,157
884,598 -> 884,540
207,615 -> 207,443
627,408 -> 67,408
285,36 -> 285,792
116,585 -> 254,585
183,86 -> 183,702
220,138 -> 868,138
833,68 -> 286,615
367,534 -> 766,534
907,514 -> 621,228
133,593 -> 133,581
164,727 -> 768,123
566,227 -> 566,555
983,988 -> 105,110
620,177 -> 620,821
612,413 -> 612,176
168,889 -> 168,210
871,487 -> 559,175
399,870 -> 761,870
236,976 -> 582,630
699,216 -> 699,887
153,745 -> 790,745
444,749 -> 444,257
808,165 -> 939,165
546,525 -> 95,976
583,179 -> 373,389
235,816 -> 840,816
744,89 -> 832,89
425,317 -> 465,357
267,235 -> 114,82
887,59 -> 572,374
808,237 -> 808,626
431,352 -> 400,383
815,376 -> 815,905
249,218 -> 989,958
120,435 -> 357,198
807,551 -> 490,234
910,524 -> 910,725
802,304 -> 447,659
789,228 -> 678,339
229,322 -> 52,322
658,393 -> 506,393
378,438 -> 378,569
163,981 -> 473,671
537,984 -> 935,586
58,945 -> 966,37
132,696 -> 565,263
136,813 -> 136,284
606,656 -> 298,348
533,572 -> 673,712
872,912 -> 301,341
16,287 -> 16,613
571,541 -> 980,950
117,495 -> 35,495
85,79 -> 682,676
425,431 -> 117,739
982,984 -> 10,12
28,75 -> 431,478
259,529 -> 259,436
762,267 -> 170,859
323,135 -> 929,741
81,238 -> 561,718
128,213 -> 876,961
649,466 -> 649,540
715,863 -> 119,863
830,624 -> 794,660
123,968 -> 977,114
489,466 -> 489,811
27,10 -> 980,963
255,732 -> 255,484
574,829 -> 431,829
548,743 -> 22,217
903,297 -> 903,763
684,774 -> 64,154
260,823 -> 683,823
422,211 -> 422,826
10,196 -> 988,196
108,802 -> 15,802
104,70 -> 104,452
885,59 -> 885,36
68,854 -> 68,774
731,935 -> 731,718
657,986 -> 617,986
732,292 -> 732,32
841,56 -> 841,83
74,108 -> 862,896
654,895 -> 323,895
374,952 -> 374,217
90,723 -> 750,63
246,89 -> 911,754
453,301 -> 755,301
983,988 -> 23,28
81,705 -> 133,757
752,743 -> 752,397
53,243 -> 449,639
451,811 -> 451,187
26,672 -> 26,699
254,861 -> 943,861
643,740 -> 643,966
486,655 -> 149,318
375,146 -> 375,973
76,293 -> 103,293
246,398 -> 246,248
324,392 -> 595,121
130,577 -> 131,577
380,623 -> 549,454
224,181 -> 985,942
310,223 -> 310,594
23,982 -> 23,738
19,858 -> 832,858
726,531 -> 726,578
730,433 -> 196,433
606,599 -> 242,599
444,832 -> 444,238
198,870 -> 47,870
944,473 -> 795,473
737,386 -> 178,945
328,902 -> 328,644
422,851 -> 567,851
674,781 -> 215,781
920,757 -> 302,757
225,932 -> 640,517
359,337 -> 791,337
935,430 -> 935,262
772,850 -> 280,358
175,829 -> 175,451
938,204 -> 234,908
253,749 -> 308,749
704,458 -> 468,458
222,95 -> 743,616
968,840 -> 123,840
491,619 -> 491,889
979,580 -> 979,459
901,193 -> 171,923
246,155 -> 246,680
711,755 -> 247,755
671,734 -> 475,734
803,783 -> 129,109
145,890 -> 920,115
463,521 -> 463,700
782,99 -> 782,311
547,467 -> 630,467
14,88 -> 795,869
653,899 -> 653,90
488,874 -> 488,570
93,879 -> 645,327
320,658 -> 40,938
611,246 -> 611,22
258,935 -> 258,829
931,436 -> 931,263
252,460 -> 252,461
490,382 -> 965,382
242,89 -> 242,617
271,111 -> 595,435
462,706 -> 242,486
557,328 -> 747,328
486,99 -> 486,333
156,40 -> 488,372
323,482 -> 138,297
595,539 -> 812,756
923,861 -> 377,315
934,952 -> 256,274
314,777 -> 314,12
508,47 -> 508,144
888,807 -> 701,807
745,774 -> 878,907
740,716 -> 740,215
62,43 -> 62,12
571,196 -> 454,196
568,107 -> 408,107
549,676 -> 404,676
595,573 -> 595,970
148,168 -> 193,123
763,71 -> 759,71
797,64 -> 307,64
959,984 -> 32,57
457,562 -> 634,562
127,521 -> 601,47
112,296 -> 112,120
148,755 -> 451,755
636,494 -> 870,494
910,242 -> 945,277
912,911 -> 912,892
759,815 -> 759,314
391,285 -> 391,959
455,460 -> 182,460
112,78 -> 112,385
842,179 -> 842,592
236,424 -> 421,424
508,907 -> 30,907
637,219 -> 34,822
503,375 -> 503,205
570,533 -> 626,533
658,11 -> 658,94
179,286 -> 326,433
918,214 -> 200,932
339,887 -> 81,887
794,91 -> 50,835
225,356 -> 225,261
80,160 -> 80,335
148,64 -> 847,763
595,393 -> 941,393

58
2021/d05/ex2/ex2.py Executable file
View file

@ -0,0 +1,58 @@
#!/usr/bin/env python
import itertools
import sys
from collections import Counter
from typing import Iterable, List, Tuple, NamedTuple
class Point(NamedTuple):
x: int
y: int
Line = Tuple[Point, Point]
def solve(input: List[str]) -> int:
def parse_line(line: str) -> Line:
def parse_point(point: str) -> Point:
x, y = map(int, point.split(","))
return Point(x, y)
p1, p2 = map(parse_point, line.split(" -> "))
return (p1, p2)
def line_to_points(line: Line) -> Iterable[Point]:
def inclusive_range_any_order(a: int, b: int) -> Iterable[int]:
if a < b:
yield from range(a, b + 1)
else:
yield from range(a, b - 1, -1)
p1, p2 = line
xs = inclusive_range_any_order(p1.x, p2.x)
ys = inclusive_range_any_order(p1.y, p2.y)
if p1.x == p2.x:
xs = itertools.repeat(p1.x)
if p1.y == p2.y:
ys = itertools.repeat(p1.y)
yield from map(Point._make, zip(xs, ys))
lines = list(map(parse_line, input))
counts = Counter(itertools.chain.from_iterable(line_to_points(l) for l in lines))
return sum(counts[p] > 1 for p in counts)
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

500
2021/d05/ex2/input Normal file
View file

@ -0,0 +1,500 @@
284,294 -> 733,743
625,347 -> 653,375
561,848 -> 561,181
836,102 -> 836,339
946,941 -> 22,17
18,954 -> 956,16
370,142 -> 370,700
990,966 -> 677,966
366,603 -> 366,465
728,942 -> 57,271
615,493 -> 847,493
584,281 -> 301,281
125,356 -> 301,180
941,569 -> 555,183
151,116 -> 509,116
41,18 -> 841,818
627,670 -> 627,630
965,472 -> 965,100
93,404 -> 330,641
475,963 -> 475,514
389,389 -> 389,326
842,565 -> 842,576
454,700 -> 650,700
73,810 -> 73,319
450,212 -> 450,284
316,392 -> 316,697
915,592 -> 578,592
622,485 -> 434,485
109,853 -> 952,10
305,73 -> 305,222
27,489 -> 157,489
191,979 -> 867,979
527,329 -> 527,292
301,645 -> 301,162
639,730 -> 176,730
46,964 -> 46,458
727,422 -> 435,714
28,552 -> 404,552
33,108 -> 33,21
227,249 -> 327,249
414,903 -> 784,903
69,422 -> 888,422
422,924 -> 103,605
793,353 -> 450,10
714,682 -> 714,972
201,745 -> 410,745
408,713 -> 408,847
174,842 -> 818,198
863,353 -> 775,353
199,780 -> 670,780
877,947 -> 340,410
163,202 -> 163,91
955,919 -> 955,585
836,271 -> 533,271
258,366 -> 728,836
582,749 -> 582,12
80,40 -> 80,704
287,213 -> 287,635
390,546 -> 390,194
837,511 -> 538,810
473,281 -> 902,281
851,865 -> 731,745
918,59 -> 445,532
796,215 -> 796,248
875,111 -> 604,111
660,805 -> 538,805
507,850 -> 145,850
585,861 -> 585,52
426,74 -> 700,348
206,405 -> 529,405
418,333 -> 418,17
368,457 -> 33,792
186,81 -> 957,852
505,283 -> 113,283
20,878 -> 462,878
750,237 -> 69,918
15,280 -> 358,623
798,981 -> 500,683
965,970 -> 22,970
950,970 -> 148,970
660,392 -> 660,884
862,405 -> 862,527
801,283 -> 801,361
71,837 -> 136,837
651,438 -> 945,144
524,607 -> 614,517
348,955 -> 138,955
957,164 -> 404,717
531,581 -> 454,504
710,185 -> 710,271
822,86 -> 822,966
745,233 -> 490,488
350,823 -> 663,823
824,67 -> 447,444
846,667 -> 796,617
666,24 -> 666,906
640,39 -> 640,145
654,481 -> 985,481
581,894 -> 416,729
443,11 -> 697,11
318,627 -> 799,146
113,78 -> 891,856
181,149 -> 179,151
451,74 -> 451,262
458,726 -> 314,726
218,662 -> 533,662
965,108 -> 527,108
782,481 -> 896,367
557,927 -> 557,938
506,242 -> 941,677
948,778 -> 948,629
567,816 -> 567,956
323,773 -> 323,364
864,980 -> 864,12
611,699 -> 611,886
613,392 -> 901,104
528,905 -> 156,905
632,206 -> 798,40
338,237 -> 919,818
256,889 -> 11,644
835,52 -> 55,832
464,144 -> 322,144
254,747 -> 254,509
866,892 -> 866,916
827,946 -> 30,149
899,84 -> 177,806
134,634 -> 357,634
781,492 -> 244,492
817,762 -> 817,976
818,749 -> 818,860
262,480 -> 263,480
409,576 -> 409,698
242,151 -> 981,890
149,519 -> 149,557
42,990 -> 42,930
687,974 -> 50,337
758,382 -> 465,382
760,861 -> 760,934
17,835 -> 17,915
645,923 -> 645,648
702,116 -> 72,746
153,162 -> 955,964
185,101 -> 918,834
554,179 -> 554,353
879,673 -> 879,949
368,13 -> 368,512
582,105 -> 591,114
146,291 -> 600,745
609,538 -> 930,538
320,604 -> 320,146
566,698 -> 443,575
167,708 -> 844,31
712,630 -> 712,421
912,930 -> 64,82
980,931 -> 87,38
23,893 -> 888,28
640,435 -> 676,435
701,516 -> 190,516
684,145 -> 62,767
127,471 -> 91,435
685,197 -> 78,197
103,493 -> 103,522
309,986 -> 309,850
938,270 -> 938,300
295,72 -> 354,72
948,889 -> 948,455
254,733 -> 254,175
95,329 -> 942,329
19,672 -> 19,445
206,807 -> 206,934
886,961 -> 886,690
117,386 -> 117,292
199,59 -> 668,528
299,263 -> 299,878
28,295 -> 638,905
10,140 -> 276,406
279,526 -> 921,526
485,128 -> 856,499
418,398 -> 186,398
296,577 -> 296,521
514,261 -> 10,765
691,673 -> 776,758
131,430 -> 152,430
858,85 -> 62,85
394,846 -> 270,970
827,913 -> 827,376
634,669 -> 910,669
12,53 -> 945,986
782,467 -> 782,421
159,832 -> 109,832
793,807 -> 79,93
120,584 -> 356,584
645,16 -> 645,355
526,685 -> 217,376
296,305 -> 296,929
954,144 -> 954,839
748,88 -> 103,733
523,804 -> 473,754
524,316 -> 524,756
696,183 -> 912,183
288,564 -> 55,797
568,103 -> 568,348
468,626 -> 682,412
163,163 -> 961,961
762,824 -> 27,89
623,625 -> 32,34
865,343 -> 490,718
259,458 -> 259,33
944,660 -> 944,176
781,804 -> 826,759
15,702 -> 15,553
403,310 -> 918,825
438,734 -> 835,734
825,13 -> 825,245
129,611 -> 370,611
49,939 -> 172,939
687,906 -> 687,532
629,482 -> 273,126
727,218 -> 424,218
447,451 -> 233,451
142,779 -> 813,779
527,27 -> 527,804
482,55 -> 482,200
39,264 -> 806,264
884,636 -> 458,636
467,121 -> 199,389
856,925 -> 856,666
666,359 -> 378,359
11,946 -> 705,946
491,281 -> 940,730
86,112 -> 918,944
974,807 -> 974,707
445,67 -> 914,536
953,394 -> 953,822
468,398 -> 157,87
231,620 -> 231,646
979,869 -> 979,911
450,330 -> 450,79
675,659 -> 617,659
66,181 -> 66,723
181,406 -> 181,192
908,334 -> 908,526
254,891 -> 282,891
777,791 -> 127,141
469,58 -> 694,58
954,957 -> 566,569
957,957 -> 123,123
741,359 -> 741,986
763,526 -> 763,101
857,427 -> 600,170
527,756 -> 490,719
625,249 -> 397,249
798,702 -> 712,702
868,75 -> 868,853
332,296 -> 332,629
211,829 -> 100,940
12,139 -> 12,218
655,978 -> 655,242
99,852 -> 855,96
486,267 -> 486,855
474,90 -> 474,244
948,491 -> 186,491
896,59 -> 278,677
295,732 -> 629,732
860,936 -> 860,556
143,790 -> 143,26
371,847 -> 395,847
739,301 -> 739,44
384,716 -> 748,716
848,423 -> 848,923
855,23 -> 218,660
381,805 -> 381,438
451,610 -> 91,610
906,957 -> 191,957
118,675 -> 169,675
836,818 -> 95,818
368,945 -> 825,488
165,299 -> 899,299
392,327 -> 926,861
663,16 -> 131,548
630,302 -> 888,302
206,869 -> 206,331
979,413 -> 979,204
894,860 -> 62,28
444,897 -> 962,379
550,158 -> 550,885
845,736 -> 811,736
846,857 -> 12,857
981,730 -> 981,154
694,835 -> 88,835
21,101 -> 21,385
19,960 -> 964,15
283,721 -> 450,721
59,136 -> 758,835
287,313 -> 719,313
471,252 -> 849,630
682,189 -> 168,189
10,921 -> 774,157
884,598 -> 884,540
207,615 -> 207,443
627,408 -> 67,408
285,36 -> 285,792
116,585 -> 254,585
183,86 -> 183,702
220,138 -> 868,138
833,68 -> 286,615
367,534 -> 766,534
907,514 -> 621,228
133,593 -> 133,581
164,727 -> 768,123
566,227 -> 566,555
983,988 -> 105,110
620,177 -> 620,821
612,413 -> 612,176
168,889 -> 168,210
871,487 -> 559,175
399,870 -> 761,870
236,976 -> 582,630
699,216 -> 699,887
153,745 -> 790,745
444,749 -> 444,257
808,165 -> 939,165
546,525 -> 95,976
583,179 -> 373,389
235,816 -> 840,816
744,89 -> 832,89
425,317 -> 465,357
267,235 -> 114,82
887,59 -> 572,374
808,237 -> 808,626
431,352 -> 400,383
815,376 -> 815,905
249,218 -> 989,958
120,435 -> 357,198
807,551 -> 490,234
910,524 -> 910,725
802,304 -> 447,659
789,228 -> 678,339
229,322 -> 52,322
658,393 -> 506,393
378,438 -> 378,569
163,981 -> 473,671
537,984 -> 935,586
58,945 -> 966,37
132,696 -> 565,263
136,813 -> 136,284
606,656 -> 298,348
533,572 -> 673,712
872,912 -> 301,341
16,287 -> 16,613
571,541 -> 980,950
117,495 -> 35,495
85,79 -> 682,676
425,431 -> 117,739
982,984 -> 10,12
28,75 -> 431,478
259,529 -> 259,436
762,267 -> 170,859
323,135 -> 929,741
81,238 -> 561,718
128,213 -> 876,961
649,466 -> 649,540
715,863 -> 119,863
830,624 -> 794,660
123,968 -> 977,114
489,466 -> 489,811
27,10 -> 980,963
255,732 -> 255,484
574,829 -> 431,829
548,743 -> 22,217
903,297 -> 903,763
684,774 -> 64,154
260,823 -> 683,823
422,211 -> 422,826
10,196 -> 988,196
108,802 -> 15,802
104,70 -> 104,452
885,59 -> 885,36
68,854 -> 68,774
731,935 -> 731,718
657,986 -> 617,986
732,292 -> 732,32
841,56 -> 841,83
74,108 -> 862,896
654,895 -> 323,895
374,952 -> 374,217
90,723 -> 750,63
246,89 -> 911,754
453,301 -> 755,301
983,988 -> 23,28
81,705 -> 133,757
752,743 -> 752,397
53,243 -> 449,639
451,811 -> 451,187
26,672 -> 26,699
254,861 -> 943,861
643,740 -> 643,966
486,655 -> 149,318
375,146 -> 375,973
76,293 -> 103,293
246,398 -> 246,248
324,392 -> 595,121
130,577 -> 131,577
380,623 -> 549,454
224,181 -> 985,942
310,223 -> 310,594
23,982 -> 23,738
19,858 -> 832,858
726,531 -> 726,578
730,433 -> 196,433
606,599 -> 242,599
444,832 -> 444,238
198,870 -> 47,870
944,473 -> 795,473
737,386 -> 178,945
328,902 -> 328,644
422,851 -> 567,851
674,781 -> 215,781
920,757 -> 302,757
225,932 -> 640,517
359,337 -> 791,337
935,430 -> 935,262
772,850 -> 280,358
175,829 -> 175,451
938,204 -> 234,908
253,749 -> 308,749
704,458 -> 468,458
222,95 -> 743,616
968,840 -> 123,840
491,619 -> 491,889
979,580 -> 979,459
901,193 -> 171,923
246,155 -> 246,680
711,755 -> 247,755
671,734 -> 475,734
803,783 -> 129,109
145,890 -> 920,115
463,521 -> 463,700
782,99 -> 782,311
547,467 -> 630,467
14,88 -> 795,869
653,899 -> 653,90
488,874 -> 488,570
93,879 -> 645,327
320,658 -> 40,938
611,246 -> 611,22
258,935 -> 258,829
931,436 -> 931,263
252,460 -> 252,461
490,382 -> 965,382
242,89 -> 242,617
271,111 -> 595,435
462,706 -> 242,486
557,328 -> 747,328
486,99 -> 486,333
156,40 -> 488,372
323,482 -> 138,297
595,539 -> 812,756
923,861 -> 377,315
934,952 -> 256,274
314,777 -> 314,12
508,47 -> 508,144
888,807 -> 701,807
745,774 -> 878,907
740,716 -> 740,215
62,43 -> 62,12
571,196 -> 454,196
568,107 -> 408,107
549,676 -> 404,676
595,573 -> 595,970
148,168 -> 193,123
763,71 -> 759,71
797,64 -> 307,64
959,984 -> 32,57
457,562 -> 634,562
127,521 -> 601,47
112,296 -> 112,120
148,755 -> 451,755
636,494 -> 870,494
910,242 -> 945,277
912,911 -> 912,892
759,815 -> 759,314
391,285 -> 391,959
455,460 -> 182,460
112,78 -> 112,385
842,179 -> 842,592
236,424 -> 421,424
508,907 -> 30,907
637,219 -> 34,822
503,375 -> 503,205
570,533 -> 626,533
658,11 -> 658,94
179,286 -> 326,433
918,214 -> 200,932
339,887 -> 81,887
794,91 -> 50,835
225,356 -> 225,261
80,160 -> 80,335
148,64 -> 847,763
595,393 -> 941,393

46
2021/d06/ex1/ex1.py Executable file
View file

@ -0,0 +1,46 @@
#!/usr/bin/env python
import itertools
import sys
from collections import Counter
from dataclasses import dataclass
from typing import Iterator, List, TypeVar
T = TypeVar("T")
def nth(iterable: Iterator[T], n: int) -> T:
return next(itertools.islice(iterable, n, None))
def solve(input: List[str]) -> int:
fish = [0] * 9
for n, count in Counter(map(int, input[0].split(","))).items():
fish[n] = count
def step(fish: List[int]) -> List[int]:
# Count how many clones happen
new_fish = fish[0]
# Do the next cycle
fish[0:-1] = fish[1:]
fish[6] += new_fish
fish[8] = new_fish # Override number of new fish
return fish
def iter(fish: List[int]) -> Iterator[List[int]]:
while True:
yield (fish := step(fish))
return sum(nth(iter(fish), 80 - 1))
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

1
2021/d06/ex1/input Normal file
View file

@ -0,0 +1 @@
3,1,4,2,1,1,1,1,1,1,1,4,1,4,1,2,1,1,2,1,3,4,5,1,1,4,1,3,3,1,1,1,1,3,3,1,3,3,1,5,5,1,1,3,1,1,2,1,1,1,3,1,4,3,2,1,4,3,3,1,1,1,1,5,1,4,1,1,1,4,1,4,4,1,5,1,1,4,5,1,1,2,1,1,1,4,1,2,1,1,1,1,1,1,5,1,3,1,1,4,4,1,1,5,1,2,1,1,1,1,5,1,3,1,1,1,2,2,1,4,1,3,1,4,1,2,1,1,1,1,1,3,2,5,4,4,1,3,2,1,4,1,3,1,1,1,2,1,1,5,1,2,1,1,1,2,1,4,3,1,1,1,4,1,1,1,1,1,2,2,1,1,5,1,1,3,1,2,5,5,1,4,1,1,1,1,1,2,1,1,1,1,4,5,1,1,1,1,1,1,1,1,1,3,4,4,1,1,4,1,3,4,1,5,4,2,5,1,2,1,1,1,1,1,1,4,3,2,1,1,3,2,5,2,5,5,1,3,1,2,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1,4,1,4,2,1,3,4,1,1,1,2,3,1,1,1,4,1,2,5,1,2,1,5,1,1,2,1,2,1,1,1,1,4,3,4,1,5,5,4,1,1,5,2,1,3

46
2021/d06/ex2/ex2.py Executable file
View file

@ -0,0 +1,46 @@
#!/usr/bin/env python
import itertools
import sys
from collections import Counter
from dataclasses import dataclass
from typing import Iterator, List, TypeVar
T = TypeVar("T")
def nth(iterable: Iterator[T], n: int) -> T:
return next(itertools.islice(iterable, n, None))
def solve(input: List[str]) -> int:
fish = [0] * 9
for n, count in Counter(map(int, input[0].split(","))).items():
fish[n] = count
def step(fish: List[int]) -> List[int]:
# Count how many clones happen
new_fish = fish[0]
# Do the next cycle
fish[0:-1] = fish[1:]
fish[6] += new_fish
fish[8] = new_fish # Override number of new fish
return fish
def iter(fish: List[int]) -> Iterator[List[int]]:
while True:
yield (fish := step(fish))
return sum(nth(iter(fish), 256 - 1))
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

1
2021/d06/ex2/input Normal file
View file

@ -0,0 +1 @@
3,1,4,2,1,1,1,1,1,1,1,4,1,4,1,2,1,1,2,1,3,4,5,1,1,4,1,3,3,1,1,1,1,3,3,1,3,3,1,5,5,1,1,3,1,1,2,1,1,1,3,1,4,3,2,1,4,3,3,1,1,1,1,5,1,4,1,1,1,4,1,4,4,1,5,1,1,4,5,1,1,2,1,1,1,4,1,2,1,1,1,1,1,1,5,1,3,1,1,4,4,1,1,5,1,2,1,1,1,1,5,1,3,1,1,1,2,2,1,4,1,3,1,4,1,2,1,1,1,1,1,3,2,5,4,4,1,3,2,1,4,1,3,1,1,1,2,1,1,5,1,2,1,1,1,2,1,4,3,1,1,1,4,1,1,1,1,1,2,2,1,1,5,1,1,3,1,2,5,5,1,4,1,1,1,1,1,2,1,1,1,1,4,5,1,1,1,1,1,1,1,1,1,3,4,4,1,1,4,1,3,4,1,5,4,2,5,1,2,1,1,1,1,1,1,4,3,2,1,1,3,2,5,2,5,5,1,3,1,2,1,1,1,1,1,1,1,1,1,3,1,1,1,3,1,4,1,4,2,1,3,4,1,1,1,2,3,1,1,1,4,1,2,5,1,2,1,5,1,1,2,1,2,1,1,1,1,4,3,4,1,5,5,4,1,1,5,2,1,3

21
2021/d07/ex1/ex1.py Executable file
View file

@ -0,0 +1,21 @@
#!/usr/bin/env python
import itertools
import sys
from typing import List
def solve(input: List[str]) -> int:
nums = sorted(int(n) for n in input[0].split(","))
median = nums[len(nums) // 2]
return sum(abs(n - median) for n in nums)
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

1
2021/d07/ex1/input Normal file
View file

@ -0,0 +1 @@
1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,1133,1029,1446,1005,596,277,439,544,201,317,237,33,252,774,482,291,57,1434,153,134,385,993,677,1189,99,1082,351,80,1563,195,581,693,5,633,184,552,11,606,462,48,134,1451,850,221,336,661,276,156,932,23,98,76,327,212,489,230,819,998,1037,1561,206,159,757,207,1203,224,1459,294,39,1108,96,89,1664,353,41,83,942,771,362,193,900,676,851,277,558,368,1054,316,143,464,85,896,558,52,669,163,696,140,340,542,817,783,1436,786,81,21,669,184,430,312,1500,797,698,611,314,145,125,391,785,867,488,144,9,967,560,245,116,96,1769,314,533,25,0,1375,1307,1273,1178,332,59,26,234,487,480,615,313,629,28,707,96,637,30,350,1286,900,777,115,56,79,809,1101,13,150,741,940,20,403,384,479,622,108,325,276,609,654,535,539,62,187,414,535,140,222,845,357,55,17,8,1430,853,759,331,673,202,482,1280,714,911,409,429,604,278,478,301,408,590,329,1482,110,423,488,7,628,66,196,399,86,241,1058,501,1284,594,710,799,34,60,668,457,0,1209,20,50,1134,288,415,399,86,540,1356,285,1541,172,3,634,1387,146,669,195,403,601,758,160,970,760,43,213,68,805,50,350,292,78,252,54,1021,882,241,808,601,892,878,1401,48,191,74,1429,94,520,505,679,1133,120,485,183,362,684,520,1366,301,123,290,1248,140,44,230,572,57,1101,217,906,1012,668,85,230,32,100,472,275,78,91,19,61,732,518,189,85,1531,1255,134,489,637,792,42,36,392,603,976,651,127,486,340,534,185,890,346,906,1295,319,321,597,252,183,554,124,44,426,131,408,582,429,645,1227,574,14,1828,359,184,1830,10,288,194,949,1578,492,502,149,609,77,92,320,233,1026,123,26,188,1123,4,665,1793,331,858,481,197,424,133,933,338,7,163,1269,665,19,1,538,126,895,1751,345,895,203,175,66,305,1479,239,718,386,8,1148,203,636,1211,635,149,489,1156,1828,61,328,331,287,262,8,3,522,1427,931,1103,199,329,930,779,124,446,391,903,696,1764,16,595,522,143,296,19,872,29,546,566,256,63,1195,862,516,267,452,1287,11,547,760,77,117,988,185,293,421,118,767,70,169,456,600,755,740,1799,97,507,1165,265,1126,376,1250,408,22,674,774,361,54,558,1021,529,29,871,527,474,218,47,309,61,188,1365,725,267,235,359,1004,1771,765,8,17,103,89,967,65,302,759,1688,882,709,1469,123,548,834,355,646,404,76,257,101,627,2,66,1328,137,42,23,127,110,632,683,1163,843,1119,16,497,1756,347,958,981,57,185,204,1403,530,536,104,68,1152,95,320,959,144,281,350,622,717,112,631,150,19,938,296,1272,825,37,192,350,847,306,824,1042,320,480,857,589,137,687,93,21,1601,547,550,491,161,49,124,292,396,34,24,95,932,56,968,197,109,1300,1326,605,357,412,14,179,450,991,173,120,1402,478,77,933,88,96,49,95,596,1885,841,441,659,309,418,87,134,34,815,759,631,209,728,7,232,1304,698,140,304,1448,101,1,239,1321,362,1367,1411,279,111,633,1347,110,18,710,443,1676,64,531,386,64,518,619,893,140,301,426,1451,261,1083,115,61,943,60,891,217,475,48,436,586,31,287,196,430,357,78,161,1533,745,198,715,8,307,225,604,263,992,371,749,700,1573,573,546,480,425,47,88,66,799,388,60,736,111,81,856,29,695,141,4,271,143,939,423,3,1260,265,24,903,292,23,80,196,1245,399,123,3,532,283,366,1175,187,15,450,487,117,1041,669,59,579,159,461,598,915,666,1231,999,253,185,1016,135,1317,253,111,1261,833,26,851,120,11,63,718,682,233,76,0,50,1678,777,286,279,90,47,158,71,35,475,245,550,4,942,1816,1646,102,175,343,12,446,12,623,44,157,10,555,1173,651,361,745,1870,97,237,1628,90,233,126,1596,1146,746,383,209,55,209,318,904,144,90,21,86,4,970,262,8,210,249,871,1216,1003,172,405,821,225,2,143,915,129,598,397,583,1400,315,113,33,75,426,2,611,293,196,419,125,176,496,4,607,1425,27,48,172,972,626,227,184,1257,514,209,524,22,58,927,4,931,3,6,104,716,961,17,4,154,249,558,203,180,180,1194,935,263,535,380,1439,274,1566,873,1763,2,89,636,407,667,438,966,757,245,730,328,915,167,245,126,52,652,938,1183,320,1298,10,844,36,263,382,37,142

28
2021/d07/ex2/ex2.py Executable file
View file

@ -0,0 +1,28 @@
#!/usr/bin/env python
import itertools
import sys
from math import ceil, floor
from typing import List
def solve(input: List[str]) -> int:
def fuel(dist: int) -> int:
return dist * (dist + 1) // 2
nums = list(int(n) for n in input[0].split(","))
mean = sum(nums) / len(nums)
upper = sum(fuel(abs(n - ceil(mean))) for n in nums)
lower = sum(fuel(abs(n - floor(mean))) for n in nums)
return min(upper, lower)
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

1
2021/d07/ex2/input Normal file
View file

@ -0,0 +1 @@
1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,1133,1029,1446,1005,596,277,439,544,201,317,237,33,252,774,482,291,57,1434,153,134,385,993,677,1189,99,1082,351,80,1563,195,581,693,5,633,184,552,11,606,462,48,134,1451,850,221,336,661,276,156,932,23,98,76,327,212,489,230,819,998,1037,1561,206,159,757,207,1203,224,1459,294,39,1108,96,89,1664,353,41,83,942,771,362,193,900,676,851,277,558,368,1054,316,143,464,85,896,558,52,669,163,696,140,340,542,817,783,1436,786,81,21,669,184,430,312,1500,797,698,611,314,145,125,391,785,867,488,144,9,967,560,245,116,96,1769,314,533,25,0,1375,1307,1273,1178,332,59,26,234,487,480,615,313,629,28,707,96,637,30,350,1286,900,777,115,56,79,809,1101,13,150,741,940,20,403,384,479,622,108,325,276,609,654,535,539,62,187,414,535,140,222,845,357,55,17,8,1430,853,759,331,673,202,482,1280,714,911,409,429,604,278,478,301,408,590,329,1482,110,423,488,7,628,66,196,399,86,241,1058,501,1284,594,710,799,34,60,668,457,0,1209,20,50,1134,288,415,399,86,540,1356,285,1541,172,3,634,1387,146,669,195,403,601,758,160,970,760,43,213,68,805,50,350,292,78,252,54,1021,882,241,808,601,892,878,1401,48,191,74,1429,94,520,505,679,1133,120,485,183,362,684,520,1366,301,123,290,1248,140,44,230,572,57,1101,217,906,1012,668,85,230,32,100,472,275,78,91,19,61,732,518,189,85,1531,1255,134,489,637,792,42,36,392,603,976,651,127,486,340,534,185,890,346,906,1295,319,321,597,252,183,554,124,44,426,131,408,582,429,645,1227,574,14,1828,359,184,1830,10,288,194,949,1578,492,502,149,609,77,92,320,233,1026,123,26,188,1123,4,665,1793,331,858,481,197,424,133,933,338,7,163,1269,665,19,1,538,126,895,1751,345,895,203,175,66,305,1479,239,718,386,8,1148,203,636,1211,635,149,489,1156,1828,61,328,331,287,262,8,3,522,1427,931,1103,199,329,930,779,124,446,391,903,696,1764,16,595,522,143,296,19,872,29,546,566,256,63,1195,862,516,267,452,1287,11,547,760,77,117,988,185,293,421,118,767,70,169,456,600,755,740,1799,97,507,1165,265,1126,376,1250,408,22,674,774,361,54,558,1021,529,29,871,527,474,218,47,309,61,188,1365,725,267,235,359,1004,1771,765,8,17,103,89,967,65,302,759,1688,882,709,1469,123,548,834,355,646,404,76,257,101,627,2,66,1328,137,42,23,127,110,632,683,1163,843,1119,16,497,1756,347,958,981,57,185,204,1403,530,536,104,68,1152,95,320,959,144,281,350,622,717,112,631,150,19,938,296,1272,825,37,192,350,847,306,824,1042,320,480,857,589,137,687,93,21,1601,547,550,491,161,49,124,292,396,34,24,95,932,56,968,197,109,1300,1326,605,357,412,14,179,450,991,173,120,1402,478,77,933,88,96,49,95,596,1885,841,441,659,309,418,87,134,34,815,759,631,209,728,7,232,1304,698,140,304,1448,101,1,239,1321,362,1367,1411,279,111,633,1347,110,18,710,443,1676,64,531,386,64,518,619,893,140,301,426,1451,261,1083,115,61,943,60,891,217,475,48,436,586,31,287,196,430,357,78,161,1533,745,198,715,8,307,225,604,263,992,371,749,700,1573,573,546,480,425,47,88,66,799,388,60,736,111,81,856,29,695,141,4,271,143,939,423,3,1260,265,24,903,292,23,80,196,1245,399,123,3,532,283,366,1175,187,15,450,487,117,1041,669,59,579,159,461,598,915,666,1231,999,253,185,1016,135,1317,253,111,1261,833,26,851,120,11,63,718,682,233,76,0,50,1678,777,286,279,90,47,158,71,35,475,245,550,4,942,1816,1646,102,175,343,12,446,12,623,44,157,10,555,1173,651,361,745,1870,97,237,1628,90,233,126,1596,1146,746,383,209,55,209,318,904,144,90,21,86,4,970,262,8,210,249,871,1216,1003,172,405,821,225,2,143,915,129,598,397,583,1400,315,113,33,75,426,2,611,293,196,419,125,176,496,4,607,1425,27,48,172,972,626,227,184,1257,514,209,524,22,58,927,4,931,3,6,104,716,961,17,4,154,249,558,203,180,180,1194,935,263,535,380,1439,274,1566,873,1763,2,89,636,407,667,438,966,757,245,730,328,915,167,245,126,52,652,938,1183,320,1298,10,844,36,263,382,37,142

38
2021/d08/ex1/ex1.py Executable file
View file

@ -0,0 +1,38 @@
#!/usr/bin/env python
import itertools
import sys
from dataclasses import dataclass
from typing import List, Set
@dataclass
class Entry:
signals: List[Set[str]]
outputs: List[Set[str]]
def solve(input: List[str]) -> int:
def parse_entry(input: str) -> Entry:
signals, outputs = input.split(" | ")
return Entry(
[set(s) for s in signals.split()], [set(o) for o in outputs.split()]
)
entries = [parse_entry(line) for line in input]
return sum(
itertools.chain.from_iterable(
map(lambda __: 1, filter(lambda d: len(d) in (2, 3, 4, 7), entry.outputs))
for entry in entries
)
)
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

200
2021/d08/ex1/input Normal file
View file

@ -0,0 +1,200 @@
badc bd dbeaf cfdbge dfb cfbdea efbag edcfgab dcafe degfca | eacfd acdfbe cbdegf fcbaedg
cd fdbac egcfab gbadcfe cfgdeb cbadfe deca cdf dfabg abefc | dcf cfbad gbafced fcd
cg agecfb cbg eabgfdc egdc fdgba bafecd cbdfe bfcdeg cfgdb | efdcb adcfeb fbdcg gbc
bfceg gfadb dbcfgea bgaef efad abe bcdgfa ea fbdgea agecbd | eadf ceadbg abfge fecdbga
gdcafe eacb adc gbfda afdceb edgbcf badfc ecgbafd ac fdbce | ebfcd cefdab bdfgeca egbdacf
aefbgd fbdc fbecg egdcb edcbag bf gcefa fbedcg bagfced fbg | afgce cfbd bdcf geafdbc
ebgacd edacg gcdeaf cabfg dbc bd cdbgaef ebad fecgbd acbgd | dgbac db caegbdf gcbfa
defbga gead ge efagcb gdafbc cegbdfa egf bfdce bgdef dgabf | gef eg bfcdag ge
bae adcgfbe cdfeag ab dcgeb bfdage agecb cagfe abcf bfcaeg | bae aeb agfceb afceg
ae adefcb gaceb gadceb edag efadcgb badgc cfgbe cadbfg cea | ceabgd fbeacdg aged aged
aegbdc dbegfac gcbaf df febd egdafc deabg gdf gdfeab adfbg | bcdegaf dfeb bcegad df
aegcdfb becdaf gdecf ag fag dcfgba badg fcbad cdgaf acefgb | abcdf cefdab ga ga
gbcfad cefadg cegad aefdb gedacb gcfe fc cfbgead cfade caf | degac egcf geacfbd afc
bcfad afcdbe fd ecfba cfd afde cfeabg gcbfed dacbg fdgabec | cafbged edfa fcd dabgc
afdc adbfe bgecfad ecagdb dbcafe dfe fd agbfe bdace gdbfec | fadbe efbdgc fadbe edcba
bdface geba ecbdag acegd afcdg ge eadbc bfecgda edg fgbdce | eg abge fadgceb abge
fagbde fcegbd gec efcdg fdgbe ebfcag gc adcfe cgdb cagbdfe | defcg cbgdfea gcbd ecfgd
acfbg debgf gfcdba edcbfa fbdag fgbeca cfbagde gadc da bda | dacg acbgf cedfgab caefdgb
ca dfegca edcbgf gfcde aedbg gfdeacb dcbfea facg dgcea ace | fedcg fdagec cea ac
acdf gcfde debcga ecbgaf cf ebgdf bagfdce cedag cef gedafc | dgcbea fc dcgeaf cdaeg
ebagf cabgfed ed cbgad afcbge afdbge edg eagbd cedgfb aefd | fcgdbe de cgbeaf ed
fbcdeag cafbd fgcbea fdgacb daecfb cg gca defga gbdc fdcga | abfcged agc acfgd cbfaeg
dacfe ed ebdcag gcadfe dfbcaeg dce dfeg fbcadg bfeca acdfg | fcbdga gcbade aegdcf fbcgda
cfdegb cbef fgdec gdfbca gdecbfa egfdca bc gbc cbegd aedgb | befc bc abegd ebcdfga
agcefdb fdbg bf bdafe gdebaf eafdg acdbe gcebaf bef edcfga | bf fdbg efdab gefda
gcb bdcgef dcbfg bg edbg facegb cbedf edgafbc dfgca edacbf | gb cdebfa deagfcb bg
eafbg gfad afegbd caefbg befdgc ebagd gd bdg cfbdage acdeb | gd geafb cabed dbg
bcedfg dc dgc aedfbcg acgbed bgfead gedbf bfdcg cedf facbg | gabfed cdebag dafegb cd
fa adbceg afecd cafdbge eacgfb daegcf aef bcdfe fdga daceg | acedf afe fae afdg
cdfaeg agcfb bcdgea dcafeb cef fabec ef dfgcbae defb eabcd | gdabce fdeb ebdf ecf
cdefg ceafg gebfd cdg dc efbcdg cdgbea cfedbga cbfd fdagbe | fbcd afdgbe fabedg dcfb
cdafgb egdb fecgabd cbfdg fcbedg feb acefg begcf be dacebf | be be ebfdca abgfcd
eafgcd facegb acb cdbfaeg fagec dgcabe baefd cgbf cb afecb | bcafeg fcgb gfdeac eagcf
ecgdfb deb edfgab eb faedcg agfed bfaed dbacf gbae efgdcba | fabde eb ecdgfb eabg
aefbg bdegfa gacdb gefc fbc fc bfdcae gefbac cbfag dbgefac | ecfg fc cfge efgcdab
gcfbed gcbae dcaef cbegad bdag bgeacf adefgcb deg adgec gd | agcbde bgad gdbfec gcfabe
dfacb egbcda dac agdcfb fecab adecfgb bgadf cd fgeabd cgfd | gabfdec acd dc dc
bfecg dcgeab af gadf aedbg caefdbg bgfade bafeg abf eabdcf | ebcfg gafd ebacfd fgbdace
ge fdeab gcebfda fadcg fgead abcdef eag ebdgfa acgbef dgeb | cdagf cfdgbae fdeab eag
dba dgfceb fbcegad bagde bcdeag bcedg bdafce agfbe ad cgad | bdcafe agdc ebdcg cdga
edfg fedac fbegcad acgfe fabcd ead bgefac de daecgf bcaged | bafcd ade bacefg fdbac
gdecbf edabc ef fcgead fcadg bdcfga fec ceadf dgaefbc agfe | faedgc ef gabfcd fe
deafg eb egbaf cadegf fcdeab degb bcgaf bfe bfcdega gefdba | abgfe eb gfdaeb efdcga
fabcd beadf efabgc fc cafdgb gcfd adfcgeb abgdce cfb dgcba | dcgf bdcgaef gdcf cfdg
ebac acedf ceadfb cfe dbcgaf ec efcgdab degaf abfcd edgbcf | ce edgaf dgbceaf fce
ecbag fg gacdfe edafgcb cgefa eacdfb deafc bdagcf gcf dgef | fged gedf cefdga cabge
dgebc bcg cg gdeabf cgfeba gdfc gefbdc adbec bdefg fgcdbae | begdf cfgd eadbc gbfde
aefdb ecgb dgaeb agdbce ega fgdacb bcadg cbdeafg ge edacfg | age fcbdaeg gea bcfegda
cdeabg fcgda bdagc acfb dfa af cdeabfg efdgab fbcgda decgf | bcagd cfba gedfc af
ceadb caebgfd bdfaeg cbgaf ge ega gadcbf gfce ebgcfa gebca | aecdb febgcad bgcaf fadcgbe
daegb gfdae ceagfd bgfade feagcb fbgd bg cbagdfe ebdac ebg | gefbacd dbgf geb adgbfe
ecadfg acdfb aefgc ecbfdag dce cfbega fcdae edga gbecdf ed | fcdba ced egfcba dega
defgbc cgdea efag fdbcgae acbdf gcdaeb fe dfcega efc defca | fage fec dcafeg ecagfdb
bg dbcafg gdafecb dgfcae defcg gebd cefgb bgfecd fbaec fbg | gbf dfgec bedg cfdgae
ebgda ebd adce cdgaeb edfcgb bcagd agdcebf ed agbef gcbfda | efagb gbefa dbcfgae eadc
ebcfdg dbe de cdabgf fgdab dgae aecbf abfgced edbaf eagdfb | bface cdafebg gadcefb fedab
agc dabcge agbcd cabe dbagf cfgeadb gecafd gbcdfe ac gbced | cbegd beac dgbce ac
fdagb bdeacf fga eagd gcfdb gecafb ga feabd abfgde dcbfega | bdafe abgcfe gbecfad abdgefc
fbecd dbaef bdgc debafgc daecgf ebfcgd ebc abegfc bc gfced | fadecbg cb cdgeaf bfade
fagbe aebfgcd gef bgadf cbagfd deafbg cfdeag ge begd beafc | bcfadeg edbgaf fcgaed ge
gabfc gabde fbdga bfegca agfbcd df cdfagbe dcfg caefbd dbf | decfagb bdf gfcd fd
bdafeg gf gbadf gefb cgefda daecbfg bacfed cdagb fdg fdaeb | daegcf eagdfb adgcb bagfed
dafegb efdac bda fgedbac egfcdb bgfa fbaed bgdef debagc ba | ba bgcead bad ab
cfged cbegdf cb ecgdb adefbcg fdcabg cdb cdagef efbc gedab | bc gdebcf gecdb bagdcf
fbegcd gcedba eba acegf dbfa efbgd ebfadg ab fgceadb bgfea | fgbae gbedcf degfb agdebc
ceadf fdacbe ef edgafb dfe bgaedc cadfg bcef cfebgad ecabd | cafde fabedc debac eacfd
cd dgafe cbgfae decfg cfebg cfd gdbc febgdc fbegacd fceadb | dc beagfc aebcfg gcfeabd
adcefbg caefgb bafd dface bdcfe cegbd fbe gdfcae dceabf fb | efb ebcgd gbdcaef fb
fbdg gebac degbfc gd dfeagbc decfb gcd dafgce faecbd bdgec | gfdcae gfdb dg afgdce
fb fgedca fbe gfcde gcbfde dbceaf bgeca eafbdcg dgfb fbegc | fbe cbdegf bfe gedfc
acfbe fcbaged bgdcf cabgfd ag cagd fcbga bcfegd gfa eadbfg | afgcb gbdecf efdbcg fag
fbegc dgca dfc fagbedc bfadcg dc ebdfca fadbg cgbfd gfdbae | dabefg egdbaf gaebdf dc
cdbgf bdfaeg ca fgcab dgacfbe feac facgbe ebgcad bca gfbea | dafbeg cab cdagbe debfga
gfbe ebcfag bcedaf be egfac fegdca gebca eab cbgad gfacdbe | dabcgef bcagfed gcfea bea
bdefacg fbgedc efdagb beg geabf eg dafbce dage gfabc eabdf | gead gcafb ecfdab egfbdac
gd gfecbd dacefb dgbf cdegf acfge agbfced becdf aedbgc gdc | gdcef cgbead gd gefacbd
cgbfea cafed dbgefac gacb bc afbge fdabge efbac bcfgde cbe | gbac fcdbge agcb aecgdfb
abgefc cfeba gcdba fgdcea gf fcbgaed eadfcb gbfe fga bacgf | efcba fabecd dgcbfae eagcfd
gcdbfe fdec gcfdb bdfeg de efgba cbgdafe afgcbd cgdbea ged | cedgbf fced agfcdeb cgfbed
dbacfge cafdb gbcfea aegc afbec ea bae bgcedf befgc edgafb | dfgeabc bfgcde faceb fbecag
bfcgad bfegd fg dcgeb egaf bfedcag efabdc dfegba gfb abefd | gf abdgcf dcbfag fgb
degab dgebac bfdeacg cadeb fbdeac bag debgf cgda abgecf ga | dceba fdbeg edbac dbacfge
abdef gcbead bgce cgdab deg dgcbfa aedbg fbacdge eadcfg ge | cgfdba gcafde agfcedb fdacbge
defabg cabdg gcfed cabe gbeacd fgadbc eb geb aedcfgb bdgce | eb dbegc dfecg dbecag
egdabcf edcgb bcedgf cgb bgfe fcgabd bg acgfed cbaed dfegc | cgb gbc egcfad degbc
fe agebdc gfbead fcdea abecgfd bafcde beacd cbef def cgfad | dabgfe fde adfcg bfgead
ba fcabed bad dgacf dfgecab dcgba gdecb bdgcfa abgf caegfd | gdecb dgcfba gcdafe afbedgc
bdgef cdbgfa acbed gedcfb efdgba cg abcgedf cgb cgdbe cfeg | edabc ebdca edbcg ecgf
edfba bcfgead cbged defbcg ag gfadce gcaebd edabg cabg dga | fedagc bcag bdegc gaebfdc
edab fed egcfb ecgbfad fegbd fagdcb degcaf afgebd gabdf ed | def gdefb fgedb edcagf
fc ebfgda ebcfd cabed gcadbf baecfdg cgfe fdc egdfb gdecbf | defbg aecbfdg cadbegf adgfbe
bgdfc fgc fdegb dgecfb fcabd egbafdc gc dgce gabefc gedbfa | fbdgce gc dbfegca cg
bgedc ged gdfcea dcefb cdabg bgfe defbgc bdecaf dcgbfae ge | badefc gbfe cbegd fdagbce
cdefga cgdafeb cbe becdg gdefc cfbg cfdbeg cb febdac edgba | edbgcf abecfd ebgfcd fgbc
de aegcf agedcb afegbdc edbf fbdga facgdb gdaef dbaegf dea | cdabgf ead afgbcd edbf
cfagde eagfbc cbegf cg fcaegdb ebgfd gcf dafebc efabc acbg | bacfe fgc gcf cg
gadfce fbcaeg bdag eba bedcgfa dcfbe ab ebdgca ceagd ecabd | eabdc badec cdaeg dagb
aedb ebcagf fdeac be bdgfc eafbdc abcfegd aefgcd feb ecdfb | fecbd adeb be bfe
dg fgdecb dfecb fdcgeba gedcb gceab fdge cgd cgdbfa baedcf | ecbgd cagfdeb dcbfeg gd
fgcead bfdcag gecdf dfeacb dce aged gcbfe dcfgeab ed fgcda | cfegd de gcafd gefdc
dbec eafbdg dafegc eac gbacf decagb bcgae bdgea gbcefad ce | becag edgab cbadgfe edbc
gefcab agbdc febd bcegd de ecbfg afgdce ebafgdc dfebgc egd | de gdecfba edbf cdegb
abdcefg fbdega dcfag bd fegba badgec fgadb edbf fgaceb bdg | acdfg fagbce adcfg abgfd
ag agdb bfeag fbgdace bcfeda dgafeb egafdc begfc dfeba eag | ecbfg agbd dabg bfeacd
dagc dae fdaec edcafg fbadeg cgefa abcgef ad dfecb fdgcbae | eda eagcbf agfec debfc
ead beafd dfagb faceb bfedca facegd aefcbg cbed ed gfcbaed | abgdf eda agbfce ead
afdgb eabcgf dfgbe fecdgba dagceb gfa cafgdb af cdfa abdcg | abdfg dceagb decfagb fagcedb
dbcfga cb acb gcbafde fcbg egbfda dceaf gbfda dcfba cdbgae | fcadgb cdefgba agbfd cgfb
gceb fcgba cefdba caebfdg egfadb eagfcb cb beafg acb gfacd | abcedf bca gfcda bcge
eabdc caebf ad dgabcef fcaedg cfegba deacbf dabf dca begdc | dbgce dbfa fgebadc acedb
fbgce ec gcea dafcgeb fgbed fec adgbcf abcfeg fcbga cfbade | cbdfag ebgfc fgcbe agbfdc
afcg afebcg becgf fgadeb bdgaefc fa afe acedb abecf gdfebc | fgecb eacdfgb ceabf cgfa
fb gadeb aegdfb abgfe fab dfgb adfecbg bcaegd ebdafc cafeg | becdfga bf fbadec bgfd
ab dgafe fdaeb adb agcedf ecbfd agfb caedgb bdfage egfabdc | fedbc dfecag afdcge becfd
bgedf dgecfb fae gbaec fa cedafg dcabfge gedfab gafbe fbda | fcgdea geadcfb efbdg fa
cgfaed fdebg fcgabd fcegb bd dfaeg gfbeda fgdceba edba dgb | db ebcgf fgcbe edgfa
fgc egcafb dcgb fagdb bedafgc cdbgaf fedac cg gacfd dfbage | febgad cgfaeb fadbg gc
fdaebcg deabgc bfdeg dfcaeg efcgd cdaf cfbeag fcg cf cgeda | bgefcad bgdfe dafc ebagfc
egcfad dbecf cbgf fbe aecbd bcfdge dfbgea aebgdcf ecfdg fb | cgfb gecfd gefacdb fbcg
cdb adcf gbcdae bdceaf dfaeb cdfeb febgc fgedba cd cgdafeb | eadfb fcgeb cbedga bdacge
gd dacg gbdafc gfbdc bdegaf fbgca cbgdefa cbafge edfcb dfg | gbcafd dgac dgcafb cbfgae
cbf dafeb fbceag bc egbdfc edbgafc fbced ecdfg cdgb gdafec | bcf dbfea ebagcf gadfcbe
dcebgf eagfc aebfcd edcbg baefgdc fd cdefg dgaebc fde bfgd | ebagfcd acgefdb fagec gbdaec
afgdc bagec bdfg fb ecgdbfa fab dfecga bcgadf dcafbe bgafc | afgced fb dcafg feabcd
gef febag ebagc egcfbd fg cafg abfde abcfge afcgebd ebcgda | egf gaebf dfeba gadbce
ag cdeafg gdbfce daceb acgf efgbda adg cegda gaedbfc efcgd | debac eadbc bgaecdf cgbaedf
acefdbg debgac ecdgf ead facebg eafgb ad fedbga bfda eafgd | adbf eagfd eabcfgd ecagfb
cd bafegc fgcaed fcaeg dgc fdcag agdbf fedc gbadce egdabcf | fedbcga bgafd fcde cfed
decg egf ecgbfa degfa edbagfc dgcabf cdfag eg fcaedg faebd | gcadef efadg egf eg
feacbg cgfadbe efb efbga dfagb eb aefgc bgec cgedaf dcebfa | eb be be fbe
begc eacfdb dfacg agcfe ce eagbf eac eafdgb aefbcg dfgaecb | ce ce ce gbce
dfeagb dgaeb dbagefc gbcfae degf decba cbgdfa bgfda eg gae | ge agfdcbe bdace fdeg
cgdab cegdbf cfbad bg aegb caedfg eacgbfd dgb dgaec gdbaec | gbea eacgd gb cgaebd
ag ecdgbaf edcba eagcd aeg gcfa dfcgae egcdf gfdeba fcgbde | fgeadb dacge fdagceb egafbd
fdbgec bge fdacbe bfdga edfgb cbgaed gefc cefdb ge baegdfc | ebfgd gbe begdf eg
cedafb gdab fgced cabdf fgbaecd dcbgf gb bgc gabfdc ebfgca | bcadgf cbfda cdgfab agdb
fdcbg bgface ecdabf ad fgcbaed gcefad dac efgac cfagd daeg | dcfabge edga ad gcfea
bce gaecdb aefc bedfgca acbfge aebgf fbceg defgba dgfcb ce | ceaf ce bfgce ce
gefadc gefadb agd ebfcdag dbeg dfagb abfed gafcb dg adbcef | fbgad bged gd cfebda
dcfge egdbf adcgf bafecgd ecd gdfeac bdecaf ec cfgdab cage | acge dacgf facdg cgea
bagdec gecdfba gdabe deb eabc be acdgfe afgdb deagc gdecfb | aebgd cgdea adbge eabc
gebca bedgaf ac gcbeaf bcagedf bafge egcfda bedgc cabf cea | ecbdg efcgab ebagc bgadfec
edacbg gcfad efdabg bc cgfdbae bdc cfedab efbc beadf fadbc | dbc fcbe fbedacg cabfd
adfgce acgfb bgfadc dgbca fc gfc fgacdbe fagbe bcdf ebagcd | cbagdfe gfc fgbac cgbaed
gdbfec bea acdb ba bcged edabgc gcfaebd afebcg gedba gdeaf | ba fgcebd efgda gadfecb
gd gcda bgd gafbcde bdcfag bcgdf cedfb bgefda eacfbg cfbga | fgcab fdgcba bgacf bfedga
fgcadeb abdgc gce bagec fcbea ge aebcgd gead cedfgb bagdfc | gbdace baefc fdcagb cdgab
fbca aedfcg eagcbd fadbec bdgef fec cf bgcfade dbcef cbade | fgedb bgefadc fc cf
dbgfa feca gfbced cf abfgce fcb cafbg eabgc acdbge edafcbg | abgdf dbcgef geabfc fcb
dbaf fag bdfgea ecbgfa dgbfe fa edacg agcfdbe cefdbg fdgea | fgbaed cdegbf dacfbge gdcfbe
abc acefbd gacedbf gbcde dgabf ca fgcedb cega dgbca cgeadb | ca bcged abgfd bca
ceabgd cgfeb ea aedf gcbdfa cadbf acdfeb abfec eac dgcefba | cgdbafe cea adfe aec
dbcfgae agebc ebgd cebdfa ebacdg deagc be fdecga gbacf bce | deagcb agecdf caefdg cegad
dcaeg gea gdaf befgac cefgd facbdeg dcgbfe ga dagfec adecb | gadf gaedc age cabedgf
bead dagfbe gda bagfec ad egfba ecgfad fdcgb ecfabdg dfgab | agefdc dga bgfea dafcgbe
abcgd gecbfda cegd badfge bcaed fcaeb ed adcgfb gcabed edb | acefb acbgde deb ed
cgefdab dgbcfe gbe beca be fdecga bgcafe bfgda abgfe fgace | bfgda eb gbe bdgaf
age cefbadg bcfea cdagbe begca ag gedfca cbfdeg ebcgd dbga | efbac ega fecab dgba
cgedf fc defbgc cdf fceb dgebf bafgdce eadbgf ecgad gcfadb | cf deabgfc efgdbc fgbcda
bdgeacf bagdef gb becg bcfage cafbg bga fdbac caefdg eafcg | bcedafg cbeg bg gb
dfceb gcdab ecbad gfbdea eab gcbeda bgcdeaf ea abfgdc cgea | baedc egca dgacbe cedfb
gdaeb dgfbc cefg fe cfbgaed gdfeb fadcbg defgcb abcdfe dfe | gdcfba eagdb fe cfeg
abfcedg afgcde acgfd ae bdecga efbcd dea fdgabc feacd gfae | afdcge gaef aefgcd geacfd
beadfg cfdgb fdb agfcbde db abcgfd ecdgf cbagf bafgce bdca | efgcd dcefg cdgfe bd
fagbe fedbcag afbgcd agdfbe age adgcbe ea fead egbcf abgdf | gae cbegf afgdb ea
badfcg fagdc gaf fedcgba dagb acefd dbgcf cgfdbe ag gbecfa | ag bagd bdfgca fbadgc
cfebg gc fcbea dcbafe gbc gcedafb cegdba cagf fbgde baecgf | cg agcf befgc bgc
fegb ecdaf ecb gacefdb eb gdacbf cdegba abgfc afceb acegfb | ebafgcd afdgceb ebc be
adgb cgbae bg abecdg gcefa ecbad dbgfec gbe cbfdega baecfd | badg badg dbag aegbc
ab bfa gbedcaf adbgfe bfecg acefb fgdcae bcad fceda ebafdc | gebdaf edcfag ab ba
ceadbg cd gfdeca ebgfd gdfec dce fegbca ecfag fadc gdeabfc | gfaec gface fdac ecadgf
fbagd egdafb bdg adcefg gbfac daegbcf eadgf bd bfde dgceab | dbfe bd agfde agdef
ebg bgdfe acebdg dcfage abfdge agefd dgbcf eb bdfegac afbe | cdfbg aefb dcagef edfga
bfcd efc bfdcge gbdec bagfe agdceb cf dacgbef bfgec eadgfc | cfe dcbf cgebdf dbecag
cda cefdbg fgeca fdgbeca acgdf bdcgf da deafcb fbgcad bdga | afgbcd cfega gbfcda gdebcf
dcaf cagfb gdacb bgdfca fgaecb ebdag cd fdgcbae dbc bcfegd | cfdegb dc abcgd cbfedag
gabedc dgfab ecdfbg adegf afbc dbagc bacedgf bf fdb fdcbag | cfedgb dgcfab gbfcead dcbga
bcagde efd bgfcd fdecb aefb fe dcfbae gacfebd caebd afecgd | ebcdf afeb ef befa
abfc gcdaef agecdfb cb gacedb cgb gcbdf bdgfac gedfb gcdaf | gfceda bc bdfgaec bdgef
geabc gcebad cgbeaf begdcf gfabe fe bfgda gfe afce ebcfagd | febgac fcea fbcged baecgd
aedfb gbfe acbgde fe fcedgba aef fcadge bacdf fegdab ebdga | fcgdeba afdeb ef fae
gbcfd adfgcb gba dgcbafe agbfde ag cfag fecdbg gbdac edcab | fgcbd bgcad agb bdefga
agfde efgcba gaefc bdcfeg cfe bafc bgcedaf egbac agcedb cf | gebacf ecgafb gfceab cefag
febdc begcd ecgbdf dbacfe bdfagc adgec gbd gb afbdceg gefb | dbg gacbfd egcdfb gfebcd
decfbg dagfb afcgbd gdcfb cbaedf caefgdb da gdca gafeb abd | adbgcef dgafb abd cfbgeda
begcfd bgeaf dcfaeb cadfeg gcdb cadbgfe cg ecfbd cfbge cgf | cg gfc gdcb gcf
ecagdf dfcebg fgbea bg cbeadgf egb ebcafg edfab gbca fegac | bafeg aebfd gcab fbecdag
dgacf abfecg fcgadeb cgd gdbace cgbfa egfda dbfc cdbfga dc | cfbd gabdce dbgcaf egfda
afedcgb afge bfead gf gdfbe fgabed dgcbe dfceab dgf fabgdc | feag cdabef bgdacf gfea
adebgc de bfgacde beafdg egabc egcabf deg cead cbdeg dcgfb | ed eabdgf eadc dbafge
fcdbgae gbacf ebgdfc bcadeg bdgea fagdbe gce aecgb acde ce | cge ecg cabeg efdcgba
aefgcb fedagcb cefbdg ef dcbeg bacdge fegd edbfc fabdc cef | ecbgfd gdef bacdeg bcdeg
geadc gecfad gfcadb eg agdcf bgafce gdef acdbe gea dabegcf | ecfbag gebcaf baecd dfeg
cdeba bd aegcd bfadec ecfab bafd agbfce bfdcge bdc cgebdfa | abcfe agdce db adecg
fbadg faedgc bgdac bcegd bcadge agc gdefcb cbae gdfbace ca | defgcb ceagbd bdgca afedcg
acgfd cbdage agcbd dfa edcfg fa dbcfeag fabc dbaefg gdbcfa | af gedabfc af ebgdfac
dafgbc dfegc dc cgfae cgeafd cdf cagefb ceda bfged fdegcba | aecd cade deac fbged
cbegda dgfeb gefcb aefbgc fdgceb agdfe dgb bd fdbc bdgfaec | dcgbeaf db gfbed efdag
aefbd cdbeagf gd fdgc fgcdab afbcg bdg egfabc bfgad aebgcd | gdfc gadcfeb cfgd fgacb
eb gcbaed aeb fgdecba begd eagdc cadfb eabdc cfgade gacfeb | egdca dcbea bdfcgea be

78
2021/d08/ex2/ex2.py Executable file
View file

@ -0,0 +1,78 @@
#!/usr/bin/env python
import itertools
import sys
from dataclasses import dataclass
from typing import Dict, List, Set
@dataclass
class Entry:
signals: List[Set[str]]
outputs: List[Set[str]]
def solve(input: List[str]) -> int:
def parse_entry(input: str) -> Entry:
signals, outputs = input.split(" | ")
return Entry(
[set(s) for s in signals.split()], [set(o) for o in outputs.split()]
)
def deduce_signals(entry: Entry) -> Dict[int, Set[str]]:
_1, _7, _4, *signals_to_deduce, _8 = sorted(entry.signals, key=len)
signals = {
1: _1,
4: _4,
7: _7,
8: _8,
}
for sig in signals_to_deduce:
match = len(sig), len(sig & _4), len(sig & _1)
if match == (6, 3, 2):
signals[0] = sig
elif match == (5, 2, 1):
signals[2] = sig
elif match == (5, 3, 2):
signals[3] = sig
elif match == (5, 3, 1):
signals[5] = sig
elif match == (6, 3, 1):
signals[6] = sig
elif match == (6, 4, 2):
signals[9] = sig
else:
assert False # Sanity check
assert len(signals) == 10 # Sanity check
return signals
def deduce_entry(entry: Entry) -> int:
decoded_signals = deduce_signals(entry)
res = 0
for output in entry.outputs:
assert output in decoded_signals.values() # Sanity check
for n, signal in decoded_signals.items():
if output != signal:
continue
res = res * 10 + n
return res
entries = [parse_entry(line) for line in input]
return sum(map(deduce_entry, entries))
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

200
2021/d08/ex2/input Normal file
View file

@ -0,0 +1,200 @@
badc bd dbeaf cfdbge dfb cfbdea efbag edcfgab dcafe degfca | eacfd acdfbe cbdegf fcbaedg
cd fdbac egcfab gbadcfe cfgdeb cbadfe deca cdf dfabg abefc | dcf cfbad gbafced fcd
cg agecfb cbg eabgfdc egdc fdgba bafecd cbdfe bfcdeg cfgdb | efdcb adcfeb fbdcg gbc
bfceg gfadb dbcfgea bgaef efad abe bcdgfa ea fbdgea agecbd | eadf ceadbg abfge fecdbga
gdcafe eacb adc gbfda afdceb edgbcf badfc ecgbafd ac fdbce | ebfcd cefdab bdfgeca egbdacf
aefbgd fbdc fbecg egdcb edcbag bf gcefa fbedcg bagfced fbg | afgce cfbd bdcf geafdbc
ebgacd edacg gcdeaf cabfg dbc bd cdbgaef ebad fecgbd acbgd | dgbac db caegbdf gcbfa
defbga gead ge efagcb gdafbc cegbdfa egf bfdce bgdef dgabf | gef eg bfcdag ge
bae adcgfbe cdfeag ab dcgeb bfdage agecb cagfe abcf bfcaeg | bae aeb agfceb afceg
ae adefcb gaceb gadceb edag efadcgb badgc cfgbe cadbfg cea | ceabgd fbeacdg aged aged
aegbdc dbegfac gcbaf df febd egdafc deabg gdf gdfeab adfbg | bcdegaf dfeb bcegad df
aegcdfb becdaf gdecf ag fag dcfgba badg fcbad cdgaf acefgb | abcdf cefdab ga ga
gbcfad cefadg cegad aefdb gedacb gcfe fc cfbgead cfade caf | degac egcf geacfbd afc
bcfad afcdbe fd ecfba cfd afde cfeabg gcbfed dacbg fdgabec | cafbged edfa fcd dabgc
afdc adbfe bgecfad ecagdb dbcafe dfe fd agbfe bdace gdbfec | fadbe efbdgc fadbe edcba
bdface geba ecbdag acegd afcdg ge eadbc bfecgda edg fgbdce | eg abge fadgceb abge
fagbde fcegbd gec efcdg fdgbe ebfcag gc adcfe cgdb cagbdfe | defcg cbgdfea gcbd ecfgd
acfbg debgf gfcdba edcbfa fbdag fgbeca cfbagde gadc da bda | dacg acbgf cedfgab caefdgb
ca dfegca edcbgf gfcde aedbg gfdeacb dcbfea facg dgcea ace | fedcg fdagec cea ac
acdf gcfde debcga ecbgaf cf ebgdf bagfdce cedag cef gedafc | dgcbea fc dcgeaf cdaeg
ebagf cabgfed ed cbgad afcbge afdbge edg eagbd cedgfb aefd | fcgdbe de cgbeaf ed
fbcdeag cafbd fgcbea fdgacb daecfb cg gca defga gbdc fdcga | abfcged agc acfgd cbfaeg
dacfe ed ebdcag gcadfe dfbcaeg dce dfeg fbcadg bfeca acdfg | fcbdga gcbade aegdcf fbcgda
cfdegb cbef fgdec gdfbca gdecbfa egfdca bc gbc cbegd aedgb | befc bc abegd ebcdfga
agcefdb fdbg bf bdafe gdebaf eafdg acdbe gcebaf bef edcfga | bf fdbg efdab gefda
gcb bdcgef dcbfg bg edbg facegb cbedf edgafbc dfgca edacbf | gb cdebfa deagfcb bg
eafbg gfad afegbd caefbg befdgc ebagd gd bdg cfbdage acdeb | gd geafb cabed dbg
bcedfg dc dgc aedfbcg acgbed bgfead gedbf bfdcg cedf facbg | gabfed cdebag dafegb cd
fa adbceg afecd cafdbge eacgfb daegcf aef bcdfe fdga daceg | acedf afe fae afdg
cdfaeg agcfb bcdgea dcafeb cef fabec ef dfgcbae defb eabcd | gdabce fdeb ebdf ecf
cdefg ceafg gebfd cdg dc efbcdg cdgbea cfedbga cbfd fdagbe | fbcd afdgbe fabedg dcfb
cdafgb egdb fecgabd cbfdg fcbedg feb acefg begcf be dacebf | be be ebfdca abgfcd
eafgcd facegb acb cdbfaeg fagec dgcabe baefd cgbf cb afecb | bcafeg fcgb gfdeac eagcf
ecgdfb deb edfgab eb faedcg agfed bfaed dbacf gbae efgdcba | fabde eb ecdgfb eabg
aefbg bdegfa gacdb gefc fbc fc bfdcae gefbac cbfag dbgefac | ecfg fc cfge efgcdab
gcfbed gcbae dcaef cbegad bdag bgeacf adefgcb deg adgec gd | agcbde bgad gdbfec gcfabe
dfacb egbcda dac agdcfb fecab adecfgb bgadf cd fgeabd cgfd | gabfdec acd dc dc
bfecg dcgeab af gadf aedbg caefdbg bgfade bafeg abf eabdcf | ebcfg gafd ebacfd fgbdace
ge fdeab gcebfda fadcg fgead abcdef eag ebdgfa acgbef dgeb | cdagf cfdgbae fdeab eag
dba dgfceb fbcegad bagde bcdeag bcedg bdafce agfbe ad cgad | bdcafe agdc ebdcg cdga
edfg fedac fbegcad acgfe fabcd ead bgefac de daecgf bcaged | bafcd ade bacefg fdbac
gdecbf edabc ef fcgead fcadg bdcfga fec ceadf dgaefbc agfe | faedgc ef gabfcd fe
deafg eb egbaf cadegf fcdeab degb bcgaf bfe bfcdega gefdba | abgfe eb gfdaeb efdcga
fabcd beadf efabgc fc cafdgb gcfd adfcgeb abgdce cfb dgcba | dcgf bdcgaef gdcf cfdg
ebac acedf ceadfb cfe dbcgaf ec efcgdab degaf abfcd edgbcf | ce edgaf dgbceaf fce
ecbag fg gacdfe edafgcb cgefa eacdfb deafc bdagcf gcf dgef | fged gedf cefdga cabge
dgebc bcg cg gdeabf cgfeba gdfc gefbdc adbec bdefg fgcdbae | begdf cfgd eadbc gbfde
aefdb ecgb dgaeb agdbce ega fgdacb bcadg cbdeafg ge edacfg | age fcbdaeg gea bcfegda
cdeabg fcgda bdagc acfb dfa af cdeabfg efdgab fbcgda decgf | bcagd cfba gedfc af
ceadb caebgfd bdfaeg cbgaf ge ega gadcbf gfce ebgcfa gebca | aecdb febgcad bgcaf fadcgbe
daegb gfdae ceagfd bgfade feagcb fbgd bg cbagdfe ebdac ebg | gefbacd dbgf geb adgbfe
ecadfg acdfb aefgc ecbfdag dce cfbega fcdae edga gbecdf ed | fcdba ced egfcba dega
defgbc cgdea efag fdbcgae acbdf gcdaeb fe dfcega efc defca | fage fec dcafeg ecagfdb
bg dbcafg gdafecb dgfcae defcg gebd cefgb bgfecd fbaec fbg | gbf dfgec bedg cfdgae
ebgda ebd adce cdgaeb edfcgb bcagd agdcebf ed agbef gcbfda | efagb gbefa dbcfgae eadc
ebcfdg dbe de cdabgf fgdab dgae aecbf abfgced edbaf eagdfb | bface cdafebg gadcefb fedab
agc dabcge agbcd cabe dbagf cfgeadb gecafd gbcdfe ac gbced | cbegd beac dgbce ac
fdagb bdeacf fga eagd gcfdb gecafb ga feabd abfgde dcbfega | bdafe abgcfe gbecfad abdgefc
fbecd dbaef bdgc debafgc daecgf ebfcgd ebc abegfc bc gfced | fadecbg cb cdgeaf bfade
fagbe aebfgcd gef bgadf cbagfd deafbg cfdeag ge begd beafc | bcfadeg edbgaf fcgaed ge
gabfc gabde fbdga bfegca agfbcd df cdfagbe dcfg caefbd dbf | decfagb bdf gfcd fd
bdafeg gf gbadf gefb cgefda daecbfg bacfed cdagb fdg fdaeb | daegcf eagdfb adgcb bagfed
dafegb efdac bda fgedbac egfcdb bgfa fbaed bgdef debagc ba | ba bgcead bad ab
cfged cbegdf cb ecgdb adefbcg fdcabg cdb cdagef efbc gedab | bc gdebcf gecdb bagdcf
fbegcd gcedba eba acegf dbfa efbgd ebfadg ab fgceadb bgfea | fgbae gbedcf degfb agdebc
ceadf fdacbe ef edgafb dfe bgaedc cadfg bcef cfebgad ecabd | cafde fabedc debac eacfd
cd dgafe cbgfae decfg cfebg cfd gdbc febgdc fbegacd fceadb | dc beagfc aebcfg gcfeabd
adcefbg caefgb bafd dface bdcfe cegbd fbe gdfcae dceabf fb | efb ebcgd gbdcaef fb
fbdg gebac degbfc gd dfeagbc decfb gcd dafgce faecbd bdgec | gfdcae gfdb dg afgdce
fb fgedca fbe gfcde gcbfde dbceaf bgeca eafbdcg dgfb fbegc | fbe cbdegf bfe gedfc
acfbe fcbaged bgdcf cabgfd ag cagd fcbga bcfegd gfa eadbfg | afgcb gbdecf efdbcg fag
fbegc dgca dfc fagbedc bfadcg dc ebdfca fadbg cgbfd gfdbae | dabefg egdbaf gaebdf dc
cdbgf bdfaeg ca fgcab dgacfbe feac facgbe ebgcad bca gfbea | dafbeg cab cdagbe debfga
gfbe ebcfag bcedaf be egfac fegdca gebca eab cbgad gfacdbe | dabcgef bcagfed gcfea bea
bdefacg fbgedc efdagb beg geabf eg dafbce dage gfabc eabdf | gead gcafb ecfdab egfbdac
gd gfecbd dacefb dgbf cdegf acfge agbfced becdf aedbgc gdc | gdcef cgbead gd gefacbd
cgbfea cafed dbgefac gacb bc afbge fdabge efbac bcfgde cbe | gbac fcdbge agcb aecgdfb
abgefc cfeba gcdba fgdcea gf fcbgaed eadfcb gbfe fga bacgf | efcba fabecd dgcbfae eagcfd
gcdbfe fdec gcfdb bdfeg de efgba cbgdafe afgcbd cgdbea ged | cedgbf fced agfcdeb cgfbed
dbacfge cafdb gbcfea aegc afbec ea bae bgcedf befgc edgafb | dfgeabc bfgcde faceb fbecag
bfcgad bfegd fg dcgeb egaf bfedcag efabdc dfegba gfb abefd | gf abdgcf dcbfag fgb
degab dgebac bfdeacg cadeb fbdeac bag debgf cgda abgecf ga | dceba fdbeg edbac dbacfge
abdef gcbead bgce cgdab deg dgcbfa aedbg fbacdge eadcfg ge | cgfdba gcafde agfcedb fdacbge
defabg cabdg gcfed cabe gbeacd fgadbc eb geb aedcfgb bdgce | eb dbegc dfecg dbecag
egdabcf edcgb bcedgf cgb bgfe fcgabd bg acgfed cbaed dfegc | cgb gbc egcfad degbc
fe agebdc gfbead fcdea abecgfd bafcde beacd cbef def cgfad | dabgfe fde adfcg bfgead
ba fcabed bad dgacf dfgecab dcgba gdecb bdgcfa abgf caegfd | gdecb dgcfba gcdafe afbedgc
bdgef cdbgfa acbed gedcfb efdgba cg abcgedf cgb cgdbe cfeg | edabc ebdca edbcg ecgf
edfba bcfgead cbged defbcg ag gfadce gcaebd edabg cabg dga | fedagc bcag bdegc gaebfdc
edab fed egcfb ecgbfad fegbd fagdcb degcaf afgebd gabdf ed | def gdefb fgedb edcagf
fc ebfgda ebcfd cabed gcadbf baecfdg cgfe fdc egdfb gdecbf | defbg aecbfdg cadbegf adgfbe
bgdfc fgc fdegb dgecfb fcabd egbafdc gc dgce gabefc gedbfa | fbdgce gc dbfegca cg
bgedc ged gdfcea dcefb cdabg bgfe defbgc bdecaf dcgbfae ge | badefc gbfe cbegd fdagbce
cdefga cgdafeb cbe becdg gdefc cfbg cfdbeg cb febdac edgba | edbgcf abecfd ebgfcd fgbc
de aegcf agedcb afegbdc edbf fbdga facgdb gdaef dbaegf dea | cdabgf ead afgbcd edbf
cfagde eagfbc cbegf cg fcaegdb ebgfd gcf dafebc efabc acbg | bacfe fgc gcf cg
gadfce fbcaeg bdag eba bedcgfa dcfbe ab ebdgca ceagd ecabd | eabdc badec cdaeg dagb
aedb ebcagf fdeac be bdgfc eafbdc abcfegd aefgcd feb ecdfb | fecbd adeb be bfe
dg fgdecb dfecb fdcgeba gedcb gceab fdge cgd cgdbfa baedcf | ecbgd cagfdeb dcbfeg gd
fgcead bfdcag gecdf dfeacb dce aged gcbfe dcfgeab ed fgcda | cfegd de gcafd gefdc
dbec eafbdg dafegc eac gbacf decagb bcgae bdgea gbcefad ce | becag edgab cbadgfe edbc
gefcab agbdc febd bcegd de ecbfg afgdce ebafgdc dfebgc egd | de gdecfba edbf cdegb
abdcefg fbdega dcfag bd fegba badgec fgadb edbf fgaceb bdg | acdfg fagbce adcfg abgfd
ag agdb bfeag fbgdace bcfeda dgafeb egafdc begfc dfeba eag | ecbfg agbd dabg bfeacd
dagc dae fdaec edcafg fbadeg cgefa abcgef ad dfecb fdgcbae | eda eagcbf agfec debfc
ead beafd dfagb faceb bfedca facegd aefcbg cbed ed gfcbaed | abgdf eda agbfce ead
afdgb eabcgf dfgbe fecdgba dagceb gfa cafgdb af cdfa abdcg | abdfg dceagb decfagb fagcedb
dbcfga cb acb gcbafde fcbg egbfda dceaf gbfda dcfba cdbgae | fcadgb cdefgba agbfd cgfb
gceb fcgba cefdba caebfdg egfadb eagfcb cb beafg acb gfacd | abcedf bca gfcda bcge
eabdc caebf ad dgabcef fcaedg cfegba deacbf dabf dca begdc | dbgce dbfa fgebadc acedb
fbgce ec gcea dafcgeb fgbed fec adgbcf abcfeg fcbga cfbade | cbdfag ebgfc fgcbe agbfdc
afcg afebcg becgf fgadeb bdgaefc fa afe acedb abecf gdfebc | fgecb eacdfgb ceabf cgfa
fb gadeb aegdfb abgfe fab dfgb adfecbg bcaegd ebdafc cafeg | becdfga bf fbadec bgfd
ab dgafe fdaeb adb agcedf ecbfd agfb caedgb bdfage egfabdc | fedbc dfecag afdcge becfd
bgedf dgecfb fae gbaec fa cedafg dcabfge gedfab gafbe fbda | fcgdea geadcfb efbdg fa
cgfaed fdebg fcgabd fcegb bd dfaeg gfbeda fgdceba edba dgb | db ebcgf fgcbe edgfa
fgc egcafb dcgb fagdb bedafgc cdbgaf fedac cg gacfd dfbage | febgad cgfaeb fadbg gc
fdaebcg deabgc bfdeg dfcaeg efcgd cdaf cfbeag fcg cf cgeda | bgefcad bgdfe dafc ebagfc
egcfad dbecf cbgf fbe aecbd bcfdge dfbgea aebgdcf ecfdg fb | cgfb gecfd gefacdb fbcg
cdb adcf gbcdae bdceaf dfaeb cdfeb febgc fgedba cd cgdafeb | eadfb fcgeb cbedga bdacge
gd dacg gbdafc gfbdc bdegaf fbgca cbgdefa cbafge edfcb dfg | gbcafd dgac dgcafb cbfgae
cbf dafeb fbceag bc egbdfc edbgafc fbced ecdfg cdgb gdafec | bcf dbfea ebagcf gadfcbe
dcebgf eagfc aebfcd edcbg baefgdc fd cdefg dgaebc fde bfgd | ebagfcd acgefdb fagec gbdaec
afgdc bagec bdfg fb ecgdbfa fab dfecga bcgadf dcafbe bgafc | afgced fb dcafg feabcd
gef febag ebagc egcfbd fg cafg abfde abcfge afcgebd ebcgda | egf gaebf dfeba gadbce
ag cdeafg gdbfce daceb acgf efgbda adg cegda gaedbfc efcgd | debac eadbc bgaecdf cgbaedf
acefdbg debgac ecdgf ead facebg eafgb ad fedbga bfda eafgd | adbf eagfd eabcfgd ecagfb
cd bafegc fgcaed fcaeg dgc fdcag agdbf fedc gbadce egdabcf | fedbcga bgafd fcde cfed
decg egf ecgbfa degfa edbagfc dgcabf cdfag eg fcaedg faebd | gcadef efadg egf eg
feacbg cgfadbe efb efbga dfagb eb aefgc bgec cgedaf dcebfa | eb be be fbe
begc eacfdb dfacg agcfe ce eagbf eac eafdgb aefbcg dfgaecb | ce ce ce gbce
dfeagb dgaeb dbagefc gbcfae degf decba cbgdfa bgfda eg gae | ge agfdcbe bdace fdeg
cgdab cegdbf cfbad bg aegb caedfg eacgbfd dgb dgaec gdbaec | gbea eacgd gb cgaebd
ag ecdgbaf edcba eagcd aeg gcfa dfcgae egcdf gfdeba fcgbde | fgeadb dacge fdagceb egafbd
fdbgec bge fdacbe bfdga edfgb cbgaed gefc cefdb ge baegdfc | ebfgd gbe begdf eg
cedafb gdab fgced cabdf fgbaecd dcbgf gb bgc gabfdc ebfgca | bcadgf cbfda cdgfab agdb
fdcbg bgface ecdabf ad fgcbaed gcefad dac efgac cfagd daeg | dcfabge edga ad gcfea
bce gaecdb aefc bedfgca acbfge aebgf fbceg defgba dgfcb ce | ceaf ce bfgce ce
gefadc gefadb agd ebfcdag dbeg dfagb abfed gafcb dg adbcef | fbgad bged gd cfebda
dcfge egdbf adcgf bafecgd ecd gdfeac bdecaf ec cfgdab cage | acge dacgf facdg cgea
bagdec gecdfba gdabe deb eabc be acdgfe afgdb deagc gdecfb | aebgd cgdea adbge eabc
gebca bedgaf ac gcbeaf bcagedf bafge egcfda bedgc cabf cea | ecbdg efcgab ebagc bgadfec
edacbg gcfad efdabg bc cgfdbae bdc cfedab efbc beadf fadbc | dbc fcbe fbedacg cabfd
adfgce acgfb bgfadc dgbca fc gfc fgacdbe fagbe bcdf ebagcd | cbagdfe gfc fgbac cgbaed
gdbfec bea acdb ba bcged edabgc gcfaebd afebcg gedba gdeaf | ba fgcebd efgda gadfecb
gd gcda bgd gafbcde bdcfag bcgdf cedfb bgefda eacfbg cfbga | fgcab fdgcba bgacf bfedga
fgcadeb abdgc gce bagec fcbea ge aebcgd gead cedfgb bagdfc | gbdace baefc fdcagb cdgab
fbca aedfcg eagcbd fadbec bdgef fec cf bgcfade dbcef cbade | fgedb bgefadc fc cf
dbgfa feca gfbced cf abfgce fcb cafbg eabgc acdbge edafcbg | abgdf dbcgef geabfc fcb
dbaf fag bdfgea ecbgfa dgbfe fa edacg agcfdbe cefdbg fdgea | fgbaed cdegbf dacfbge gdcfbe
abc acefbd gacedbf gbcde dgabf ca fgcedb cega dgbca cgeadb | ca bcged abgfd bca
ceabgd cgfeb ea aedf gcbdfa cadbf acdfeb abfec eac dgcefba | cgdbafe cea adfe aec
dbcfgae agebc ebgd cebdfa ebacdg deagc be fdecga gbacf bce | deagcb agecdf caefdg cegad
dcaeg gea gdaf befgac cefgd facbdeg dcgbfe ga dagfec adecb | gadf gaedc age cabedgf
bead dagfbe gda bagfec ad egfba ecgfad fdcgb ecfabdg dfgab | agefdc dga bgfea dafcgbe
abcgd gecbfda cegd badfge bcaed fcaeb ed adcgfb gcabed edb | acefb acbgde deb ed
cgefdab dgbcfe gbe beca be fdecga bgcafe bfgda abgfe fgace | bfgda eb gbe bdgaf
age cefbadg bcfea cdagbe begca ag gedfca cbfdeg ebcgd dbga | efbac ega fecab dgba
cgedf fc defbgc cdf fceb dgebf bafgdce eadbgf ecgad gcfadb | cf deabgfc efgdbc fgbcda
bdgeacf bagdef gb becg bcfage cafbg bga fdbac caefdg eafcg | bcedafg cbeg bg gb
dfceb gcdab ecbad gfbdea eab gcbeda bgcdeaf ea abfgdc cgea | baedc egca dgacbe cedfb
gdaeb dgfbc cefg fe cfbgaed gdfeb fadcbg defgcb abcdfe dfe | gdcfba eagdb fe cfeg
abfcedg afgcde acgfd ae bdecga efbcd dea fdgabc feacd gfae | afdcge gaef aefgcd geacfd
beadfg cfdgb fdb agfcbde db abcgfd ecdgf cbagf bafgce bdca | efgcd dcefg cdgfe bd
fagbe fedbcag afbgcd agdfbe age adgcbe ea fead egbcf abgdf | gae cbegf afgdb ea
badfcg fagdc gaf fedcgba dagb acefd dbgcf cgfdbe ag gbecfa | ag bagd bdfgca fbadgc
cfebg gc fcbea dcbafe gbc gcedafb cegdba cagf fbgde baecgf | cg agcf befgc bgc
fegb ecdaf ecb gacefdb eb gdacbf cdegba abgfc afceb acegfb | ebafgcd afdgceb ebc be
adgb cgbae bg abecdg gcefa ecbad dbgfec gbe cbfdega baecfd | badg badg dbag aegbc
ab bfa gbedcaf adbgfe bfecg acefb fgdcae bcad fceda ebafdc | gebdaf edcfag ab ba
ceadbg cd gfdeca ebgfd gdfec dce fegbca ecfag fadc gdeabfc | gfaec gface fdac ecadgf
fbagd egdafb bdg adcefg gbfac daegbcf eadgf bd bfde dgceab | dbfe bd agfde agdef
ebg bgdfe acebdg dcfage abfdge agefd dgbcf eb bdfegac afbe | cdfbg aefb dcagef edfga
bfcd efc bfdcge gbdec bagfe agdceb cf dacgbef bfgec eadgfc | cfe dcbf cgebdf dbecag
cda cefdbg fgeca fdgbeca acgdf bdcgf da deafcb fbgcad bdga | afgbcd cfega gbfcda gdebcf
dcaf cagfb gdacb bgdfca fgaecb ebdag cd fdgcbae dbc bcfegd | cfdegb dc abcgd cbfedag
gabedc dgfab ecdfbg adegf afbc dbagc bacedgf bf fdb fdcbag | cfedgb dgcfab gbfcead dcbga
bcagde efd bgfcd fdecb aefb fe dcfbae gacfebd caebd afecgd | ebcdf afeb ef befa
abfc gcdaef agecdfb cb gacedb cgb gcbdf bdgfac gedfb gcdaf | gfceda bc bdfgaec bdgef
geabc gcebad cgbeaf begdcf gfabe fe bfgda gfe afce ebcfagd | febgac fcea fbcged baecgd
aedfb gbfe acbgde fe fcedgba aef fcadge bacdf fegdab ebdga | fcgdeba afdeb ef fae
gbcfd adfgcb gba dgcbafe agbfde ag cfag fecdbg gbdac edcab | fgcbd bgcad agb bdefga
agfde efgcba gaefc bdcfeg cfe bafc bgcedaf egbac agcedb cf | gebacf ecgafb gfceab cefag
febdc begcd ecgbdf dbacfe bdfagc adgec gbd gb afbdceg gefb | dbg gacbfd egcdfb gfebcd
decfbg dagfb afcgbd gdcfb cbaedf caefgdb da gdca gafeb abd | adbgcef dgafb abd cfbgeda
begcfd bgeaf dcfaeb cadfeg gcdb cadbgfe cg ecfbd cfbge cgf | cg gfc gdcb gcf
ecagdf dfcebg fgbea bg cbeadgf egb ebcafg edfab gbca fegac | bafeg aebfd gcab fbecdag
dgacf abfecg fcgadeb cgd gdbace cgbfa egfda dbfc cdbfga dc | cfbd gabdce dbgcaf egfda
afedcgb afge bfead gf gdfbe fgabed dgcbe dfceab dgf fabgdc | feag cdabef bgdacf gfea
adebgc de bfgacde beafdg egabc egcabf deg cead cbdeg dcgfb | ed eabdgf eadc dbafge
fcdbgae gbacf ebgdfc bcadeg bdgea fagdbe gce aecgb acde ce | cge ecg cabeg efdcgba
aefgcb fedagcb cefbdg ef dcbeg bacdge fegd edbfc fabdc cef | ecbgfd gdef bacdeg bcdeg
geadc gecfad gfcadb eg agdcf bgafce gdef acdbe gea dabegcf | ecfbag gebcaf baecd dfeg
cdeba bd aegcd bfadec ecfab bafd agbfce bfdcge bdc cgebdfa | abcfe agdce db adecg
fbadg faedgc bgdac bcegd bcadge agc gdefcb cbae gdfbace ca | defgcb ceagbd bdgca afedcg
acgfd cbdage agcbd dfa edcfg fa dbcfeag fabc dbaefg gdbcfa | af gedabfc af ebgdfac
dafgbc dfegc dc cgfae cgeafd cdf cagefb ceda bfged fdegcba | aecd cade deac fbged
cbegda dgfeb gefcb aefbgc fdgceb agdfe dgb bd fdbc bdgfaec | dcgbeaf db gfbed efdag
aefbd cdbeagf gd fdgc fgcdab afbcg bdg egfabc bfgad aebgcd | gdfc gadcfeb cfgd fgacb
eb gcbaed aeb fgdecba begd eagdc cadfb eabdc cfgade gacfeb | egdca dcbea bdfcgea be

42
2021/d09/ex1/ex1.py Executable file
View file

@ -0,0 +1,42 @@
#!/usr/bin/env python
import itertools
import sys
from typing import Iterator, List, Tuple
HeightMap = List[List[int]]
Point = Tuple[int, int]
def solve(input: List[str]) -> int:
height_map = [[int(c) for c in line] for line in input]
def neighbours_of(point: Point) -> Iterator[Point]:
for dx, dy in (-1, 0), (1, 0), (0, -1), (0, 1):
x, y = point[0] + dx, point[1] + dy
if x < 0 or x >= len(height_map):
continue
if y < 0 or y >= len(height_map[0]):
continue
yield x, y
def is_low_point(point: Point) -> bool:
for neighbour in neighbours_of(point):
if height_map[neighbour[0]][neighbour[1]] <= height_map[point[0]][point[1]]:
return False
return True
def risk_level(point: Point) -> int:
return 1 + height_map[point[0]][point[1]]
points = [(x, y) for x in range(len(height_map)) for y in range(len(height_map[0]))]
return sum(risk_level(p) for p in points if is_low_point(p))
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

100
2021/d09/ex1/input Normal file
View file

@ -0,0 +1,100 @@
9876543298765698956789545678992103976545976323678910997879876432123679765323567894679434987654596521
7998789129854987545697658789789212985439765454567899876568976569012489874212779943598929976653987432
6429898934943496434589769894658924976929898765679969965345698798923456976433567892456998765432196543
5210987899874987645678979943547895989899989898789357893234599987894678986547678901349899896563987656
4329896798765797657889989652126789998798967999899969954345989876789989797698789316498766987854598787
5498755679876798968997699643015678987676759899999898965959878965878997649899899997987654298976689898
7987834656997899878976578932123789998545745799998787899898767854567998798965969898999743109987789999
9896321345698998989965489543456999867623234567897676789789854343456799987654358799298654312398898989
8765430234999987697896789654567899954310123456998545785678963212567898992101245690129796453479987978
7654321345899986576997999876778978965421236567895431234789654345678957895212767789298987894567896669
9785532456799765434989643987989569877654345878976544345698765456789548954329878999987798979878975456
9876743767987654323679932198995476988765456989987655466899896787891239765434989989865679654989764367
0999899878998743212567893999674365699986567898998767877894949898962678986676799878654589943499876458
1989998989987654501457899876543234799897679987859878988943234999853467897897899867723457892398976567
9879867991099865212345789989656125789649899876545989999654345998765679998998987654012349910987987989
8768756689987654323456897298743239891234989765534597898798759879876789569989998632134598929876599096
8653344578999865784587976349994345910199878964523456789929898764987893498977987545245987999965432145
6542123469764986895678965499879966899989867893212345698939987653498902987856798767959876989996543234
7752056778953497898789878987769899998767656989101234567898765432459919876545689878998785678989654546
9854145789101298989899989876545768989654545679914348978997654321347898765434799989679654545678965687
7543236993212349878998998765432459876543234567895567889459865432456987654323988995498763234589896789
7654747894523498767897999654321345998769102678976988992398999545767899765499867894309982123456789999
8765678965654976654456899865210236799898993589987899101987978996988979876987658989219873256798999989
9876789998799865432345678994321346789987889998698978919876456789699767997996545678934965345789789778
4987899989891974321234789986545456899876777897569567898765347897432356989987439789549876956797674567
3298978978910985445445891297669767998785656789423456789653298976545469879876598999656989897896523456
3129469568899876656566990998798978989654345893214567898764989897656798767987987988978998679999314567
2012395436789987767678989899987899876543212379201879969889978789987987656799876877899976567898901238
2193989325679898978989579768976789965432101268912989456998965678999896547898765656999875456567895449
3989878934589769989793498959895689876743412347894592347987854567898786434569654547989765345478989567
9978968895699654997652987645784789987954523456789693469876432457897654321298763239876543217345678978
8867846789898969876543498732123678998766634787899989978994321367999865432598654567987982101234589989
7654437999987899989754989643034567899898745678998767899989993479899987543498765678999878212345678997
6542323899876789598769876542137878987999859899987656798767789598789897655679986799698765433456789876
4321016789765679349989987756756789876789878910199545987656698997655789796789997894549977567567898765
5633225899954598956799899867897897765689989429298769876845457986543456989899898943534988978678979987
8764334567893487897898789998998976454568997998999998765432356978532349878956769892123499989789459998
9875765789932346798997634569989432323467996987999989887845779865431234669545458789012943299892398989
5987876894321457989989429979874321012399875676889876998956889978560123458932345699129892109901987878
4598987899430349979678998899965456133987764545778965698768995989999294567890458798998789298319876567
3219399978921298767587897679876967845976543234667894539878954399878989698921239997987699987423965456
4301234567932987656456796567989878956965432133456793124989876498767878999432549876796589876539874347
5412345789743597542345895434593989869874321012349891013999999987654567898643498765987678987698765458
6523656897654987656556789323901299998765442123457999229878987896543456998789569979998789498789876769
5439787898765698787667893219892398999879543434568978998767986797855669999897689989879899349999987899
7656898919896789899878954398789987999989698545679567893457895498966798986998789394567988998789898989
8967999323987897976989765987679876889998787686893467892124789349997997895429893233459867999698769678
9698999934598956795499899876598765778999998797912349951015689123989876796210932012399756896569954599
6549387895999987989323902965439874355698789898909498932123478939876765989929993243987646789459893989
6321236789898999878919999876323943234987676989898987993234567899965434567898989349998789894398789878
5433345998797898767897889987213495349876565677797656789446889999876515698987678998999899965987698767
6985469899545989654665678999901989498765434545698768998658992398965106789976567987898999987976569656
7876798795439876543234889569899878999876323434569979569769321987654345678989456976447688999895498767
8987987654321989754015679499798767898983210128789989498999210398765656789654319895323567998789349878
9098999876510199863126789987652358997654321247899796987578931239976768899965498789212348987679257989
2129998995431239765257891099543768998765432656789545995467892946988979987896796568901236896578998996
3679976789542398954348999198959879999876558767893239876567899897899989896997987699322345985456789125
4599865679954987895459998987899989987998769879992123987678976789976799765989698789533959876348993234
5989234567899876799567897956789890196549878989789544998989765678965698943476569897659896987257899345
9976123456798765678989986844456789987698989395678959899895454567894567892565456998998765432125678976
8765277567987654569998765432349999898987693234569998789654323456923478921012345679539854321034567897
7654356679599987678999654321267898789965432145698987678943210147898569543235789794323969834245688998
8765467989459899789998874210158999679876541016987894599964521234997679659347898989019879765766899899
9876579894398789899987654332345696567987662929876793488895435349898989798959987879123989989877899787
3987698789298678967998965453456789349898799899985932376789655456789599987899976768934599999999989656
2498987679976543459019879867899892198789987789984321245698767567893498876789895457995678999878767938
1349876567895432398999989988957989987679876698765540356789878678932987545456789346889789998767656899
0198765456789321256789099899545678976598765549854321456899989799891095432347993275678992987654545789
1987674345699592345679129654334688965499994321965545567998999896789194321236892164568921298543237898
9876543234598989456989298743212567894389986539876667679567954965678987210235791013569432987654568956
5987621023987679867895497652101345789579876547988798789678942134567976521256789123456943498765678945
4997732654976598978996598764212345678989989656799899899989653655679876432345898235597894569876789534
9876543459865467899987987654325766789799999789899965957899879769989997543456797546678965778989899325
4988654598764348998998999766434589994598999898998654345678998998799987676567897667799796989999998934
3298797679974245697999429887847893212987898987987434234789897567688999789878998778945689998999987896
2129898989765134976878999998956789109876987656896510123498765434567899899989469899434567897898756789
3298959398754299865757889979767899912985436445689323234569854323776789998794357986523479956989434599
4987643239965987654345679869878999894976721336578935446798765612845899987654219875612396549876526989
9876543129876799765234889754999998789987530123489976557999976701234599998764329874323489932987789878
1995432035987999832123598932101989699998432236599987698999964312345678989876598765435567893499898767
3989654124599898641034567893219876568999543445679998899989899423456989879987699897576789965689989656
9878965435698765432155678965898765432987657656789999999875678954567999765698989998798999986789878543
8767896776789986749878789896799987621298767767899899989654579765678989854799878999939998997898765432
5456789987899987856989896789986798532349898898965778976543459879889875423999967894321987898969987643
2345678999998998767998945999965987643656929969434569198754678992994989567898656976439876749456898765
1234589923457899879987899889894398784789019654323691019867899921012398978997645897899985432345679876
2365699894578923989875987676789249895899998766513589129878987892124987899876536789999876521236789987
5456789689989012399954298545892134976999899895405678934989656789439876987654324679998787210123996798
7687893578899234569895987699976549899999789984312389545694545696598765699765312567899654323245695459
9798932345688965998769898987898799768987698765423578999943234789987674198653202469998765534367789568
9899321234567899899654679876789988657899579877567678987890125679876583019765313578929878946978897679
3976532345678945798753498765698976545986467988678789876789236798989432123984323489212989897889998989
2987645456789659987654579874987654324985358999799899765698945987998943439876534794343598789999999990
1298756569898798798765989989876543219876469999899988954567899876587894646987645679654987678999889891
2349869698999997659877996593987655424976567895999876543456998765456789656798789789769887567998768789
3567998987898989541988987432998966565987678934598765432567899854345699787899899899898765456789657679
7678987676487678932399998949899879677898989323459876554678998743234678998976989944999854346996545568
9899878554345568943567899898799998788969793212589988965689987664145699999765678932499710157895433477
1998765443123459956789998765678969899654579323679999878799876543234589987654567943987621238997312556
0197654321012367897991019834789456998765678954568954989899987654545678998765678954598534567898101245

61
2021/d09/ex2/ex2.py Executable file
View file

@ -0,0 +1,61 @@
#!/usr/bin/env python
import itertools
import sys
from typing import Iterator, List, Tuple
HeightMap = List[List[int]]
Point = Tuple[int, int]
def solve(input: List[str]) -> int:
height_map = [[int(c) for c in line] for line in input]
def neighbours_of(point: Point) -> Iterator[Point]:
for dx, dy in (-1, 0), (1, 0), (0, -1), (0, 1):
x, y = point[0] + dx, point[1] + dy
if x < 0 or x >= len(height_map):
continue
if y < 0 or y >= len(height_map[0]):
continue
yield x, y
def is_low_point(point: Point) -> bool:
for neighbour in neighbours_of(point):
if height_map[neighbour[0]][neighbour[1]] <= height_map[point[0]][point[1]]:
return False
return True
def explore_bassin(point: Point) -> int:
to_be_seen = set(neighbours_of(point))
explored = {point}
bassin = {point}
while len(to_be_seen) > 0:
new = to_be_seen.pop()
explored.add(new)
if height_map[new[0]][new[1]] == 9:
continue
bassin.add(new)
for neighbour in neighbours_of(new):
if neighbour in explored:
continue
to_be_seen.add(neighbour)
return len(bassin)
points = [(x, y) for x in range(len(height_map)) for y in range(len(height_map[0]))]
low_points = filter(is_low_point, points)
bassin_sizes = sorted(map(explore_bassin, low_points), reverse=True)
return bassin_sizes[0] * bassin_sizes[1] * bassin_sizes[2]
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

100
2021/d09/ex2/input Normal file
View file

@ -0,0 +1,100 @@
9876543298765698956789545678992103976545976323678910997879876432123679765323567894679434987654596521
7998789129854987545697658789789212985439765454567899876568976569012489874212779943598929976653987432
6429898934943496434589769894658924976929898765679969965345698798923456976433567892456998765432196543
5210987899874987645678979943547895989899989898789357893234599987894678986547678901349899896563987656
4329896798765797657889989652126789998798967999899969954345989876789989797698789316498766987854598787
5498755679876798968997699643015678987676759899999898965959878965878997649899899997987654298976689898
7987834656997899878976578932123789998545745799998787899898767854567998798965969898999743109987789999
9896321345698998989965489543456999867623234567897676789789854343456799987654358799298654312398898989
8765430234999987697896789654567899954310123456998545785678963212567898992101245690129796453479987978
7654321345899986576997999876778978965421236567895431234789654345678957895212767789298987894567896669
9785532456799765434989643987989569877654345878976544345698765456789548954329878999987798979878975456
9876743767987654323679932198995476988765456989987655466899896787891239765434989989865679654989764367
0999899878998743212567893999674365699986567898998767877894949898962678986676799878654589943499876458
1989998989987654501457899876543234799897679987859878988943234999853467897897899867723457892398976567
9879867991099865212345789989656125789649899876545989999654345998765679998998987654012349910987987989
8768756689987654323456897298743239891234989765534597898798759879876789569989998632134598929876599096
8653344578999865784587976349994345910199878964523456789929898764987893498977987545245987999965432145
6542123469764986895678965499879966899989867893212345698939987653498902987856798767959876989996543234
7752056778953497898789878987769899998767656989101234567898765432459919876545689878998785678989654546
9854145789101298989899989876545768989654545679914348978997654321347898765434799989679654545678965687
7543236993212349878998998765432459876543234567895567889459865432456987654323988995498763234589896789
7654747894523498767897999654321345998769102678976988992398999545767899765499867894309982123456789999
8765678965654976654456899865210236799898993589987899101987978996988979876987658989219873256798999989
9876789998799865432345678994321346789987889998698978919876456789699767997996545678934965345789789778
4987899989891974321234789986545456899876777897569567898765347897432356989987439789549876956797674567
3298978978910985445445891297669767998785656789423456789653298976545469879876598999656989897896523456
3129469568899876656566990998798978989654345893214567898764989897656798767987987988978998679999314567
2012395436789987767678989899987899876543212379201879969889978789987987656799876877899976567898901238
2193989325679898978989579768976789965432101268912989456998965678999896547898765656999875456567895449
3989878934589769989793498959895689876743412347894592347987854567898786434569654547989765345478989567
9978968895699654997652987645784789987954523456789693469876432457897654321298763239876543217345678978
8867846789898969876543498732123678998766634787899989978994321367999865432598654567987982101234589989
7654437999987899989754989643034567899898745678998767899989993479899987543498765678999878212345678997
6542323899876789598769876542137878987999859899987656798767789598789897655679986799698765433456789876
4321016789765679349989987756756789876789878910199545987656698997655789796789997894549977567567898765
5633225899954598956799899867897897765689989429298769876845457986543456989899898943534988978678979987
8764334567893487897898789998998976454568997998999998765432356978532349878956769892123499989789459998
9875765789932346798997634569989432323467996987999989887845779865431234669545458789012943299892398989
5987876894321457989989429979874321012399875676889876998956889978560123458932345699129892109901987878
4598987899430349979678998899965456133987764545778965698768995989999294567890458798998789298319876567
3219399978921298767587897679876967845976543234667894539878954399878989698921239997987699987423965456
4301234567932987656456796567989878956965432133456793124989876498767878999432549876796589876539874347
5412345789743597542345895434593989869874321012349891013999999987654567898643498765987678987698765458
6523656897654987656556789323901299998765442123457999229878987896543456998789569979998789498789876769
5439787898765698787667893219892398999879543434568978998767986797855669999897689989879899349999987899
7656898919896789899878954398789987999989698545679567893457895498966798986998789394567988998789898989
8967999323987897976989765987679876889998787686893467892124789349997997895429893233459867999698769678
9698999934598956795499899876598765778999998797912349951015689123989876796210932012399756896569954599
6549387895999987989323902965439874355698789898909498932123478939876765989929993243987646789459893989
6321236789898999878919999876323943234987676989898987993234567899965434567898989349998789894398789878
5433345998797898767897889987213495349876565677797656789446889999876515698987678998999899965987698767
6985469899545989654665678999901989498765434545698768998658992398965106789976567987898999987976569656
7876798795439876543234889569899878999876323434569979569769321987654345678989456976447688999895498767
8987987654321989754015679499798767898983210128789989498999210398765656789654319895323567998789349878
9098999876510199863126789987652358997654321247899796987578931239976768899965498789212348987679257989
2129998995431239765257891099543768998765432656789545995467892946988979987896796568901236896578998996
3679976789542398954348999198959879999876558767893239876567899897899989896997987699322345985456789125
4599865679954987895459998987899989987998769879992123987678976789976799765989698789533959876348993234
5989234567899876799567897956789890196549878989789544998989765678965698943476569897659896987257899345
9976123456798765678989986844456789987698989395678959899895454567894567892565456998998765432125678976
8765277567987654569998765432349999898987693234569998789654323456923478921012345679539854321034567897
7654356679599987678999654321267898789965432145698987678943210147898569543235789794323969834245688998
8765467989459899789998874210158999679876541016987894599964521234997679659347898989019879765766899899
9876579894398789899987654332345696567987662929876793488895435349898989798959987879123989989877899787
3987698789298678967998965453456789349898799899985932376789655456789599987899976768934599999999989656
2498987679976543459019879867899892198789987789984321245698767567893498876789895457995678999878767938
1349876567895432398999989988957989987679876698765540356789878678932987545456789346889789998767656899
0198765456789321256789099899545678976598765549854321456899989799891095432347993275678992987654545789
1987674345699592345679129654334688965499994321965545567998999896789194321236892164568921298543237898
9876543234598989456989298743212567894389986539876667679567954965678987210235791013569432987654568956
5987621023987679867895497652101345789579876547988798789678942134567976521256789123456943498765678945
4997732654976598978996598764212345678989989656799899899989653655679876432345898235597894569876789534
9876543459865467899987987654325766789799999789899965957899879769989997543456797546678965778989899325
4988654598764348998998999766434589994598999898998654345678998998799987676567897667799796989999998934
3298797679974245697999429887847893212987898987987434234789897567688999789878998778945689998999987896
2129898989765134976878999998956789109876987656896510123498765434567899899989469899434567897898756789
3298959398754299865757889979767899912985436445689323234569854323776789998794357986523479956989434599
4987643239965987654345679869878999894976721336578935446798765612845899987654219875612396549876526989
9876543129876799765234889754999998789987530123489976557999976701234599998764329874323489932987789878
1995432035987999832123598932101989699998432236599987698999964312345678989876598765435567893499898767
3989654124599898641034567893219876568999543445679998899989899423456989879987699897576789965689989656
9878965435698765432155678965898765432987657656789999999875678954567999765698989998798999986789878543
8767896776789986749878789896799987621298767767899899989654579765678989854799878999939998997898765432
5456789987899987856989896789986798532349898898965778976543459879889875423999967894321987898969987643
2345678999998998767998945999965987643656929969434569198754678992994989567898656976439876749456898765
1234589923457899879987899889894398784789019654323691019867899921012398978997645897899985432345679876
2365699894578923989875987676789249895899998766513589129878987892124987899876536789999876521236789987
5456789689989012399954298545892134976999899895405678934989656789439876987654324679998787210123996798
7687893578899234569895987699976549899999789984312389545694545696598765699765312567899654323245695459
9798932345688965998769898987898799768987698765423578999943234789987674198653202469998765534367789568
9899321234567899899654679876789988657899579877567678987890125679876583019765313578929878946978897679
3976532345678945798753498765698976545986467988678789876789236798989432123984323489212989897889998989
2987645456789659987654579874987654324985358999799899765698945987998943439876534794343598789999999990
1298756569898798798765989989876543219876469999899988954567899876587894646987645679654987678999889891
2349869698999997659877996593987655424976567895999876543456998765456789656798789789769887567998768789
3567998987898989541988987432998966565987678934598765432567899854345699787899899899898765456789657679
7678987676487678932399998949899879677898989323459876554678998743234678998976989944999854346996545568
9899878554345568943567899898799998788969793212589988965689987664145699999765678932499710157895433477
1998765443123459956789998765678969899654579323679999878799876543234589987654567943987621238997312556
0197654321012367897991019834789456998765678954568954989899987654545678998765678954598534567898101245

51
2021/d10/ex1/ex1.py Executable file
View file

@ -0,0 +1,51 @@
#!/usr/bin/env python
import itertools
import sys
from typing import List, Optional, cast
def solve(input: List[str]) -> int:
def find_illegal_char(input: str) -> Optional[int]:
chunks: List[str] = []
ends_to_start = {
")": "(",
"]": "[",
"}": "{",
">": "<",
}
for i, c in enumerate(input):
# Is it a chunk beginning
if c not in ends_to_start:
chunks.append(c)
continue
# Is it matching the last element on the chunk stack
current = chunks.pop()
# If not, corruption has been found
if ends_to_start[c] != current:
return i
return None
score = {
")": 3,
"]": 57,
"}": 1197,
">": 25137,
}
return sum(
score[line[cast(int, find_illegal_char(line))]]
for line in input
if find_illegal_char(line) is not None
)
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

110
2021/d10/ex1/input Normal file
View file

@ -0,0 +1,110 @@
<{[[({([{<[[([()<>]<<><>>)<[[]()]{<>()}>][<(()[])<()<>>>]]<(<(<><>)(())>)[<([]()){<><>}>{{()<>}<{}>}]>>[({
<<({<{{{[(<{([{}{}]{{}[]}){({}())}}<<[[][]](()<>)>[{<><>}<{}<>>]>>(<[[()]([]{})]((()<>)[()()
({<<({[<[[<[([()])]<<<{}<>><()[]>>[[()<>]<[]()>]>>([((()[])[()])]{[[()()]<<><>>][{<>[]}(()<>)]})
(([[<<[{(({{{(()<>)[()()]}[({}<>)[[][]]]}([{{}<>}<[]()}]{[[][]][()<>]})})(([({[]{}}{[][]})
({{<[[<<{{[{[<{}{}>{[]{}}]<([]{}){()[]}>}]<{([<><>]([]<>)){({}())({}<>)}}[[<{}<>>([]{})][[()[]]]]>}}>>]]
[(<<<{([[[<{(<()<>>{<><>})(<[]<>>([][]))}[<[{}[]]>{<[]>(<><>)}]>([{{[]()}{[]()}}([<>[]][{}<>
<[{[{{([<(<{{[{}<>]({}{})}{{<>[]}(()())}}(<<<>{}>(<><>)>(<<>{}>[[]<>]))>)>[{[<[[()<>]{{}<>
{(<<[([<{<<<({()()}(<><>)}{((){})([]())}>>[<{<[]<>>{[]{}}}([()()])>]>}>]{{([{<{{[]<>}(<>)}<({}(
((<[{(({([<{(<[][]>)[<<>{}><()<>>]}<{<{}{}>}[{()[]}<{}[]>]>>])})<[{[{([{[]()}((){})][<<>()><()()>])>]}][[({{[
[[{([[<<[({[<<[]{}>{[][]}>(<()<>>[{}()])][([{}[]}[<><>]){[{}()]}]}[<<<{}<>>{()<>}>(<{}()>([]()))>{[[<><>][
{{{<[([[{<[<{([]{}>{<>()}}{<(){}><()()>}>[{[[][]](<>())}[{[]<>}[<>[]]]]]{<{{{}[]}{<><>}}[[()()](<
(([{(({[[[[{(<<>[]>((){})){<()<>><[]{}>}}{[{{}()}(()[])]((()){()<>})}]]]<[<<{(()[])<{}[]>}{
{<<([(<([{{(<(()<>)[[][]]>{[[]{}]{(){}}})[{<(){}>[[]<>]}]}}])[[[([[{()()}{<>[]}]{[()]{[][]}}]<[((
[{<<{<([(<[<{<{}[]>{{}[]}}(([]()))>{([(){}]<()[]>)(<[][]>{[]<>})}]>[{<<{<>()}[{}[]]>{(<><>)}>{[<[]<>>{()[]}]<
<{{<{[[{{([({<()>{(){}}}((<>[])(<><>)))[(<[]<>>[()[]])<<()()>{<>{}}>]])<[{[{[]<>}{()()}][[{}{}]<[]>]}<{{{
[(<[{([{({<<[<<>()>[[]()]]{<<>{}><{}<>>}><{<()()>{{}{}}}(({}<>)<()<>>)>>})({(([<{}<>>{[][]
{(([{[<{{[({{[{}<>][()]}<{{}<>}>}(({<>[]})))]{((<[<>{}][<>[])>[[<>()]{[][]}]))<<<({}<>){{}<>}>(
{[<{({((([[{[(<>{}){<>()}][([]{}}]}]{[<(()()){[]()}>((<>[])<(){}>)]}]){<(<<{{}<>}>>)([[{<><>}<
{<{[(<{<[({<<[<><>]{()()}>[{()<>}<{}>]>[[<[]>][{()[]}{()}]]}(<(({}()){<><>})<(()())[<>()]>>{
<[({[[{<([[{<{{}}>(<<><>>{[]()}}}[{{<>{}}<()<>>}{[[][]]{[]<>}}]]<((([][])<<>{}>)<((){})[{}()
{{[{<[{<<{<<(<{}[]><(){}>)<{<>[]}[{}()]>>[{{[]<>}<()<>>}[{{}<>}(<>())]]><[(({}<>)({}<>))<<{}<>><<
{<<({(<[(<[[{{[][]}{{}}}<[[]()]<<>())>]](<{{{}<>}{()<>}}>)>)]<(({{[[[][]]]}<[[(){}]<[]{}>]>}))>
({{([<<{[(<<{{<>()}<[]()>}<{(){}}{{}{}}>><(<{}[]>{<>{}})<([]<>)([]())>>>)]}>>[[{<{[<<(<>{})
<{({{({<<[{<<{<>}{{}[]}>>[[{[]<>}{()()}]<<[][]>(()())>]}]{<<{[(){}><<><>>}{{<>[]}(()<>)}>[<<(){}>[[]
<({<([[[([({<{(){}}([][])>}<[{[][]}{<>()}]<[(){}][{}<>]>>){<({{}()}{[]{}})>{[{[]{})[()[]]]<[
{([({[(([<{((({}()){{}<>})(<()[]>{()()})){[({}{})<<>[]>]([{}][()])}}>]{<<[<[[][]]{[][]}>({[]{}}<{}()>)
<<{[<({[(<[({<{}{}><()()>})]{<<[<><>]>>}>){{[((<<><>><{}[]>)){<{[]()}(<>())>}]{{{({}<>){[]<>}}{{
<<({<[{(([{({({}())(<>{})}{((){})})[<[[][]]([][])>]}<<[[<>{}][[]<>]]<([]<>)[()()]>><<<{}[]>(()())>>]])[[[
[{<({<(({([([{[]}]<{[]()}[()<>]>]{{(()())<{}()>}{{[]()}<()<>>}}][{(<[]<>>[<>{}])[<[]<>><<><>>]}<(<<
<{{((<<(<{({<{<>{}}[[]{}]>})[[{{[][]}{{}<>}}]]}[(([(()[])<()<>>]((<>[])<<>{}>))<[[<>()][<>
{[([<<<({[{<<[<>{}]<[]<>>>>({<<>{}>((){})}<{[][]}{[]{}}>)}<{(([]{})<<>>><{{}()}(<><>)>}<{<[]
<({[[{{{([(({[{}<>]{[]<>}}[{()<>}<(){}>])<[<{}()>[[]<>]]>)]{{[<{<>()}[{}()]><<<><>>{[][]}>]([[[][]](<>())
[<<{{<[[{[<(<{()[]}[(){}]><[()[]]<<>{}>>)>[[[[[]{}]{[][]}]{<[]{}><(){}>}]({{<>()}<<>{}>}({()<>
[<[[(<[[[[<<<{()<>}[[]()]>>{[[<>[]]{[]{}}]{[<>[]][[]<>]}}>]]({[({[<><>]<{}<>>}<<(){}>[{}()]>)[[<<>
<{{({<([{({({{{}()}((){})})([([][])[[]<>]](([])[{}<>]))}<(([()<>][()[]])[<[]><{}{}>])<{({}<>)<<>()>}
{<[[[([{[<<(({{}<>})(<{}()](<>{}))){[[<>[]]({}<>)]}><[((<>()){[][]})[({}())<{}<>>]]<({<>[]}{{}<>
{<[<[({<({(<(({}[])<{}>)((<>[])({}<>))><(([][])(()()))>)})({{({{<>())}<{<>()}([]{})>)[[(()<>)<<>[]>](<<
{(<(<<{{({{<{(<>[])[[]]}{(<>{})>>{<(()())[{}{}]>{{[]{}}{{}<>}}}}(<{[{}[]]<(){}>}[[{}{}]{()<>}]>([{<>{}}[<>]]
[{[{{[[[{([<(({}{})<[][]>)<([]{})<<>{}>>>[{[[]{}]([]<>)}{(()())[<>[]]}}]((<([]<>)[()<>]>(<{}()>)){<[<>[]](
{<<<<{(({<<({(()())(<>{})}<([][])[[]()]>)[{{[]()}(<>)}]><{[<<>()>]{<[]()>[[]<>]}}>>}>[(<<<[{()<>}{{}<>
[{[(<[<{<[({[{[]<>}<[][]>]{{<>()}}}[({<>[]}{{}{}}){[[]<>](<><>)}])({({{}<>}<{}<>>)}<[((){})[{
{<[[{[(((<({([[]<>](()<>))}[{{()<>}({}())}(<[]{}>{[]{}})])<<(({})[{}{}])[(<>{})<()>]>>>))<[{{<[{{}<>}[[][]
[[<<([{<{((([<{}{}>(<><>)][({}[])])[[(<>{}){{}<>}](<()[]>[[]()])])[{({()}{{}{}})(({}())([]{}))}({[{}[]]{
<<((<[<(([<{[<{}<>>][<{}{}>{{}[]}]}[{<<>()>[[]{}]}{[()[]]([]{})}]><{({()()}{[]})<{[]()}[{}{}]>}{((<>(
({<<{[(({{<<{[[]()]{{}()}}{[<>{}]<[][]>}>{(([]())[<>[]]){<[]{}>{<><>}}}>{{{{<>[]}{{}()]}{{<>{}}[{}{}
{((<<{<<<((<(({}{})(()))[[()()]{{}<>}]>{(<()[]][{}[]])[[<>[]]<<>>]}))>([[{({()[]}{()[]})(<[][]><{}{}>)}[[[[][
[(<<{<[(<([<(<[]()><()()>)>]{({[<><>]{[][]}})}}<[([(()())[{}]]<<(){}>[<><>]>)][<<((){})>>[[{<><>}[{}()]][([]
[<{[<[[(({{{[<{}[]><<>{}}][[{}<>]<<>()>]}{[{[]}[{}[]]]{[()[]]<{}<>>}}}[({<(){}>{{}{}}}<(()[])(
<{([{(<[<<<<[[{}{}]([])](<{}{}>[[][]])>{{(()[]){<>[]}}<[<><>][(){}]>}>(([[{}{}]{{}<>}](<()()>))<<(<>{})<<
[(<[[[[(({[<<<<>{}><<><>>>>]<{[{{}<>}<()>]{{[]{}}[<>[]]}}<<<()[]>([]<>)><(<>{}){[]()}>>>}))[[([{<
[([(({<{([<[({{}{}}<{}{}>)[[[]{}]({}<>)]]<[([]<>)({}[])]{(()[]){[]<>}}>>{[<{[]<>}>{[()[]]<()<>>}][<([
{<[<[[<[{({{<[[]()][{}()]>({()[]}(()[]))}([[<>()]])})}{{<{{[<>]<[]()>}{<{}[]]}}<{{()[]}<[]<>>}([()()]<{}()>)>
[{{(<(([([((<{{}{}}({}())>{{<>[]}<[]{}>})([{<>()}{{}<>}]{<()<>>[{}{}]})>]{{[<(<>){[]{}}>{<<>[]>[()[]]}]
[<<(({[[({({[{[]{}}<<>[]]]{[()()]<<>()>}}{[{<>[]}<()>]}){{<<()[]>{[]{}}><<<>>[[]()]>}}})<[{{[<
<([{{{(<{{{<<({}()){(){})>{<{}{}>{<>()}}>{(<()[]>({}()))<({}())<()()>>}}[(({[]{}}[<>{}])([{}<>])){{{{}}(<
<<{[{[[<([[<(<{}<>><()[]>)<{<>()>[<>()]>>]][{{{{()<>}<{}[]>}[<[]()>[()[]]]}<{[{}](<>{})}>}[<[[<><>]<
[{[([{<<[([[{<<>[]>(<>())}((()())({}{}))>{[({}())<<>()>]<(<><>){()<>}>}]({([(){}]<[]<>>){<[
[{<<[[<((({[<[[]()]>(<<>>(<>{}))]<<([]<>)[<>{}]>{<[][]>(<>())}>}(([{{}<>}{{}[]}]{[()[]]{{}{}}})<
([<<{[([[<{<{({}())}{(()<>)}>[<[{}<>][[]()]><[<>{}]({}[])>]}<[([<>()]){[()<>]([]{})}][[[{}[]]][
<{[[{({<{(<[[(()[])<<>[]>]<<<>()>{[]<>}>]>{[<(<>()){<>[]}>(([][]))]([<[]<>><{}{}>]([<>{}](()()
{[([{{(([[<{<[{}<>]([]{})>[((){})<()[]>]}[[{{}<>}<[][]>]<{[]<>}([]())>]>{<{{{}<>}{(){}}]{{[]
[{{<[([<{[[({[{}[]][(){}]}<{<>()}<[]{}>>)]<<({()<>}[[]()]){[<>[]]<()()>}>>]{[<<(<>[])<[]<>>
<[{<[<((<({[{[{}[])(<>{})}(({}[])[<>])]})>[[([{((){})<<>>}])[<((()<>)[{}{}])[[(){}]]>{<<{}()>{
({[[[[[[[<((<[<><>][()[]]><(<><>)>))>{{<(<<>[]>{{}})[[[]<>]({}())]><{{()<>>[[]<>]}[<{}{}>{<>{}}]>}[{<(<
([([(<[{<[[{<{<>[]}>{{{}()]<{}()>}}<([{}()]{{}<>})[([][]){{}<>}]>]{<{{[]{}}{{}<>}}<[[]()]>>[[{()[]}{(){}}]{[
{<{([([{<<<<{[<>()]<[]>}[[()<>]<()>]>>(([[<>[]][{}{}]])((([][]){<><>})([[]{}]<()<>})))><{<<[()()]<[]()>
[{({[{[(([([{{{}<>}{()<>}}(([]<>){{}{}})][<{()}{{}{}}>(<<>()>[<>()])])]))<<<({((<>()){[]{}})[{
([([(<(({<(<<<{}[]>){{<><>}[[]{}]}>[{{[][]}<<><>>}])<{<<[]>(()[])>[[{}()]<[]<>>]}{({[]()}[<><>]){{{}[]}[{
{{[{<{((<((<<<(){}>>{([]{})[[]()]}>([({}{})]{<()>{[]{}}}))[[(<<><>>)]<<<{}{}><(){}>>[({}[])({}
<{[({{<<((([[[(){}][{}<>]]<(<>[])<[]()>>]<[[{}()]({}())]>)({<[(){}]>{(<><>){[]{}}}})){{{<<[]()>[()<>]>[<
(<[[(<((<[[<{[[]()][()<>]}<[[][]]<[][]>>>((({}())((){}))(<{}<>]{()()}))]]>[[{<{[{}<>]}>([[{}<>](()
<<<{<(<[<{[[([<>()][()<>])(<<>()>[{}()])][<{<>()}>]]}<<<({<>[]}([]{}))<<(){}>>>[[({}())(())]]>{({({}[
([<<<{<{({<[{(()<>)<()()>}]<[({}<>)]>>{[[{<>{}}(()[])](<<>>[[]<>])]}}{<<{<<>()>}><{{<>()}<<><>>}{<(){}>[(){
{{(<<[{{({({({[]()}<{}()>)(([][])[()<>])}<{(<>())[()<>]}>)[[(([]<>)[[]<>])]]}[({[({}()){{}>]})
<((((<{{{{{[{[(){}]([][])}[{<>{}}([]<>)]]([((){})]<[[][]][<><>]>)}}<(<{(()<>)([]{})}><([()<>]{<>()
<{<{<(<(<<<(<[[][]]<<>()>><[<>[]][[]]>)[<[<>{}][<>()]>]>{<{(()){{}()}}[<{}<>><<><>>]>[{<{}[]><<><>>}]}>{(
{[{<<(<([({{<<[]<>>[<>{}]>{<{}<>>([]<>)}}([<<>{}>((){})}<{<>[]}>)}<<({{}()})<(<>[])[[]]>>[[<<>[]>{()[]}][[[]
<<<<[<{<[{{(<[<>]<[]{}>><(<>{}){{}()}>)[[{<>{}}{{}[]}](<[]>[<>{}])]}{{[{{}[]}(()<>)]<([]())(
[([({[[{<{{<<{()()}<{}{}>>({{}{}}[{}{}]>>[{(<>{})<()()>}[[<>[]]<{}()>]]}[<<{<><>}(()[])>(<{}[]>
[<<[[(({<[[([(<>[]){()[]}][(<><>)[<>[]]])]<({<{}{}>(()[])}[<{}<>>({}())])((({}{})<{}[]>)[{{}<>}{{}{}}])
(({({[<<[<[([<<><>){[]{}}][<()<>><[]<>>])({[{}<>]<[]<>>}<({}{})[{}[]]>)][{((<><>)(()[]))}[<<{}()>{<>
<((<[(<(<[[([{(){}}<<>()>]({(){}}{(){}}))]][{{[{[][]]{<>{}}]{[{}<>]([]{})}}}[<{[[]{}][<>()]}[(()[])<
{((<<{({<[([(([]())([]()))(<[][]>{()})])<<[<<>[]>[<>())](<()<>><()()>)>>]>{{[{<[<>{}]<[]<>>>}<{{<><>}<
{<<<<[((<{({<{<>[]}{<>()}><{<><>){<>()}>}([[[]()][(){}]]<<()<>>{<><>}>)){[{{<>[]}{[]()}}{(<>())
({<<<<[{<{<{(<{}{}><()[]>)[{<>{}}]}>(<[([]{}){<><>}]{<<><>>[()[]]}}<[{()[]}{()[]}][{{}[]}{[][]}]>)}>}]
({({{<{{{[<{{(<><>)}({[]()}{<><>})}{<[{}[]]<[]<>>>[(<>[]){()()}]}><[[<<>()><[][]>]]>]<<[{[[]()](
<{[<([<[({([{(<>{}){()}}<([]<>)[{}{}]>)[[<()[]><{}<>>][(<>{})[()()]]]){<{({}){{}{}}}<{<>()}[[
{((({[{<{[<({[{}()]({}{})}<(<>)(()())>)({[[]{}](<><>)}[<<>[]>[<>[]]])><<[{[]<>}][([][])<[]()>]>(
({[((([<[(<{[(<>[])(()[])]}<[([][])([]<>)]<(()())>>>((([(){}])<(<>())<<><>>>)<[[()<>>{{}{}
[{{((<{[(<{[{{[][]}{<><>}}[[()[]]<[][]>]]<<({}[])((){})>>}>[(<([[]()]<{}[]>)([{}<>])>({<<>[]>(<>[])}[(
((<((<[<(<[{(<[]()>[()[]])((())(()[]))}{[[{}<>]([]{})]<[[]()]>}]>)><([<[<{[]<>}<{}[]>>[[(){}]]]({[[][]]{
[(([([(([<<(<{<>}{[][]}>)[{[()<>]{{}{}}}({{}{}}<[]()>)]>>{([({<><>}<[]>){<{}{}>[()<>]}]<<[[]{}]{{
[(<{<[[{[<<{<[[]<>]<[]()>>{{[]<>}}}><[[{{}()}([]<>)]][({{}<>}{{}{}})<[[][]](()())>]>><<({([]{})<<>{}>}){
<{[<[(<<[[[[{<{}[]><[]<>>](<{}[]>{()[]})](<[<>()][[][]]>([()()]<<>()>))]]({([<()[]>[{}()]])<{[[]()]}{<[][
<{{{([[([{{{<({}[])>}}<<({<>{}}{{}()))<({}{}){[]{}}>>[[(<>())[{}[]]]<<[]{}>{<>[]}>]>}([{[<<
[{<(({{<[{[[([<>{}]{<>{}})(((){})[{}[]])][{<{}<>>}[([]{})<{}>]]]}{<<([<>{}][()[]})[{{}}<{}()>]>(
[((<[{<<[<[{[{{}()}[{}[]]]<[<>[]][{}<>]>}]>]{[([([[]<>]{{}[]})[<(){}>[()[]]]]<<({}[])<[]()>>[(
[{([<{([(({(<[[]<>]>{({}()){<><>}})([([]())[[]<>]])}(<[({}())(<>())]<{()<>}[[]<>]>>)){{([[<><>][()[]>](<[][]>
<<(<<<{{{<<(<<[]<>>{<>()}>[<[]>])<{<{}<>>}{[{}{}]<<>[]>}>><{<<<>{}>({}<>)>}{([()[]]<<>()>)(<<><>><[]{}>)}>><
{[<<[{{(<<[((({}{})[{}{}])(({}<>)[{}()]))]>{([[[(){}]<{}<>>][[{}[]]{()[]}]](<{[]{}}(<>[]>>))}>)}[(<
<{{[[<[[[(((({<><>}{{}{}})<[<>()]([]())>)[<{{}<>}>{((){})[[][]]}]))<{<{[[]()]<[][]>}{<[]<>>(<>
{<[<<([[[[{{<({}<>)<{}()>>[(<>())({}[])]}<{([][])({}<>)}>}(({[<>{}]{[]{}}}<(<>{})>)[<{[][]}{[][]}>{({}()){
[[({{[(((({<{{<><>]}{(<><>){<><>}}>(<[()<>]<{}{}>>((<><>){<>[]}))}{<[[{}[]]([][])][{{}[]}[
[{{<([((<<{(((<><>)<(){}>))((({}[]){<>()})(<{}()}({}{})))}><[<<{<>[]}[()<>]>{[<>{}]{[]()}}>{{
[<{<{{({{<<<{[<><>]<[][]>}<<(){}>(<>)>>>([<{[]()}{{}[]}>{<{}()><[]<>>}]([([]())[[]]]([[]()]<<>{}>)))>
<[{<[(<{{([[<[{}{}]><([]<>)(()())>][<((){})[[]()]>[([]<>){<><>}]]]{<{<[]<>><<>>}{<{}<>><[]{}
{[((((((({([([(){}]([]<>)){[{}](<>[])}]{[<<>()>([]<>)]<<[][]>{[]<>}>})<<[{{}[]}(<><>)]<[()<>]
([({(([[[([[((<>{}){{}{}}]{[()<>]((){})}]((({})(<>[])){[{}{}]<<>()>})]{({(())[<>{}]}((<>{})
{<[<{(<[{<[{(<{}()>)[<<>[]>(()<>)]}([{()[]}<{}<>>])}(({<[]{}><{}{}>}([[]<>]{{}()})){[[{}<>]
<<({[[<<[([(<[<><>]{<>{}}>{<(){}>(()())})<{[<>{}]<()[]>}>]<{[{<>{}}<<>()>]<{{}()}[()<>]>}<[[{}<>][{

82
2021/d10/ex2/ex2.py Executable file
View file

@ -0,0 +1,82 @@
#!/usr/bin/env python
import itertools
import sys
from typing import Iterator, List, Optional
def solve(input: List[str]) -> int:
def find_illegal_char(input: str) -> Optional[int]:
chunks: List[str] = []
ends_to_start = {
")": "(",
"]": "[",
"}": "{",
">": "<",
}
for i, c in enumerate(input):
# Is it a chunk beginning
if c not in ends_to_start:
chunks.append(c)
continue
# Is it matching the last element on the chunk stack
current = chunks.pop()
# If not, corruption has been found
if ends_to_start[c] != current:
return i
return None
def complete_line(input: str) -> str:
chunks: List[str] = []
start_to_end = {
"(": ")",
"[": "]",
"{": "}",
"<": ">",
}
for c in input:
# Is it a chunk beginning
if c in start_to_end:
chunks.append(c)
continue
# Otherwise we must match the last open chunk
assert start_to_end[chunks.pop()] == c # Sanity check
return "".join(reversed(list(start_to_end[c] for c in chunks)))
def score_completion(completion: str) -> int:
char_score = {
")": 1,
"]": 2,
"}": 3,
">": 4,
}
score = 0
for c in completion:
score *= 5
score += char_score[c]
return score
def score_completions(completions: Iterator[str]) -> int:
scores = sorted(map(score_completion, completions))
return scores[len(scores) // 2]
incomplete_lines = filter(lambda line: find_illegal_char(line) is None, input)
completions = map(complete_line, incomplete_lines)
return score_completions(completions)
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

110
2021/d10/ex2/input Normal file
View file

@ -0,0 +1,110 @@
<{[[({([{<[[([()<>]<<><>>)<[[]()]{<>()}>][<(()[])<()<>>>]]<(<(<><>)(())>)[<([]()){<><>}>{{()<>}<{}>}]>>[({
<<({<{{{[(<{([{}{}]{{}[]}){({}())}}<<[[][]](()<>)>[{<><>}<{}<>>]>>(<[[()]([]{})]((()<>)[()()
({<<({[<[[<[([()])]<<<{}<>><()[]>>[[()<>]<[]()>]>>([((()[])[()])]{[[()()]<<><>>][{<>[]}(()<>)]})
(([[<<[{(({{{(()<>)[()()]}[({}<>)[[][]]]}([{{}<>}<[]()}]{[[][]][()<>]})})(([({[]{}}{[][]})
({{<[[<<{{[{[<{}{}>{[]{}}]<([]{}){()[]}>}]<{([<><>]([]<>)){({}())({}<>)}}[[<{}<>>([]{})][[()[]]]]>}}>>]]
[(<<<{([[[<{(<()<>>{<><>})(<[]<>>([][]))}[<[{}[]]>{<[]>(<><>)}]>([{{[]()}{[]()}}([<>[]][{}<>
<[{[{{([<(<{{[{}<>]({}{})}{{<>[]}(()())}}(<<<>{}>(<><>)>(<<>{}>[[]<>]))>)>[{[<[[()<>]{{}<>
{(<<[([<{<<<({()()}(<><>)}{((){})([]())}>>[<{<[]<>>{[]{}}}([()()])>]>}>]{{([{<{{[]<>}(<>)}<({}(
((<[{(({([<{(<[][]>)[<<>{}><()<>>]}<{<{}{}>}[{()[]}<{}[]>]>>])})<[{[{([{[]()}((){})][<<>()><()()>])>]}][[({{[
[[{([[<<[({[<<[]{}>{[][]}>(<()<>>[{}()])][([{}[]}[<><>]){[{}()]}]}[<<<{}<>>{()<>}>(<{}()>([]()))>{[[<><>][
{{{<[([[{<[<{([]{}>{<>()}}{<(){}><()()>}>[{[[][]](<>())}[{[]<>}[<>[]]]]]{<{{{}[]}{<><>}}[[()()](<
(([{(({[[[[{(<<>[]>((){})){<()<>><[]{}>}}{[{{}()}(()[])]((()){()<>})}]]]<[<<{(()[])<{}[]>}{
{<<([(<([{{(<(()<>)[[][]]>{[[]{}]{(){}}})[{<(){}>[[]<>]}]}}])[[[([[{()()}{<>[]}]{[()]{[][]}}]<[((
[{<<{<([(<[<{<{}[]>{{}[]}}(([]()))>{([(){}]<()[]>)(<[][]>{[]<>})}]>[{<<{<>()}[{}[]]>{(<><>)}>{[<[]<>>{()[]}]<
<{{<{[[{{([({<()>{(){}}}((<>[])(<><>)))[(<[]<>>[()[]])<<()()>{<>{}}>]])<[{[{[]<>}{()()}][[{}{}]<[]>]}<{{{
[(<[{([{({<<[<<>()>[[]()]]{<<>{}><{}<>>}><{<()()>{{}{}}}(({}<>)<()<>>)>>})({(([<{}<>>{[][]
{(([{[<{{[({{[{}<>][()]}<{{}<>}>}(({<>[]})))]{((<[<>{}][<>[])>[[<>()]{[][]}]))<<<({}<>){{}<>}>(
{[<{({((([[{[(<>{}){<>()}][([]{}}]}]{[<(()()){[]()}>((<>[])<(){}>)]}]){<(<<{{}<>}>>)([[{<><>}<
{<{[(<{<[({<<[<><>]{()()}>[{()<>}<{}>]>[[<[]>][{()[]}{()}]]}(<(({}()){<><>})<(()())[<>()]>>{
<[({[[{<([[{<{{}}>(<<><>>{[]()}}}[{{<>{}}<()<>>}{[[][]]{[]<>}}]]<((([][])<<>{}>)<((){})[{}()
{{[{<[{<<{<<(<{}[]><(){}>)<{<>[]}[{}()]>>[{{[]<>}<()<>>}[{{}<>}(<>())]]><[(({}<>)({}<>))<<{}<>><<
{<<({(<[(<[[{{[][]}{{}}}<[[]()]<<>())>]](<{{{}<>}{()<>}}>)>)]<(({{[[[][]]]}<[[(){}]<[]{}>]>}))>
({{([<<{[(<<{{<>()}<[]()>}<{(){}}{{}{}}>><(<{}[]>{<>{}})<([]<>)([]())>>>)]}>>[[{<{[<<(<>{})
<{({{({<<[{<<{<>}{{}[]}>>[[{[]<>}{()()}]<<[][]>(()())>]}]{<<{[(){}><<><>>}{{<>[]}(()<>)}>[<<(){}>[[]
<({<([[[([({<{(){}}([][])>}<[{[][]}{<>()}]<[(){}][{}<>]>>){<({{}()}{[]{}})>{[{[]{})[()[]]]<[
{([({[(([<{((({}()){{}<>})(<()[]>{()()})){[({}{})<<>[]>]([{}][()])}}>]{<<[<[[][]]{[][]}>({[]{}}<{}()>)
<<{[<({[(<[({<{}{}><()()>})]{<<[<><>]>>}>){{[((<<><>><{}[]>)){<{[]()}(<>())>}]{{{({}<>){[]<>}}{{
<<({<[{(([{({({}())(<>{})}{((){})})[<[[][]]([][])>]}<<[[<>{}][[]<>]]<([]<>)[()()]>><<<{}[]>(()())>>]])[[[
[{<({<(({([([{[]}]<{[]()}[()<>]>]{{(()())<{}()>}{{[]()}<()<>>}}][{(<[]<>>[<>{}])[<[]<>><<><>>]}<(<<
<{{((<<(<{({<{<>{}}[[]{}]>})[[{{[][]}{{}<>}}]]}[(([(()[])<()<>>]((<>[])<<>{}>))<[[<>()][<>
{[([<<<({[{<<[<>{}]<[]<>>>>({<<>{}>((){})}<{[][]}{[]{}}>)}<{(([]{})<<>>><{{}()}(<><>)>}<{<[]
<({[[{{{([(({[{}<>]{[]<>}}[{()<>}<(){}>])<[<{}()>[[]<>]]>)]{{[<{<>()}[{}()]><<<><>>{[][]}>]([[[][]](<>())
[<<{{<[[{[<(<{()[]}[(){}]><[()[]]<<>{}>>)>[[[[[]{}]{[][]}]{<[]{}><(){}>}]({{<>()}<<>{}>}({()<>
[<[[(<[[[[<<<{()<>}[[]()]>>{[[<>[]]{[]{}}]{[<>[]][[]<>]}}>]]({[({[<><>]<{}<>>}<<(){}>[{}()]>)[[<<>
<{{({<([{({({{{}()}((){})})([([][])[[]<>]](([])[{}<>]))}<(([()<>][()[]])[<[]><{}{}>])<{({}<>)<<>()>}
{<[[[([{[<<(({{}<>})(<{}()](<>{}))){[[<>[]]({}<>)]}><[((<>()){[][]})[({}())<{}<>>]]<({<>[]}{{}<>
{<[<[({<({(<(({}[])<{}>)((<>[])({}<>))><(([][])(()()))>)})({{({{<>())}<{<>()}([]{})>)[[(()<>)<<>[]>](<<
{(<(<<{{({{<{(<>[])[[]]}{(<>{})>>{<(()())[{}{}]>{{[]{}}{{}<>}}}}(<{[{}[]]<(){}>}[[{}{}]{()<>}]>([{<>{}}[<>]]
[{[{{[[[{([<(({}{})<[][]>)<([]{})<<>{}>>>[{[[]{}]([]<>)}{(()())[<>[]]}}]((<([]<>)[()<>]>(<{}()>)){<[<>[]](
{<<<<{(({<<({(()())(<>{})}<([][])[[]()]>)[{{[]()}(<>)}]><{[<<>()>]{<[]()>[[]<>]}}>>}>[(<<<[{()<>}{{}<>
[{[(<[<{<[({[{[]<>}<[][]>]{{<>()}}}[({<>[]}{{}{}}){[[]<>](<><>)}])({({{}<>}<{}<>>)}<[((){})[{
{<[[{[(((<({([[]<>](()<>))}[{{()<>}({}())}(<[]{}>{[]{}})])<<(({})[{}{}])[(<>{})<()>]>>>))<[{{<[{{}<>}[[][]
[[<<([{<{((([<{}{}>(<><>)][({}[])])[[(<>{}){{}<>}](<()[]>[[]()])])[{({()}{{}{}})(({}())([]{}))}({[{}[]]{
<<((<[<(([<{[<{}<>>][<{}{}>{{}[]}]}[{<<>()>[[]{}]}{[()[]]([]{})}]><{({()()}{[]})<{[]()}[{}{}]>}{((<>(
({<<{[(({{<<{[[]()]{{}()}}{[<>{}]<[][]>}>{(([]())[<>[]]){<[]{}>{<><>}}}>{{{{<>[]}{{}()]}{{<>{}}[{}{}
{((<<{<<<((<(({}{})(()))[[()()]{{}<>}]>{(<()[]][{}[]])[[<>[]]<<>>]}))>([[{({()[]}{()[]})(<[][]><{}{}>)}[[[[][
[(<<{<[(<([<(<[]()><()()>)>]{({[<><>]{[][]}})}}<[([(()())[{}]]<<(){}>[<><>]>)][<<((){})>>[[{<><>}[{}()]][([]
[<{[<[[(({{{[<{}[]><<>{}}][[{}<>]<<>()>]}{[{[]}[{}[]]]{[()[]]<{}<>>}}}[({<(){}>{{}{}}}<(()[])(
<{([{(<[<<<<[[{}{}]([])](<{}{}>[[][]])>{{(()[]){<>[]}}<[<><>][(){}]>}>(([[{}{}]{{}<>}](<()()>))<<(<>{})<<
[(<[[[[(({[<<<<>{}><<><>>>>]<{[{{}<>}<()>]{{[]{}}[<>[]]}}<<<()[]>([]<>)><(<>{}){[]()}>>>}))[[([{<
[([(({<{([<[({{}{}}<{}{}>)[[[]{}]({}<>)]]<[([]<>)({}[])]{(()[]){[]<>}}>>{[<{[]<>}>{[()[]]<()<>>}][<([
{<[<[[<[{({{<[[]()][{}()]>({()[]}(()[]))}([[<>()]])})}{{<{{[<>]<[]()>}{<{}[]]}}<{{()[]}<[]<>>}([()()]<{}()>)>
[{{(<(([([((<{{}{}}({}())>{{<>[]}<[]{}>})([{<>()}{{}<>}]{<()<>>[{}{}]})>]{{[<(<>){[]{}}>{<<>[]>[()[]]}]
[<<(({[[({({[{[]{}}<<>[]]]{[()()]<<>()>}}{[{<>[]}<()>]}){{<<()[]>{[]{}}><<<>>[[]()]>}}})<[{{[<
<([{{{(<{{{<<({}()){(){})>{<{}{}>{<>()}}>{(<()[]>({}()))<({}())<()()>>}}[(({[]{}}[<>{}])([{}<>])){{{{}}(<
<<{[{[[<([[<(<{}<>><()[]>)<{<>()>[<>()]>>]][{{{{()<>}<{}[]>}[<[]()>[()[]]]}<{[{}](<>{})}>}[<[[<><>]<
[{[([{<<[([[{<<>[]>(<>())}((()())({}{}))>{[({}())<<>()>]<(<><>){()<>}>}]({([(){}]<[]<>>){<[
[{<<[[<((({[<[[]()]>(<<>>(<>{}))]<<([]<>)[<>{}]>{<[][]>(<>())}>}(([{{}<>}{{}[]}]{[()[]]{{}{}}})<
([<<{[([[<{<{({}())}{(()<>)}>[<[{}<>][[]()]><[<>{}]({}[])>]}<[([<>()]){[()<>]([]{})}][[[{}[]]][
<{[[{({<{(<[[(()[])<<>[]>]<<<>()>{[]<>}>]>{[<(<>()){<>[]}>(([][]))]([<[]<>><{}{}>]([<>{}](()()
{[([{{(([[<{<[{}<>]([]{})>[((){})<()[]>]}[[{{}<>}<[][]>]<{[]<>}([]())>]>{<{{{}<>}{(){}}]{{[]
[{{<[([<{[[({[{}[]][(){}]}<{<>()}<[]{}>>)]<<({()<>}[[]()]){[<>[]]<()()>}>>]{[<<(<>[])<[]<>>
<[{<[<((<({[{[{}[])(<>{})}(({}[])[<>])]})>[[([{((){})<<>>}])[<((()<>)[{}{}])[[(){}]]>{<<{}()>{
({[[[[[[[<((<[<><>][()[]]><(<><>)>))>{{<(<<>[]>{{}})[[[]<>]({}())]><{{()<>>[[]<>]}[<{}{}>{<>{}}]>}[{<(<
([([(<[{<[[{<{<>[]}>{{{}()]<{}()>}}<([{}()]{{}<>})[([][]){{}<>}]>]{<{{[]{}}{{}<>}}<[[]()]>>[[{()[]}{(){}}]{[
{<{([([{<<<<{[<>()]<[]>}[[()<>]<()>]>>(([[<>[]][{}{}]])((([][]){<><>})([[]{}]<()<>})))><{<<[()()]<[]()>
[{({[{[(([([{{{}<>}{()<>}}(([]<>){{}{}})][<{()}{{}{}}>(<<>()>[<>()])])]))<<<({((<>()){[]{}})[{
([([(<(({<(<<<{}[]>){{<><>}[[]{}]}>[{{[][]}<<><>>}])<{<<[]>(()[])>[[{}()]<[]<>>]}{({[]()}[<><>]){{{}[]}[{
{{[{<{((<((<<<(){}>>{([]{})[[]()]}>([({}{})]{<()>{[]{}}}))[[(<<><>>)]<<<{}{}><(){}>>[({}[])({}
<{[({{<<((([[[(){}][{}<>]]<(<>[])<[]()>>]<[[{}()]({}())]>)({<[(){}]>{(<><>){[]{}}}})){{{<<[]()>[()<>]>[<
(<[[(<((<[[<{[[]()][()<>]}<[[][]]<[][]>>>((({}())((){}))(<{}<>]{()()}))]]>[[{<{[{}<>]}>([[{}<>](()
<<<{<(<[<{[[([<>()][()<>])(<<>()>[{}()])][<{<>()}>]]}<<<({<>[]}([]{}))<<(){}>>>[[({}())(())]]>{({({}[
([<<<{<{({<[{(()<>)<()()>}]<[({}<>)]>>{[[{<>{}}(()[])](<<>>[[]<>])]}}{<<{<<>()>}><{{<>()}<<><>>}{<(){}>[(){
{{(<<[{{({({({[]()}<{}()>)(([][])[()<>])}<{(<>())[()<>]}>)[[(([]<>)[[]<>])]]}[({[({}()){{}>]})
<((((<{{{{{[{[(){}]([][])}[{<>{}}([]<>)]]([((){})]<[[][]][<><>]>)}}<(<{(()<>)([]{})}><([()<>]{<>()
<{<{<(<(<<<(<[[][]]<<>()>><[<>[]][[]]>)[<[<>{}][<>()]>]>{<{(()){{}()}}[<{}<>><<><>>]>[{<{}[]><<><>>}]}>{(
{[{<<(<([({{<<[]<>>[<>{}]>{<{}<>>([]<>)}}([<<>{}>((){})}<{<>[]}>)}<<({{}()})<(<>[])[[]]>>[[<<>[]>{()[]}][[[]
<<<<[<{<[{{(<[<>]<[]{}>><(<>{}){{}()}>)[[{<>{}}{{}[]}](<[]>[<>{}])]}{{[{{}[]}(()<>)]<([]())(
[([({[[{<{{<<{()()}<{}{}>>({{}{}}[{}{}]>>[{(<>{})<()()>}[[<>[]]<{}()>]]}[<<{<><>}(()[])>(<{}[]>
[<<[[(({<[[([(<>[]){()[]}][(<><>)[<>[]]])]<({<{}{}>(()[])}[<{}<>>({}())])((({}{})<{}[]>)[{{}<>}{{}{}}])
(({({[<<[<[([<<><>){[]{}}][<()<>><[]<>>])({[{}<>]<[]<>>}<({}{})[{}[]]>)][{((<><>)(()[]))}[<<{}()>{<>
<((<[(<(<[[([{(){}}<<>()>]({(){}}{(){}}))]][{{[{[][]]{<>{}}]{[{}<>]([]{})}}}[<{[[]{}][<>()]}[(()[])<
{((<<{({<[([(([]())([]()))(<[][]>{()})])<<[<<>[]>[<>())](<()<>><()()>)>>]>{{[{<[<>{}]<[]<>>>}<{{<><>}<
{<<<<[((<{({<{<>[]}{<>()}><{<><>){<>()}>}([[[]()][(){}]]<<()<>>{<><>}>)){[{{<>[]}{[]()}}{(<>())
({<<<<[{<{<{(<{}{}><()[]>)[{<>{}}]}>(<[([]{}){<><>}]{<<><>>[()[]]}}<[{()[]}{()[]}][{{}[]}{[][]}]>)}>}]
({({{<{{{[<{{(<><>)}({[]()}{<><>})}{<[{}[]]<[]<>>>[(<>[]){()()}]}><[[<<>()><[][]>]]>]<<[{[[]()](
<{[<([<[({([{(<>{}){()}}<([]<>)[{}{}]>)[[<()[]><{}<>>][(<>{})[()()]]]){<{({}){{}{}}}<{<>()}[[
{((({[{<{[<({[{}()]({}{})}<(<>)(()())>)({[[]{}](<><>)}[<<>[]>[<>[]]])><<[{[]<>}][([][])<[]()>]>(
({[((([<[(<{[(<>[])(()[])]}<[([][])([]<>)]<(()())>>>((([(){}])<(<>())<<><>>>)<[[()<>>{{}{}
[{{((<{[(<{[{{[][]}{<><>}}[[()[]]<[][]>]]<<({}[])((){})>>}>[(<([[]()]<{}[]>)([{}<>])>({<<>[]>(<>[])}[(
((<((<[<(<[{(<[]()>[()[]])((())(()[]))}{[[{}<>]([]{})]<[[]()]>}]>)><([<[<{[]<>}<{}[]>>[[(){}]]]({[[][]]{
[(([([(([<<(<{<>}{[][]}>)[{[()<>]{{}{}}}({{}{}}<[]()>)]>>{([({<><>}<[]>){<{}{}>[()<>]}]<<[[]{}]{{
[(<{<[[{[<<{<[[]<>]<[]()>>{{[]<>}}}><[[{{}()}([]<>)]][({{}<>}{{}{}})<[[][]](()())>]>><<({([]{})<<>{}>}){
<{[<[(<<[[[[{<{}[]><[]<>>](<{}[]>{()[]})](<[<>()][[][]]>([()()]<<>()>))]]({([<()[]>[{}()]])<{[[]()]}{<[][
<{{{([[([{{{<({}[])>}}<<({<>{}}{{}()))<({}{}){[]{}}>>[[(<>())[{}[]]]<<[]{}>{<>[]}>]>}([{[<<
[{<(({{<[{[[([<>{}]{<>{}})(((){})[{}[]])][{<{}<>>}[([]{})<{}>]]]}{<<([<>{}][()[]})[{{}}<{}()>]>(
[((<[{<<[<[{[{{}()}[{}[]]]<[<>[]][{}<>]>}]>]{[([([[]<>]{{}[]})[<(){}>[()[]]]]<<({}[])<[]()>>[(
[{([<{([(({(<[[]<>]>{({}()){<><>}})([([]())[[]<>]])}(<[({}())(<>())]<{()<>}[[]<>]>>)){{([[<><>][()[]>](<[][]>
<<(<<<{{{<<(<<[]<>>{<>()}>[<[]>])<{<{}<>>}{[{}{}]<<>[]>}>><{<<<>{}>({}<>)>}{([()[]]<<>()>)(<<><>><[]{}>)}>><
{[<<[{{(<<[((({}{})[{}{}])(({}<>)[{}()]))]>{([[[(){}]<{}<>>][[{}[]]{()[]}]](<{[]{}}(<>[]>>))}>)}[(<
<{{[[<[[[(((({<><>}{{}{}})<[<>()]([]())>)[<{{}<>}>{((){})[[][]]}]))<{<{[[]()]<[][]>}{<[]<>>(<>
{<[<<([[[[{{<({}<>)<{}()>>[(<>())({}[])]}<{([][])({}<>)}>}(({[<>{}]{[]{}}}<(<>{})>)[<{[][]}{[][]}>{({}()){
[[({{[(((({<{{<><>]}{(<><>){<><>}}>(<[()<>]<{}{}>>((<><>){<>[]}))}{<[[{}[]]([][])][{{}[]}[
[{{<([((<<{(((<><>)<(){}>))((({}[]){<>()})(<{}()}({}{})))}><[<<{<>[]}[()<>]>{[<>{}]{[]()}}>{{
[<{<{{({{<<<{[<><>]<[][]>}<<(){}>(<>)>>>([<{[]()}{{}[]}>{<{}()><[]<>>}]([([]())[[]]]([[]()]<<>{}>)))>
<[{<[(<{{([[<[{}{}]><([]<>)(()())>][<((){})[[]()]>[([]<>){<><>}]]]{<{<[]<>><<>>}{<{}<>><[]{}
{[((((((({([([(){}]([]<>)){[{}](<>[])}]{[<<>()>([]<>)]<<[][]>{[]<>}>})<<[{{}[]}(<><>)]<[()<>]
([({(([[[([[((<>{}){{}{}}]{[()<>]((){})}]((({})(<>[])){[{}{}]<<>()>})]{({(())[<>{}]}((<>{})
{<[<{(<[{<[{(<{}()>)[<<>[]>(()<>)]}([{()[]}<{}<>>])}(({<[]{}><{}{}>}([[]<>]{{}()})){[[{}<>]
<<({[[<<[([(<[<><>]{<>{}}>{<(){}>(()())})<{[<>{}]<()[]>}>]<{[{<>{}}<<>()>]<{{}()}[()<>]>}<[[{}<>][{

66
2021/d11/ex1/ex1.py Executable file
View file

@ -0,0 +1,66 @@
#!/usr/bin/env python
import itertools
import sys
from copy import deepcopy
from typing import Iterator, List, Set, Tuple
Grid = List[List[int]]
Point = Tuple[int, int]
def solve(input: List[str]) -> int:
levels = [[int(c) for c in line] for line in input]
def step(levels: Grid) -> Tuple[Grid, int]:
# First step, increase levels
levels = [[l + 1 for l in line] for line in levels]
def excited(levels: Grid) -> Set[Point]:
return set(
(i, j)
for i in range(len(levels))
for j in range(len(levels[i]))
if levels[i][j] > 9
)
def neighbours_of(point: Point) -> Iterator[Point]:
for dx, dy in itertools.product((-1, 0, 1), repeat=2):
if dx == 0 and dy == 0:
continue
x = point[0] + dx
y = point[1] + dy
if x < 0 or x >= len(levels):
continue
if y < 0 or y >= len(levels[x]):
continue
yield x, y
# Second step, do flashes
has_flashed: Set[Point] = set()
while len(flashes := (excited(levels) - has_flashed)) > 0:
for (i, j) in flashes:
has_flashed.add((i, j))
for x, y in neighbours_of((i, j)):
levels[x][y] += 1
# Finally, bring back energy levels to 0
for i, j in has_flashed:
levels[i][j] = 0
return levels, len(has_flashed)
res = 0
for __ in range(100):
levels, flashes = step(levels)
res += flashes
return res
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

10
2021/d11/ex1/input Normal file
View file

@ -0,0 +1,10 @@
4341347643
5477728451
2322733878
5453762556
2718123421
4237886115
5631617114
2217667227
4236581255
4482627641

67
2021/d11/ex2/ex2.py Executable file
View file

@ -0,0 +1,67 @@
#!/usr/bin/env python
import itertools
import sys
from copy import deepcopy
from typing import Iterator, List, Set, Tuple
Grid = List[List[int]]
Point = Tuple[int, int]
def solve(input: List[str]) -> int:
levels = [[int(c) for c in line] for line in input]
def step(levels: Grid) -> Tuple[Grid, int]:
# First step, increase levels
levels = [[l + 1 for l in line] for line in levels]
def excited(levels: Grid) -> Set[Point]:
return set(
(i, j)
for i in range(len(levels))
for j in range(len(levels[i]))
if levels[i][j] > 9
)
def neighbours_of(point: Point) -> Iterator[Point]:
for dx, dy in itertools.product((-1, 0, 1), repeat=2):
if dx == 0 and dy == 0:
continue
x = point[0] + dx
y = point[1] + dy
if x < 0 or x >= len(levels):
continue
if y < 0 or y >= len(levels[x]):
continue
yield x, y
# Second step, do flashes
has_flashed: Set[Point] = set()
while len(flashes := (excited(levels) - has_flashed)) > 0:
for (i, j) in flashes:
has_flashed.add((i, j))
for x, y in neighbours_of((i, j)):
levels[x][y] += 1
# Finally, bring back energy levels to 0
for i, j in has_flashed:
levels[i][j] = 0
return levels, len(has_flashed)
for i in itertools.count(1):
levels, flashes = step(levels)
if flashes == len(list(itertools.chain.from_iterable(levels))):
return i
assert False # Sanity check
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

10
2021/d11/ex2/input Normal file
View file

@ -0,0 +1,10 @@
4341347643
5477728451
2322733878
5453762556
2718123421
4237886115
5631617114
2217667227
4236581255
4482627641

46
2021/d12/ex1/ex1.py Executable file
View file

@ -0,0 +1,46 @@
#!/usr/bin/env python
import itertools
import sys
from collections import defaultdict
from typing import Dict, List, Set
Map = Dict[str, Set[str]]
def solve(input: List[str]) -> int:
def parse() -> Map:
res: Map = defaultdict(set)
for (start, to) in map(lambda s: s.split("-"), input):
res[start].add(to)
res[to].add(start)
return res
caves = parse()
def dfs(start: str, seen: Set[str] = set()) -> int:
if start == "end":
return 1
seen = seen | {start}
res = 0
for dest in caves[start]:
if dest in seen and dest.islower():
continue
res += dfs(dest, seen)
return res
return dfs("start")
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

22
2021/d12/ex1/input Normal file
View file

@ -0,0 +1,22 @@
ax-end
xq-GF
end-xq
im-wg
ax-ie
start-ws
ie-ws
CV-start
ng-wg
ng-ie
GF-ng
ng-av
CV-end
ie-GF
CV-ie
im-xq
start-GF
GF-ws
wg-LY
CV-ws
im-CV
CV-wg

49
2021/d12/ex2/ex2.py Executable file
View file

@ -0,0 +1,49 @@
#!/usr/bin/env python
import itertools
import sys
from collections import defaultdict
from typing import Dict, List, Set
Map = Dict[str, Set[str]]
def solve(input: List[str]) -> int:
def parse() -> Map:
res: Map = defaultdict(set)
for (start, to) in map(lambda s: s.split("-"), input):
res[start].add(to)
res[to].add(start)
return res
caves = parse()
def dfs(start: str, seen: Set[str] = set(), has_doubled_back: bool = False) -> int:
if start == "end":
return 1
seen = seen | {start}
res = 0
for dest in caves[start]:
doubles_back = False
if dest in seen and dest.islower():
if has_doubled_back or dest == "start":
continue
doubles_back = True
res += dfs(dest, seen, has_doubled_back or doubles_back)
return res
return dfs("start")
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

22
2021/d12/ex2/input Normal file
View file

@ -0,0 +1,22 @@
ax-end
xq-GF
end-xq
im-wg
ax-ie
start-ws
ie-ws
CV-start
ng-wg
ng-ie
GF-ng
ng-av
CV-end
ie-GF
CV-ie
im-xq
start-GF
GF-ws
wg-LY
CV-ws
im-CV
CV-wg

71
2021/d13/ex1/ex1.py Executable file
View file

@ -0,0 +1,71 @@
#!/usr/bin/env python
import itertools
import sys
from copy import deepcopy
from typing import Iterable, List, Tuple, cast
Paper = List[List[bool]]
Instruction = Tuple[str, int]
def solve(input: List[str]) -> int:
def transpose(paper: Paper) -> Paper:
return cast(Paper, list(zip(*paper)))
def fold_along_y(paper: Paper, y: int) -> Paper:
assert not any(paper[y]) # Sanity check
assert y >= len(paper) // 2 # Ensure that we can actually fold the paper
paper = deepcopy(paper)
for i, j in zip(itertools.count(y, -1), range(y, len(paper))):
paper[i] = [(dot_i or dot_j) for dot_i, dot_j in zip(paper[i], paper[j])]
paper = paper[:y]
return paper
def fold_along_x(paper: Paper, x: int) -> Paper:
return transpose(fold_along_y(transpose(paper), x))
def do_folds(paper: Paper, instructions: Iterable[Instruction]) -> Paper:
for axis, n in instructions:
if axis == "x":
paper = fold_along_x(paper, n)
elif axis == "y":
paper = fold_along_y(paper, n)
else:
assert False # Sanity check
return paper
def parse() -> Tuple[Paper, List[Instruction]]:
paper_part = itertools.takewhile(lambda s: s != "", input)
fold_part = itertools.islice(
itertools.dropwhile(lambda s: s != "", input), 1, None
)
points = {(int(x), int(y)) for x, y in map(lambda s: s.split(","), paper_part)}
folds = [
(axis[-1], int(n)) for axis, n in map(lambda s: s.split("="), fold_part)
]
width, height = max(p[0] for p in points), max(p[1] for p in points)
paper = [
[(x, y) in points for x in range(width + 1)] for y in range(height + 1)
]
return paper, folds
paper, instructions = parse()
return sum(itertools.chain.from_iterable(do_folds(paper, instructions[:1])))
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
print(solve(input))
if __name__ == "__main__":
main()

890
2021/d13/ex1/input Normal file
View file

@ -0,0 +1,890 @@
1159,502
291,184
850,631
460,631
301,707
768,56
654,829
582,466
490,276
261,3
793,35
559,453
497,288
594,275
458,264
1044,387
654,842
925,22
688,72
224,833
1228,2
1034,487
420,830
172,717
1049,198
669,305
1168,49
157,304
90,669
1036,1
118,549
1084,593
268,61
909,294
467,74
1114,632
1066,609
1058,602
271,35
474,299
1173,35
75,864
470,543
176,100
485,736
199,332
23,634
654,329
748,526
274,395
378,474
910,673
1012,810
383,859
1163,5
353,291
741,383
631,241
179,436
793,75
495,324
321,169
1087,278
1302,361
1232,572
417,317
960,161
1088,642
1161,613
631,653
94,327
244,733
857,549
572,220
75,337
259,5
1235,192
805,393
126,68
1250,723
580,68
397,441
1297,165
700,82
1200,275
214,56
932,711
676,126
676,320
169,388
1049,3
25,319
1218,215
179,217
681,635
512,574
966,371
1124,282
387,444
930,644
179,781
192,247
1061,290
500,557
378,54
855,159
585,891
358,295
545,234
1287,429
425,648
416,579
1255,99
59,290
768,585
1126,733
253,600
1235,332
852,184
223,357
1143,585
1096,36
1125,194
95,677
885,768
870,820
165,527
1201,660
465,291
387,702
1041,872
502,316
358,814
435,747
1217,439
177,113
505,781
850,746
343,38
499,530
85,789
1285,563
321,541
45,15
1295,669
1285,393
363,262
271,347
646,809
1143,794
505,753
224,201
50,420
2,297
507,312
823,100
222,252
1007,241
1116,157
274,499
505,617
1036,137
987,623
22,105
30,239
244,609
835,333
1019,184
572,443
134,613
348,263
927,35
500,625
421,807
763,595
277,838
856,54
1310,52
855,287
166,628
1155,684
609,327
445,892
1116,640
159,346
1116,478
1116,849
982,565
1232,754
1163,337
0,136
422,455
1049,451
857,345
59,640
688,822
507,582
351,485
294,744
1218,383
751,665
969,761
50,165
1253,358
393,59
629,331
550,842
30,80
505,113
731,30
641,761
513,780
221,543
1131,561
1072,315
252,602
87,556
1148,282
902,61
276,308
35,250
1057,600
403,785
113,502
805,501
0,86
1028,364
428,301
1305,353
616,645
199,607
744,68
350,385
412,530
574,554
713,806
1193,327
923,514
952,743
542,586
890,830
378,26
0,394
214,523
335,210
75,30
845,282
395,357
1285,187
597,806
160,154
589,760
52,843
654,117
711,170
137,78
1130,595
959,37
1220,690
797,252
923,444
1285,259
55,99
980,638
641,305
781,549
1126,768
184,161
915,477
731,702
888,868
537,194
738,219
1288,777
982,285
1087,357
595,254
1288,161
266,21
1310,136
1144,745
1111,562
671,893
1198,756
1176,389
1123,372
748,831
1168,400
810,886
805,141
705,614
269,760
417,126
1044,313
1228,226
1158,204
288,645
870,504
266,313
1253,470
954,84
134,806
420,694
348,711
957,623
1285,271
1007,485
428,593
494,493
1051,5
274,698
852,150
1216,327
559,477
522,625
691,644
261,787
823,346
773,775
907,254
1288,789
728,466
559,665
664,809
833,656
258,679
422,474
877,95
1253,246
822,709
224,542
154,456
502,302
171,231
1253,872
1260,824
256,176
372,364
358,743
1056,225
1049,787
1168,285
679,465
157,590
214,820
1051,89
652,358
192,80
888,474
679,241
430,201
681,53
572,668
626,501
724,663
78,98
639,229
591,495
798,721
494,857
437,10
1131,312
1028,194
72,428
1014,151
229,117
1086,835
923,892
515,485
485,288
366,249
1088,252
745,390
266,425
880,649
952,814
656,329
865,78
440,504
397,889
706,294
1096,56
177,672
900,285
154,785
803,582
1126,126
174,466
438,171
658,760
57,694
962,183
440,820
57,134
1138,774
430,733
107,756
1149,600
1242,889
997,57
1156,886
331,497
947,856
671,445
658,358
1118,169
1156,456
276,488
873,884
267,10
880,61
805,589
944,249
412,812
326,394
1265,816
460,74
562,526
377,56
552,61
291,698
822,194
959,241
656,758
1071,332
22,341
565,504
1052,679
1091,299
1217,639
852,296
1268,394
738,883
1238,225
938,194
811,124
1039,347
507,648
460,737
1019,849
177,841
798,270
319,684
915,865
117,226
1006,509
274,163
561,535
497,606
585,3
185,52
30,814
348,183
221,799
395,477
749,887
957,603
1014,631
1310,842
723,473
214,717
1290,768
50,40
1087,2
797,556
425,768
1163,785
387,514
1302,809
813,606
649,786
189,719
343,843
947,262
992,439
93,639
261,451
13,133
932,837
1153,590
582,109
1053,565
922,581
634,320
311,856
1176,281
1265,368
460,605
1084,301
1144,73
341,837
706,729
303,485
445,450
960,385
353,603
1151,122
160,37
564,690
798,574
1049,891
885,563
363,710
879,537
840,49
751,229
1285,779
868,562
353,623
1059,109
269,134
257,329
788,711
462,590
74,490
706,600
602,753
229,246
602,312
1144,628
646,231
1288,105
566,826
619,625
440,717
536,549
1275,250
477,501
1168,721
907,108
708,507
1039,547
13,729
93,455
1118,647
1161,165
74,378
417,518
142,721
967,843
1307,436
947,710
699,773
1280,814
425,200
1260,138
110,395
356,84
1310,381
1146,86
522,631
110,499
5,353
629,563
1242,679
840,319
276,756
134,358
1287,689
152,690
1260,698
217,682
1034,57
440,522
201,773
1193,567
870,729
1253,424
301,719
8,533
738,443
706,165
475,458
256,718
298,875
999,856
894,740
105,246
420,679
668,810
1073,765
301,603
853,756
763,138
991,796
954,19
400,428
1144,266
323,497
938,364
708,312
462,395
870,74
52,644
982,665
1066,40
433,95
421,535
1230,788
997,110
1019,698
161,600
1094,420
559,417
923,702
1022,645
166,821
505,841
162,282
773,119
90,690
977,786
586,231
223,892
457,756
1232,322
512,721
137,443
1201,234
979,49
1258,283
97,246
422,868
1009,187
889,87
251,416
1202,492
1302,533
763,756
597,424
311,221
313,589
1253,134
810,557
1235,30
356,19
982,829
1145,527
132,30
885,648
654,381
654,65
234,816
458,710
1111,332
1019,710
331,49
561,7
440,281
360,150
261,198
440,165
412,59
1131,582
78,754
1009,164
587,501
1029,773
746,690
50,600
1260,756
117,327
257,441
582,557
89,481
400,669
216,249
701,190
50,196
1302,737
933,838
421,87
82,674
80,554
951,30
1089,799
1163,458
562,816
1141,836
65,507
110,691
162,612
189,368
490,170
634,520
179,582
656,198
160,857
1041,760
549,205
994,712
1236,516
1280,239
201,121
706,586
1131,436
629,501
237,70
1285,331
898,82
1230,554
350,161
59,254
945,194
1071,780
1034,308
878,833
1220,669
1049,835
1043,10
142,46
403,109
599,547
403,640
872,723
351,37
562,511
1131,113
462,695
1252,315
179,333
842,282
460,254
887,665
184,768
529,549
269,872
1096,717
117,345
1089,95
159,122
475,436
803,246
597,312
605,614
751,417
542,56
751,453
1015,702
713,760
822,681
595,640
895,108
1056,18
1220,231
1150,717
1173,443
269,470
147,5
214,726
667,0
1243,537
159,621
349,170
1305,338
388,581
611,773
160,149
1228,450
550,700
875,747
305,668
1173,3
418,679
102,833
500,886
1148,612
923,436
894,154
813,288
996,660
922,469
55,302
902,891
1168,718
403,108
490,808
458,184
857,247
678,553
662,887
149,165
1238,785
805,672
520,389
1202,402
1101,700
870,372
1193,119
788,631
734,572
793,371
661,556
1168,848
224,352
505,277
562,368
11,0
888,455
1131,781
865,892
1006,52
298,19
714,385
209,700
803,436
7,679
579,702
522,263
1150,269
1252,586
160,73
1238,428
103,380
1278,374
808,578
169,288
495,845
668,84
137,451
338,182
850,737
587,393
721,555
1275,698
741,105
774,866
803,648
1039,35
1253,200
1303,679
831,278
843,633
421,439
78,572
576,572
852,710
259,889
416,740
294,150
184,817
678,777
994,182
442,562
393,3
885,200
669,761
1150,149
1034,474
542,585
189,67
820,276
65,339
31,416
209,567
502,578
1081,648
445,78
1118,247
217,458
336,455
1126,817
805,753
331,677
25,331
336,439
92,158
960,733
137,603
174,428
734,140
460,157
43,569
58,586
196,632
313,784
199,287
fold along x=655
fold along y=447
fold along x=327
fold along y=223
fold along x=163
fold along y=111
fold along x=81
fold along y=55
fold along x=40
fold along y=27
fold along y=13
fold along y=6

75
2021/d13/ex2/ex2.py Executable file
View file

@ -0,0 +1,75 @@
#!/usr/bin/env python
import itertools
import sys
from copy import deepcopy
from typing import Iterable, List, Tuple, cast
Paper = List[List[bool]]
Instruction = Tuple[str, int]
def solve(input: List[str]) -> None:
def transpose(paper: Paper) -> Paper:
return cast(Paper, list(zip(*paper)))
def fold_along_y(paper: Paper, y: int) -> Paper:
assert not any(paper[y]) # Sanity check
assert y >= len(paper) // 2 # Ensure that we can actually fold the paper
paper = deepcopy(paper)
for i, j in zip(itertools.count(y, -1), range(y, len(paper))):
paper[i] = [(dot_i or dot_j) for dot_i, dot_j in zip(paper[i], paper[j])]
paper = paper[:y]
return paper
def fold_along_x(paper: Paper, x: int) -> Paper:
return transpose(fold_along_y(transpose(paper), x))
def do_folds(paper: Paper, instructions: Iterable[Instruction]) -> Paper:
for axis, n in instructions:
if axis == "x":
paper = fold_along_x(paper, n)
elif axis == "y":
paper = fold_along_y(paper, n)
else:
assert False # Sanity check
return paper
def parse() -> Tuple[Paper, List[Instruction]]:
paper_part = itertools.takewhile(lambda s: s != "", input)
fold_part = itertools.islice(
itertools.dropwhile(lambda s: s != "", input), 1, None
)
points = {(int(x), int(y)) for x, y in map(lambda s: s.split(","), paper_part)}
folds = [
(axis[-1], int(n)) for axis, n in map(lambda s: s.split("="), fold_part)
]
width, height = max(p[0] for p in points), max(p[1] for p in points)
paper = [
[(x, y) in points for x in range(width + 1)] for y in range(height + 1)
]
return paper, folds
def dump(paper: Paper) -> None:
for line in paper:
print("".join("#" if dot else "." for dot in line))
paper, instructions = parse()
dump(do_folds(paper, instructions))
def main() -> None:
input = [line.strip() for line in sys.stdin.readlines()]
solve(input)
if __name__ == "__main__":
main()

890
2021/d13/ex2/input Normal file
View file

@ -0,0 +1,890 @@
1159,502
291,184
850,631
460,631
301,707
768,56
654,829
582,466
490,276
261,3
793,35
559,453
497,288
594,275
458,264
1044,387
654,842
925,22
688,72
224,833
1228,2
1034,487
420,830
172,717
1049,198
669,305
1168,49
157,304
90,669
1036,1
118,549
1084,593
268,61
909,294
467,74
1114,632
1066,609
1058,602
271,35
474,299
1173,35
75,864
470,543
176,100
485,736
199,332
23,634
654,329
748,526
274,395
378,474
910,673
1012,810
383,859
1163,5
353,291
741,383
631,241
179,436
793,75
495,324
321,169
1087,278
1302,361
1232,572
417,317
960,161
1088,642
1161,613
631,653
94,327
244,733
857,549
572,220
75,337
259,5
1235,192
805,393
126,68
1250,723
580,68
397,441
1297,165
700,82
1200,275
214,56
932,711
676,126
676,320
169,388
1049,3
25,319
1218,215
179,217
681,635
512,574
966,371
1124,282
387,444
930,644
179,781
192,247
1061,290
500,557
378,54
855,159
585,891
358,295
545,234
1287,429
425,648
416,579
1255,99
59,290
768,585
1126,733
253,600
1235,332
852,184
223,357
1143,585
1096,36
1125,194
95,677
885,768
870,820
165,527
1201,660
465,291
387,702
1041,872
502,316
358,814
435,747
1217,439
177,113
505,781
850,746
343,38
499,530
85,789
1285,563
321,541
45,15
1295,669
1285,393
363,262
271,347
646,809
1143,794
505,753
224,201
50,420
2,297
507,312
823,100
222,252
1007,241
1116,157
274,499
505,617
1036,137
987,623
22,105
30,239
244,609
835,333
1019,184
572,443
134,613
348,263
927,35
500,625
421,807
763,595
277,838
856,54
1310,52
855,287
166,628
1155,684
609,327
445,892
1116,640
159,346
1116,478
1116,849
982,565
1232,754
1163,337
0,136
422,455
1049,451
857,345
59,640
688,822
507,582
351,485
294,744
1218,383
751,665
969,761
50,165
1253,358
393,59
629,331
550,842
30,80
505,113
731,30
641,761
513,780
221,543
1131,561
1072,315
252,602
87,556
1148,282
902,61
276,308
35,250
1057,600
403,785
113,502
805,501
0,86
1028,364
428,301
1305,353
616,645
199,607
744,68
350,385
412,530
574,554
713,806
1193,327
923,514
952,743
542,586
890,830
378,26
0,394
214,523
335,210
75,30
845,282
395,357
1285,187
597,806
160,154
589,760
52,843
654,117
711,170
137,78
1130,595
959,37
1220,690
797,252
923,444
1285,259
55,99
980,638
641,305
781,549
1126,768
184,161
915,477
731,702
888,868
537,194
738,219
1288,777
982,285
1087,357
595,254
1288,161
266,21
1310,136
1144,745
1111,562
671,893
1198,756
1176,389
1123,372
748,831
1168,400
810,886
805,141
705,614
269,760
417,126
1044,313
1228,226
1158,204
288,645
870,504
266,313
1253,470
954,84
134,806
420,694
348,711
957,623
1285,271
1007,485
428,593
494,493
1051,5
274,698
852,150
1216,327
559,477
522,625
691,644
261,787
823,346
773,775
907,254
1288,789
728,466
559,665
664,809
833,656
258,679
422,474
877,95
1253,246
822,709
224,542
154,456
502,302
171,231
1253,872
1260,824
256,176
372,364
358,743
1056,225
1049,787
1168,285
679,465
157,590
214,820
1051,89
652,358
192,80
888,474
679,241
430,201
681,53
572,668
626,501
724,663
78,98
639,229
591,495
798,721
494,857
437,10
1131,312
1028,194
72,428
1014,151
229,117
1086,835
923,892
515,485
485,288
366,249
1088,252
745,390
266,425
880,649
952,814
656,329
865,78
440,504
397,889
706,294
1096,56
177,672
900,285
154,785
803,582
1126,126
174,466
438,171
658,760
57,694
962,183
440,820
57,134
1138,774
430,733
107,756
1149,600
1242,889
997,57
1156,886
331,497
947,856
671,445
658,358
1118,169
1156,456
276,488
873,884
267,10
880,61
805,589
944,249
412,812
326,394
1265,816
460,74
562,526
377,56
552,61
291,698
822,194
959,241
656,758
1071,332
22,341
565,504
1052,679
1091,299
1217,639
852,296
1268,394
738,883
1238,225
938,194
811,124
1039,347
507,648
460,737
1019,849
177,841
798,270
319,684
915,865
117,226
1006,509
274,163
561,535
497,606
585,3
185,52
30,814
348,183
221,799
395,477
749,887
957,603
1014,631
1310,842
723,473
214,717
1290,768
50,40
1087,2
797,556
425,768
1163,785
387,514
1302,809
813,606
649,786
189,719
343,843
947,262
992,439
93,639
261,451
13,133
932,837
1153,590
582,109
1053,565
922,581
634,320
311,856
1176,281
1265,368
460,605
1084,301
1144,73
341,837
706,729
303,485
445,450
960,385
353,603
1151,122
160,37
564,690
798,574
1049,891
885,563
363,710
879,537
840,49
751,229
1285,779
868,562
353,623
1059,109
269,134
257,329
788,711
462,590
74,490
706,600
602,753
229,246
602,312
1144,628
646,231
1288,105
566,826
619,625
440,717
536,549
1275,250
477,501
1168,721
907,108
708,507
1039,547
13,729
93,455
1118,647
1161,165
74,378
417,518
142,721
967,843
1307,436
947,710
699,773
1280,814
425,200
1260,138
110,395
356,84
1310,381
1146,86
522,631
110,499
5,353
629,563
1242,679
840,319
276,756
134,358
1287,689
152,690
1260,698
217,682
1034,57
440,522
201,773
1193,567
870,729
1253,424
301,719
8,533
738,443
706,165
475,458
256,718
298,875
999,856
894,740
105,246
420,679
668,810
1073,765
301,603
853,756
763,138
991,796
954,19
400,428
1144,266
323,497
938,364
708,312
462,395
870,74
52,644
982,665
1066,40
433,95
421,535
1230,788
997,110
1019,698
161,600
1094,420
559,417
923,702
1022,645
166,821
505,841
162,282
773,119
90,690
977,786
586,231
223,892
457,756
1232,322
512,721
137,443
1201,234
979,49
1258,283
97,246
422,868
1009,187
889,87
251,416
1202,492
1302,533
763,756
597,424
311,221
313,589
1253,134
810,557
1235,30
356,19
982,829
1145,527
132,30
885,648
654,381
654,65
234,816
458,710
1111,332
1019,710
331,49
561,7
440,281
360,150
261,198
440,165
412,59
1131,582
78,754
1009,164
587,501
1029,773
746,690
50,600
1260,756
117,327
257,441
582,557
89,481
400,669
216,249
701,190
50,196
1302,737
933,838
421,87
82,674
80,554
951,30
1089,799
1163,458
562,816
1141,836
65,507
110,691
162,612
189,368
490,170
634,520
179,582
656,198
160,857
1041,760
549,205
994,712
1236,516
1280,239
201,121
706,586
1131,436
629,501
237,70
1285,331
898,82
1230,554
350,161
59,254
945,194
1071,780
1034,308
878,833
1220,669
1049,835
1043,10
142,46
403,109
599,547
403,640
872,723
351,37
562,511
1131,113
462,695
1252,315
179,333
842,282
460,254
887,665
184,768
529,549
269,872
1096,717
117,345
1089,95
159,122
475,436
803,246
597,312
605,614
751,417
542,56
751,453
1015,702
713,760
822,681
595,640
895,108
1056,18
1220,231
1150,717
1173,443
269,470
147,5
214,726
667,0
1243,537
159,621
349,170
1305,338
388,581
611,773
160,149
1228,450
550,700
875,747
305,668
1173,3
418,679
102,833
500,886
1148,612
923,436
894,154
813,288
996,660
922,469
55,302
902,891
1168,718
403,108
490,808
458,184
857,247
678,553
662,887
149,165
1238,785
805,672
520,389
1202,402
1101,700
870,372
1193,119
788,631
734,572
793,371
661,556
1168,848
224,352
505,277
562,368
11,0
888,455
1131,781
865,892
1006,52
298,19
714,385
209,700
803,436
7,679
579,702
522,263
1150,269
1252,586
160,73
1238,428
103,380
1278,374
808,578
169,288
495,845
668,84
137,451
338,182
850,737
587,393
721,555
1275,698
741,105
774,866
803,648
1039,35
1253,200
1303,679
831,278
843,633
421,439
78,572
576,572
852,710
259,889
416,740
294,150
184,817
678,777
994,182
442,562
393,3
885,200
669,761
1150,149
1034,474
542,585
189,67
820,276
65,339
31,416
209,567
502,578
1081,648
445,78
1118,247
217,458
336,455
1126,817
805,753
331,677
25,331
336,439
92,158
960,733
137,603
174,428
734,140
460,157
43,569
58,586
196,632
313,784
199,287
fold along x=655
fold along y=447
fold along x=327
fold along y=223
fold along x=163
fold along y=111
fold along x=81
fold along y=55
fold along x=40
fold along y=27
fold along y=13
fold along y=6