Added 2021 (python)
This commit is contained in:
parent
410815acf8
commit
11600f7ba9
1
2021/.gitignore
vendored
Normal file
1
2021/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
__pycache__/
|
19
2021/00_template/prog.py
Normal file
19
2021/00_template/prog.py
Normal file
@ -0,0 +1,19 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return [int(line.strip()) for line in f.readlines()]
|
||||
|
||||
|
||||
def result(inp, part = 1):
|
||||
res = 0;
|
||||
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 1))
|
10
2021/00_template/test.py
Normal file
10
2021/00_template/test.py
Normal file
@ -0,0 +1,10 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 7)
|
||||
|
||||
# def test_part2(self):
|
||||
# self.assertEqual(result(get_input(sample = True), part = 2), 5)
|
||||
|
2000
2021/01/input
Normal file
2000
2021/01/input
Normal file
File diff suppressed because it is too large
Load Diff
25
2021/01/prog.py
Normal file
25
2021/01/prog.py
Normal file
@ -0,0 +1,25 @@
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return [int(line.strip()) for line in f.readlines()]
|
||||
|
||||
|
||||
def result(inp, part = 1):
|
||||
res = 0;
|
||||
if part == 1:
|
||||
prev = inp[0]
|
||||
for cur in inp[1:]:
|
||||
if prev <= cur:
|
||||
res += 1;
|
||||
prev = cur;
|
||||
else:
|
||||
prev = 0
|
||||
for cur in range(1, len(inp) - 2):
|
||||
if sum(inp[prev:prev+3]) < sum(inp[cur:cur+3]):
|
||||
res += 1;
|
||||
prev = cur;
|
||||
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(result(get_input(), part = 2))
|
10
2021/01/sample_p1
Normal file
10
2021/01/sample_p1
Normal file
@ -0,0 +1,10 @@
|
||||
199
|
||||
200
|
||||
208
|
||||
210
|
||||
200
|
||||
207
|
||||
240
|
||||
269
|
||||
260
|
||||
263
|
10
2021/01/test.py
Normal file
10
2021/01/test.py
Normal file
@ -0,0 +1,10 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 7)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 5)
|
||||
|
1000
2021/02/input
Normal file
1000
2021/02/input
Normal file
File diff suppressed because it is too large
Load Diff
32
2021/02/prog.py
Normal file
32
2021/02/prog.py
Normal file
@ -0,0 +1,32 @@
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
tmp = [line.strip().split(' ') for line in f.readlines()]
|
||||
return [[e[0], int(e[1])] for e in tmp]
|
||||
|
||||
|
||||
def result(inp, part = 1):
|
||||
hor = dep = 0
|
||||
if part == 1:
|
||||
for [cmd, n] in inp:
|
||||
if cmd == "forward":
|
||||
hor += n
|
||||
elif cmd == "down":
|
||||
dep += n
|
||||
elif cmd == "up":
|
||||
dep -= n
|
||||
else:
|
||||
aim = 0
|
||||
for [cmd, n] in inp:
|
||||
if cmd == "forward":
|
||||
hor += n
|
||||
dep += n * aim
|
||||
elif cmd == "down":
|
||||
aim += n
|
||||
elif cmd == "up":
|
||||
aim -= n
|
||||
# print(f"{cmd} {n}")
|
||||
# print(f"\t{aim = }, {hor = }, {dep = }")
|
||||
return hor * dep
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(result(get_input(), part = 2))
|
6
2021/02/sample_p1
Normal file
6
2021/02/sample_p1
Normal file
@ -0,0 +1,6 @@
|
||||
forward 5
|
||||
down 5
|
||||
forward 8
|
||||
up 3
|
||||
down 8
|
||||
forward 2
|
10
2021/02/test.py
Normal file
10
2021/02/test.py
Normal file
@ -0,0 +1,10 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(True)), 150)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(True), 2), 900)
|
||||
|
1000
2021/03/input
Normal file
1000
2021/03/input
Normal file
File diff suppressed because it is too large
Load Diff
55
2021/03/prog.py
Normal file
55
2021/03/prog.py
Normal file
@ -0,0 +1,55 @@
|
||||
VERBOSE = False
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
global n_bits
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
tmp = f.readlines()
|
||||
n_bits = len(tmp[0]) - 1
|
||||
return [int(line.strip(), 2) for line in tmp]
|
||||
|
||||
def verbose(s):
|
||||
if VERBOSE:
|
||||
print(s)
|
||||
|
||||
|
||||
def filter_by(most, inp):
|
||||
global n_bits
|
||||
for i in range(n_bits - 1, -1, -1):
|
||||
dic = {0: [], 1: []}
|
||||
for n in inp:
|
||||
dic[(n >> i) & 1].append(n)
|
||||
|
||||
verbose(dic)
|
||||
if len(dic[1]) >= len(dic[0]):
|
||||
inp = dic[1 if most else 0][:]
|
||||
else:
|
||||
inp = dic[0 if most else 1][:]
|
||||
|
||||
if len(inp) == 1:
|
||||
return inp[0]
|
||||
|
||||
def result(inp, part = 1):
|
||||
global n_bits
|
||||
if part == 1:
|
||||
# print(n_bits)
|
||||
tot = len(inp)
|
||||
gamma = eps = 0
|
||||
for i in range(n_bits):
|
||||
ones = 0
|
||||
for n in inp:
|
||||
ones += (n >> i) & 1
|
||||
|
||||
a = 1 if ones > tot/2 else 0
|
||||
gamma |= a << i
|
||||
|
||||
eps = (2**n_bits - 1) ^ gamma
|
||||
return eps * gamma
|
||||
else:
|
||||
ox = filter_by(True, inp)
|
||||
co = filter_by(False, inp)
|
||||
verbose(f"{ox = }, {co = }")
|
||||
return ox * co
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(result(get_input(), part = 2))
|
12
2021/03/sample_p1
Normal file
12
2021/03/sample_p1
Normal file
@ -0,0 +1,12 @@
|
||||
00100
|
||||
11110
|
||||
10110
|
||||
10111
|
||||
10101
|
||||
01111
|
||||
00111
|
||||
11100
|
||||
10000
|
||||
11001
|
||||
00010
|
||||
01010
|
13
2021/03/test.py
Normal file
13
2021/03/test.py
Normal file
@ -0,0 +1,13 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_input(self):
|
||||
self.assertEqual(get_input(sample = True), [4, 30, 22, 23, 21, 15, 7, 28, 16, 25, 2, 10])
|
||||
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 198)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 230)
|
||||
|
601
2021/04/input
Normal file
601
2021/04/input
Normal file
@ -0,0 +1,601 @@
|
||||
79,9,13,43,53,51,40,47,56,27,0,14,33,60,61,36,72,48,83,42,10,86,41,75,16,80,15,93,95,45,68,96,84,11,85,63,18,31,35,74,71,91,39,88,55,6,21,12,58,29,69,37,44,98,89,78,17,64,59,76,54,30,65,82,28,50,32,77,66,24,1,70,92,23,8,49,38,73,94,26,22,34,97,25,87,19,57,7,2,3,46,67,90,62,20,5,52,99,81,4
|
||||
|
||||
7 42 22 92 60
|
||||
8 88 99 13 12
|
||||
16 62 86 24 77
|
||||
20 57 19 67 46
|
||||
36 83 54 63 82
|
||||
|
||||
7 86 50 78 16
|
||||
83 45 67 94 58
|
||||
21 98 99 85 43
|
||||
71 19 31 22 4
|
||||
70 51 34 11 61
|
||||
|
||||
4 95 84 51 36
|
||||
43 40 37 23 85
|
||||
14 90 8 59 99
|
||||
0 88 68 93 81
|
||||
25 6 55 19 48
|
||||
|
||||
15 39 78 6 13
|
||||
71 3 81 95 62
|
||||
22 46 67 72 40
|
||||
89 69 0 37 41
|
||||
68 79 58 16 42
|
||||
|
||||
63 50 77 34 12
|
||||
29 42 20 17 47
|
||||
80 10 30 72 66
|
||||
5 89 64 25 21
|
||||
91 88 45 44 37
|
||||
|
||||
78 89 32 26 56
|
||||
8 40 54 25 49
|
||||
36 30 21 23 3
|
||||
12 58 2 29 7
|
||||
33 99 15 84 44
|
||||
|
||||
96 68 56 49 43
|
||||
55 22 16 91 32
|
||||
2 17 61 12 37
|
||||
25 72 1 31 88
|
||||
57 34 42 8 71
|
||||
|
||||
18 39 86 94 60
|
||||
96 85 64 51 28
|
||||
48 14 23 36 35
|
||||
6 84 99 90 81
|
||||
43 41 74 68 32
|
||||
|
||||
9 58 60 7 61
|
||||
96 33 67 0 19
|
||||
77 2 14 99 79
|
||||
13 36 90 95 29
|
||||
86 91 49 72 20
|
||||
|
||||
3 79 24 37 97
|
||||
86 10 77 31 32
|
||||
48 89 35 73 94
|
||||
65 21 23 82 36
|
||||
26 51 69 12 99
|
||||
|
||||
66 28 73 6 32
|
||||
11 30 35 42 76
|
||||
33 40 25 89 52
|
||||
46 88 55 50 64
|
||||
86 71 75 36 80
|
||||
|
||||
36 34 35 68 49
|
||||
61 3 24 84 71
|
||||
47 42 91 39 80
|
||||
25 51 38 59 62
|
||||
90 21 28 52 8
|
||||
|
||||
19 93 45 40 55
|
||||
41 11 79 9 70
|
||||
16 87 32 22 94
|
||||
12 4 72 60 0
|
||||
36 77 78 33 83
|
||||
|
||||
43 44 7 39 96
|
||||
30 75 62 63 8
|
||||
19 12 40 68 45
|
||||
50 27 3 52 57
|
||||
85 67 33 16 36
|
||||
|
||||
33 16 66 9 7
|
||||
93 34 52 31 13
|
||||
3 49 94 39 37
|
||||
76 59 78 51 83
|
||||
40 47 22 42 73
|
||||
|
||||
44 60 52 7 38
|
||||
36 53 79 11 93
|
||||
46 65 40 68 58
|
||||
67 73 99 31 87
|
||||
22 49 33 59 75
|
||||
|
||||
83 61 17 60 86
|
||||
38 33 96 75 22
|
||||
19 42 76 55 97
|
||||
93 94 29 50 88
|
||||
34 16 91 3 40
|
||||
|
||||
92 48 40 69 98
|
||||
12 46 37 25 78
|
||||
43 11 34 22 32
|
||||
0 18 17 86 1
|
||||
89 26 65 76 96
|
||||
|
||||
66 48 43 99 98
|
||||
68 2 51 87 38
|
||||
72 77 47 20 97
|
||||
36 18 80 10 96
|
||||
88 53 30 65 91
|
||||
|
||||
10 3 65 38 56
|
||||
40 14 64 45 23
|
||||
42 88 31 85 17
|
||||
19 83 46 51 5
|
||||
35 47 28 0 50
|
||||
|
||||
75 53 9 1 29
|
||||
92 94 41 82 38
|
||||
39 70 80 11 56
|
||||
64 28 27 22 60
|
||||
66 97 48 65 71
|
||||
|
||||
91 17 37 49 83
|
||||
66 1 79 87 60
|
||||
78 46 32 30 57
|
||||
50 56 23 6 24
|
||||
13 89 42 70 77
|
||||
|
||||
59 28 58 56 73
|
||||
22 4 53 91 23
|
||||
8 41 36 52 80
|
||||
30 68 34 70 63
|
||||
90 3 61 98 1
|
||||
|
||||
50 76 99 74 81
|
||||
57 25 59 69 96
|
||||
26 15 43 64 44
|
||||
73 18 61 91 23
|
||||
87 13 46 90 60
|
||||
|
||||
63 1 77 93 47
|
||||
12 90 56 46 0
|
||||
57 73 79 87 43
|
||||
32 13 53 37 14
|
||||
22 3 23 78 69
|
||||
|
||||
49 55 93 57 2
|
||||
67 12 81 70 79
|
||||
60 44 94 23 54
|
||||
48 92 99 1 82
|
||||
76 36 62 32 98
|
||||
|
||||
94 15 97 55 17
|
||||
39 40 84 92 49
|
||||
72 45 52 95 96
|
||||
61 58 88 23 78
|
||||
80 48 37 35 66
|
||||
|
||||
86 88 20 12 7
|
||||
72 52 95 34 11
|
||||
1 47 83 63 18
|
||||
25 35 76 15 92
|
||||
96 64 82 54 31
|
||||
|
||||
61 83 5 24 36
|
||||
88 80 48 26 85
|
||||
2 42 70 98 45
|
||||
27 6 65 94 15
|
||||
71 73 3 47 38
|
||||
|
||||
85 49 19 41 53
|
||||
4 99 43 93 60
|
||||
34 28 78 23 50
|
||||
54 79 35 25 94
|
||||
27 63 16 51 39
|
||||
|
||||
89 49 13 1 32
|
||||
85 87 8 38 64
|
||||
14 5 63 16 27
|
||||
23 76 43 59 94
|
||||
78 80 83 15 54
|
||||
|
||||
26 66 73 74 64
|
||||
9 81 62 75 25
|
||||
46 13 55 43 1
|
||||
0 2 10 58 34
|
||||
76 11 82 42 16
|
||||
|
||||
68 93 18 99 84
|
||||
96 25 44 69 97
|
||||
24 80 74 27 6
|
||||
33 14 54 17 28
|
||||
10 47 2 63 59
|
||||
|
||||
12 56 29 63 0
|
||||
30 94 5 19 18
|
||||
9 13 24 72 60
|
||||
91 46 49 47 51
|
||||
8 54 26 7 21
|
||||
|
||||
36 16 26 97 56
|
||||
22 86 58 94 89
|
||||
66 84 50 82 53
|
||||
87 29 45 95 33
|
||||
49 61 46 2 52
|
||||
|
||||
87 35 65 27 69
|
||||
12 98 94 18 26
|
||||
22 79 1 74 84
|
||||
0 72 29 70 19
|
||||
96 28 95 25 77
|
||||
|
||||
79 95 3 91 44
|
||||
57 61 77 80 29
|
||||
6 49 37 62 16
|
||||
71 73 21 52 48
|
||||
92 17 32 2 43
|
||||
|
||||
29 78 6 94 47
|
||||
83 63 68 16 56
|
||||
38 85 92 60 35
|
||||
81 57 75 79 7
|
||||
69 22 93 49 4
|
||||
|
||||
93 21 2 17 22
|
||||
76 70 3 80 51
|
||||
7 88 14 0 61
|
||||
18 16 29 86 74
|
||||
65 47 8 45 46
|
||||
|
||||
1 20 23 79 14
|
||||
27 76 3 90 85
|
||||
88 35 7 10 92
|
||||
67 97 59 41 8
|
||||
56 57 65 45 81
|
||||
|
||||
57 14 41 89 55
|
||||
47 75 90 23 94
|
||||
26 3 40 17 97
|
||||
65 44 12 4 30
|
||||
16 81 64 79 13
|
||||
|
||||
63 3 22 7 10
|
||||
36 76 14 77 38
|
||||
48 27 40 9 60
|
||||
31 56 75 74 78
|
||||
86 64 71 90 67
|
||||
|
||||
52 28 9 19 66
|
||||
15 86 61 2 89
|
||||
93 3 44 46 91
|
||||
11 7 5 32 72
|
||||
60 10 92 29 88
|
||||
|
||||
88 86 59 8 68
|
||||
10 48 12 61 21
|
||||
54 97 45 55 11
|
||||
67 9 22 64 5
|
||||
7 34 32 69 44
|
||||
|
||||
69 45 14 6 3
|
||||
16 32 33 26 73
|
||||
79 30 5 1 72
|
||||
64 9 60 59 22
|
||||
23 56 37 41 2
|
||||
|
||||
25 65 60 87 39
|
||||
41 53 24 91 93
|
||||
43 59 26 78 96
|
||||
16 33 88 18 7
|
||||
74 63 34 30 20
|
||||
|
||||
38 23 97 73 35
|
||||
51 31 90 98 80
|
||||
56 44 60 8 7
|
||||
71 10 87 0 99
|
||||
64 30 20 22 18
|
||||
|
||||
61 57 31 69 74
|
||||
94 0 96 90 59
|
||||
21 3 72 81 4
|
||||
43 41 58 45 2
|
||||
62 7 65 71 19
|
||||
|
||||
60 20 19 48 11
|
||||
2 68 58 91 76
|
||||
57 12 52 29 13
|
||||
42 53 38 64 81
|
||||
26 70 16 32 54
|
||||
|
||||
15 93 68 77 49
|
||||
80 64 45 10 94
|
||||
30 62 5 66 40
|
||||
46 51 52 22 56
|
||||
7 90 14 6 47
|
||||
|
||||
75 87 31 24 11
|
||||
47 61 14 69 50
|
||||
33 44 12 26 58
|
||||
91 10 35 5 29
|
||||
99 81 16 92 53
|
||||
|
||||
50 37 47 13 83
|
||||
63 96 30 36 86
|
||||
72 66 93 73 74
|
||||
98 60 3 84 28
|
||||
52 14 70 21 55
|
||||
|
||||
65 19 32 28 92
|
||||
9 8 51 0 98
|
||||
56 26 53 13 86
|
||||
2 70 16 52 4
|
||||
69 10 97 38 79
|
||||
|
||||
34 48 46 66 44
|
||||
59 19 18 20 13
|
||||
99 26 62 16 2
|
||||
91 25 11 84 4
|
||||
52 31 70 71 14
|
||||
|
||||
92 1 49 65 77
|
||||
85 8 27 87 84
|
||||
41 73 81 15 58
|
||||
14 93 33 17 52
|
||||
35 90 37 38 0
|
||||
|
||||
11 46 2 20 31
|
||||
97 50 12 79 96
|
||||
89 77 57 61 40
|
||||
65 75 4 33 17
|
||||
66 81 47 83 98
|
||||
|
||||
34 57 44 0 99
|
||||
32 25 17 48 90
|
||||
27 73 63 61 81
|
||||
50 22 4 28 41
|
||||
6 24 70 13 45
|
||||
|
||||
96 18 36 16 10
|
||||
37 11 50 56 88
|
||||
80 40 75 90 12
|
||||
19 43 33 61 58
|
||||
30 59 99 69 98
|
||||
|
||||
31 77 98 90 51
|
||||
34 10 80 73 97
|
||||
2 37 33 17 0
|
||||
59 78 91 87 45
|
||||
86 7 44 64 1
|
||||
|
||||
26 49 66 13 16
|
||||
95 89 52 88 55
|
||||
77 60 3 93 73
|
||||
64 45 98 38 42
|
||||
34 86 1 71 68
|
||||
|
||||
59 71 24 18 99
|
||||
23 28 88 54 26
|
||||
90 37 6 76 4
|
||||
41 64 27 89 67
|
||||
29 95 82 83 60
|
||||
|
||||
8 0 90 41 61
|
||||
29 66 2 35 13
|
||||
12 9 5 36 93
|
||||
67 94 82 77 37
|
||||
30 42 32 80 78
|
||||
|
||||
53 6 23 57 38
|
||||
8 25 76 18 15
|
||||
19 17 20 48 72
|
||||
26 54 64 7 40
|
||||
50 94 82 67 99
|
||||
|
||||
93 5 67 10 4
|
||||
77 80 97 14 2
|
||||
34 9 61 24 21
|
||||
63 89 28 76 62
|
||||
54 29 38 68 69
|
||||
|
||||
72 48 66 89 22
|
||||
63 39 71 59 68
|
||||
2 95 94 21 92
|
||||
6 28 44 62 15
|
||||
35 78 80 11 91
|
||||
|
||||
82 8 59 66 25
|
||||
84 87 95 60 12
|
||||
9 52 83 28 49
|
||||
23 34 85 94 96
|
||||
43 41 39 2 73
|
||||
|
||||
81 56 55 29 70
|
||||
94 96 7 90 2
|
||||
95 45 28 75 12
|
||||
48 83 65 22 91
|
||||
68 98 5 41 73
|
||||
|
||||
36 22 45 14 74
|
||||
35 60 54 15 30
|
||||
86 49 27 82 4
|
||||
87 2 52 50 21
|
||||
39 62 40 1 19
|
||||
|
||||
99 7 85 24 65
|
||||
26 17 36 35 1
|
||||
2 62 38 45 48
|
||||
72 68 32 59 11
|
||||
28 53 64 21 76
|
||||
|
||||
61 63 94 50 55
|
||||
34 42 39 66 37
|
||||
22 72 18 89 12
|
||||
16 23 4 0 41
|
||||
75 64 3 44 5
|
||||
|
||||
87 82 53 5 19
|
||||
26 54 36 1 38
|
||||
28 30 48 97 95
|
||||
34 91 99 23 8
|
||||
46 35 33 29 66
|
||||
|
||||
76 89 94 77 58
|
||||
24 31 1 40 25
|
||||
44 71 42 61 8
|
||||
16 41 28 33 50
|
||||
6 85 66 43 51
|
||||
|
||||
91 28 70 89 43
|
||||
1 76 26 90 45
|
||||
24 2 6 82 23
|
||||
77 68 16 51 81
|
||||
58 86 52 29 18
|
||||
|
||||
95 0 25 19 91
|
||||
10 65 30 72 42
|
||||
41 8 77 58 23
|
||||
94 60 34 11 67
|
||||
24 1 64 78 44
|
||||
|
||||
40 76 21 37 15
|
||||
44 26 80 77 88
|
||||
25 72 38 34 9
|
||||
75 81 43 86 68
|
||||
59 30 87 61 73
|
||||
|
||||
0 63 62 82 93
|
||||
70 61 14 56 3
|
||||
54 43 92 78 27
|
||||
26 7 99 77 73
|
||||
21 30 44 50 40
|
||||
|
||||
2 60 45 17 73
|
||||
75 67 68 20 18
|
||||
16 30 24 37 12
|
||||
79 50 8 65 19
|
||||
85 95 54 90 47
|
||||
|
||||
69 68 54 66 17
|
||||
39 19 20 33 44
|
||||
12 27 50 60 36
|
||||
53 81 8 7 87
|
||||
82 97 18 4 74
|
||||
|
||||
58 63 8 42 28
|
||||
70 95 39 54 61
|
||||
30 56 79 37 82
|
||||
15 32 83 27 45
|
||||
52 13 90 97 62
|
||||
|
||||
11 50 56 66 84
|
||||
96 94 57 17 49
|
||||
68 58 90 34 59
|
||||
81 36 91 8 45
|
||||
62 35 6 93 48
|
||||
|
||||
82 89 54 87 80
|
||||
94 6 45 53 62
|
||||
31 34 58 85 77
|
||||
24 25 91 99 26
|
||||
41 0 59 37 23
|
||||
|
||||
93 41 53 31 87
|
||||
7 22 39 86 73
|
||||
71 34 60 57 6
|
||||
52 64 48 99 90
|
||||
66 76 62 45 40
|
||||
|
||||
5 84 85 67 26
|
||||
11 1 0 95 21
|
||||
48 59 43 94 62
|
||||
22 74 40 49 89
|
||||
51 20 90 78 96
|
||||
|
||||
0 45 43 79 25
|
||||
41 10 95 86 80
|
||||
4 60 82 33 75
|
||||
44 46 38 17 76
|
||||
22 58 27 73 66
|
||||
|
||||
54 50 7 92 79
|
||||
11 43 38 94 5
|
||||
63 80 33 58 4
|
||||
12 91 28 70 97
|
||||
26 99 41 52 90
|
||||
|
||||
23 26 95 8 17
|
||||
73 77 61 89 82
|
||||
78 80 64 19 96
|
||||
81 92 47 44 59
|
||||
54 24 63 74 32
|
||||
|
||||
86 85 37 80 45
|
||||
47 44 92 29 49
|
||||
67 48 95 51 88
|
||||
36 8 56 16 30
|
||||
0 97 84 24 13
|
||||
|
||||
81 61 42 87 92
|
||||
30 75 17 67 2
|
||||
83 44 96 52 1
|
||||
37 78 31 15 19
|
||||
40 9 72 7 28
|
||||
|
||||
10 85 17 38 22
|
||||
46 35 90 12 27
|
||||
76 42 7 2 30
|
||||
55 57 60 9 49
|
||||
79 73 97 1 21
|
||||
|
||||
52 36 11 82 91
|
||||
22 7 46 21 12
|
||||
62 42 66 68 10
|
||||
31 18 76 20 84
|
||||
28 79 61 39 86
|
||||
|
||||
73 99 34 54 45
|
||||
43 28 18 76 40
|
||||
57 58 63 9 11
|
||||
89 65 2 12 90
|
||||
38 97 49 15 27
|
||||
|
||||
28 84 24 17 49
|
||||
33 69 75 53 92
|
||||
81 48 89 19 34
|
||||
59 1 18 72 79
|
||||
6 22 2 86 85
|
||||
|
||||
72 78 30 40 19
|
||||
54 16 25 81 28
|
||||
41 99 7 79 14
|
||||
83 76 29 8 91
|
||||
5 60 11 51 37
|
||||
|
||||
77 78 34 59 29
|
||||
62 69 54 8 97
|
||||
80 53 25 66 85
|
||||
81 90 31 51 52
|
||||
63 41 57 68 18
|
||||
|
||||
43 62 11 41 7
|
||||
37 44 34 10 51
|
||||
67 36 61 77 70
|
||||
59 1 25 42 88
|
||||
29 71 60 15 24
|
||||
|
||||
30 65 57 35 84
|
||||
34 33 72 73 28
|
||||
38 51 4 52 14
|
||||
58 59 85 87 39
|
||||
88 81 11 93 71
|
||||
|
||||
19 5 23 71 75
|
||||
70 9 57 69 14
|
||||
49 29 22 28 10
|
||||
42 48 63 73 6
|
||||
79 18 4 39 88
|
||||
|
||||
16 27 31 88 86
|
||||
29 40 65 68 39
|
||||
15 95 93 69 22
|
||||
66 48 18 84 11
|
||||
7 51 92 96 99
|
||||
|
||||
0 69 51 12 82
|
||||
4 81 62 2 49
|
||||
27 66 95 83 70
|
||||
94 97 99 63 19
|
||||
87 75 77 73 44
|
||||
|
||||
82 83 75 95 53
|
||||
46 47 31 14 64
|
||||
71 70 11 51 87
|
||||
7 16 63 38 29
|
||||
89 13 33 41 0
|
101
2021/04/prog.py
Normal file
101
2021/04/prog.py
Normal file
@ -0,0 +1,101 @@
|
||||
VERBOSE = True
|
||||
def verbose(s):
|
||||
if VERBOSE:
|
||||
print(s)
|
||||
|
||||
|
||||
class Card:
|
||||
def __init__(self, width: int, height: int, card: list):
|
||||
self.width = width
|
||||
self.height = height
|
||||
self.marks_h = [0 for _ in range(height)]
|
||||
self.marks_v = [0 for _ in range(width)]
|
||||
self.won = False # for part 2
|
||||
|
||||
self.numbers = {}
|
||||
self.card_h = [[0 for __ in range(width)] for _ in range(height)]
|
||||
self.card_v = [[0 for __ in range(height)] for _ in range(width)]
|
||||
|
||||
for y, row in enumerate(card):
|
||||
y = int(y)
|
||||
for x, n in enumerate(row.strip().replace(' ', ' ').split(' ')):
|
||||
x = int(x)
|
||||
n = int(n)
|
||||
self.numbers[n] = (x, y, False)
|
||||
# verbose(f"{x = }, {y = }, {self.card_h = }, {self.card_v = }")
|
||||
self.card_h[y][x] = n
|
||||
self.card_v[x][y] = n
|
||||
|
||||
def is_row_full(self, row: int):
|
||||
return self.marks_h[row] == 2**self.width - 1
|
||||
|
||||
def is_col_full(self, col: int):
|
||||
return self.marks_v[col] == 2**self.height - 1
|
||||
|
||||
def mark(self, n: int):
|
||||
if n not in self.numbers:
|
||||
return False
|
||||
x, y, _ = self.numbers[n]
|
||||
self.marks_h[y] |= 1 << (self.width - 1 - x)
|
||||
self.marks_v[x] |= 1 << y
|
||||
self.numbers[n] = (x, y, True)
|
||||
self.won = self.is_row_full(y) or self.is_col_full(x) # for part 2
|
||||
|
||||
def get_winning_sum(self):
|
||||
ret = 0
|
||||
for n in self.numbers:
|
||||
if not self.numbers[n][2]:
|
||||
ret += n
|
||||
return ret
|
||||
|
||||
|
||||
def __str__(self):
|
||||
ret = ""
|
||||
for row in range(self.height):
|
||||
for n in self.card_h[row]:
|
||||
ret += f"{n:2d} "
|
||||
|
||||
ret += f" {self.marks_h[row]:05b}"
|
||||
ret += "\n"
|
||||
return ret
|
||||
|
||||
|
||||
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
lines = f.readlines()
|
||||
ret = {}
|
||||
ret["draws"] = [int(n) for n in lines[0].split(',')]
|
||||
lines = lines[2:]
|
||||
ret["cards"] = [Card(5, 5, lines[i:i+5]) for i in range(0, len(lines), 6)]
|
||||
return ret
|
||||
|
||||
|
||||
def result(inp, part = 1):
|
||||
draws = inp["draws"]
|
||||
cards = inp["cards"]
|
||||
|
||||
verbose(f"{len(draws) = }, {len(cards) = }")
|
||||
n_won = 0 # for part 2
|
||||
for n in draws:
|
||||
for c in cards:
|
||||
verbose(f"marking {n}")
|
||||
if part == 1:
|
||||
c.mark(n)
|
||||
if c.won:
|
||||
return c.get_winning_sum() * n
|
||||
else:
|
||||
if not c.won:
|
||||
c.mark(n)
|
||||
if c.won:
|
||||
n_won += 1
|
||||
if n_won == len(cards):
|
||||
return c.get_winning_sum() * n
|
||||
verbose(c)
|
||||
return -1 # failed
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# VERBOSE = False
|
||||
print(result(get_input(), part = 2))
|
19
2021/04/sample_p1
Normal file
19
2021/04/sample_p1
Normal file
@ -0,0 +1,19 @@
|
||||
7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1
|
||||
|
||||
22 13 17 11 0
|
||||
8 2 23 4 24
|
||||
21 9 14 16 7
|
||||
6 10 3 18 5
|
||||
1 12 20 15 19
|
||||
|
||||
3 15 0 2 22
|
||||
9 18 13 17 5
|
||||
19 8 7 25 23
|
||||
20 11 10 24 4
|
||||
14 21 16 12 6
|
||||
|
||||
14 21 17 24 4
|
||||
10 16 15 9 19
|
||||
18 8 23 26 20
|
||||
22 11 13 6 5
|
||||
2 0 12 3 7
|
11
2021/04/test.py
Normal file
11
2021/04/test.py
Normal file
@ -0,0 +1,11 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 4512)
|
||||
self.assertEqual(result(get_input()), 44736)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 1924)
|
||||
|
500
2021/05/input
Normal file
500
2021/05/input
Normal file
@ -0,0 +1,500 @@
|
||||
609,916 -> 60,367
|
||||
349,494 -> 682,494
|
||||
75,370 -> 397,370
|
||||
55,623 -> 55,183
|
||||
296,865 -> 296,235
|
||||
810,691 -> 504,385
|
||||
256,67 -> 256,468
|
||||
446,679 -> 446,594
|
||||
592,16 -> 98,16
|
||||
866,642 -> 866,622
|
||||
293,672 -> 911,672
|
||||
799,855 -> 799,638
|
||||
890,805 -> 389,304
|
||||
454,263 -> 454,501
|
||||
798,86 -> 540,86
|
||||
331,256 -> 351,256
|
||||
882,93 -> 445,530
|
||||
879,163 -> 879,841
|
||||
448,476 -> 96,476
|
||||
230,198 -> 941,198
|
||||
943,918 -> 70,45
|
||||
666,502 -> 552,616
|
||||
56,14 -> 978,936
|
||||
438,284 -> 850,284
|
||||
86,824 -> 86,277
|
||||
170,461 -> 737,461
|
||||
675,85 -> 675,289
|
||||
289,14 -> 814,539
|
||||
541,94 -> 541,868
|
||||
334,391 -> 470,391
|
||||
782,313 -> 358,313
|
||||
165,301 -> 17,153
|
||||
11,406 -> 11,869
|
||||
758,365 -> 758,708
|
||||
835,313 -> 212,936
|
||||
636,387 -> 636,314
|
||||
393,588 -> 393,694
|
||||
193,639 -> 193,747
|
||||
850,524 -> 557,817
|
||||
465,751 -> 465,652
|
||||
194,552 -> 194,380
|
||||
212,270 -> 212,691
|
||||
230,595 -> 581,595
|
||||
135,698 -> 325,698
|
||||
973,846 -> 333,206
|
||||
508,297 -> 237,297
|
||||
72,397 -> 418,397
|
||||
159,921 -> 914,166
|
||||
579,202 -> 370,202
|
||||
375,86 -> 638,349
|
||||
903,917 -> 14,28
|
||||
43,841 -> 824,60
|
||||
928,11 -> 478,11
|
||||
562,129 -> 803,129
|
||||
880,61 -> 564,377
|
||||
967,949 -> 122,104
|
||||
293,943 -> 293,484
|
||||
674,466 -> 674,192
|
||||
583,724 -> 834,724
|
||||
499,888 -> 973,888
|
||||
302,519 -> 470,351
|
||||
793,284 -> 669,284
|
||||
74,716 -> 799,716
|
||||
517,529 -> 163,529
|
||||
863,711 -> 863,91
|
||||
977,988 -> 62,73
|
||||
989,32 -> 370,651
|
||||
795,627 -> 584,838
|
||||
984,340 -> 96,340
|
||||
780,425 -> 316,889
|
||||
563,140 -> 378,140
|
||||
203,55 -> 719,55
|
||||
273,757 -> 763,267
|
||||
836,901 -> 846,901
|
||||
152,319 -> 136,319
|
||||
92,970 -> 970,92
|
||||
84,46 -> 498,46
|
||||
539,408 -> 539,259
|
||||
822,366 -> 694,366
|
||||
586,819 -> 755,988
|
||||
218,340 -> 218,812
|
||||
394,197 -> 813,616
|
||||
458,24 -> 401,24
|
||||
684,92 -> 241,92
|
||||
456,569 -> 746,859
|
||||
611,961 -> 508,961
|
||||
90,980 -> 90,423
|
||||
21,13 -> 981,973
|
||||
877,27 -> 354,27
|
||||
583,327 -> 583,627
|
||||
512,808 -> 662,958
|
||||
688,832 -> 578,722
|
||||
213,281 -> 901,969
|
||||
473,42 -> 955,524
|
||||
303,442 -> 614,753
|
||||
829,831 -> 162,164
|
||||
176,25 -> 952,801
|
||||
23,12 -> 989,978
|
||||
798,859 -> 710,859
|
||||
140,784 -> 140,285
|
||||
536,248 -> 536,917
|
||||
950,753 -> 738,541
|
||||
331,159 -> 778,159
|
||||
834,385 -> 834,666
|
||||
192,614 -> 650,614
|
||||
820,503 -> 985,503
|
||||
831,845 -> 62,76
|
||||
653,606 -> 984,606
|
||||
534,515 -> 969,515
|
||||
105,824 -> 860,824
|
||||
384,501 -> 486,603
|
||||
425,337 -> 425,199
|
||||
381,212 -> 381,704
|
||||
897,890 -> 897,783
|
||||
378,82 -> 564,82
|
||||
630,940 -> 659,969
|
||||
954,980 -> 815,841
|
||||
718,111 -> 23,806
|
||||
41,732 -> 426,732
|
||||
346,671 -> 597,671
|
||||
931,51 -> 32,950
|
||||
875,738 -> 875,910
|
||||
982,35 -> 97,920
|
||||
646,341 -> 646,471
|
||||
913,788 -> 745,788
|
||||
979,11 -> 32,958
|
||||
618,283 -> 618,382
|
||||
386,47 -> 386,957
|
||||
680,652 -> 430,652
|
||||
26,752 -> 26,978
|
||||
314,689 -> 941,62
|
||||
806,366 -> 454,366
|
||||
27,365 -> 184,365
|
||||
461,915 -> 548,828
|
||||
332,371 -> 878,371
|
||||
446,208 -> 615,208
|
||||
888,673 -> 888,288
|
||||
529,975 -> 47,975
|
||||
755,806 -> 489,806
|
||||
297,108 -> 311,122
|
||||
585,885 -> 968,885
|
||||
334,359 -> 334,251
|
||||
690,401 -> 637,454
|
||||
131,522 -> 964,522
|
||||
103,831 -> 378,556
|
||||
621,327 -> 621,561
|
||||
178,932 -> 979,131
|
||||
452,285 -> 903,285
|
||||
942,448 -> 919,448
|
||||
102,966 -> 818,250
|
||||
116,226 -> 746,856
|
||||
855,799 -> 855,244
|
||||
425,963 -> 387,963
|
||||
548,879 -> 372,703
|
||||
607,157 -> 607,611
|
||||
949,15 -> 79,885
|
||||
978,325 -> 639,325
|
||||
887,605 -> 208,605
|
||||
426,694 -> 426,296
|
||||
498,960 -> 498,358
|
||||
800,874 -> 800,529
|
||||
172,106 -> 701,635
|
||||
985,160 -> 985,473
|
||||
804,34 -> 431,407
|
||||
976,978 -> 10,12
|
||||
865,761 -> 134,30
|
||||
987,825 -> 987,746
|
||||
110,730 -> 370,730
|
||||
237,34 -> 814,611
|
||||
292,700 -> 292,352
|
||||
699,880 -> 699,286
|
||||
611,94 -> 611,234
|
||||
978,248 -> 354,248
|
||||
517,600 -> 329,600
|
||||
782,46 -> 218,610
|
||||
31,15 -> 880,864
|
||||
563,404 -> 472,404
|
||||
696,552 -> 974,552
|
||||
785,202 -> 861,202
|
||||
94,829 -> 94,404
|
||||
541,395 -> 531,395
|
||||
248,810 -> 935,123
|
||||
169,843 -> 169,870
|
||||
557,35 -> 345,247
|
||||
958,24 -> 835,24
|
||||
130,333 -> 302,161
|
||||
961,53 -> 87,927
|
||||
485,285 -> 975,285
|
||||
376,788 -> 260,788
|
||||
378,590 -> 378,253
|
||||
235,961 -> 406,961
|
||||
93,170 -> 93,339
|
||||
707,782 -> 475,782
|
||||
385,719 -> 385,340
|
||||
430,758 -> 412,740
|
||||
169,780 -> 504,445
|
||||
238,109 -> 238,383
|
||||
805,603 -> 805,364
|
||||
981,373 -> 458,896
|
||||
514,203 -> 372,203
|
||||
942,234 -> 855,234
|
||||
446,292 -> 446,917
|
||||
882,478 -> 882,394
|
||||
690,768 -> 742,768
|
||||
356,652 -> 356,891
|
||||
675,751 -> 675,37
|
||||
370,252 -> 574,252
|
||||
777,736 -> 777,177
|
||||
230,367 -> 787,367
|
||||
187,274 -> 187,752
|
||||
850,888 -> 23,61
|
||||
356,258 -> 392,258
|
||||
176,698 -> 434,440
|
||||
133,813 -> 133,635
|
||||
655,574 -> 909,574
|
||||
365,771 -> 635,501
|
||||
738,611 -> 378,611
|
||||
322,85 -> 322,591
|
||||
137,596 -> 137,522
|
||||
686,339 -> 686,59
|
||||
843,886 -> 963,886
|
||||
967,639 -> 179,639
|
||||
491,208 -> 491,950
|
||||
396,526 -> 644,774
|
||||
29,29 -> 986,986
|
||||
250,40 -> 703,40
|
||||
25,784 -> 757,52
|
||||
443,582 -> 324,582
|
||||
753,369 -> 404,369
|
||||
987,966 -> 34,13
|
||||
390,21 -> 983,21
|
||||
861,626 -> 757,730
|
||||
873,220 -> 873,459
|
||||
529,646 -> 529,90
|
||||
886,668 -> 682,464
|
||||
315,310 -> 315,846
|
||||
674,449 -> 674,594
|
||||
719,448 -> 544,623
|
||||
625,170 -> 182,613
|
||||
242,498 -> 337,498
|
||||
496,23 -> 793,23
|
||||
258,240 -> 151,133
|
||||
256,309 -> 110,455
|
||||
312,438 -> 312,672
|
||||
710,549 -> 710,920
|
||||
967,719 -> 967,414
|
||||
201,324 -> 632,324
|
||||
902,167 -> 226,167
|
||||
745,517 -> 677,449
|
||||
548,18 -> 817,18
|
||||
711,806 -> 672,845
|
||||
907,554 -> 907,837
|
||||
144,810 -> 698,256
|
||||
549,247 -> 549,623
|
||||
309,802 -> 330,823
|
||||
528,275 -> 158,645
|
||||
689,372 -> 689,448
|
||||
621,60 -> 621,332
|
||||
38,884 -> 892,30
|
||||
117,898 -> 989,26
|
||||
521,702 -> 521,42
|
||||
985,142 -> 377,750
|
||||
482,517 -> 562,517
|
||||
333,168 -> 963,798
|
||||
296,642 -> 564,642
|
||||
112,541 -> 111,541
|
||||
745,395 -> 474,124
|
||||
279,238 -> 766,238
|
||||
491,747 -> 491,616
|
||||
973,462 -> 150,462
|
||||
867,120 -> 867,966
|
||||
854,498 -> 854,244
|
||||
684,233 -> 929,233
|
||||
120,151 -> 545,151
|
||||
172,361 -> 630,361
|
||||
100,219 -> 416,219
|
||||
988,24 -> 27,985
|
||||
969,160 -> 193,936
|
||||
985,891 -> 158,64
|
||||
284,875 -> 857,302
|
||||
310,363 -> 310,544
|
||||
841,902 -> 245,902
|
||||
964,240 -> 435,240
|
||||
787,358 -> 399,358
|
||||
177,637 -> 177,250
|
||||
397,61 -> 60,61
|
||||
889,180 -> 409,180
|
||||
631,899 -> 551,979
|
||||
253,912 -> 253,876
|
||||
916,700 -> 983,700
|
||||
89,512 -> 515,938
|
||||
516,940 -> 516,526
|
||||
303,587 -> 303,698
|
||||
287,323 -> 287,730
|
||||
907,528 -> 907,722
|
||||
450,118 -> 450,907
|
||||
12,356 -> 12,875
|
||||
210,34 -> 726,550
|
||||
198,364 -> 198,506
|
||||
314,242 -> 942,242
|
||||
939,86 -> 198,827
|
||||
783,959 -> 837,959
|
||||
978,180 -> 979,180
|
||||
72,668 -> 643,97
|
||||
888,841 -> 888,712
|
||||
553,166 -> 553,253
|
||||
733,880 -> 733,805
|
||||
921,36 -> 37,920
|
||||
113,164 -> 909,960
|
||||
27,746 -> 269,746
|
||||
734,978 -> 734,158
|
||||
334,249 -> 218,249
|
||||
966,762 -> 773,762
|
||||
971,862 -> 171,62
|
||||
607,609 -> 607,880
|
||||
140,261 -> 140,983
|
||||
705,944 -> 906,944
|
||||
691,617 -> 130,617
|
||||
657,190 -> 657,84
|
||||
228,840 -> 655,840
|
||||
653,876 -> 311,534
|
||||
620,337 -> 625,337
|
||||
76,510 -> 220,510
|
||||
39,980 -> 931,88
|
||||
339,44 -> 179,44
|
||||
292,830 -> 706,416
|
||||
640,184 -> 441,184
|
||||
583,238 -> 583,896
|
||||
666,593 -> 502,593
|
||||
317,750 -> 743,750
|
||||
574,466 -> 679,466
|
||||
636,348 -> 636,130
|
||||
115,268 -> 443,596
|
||||
411,664 -> 213,664
|
||||
926,615 -> 452,141
|
||||
258,232 -> 147,232
|
||||
786,297 -> 181,297
|
||||
780,271 -> 101,950
|
||||
533,494 -> 159,120
|
||||
478,286 -> 365,286
|
||||
753,247 -> 933,247
|
||||
334,937 -> 334,419
|
||||
821,57 -> 821,647
|
||||
970,68 -> 50,988
|
||||
158,799 -> 158,598
|
||||
574,632 -> 975,632
|
||||
217,184 -> 880,184
|
||||
443,130 -> 573,260
|
||||
937,144 -> 240,841
|
||||
129,547 -> 129,327
|
||||
805,174 -> 900,174
|
||||
650,335 -> 115,870
|
||||
122,804 -> 679,247
|
||||
104,829 -> 104,587
|
||||
933,452 -> 71,452
|
||||
181,469 -> 181,702
|
||||
114,136 -> 890,912
|
||||
649,144 -> 746,241
|
||||
42,297 -> 592,847
|
||||
721,572 -> 34,572
|
||||
291,262 -> 960,931
|
||||
154,503 -> 154,682
|
||||
264,869 -> 264,626
|
||||
310,421 -> 579,421
|
||||
869,390 -> 448,390
|
||||
223,737 -> 223,627
|
||||
760,162 -> 760,210
|
||||
484,465 -> 401,465
|
||||
582,921 -> 582,75
|
||||
31,905 -> 546,905
|
||||
119,376 -> 119,58
|
||||
76,520 -> 76,102
|
||||
780,257 -> 590,257
|
||||
873,796 -> 540,796
|
||||
469,605 -> 421,653
|
||||
188,667 -> 390,869
|
||||
926,279 -> 926,638
|
||||
22,959 -> 163,959
|
||||
444,439 -> 444,647
|
||||
923,513 -> 577,859
|
||||
500,162 -> 374,162
|
||||
143,988 -> 143,29
|
||||
82,754 -> 82,982
|
||||
107,911 -> 107,941
|
||||
281,782 -> 638,782
|
||||
740,445 -> 967,672
|
||||
280,516 -> 280,882
|
||||
203,157 -> 465,157
|
||||
16,984 -> 982,18
|
||||
122,823 -> 81,823
|
||||
881,232 -> 881,78
|
||||
33,94 -> 33,259
|
||||
29,109 -> 695,775
|
||||
24,593 -> 921,593
|
||||
186,503 -> 186,243
|
||||
369,561 -> 369,176
|
||||
381,835 -> 462,835
|
||||
838,911 -> 153,226
|
||||
115,683 -> 115,444
|
||||
429,145 -> 85,489
|
||||
875,577 -> 365,577
|
||||
221,539 -> 221,252
|
||||
65,957 -> 65,468
|
||||
112,175 -> 112,475
|
||||
358,700 -> 676,700
|
||||
428,508 -> 428,36
|
||||
29,962 -> 977,14
|
||||
941,16 -> 87,870
|
||||
599,923 -> 683,839
|
||||
918,244 -> 702,28
|
||||
926,754 -> 262,754
|
||||
455,139 -> 455,851
|
||||
113,189 -> 113,235
|
||||
429,441 -> 546,441
|
||||
151,183 -> 929,961
|
||||
804,335 -> 804,659
|
||||
469,418 -> 469,235
|
||||
103,99 -> 902,898
|
||||
874,737 -> 595,737
|
||||
728,451 -> 524,247
|
||||
758,366 -> 758,690
|
||||
765,40 -> 570,40
|
||||
987,10 -> 19,978
|
||||
601,881 -> 601,703
|
||||
574,525 -> 826,777
|
||||
690,223 -> 690,98
|
||||
841,496 -> 715,496
|
||||
33,32 -> 984,983
|
||||
21,368 -> 21,209
|
||||
883,473 -> 451,905
|
||||
103,151 -> 198,246
|
||||
102,72 -> 792,762
|
||||
525,725 -> 679,879
|
||||
276,742 -> 107,911
|
||||
456,833 -> 456,714
|
||||
781,769 -> 781,643
|
||||
539,951 -> 324,951
|
||||
467,803 -> 250,803
|
||||
30,406 -> 258,634
|
||||
399,475 -> 399,494
|
||||
895,942 -> 515,942
|
||||
512,591 -> 413,591
|
||||
183,112 -> 687,616
|
||||
439,860 -> 439,746
|
||||
864,633 -> 708,477
|
||||
846,137 -> 846,378
|
||||
778,245 -> 330,693
|
||||
309,458 -> 633,458
|
||||
15,457 -> 440,882
|
||||
563,466 -> 799,702
|
||||
307,751 -> 307,723
|
||||
665,987 -> 843,987
|
||||
683,674 -> 683,497
|
||||
644,354 -> 778,488
|
||||
61,809 -> 735,135
|
||||
18,124 -> 18,490
|
||||
171,179 -> 171,216
|
||||
99,372 -> 610,883
|
||||
143,115 -> 871,843
|
||||
385,688 -> 77,688
|
||||
637,500 -> 637,896
|
||||
409,905 -> 225,905
|
||||
654,676 -> 474,676
|
||||
946,81 -> 946,320
|
||||
209,53 -> 209,535
|
||||
757,508 -> 757,636
|
||||
673,162 -> 255,580
|
||||
526,593 -> 862,929
|
||||
476,256 -> 739,256
|
||||
879,954 -> 38,113
|
||||
786,577 -> 141,577
|
||||
672,131 -> 519,284
|
||||
114,334 -> 212,334
|
||||
571,49 -> 571,893
|
||||
958,942 -> 41,25
|
||||
369,545 -> 369,927
|
||||
699,450 -> 244,450
|
||||
15,538 -> 15,67
|
||||
418,419 -> 90,747
|
||||
335,758 -> 540,758
|
||||
165,211 -> 165,357
|
||||
534,347 -> 251,630
|
||||
893,547 -> 893,119
|
||||
475,581 -> 860,196
|
||||
770,492 -> 879,492
|
||||
131,973 -> 742,973
|
||||
297,808 -> 297,490
|
||||
12,974 -> 937,49
|
||||
932,410 -> 802,410
|
||||
40,535 -> 646,535
|
||||
28,37 -> 951,960
|
||||
270,506 -> 270,790
|
||||
655,752 -> 839,752
|
||||
979,220 -> 979,311
|
||||
903,272 -> 234,941
|
||||
960,786 -> 246,72
|
||||
795,156 -> 99,852
|
||||
784,285 -> 221,285
|
||||
100,152 -> 100,910
|
||||
481,628 -> 657,628
|
73
2021/05/prog.py
Normal file
73
2021/05/prog.py
Normal file
@ -0,0 +1,73 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, **kwargs)
|
||||
|
||||
def get_c(s: str):
|
||||
c0 = s.split(',')
|
||||
return [int(c0[0]), int(c0[1])]
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
tmp = f.readlines()
|
||||
ret = {"coords": [], "map_dim": [0, 0]}
|
||||
for line in tmp:
|
||||
coords = line.split(' -> ')
|
||||
c0 = get_c(coords[0])
|
||||
c1 = get_c(coords[1])
|
||||
ret["coords"].append([c0, c1])
|
||||
ret["map_dim"][0] = c0[0] + 1 if c0[0] + 1 > ret["map_dim"][0] else ret["map_dim"][0]
|
||||
ret["map_dim"][1] = c0[1] + 1 if c0[1] + 1 > ret["map_dim"][1] else ret["map_dim"][1]
|
||||
ret["map_dim"][0] = c1[0] + 1 if c1[0] + 1 > ret["map_dim"][0] else ret["map_dim"][0]
|
||||
ret["map_dim"][1] = c1[1] + 1 if c1[1] + 1 > ret["map_dim"][1] else ret["map_dim"][1]
|
||||
|
||||
return ret
|
||||
|
||||
|
||||
def result(inp, part = 1):
|
||||
m = [[0 for _ in range(inp["map_dim"][0])] for _ in range(inp["map_dim"][1])]
|
||||
for c_pair in inp["coords"]:
|
||||
x1, y1 = c_pair[0]
|
||||
x2, y2 = c_pair[1]
|
||||
if x1 == x2 or y1 == y2 or (part == 2 and abs(x2 - x1) == abs(y2 - y1)):
|
||||
if x1 == x2:
|
||||
for y in range(min(y1, y2), max(y1, y2) + 1):
|
||||
m[y][x1] += 1
|
||||
elif y1 == y2:
|
||||
for x in range(min(x1, x2), max(x1, x2) + 1):
|
||||
m[y1][x] += 1
|
||||
elif abs(y1 - y2) == abs(x1 - x2):
|
||||
d = (
|
||||
1 if x1 < x2 else -1,
|
||||
1 if y1 < y2 else -1
|
||||
)
|
||||
verbose(f"going through {x1, y1 = }, {x2, y2 = } with {d = }")
|
||||
x = x1
|
||||
y = y1
|
||||
m[y][x] += 1
|
||||
for _ in range(abs(y2 - y1)):
|
||||
x = x + d[0]
|
||||
y = y + d[1]
|
||||
verbose(f"{x, y = }")
|
||||
m[y][x] += 1
|
||||
|
||||
|
||||
|
||||
res = 0;
|
||||
for row in m:
|
||||
for cell in row:
|
||||
if cell == 0:
|
||||
verbose('.', end='')
|
||||
else:
|
||||
verbose(cell, end='')
|
||||
res += 1 if cell >= 2 else 0
|
||||
|
||||
verbose()
|
||||
verbose()
|
||||
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 2))
|
10
2021/05/sample_p1
Normal file
10
2021/05/sample_p1
Normal file
@ -0,0 +1,10 @@
|
||||
0,9 -> 5,9
|
||||
8,0 -> 0,8
|
||||
9,4 -> 3,4
|
||||
2,2 -> 2,1
|
||||
7,0 -> 7,4
|
||||
6,4 -> 2,0
|
||||
0,9 -> 2,9
|
||||
3,4 -> 1,4
|
||||
0,0 -> 8,8
|
||||
5,5 -> 8,2
|
9
2021/05/test.py
Normal file
9
2021/05/test.py
Normal file
@ -0,0 +1,9 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 5)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 12)
|
1
2021/06/input
Normal file
1
2021/06/input
Normal file
@ -0,0 +1 @@
|
||||
1,1,3,5,1,1,1,4,1,5,1,1,1,1,1,1,1,3,1,1,1,1,2,5,1,1,1,1,1,2,1,4,1,4,1,1,1,1,1,3,1,1,5,1,1,1,4,1,1,1,4,1,1,3,5,1,1,1,1,4,1,5,4,1,1,2,3,2,1,1,1,1,1,1,1,1,1,1,1,1,1,5,1,1,1,1,1,1,1,1,2,2,1,1,1,1,1,5,1,1,1,3,4,1,1,1,1,3,1,1,1,1,1,4,1,1,3,1,1,3,1,1,1,1,1,3,1,5,2,3,1,2,3,1,1,2,1,2,4,5,1,5,1,4,1,1,1,1,2,1,5,1,1,1,1,1,5,1,1,3,1,1,1,1,1,1,4,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,2,1,1,1,1,2,2,1,2,1,1,1,5,5,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,1,4,2,1,4,1,1,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,1,5,1,1,1,1,1,1,1,1,3,1,1,3,3,1,1,1,3,5,1,1,4,1,1,1,1,1,4,1,1,3,1,1,1,1,1,1,1,1,2,1,5,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1
|
35
2021/06/prog.py
Normal file
35
2021/06/prog.py
Normal file
@ -0,0 +1,35 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return list(map(lambda x: int(x), f.readlines()[0].split(',')))
|
||||
|
||||
|
||||
def create_state(l):
|
||||
return [0 for _ in range(l)]
|
||||
|
||||
def result(inp, days = 80):
|
||||
state = create_state(9)
|
||||
for n in inp:
|
||||
state[n] += 1
|
||||
|
||||
for _ in range(days):
|
||||
zeros = state[0]
|
||||
for i, n in enumerate( state[1:] ):
|
||||
state[i] = n
|
||||
state[6] += zeros
|
||||
state[8] = zeros
|
||||
|
||||
res = 0
|
||||
for n in state:
|
||||
res += n
|
||||
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), days = 256))
|
1
2021/06/sample_p1
Normal file
1
2021/06/sample_p1
Normal file
@ -0,0 +1 @@
|
||||
3,4,3,1,2
|
11
2021/06/test.py
Normal file
11
2021/06/test.py
Normal file
@ -0,0 +1,11 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True), days = 18), 26)
|
||||
self.assertEqual(result(get_input(sample = True)), 5934)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), days = 256), 26984457539)
|
||||
|
1
2021/07/input
Normal file
1
2021/07/input
Normal 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
|
29
2021/07/prog.py
Normal file
29
2021/07/prog.py
Normal file
@ -0,0 +1,29 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return list(map(lambda x: int(x), f.readlines()[0].split(',')))
|
||||
|
||||
|
||||
def result(inp, part = 1):
|
||||
res = -1
|
||||
|
||||
for mid in range(min(inp), max(inp) + 1):
|
||||
score = 0
|
||||
for n in inp:
|
||||
delta = abs(mid - n)
|
||||
if part == 1:
|
||||
score += delta
|
||||
else:
|
||||
score += delta * (delta + 1) / 2
|
||||
res = score if score < res or res == -1 else res
|
||||
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 2))
|
1
2021/07/sample_p1
Normal file
1
2021/07/sample_p1
Normal file
@ -0,0 +1 @@
|
||||
16,1,2,0,4,2,7,1,2,14
|
10
2021/07/test.py
Normal file
10
2021/07/test.py
Normal file
@ -0,0 +1,10 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 37)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 168)
|
||||
|
200
2021/08/input
Normal file
200
2021/08/input
Normal file
@ -0,0 +1,200 @@
|
||||
cdafg dage fgdaec cdbfgae cge gcbdfa fdceb gfceab ge ecfgd | eg eg dfecag ge
|
||||
efgcabd edacgf gfaec deg dg decga dcfg dbgafe bfgcae abced | deg baced fegac aefbcg
|
||||
egacf dfbeg dec efcgd cfad cfagde fabcgde dc agbecf bgdeac | gcadef eacgbf egdfb bgdfe
|
||||
dc cgefb cdf bdfgc adbc gafdec cbagfd gfbad dbcagfe gbedaf | cd cd agfbd bdac
|
||||
dcbafg gadeb faegb cfbga ef gfe feca aegfbc cebgdf dfabceg | faec ceaf bcedgaf cfbga
|
||||
bcf adbcef cbgdfe dbceag gcdbe dcafg egadcbf fb dgfcb gebf | cbgedf cbfdae aegbcd bf
|
||||
dfge dg fbgce ecgfdb fcabdg bafgec cdg cbdae gecbd ecgdabf | eafcgbd gd cfgbde cdg
|
||||
fadbg badfe faebcd gab ebfgad bfceag gfbcd gade adcebfg ag | gbfdea aedg becfad aedfbcg
|
||||
gcfbd dga bfdcga gafdbec dcafg defac ag adbfeg acbg bfdecg | dbgeaf ga dagfeb fagdc
|
||||
efdab cgadf cbafd fgbcda ebgfdc cfb bc gcba cefgad gfabcde | cagb fcdage bc dacfgeb
|
||||
acgfe gcedbf fge dbfacg bgcfa fcbaegd ebga eg feacd egabfc | geab fgabc cfaegb egfcba
|
||||
cef egcbd fbage cf bacf fecgba fbadegc fgdeab fcbge daegcf | dfaegc bedgc ecbdg becgf
|
||||
acdb bdegc fgced dgb fbdgace agefcb cegdab dbgafe bd baegc | fedabg egcdba bcafeg fdageb
|
||||
adbfce bfgc dfcebg efbdg cbefdga bdcge cb afgbde gceda cbd | ecgad egfdab dbc fgcb
|
||||
dafgbe ecafg edcbfa fdcg cef fgade cf gecab gdacebf cedfag | bdcefag gfdea eacgb cf
|
||||
acedgf becdgfa fgcae fdgac fdcgb aged gcfeba ebfdca ad adc | begfadc dfgac efagc fgcade
|
||||
gefbd beafgc dabge fgad ag bdcegf agfebd gba acdeb dgacebf | ebfgda egdab febgd adgf
|
||||
cdage gcebfda dea bceag de bfcdae egbd egbdac gebafc cadfg | ebdacfg agcbe adbcegf degacb
|
||||
becf fcd cabdg gefdab dbgcf ebcgfd cf bgdfe edfcag egafdcb | gdcfbe gefbd eagfcd gbcfd
|
||||
ec dagcf debag eagdc cfabed eca begc bfeadg dfcbaeg bgeacd | dcagf decgba eac cefabd
|
||||
gace egadbfc bfecgd dce beadf decfa gcfdab fcdaeg ec afgdc | afecdg badfcg cfaedg adegfc
|
||||
cfbge ac cea fdeab adfbgce fabceg dgfbce abcef acgb afecdg | bagc cfebg fbaec eca
|
||||
gfdcba bcf ecfdg bc baefgd efbgac caeb aegfb cebfg badfegc | cfb cfb cfdge cbf
|
||||
acg cagbdfe ca fgcadb agcebf cegfd acfgd dacb bdfga feadgb | edfgba fegdba gabfce bfegda
|
||||
eabgfc gfeac dgaeb ecgdfba cba eabgc dfaegc cb cfgb cdbeaf | agfec ecfdga aegbc bedga
|
||||
defgac eabdcf be faedg beag bgdfe gdebfa ebf bgcfd bgdceaf | dfgcb eb fdcaeg ebf
|
||||
db cfdbaeg baecgd dfbega bdgaf afebg febd adfcg aebgfc bdg | fbaegc fbgae bfde abfdg
|
||||
defbg cbdfeg dcbegaf cbdf cfe begca aegcfd ecgbf fc agdebf | bgfaed defagc efdgb cdfb
|
||||
ecdafb dbf bgdea abcf fdaegc dabfe fgecbd fb deafc fdacbeg | afdbce facb bf fb
|
||||
fa edfabg bfacd gcefdba fba agfc cfedb fagcdb agdbce adbcg | efcdb edgbaf cadgbf gcfa
|
||||
cfb gcfbea bacgfde bc geadfb badc bedfa edbfc ebadcf gdfce | gbfdae fcbedag gaefcb cebdf
|
||||
cfd gdeac ecbfagd cagdf fagcbd dafb egcfab bfgcde fagbc fd | fdba cagdfbe dafb dcf
|
||||
fcageb fa gfa dbfa begdfc dcega gdbfe eafcdbg fdaebg afged | faedg gfa afegcb eabcdgf
|
||||
feabc gf agdbe gedbaf fgbd gfbea becagd fge gadcfe cdeagfb | fgabed gf afcdeg aebdgc
|
||||
dfebc gedfcb bcgfd fde dgbe afcdge dcgfab ed befca fbcaedg | bfcged fde febca dafbgc
|
||||
ebafcd acbd cdebfg ead ecdbgaf edacfg efbag da fdebc fedab | cgbeadf bacd bcedfg gbcefd
|
||||
beadgc bd gcfba adgce cfedgab bgd cgfdae agcbd gadbfe bdec | gebfad dbegfa cbafg dgfabe
|
||||
fdecagb bdafce gbcfde egcbd ea eadg cbgae gbceda agcfb aec | cfabg cgfba cgdabfe cafgb
|
||||
ca fegabc bdac gecdfb feabcd cea eafgd aefdc dgbaefc edcfb | fbdgec aec cbad adbc
|
||||
baegfdc egb fcage bfcged bfdea gafecd gbac bg caegbf fegab | cfadebg bcgdfe gcbefd bgefa
|
||||
fdabge faedcbg dfbea gfcade dfe de adbgfc egdb eafbc badfg | dabgf fcagedb gdabef de
|
||||
bagcdfe dfaceb egdafb facegd cedbg ga dga bgaed fbag bdfea | bedcg afbged dfbea dcbeaf
|
||||
cdbef caebf defabgc ecfbag cd dfc aced dbegf fcdbae bdgfac | ecgbfa cd dc ecfagb
|
||||
facbdg dfgacbe bfcgd bcgedf bgead dec gfdeac fecb egbcd ce | gdbaefc bagcfed bcgdfea cdgbef
|
||||
abcef ebfdc dfagcb dcbgef ba daeb ceagf dcaebfg faecbd fab | dabfce abf fgdaecb dfbce
|
||||
cbe abecgf be gbacdf dacfebg eabcf aegcdb gabfc gfbe fdeac | ebcaf cdbfeag fcdea egfb
|
||||
gfad degab fcgdbe aeg bfedg abdgfe gefacbd ga badce fagceb | cfbged efgcab bfdeag fdbeag
|
||||
fgadbce edbag dgbcf dabfg fa fdaceg bacedg faeb bfadeg gaf | fa abfe bfdgae gdafcbe
|
||||
afde cfadbg gcdbe bfdecag ea efbacg abe cfbda debac dacfbe | fcbega ebadc eba cafdeb
|
||||
cefgad bdcef acdbfe edbgfc dae beaf bdacefg ea becda bgcda | gdacef adbefc bcgad dceafb
|
||||
dfbaecg eagfd cf acdf bcgea bcfdge efc dacfge efacg gbadfe | fc fce fecdbg caefgd
|
||||
afec daebgf dfgcab fcgeabd gef afcgb dcgbe ef gaecbf fecgb | fe cgfab debgfa fgceab
|
||||
cgafde afbgdce bgafc gabcfd bgdf badgc gf aecdgb ecabf gfc | acgfb gfdb cagdef fcg
|
||||
fdgec bgcad bfec gbefdc dbf gfdcea fcbgaed bf bfgdea gfdcb | ebcf dbcgf dbf bfcgd
|
||||
dfceb cdaf bdfage afebc bgfdec fa gbcfdae fea gbeca faecbd | fcgebd fbgaed afdc fa
|
||||
fgcaeb fcag fa bdace efbcg gdfbaec fab dfgbec abfce fabdge | gcedbf cefgdb ebcdgf efdgba
|
||||
afegdc fegdbc gfeab cdfb dcegba db bde degfc bafcedg dgfeb | gabcefd cgdbfe bde afgbe
|
||||
dg gbd adgfcb cfeagb bcfag bcgfd gdaf cbfed gcfaedb ecabdg | dfbgc dg cdfbe dbgfc
|
||||
cebgfa gcadfeb afcdeb dagfb facdg adbfge bdf db egdb ebfag | dbgfea db bgdefca dcfabe
|
||||
adbf fgd bcegadf cgfead egbfd bgeda bdceag bgfce fd aegbdf | gedabcf fgbde cbegf cdfgea
|
||||
ga cgbfd decba gaecfb dfbcga cbdgfe cbdegfa fgad agcbd gab | dagf egfcab bgcda cdfbag
|
||||
egbfa geca fabcg edfba fge fdcagb cgebfa dcefgb bgdface eg | egafb fabeg fbade aefbg
|
||||
egcad fadbge fbgd faebg acdbfe edabg bafcgde dba db fecbag | dcgae cbeagdf dacbfe db
|
||||
ad dcbag cegdabf cgbea feacgd adeb debcga acd agbcef dfbcg | dagcb aegbc cad dgfcb
|
||||
cebad cfadgbe ecd gdcbae cage cgdbef ce cgdba gcafdb adebf | adecb cfgdab cedbgf daecb
|
||||
fagceb cbdef cabgfd gadbc ae dfcgeba gcebad bae aegd abdce | abe bae bae gead
|
||||
efgcab eagdf de ead bfde cdgabfe ebfdag fbeag agedbc gfdac | fcgad eda dgfac eda
|
||||
gfbeadc cgeafb gdecf bcedgf dfgca cdagef bgafd afc ca cdae | fecgad dfgce cfebga gdfba
|
||||
fc egfbcda dfc degfca fgdbc dafbg febc dcebg cebgfd ecbagd | eagdcf efcb agbfd bfecdga
|
||||
db acegb fdbegac dgefa gfcdeb egadbc cdba bde geabd becfag | dbfeacg adcebg cgedab decfbga
|
||||
ecg acfgde cedb dfecbg gcfdba ec cdbgf cfebg efdbcag fegba | ecbd aedcfg cgfbe gec
|
||||
fgcadeb ecfagd egfda cd cdf edac fecdg fagdeb gfdbca gcefb | dfgea adgebf dbfgeca cfagbed
|
||||
cfgedb fgdba cgdef edgfa ea fbaegc age decgaf aced gbedafc | aecdgf dfbag aced dfecbg
|
||||
de agebc bcdgf fagbec adbegc cbged daec gdefacb deb gdfeba | gdbace aebgc begfad adcbfeg
|
||||
fdeg cfbgda dcaef dceab gdefac dcf cgafe begdcfa cfeabg df | fcd gdabfc bgefac egcaf
|
||||
efgbd cgfbe gcb egabcdf debfag cg cgdbfa bceaf cdge degfcb | bfegad cgb gebdfc decg
|
||||
aefbd bfaec bdgcaf dgeb de fgceabd fgaedc egbdfa badgf fed | bgafde fbaed gdfab gbed
|
||||
bcdea defagbc fdce cbfade fagbd egcfab cf adgebc cbf dfbca | gbadf dcef dcefab gbcfae
|
||||
abdc cb bgc bacfeg fabgd cfdeg fcdbg gcdebfa dgaebf dgbfac | gbdcf fcbadg cbg ebagfd
|
||||
bfgca gfbadce dbcag ecabf cfgead fcg gf edabcf fbge afgbce | bgcda cdgba gf bfcgaed
|
||||
afgbde cfdgb afbcge gbfec ec cfe dgface gfbae fcagbed beca | cbgfd fdcbg gadcef cbdgf
|
||||
bfdga gaed dbagfe cgdbef edfba bcaef de gbeadcf gdfacb bed | ed aegbfd adbfgce de
|
||||
adcb ecgafd ba abf bfedca gdbfae edcaf bgaefdc fcbeg fbeca | efdcga ecgbf gcefb dbeafcg
|
||||
ac bdecf bac daegb bdegca bcefga gacd febdgac abdgef badec | cgda cagd bgaefd dagefb
|
||||
gcd ebcd cgfbade dabgfc gbdcfe fdcge gceabf dc gfead ebfcg | gfdbce baefcg dceb fcebg
|
||||
ceg cfgae facbde ge gcfba bcdfega edacf fcgedb dage cdegfa | dafce ge cdfae fbdeca
|
||||
decgf fadeg fgaced febda eag fagc ag bgadec fegbdc bafecdg | afdeb badfe aecfgd adefg
|
||||
da bdeca fdgbce afdbegc efbac gacedb fbdcga acd cdegb gdea | gdea facbe cfeab bedca
|
||||
ebagdc cdaefg cebfg fadg gd ecgfd dge afedc ebadcf dfbcage | eacdf dagf cgfbe ebfcg
|
||||
fdbcea ag fag fegdba ecagfd bdgcf afecd afgdc cgae efgabdc | fdaebcg caeg cfgda dgfbc
|
||||
ea cabgde acbgfe cefbgda acde edbcg aeb ebfgcd dfgab aebgd | cafbge dgfab cdgbe deca
|
||||
acfd ebgfcad fecbgd dcgabe ca eagfc eac gefab gfdce cgfdae | cgaebd fcad geafc egdacf
|
||||
fdecab bf fdcb egdaf cgadefb edacgb ceadb daebf afegbc efb | dfebca cedbaf ebfcga dfecab
|
||||
badef fbedag daebcgf bgcfa dacgef cfadeb dac dcbaf dcbe cd | afcbd dbec cebdafg bacdf
|
||||
fagedb acbge fceabg cegfb bagcde aecf cfbgd aegdcbf efb fe | bdfaeg fe febagc bceag
|
||||
efagd dfacg fgcb dgc cefbad cgabde cadfgb dbafecg cdbaf gc | caebdf bcaedg afgde dfcga
|
||||
egcbf gbdafe fd edf gfecd gcbdae aecdg fgdcea gacdbef cfad | cfbeg cedga fadc facd
|
||||
bdfceg acd dfbce bfdag ac adcfb daefcb egadcf cbae edfabcg | dbeacf fadbg abecdf bedcf
|
||||
bcf badcf ecdaf eadgbcf abgf defcbg bf ebgcda bcgda acbfdg | fcb decfa fcb facbgd
|
||||
da cda adceg bead abgcfed ceagdb gcbed cfgae agdbfc dfbegc | fgdbec cdgfab gebadfc fgcae
|
||||
gbaecf debfg dbaceg badc eagdb ab abfegdc dcgea cdefag bga | ab cedbafg afcged cgdae
|
||||
dacfbge dafbc baegdc fagbde dacgb fbcg bdfcga fb abf fdace | acegdb ecfad badfc cadfgb
|
||||
acbgf gadefb cd egcfad bedc cad cadbg cagbdfe gdeba bdgaec | gceafd gbfac egfabd dcbe
|
||||
fdbgcae feacgd gcdfe cgdefb gabfe defgb dgb db caegdb dfcb | cgfde cdebga cgdaef gedcaf
|
||||
ae gacbe facbge cbdefa eca acfdbg afbgc gecbd gcaebfd agfe | ebafgc fgae bcaeg ecgdb
|
||||
bfdceg badecfg bgefda ba bfa cbda fcage cdeabf fbaec efbdc | bcda fba egacf efabgd
|
||||
gbc bdgce gcbdefa geac cg bedca dfbcea dgcabe afdcgb gedbf | dfbcea fcdbea gc dfabec
|
||||
becdf gaedcb cgedaf aegcf fagcdeb gfab gefabc cebfa bca ab | ab gaebfc dceagb fcbdaeg
|
||||
eagbc acfdge db gfadc fdgb fbagcd dba dcagb gecfbad efbdac | fgbd cgdeaf cdgaebf eagcdf
|
||||
ga eafg adbge gabdecf cbade bdgfea afgbcd gfbde gab cgedfb | gaef cabed fbgdae agb
|
||||
efabc cdeaf dgcfa ecbafg ed dagfbe bfadec egdbfac cedb efd | efd bfeca bdcfae de
|
||||
bagf fb cfeba gcbade cgaeb adfce befgcd cfb defabcg gcfaeb | daecgb bgeca egcab febdacg
|
||||
dfceg gfcedb bdfea gb bfedg cgdb afgebcd fgdace cbfgea fbg | gb dcbg bedfa gfacbe
|
||||
gecfab dacgf cfbgdae afdcbg afde cea gcebd fgecad gcdae ea | edacg ea ecafgd gacbef
|
||||
ag afg bgcdef abfec begdf gadfbce bfgae egbafd egda gadcbf | gafdeb ga bafec dcgbafe
|
||||
cgadf cegdbf egaf dga efcadbg dfcge ag cabdf eagfcd cegdba | bcafd gdcfbea cdbaf ag
|
||||
dcbge fdgabc cegba aegfc gfebdc ecfdbga aedb cgebad ab bga | ba aebd bgaec cdbeg
|
||||
cdg fgdb adfecb gdabfc cagfd fbadc febcdag cdebga geafc dg | gd deabfgc fbadgc fcbdae
|
||||
debgac fceadb eg gbcfeda gfabde efgd gfbac feadb gbe baegf | baedf edgf cabdeg befdca
|
||||
cf bgcfe cfg cdgabe cbdf dcfegba bgafe cdefga gbecd edbgcf | dbcf fcbeg cbdf eagbdc
|
||||
cbefag gbe agec cbgfdea gdbfa facbed dcebgf eg eafbc ebafg | baefgc bdfeca eacdgbf egac
|
||||
gfd bfgec dfeagbc fedgbc fd cdbf fbeagc efbdg ecgadf daegb | dgf dgf ebdcagf eagbd
|
||||
fcedbg bcde be fgbecda bfe fadecg edgbaf gcdef becfg fbagc | efdcgb bfgead ecbd fcedg
|
||||
fbdgae gefabdc bfgdca gbf fcabed cafbg bcdaf gcbd gb agfec | acgdfb abgfdc bfg fcaeg
|
||||
cfbegad gdfcb bfgde bcdegf egcb bc adcfg gadbfe beafdc cbd | fgadc adecbf gdbefc gbdfe
|
||||
abgcf ecabdgf dba acgdfb gfebd dfac adbgec da afgdb cbaefg | fbagd dbegf begdf defgb
|
||||
bdecfag ef bcefda adgce feagbc gbef gfcae fcgab afe fdabcg | cgfeab cfgea bdefca afe
|
||||
dg cbgeda bgdfa egfd dgb gebadfc febcda gcbaf deabf gaebdf | bdfgcae afgcb dgb bceadfg
|
||||
cfagedb eacgd baecfd cbafd ef eaf bdfe fgbcad dface febacg | afe fea fdcaeb cedga
|
||||
fdageb egbcf ec ceb dgcbf gfeba fegcab acef bgaecd cebadgf | bec dgafeb faebg fcbge
|
||||
agecbfd fcd gbedac dbcfag dfacg df gbcda fcaeg febacd dfgb | dcf gcfea acegf gdabfc
|
||||
dafebc gbfa agdfc fbcgad fgceadb cdbfg bf bfd adgfec bdcge | fb adbfce feacdbg gafdc
|
||||
caebgd bgcf gabef bf agbec abfcged bgeacf ebf edfag cfdeba | gaebc fdega ecgba egdfa
|
||||
deba eb bfe bfaedc ebfdc cgdfae gdcafbe cbeagf bgdcf dacfe | gefcab gbcaefd fbgcd bade
|
||||
aefcbgd afcde cea aefcgd dgefba efagd ca cagf gcdabe edcfb | adfgbe fgead abfged afgde
|
||||
cadge fbagec ag ebcdgfa dagf afedc age ecdabf cbdeg gcfdea | eag cafde ega gfacbe
|
||||
cbgefda acd afgdeb dc fdgab dcbfae gdbc cdbgaf acfeg adcfg | fgdac efdgba dfcag efbgcad
|
||||
cegad bfgcd baegfc facgd aebgdc af fag feda edafcg cgfbdae | af agdfc gbdafec gfcda
|
||||
aecgdf ecgfb bfdea cfbaged dgbfce cdf gdcb dc bcdfe aegfbc | dcf gabcef ebcgf fdc
|
||||
bcafe bfcdea febga ac cfa cdeagf dabc cfdaegb cfedb cfgebd | bedfc dbfgce dcfeb egfba
|
||||
cgfedb afcb fdc fc bdgcea gacdb gedaf ceafbgd cfgda adcgbf | cgadb cafb dcf adfeg
|
||||
ebcf def cgaedbf becad bagfd egdcab fgaecd ecfdba ef dfbae | eabfd becf adcgfe gbdfa
|
||||
gcfabe gcabe dfgca beagdf fbg abfgc bfce bedcag fb fbcagde | bgcae bfce fb bgfeda
|
||||
dca ebfdacg cgbd gabfde cgfad gadbcf cfeabd fgeac bgdaf cd | cdbg cad dac cd
|
||||
ebfgadc efgbad bdfceg cbdfg gecb bfedc fgb gb dafcg fedbac | fbg fbg cgeb gebc
|
||||
ecadfb fdgceba gdebac dea fegdc feagcb ebafc fadce da fabd | bfcega cbaedg cbdeagf bafec
|
||||
dbf fdaceb cdgefa bf febgacd aefb fdbca cdefbg dcagb edcaf | bacdf dfacb cbfeda aegcdf
|
||||
gdbef bae edbfcg bfcag agde gebaf gaebfdc cfdabe afdebg ae | defbag afdceb gebfa agbfed
|
||||
edabf dgbcf bce afecgb degc dbfec bfgcaed ce bgdcef cdfbag | gedc cbfed dfbgc cdeg
|
||||
bdcfga fag dgafc fg dacbf bdafec cfbg fabdgec eabdfg eagcd | debcaf eacdg geabfd gbefad
|
||||
cgfda badfc ba gcfdba acfbdeg bcga ebfdag faegcd abd dcfbe | afcdbg acbg ecdfb bdfac
|
||||
bcdae febgc egdbafc fd gcfd bdefc bcedgf fbdega fde fabegc | dfbgec efcabdg cfbge gdeafb
|
||||
bfedacg agfdec deg gd decbf ebgcd eadgbc gbfeca bceag gbad | gd ceagb gd gdcafe
|
||||
acbgd dbfceg cegfdab dbaegc aebcg ecb be dcbgaf egcfa eabd | adeb bec begcdf gfeac
|
||||
gda debfa gdfe gd cfdgbae bdagec badgfe bgdaf cbdefa fcabg | geabdf abefgd dag ebdaf
|
||||
febgcd cdaegf bf fabge edafbgc gfaedb baegc ebf fdage fabd | dgecaf badefg geafd dfeacg
|
||||
adegfb cbgefda dcag agbfdc gbcfa gadfb bfecg ac acdfbe cba | bfgca facgb fgcba ecfdagb
|
||||
adcf fbecdga dbeagf ac eca gefdac edcag cfbeag edgaf cgebd | dcfa cadfge adegc gcaed
|
||||
acbdgf gaecfb ad cbdfaeg gebfa gcbed efda gad baegd afedbg | gbfea aegbd adg da
|
||||
da abd dbgfc dgca gadbf bcgedaf dfbacg fbeadc bfecdg gabef | cedbagf dfcbg gbdacf gcbfd
|
||||
agcdf cbfgd da dacb cagfe abgdfc aedfbg agd edcbgfa fegcdb | da ecfag aegbdf adgcbf
|
||||
cd aegdb acfbe bgdc ebacd dbfgea feacdgb agfdce dce dbceag | acdegb gbdc gacdfe dcbg
|
||||
abc deacbg aecf cgafb dcbgf cgfbae gbaef ca geabdf gcbafde | cgbfd fcea abfeg feca
|
||||
eagcb edacgfb abfegd abedf aefdcb gfda dcbfge gbafe fg gfb | cbfade acdebf gdfceb bgf
|
||||
dgcab aedgb gbdcfae acbe beg gebfdc gdbcfa fdage dceabg be | gcedab baegcd bdega beadg
|
||||
gd dfcgea afdgeb cdfae befacd beagc ged daegc afebdcg cdfg | cdega dcefab gfaebd ebgac
|
||||
gfcebad gfeca bdcae fbeg cbgafd bg dcagef gab gacbe fabgce | ecbad abg agecf bg
|
||||
fegdc bdag gbedac dcfeba gfeabc ebfgdac gedac ga ceadb cag | fecbag ebdcaf bfcega aegdc
|
||||
deabcf dcfa cd ebgfda ecabg aecbd cegfbad dbc cgfedb faebd | gdcbfe cbd befad dcebfg
|
||||
gedcab bagdfe bf aecdf begf aefbd dbf eabdgcf bfdagc eagdb | fdbea fb cedfa gafdbe
|
||||
cgfd afecg cedgfa eabcd aefgcb afdgceb dfa fd eafcd debfga | afbgec gadebf fdcg acfed
|
||||
cdagbe agefb fedabc fagcb gfebdac fgde baegd fe eadbfg feb | gebfa aecbfd fe bedag
|
||||
adcfb bdcga df daf gdabfe cafdbe cbgfae decf becfa cbgadfe | gdbfcea fgebad fad bdacg
|
||||
dcgef agc cfbadg ga afgec bcaefd efcba abeg cdeagbf aecbfg | dcfge fbgcae bdgfac fcgde
|
||||
adcge gdcbaf bad cgdeaf bced abfge dgaeb db aedbgc ebdafgc | acebgd bad bad bdaeg
|
||||
bgd adfcge gdacb fadb bd degfabc bcaeg dcfag gefdbc gbdafc | bceag badgc db cfdgbe
|
||||
bdf cbadef ecafd bfacdg bd cbde baefd afcdeg ebgaf edagcbf | gdbcefa dcagfb bfaed dgacfe
|
||||
cbdaf efbd ef afbec caefgd dagbecf gcadbf cbgea dbeacf aef | afbdc cgfdae caebg adgecf
|
||||
gbfec ed fgebdc defacgb deb gedc cfebd fedbga cabdf abcefg | gedbfa dfbegac bgcef cbfed
|
||||
dgc aedcg aedcf gd acegdfb cageb edgb dgcafb cbegfa ceabdg | egbd beacgfd aecfbg gd
|
||||
abf gdbaef abgfc bf gcafe bdagc dbcagf cadbge bdfcgae fbdc | gfcdab fbgca adbegc cfbd
|
||||
becfdga eac acedf cgbeda gafdec fabcd egfda ecfg dgaefb ce | cfead afdec gafed bfcda
|
||||
bdgceaf febg bfacdg feacb gaebfc aebdc ef cfbga facegd fec | bcfga ecf cfbea acfged
|
||||
baf geacf ab cfdebga cfbgde fgcbd gfbdea dbac gcfab adbcfg | bcdegf bgcdfa dgbfca gfcae
|
||||
cd ebgcf ebdc dagbf fbgced fgecab cgd fedagc fbcgd fgecbad | fbcge bdafg cfdebga cbed
|
||||
dfbcag geafc agdec da gad dgecb cgbfae faed edafgc adcgfeb | cagefbd dfbgca gdceb edcga
|
||||
dfegac aegbf cg ceg agceb bafgde cebda fgbc cebgaf aedbgfc | bfcg efcbag ceafbg fbage
|
||||
acdfg egd fcge fecdga ecbfgad eg aedcb eadcg gfebad adcfgb | ceabd afdegc aecdg gfbaed
|
||||
fcbadg faebdc ga edga fcegb geadbf gefab bafde afg dcegbfa | fdceab bfgec fag cgefb
|
||||
fbge bfeacg edabc dgbfca egdacf beacg gae fceabgd ge fcabg | aebgc abefgc bgef gcafb
|
||||
cbe fedgb aedc ecbfga ec dabgc bfegdca degbc cgafbd bdeagc | fbedg fcbaedg dgcbe bce
|
||||
gbdc cb edcfa bagfd agfedbc agfbde dfcab cfb gebafc cagdbf | bcf afgdb dbcfgae cb
|
||||
bgdae fbagde cegdbfa aegfb fb dbfe gbfdca ecdabg fgb agecf | gadeb bgfade fcbaedg gabed
|
||||
bfacdg ebcfda cgdfeb edbfgca feadg cfa gabc cgdaf ca cfbdg | ebgfdc bafgcd fgade afc
|
||||
cgedba abcfge ade fgdbae edgaf egbaf edfabcg bfde ed gcadf | cfdga gaedfb adegcb fgecab
|
||||
fbdcea bgdcf abfcgd gcab dcgbefa dafcb afbgde fgedc gdb bg | efcabd bcgdf badegcf acdfgb
|
||||
ebdf dcafgb afdecg ebgca adbfg fe efg bcfdage eabfg agbfde | agcdfb badgf geadfc abefgd
|
||||
daebc bedcfa def eacfg eafdcbg bcdf edgabc df dfcea gaedfb | fecadb gedbfa dcbea egbfad
|
||||
gf gdcf cdabf bceadfg dfcgba cbagfe gdeba fbdag gfa dbefac | gedab cfgabe cfadb gbdaf
|
||||
ced edcgabf dgfceb cdbg fbceag daefg ecdfg cd cfbge cabfed | ebdacf dec dce dacbegf
|
47
2021/08/prog.py
Normal file
47
2021/08/prog.py
Normal file
@ -0,0 +1,47 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
ret = []
|
||||
for line in f.readlines():
|
||||
parts = line.strip().split('|')
|
||||
ret.append({
|
||||
"ref": parts[0].strip().split(' '),
|
||||
"out": parts[1].strip().split(' ')
|
||||
})
|
||||
return ret
|
||||
|
||||
|
||||
def result(inp, part = 1):
|
||||
res = 0;
|
||||
if part == 1:
|
||||
for data in inp:
|
||||
for s in data["out"]:
|
||||
verbose(s)
|
||||
if len(s) in [2, 3, 4, 7]:
|
||||
res += 1
|
||||
else:
|
||||
for data in inp:
|
||||
for s in data["ref"]:
|
||||
s = list(s)
|
||||
l = len(s)
|
||||
if l == 2:
|
||||
one = s[:]
|
||||
elif l == 3:
|
||||
seven = s[:]
|
||||
elif l == 4:
|
||||
four = s[:]
|
||||
elif l == 7:
|
||||
eight = s[:]
|
||||
a = list(filter(lambda x: x not in one, seven))[0]
|
||||
|
||||
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 1))
|
1
2021/08/sample_p1
Normal file
1
2021/08/sample_p1
Normal file
@ -0,0 +1 @@
|
||||
acedgfb cdfbe gcdfa fbcad dab cefabd cdfgeb eafb cagedb ab | cdfeb fcadb cdfeb cdbaf
|
10
2021/08/sample_p2
Normal file
10
2021/08/sample_p2
Normal file
@ -0,0 +1,10 @@
|
||||
be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
|
||||
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
|
||||
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
|
||||
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
|
||||
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
|
||||
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
|
||||
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
|
||||
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
|
||||
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
|
||||
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce
|
10
2021/08/test.py
Normal file
10
2021/08/test.py
Normal file
@ -0,0 +1,10 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
# def test_part1(self):
|
||||
# self.assertEqual(result(get_input(sample = True)), 26)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True, part = 1), part = 2), "5353")
|
||||
|
100
2021/09/input
Normal file
100
2021/09/input
Normal file
@ -0,0 +1,100 @@
|
||||
3566789567953212679875689976651013679329876404568999884568910249798689921989789990134578923557899767
|
||||
2675895456894334598764999865432124567919995323789498765779991998654578899766678981245678912346789656
|
||||
1234996345789445679989899976543534678998999464569329876899989897643659789954569876456899101237891235
|
||||
0125679234579659789998789988754755889767898965678912987998976799532345689823678986567984352346932996
|
||||
2336798945689867894987679798768887998654967899889923498987654678990167899764789998988975443457899889
|
||||
3578987999795978932976589659879998999543456799999894989998543457789278999876799989699876595667989679
|
||||
4569876788954399999765479645990239998754899899998789878987632345678989998998999876543997989879876568
|
||||
5879854567894123989897568924921678919995799998999699869865421234589199997829899998732109878997654347
|
||||
6998642458963239876998779219793599939876789397689569654997642345691019875215689349883319768998765656
|
||||
8999843579654569765789899998689978899997899498534458932398543456789229764303478959765498757889876767
|
||||
9999954678975878974567989876568356789249988987621267891397686567898996543212367899889987645678988978
|
||||
9989975679986989893459878976421248993149877896532356953998789689946987755325456789998766436359999999
|
||||
8878989899998998782398967895310237789239966987646457969869898790123499869456567896987754321269898943
|
||||
7567892999889896531297656789431545678998755398758568979854949932334931998979878945796543210198787892
|
||||
6454693498766789320198967998698656899876534239878978998763238995449892397999989323987695423239676890
|
||||
4343989987655996431239998949898768998764321012989989679894346789598789986897993212398986734598545789
|
||||
4212467986434897545356999235979879899965432124994394567985456897679659875656899424999997865697434679
|
||||
4101347897323789657467892123467989799877656734789212378976569998796549864345678949898998986986523459
|
||||
3212356789595678998979999994999995678998867645678934989298678999987659764234567898757999297987534678
|
||||
4534598899989789999597898789878954579899998756889899891029789995499769872125679999545789398997645689
|
||||
5645678978978999897456987678969643499798789887998789789939899989998998761016989987678995499998756997
|
||||
9896789654769999785349876513457965987689678998997675689899999969877899843127898898789329986899987896
|
||||
5998996543457789654298765425578976798896567899876534996789998753766797654238987649899998795789898965
|
||||
4699764532345678979129986634989498899975489986987329894345987642345989765649898434999876534679799234
|
||||
2987643210156789998934899856892349987684349865696498789234596521235678996756789646798765423235678965
|
||||
0198654321789898997896798768950234998543298764987987676995789432345989987897999859987654210189899876
|
||||
1239968645678987986897899978931299897654399543499876545789997646559891098998964998999766323568998998
|
||||
5349898757989976545789934599892989789775987632989765434599898968698789989799765987899878545679357989
|
||||
7498789868998988637996549989789878678989898321976653223476789979899678975699879976678989857790239878
|
||||
9987668999987694329689998879679765457899765493495431012345991989998567994989998104589099767989998765
|
||||
9898556789876542104579897657567931266789879989987654223457892499876456789879876323679239899879899654
|
||||
8767347994987969223456789543459892345899998779898654336567954931964345698767965434589345999768698923
|
||||
7643245893299898999968897651669789456789987667799765559698969899986556789656987675689489987656567912
|
||||
9844156789349767987899998769898679667999876545687986798989999768987687896546798989797679876543458901
|
||||
9921078895497659876778999899987568978910987632456998987678989656798798998634569999898989987652345892
|
||||
8762135996569443124567899989876467899999798321269899976567878943899999798765678934999893298793456789
|
||||
9854345789998321012456998769765326798987654210198787898434569942996987659886789923598789109654567996
|
||||
8765656899876532126567899849954204567899965321987656789213467899785698543997896899976678998798778935
|
||||
9877897987987673234878912998765323478989896432398767896323456997654987685798945698964567929899899921
|
||||
6998998976898998549999899899976534889875796563569878975434567896543299876899434997853598919910979892
|
||||
4599659985449987678945798789987645678964897678978989876545678976431012997965429876212989998532356789
|
||||
6976545976232398789432987679898768789985679989999491987657789998679193999986210995304878987654898991
|
||||
9898679984101239894320976545789879991976899999789210199879997899798979893297399873213467898785789990
|
||||
9789798643212449965449865434599989210987999897698931249995676789987668789198989965325679949896899989
|
||||
8698987654323498979567997323478994391298987653567992398764545898976555678949979876566789923987989767
|
||||
7577898765434987698989986510567895989999989742455689999973136957965434599129864987898899812498977946
|
||||
4346569986565996567899965432456999979899976541234567893492012349994325989239753498999975701469765435
|
||||
3265455697679875456899876563567898767789876420125789932987324598989202678998542349899974212359889576
|
||||
2101234998798754347689989675678987645698765431345678921986434987578914568987321235799865343456998988
|
||||
3212649899899654236578998799789798534579876542767899510397675996467925679965430124678976659767987899
|
||||
5434598799987632125467899899897654325678998659878996421298789894348897789876576434679989898979876789
|
||||
6549987679876545012345999998989865456789999778989987692349898789256789896987797678999899987899765466
|
||||
7698896567987652123656789977678976567898789999097898989656989698967897995498949899878789875987654355
|
||||
9987623456799743245778898867545987878998678789156989878969768456998975789349421956965697654599776234
|
||||
8976512346987654356989987654434699989697547679345976967899654345789654248996532349876789523498765455
|
||||
7654401467999767467893398763123498798798534568959875656987865257899732056789945656987894312349876878
|
||||
8743212378999899879932109854012998679987323578998764345976772136678943167899896767898954201956987889
|
||||
9854434456799975989799349754129876598765435789999879109865321024599955389998797898949969319899998999
|
||||
8766789578999654394698959843298765439989546999899998913975453245689867899989689999439878498678999678
|
||||
9898997679998979213997899654349654323498757898789997929989964366795978939876579989923989987569897532
|
||||
9989698789987654339896798765798766437569968935679976798999878479894599123989468767894698675458789421
|
||||
9876549892398769498765689986789976545879879546989875787899996589965789094997398656789986436358679510
|
||||
9995434921239898998654787898997698976789989659899774656899987697976799989875234445698954321246578921
|
||||
9876545690123987987543456799434569989890199898798653245998698976897999877993101234567896210123467892
|
||||
0998766789439896987652345679323698999979988987649874067893569765798998966789245645798954321234679993
|
||||
1239977896598765798761457989212997897658767986534964249932469954319987845978966956789765543376896789
|
||||
3399798999977554569892567894109886997643457954323975957891398765434596534767897887990987754457895992
|
||||
4987669498765432498773459943298765789432129865434599878910129976545699721456998999321599865598999893
|
||||
5796442349874321987654767894998654598943019876545689989321234989686987632345679765452469876679999789
|
||||
9987321298985430199875678999876543497992124989656799997532346898787996543457799996569569987897987678
|
||||
8998532397654321234989789589987832986889434598779899898653457939998987668568899789998978998946986583
|
||||
6987545459865439356999892378998543965678945989989959789864579321019198789689947679876799999439875432
|
||||
4398756767987898967899943469998799864699659875697943679875689432329099898795433597997899988921994321
|
||||
9239767898998987898998764598799986543789769864756892467988789553458987969893212345698998777899876434
|
||||
8959879949799896999879876987697897674678998752245791345799899964567996546954323456789999656789989645
|
||||
7899989234698785878965998996546998865679219541024689859892999895679754323598435697999898743234698757
|
||||
6988995345987654667894319998434869986789997432123499767891298789798765434987646788948799865459789878
|
||||
5567976986896543456796101989322646987999876543234578979910989698999876545698757899235689879878999989
|
||||
3478987897989552367997429878910235698989989654345689989429878567899989856789898910149793999989989994
|
||||
1567898939878421058789698667921234569875298765468789996567968345689998767998999321998932349995678943
|
||||
2349899024965434145678999549892345789943129976578898987699854254678999879877898939897890198789789532
|
||||
3456789139877543234567987623789959898754434987689976498987643123567899998765687998786791987679894321
|
||||
4569999245999875655789876434567899979876795698990987689999784347889978987644676789675679896578943210
|
||||
5678968996789987767893987547698997667987896999891298799899895456789767696532345896563498765458964423
|
||||
6889345989892399889921297658999889543498999889789459898767976577997654595421476789412349876667896569
|
||||
7891239879901459998910198789998765432129998767678967987656988789986543987533469994201234988778999678
|
||||
8992398767899998767891239998769876821012987654569989993347899898998664596545678954354345999989998989
|
||||
9989499956798787656789399797654987732223498753878899982156789987899779997687899765998656789499987899
|
||||
9879989877998654545999987589543597654334989762657789876234999876789898798998939879879997892349876798
|
||||
9767678989876543236678998679421999776459875321045678985456789765689987659999123989768789943589865457
|
||||
9854589996998752134567899798939898997579986432123567996567998754579898767899934598757678998678974345
|
||||
9943499875689875238989989987898787989789996543456998998679996543466789878979899997644567898789996659
|
||||
9875679654579954346798776896989655878999999658567899989989989432345994999569787895432456789898789798
|
||||
6986998963298765497987545945678933356989898767688999879899876561235893212498656799501234568987679987
|
||||
5699776792129897679986534124569321239879789979799998965789864310126789423987545698912356899976567896
|
||||
6798645989012998798765421012789432398765678994921987654678986432645678999895435987894467899988678945
|
||||
7894534568999129899876532127689943498754567893210199875789987844576789988757329875789578967899989234
|
||||
8983213345678934987987844234567895976623456895332349876797898655687899876532012964678999356976590123
|
||||
9876501235799999765698977346788999875412346896546456997896919798798954987653329853568920239876321234
|
||||
8765432456789987543569765457899998765323467987656897998987909899899865699876598764689321298765432345
|
81
2021/09/prog.py
Normal file
81
2021/09/prog.py
Normal file
@ -0,0 +1,81 @@
|
||||
import math
|
||||
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return [[int(c) for c in line.strip()] for line in f.readlines()]
|
||||
|
||||
|
||||
def result(inp, part = 1):
|
||||
res = 0;
|
||||
width = len(inp[0])
|
||||
height = len(inp)
|
||||
lowest_h = [0 for _ in range(height)]
|
||||
lowest_v = [0 for _ in range(height)]
|
||||
lowest = [0 for _ in range(height)]
|
||||
|
||||
# get lowest in horizontal
|
||||
for y, row in enumerate(inp):
|
||||
for x, cell in enumerate(row):
|
||||
if (x == 0 and cell < row[x+1]) \
|
||||
or (x == width - 1 and cell < row[x-1]) \
|
||||
or (cell < row[x-1] and cell < row[x+1]):
|
||||
lowest_h[y] |= 1 << (width - x)
|
||||
|
||||
# get lowest in vertical
|
||||
for x in range(width):
|
||||
for y in range(height):
|
||||
row = inp[y]
|
||||
cell = row[x]
|
||||
if (y == 0 and cell < inp[y+1][x]) \
|
||||
or (y == height - 1 and cell < inp[y-1][x]) \
|
||||
or (cell < inp[y-1][x] and cell < inp[y+1][x]):
|
||||
lowest_v[y] |= 1 << (width - x)
|
||||
|
||||
# combine both lowests and get the overall lowests
|
||||
for y in range(height):
|
||||
lowest[y] = lowest_h[y] & lowest_v[y]
|
||||
|
||||
|
||||
lowest_points = []
|
||||
for y, row in enumerate(inp):
|
||||
for x, cell in enumerate(row):
|
||||
if lowest[y] >> (width - x) & 1 == 1:
|
||||
if part == 1:
|
||||
res += cell + 1
|
||||
else:
|
||||
lowest_points.append((x, y))
|
||||
|
||||
if part == 1:
|
||||
return res
|
||||
|
||||
res = 1
|
||||
verbose(lowest_points)
|
||||
basins = []
|
||||
for point in lowest_points:
|
||||
queue = [point]
|
||||
idx = 0
|
||||
while idx < len(queue):
|
||||
x, y = queue[idx]
|
||||
for d in [(x+1, y), (x-1, y), (x, y+1), (x, y-1)]:
|
||||
if d[0] >= 0 and d[0] < width and d[1] >= 0 and d[1] < height \
|
||||
and d not in queue and inp[d[1]][d[0]] != 9:
|
||||
queue.append(d)
|
||||
|
||||
idx += 1;
|
||||
verbose(f"From { point = }, the region is {len(queue)}")
|
||||
basins.append(len(queue))
|
||||
|
||||
basins.sort()
|
||||
res = math.prod(basins[-3:])
|
||||
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 2))
|
5
2021/09/sample_p1
Normal file
5
2021/09/sample_p1
Normal file
@ -0,0 +1,5 @@
|
||||
2199943210
|
||||
3987894921
|
||||
9856789892
|
||||
8767896789
|
||||
9899965678
|
10
2021/09/test.py
Normal file
10
2021/09/test.py
Normal file
@ -0,0 +1,10 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 15)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 1134)
|
||||
|
106
2021/10/input
Normal file
106
2021/10/input
Normal file
@ -0,0 +1,106 @@
|
||||
{{[([{{[<{{<[[()()]]((<>())[<>[]])>{{{[]<>}[<>]}<[{}{}][[]{}]>}}<<<<<>()>>((<>())<{}()>)><{{[]()}{()
|
||||
{<<{({{[<<[<(<<>[]><<>>){<{}()>[{}()]}>]{{[{{}{}}([]())][{[]()>[[][]]]}<(<{}()><<>[]>)>}>>{[(
|
||||
[[<{<{{{([[{[[{}()]<<>{}>]}{{<(){}>{<>}}{{<><>}{<><>}}}][[<<()[]>(<>())>[(())([]())]>]])<{
|
||||
{<[([[<<<(<<<<(){}>>{([]<>){[]{}}}><<[()()][{}[]]>[(<><>)[<>]]>>){[<[<()<>>[[]()]]<<()[]>(<>{})>>[(([](
|
||||
{[<(<<{{[[[[(<{}()>[(){}]){[()()]{<>{}}}]]]]{([(<<[]{}><<>[]>><[{}[]]{()[]}>)])([<({<>[]}({}<>))([()]({}[]))>
|
||||
(<[{<[{([[(<<<{}<>){[]<>}>(([][])([]()))>[({()[]}<{}<>>)<{{}<>}{(){}}>])(([{{}()}<[]()>]<({}<>)(<>
|
||||
{[<<((<{([({([()]<()()>)({<>{}}<[][]>)}<[{(){}}](<<>>)>){<[(<>{})]({(){}}<<>{}>)><{<{}()><[]()>}>}
|
||||
[[([{<<(((((({<>[]}<<>()>))((({}{})<[][]>)({<>()})))[{[[()]{<>[]}]}[(<<><>>{[][]})({<>[]}[{}<>])]])[<{<
|
||||
(<([[{{<((<<[(<>{})]<[<><>](()[])>>>(<<{[][]}([]()))>)))>}}]])[[[({[(((<([{}<>])[([]{})<()()>]>))(<<[(<><>)<[
|
||||
{(<([<[[[<<{<<{}[]>>}[{(<><>)[{}<>]]{[[][]]<[]<>>}]>[<[<()[]>[{}()]]<([]<>){<>{}}>>[{{()[]}([])}[[[]]]]
|
||||
({{<{(<(({[{{<<>()><()<>>}}]}){[{{(({}<>>)}}<{<<{}[]>>}>]})((<((((<><>)[(){}]){<(){}><{}()>}){({(
|
||||
[(<{((<[{({<[<{}><[][]>]<{[]<>][[]()]>>[[[[]{}]](<{}<>><{}>)]}({{{[]()}[[][]]}[<{}[]>[{}[]]]}{(({}
|
||||
(((<<[{{{{{{<[<>][<>[]]>)}}}<<[[[[[]{}]<[]{}>](<[]{}>)][(<<>{}>({}()))]]([[{{}{}}[{}<>]]{{[]
|
||||
([<[<({(({<{[{()[]}][({}[]){<>{}}]}>{{{[[]{}][<>()]}}<(({}){()()})<[()<>][()]>>}}<([({<><>}({}))({()()}[
|
||||
<[{<[{{<{(<{<(()[]){{}{}}><{[]{}}{{}()}>}<{[[][]][<><>]}<<()}({}())>>><([[[][]](()<>)])>)(<([<[]<>><<>[]>]{
|
||||
<((({{<<([[<{({}<>)({}<>)}{[<><>][(){}]}>({[[]][()<>]}<([]<>){<><>}>)]][{{{{<>[]}[{}()]}[(()())<[][]>]}{
|
||||
<([<[[(<(((({[{}[]][[]<>]}<([][])<[]{}>>){[(()())({}{})](<<>{}>)})))))[{[({[[{{}{}}({}())]][
|
||||
([[(([{([[<<{[[]()]{[]{}}}{{<>()}}><[<()()>([]<>)]{<(){}>((){})}>>({(<()<>>{()[]})}[(<[][]><[]<>>)]>]{
|
||||
(({{[([{({{([<()<>>{{}[]}]{({}<>)(()[])})}((<[[]]<{}[]>>{(()<>)[{}<>]})[(<()()>){{()[]}({}()]}])}{(([
|
||||
[[[(<[<{{([[[({}[])]({(){}}{<>})]<[<{}>]>](([[<>()]{{}{}}]{<<>()>[<>[]]})((({}())<{}()>)<<[]{}>>))]}(<<(
|
||||
{{([<[<<({({[[{}[]]<[]()>]<{<>{}}[[]<>]>}(([{}{}]{{}<>})[<[][]><[]{}>]))[[[{()[]}{<><>}]]]}<
|
||||
{([<[<[{[(<{([()()]<[]<>>}<[()()]<()()>>}<{[[]()]<(){}>}([<>[]]{<>()})>>[[((<>[])(<><>))[{{}()}[<>[]]]]<
|
||||
<{<{((({[[[<{<[]{}><()[]>}>([<<>[]><<>()>]<[<>()][[]<>]>)]]]}(<({<<[(){}]><{[]<>}[{}[]]>><{{[]{}}((){})
|
||||
[{{{([{[([<[({[]{}})<({}<>){<>{})>][{{<>}<<>()>}<[<>{}]{()[]}>]>{{[[{}<>][<><>]]{<{}()><[][]>}
|
||||
<<{<<([[([[(<(()<>){[]()}><{<>[]}<<>[]>>)]{<(<[]{}>((){}))([[][]]({}[]))>{[({}[])(<>)]({()()}<<>[]>)}}]
|
||||
[[([{(([(<[({({}[])<{}[]>})(<(()())(()())>[{<>{}}({}[])])]>[(<<(<>{})>[<{}{}>[<><>]]><<[()()]
|
||||
[[{{<<((<[{{<(<>[])(())>}}<{{<()<>>}}>]{{<{<[]>(()[])}(<()()><(){}>)>}(<{<{}[]>(<>())}[<()()>{<>()
|
||||
<<({<<([({((({{}{}}<[]()>)([{}{}])))[<[<<>{}><{}[]>}{((){}){{}{}}}>(<((){})<{}[]>>([<><>](<>[])))]})[
|
||||
{({<(([[<{{<[<()>][[[]{}]{<>{}}]>[[[()[]]({}<>)][{[][]}{[][]}]]}<<{[()[]][()()]}[({}{})(<>{})]>)}>{[[[{
|
||||
(({[[<(<[((<(({}[])([]()))<(<>[])[()<>]>>))<[[[{{}[]}<()[]>}]<{{<>[]}{(){}}}>]>]{[{<<<{}<>
|
||||
<{{<<[(([[([<{[][]}<<>()>><<<>>>])<{((<>{})[[][]])({{}<>}<[]{}>)}(<<{}{}><{}{}>><(<>[])({}<>)>)>]]{<<
|
||||
{([[<<[({[<(<(()())><{[]()}<()[]>>)<<([][])(()[])>[<[]<>><<>()>]>><{([<>[]]{{}})<{{}[]}{<><>}>}[{{[]}{[]{}
|
||||
<{[<<(<[[<{(<{{}[]}<[][]>>{[(){}]})([({}{})<{}()>]<<()><{}>>)}>({<{([][])}<{[]{}}<<>{}>>>{(<[]
|
||||
{{<[[<([[[{[[{<>[]}<(){}>]([<>[]]({}<>])]{<[{}()]{{}[]}>[<{}()>(()[])]}}<{[((){})]}([({}<>){<><>
|
||||
([<([{<(<[{[{{{}<>}[()<>]}<<()>{[]<>}>]}[[[<<><>><[]<>>]{<{}[]>{<>{}}}]]](<([<<><>><()()>][({}
|
||||
{{{[{[{([([<[[{}<>]{{}[]}]{<<><>>{{}<>}}>][<<[[]{}][()()]>{{[]}{{}{}}}>{[<[][]>[{}<>]]{(()<>){[]
|
||||
[<{{<[[[[<{<({(){}}[<><>]>({{}}<<><>>)><({{}<>}[[][]])(([][])(<>{}))>}>]<[(<{[{}()]{()()}}<((){})>
|
||||
{<<{{<{<({[{{({}())<{}{}>}[[{}[]](<>[])]}<({[][]}<{}<>>)<<<>[]>[{}[]]>>]{{<{[]<>}<[]<>>>{<<>[]>}}}}<
|
||||
{[(<({([([{[{[<>[]][()()]}<{{}[]}[{}{}]>]}([{{{}<>}([]())}<[<>()](()[])>]{[(()<>)(<><>)]})]<[([{[]
|
||||
({((<<({{([[<{(){}}<()[]>>(<[]{}>{<>[]})]<{{{}()}(<>[])}[<()[]><{}()>]>]<<[[{}[]]{{}[]}]({()()}[{
|
||||
{<{<(((<({[<{{(){}}[<><>]}<<{}{}><{}{}>>>]({<[[]{}](<>)>{[[][]]{(){}}}}[{(())<{}[]>}{<<>[]]{()
|
||||
<<{<({((<[((<<()<>>[<>[]]>{{{}<>}({}<>)})([(()()){[]()}]))[[[<[]<>><<>>]{<<>()><()[]>}]]]>)[(<{(<{{}{}
|
||||
[({<{{<<{<<{<[<>[]]<()<>>>[({}())([][])]}>>}>>}((([{{<([()[]]{{}()})<<(){}>(<><>)>><(<()()>(<>{}
|
||||
{[{<<[(<<[(<<{<>[]}{[]{}}>[[[]{}](()())]>)(([(<>[])(<><>)](<[]<>>(()())))[(({}{})([]{}))])](<<({{}()}
|
||||
<<((({((({<{{{{}{}}[[]()]}([()<>]{<>()})}>}){<{{<(<>())><<()()>[()()]>}}>{[{([()<>]<[]<>>)[<{}(
|
||||
(([[[{{[{{<<(<{}>{{}()}){{[]()}{<><>}}><[({}[])<<>{}>](<<>{}>[{}[]])>>([<<[]{}>[()<>]>[([]()){(
|
||||
<({<{<[({{(([{{}()}[[][]]]<{()<>}{<>()}>))<[[({}())({})][{<><>}<[]()>]]{[[<>]{[]{}}]}>}[({{<{}<>>}}
|
||||
[({{[<[[[[({<{<>[]}{{}{}}>{{{}{}){()[]}}}(<<()<>>{[]{}}>))]({[{<[]()>(<>[])}[(<><>)]]})]]]{<[<(
|
||||
<<<[({{{[{[(<{()}(()[])><([][])([][])>)({{{}}{<>{}}})]{<[([]<>)[{}()]]((<>())(<><>))>>}{<{{
|
||||
({([<(([({<<<<[]()>(<>{})><<[]>{<><>}>>{<{<>}{{}()}>({<><>}{[]{}})}>}[<<{(()<>)[{}<>]}([()()]<()()>)>[
|
||||
[<({{<{<[{{{(((){}))({{}()})}}({[[{}<>]<<>{}>](((){})[[]<>])})}(<<<<()()><[]<>>><<[]{}><()<>>>><<<()<>><<>()
|
||||
{{(([<<{{({[<{[]}[<>[]]>(<<><>>[[]{}])]{{(<>())({}())}[<[]()>[()[]]]}}[(<[{}()](<>{})><<{}
|
||||
{<({{([({<<[[[[]{}]{<>()}]{<(){}>{()()}}]>(<{{(){}}({}{})}<<{}()>>>{[<<>()>>{[<>{}]{<>{}}}})>}
|
||||
{{([<<{<[<([{[{}[]]}(<<>{}>(<>{}))]<<{()()}[<>[]]>{<[]()>([]{})}>)({(<[]><[]>)[<[]<>><{}()>]}(
|
||||
<((<(({({[(<{[<>[]][{}{}]}{{(){}}}>{{<<>[]>{[]}})){<{<<><>>}<<[]{}>{[][]}>>((<()<>>{()()})([[]()]([]{})))}][[
|
||||
[<[(<(<{(<<{[[{}<>]]}[{{<>{}}{<><>}}[<[][]>{(){}}]]><{<({}<>){{}[]}>(({}[])({}[])>}[{{{}{}}
|
||||
<((({{[([<<(<(<>())({}())>({()<>}))({<[][]>([]{})}({(){}}[{}{})))>>])]{<[{[<({(){}}{<>})>{{[{}()](
|
||||
(<<([<<(<[({(<{}()>[<>[]])[({}{}){<>[]}]}(({()[]}<()()>)([[]()]<(){}>)))(<{{<>{}}[{}[]]}([<>{}][(
|
||||
<({<(([[((([<<()[]>[<>{}]>](<[(){}]<[]{}>)<[[]][[]<>]>))(([<<><>>{[]{}}]))))[({({<[]()><{}()>}<[
|
||||
{[{{([(({[{[<[[][]]((){})>[[<><>]([][])]]{([[]{}][<>()]){(()[])[[]<>]}}}[<({{}[]}{<>()})[([]())<{}()>
|
||||
(<(<[<(<({[[((()()){<><>))[(<>())(()())]][[<<>{}>([]())][{<>()}[<>]]]]}[([{[[]<>]}{<[]{}>}]){<<([]{}){{}[]}>>
|
||||
[([{(<{[({(([<[][]>[{}<>]]<(<><>)>){({()[]}{()[]})({()}(<>[]))})<[[([]())[(){}]]{[()<>]<[]<>>}]((<<>(
|
||||
<(<{([{<[{<<[[<>[]]]><<[<>{}][{}{}]>>>([({[]()}<<>()>)[<[]()>]]{<{()<>}>[{[]()}{<>[]}]})}({{[(()[])<[]()
|
||||
({{<{{[<({{([<()[]><{}<>>]<{[][]}[<><>)>)[<(<>{}){{}()}>(<<>{}>[{}[]])]}<{((()<>)[()()])<((){}){{}{}}>
|
||||
<{[[{{{[(([<({<><>}{<>()})>({<[]{}>[<><>]})]){<[[[{}[]]{()()}]{[<><>)[{}{}]}]><((([][])){[[]
|
||||
{[{[[[{[<<{{[[[][]]{{}()}][<<>()>{(){}}}}{{<<>{}>[{}[]]}}}[({<<>[]>{[]{}}}<({}<>)[[]()]>)]>({(<<[]<>>
|
||||
<[[{(<({<({<([()<>])<{<>[]}{{}()}>>})<([<(<>[])<()()>>(<(){}>[{}[]])>([[{}[]]({})]{{<><>}<<>[]>}))[[{[{}
|
||||
<{{[[{<(<[((((()<>)<{}[]>)<((){})[(){}]>))][[<[({}<>){()}]<[<>{}]{[][]}>>({[()()][()()]})]]>)>}]<<<(
|
||||
[<[<{(<{<[(([<[][]>])[((<>()>([][]))[{()}{{}<>}]])({[[{}<>](()())](({}())<()[]>)}<{(<>())[(){}]
|
||||
[<<[[(([[[({[{()[]}(<>{})]{[{}]<<>()>}}{[{[]<>}{()()}]<([][])>})][{((<<>()>(<>[])){{<><>}<()[]>})<[[{}(
|
||||
<{<([[[([[{[{{[]<>}<{}<>>}](<{()[]}(<>)>{<{}{}>([]{})})}]<<{{{<>{}}{<>()}}<<<>()>[()[]]>}[{[[]
|
||||
{[[[([{<([(([[()[]]([][])][[<>()](()<>)]]<<{(){}}[(){}]>[{[]()}(<>)]>)<[[[{}()][()]]<({}{}){<>()}>]([[()()]{
|
||||
(({<(({[(<(({({}[])({}[]]}([[]()]([]())))[<<()<>>{{}()}>[[()()]]])>)<([[[[{}[]]{<>()}]]({([]())(<>())
|
||||
<[<{({{<{({<{[{}()]{[]}}<[()<>]<(){}>>>[[<[]{}>{{}<>}]<[[]]<<>[]>>]}<{<[<>()][{}{}]>{[()()][<>]}}>)}{{{[[[[]<
|
||||
(({{([([{{{[{{{}[]}{<><>}}<{{}}(<>())>][(([]{}){<><>})<<[]<>>[<>()]>]}}{{[([<>{}]<()()>)({(){}})]({(<
|
||||
<<<<(([(([{[<[(){}]([]<>)>]((([][])({}{}))(([]{})<[]>))}])(({{[{{}()}<[]<>>](({}<>)[<>()])}({{[
|
||||
{{[<[<[([{(({([]())(<>())}[[[]<>]([]{})])[{<[][]>({}{})}{({}[]){()<>}}])}][{{(<(<><>)([]<>)>([<>()](()())))
|
||||
[[[(<[<([[{[<<(){}>((){})>{<{}<>>({}())}][<<()>([]<>)>([<>[]]<[]>)]}{{<[<>()]<{}<>>><<()<>>{{}<>}>}<<[[]
|
||||
[<<(<<({<{{(((()())))<[{()()}(()[])][[()()]]>}[{{(()<>)[[]()]}<<<>{}>{<><>}>}[([()[]]<()()>)(
|
||||
<<{{{<<{{{<[{<[]()>([][])}<{<>{}}{[]{}}>]([{<>()}({}<>)])>}<<[([{}{}][{}])[{{}<>}(()<>)]][<({}())({}()
|
||||
[<<<{[{(([<<[{<><>}[[]<>]][([][]){[][]}]>[[{()[]}[{}[]]]({()[]}[{}{}]>]>{<[<[]()><<>{}>]<{()[]}([][])>>}]<{
|
||||
{{([({<[({{{<{[]<>}{<><>}>[<{}{}>{{}()}]}<<<[]()><<>()>}{(()[])[{}{}]}>}}<<([[[]()]{[]<>}]<(()[])([]{})>)[<((
|
||||
[{<{{<[[<[{<(([]{})<()<>>)(<[][]><[]()])>[{({}<>){{}()}}({()[]}[(){}])]}]>]]{[<({<{<<><>>}<{(
|
||||
[[<[(<{[<({[(<{}{}>(()()))]<[<[]<>>[{}()]]<({}())([]())>>})>[([[(({}{}){[][]}){{{}<>}({}{})}]]({<[{}[]][()
|
||||
([(<[<<(<{((<{()[]}([]{})>(<(){}>)){(({}<>){()[]})<[<>[]]<(){}>>}}}>[{{{[[{}[]]]}((<<>()><{}{}>
|
||||
({{{[(<({[<{<({}<>){()[]}>[<()<>>(<>{})]}<[<{}()>([]<>)]((<>{})[{}[]])>>({[{{}<>}(<><>)}}{({{}()}<<><>>){[
|
||||
([[<<{<<[<{(<({}<>)<[]<>>>)[[[{}[]][{}<>]]([()[]](<>()>)]}>][{{[[<<><>>][[{}()]<{}[]>]]{<{()[]}{{
|
||||
{(<<[(<<({[{<[[]()){(){}}>{[[]{}]<{}{}>}}<{<()>[()()]}[<()()><<><>>]>]<<[<[][]><<>{}>]{{[]
|
||||
[<({[({{{<[<({[]{}}[[][]])>]>[{{{{<>{}}({}()}}(<[][]>{[]()})}([<<><>><{}{}>])}{[<<{}{}>(()[])><{<
|
||||
{([[<[({{<(({(()<>){<>{}}}{[<>[]](<>[])}))<[<[<><>]>[([][]){{}()}]]{<(<>())>}>>}[({[{<<>{}>({}[])}<{[]{}
|
||||
(<<[[[[[<<(({([]()){<>()}}{[{}<>]<<>()>})[{(<>{}){[]()}}]]<<[<[]()>[[][]]]>[<[[]<>]([]{})>{
|
||||
{[[([({<[{<(({{}()}([]())){{[]()}[(){}]}){[<[]<>>[[]<>]]<(()){<>{}}>}>({((()())({}<>))([()()](
|
||||
[({<{<{[[{{<<{[]}>{<{}[]>[{}()]}>([<[]()>(())])}}<(((({}())(<><>))))(<[{(){}}([]())][[{}[]][()[]]]>[{{{}()}
|
||||
[[((([[{<(<<<{{}{}}{()()}>{[[]()]{(){}}}><<(<>())>([<>{}]{<>{}})>>)>[{({{([]{}){<>[]}}{(()
|
||||
{([{([<({[[[([{}{}]<<>()>)((()())<[]<>>)][<[(){}]<[]()>>[<<><>>]]]<<<({}<>)[()()])<<[]<>><()()
|
||||
{<(<<{({{([<{[()<>]{()<>}}<[(){}]<{}[]>>>](([<[]>([]())]{([])((){})})((([][])(()<>})[{{}}<(){}>])))}<<((<
|
||||
([{<{{<{[{<{<{<><>}{{}()}><<[]()>(()[])>}{<(<>())[<>[]]>{{[][]}<()()>}}><<{(()[]){{}()}}>>)(({[[{}
|
||||
{{(<({<[<([{([()<>]([]()))<<[]{}>[[]{}]]}{<({}<>)(<>[])><<[]{}>[[]()]>}][{{((){})<{}[]>}<(<><>
|
||||
<({<{[[{[({(<[()[]]{[][]}>{<[]()><()()>>)<{<(){}>((){})}(([]{})({}{}))>}[<({[]<>}([]<>))<({}){<>[]}
|
||||
([[{(((({{{[<<{}{}>{()()}>({[]<>}[[]()])][{[{}<>]<()()>}([<><>]))}}{({(<[][]>[<><>])}[{[<>()]<[]{}
|
||||
([{{<[(<([{{(([]())({}[]))}{{(<>())[<>{}]}<(()[])([]())>}}{<{<()>{{}{}}}>(<[{}]<{}{}>><{{}{}}([]{})>)}]){<
|
||||
{((<{[<<(<([(<{}<>>)]<(<[]{}>{[][]}}[[()()][[]<>]]>){{{[[]{}][<>()]}<((){})(<>())>}{(([]{})<[][]>)[([]())
|
||||
{({[<{<{[{[<{([]<>)({}<>)}<({}())({}[])>>{{{<>{}}([][])}[<[][]>]}]}((([<<>{}>{<>[]}][<{}{}><()()>])[
|
||||
{({{(({(<<<[(<<><>><<>[]>)((())<{}<>>)]>{<[<()<>><[]>]{{<><>}[{}[]]}>}>><{[{([{}{}]{<><>})[{
|
||||
(<{[[({(<{[[(<[]()><<><>})<([]()){[][]}>]{((<>{})[()<>])}]}{[{{<[]<>>{[][]}}[<[]<>><<><>>]}]{{{{
|
||||
<<(({[[{[<((<[{}{}]{[]()}>{{()[]}<<><>>})([[(){}](<>[])]<<{}[]>[(){}]>))<<{{{}[]}({}{})}(<()<>>[
|
76
2021/10/prog.py
Normal file
76
2021/10/prog.py
Normal file
@ -0,0 +1,76 @@
|
||||
from collections import deque
|
||||
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return [line.strip() for line in f.readlines()]
|
||||
|
||||
|
||||
def result(inp, part = 1):
|
||||
res = 0
|
||||
opening = ["(","[", "{", "<"]
|
||||
closing = [">", "}" ,"]", ")"]
|
||||
pairs = {
|
||||
"(": ")",
|
||||
"[": "]",
|
||||
"{": "}",
|
||||
"<": ">",
|
||||
|
||||
}
|
||||
points_1 = {
|
||||
")" : 3,
|
||||
"]" : 57,
|
||||
"}" : 1197,
|
||||
">" : 25137
|
||||
}
|
||||
points_2 = {
|
||||
")" : 1,
|
||||
"]" : 2,
|
||||
"}" : 3,
|
||||
">" : 4
|
||||
}
|
||||
tmp_res = []
|
||||
for line in inp:
|
||||
stack = deque()
|
||||
ignore = False
|
||||
for c in line:
|
||||
if c in opening:
|
||||
stack.append(c)
|
||||
elif c in closing:
|
||||
op = stack.pop()
|
||||
if pairs[op] != c:
|
||||
ignore = True
|
||||
if part == 1 :
|
||||
res += points_1[c]
|
||||
break
|
||||
if part == 2 and (not ignore) and len(stack) > 0:
|
||||
tmp = 0
|
||||
verbose("stack before: ", stack, end="")
|
||||
while len(stack) > 0:
|
||||
tmp *= 5
|
||||
tmp += points_2[pairs[stack.pop()]]
|
||||
# insert sort
|
||||
verbose(" = ", tmp)
|
||||
if len(tmp_res) == 0 or tmp > tmp_res[len(tmp_res) - 1]:
|
||||
tmp_res.append(tmp)
|
||||
else:
|
||||
for i, r in enumerate(tmp_res):
|
||||
if tmp < r:
|
||||
tmp_res = tmp_res[:i] + [tmp] + tmp_res[i:]
|
||||
break
|
||||
|
||||
|
||||
verbose(tmp_res)
|
||||
if part == 1:
|
||||
return res
|
||||
else:
|
||||
return tmp_res[len(tmp_res)//2]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 2))
|
10
2021/10/sample_p1
Normal file
10
2021/10/sample_p1
Normal file
@ -0,0 +1,10 @@
|
||||
[({(<(())[]>[[{[]{<()<>>
|
||||
[(()[<>])]({[<{<<[]>>(
|
||||
{([(<{}[<>[]}>{[]{[(<()>
|
||||
(((({<>}<{<{<>}{[]{[]{}
|
||||
[[<[([]))<([[{}[[()]]]
|
||||
[{[{({}]{}}([{[{{{}}([]
|
||||
{<[[]]>}<{[{[{[]{()[[[]
|
||||
[<(<(<(<{}))><([]([]()
|
||||
<{([([[(<>()){}]>(<<{{
|
||||
<{([{{}}[<[[[<>{}]]]>[]]
|
12
2021/10/test.py
Normal file
12
2021/10/test.py
Normal file
@ -0,0 +1,12 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 26397)
|
||||
self.assertEqual(result(get_input()), 341823)
|
||||
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 288957)
|
||||
|
10
2021/11/input
Normal file
10
2021/11/input
Normal file
@ -0,0 +1,10 @@
|
||||
6318185732
|
||||
1122687135
|
||||
5173237676
|
||||
8754362612
|
||||
5718474666
|
||||
8443654137
|
||||
1247634346
|
||||
1446514585
|
||||
6717288267
|
||||
1727871228
|
59
2021/11/prog.py
Normal file
59
2021/11/prog.py
Normal file
@ -0,0 +1,59 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return [[int(i) for i in line.strip()] for line in f.readlines()]
|
||||
|
||||
|
||||
def result(inp, part = 1, steps = 100, grid = False):
|
||||
res = 0;
|
||||
for step in range(1, steps+1 if part == 1 else 2**31 - 1):
|
||||
# increment each octopus
|
||||
inp = [[i+1 for i in line] for line in inp]
|
||||
# get the ones about to flash
|
||||
queue = []
|
||||
idx = 0
|
||||
for y, row in enumerate(inp):
|
||||
for x, cell in enumerate(row):
|
||||
if cell > 9:
|
||||
queue.append((x, y))
|
||||
|
||||
while idx < len(queue):
|
||||
res += 1
|
||||
x, y = queue[idx]
|
||||
idx += 1
|
||||
inp[y][x] = 0
|
||||
for d in [(x-1, y-1), (x, y-1), (x+1, y-1),
|
||||
(x-1, y), (x+1, y),
|
||||
(x-1, y+1), (x, y+1), (x+1, y+1)]:
|
||||
x1, y1 = d
|
||||
if x1 < 0 or x1 >= len(inp[0]) or y1 < 0 or y1 >= len(inp):
|
||||
continue
|
||||
if d not in queue:
|
||||
inp[y1][x1] += 1
|
||||
if inp[y1][x1] > 9:
|
||||
queue.append(d)
|
||||
|
||||
if step in [193, 194, 195]:
|
||||
verbose(f"{step = }")
|
||||
verbose(f"{len(queue) = }")
|
||||
for row in inp:
|
||||
verbose(str(row))
|
||||
|
||||
if part == 2 and len(queue) == len(inp) * len(inp[0]):
|
||||
return step
|
||||
|
||||
verbose(f"{len(queue) = }")
|
||||
for row in inp:
|
||||
verbose(str(row))
|
||||
if grid:
|
||||
return inp
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 2))
|
10
2021/11/sample_p1
Normal file
10
2021/11/sample_p1
Normal file
@ -0,0 +1,10 @@
|
||||
5483143223
|
||||
2745854711
|
||||
5264556173
|
||||
6141336146
|
||||
6357385478
|
||||
4167524645
|
||||
2176841721
|
||||
6882881134
|
||||
4846848554
|
||||
5283751526
|
61
2021/11/test.py
Normal file
61
2021/11/test.py
Normal file
@ -0,0 +1,61 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1_grid(self):
|
||||
self.assertEqual(result([
|
||||
[1, 1, 1, 1, 1],
|
||||
[1, 9, 9, 9, 1],
|
||||
[1, 9, 1, 9, 1],
|
||||
[1, 9, 9, 9, 1],
|
||||
[1, 1, 1, 1, 1],
|
||||
], grid = True, steps = 1), [
|
||||
[3, 4, 5, 4, 3],
|
||||
[4, 0, 0, 0, 4],
|
||||
[5, 0, 0, 0, 5],
|
||||
[4, 0, 0, 0, 4],
|
||||
[3, 4, 5, 4, 3],
|
||||
])
|
||||
|
||||
self.assertEqual(result([
|
||||
[1, 1, 1, 1, 1],
|
||||
[1, 9, 9, 9, 1],
|
||||
[1, 9, 1, 9, 1],
|
||||
[1, 9, 9, 9, 1],
|
||||
[1, 1, 1, 1, 1],
|
||||
], grid = True, steps = 2), [
|
||||
[4, 5, 6, 5, 4],
|
||||
[5, 1, 1, 1, 5],
|
||||
[6, 1, 1, 1, 6],
|
||||
[5, 1, 1, 1, 5],
|
||||
[4, 5, 6, 5, 4],
|
||||
])
|
||||
|
||||
|
||||
|
||||
def test_part1(self):
|
||||
|
||||
self.assertEqual(result([
|
||||
[1, 1, 1, 1, 1],
|
||||
[1, 9, 9, 9, 1],
|
||||
[1, 9, 1, 9, 1],
|
||||
[1, 9, 9, 9, 1],
|
||||
[1, 1, 1, 1, 1],
|
||||
], steps = 1), 9)
|
||||
|
||||
|
||||
self.assertEqual(result([
|
||||
[1, 1, 1, 1, 1],
|
||||
[1, 9, 9, 9, 1],
|
||||
[1, 9, 1, 9, 1],
|
||||
[1, 9, 9, 9, 1],
|
||||
[1, 1, 1, 1, 1],
|
||||
], steps = 2), 9)
|
||||
|
||||
|
||||
self.assertEqual(result(get_input(sample = True), steps = 10), 204)
|
||||
self.assertEqual(result(get_input(sample = True)), 1656)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 195)
|
||||
|
22
2021/12/input
Normal file
22
2021/12/input
Normal file
@ -0,0 +1,22 @@
|
||||
um-end
|
||||
pk-um
|
||||
FE-il
|
||||
ay-FE
|
||||
pk-start
|
||||
end-jt
|
||||
um-FE
|
||||
RO-il
|
||||
xc-ay
|
||||
il-end
|
||||
start-EZ
|
||||
pk-FE
|
||||
xc-start
|
||||
jt-FE
|
||||
EZ-um
|
||||
pk-xc
|
||||
xc-EZ
|
||||
pk-ay
|
||||
il-ay
|
||||
jt-EZ
|
||||
jt-om
|
||||
pk-EZ
|
67
2021/12/prog.py
Normal file
67
2021/12/prog.py
Normal file
@ -0,0 +1,67 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return [line.strip() for line in f.readlines()]
|
||||
|
||||
|
||||
|
||||
def dfs(start, end, I_V, E, visited, path, part):
|
||||
verbose(f"\t\tvisiting {I_V[start]} ({part = })")
|
||||
if start == end:
|
||||
verbose(f"found end")
|
||||
verbose(f"\t\tpath {list(map(lambda i: I_V[i], path))}")
|
||||
verbose("\t\t", end = "")
|
||||
for i, v in enumerate(visited):
|
||||
if v:
|
||||
verbose(f"{I_V[i]} visted {v}, ", end = "")
|
||||
verbose()
|
||||
return 1
|
||||
ret = 0
|
||||
for i, e in enumerate(E[start]):
|
||||
if e > 0 and visited[i] < part and visited.count(2) <= 2 :
|
||||
tmp_v = visited[:]
|
||||
if I_V[i] == I_V[i].lower():
|
||||
tmp_v[i] += 1
|
||||
# verbose(f"\tstarting search from {I_V[i]}")
|
||||
ret += dfs(i, end, I_V, E, tmp_v[:], path + [i], part)
|
||||
return ret
|
||||
|
||||
def result(inp, part = 1):
|
||||
res = 0;
|
||||
# construct the graph with an adjacency matrix
|
||||
V_I = {}
|
||||
I_V = []
|
||||
for line in inp:
|
||||
nodes = line.split('-')
|
||||
for n in nodes:
|
||||
if n not in V_I:
|
||||
V_I[n] = len(I_V)
|
||||
I_V.append(n)
|
||||
|
||||
E = [[0 for _ in range(len(V_I))] for _ in range(len(V_I))]
|
||||
|
||||
for line in inp:
|
||||
nodes = line.split('-')
|
||||
n1, n2 = V_I[nodes[0]], V_I[nodes[1]]
|
||||
E[n1][n2] += 1
|
||||
E[n2][n1] += 1
|
||||
|
||||
start = V_I["start"]
|
||||
verbose(f"{start = }")
|
||||
end = V_I["end"]
|
||||
verbose(f"{end = }")
|
||||
visited = [0] * len(V_I)
|
||||
visited[start] = 2
|
||||
|
||||
res = dfs(start, end, I_V, E, visited, [start], part)
|
||||
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 2))
|
7
2021/12/sample_p1
Normal file
7
2021/12/sample_p1
Normal file
@ -0,0 +1,7 @@
|
||||
start-A
|
||||
start-b
|
||||
A-c
|
||||
A-b
|
||||
b-d
|
||||
A-end
|
||||
b-end
|
10
2021/12/sample_p2
Normal file
10
2021/12/sample_p2
Normal file
@ -0,0 +1,10 @@
|
||||
dc-end
|
||||
HN-start
|
||||
start-kj
|
||||
dc-start
|
||||
dc-HN
|
||||
LN-dc
|
||||
HN-end
|
||||
kj-sa
|
||||
kj-HN
|
||||
kj-dc
|
18
2021/12/sample_p3
Normal file
18
2021/12/sample_p3
Normal file
@ -0,0 +1,18 @@
|
||||
fs-end
|
||||
he-DX
|
||||
fs-he
|
||||
start-DX
|
||||
pj-DX
|
||||
end-zg
|
||||
zg-sl
|
||||
zg-pj
|
||||
pj-he
|
||||
RW-he
|
||||
fs-DX
|
||||
pj-RW
|
||||
zg-RW
|
||||
start-pj
|
||||
he-WI
|
||||
zg-he
|
||||
pj-fs
|
||||
start-RW
|
18
2021/12/test.py
Normal file
18
2021/12/test.py
Normal file
@ -0,0 +1,18 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 10)
|
||||
self.assertEqual(result(get_input(sample = True, part = 2)), 19)
|
||||
self.assertEqual(result(get_input(sample = True, part = 3)), 226)
|
||||
|
||||
def test_sol1(self):
|
||||
self.assertEqual(result(get_input()), 3497)
|
||||
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 36)
|
||||
self.assertEqual(result(get_input(sample = True, part = 2), part = 2), 103)
|
||||
self.assertEqual(result(get_input(sample = True, part = 3), part = 2), 3509)
|
||||
|
896
2021/13/input
Normal file
896
2021/13/input
Normal file
@ -0,0 +1,896 @@
|
||||
94,530
|
||||
698,875
|
||||
221,18
|
||||
1232,443
|
||||
689,509
|
||||
1153,225
|
||||
239,16
|
||||
1265,275
|
||||
589,264
|
||||
594,766
|
||||
882,159
|
||||
1245,435
|
||||
6,686
|
||||
383,488
|
||||
497,535
|
||||
601,353
|
||||
326,330
|
||||
1277,509
|
||||
773,239
|
||||
331,567
|
||||
174,43
|
||||
1047,551
|
||||
771,358
|
||||
716,871
|
||||
1215,346
|
||||
228,357
|
||||
703,647
|
||||
1272,299
|
||||
363,668
|
||||
967,248
|
||||
1145,490
|
||||
160,194
|
||||
912,410
|
||||
227,623
|
||||
1041,402
|
||||
811,257
|
||||
50,505
|
||||
67,772
|
||||
211,275
|
||||
751,38
|
||||
1078,311
|
||||
552,590
|
||||
1280,389
|
||||
1031,91
|
||||
102,654
|
||||
361,590
|
||||
50,241
|
||||
1225,445
|
||||
658,773
|
||||
1101,844
|
||||
785,89
|
||||
244,294
|
||||
984,564
|
||||
703,592
|
||||
430,493
|
||||
703,131
|
||||
214,345
|
||||
922,247
|
||||
706,35
|
||||
515,410
|
||||
724,560
|
||||
1113,325
|
||||
735,70
|
||||
1195,747
|
||||
244,136
|
||||
572,92
|
||||
1285,889
|
||||
813,227
|
||||
1245,591
|
||||
423,38
|
||||
962,708
|
||||
489,42
|
||||
865,687
|
||||
798,603
|
||||
271,777
|
||||
1299,854
|
||||
55,117
|
||||
885,182
|
||||
952,680
|
||||
1126,99
|
||||
129,275
|
||||
69,770
|
||||
1305,1
|
||||
65,683
|
||||
880,204
|
||||
224,142
|
||||
1235,151
|
||||
174,345
|
||||
1285,827
|
||||
1263,112
|
||||
1215,548
|
||||
50,884
|
||||
556,805
|
||||
288,147
|
||||
167,259
|
||||
47,434
|
||||
417,796
|
||||
609,54
|
||||
147,79
|
||||
848,385
|
||||
1305,451
|
||||
795,585
|
||||
569,472
|
||||
197,649
|
||||
837,371
|
||||
306,862
|
||||
924,863
|
||||
539,171
|
||||
1220,414
|
||||
909,749
|
||||
1041,191
|
||||
666,28
|
||||
716,128
|
||||
1091,613
|
||||
927,614
|
||||
686,120
|
||||
1200,98
|
||||
1255,466
|
||||
161,294
|
||||
952,438
|
||||
43,651
|
||||
445,739
|
||||
1235,781
|
||||
217,501
|
||||
42,371
|
||||
33,304
|
||||
386,863
|
||||
783,575
|
||||
999,304
|
||||
412,527
|
||||
239,591
|
||||
303,624
|
||||
622,794
|
||||
186,572
|
||||
785,469
|
||||
1213,712
|
||||
311,696
|
||||
459,240
|
||||
922,43
|
||||
694,523
|
||||
107,820
|
||||
1181,619
|
||||
1007,624
|
||||
454,847
|
||||
607,434
|
||||
1225,893
|
||||
393,795
|
||||
1113,693
|
||||
430,752
|
||||
388,549
|
||||
433,402
|
||||
115,723
|
||||
522,376
|
||||
713,624
|
||||
801,819
|
||||
884,145
|
||||
60,871
|
||||
823,259
|
||||
1263,24
|
||||
124,875
|
||||
601,725
|
||||
459,654
|
||||
1190,19
|
||||
1113,309
|
||||
1298,798
|
||||
1086,817
|
||||
1231,294
|
||||
919,551
|
||||
151,700
|
||||
539,536
|
||||
574,449
|
||||
544,546
|
||||
604,35
|
||||
569,422
|
||||
25,148
|
||||
1230,781
|
||||
587,351
|
||||
915,95
|
||||
1056,851
|
||||
1170,630
|
||||
915,150
|
||||
1278,100
|
||||
552,142
|
||||
132,518
|
||||
129,537
|
||||
1265,726
|
||||
410,316
|
||||
1285,372
|
||||
763,57
|
||||
11,563
|
||||
1076,348
|
||||
82,802
|
||||
977,256
|
||||
1260,35
|
||||
470,795
|
||||
1039,366
|
||||
388,345
|
||||
1225,870
|
||||
1208,240
|
||||
1016,346
|
||||
244,758
|
||||
254,851
|
||||
244,86
|
||||
1310,493
|
||||
567,71
|
||||
11,115
|
||||
1230,449
|
||||
711,565
|
||||
157,225
|
||||
856,847
|
||||
350,583
|
||||
694,595
|
||||
1267,651
|
||||
1115,128
|
||||
1110,47
|
||||
1233,333
|
||||
1208,654
|
||||
27,333
|
||||
845,665
|
||||
539,397
|
||||
445,687
|
||||
1041,703
|
||||
800,607
|
||||
960,535
|
||||
288,803
|
||||
165,294
|
||||
537,168
|
||||
186,322
|
||||
686,680
|
||||
1099,723
|
||||
607,302
|
||||
1101,626
|
||||
375,593
|
||||
525,201
|
||||
609,51
|
||||
373,207
|
||||
20,829
|
||||
157,618
|
||||
11,854
|
||||
139,36
|
||||
1009,596
|
||||
657,647
|
||||
410,578
|
||||
301,521
|
||||
348,186
|
||||
69,796
|
||||
1086,204
|
||||
771,210
|
||||
515,833
|
||||
924,31
|
||||
1288,359
|
||||
647,301
|
||||
949,749
|
||||
527,127
|
||||
1207,280
|
||||
689,23
|
||||
629,827
|
||||
661,767
|
||||
1034,483
|
||||
785,201
|
||||
500,851
|
||||
853,721
|
||||
1183,220
|
||||
735,824
|
||||
437,841
|
||||
959,624
|
||||
601,801
|
||||
1153,669
|
||||
224,369
|
||||
741,445
|
||||
457,721
|
||||
385,492
|
||||
1195,397
|
||||
828,267
|
||||
1039,152
|
||||
415,814
|
||||
785,581
|
||||
209,50
|
||||
1153,618
|
||||
25,827
|
||||
821,42
|
||||
271,614
|
||||
721,264
|
||||
1038,534
|
||||
900,561
|
||||
726,715
|
||||
1017,593
|
||||
795,36
|
||||
197,693
|
||||
758,240
|
||||
701,627
|
||||
557,438
|
||||
856,47
|
||||
497,359
|
||||
426,145
|
||||
594,128
|
||||
883,159
|
||||
1113,203
|
||||
604,211
|
||||
925,639
|
||||
927,329
|
||||
57,165
|
||||
807,331
|
||||
258,535
|
||||
905,2
|
||||
745,383
|
||||
629,789
|
||||
411,712
|
||||
348,513
|
||||
145,159
|
||||
80,449
|
||||
412,367
|
||||
922,269
|
||||
232,306
|
||||
415,815
|
||||
1014,774
|
||||
382,534
|
||||
950,324
|
||||
803,752
|
||||
243,182
|
||||
895,416
|
||||
395,346
|
||||
246,70
|
||||
657,695
|
||||
539,312
|
||||
455,660
|
||||
261,815
|
||||
386,31
|
||||
47,460
|
||||
816,194
|
||||
214,212
|
||||
599,117
|
||||
1186,875
|
||||
621,509
|
||||
845,682
|
||||
683,781
|
||||
415,192
|
||||
244,600
|
||||
157,807
|
||||
599,565
|
||||
909,348
|
||||
788,341
|
||||
102,401
|
||||
242,199
|
||||
718,623
|
||||
962,186
|
||||
77,674
|
||||
279,91
|
||||
884,537
|
||||
537,339
|
||||
430,401
|
||||
547,728
|
||||
706,57
|
||||
899,712
|
||||
233,210
|
||||
1054,133
|
||||
195,94
|
||||
234,800
|
||||
679,645
|
||||
845,821
|
||||
545,877
|
||||
597,624
|
||||
560,87
|
||||
768,72
|
||||
269,255
|
||||
723,351
|
||||
383,329
|
||||
1208,80
|
||||
233,236
|
||||
15,847
|
||||
704,136
|
||||
949,593
|
||||
1243,122
|
||||
321,451
|
||||
314,768
|
||||
1245,640
|
||||
1243,827
|
||||
1288,535
|
||||
1071,430
|
||||
612,875
|
||||
1220,480
|
||||
648,208
|
||||
758,752
|
||||
979,623
|
||||
1071,591
|
||||
542,212
|
||||
455,220
|
||||
89,511
|
||||
898,367
|
||||
415,863
|
||||
686,57
|
||||
127,212
|
||||
358,241
|
||||
937,504
|
||||
1113,17
|
||||
851,240
|
||||
343,752
|
||||
575,70
|
||||
366,539
|
||||
12,798
|
||||
229,357
|
||||
694,299
|
||||
698,75
|
||||
1260,505
|
||||
25,522
|
||||
1089,453
|
||||
358,438
|
||||
1150,194
|
||||
1184,847
|
||||
801,75
|
||||
851,128
|
||||
80,781
|
||||
1099,275
|
||||
1179,128
|
||||
582,704
|
||||
45,331
|
||||
38,299
|
||||
1073,369
|
||||
1242,670
|
||||
925,492
|
||||
259,772
|
||||
221,5
|
||||
209,319
|
||||
1245,683
|
||||
1179,318
|
||||
1250,542
|
||||
261,795
|
||||
1158,82
|
||||
161,714
|
||||
5,1
|
||||
1207,614
|
||||
783,569
|
||||
1205,624
|
||||
688,794
|
||||
890,240
|
||||
375,472
|
||||
502,68
|
||||
989,575
|
||||
428,159
|
||||
195,766
|
||||
689,749
|
||||
547,57
|
||||
299,113
|
||||
36,271
|
||||
1068,3
|
||||
1263,220
|
||||
888,588
|
||||
502,569
|
||||
917,99
|
||||
900,578
|
||||
47,220
|
||||
1081,357
|
||||
870,549
|
||||
237,749
|
||||
430,849
|
||||
1195,723
|
||||
900,310
|
||||
793,560
|
||||
741,449
|
||||
831,476
|
||||
433,492
|
||||
1073,322
|
||||
1086,369
|
||||
959,270
|
||||
334,686
|
||||
1228,362
|
||||
90,414
|
||||
507,367
|
||||
412,871
|
||||
851,352
|
||||
70,627
|
||||
33,509
|
||||
152,826
|
||||
539,582
|
||||
755,175
|
||||
405,450
|
||||
507,424
|
||||
528,47
|
||||
1165,159
|
||||
1032,360
|
||||
1250,871
|
||||
987,719
|
||||
932,483
|
||||
821,600
|
||||
566,777
|
||||
724,476
|
||||
1004,708
|
||||
937,275
|
||||
1086,33
|
||||
1073,145
|
||||
865,207
|
||||
1081,327
|
||||
358,689
|
||||
525,469
|
||||
261,192
|
||||
927,186
|
||||
0,401
|
||||
724,334
|
||||
127,767
|
||||
917,254
|
||||
709,93
|
||||
567,255
|
||||
361,369
|
||||
1171,36
|
||||
527,276
|
||||
527,679
|
||||
566,49
|
||||
726,267
|
||||
835,200
|
||||
373,619
|
||||
771,684
|
||||
445,851
|
||||
825,618
|
||||
465,821
|
||||
358,217
|
||||
1263,560
|
||||
406,115
|
||||
1200,460
|
||||
1082,593
|
||||
485,186
|
||||
923,485
|
||||
343,740
|
||||
426,357
|
||||
570,891
|
||||
274,236
|
||||
355,113
|
||||
165,376
|
||||
1081,771
|
||||
291,226
|
||||
877,889
|
||||
917,547
|
||||
480,569
|
||||
73,546
|
||||
782,847
|
||||
1195,312
|
||||
1295,847
|
||||
290,847
|
||||
55,466
|
||||
808,549
|
||||
209,626
|
||||
870,212
|
||||
433,876
|
||||
267,409
|
||||
1183,773
|
||||
1226,199
|
||||
22,359
|
||||
621,357
|
||||
229,119
|
||||
913,348
|
||||
160,700
|
||||
206,539
|
||||
534,19
|
||||
1041,553
|
||||
1159,3
|
||||
979,775
|
||||
291,312
|
||||
1113,245
|
||||
417,301
|
||||
282,551
|
||||
1203,389
|
||||
1029,267
|
||||
465,229
|
||||
1006,135
|
||||
1166,607
|
||||
1195,110
|
||||
880,401
|
||||
570,443
|
||||
733,333
|
||||
375,723
|
||||
137,560
|
||||
1173,560
|
||||
303,49
|
||||
930,210
|
||||
681,446
|
||||
209,844
|
||||
25,746
|
||||
1086,304
|
||||
1153,807
|
||||
1260,389
|
||||
296,205
|
||||
821,516
|
||||
935,723
|
||||
1082,145
|
||||
773,339
|
||||
32,346
|
||||
1263,782
|
||||
448,803
|
||||
853,247
|
||||
107,389
|
||||
68,476
|
||||
420,546
|
||||
793,334
|
||||
771,397
|
||||
694,803
|
||||
547,389
|
||||
977,319
|
||||
1039,565
|
||||
561,236
|
||||
559,184
|
||||
750,87
|
||||
1145,294
|
||||
490,621
|
||||
667,563
|
||||
661,443
|
||||
527,220
|
||||
862,467
|
||||
1022,91
|
||||
197,201
|
||||
171,705
|
||||
1155,637
|
||||
704,758
|
||||
50,35
|
||||
195,318
|
||||
882,735
|
||||
1242,476
|
||||
662,208
|
||||
855,212
|
||||
92,124
|
||||
248,442
|
||||
745,572
|
||||
858,691
|
||||
1086,861
|
||||
701,838
|
||||
348,750
|
||||
50,145
|
||||
877,453
|
||||
102,814
|
||||
50,859
|
||||
1241,796
|
||||
661,127
|
||||
271,117
|
||||
68,535
|
||||
231,548
|
||||
293,752
|
||||
440,613
|
||||
604,859
|
||||
929,568
|
||||
256,133
|
||||
587,515
|
||||
663,301
|
||||
920,495
|
||||
967,198
|
||||
228,593
|
||||
691,836
|
||||
1082,357
|
||||
835,246
|
||||
1129,147
|
||||
768,568
|
||||
808,180
|
||||
1203,148
|
||||
1310,655
|
||||
258,588
|
||||
837,819
|
||||
224,33
|
||||
490,273
|
||||
880,690
|
||||
715,840
|
||||
401,546
|
||||
1069,63
|
||||
542,568
|
||||
1285,334
|
||||
880,493
|
||||
1066,86
|
||||
1096,345
|
||||
736,449
|
||||
258,359
|
||||
1300,361
|
||||
724,418
|
||||
1227,264
|
||||
609,715
|
||||
152,549
|
||||
713,105
|
||||
373,838
|
||||
75,113
|
||||
475,246
|
||||
1200,796
|
||||
649,443
|
||||
552,752
|
||||
821,294
|
||||
32,324
|
||||
766,546
|
||||
708,658
|
||||
744,845
|
||||
272,534
|
||||
488,638
|
||||
795,484
|
||||
53,1
|
||||
219,515
|
||||
1113,761
|
||||
733,561
|
||||
853,581
|
||||
949,200
|
||||
60,493
|
||||
1228,84
|
||||
5,893
|
||||
185,633
|
||||
209,268
|
||||
877,18
|
||||
840,99
|
||||
331,775
|
||||
952,653
|
||||
197,17
|
||||
480,325
|
||||
171,854
|
||||
102,449
|
||||
937,723
|
||||
783,851
|
||||
711,728
|
||||
209,575
|
||||
517,334
|
||||
1029,627
|
||||
1081,119
|
||||
504,894
|
||||
427,159
|
||||
895,16
|
||||
181,747
|
||||
512,603
|
||||
701,54
|
||||
266,1
|
||||
338,740
|
||||
607,197
|
||||
155,637
|
||||
914,588
|
||||
324,213
|
||||
55,329
|
||||
1235,743
|
||||
169,276
|
||||
197,877
|
||||
1104,19
|
||||
179,470
|
||||
243,712
|
||||
602,658
|
||||
900,92
|
||||
393,99
|
||||
410,92
|
||||
1039,280
|
||||
1014,680
|
||||
994,861
|
||||
927,280
|
||||
253,301
|
||||
1233,561
|
||||
1044,549
|
||||
485,260
|
||||
589,470
|
||||
102,80
|
||||
507,143
|
||||
457,581
|
||||
706,837
|
||||
509,159
|
||||
1004,144
|
||||
415,366
|
||||
214,281
|
||||
237,572
|
||||
112,774
|
||||
920,399
|
||||
766,348
|
||||
324,325
|
||||
1260,859
|
||||
607,112
|
||||
900,802
|
||||
72,179
|
||||
830,569
|
||||
1161,710
|
||||
373,396
|
||||
269,639
|
||||
922,177
|
||||
714,843
|
||||
1135,292
|
||||
333,506
|
||||
90,480
|
||||
67,827
|
||||
1077,210
|
||||
596,843
|
||||
443,275
|
||||
820,273
|
||||
873,841
|
||||
1014,438
|
||||
306,144
|
||||
479,602
|
||||
987,327
|
||||
703,302
|
||||
552,829
|
||||
232,311
|
||||
1257,353
|
||||
393,264
|
||||
990,208
|
||||
12,96
|
||||
979,719
|
||||
497,667
|
||||
1007,270
|
||||
353,827
|
||||
947,668
|
||||
271,708
|
||||
221,453
|
||||
102,445
|
||||
221,402
|
||||
393,254
|
||||
1068,199
|
||||
253,266
|
||||
231,856
|
||||
1113,585
|
||||
731,319
|
||||
518,584
|
||||
301,821
|
||||
923,877
|
||||
147,815
|
||||
701,267
|
||||
1108,203
|
||||
329,292
|
||||
425,323
|
||||
986,213
|
||||
817,628
|
||||
1183,682
|
||||
72,715
|
||||
256,410
|
||||
475,200
|
||||
709,801
|
||||
564,414
|
||||
120,19
|
||||
459,352
|
||||
949,145
|
||||
390,399
|
||||
1044,585
|
||||
242,695
|
||||
445,50
|
||||
1046,399
|
||||
1044,43
|
||||
840,200
|
||||
206,19
|
||||
82,810
|
||||
67,351
|
||||
144,287
|
||||
304,135
|
||||
127,575
|
||||
1126,795
|
||||
566,397
|
||||
68,670
|
||||
624,241
|
||||
522,518
|
||||
1260,145
|
||||
1031,472
|
||||
244,578
|
||||
758,829
|
||||
223,17
|
||||
321,388
|
||||
624,568
|
||||
1086,466
|
||||
1235,878
|
||||
793,441
|
||||
165,742
|
||||
586,672
|
||||
564,480
|
||||
197,203
|
||||
294,548
|
||||
1268,371
|
||||
880,1
|
||||
629,446
|
||||
875,67
|
||||
1145,518
|
||||
415,519
|
||||
937,838
|
||||
1171,858
|
||||
425,771
|
||||
242,891
|
||||
721,303
|
||||
731,255
|
||||
82,767
|
||||
934,310
|
||||
383,614
|
||||
994,476
|
||||
1158,569
|
||||
22,535
|
||||
792,534
|
||||
1115,542
|
||||
1208,304
|
||||
1044,814
|
||||
959,497
|
||||
738,308
|
||||
855,220
|
||||
1043,409
|
||||
239,303
|
||||
47,91
|
||||
611,203
|
||||
|
||||
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
|
91
2021/13/prog.py
Normal file
91
2021/13/prog.py
Normal file
@ -0,0 +1,91 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
tmp = f.readlines()
|
||||
coords = []
|
||||
n = -1
|
||||
for i, line in enumerate(tmp):
|
||||
line = line.strip()
|
||||
if line == "":
|
||||
n = i+1
|
||||
break
|
||||
line = line.split(",")
|
||||
coords.append((int(line[0]), int(line[1])))
|
||||
|
||||
folds = []
|
||||
|
||||
for fold in tmp[n:]:
|
||||
fold = fold[11:]
|
||||
fold = fold.split("=")
|
||||
folds.append((fold[0], int(fold[1])))
|
||||
|
||||
return {
|
||||
"coords": set(coords),
|
||||
"folds": folds
|
||||
}
|
||||
|
||||
|
||||
def width(l):
|
||||
m = 0
|
||||
for x, _ in l:
|
||||
if m < x:
|
||||
m = x
|
||||
return m + 1
|
||||
|
||||
def height(l):
|
||||
m = 0
|
||||
for _, y in l:
|
||||
if m < y:
|
||||
m = y
|
||||
return m + 1
|
||||
|
||||
def print_grid(coords, w, h):
|
||||
out = [[" " for _ in range(w)] for _ in range(h)]
|
||||
for x, y in coords:
|
||||
verbose(f"{x, y = }, {w, h = }")
|
||||
out[y][x] = '#'
|
||||
for l in out:
|
||||
print(''.join(l))
|
||||
|
||||
|
||||
def result(inp, part = 1):
|
||||
res = 0;
|
||||
coords = inp["coords"]
|
||||
w = width(coords)
|
||||
h = height(coords)
|
||||
for axis, n in inp["folds"]:
|
||||
new_coords = []
|
||||
verbose(f"folding over {axis} = {n}")
|
||||
# verbose(f"\tbefore {coords = }")
|
||||
# print_grid(coords, w, h)
|
||||
for x, y in coords:
|
||||
nc = (x, y)
|
||||
verbose(f"\tbefore {nc}")
|
||||
if axis == "x" and x >= n:
|
||||
nc = (w - 1 - x, y)
|
||||
elif axis == "y" and y >= n:
|
||||
nc = (x, h - 1 - y)
|
||||
verbose(f"\tafter {nc}")
|
||||
new_coords.append(nc)
|
||||
if axis == 'x': w = n
|
||||
else: h = n
|
||||
coords = list(set(new_coords))
|
||||
# verbose(f"\tafter {coords = }")
|
||||
# print_grid(coords, width(coords), height(coords))
|
||||
if part == 1:
|
||||
return len(coords)
|
||||
|
||||
|
||||
print_grid(coords, w, h)
|
||||
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 2))
|
21
2021/13/sample_p1
Normal file
21
2021/13/sample_p1
Normal file
@ -0,0 +1,21 @@
|
||||
6,10
|
||||
0,14
|
||||
9,10
|
||||
0,3
|
||||
10,4
|
||||
4,11
|
||||
6,0
|
||||
6,12
|
||||
4,1
|
||||
0,13
|
||||
10,12
|
||||
3,4
|
||||
3,0
|
||||
8,4
|
||||
1,10
|
||||
2,14
|
||||
8,10
|
||||
9,0
|
||||
|
||||
fold along y=7
|
||||
fold along x=5
|
10
2021/13/test.py
Normal file
10
2021/13/test.py
Normal file
@ -0,0 +1,10 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 17)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 0)
|
||||
|
102
2021/14/input
Normal file
102
2021/14/input
Normal file
@ -0,0 +1,102 @@
|
||||
ONSVVHNCFVBHKVPCHCPV
|
||||
|
||||
VO -> C
|
||||
VV -> S
|
||||
HK -> H
|
||||
FC -> C
|
||||
VB -> V
|
||||
NO -> H
|
||||
BN -> B
|
||||
FP -> K
|
||||
CS -> C
|
||||
HC -> S
|
||||
FS -> K
|
||||
KH -> V
|
||||
CH -> H
|
||||
BP -> K
|
||||
OF -> K
|
||||
SS -> F
|
||||
SP -> C
|
||||
PN -> O
|
||||
CK -> K
|
||||
KS -> H
|
||||
HO -> K
|
||||
FV -> F
|
||||
SN -> P
|
||||
HN -> O
|
||||
KK -> H
|
||||
KP -> O
|
||||
CN -> N
|
||||
BO -> C
|
||||
CC -> H
|
||||
PB -> F
|
||||
PV -> K
|
||||
BV -> K
|
||||
PP -> H
|
||||
KB -> F
|
||||
NC -> F
|
||||
PC -> V
|
||||
FN -> N
|
||||
NH -> B
|
||||
CF -> V
|
||||
PO -> F
|
||||
KC -> S
|
||||
VP -> P
|
||||
HH -> N
|
||||
OB -> O
|
||||
KN -> O
|
||||
PS -> N
|
||||
SF -> V
|
||||
VK -> F
|
||||
CO -> N
|
||||
KF -> B
|
||||
VC -> C
|
||||
SH -> S
|
||||
HV -> V
|
||||
FK -> O
|
||||
NV -> N
|
||||
SC -> O
|
||||
BK -> F
|
||||
BB -> K
|
||||
HF -> K
|
||||
OC -> O
|
||||
KO -> V
|
||||
OS -> P
|
||||
FF -> O
|
||||
PH -> F
|
||||
FB -> O
|
||||
NN -> C
|
||||
NK -> C
|
||||
HP -> B
|
||||
PF -> H
|
||||
PK -> C
|
||||
NP -> O
|
||||
NS -> V
|
||||
CV -> O
|
||||
VH -> C
|
||||
OP -> N
|
||||
SO -> O
|
||||
SK -> H
|
||||
SV -> O
|
||||
NF -> H
|
||||
BS -> K
|
||||
BH -> O
|
||||
VN -> S
|
||||
HB -> O
|
||||
OH -> K
|
||||
CB -> B
|
||||
BC -> S
|
||||
OV -> F
|
||||
BF -> P
|
||||
OO -> F
|
||||
HS -> H
|
||||
ON -> P
|
||||
NB -> F
|
||||
CP -> S
|
||||
SB -> V
|
||||
VF -> C
|
||||
OK -> O
|
||||
FH -> H
|
||||
KV -> S
|
||||
FO -> C
|
||||
VS -> B
|
69
2021/14/prog.py
Normal file
69
2021/14/prog.py
Normal file
@ -0,0 +1,69 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
tmp = f.readlines()
|
||||
ret = {"start": tmp[0].strip(), "alphabet": {}, "rules": {}}
|
||||
|
||||
for line in tmp[2:]:
|
||||
line = line.strip().split(" -> ")
|
||||
l, r = line[0], line[1]
|
||||
for c in l:
|
||||
ret["alphabet"][c] = 0
|
||||
ret["alphabet"][r] = 0
|
||||
ret["rules"][l] = r
|
||||
return ret
|
||||
|
||||
|
||||
def result(inp, part = 1, steps = 10, ret_len = False, ret_state = False):
|
||||
res = 0;
|
||||
alph = inp["alphabet"]
|
||||
rules = inp["rules"]
|
||||
state = {k: 0 for k in rules.keys()}
|
||||
|
||||
s = inp["start"]
|
||||
for c in s:
|
||||
alph[c] += 1
|
||||
|
||||
for i, c in enumerate(s[:-1]):
|
||||
state[s[i] + s[i+1]] += 1
|
||||
|
||||
|
||||
# for k, v in state.items():
|
||||
# if v > 0:
|
||||
# verbose(k)
|
||||
|
||||
for _ in range(steps):
|
||||
verbose(f"step {_}")
|
||||
if _ == 3:
|
||||
verbose(sum(alph.values()))
|
||||
for k, v in state.items():
|
||||
if v > 0:
|
||||
verbose(k, v)
|
||||
new_state = {k: 0 for k in rules.keys()}
|
||||
for k, v in state.items():
|
||||
if v > 0:
|
||||
r = rules[k]
|
||||
new_state[k[0] + r] += v
|
||||
new_state[r + k[1]] += v
|
||||
verbose(f"\tadding {r}")
|
||||
alph[r] += v
|
||||
state = new_state.copy()
|
||||
|
||||
verbose(f"{len(alph) = }")
|
||||
|
||||
res = max(alph.values())- min(alph.values())
|
||||
if ret_state:
|
||||
return {k: v for k, v in state.items() if v > 0}
|
||||
if ret_len:
|
||||
return sum(alph.values())
|
||||
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 2, steps = 40))
|
18
2021/14/sample_p1
Normal file
18
2021/14/sample_p1
Normal file
@ -0,0 +1,18 @@
|
||||
NNCB
|
||||
|
||||
CH -> B
|
||||
HH -> N
|
||||
CB -> H
|
||||
NH -> C
|
||||
HB -> C
|
||||
HC -> B
|
||||
HN -> C
|
||||
NN -> C
|
||||
BH -> H
|
||||
NC -> B
|
||||
NB -> B
|
||||
BN -> B
|
||||
BB -> N
|
||||
BC -> B
|
||||
CC -> N
|
||||
CN -> C
|
32
2021/14/test.py
Normal file
32
2021/14/test.py
Normal file
@ -0,0 +1,32 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
def res(s):
|
||||
ret = {}
|
||||
for i in range(len(s[:-1])):
|
||||
sub = s[i] + s[i+1]
|
||||
if sub in ret:
|
||||
ret[sub] += 1
|
||||
else:
|
||||
ret[sub] = 1
|
||||
return ret
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_state(self):
|
||||
self.assertEqual(result(get_input(sample = True), steps = 1, ret_state = True), res("NCNBCHB"))
|
||||
self.assertEqual(result(get_input(sample = True), steps = 2, ret_state = True), res("NBCCNBBBCBHCB"))
|
||||
self.assertEqual(result(get_input(sample = True), steps = 3, ret_state = True), res("NBBBCNCCNBBNBNBBCHBHHBCHB"))
|
||||
self.assertEqual(result(get_input(sample = True), steps = 4, ret_state = True), res("NBBNBNBBCCNBCNCCNBBNBBNBBBNBBNBBCBHCBHHNHCBBCBHCB"))
|
||||
|
||||
def test_len(self):
|
||||
self.assertEqual(result(get_input(sample = True), steps = 1, ret_len = True), len("NCNBCHB"))
|
||||
self.assertEqual(result(get_input(sample = True), steps = 2, ret_len = True), len("NBCCNBBBCBHCB"))
|
||||
self.assertEqual(result(get_input(sample = True), steps = 3, ret_len = True), len("NBBBCNCCNBBNBNBBCHBHHBCHB"))
|
||||
self.assertEqual(result(get_input(sample = True), steps = 4, ret_len = True), len("NBBNBNBBCCNBCNCCNBBNBBNBBBNBBNBBCBHCBHHNHCBBCBHCB"))
|
||||
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 1588)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2, steps = 40), 2188189693529)
|
||||
|
100
2021/15/input
Normal file
100
2021/15/input
Normal file
@ -0,0 +1,100 @@
|
||||
9319927879926693924289292981328319987931316578169277696988783869228544279445229463567277999867998995
|
||||
6782137819885688871167116696955987679771519589461881979722694422956389229653389717969915178729293921
|
||||
4196967349617789911994968389594625922499998784199978769463894298119929998523419691416468995851998897
|
||||
9939549347377981757829782892395742812959699849785339689589677539252217513971891798498155499956285578
|
||||
8916384499968378766894352151499199372662869587792187795389453511569982396133971939872465668916878211
|
||||
7993189556577598975327195382852888888747792768463951799884962661649859719796639872196115821997898244
|
||||
9131929289774264856998314699854392321299669718664871399915973382646977184981914313583631322769869496
|
||||
1294639965894198182949974183682936196887518297837684919982691938595779447911996988397175118988698494
|
||||
4782786949417398178157656111741924726913693999847397789298648194156399186949891721929928386518973189
|
||||
3977739884126799578896222995845591999757881477816959899697596196263475499959768799776948991584478795
|
||||
8889637962317919682519681791117593699886146499419897361184928352899298889849151996897316148994198392
|
||||
5498578218111924989898699181879979946886186695782915336129858857719697498544698119449189891762579543
|
||||
9783338778987224568666117389627992429787741296997599911865194389848889958925553889979799897423777945
|
||||
6931291694638181873998892726219973827969749895586381652183578821916888499612146683158297997879317147
|
||||
8877777991334789218226394711996426411378849596468946891472988131199845489394842963873899198487952998
|
||||
3539459956998578833759978911968552861677548942139916198879278837961654399499565972991281941498188981
|
||||
2972974825176113221951922999797475194219955668779238484932662379576969959641999963536596939992938319
|
||||
8999189987189581934744189464966714191889822969397189484166461782992252158687829572854497939177954812
|
||||
9178313428786795664136631935649179965178693798648811682669769586398699789681919199495871399999741929
|
||||
5119378487588899959148634498888174447189235477691334622982392398958554285539978999892599293177578576
|
||||
9194483992663776979699993923694591699361753399149992817692189238678351118559919281227659784293411968
|
||||
8298491567898149947916937816986611967598198918469919859981942948999997292151359196586691966622364798
|
||||
8967617989988598499288583929989879191183693417868427758699995173816914799393159367299299491212938739
|
||||
9615576413392678732537787848969513319795339442847871984399994395831159168113997819525821779895951131
|
||||
9517289315991471929899873729491238115986618382898622168953411697612883479692345639948932996812479348
|
||||
8868645925877716499872291994429779247194997924964482919991898596573118991853614924288837913727386759
|
||||
9999987737841999942399299639889457399818186751988275896989726181786896522987749911978759955938769911
|
||||
9965171374918978159589929157213992892387677844962317641171898612329184591217617189742176575229297129
|
||||
9767929185659816969889468699589589797348131494599948496991519365572468799397762291871989292635299117
|
||||
8819848216367515398912936929983168368989131886688955177399395931776416252412983329172927847866995999
|
||||
6299771172636199774384692992389988965934984977999979941449596464194783797413497969982717932271631937
|
||||
9867919388999249988179181792282919692511593818939811199697519413819695481976294984943596869931783348
|
||||
5217498999894999148325963118872789879319591769287491854919259276994581865449967987987831114686948989
|
||||
1276711298478928267591998981197998766572918373116177929646918799773629369715999986696257274486917991
|
||||
9677549397288943147522629679772837189955155394128389753657889165799871691584372149499497899552724698
|
||||
3161879596475993681859998589986219969799998994825365956811818594879884919881929971976965899599474911
|
||||
5978899751278729229937326671598189282789189956298939976972992419825567591984699791288651863712449289
|
||||
5785843757274446168989662865888761284786699589863846917179969997389799678757213693881899399798283381
|
||||
9378752974919831848182681851896386931157578417822957982158836367995975749867969189559339898318939296
|
||||
4993955952819489991949423696319923289965838263329551295268729531941959698478122857749736791389739479
|
||||
9979913149995894544486789219787199998891969561998591837158798358549919571928399321959581987183951698
|
||||
4923374226279899729129788946919681194779851147917197889998718126991737982769352816642519928221816197
|
||||
9429415178891728919769972827548994887898916124219867258118175562995498488988811913466666225834984817
|
||||
1997187992489979189979738887118749979626651839497889793969749472548747897714399891669799699455896479
|
||||
9624951339616573939279944717971788599447979873899985998736591429797938969286363498288449419568929497
|
||||
4681938983828953998696612418773812199371222792989931316197447299912596989997939419196126265222491439
|
||||
8282969925999179875889569231987788869719997982677696288989132989789147471889661396777872998193215828
|
||||
9117176216511922775467499987675919339161918275351989597766786989398687478371889678848583957918391983
|
||||
4497298388369915739296852828574512774696251343567794471621183177947698845776887888485895669987332919
|
||||
8997686994952766178877812668977742157188969917219861817661572949919915899219234859989915189987975197
|
||||
4118913999874589615989952873718475897828658681851486595176248687417644198975924996249597864279743829
|
||||
4579679958921889385239821828857289993449937186914896984992996922484999289511952583999869183918452997
|
||||
8917999927997994429392299437994891687289495897798495953442112848382963474984728969983994991783149799
|
||||
3199648699943299557924998832866891178693798554719699899858296272745997987479892662757759122991519658
|
||||
3914491579265932577578942964548459979268999694999526126213913278751869812666985179899997189599921181
|
||||
1269972955191548488671189591192374899912929828132891677889925885888738571982935925999913169515229987
|
||||
8615958688829298177988481927419139187787699635996766899698917751758119585876873124761389897198819885
|
||||
2167497889941835338936978346275288693895992191919697774591999928333652585539982922569942243597599213
|
||||
9472668281589151358931112811958629285577878128176692715915826998919398155789165594481997993263959196
|
||||
9966289385979919968957998245754327958389629627493188196716997492179981999971934979959984817392438989
|
||||
9145599971993842923971121326227736817867637718119198819933963982629959218237898899655888386991289596
|
||||
7393759917659977589146245871559799585218399497997751917777999862217868959999822795991196969818211621
|
||||
9792927889945519672991946543936698168957938218225912882981935387993831231216179615298972181984319228
|
||||
7743761899817767783667672977139983269215199199699918314639989519981393115896593389898441874874699776
|
||||
1824497653995798679698799297229749897834797833294197979814281923987255598585839497197117839729571369
|
||||
8577958882861526317942215717331978988685919519168957591892925161883496938686898898453673315687998843
|
||||
4191972768117591321987488967786668869999853979339817579176251791521892919919468212444128984415671319
|
||||
5576891999599798816879657775669991198999224343989577163882862748989953362179892918179279281387216996
|
||||
9373769111497348825797289843198858611491499267469678187893869937361891692919973885768188384887596189
|
||||
9859171731132988682195848386695958714996489139645578586441948885317994929358881751899912625863299552
|
||||
4934928593958897783799983963793921184111597692919959479588985597988338527769967199293539699294774194
|
||||
1698538489641947137846923886699274821953365783198463959357989161489817229999617499141136156969131969
|
||||
3296989219983977948718421976373911944179536478972924859298568896972641886161529175995818483911543128
|
||||
6278913998199519318855192181581196429992429817619397917141979691623919571874589999254329218897887994
|
||||
9992985668416932999926168816176973997758599186957888288395128484987529129929975441231472862839421695
|
||||
1362464815499699192596287679432743239657996999693751969711918999687129296564511897258489745988288167
|
||||
5977189297674799199628985972999971494272992187915199889419992439287859927924778577194577929695457627
|
||||
3438223999111997512849575289859985859972752399978987619891559997998554511569914599149678154711126639
|
||||
2979126974919321983991789499388668896928879799646162171851776714127962589986998574331968997456544868
|
||||
6216795749356515966718898985918565959499628961815279546198979459849845989371831992292699311375776865
|
||||
8352715528197149369799519852288989699978992875598296779931298654369979999696915593247113843923599538
|
||||
8962455899599497871221926339396845158947259529895993695544959768976848859779899991114641786957296531
|
||||
2943869391171944962257474296498957919597467978896784699673793995229658928919598979738119899319383986
|
||||
9983898169912296799289397793294213546919953477555577429149749497766981349668499994878593194997879275
|
||||
8889882959291771612692377879435986414239649936776842748579798617821961983999949994989282378389947399
|
||||
3199997769523581787587969916892769968184616564892139471917169316971672979973375871988172842996584895
|
||||
8354689792844394798623128972146939743314292658383663832514698996697367378299886829789191826999773961
|
||||
9893836276828919186673649859239999393698982985775768195847989769239991637411793618869888191917472289
|
||||
5928583917498121999886377795189961317788981897688629942879519515624767918988389411193999247789868141
|
||||
1429679799293989912693479848974118958998299151271395998911989696518192397472871957999765285698267313
|
||||
9239695319699999988488829959759316161477147119979518383759198179368174993997996698566986314498599789
|
||||
2582659929929648199398128693359499693417769482859853897799284585655687921188318975834353991389972842
|
||||
8596473468199158355917977999874111821781368897658914981889824514189229862189929872193481817956976884
|
||||
9685977168754199641189321131863836338914891329759695897928358898995849678196968239981171745482329928
|
||||
9935621827798812799762166788756959219299892726731815999185647229991757173887841999993427325891658191
|
||||
1778263118969552899197794341699979459118691212755668996749377169926884394172497294118899699853739749
|
||||
2787591999446691168197517967271411843279629429417196194996811596363987299412785812633871145227949115
|
||||
6796987473692958899138914468653236383857234899879631271399676719319916464278159525996129786399815963
|
||||
5819878197925797859196414992974686679674969364619688199911487117949926999488799995986788649369962889
|
||||
1611181455799765871782419643336499989899999864957323699781212598968286442487972619699128531368991998
|
81
2021/15/prog.py
Normal file
81
2021/15/prog.py
Normal file
@ -0,0 +1,81 @@
|
||||
from queue import PriorityQueue
|
||||
|
||||
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return [[int(c) for c in line.strip()] for line in f.readlines()]
|
||||
|
||||
|
||||
def in_bounds(coords, grid):
|
||||
x, y = coords
|
||||
w, h = len(grid[0]), len(grid)
|
||||
return x >= 0 and x < w and y >= 0 and y < h
|
||||
|
||||
def result(inp, part = 1):
|
||||
if part == 2:
|
||||
new_inp = []
|
||||
for y in range(5):
|
||||
for row in inp:
|
||||
new_row = []
|
||||
for x in range(5):
|
||||
for c in row:
|
||||
tba = c + x + y
|
||||
if tba > 9:
|
||||
tba -= 9
|
||||
new_row.append(tba)
|
||||
new_inp.append(new_row[:])
|
||||
inp = new_inp[:]
|
||||
res = 0;
|
||||
start = (0, 0)
|
||||
end = (len(inp[0]) - 1, len(inp) - 1)
|
||||
|
||||
dists = [[2**30 for _ in range(len(inp[0]))] for _ in range(len(inp))]
|
||||
prevs = [[(-1, -1) for _ in range(len(inp[0]))] for _ in range(len(inp))]
|
||||
q = PriorityQueue()
|
||||
q.put((0, start))
|
||||
cur = start
|
||||
while cur != end:
|
||||
dist, cur = q.get()
|
||||
x, y = cur
|
||||
verbose(f"looking at {cur = } ({end = })")
|
||||
for d in [(x-1, y), (x, y-1), (x+1, y), (x, y+1)]:
|
||||
if in_bounds(d, inp):
|
||||
x_, y_ = d
|
||||
new_dist = dist + inp[y_][x_]
|
||||
if dists[y_][x_] > new_dist:
|
||||
verbose(f"\tlooking at {d = }")
|
||||
prevs[y_][x_] = cur
|
||||
dists[y_][x_] = new_dist
|
||||
q.put((new_dist, d))
|
||||
|
||||
path = set()
|
||||
cur = end
|
||||
verbose(f"Creating path from {end = }")
|
||||
while cur != (0, 0):
|
||||
verbose(f"\tlooking at {cur = }")
|
||||
path.add(cur)
|
||||
cur = prevs[cur[1]][cur[0]]
|
||||
path.add(cur)
|
||||
|
||||
for y, row in enumerate(inp):
|
||||
for x, c in enumerate(row):
|
||||
verbose((BOLD + str(c) + END) if (x, y) in path else c, end='')
|
||||
verbose()
|
||||
|
||||
res = dists[end[0]][end[1]]
|
||||
|
||||
return res
|
||||
|
||||
BOLD = '\033[95m'
|
||||
END = '\033[0m'
|
||||
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 2))
|
10
2021/15/sample_p1
Normal file
10
2021/15/sample_p1
Normal file
@ -0,0 +1,10 @@
|
||||
1163751742
|
||||
1381373672
|
||||
2136511328
|
||||
3694931569
|
||||
7463417111
|
||||
1319128137
|
||||
1359912421
|
||||
3125421639
|
||||
1293138521
|
||||
2311944581
|
10
2021/15/test.py
Normal file
10
2021/15/test.py
Normal file
@ -0,0 +1,10 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 40)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 315)
|
||||
|
1
2021/16/input
Normal file
1
2021/16/input
Normal file
@ -0,0 +1 @@
|
||||
40541D900AEDC01A88002191FE2F45D1006A2FC2388D278D4653E3910020F2E2F3E24C007ECD7ABA6A200E6E8017F92C934CFA0E5290B569CE0F4BA5180213D963C00DC40010A87905A0900021B0D624C34600906725FFCF597491C6008C01B0004223342488A200F4378C9198401B87311A0C0803E600FC4887F14CC01C8AF16A2010021D1260DC7530042C012957193779F96AD9B36100907A00980021513E3943600043225C1A8EB2C3040043CC3B1802B400D3CA4B8D3292E37C30600B325A541D979606E384B524C06008E802515A638A73A226009CDA5D8026200D473851150401E8BF16E2ACDFB7DCD4F5C02897A5288D299D89CA6AA672AD5118804F592FC5BE8037000042217C64876000874728550D4C0149F29D00524ACCD2566795A0D880432BEAC79995C86483A6F3B9F6833397DEA03E401004F28CD894B9C48A34BC371CF7AA840155E002012E21260923DC4C248035299ECEB0AC4DFC0179B864865CF8802F9A005E264C25372ABAC8DEA706009F005C32B7FCF1BF91CADFF3C6FE4B3FB073005A6F93B633B12E0054A124BEE9C570004B245126F6E11E5C0199BDEDCE589275C10027E97BE7EF330F126DF3817354FFC82671BB5402510C803788DFA009CAFB14ECDFE57D8A766F0001A74F924AC99678864725F253FD134400F9B5D3004A46489A00A4BEAD8F7F1F7497C39A0020F357618C71648032BB004E4BBC4292EF1167274F1AA0078902262B0D4718229C8608A5226528F86008CFA6E802F275E2248C65F3610066274CEA9A86794E58AA5E5BDE73F34945E2008D27D2278EE30C489B3D20336D00C2F002DF480AC820287D8096F700288082C001DE1400C50035005AA2013E5400B10028C009600A74001EF2004F8400C92B172801F0F4C0139B8E19A8017D96A510A7E698800EAC9294A6E985783A400AE4A2945E9170
|
128
2021/16/prog.py
Normal file
128
2021/16/prog.py
Normal file
@ -0,0 +1,128 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return int(f.readlines()[0].strip(), 16)
|
||||
|
||||
|
||||
def full_size(packet):
|
||||
return 4 * (len(hex(packet)) - 2)
|
||||
|
||||
def version(p, size):
|
||||
return p >> (size - 3)
|
||||
|
||||
def type(p, size):
|
||||
return (p >> (size - 6)) & 0b111
|
||||
|
||||
def literal(p, size):
|
||||
shift = size - 3 - 3
|
||||
res = 0
|
||||
while shift >= 0:
|
||||
shift -= 5
|
||||
res <<= 4
|
||||
res |= (p >> shift) & 0xF
|
||||
|
||||
if not ((p >> (shift + 4)) & 1):
|
||||
return res
|
||||
raise ValueError("couldn't parse literal value correctly")
|
||||
|
||||
def type_id(p, size):
|
||||
return (p >> (size - 7)) & 1
|
||||
|
||||
def len_subpackets(p, size):
|
||||
return (p >> (size - 3 - 3 - 1 - 15)) & 0x7FFF
|
||||
|
||||
def n_subpackets(p, size):
|
||||
return (p >> (size - 3 - 3 - 1 - 11)) & 0x7FF
|
||||
|
||||
def parse_packet(p, part = 1, size = -1):
|
||||
s = 6
|
||||
size = size if size != -1 else full_size(p)
|
||||
res = version(p, size)
|
||||
t = type(p, size)
|
||||
verbose(f"{version(p, size) = }, { type(p, size) = }")
|
||||
verbose(format(p, 'b').zfill(size))
|
||||
if t == 4:
|
||||
verbose(f"\tis literal")
|
||||
n = literal(p, size)
|
||||
s += 5 * (len(hex(n)) - 2)
|
||||
if part == 1:
|
||||
return s, version(p, size)
|
||||
else:
|
||||
return s, n
|
||||
|
||||
tid = type_id(p, size)
|
||||
s += 1
|
||||
ress = []
|
||||
# verbose(f"{tid = }")
|
||||
if tid == 0:
|
||||
s += 15
|
||||
tot_sub_size = len_subpackets(p, size)
|
||||
verbose("VVVTTTILLLLLLLLLLLLLLL")
|
||||
verbose(f"len of sub packs {tot_sub_size}")
|
||||
|
||||
|
||||
cur_sub_size = 0
|
||||
i = 0
|
||||
while cur_sub_size < tot_sub_size:
|
||||
verbose(f"scanning for {i = } (reducing {size} by {size - s - tot_sub_size})")
|
||||
new_pack = (p >> (size - s - tot_sub_size)) & ((1 << tot_sub_size - cur_sub_size) -1)
|
||||
sub_size, sub_res = parse_packet(new_pack, size = tot_sub_size - cur_sub_size, part = part)
|
||||
if part == 1:
|
||||
res += sub_res
|
||||
else:
|
||||
ress.append(sub_res)
|
||||
cur_sub_size += sub_size
|
||||
i += 1
|
||||
s += tot_sub_size
|
||||
else:
|
||||
s += 11
|
||||
verbose("VVVTTTILLLLLLLLLLL")
|
||||
verbose(f"about to scan {n_subpackets(p, size)} packets")
|
||||
for _ in range(n_subpackets(p, size)):
|
||||
new_size = size - s
|
||||
mask = (1 << new_size) - 1
|
||||
new_pack = p & mask
|
||||
sub_size, sub_res = parse_packet(new_pack, size = new_size, part = part)
|
||||
s += sub_size
|
||||
if part == 1:
|
||||
res += sub_res
|
||||
else:
|
||||
ress.append(sub_res)
|
||||
|
||||
if part == 2:
|
||||
if t == 0:
|
||||
res = sum(ress)
|
||||
elif t == 1:
|
||||
res = 1
|
||||
for r in ress:
|
||||
res *= r
|
||||
elif t == 2:
|
||||
res = min(ress)
|
||||
elif t == 3:
|
||||
res = max(ress)
|
||||
elif t in [5, 6, 7]:
|
||||
if len(ress) != 2:
|
||||
raise ValueError("huston, we got a problem")
|
||||
if t == 5:
|
||||
res = int(ress[0] > ress[1])
|
||||
elif t == 6:
|
||||
res = int(ress[0] < ress[1])
|
||||
elif t == 7:
|
||||
res = int(ress[0] == ress[1])
|
||||
|
||||
|
||||
|
||||
return (s, res)
|
||||
|
||||
def result(inp, part = 1):
|
||||
return parse_packet(inp, part = part)[1]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 2))
|
||||
|
49
2021/16/test.py
Normal file
49
2021/16/test.py
Normal file
@ -0,0 +1,49 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
|
||||
def test_pack1(self):
|
||||
pack = 0xD2FE28
|
||||
s = full_size(pack)
|
||||
self.assertEqual(full_size(pack), 24)
|
||||
self.assertEqual(version(pack, s), 6)
|
||||
self.assertEqual(type(pack, s), 4)
|
||||
self.assertEqual(literal(pack, s), 2021)
|
||||
|
||||
def test_pack2(self):
|
||||
pack = 0x38006F45291200
|
||||
s = full_size(pack)
|
||||
self.assertEqual(full_size(pack), 56)
|
||||
self.assertEqual(version(pack, s), 1)
|
||||
self.assertEqual(type(pack, s), 6)
|
||||
self.assertEqual(type_id(pack, s), 0)
|
||||
self.assertEqual(len_subpackets(pack, s), 27)
|
||||
|
||||
def test_pack3(self):
|
||||
pack = 0xEE00D40C823060
|
||||
s = full_size(pack)
|
||||
self.assertEqual(full_size(pack), 56)
|
||||
self.assertEqual(version(pack, s), 7)
|
||||
self.assertEqual(type(pack, s), 3)
|
||||
self.assertEqual(type_id(pack, s), 1)
|
||||
self.assertEqual(n_subpackets(pack, s), 3)
|
||||
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(0x8A004A801A8002F478), 16)
|
||||
self.assertEqual(result(0x620080001611562C8802118E34), 12)
|
||||
self.assertEqual(result(0xC0015000016115A2E0802F182340), 23)
|
||||
self.assertEqual(result(0xA0016C880162017C3686B18A3D4780), 31)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(0xC200B40A82, part = 2), 3)
|
||||
self.assertEqual(result(0x880086C3E88112, part = 2), 7)
|
||||
self.assertEqual(result(0xCE00C43D881120, part = 2), 9)
|
||||
self.assertEqual(result(0xD8005AC2A8F0, part = 2), 1)
|
||||
self.assertEqual(result(0xF600BC2D8F, part = 2), 0)
|
||||
self.assertEqual(result(0x9C005AC2F8F0, part = 2), 0)
|
||||
self.assertEqual(result(0x9C0141080250320F1802104A08, part = 2), 1)
|
||||
|
||||
def test_spec(self):
|
||||
self.assertEqual(result(0x04005AC33890, part = 2), 54)
|
||||
|
1
2021/17/input
Normal file
1
2021/17/input
Normal file
@ -0,0 +1 @@
|
||||
target area: x=29..73, y=-248..-194
|
64
2021/17/prog.py
Normal file
64
2021/17/prog.py
Normal file
@ -0,0 +1,64 @@
|
||||
import math, re
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
m = re.match(r"target area: x=(-?\d+)..(-?\d+), y=(-?\d+)..(-?\d+)", f.readlines()[0])
|
||||
return tuple(map(lambda x: int(x), m.groups()))
|
||||
|
||||
|
||||
|
||||
def v_x(t, v0):
|
||||
return max(-t + v0, 0)
|
||||
|
||||
def v_y(t, v0):
|
||||
return -t + v0
|
||||
|
||||
|
||||
def result(inp, part = 1):
|
||||
y = abs(min(inp[2], inp[3])) - 1
|
||||
v_y_max = int(y*(y+1) / 2);
|
||||
if part == 1:
|
||||
return v_y_max
|
||||
|
||||
x_2 = math.ceil((-1 + math.sqrt(1 - 4 * (-2) * inp[1])) / 2)
|
||||
x_1 = math.ceil((-1 + math.sqrt(1 - 4 * (-2) * inp[0])) / 2)
|
||||
x_min = inp[0]
|
||||
x_max = inp[1]
|
||||
y_min = inp[2]
|
||||
y_max = inp[3]
|
||||
|
||||
global VERBOSE
|
||||
|
||||
res = 0
|
||||
for v0x in range(x_1, x_max+1):
|
||||
for v0y in range(y_min, v_y_max+1):
|
||||
verbose(f"{v0x, v0y}", end = " ")
|
||||
t = 0
|
||||
y = 0
|
||||
x = 0
|
||||
while y >= y_min:
|
||||
y += v_y(t, v0y)
|
||||
x += v_x(t, v0x)
|
||||
# verbose(f"\t{x, y = }")
|
||||
if x_min <= x and x <= x_max and y_min <= y and y <= y_max:
|
||||
verbose(f"accepted", end='')
|
||||
res += 1
|
||||
break
|
||||
t += 1
|
||||
verbose("")
|
||||
|
||||
# x = inp[1] - inp[0]
|
||||
# x += x2 - x1 + 1
|
||||
# verbose(f"{x1, x2 = }")
|
||||
# y = abs(inp[3]) - abs(inp[2])
|
||||
# y += v_y_max
|
||||
return res
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = not False
|
||||
print(result(get_input(), part = 2))
|
1
2021/17/sample_p1
Normal file
1
2021/17/sample_p1
Normal file
@ -0,0 +1 @@
|
||||
target area: x=20..30, y=-10..-5
|
10
2021/17/test.py
Normal file
10
2021/17/test.py
Normal file
@ -0,0 +1,10 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
def test_part1(self):
|
||||
self.assertEqual(result(get_input(sample = True)), 45)
|
||||
|
||||
def test_part2(self):
|
||||
self.assertEqual(result(get_input(sample = True), part = 2), 112)
|
||||
|
100
2021/18/input
Normal file
100
2021/18/input
Normal file
@ -0,0 +1,100 @@
|
||||
[[[0,[6,6]],[[7,2],[6,2]]],[[[9,4],[5,8]],6]]
|
||||
[[[4,9],6],[[[0,1],[8,5]],[3,[7,6]]]]
|
||||
[[1,7],[[[1,3],2],[[6,8],8]]]
|
||||
[4,[[6,[6,0]],[[4,9],5]]]
|
||||
[[3,8],[[0,6],1]]
|
||||
[[2,2],[[[2,3],[2,9]],[[9,6],[4,9]]]]
|
||||
[[[3,4],[[7,7],[7,8]]],[[0,2],6]]
|
||||
[[[[4,4],[3,3]],[[9,0],4]],[8,[7,[6,6]]]]
|
||||
[[[9,9],8],1]
|
||||
[2,[[7,[1,9]],[9,2]]]
|
||||
[[[[6,0],[8,2]],[[9,0],[8,7]]],[3,[6,[8,8]]]]
|
||||
[[[8,[9,2]],[1,4]],[[2,2],[[1,0],5]]]
|
||||
[[[9,[0,3]],[4,[2,3]]],[[8,[0,1]],[[4,8],[5,4]]]]
|
||||
[[[2,0],[1,7]],[[3,[0,7]],[[7,6],0]]]
|
||||
[[[1,[5,1]],[[0,3],9]],[[3,8],[[5,3],1]]]
|
||||
[[[[4,5],2],[[7,7],[4,8]]],[3,[3,[6,5]]]]
|
||||
[[[[4,4],4],[[5,0],2]],[9,[[0,7],5]]]
|
||||
[[2,[[8,0],9]],0]
|
||||
[[[[0,5],[1,0]],[0,[5,1]]],[[[0,8],[6,0]],[6,[3,9]]]]
|
||||
[[[[2,4],[5,5]],[4,7]],[[[5,6],[9,5]],1]]
|
||||
[[[4,[5,1]],[[6,7],1]],[1,[[5,9],4]]]
|
||||
[[0,6],[[9,3],[4,2]]]
|
||||
[7,[[[2,4],[3,4]],[2,0]]]
|
||||
[0,[6,7]]
|
||||
[[[0,2],[[7,2],7]],[[[6,3],[2,0]],[[8,6],[7,9]]]]
|
||||
[[[7,[0,5]],7],[[2,3],[3,3]]]
|
||||
[[2,[0,[4,5]]],[[4,[7,9]],[[5,6],4]]]
|
||||
[[[5,4],0],[5,[[7,1],[7,6]]]]
|
||||
[[0,3],[[[5,2],5],[[8,5],[2,8]]]]
|
||||
[[[0,[8,9]],[[3,1],2]],[[3,[7,1]],7]]
|
||||
[[[[9,7],[5,5]],[[2,4],1]],[[1,3],[[4,0],[9,1]]]]
|
||||
[[[0,9],4],0]
|
||||
[[[[8,8],9],[[8,2],3]],[[2,[7,4]],[9,1]]]
|
||||
[[[1,2],8],[[[4,4],2],[2,4]]]
|
||||
[[6,[7,[2,1]]],[[2,1],3]]
|
||||
[0,[[[7,8],0],[5,[8,5]]]]
|
||||
[[[2,8],6],[6,[[1,1],[1,2]]]]
|
||||
[[[[3,9],2],[7,[4,9]]],[[[5,3],3],[[7,3],5]]]
|
||||
[[2,[4,[3,2]]],[[4,9],6]]
|
||||
[[[[1,1],[0,5]],[1,[4,9]]],[[6,[5,7]],[[1,6],[7,2]]]]
|
||||
[0,[0,[[8,5],8]]]
|
||||
[[[1,[2,5]],8],[[3,[0,2]],4]]
|
||||
[[[4,3],0],[[[6,9],[7,2]],[[1,9],8]]]
|
||||
[[[[7,1],0],[7,5]],[6,2]]
|
||||
[[[9,[6,5]],6],[[5,5],[[4,6],2]]]
|
||||
[[[[3,0],[5,5]],2],[7,[9,[8,5]]]]
|
||||
[9,[[9,7],[3,3]]]
|
||||
[[[0,0],4],[7,[[5,8],[2,7]]]]
|
||||
[[[[9,2],4],[[0,1],[4,1]]],[[4,[6,5]],5]]
|
||||
[8,[[[5,2],8],[6,0]]]
|
||||
[[[[9,6],2],9],[5,[[5,3],5]]]
|
||||
[[[8,[8,0]],[7,[3,3]]],[[[8,8],[5,5]],[[1,3],3]]]
|
||||
[[[2,3],4],[[[8,8],[1,4]],5]]
|
||||
[[[[3,7],9],6],[[5,[4,1]],4]]
|
||||
[[[3,4],[[5,3],4]],[[2,[4,2]],[[0,7],5]]]
|
||||
[0,9]
|
||||
[[2,[[9,1],[3,4]]],[[[5,7],[6,6]],[5,[3,6]]]]
|
||||
[[[[7,2],7],[[8,7],9]],[9,[[7,0],[3,4]]]]
|
||||
[[[[8,3],[0,2]],0],[5,[[9,9],1]]]
|
||||
[[[1,5],[[3,9],[5,6]]],[6,[2,[2,4]]]]
|
||||
[[[[1,6],7],[8,9]],[[[6,7],8],1]]
|
||||
[[5,[[1,3],[1,8]]],[8,1]]
|
||||
[[[[4,6],9],[[3,0],[2,4]]],3]
|
||||
[[[[6,6],[9,8]],[4,7]],[[6,8],1]]
|
||||
[[[9,[7,8]],[4,[0,3]]],[[8,[8,1]],8]]
|
||||
[4,0]
|
||||
[[[[1,8],[6,9]],[[1,5],[6,1]]],[[1,9],[0,1]]]
|
||||
[[[[1,8],[1,8]],[[6,2],[8,6]]],[[[6,8],3],[[8,0],[7,3]]]]
|
||||
[8,9]
|
||||
[[2,8],2]
|
||||
[[4,[[7,0],[1,8]]],1]
|
||||
[[5,0],[[[3,4],0],3]]
|
||||
[[[[7,5],2],6],[[9,2],[[5,0],[7,5]]]]
|
||||
[[8,[[0,0],[3,7]]],[1,6]]
|
||||
[[[[5,2],[5,1]],[8,6]],[2,[9,[5,4]]]]
|
||||
[[[6,[3,3]],[[0,4],0]],[[4,4],[[3,6],6]]]
|
||||
[[7,[[4,9],[9,7]]],[3,[[8,7],9]]]
|
||||
[[[[3,3],9],[8,[7,2]]],[[3,9],8]]
|
||||
[[[0,[9,2]],1],[6,[[9,7],8]]]
|
||||
[[5,[0,1]],[8,7]]
|
||||
[[[[0,7],5],8],[[[0,0],[7,1]],[2,[6,9]]]]
|
||||
[[5,[[3,3],7]],[[[1,3],[5,4]],[[0,8],[2,2]]]]
|
||||
[[[[7,4],5],[[9,1],[5,5]]],[[0,8],[0,[6,4]]]]
|
||||
[[0,[[9,5],[4,3]]],[[[2,7],[4,7]],6]]
|
||||
[[7,[[3,2],[7,9]]],[[[8,6],[1,8]],[5,[5,6]]]]
|
||||
[[0,[[3,3],0]],[[[5,2],[2,4]],[6,8]]]
|
||||
[[[6,[5,6]],9],[[[5,2],7],[[8,7],[2,4]]]]
|
||||
[[[[7,2],[8,2]],5],[[[4,5],[0,7]],6]]
|
||||
[[[[6,1],4],6],[[4,[7,8]],3]]
|
||||
[[[[2,6],[5,0]],5],[[3,[5,4]],[[2,3],[8,6]]]]
|
||||
[[4,[[1,3],[1,3]]],[[[5,1],2],[[7,3],[9,6]]]]
|
||||
[[8,[6,[0,0]]],[[[4,4],9],[6,2]]]
|
||||
[[9,7],7]
|
||||
[[[3,1],[[0,3],[5,2]]],3]
|
||||
[[1,5],[4,[0,[3,6]]]]
|
||||
[[[[4,9],[6,5]],[8,4]],2]
|
||||
[[[7,[1,5]],4],[[3,[4,6]],[7,[4,3]]]]
|
||||
[[[0,[5,7]],[[8,7],[2,6]]],[[4,5],5]]
|
||||
[[[2,3],[[9,5],[9,3]]],[[[2,5],9],[[9,1],8]]]
|
||||
[[[[4,4],4],[[4,0],9]],[[[5,3],1],[3,[7,6]]]]
|
184
2021/18/prog.py
Normal file
184
2021/18/prog.py
Normal file
@ -0,0 +1,184 @@
|
||||
VERBOSE = True
|
||||
def verbose(s = "", *args, **kwargs):
|
||||
if VERBOSE:
|
||||
print(s, *args, **kwargs)
|
||||
|
||||
def get_input(sample = False, part = 1):
|
||||
import json
|
||||
with open(f'sample_p{part}' if sample else 'input', 'r') as f:
|
||||
return [parse(json.loads(line.strip())) for line in f.readlines()]
|
||||
|
||||
|
||||
class Pair:
|
||||
def __init__(self, left, right, parent = None) -> None:
|
||||
self.left = left
|
||||
self.right = right
|
||||
self.parent = parent
|
||||
|
||||
def left_most(self) -> int:
|
||||
if isinstance(self.left, int):
|
||||
return self.left
|
||||
return self.left.left_most()
|
||||
|
||||
def left_most_pair(self):
|
||||
if isinstance(self.left, int):
|
||||
return self
|
||||
return self.left.left_most_pair()
|
||||
|
||||
def right_most(self) -> int:
|
||||
if isinstance(self.right, int):
|
||||
return self.right
|
||||
return self.right.right_most()
|
||||
|
||||
def right_most_pair(self):
|
||||
if isinstance(self.right, int):
|
||||
return self
|
||||
return self.right.right_most_pair()
|
||||
|
||||
def explode(self):
|
||||
if not (isinstance(self.left, int) and isinstance(self.left, int)):
|
||||
raise ValueError("Both children must be ints to explode")
|
||||
|
||||
cur = self
|
||||
while cur.parent != None and cur.parent.left is cur:
|
||||
cur = cur.parent
|
||||
if cur.parent != None:
|
||||
if isinstance(cur.parent.left, int):
|
||||
cur.parent.left += self.left
|
||||
else:
|
||||
cur.parent.left.right_most_pair().right += self.left
|
||||
|
||||
cur = self
|
||||
while cur.parent != None and cur.parent.right is cur:
|
||||
cur = cur.parent
|
||||
if cur.parent != None:
|
||||
if isinstance(cur.parent.right, int):
|
||||
cur.parent.right += self.right
|
||||
else:
|
||||
cur.parent.right.left_most_pair().left += self.right
|
||||
|
||||
if self.parent != None:
|
||||
if self.parent.left == self:
|
||||
self.parent.left = 0
|
||||
else:
|
||||
self.parent.right = 0
|
||||
|
||||
def split_left(self):
|
||||
self.left = Pair(self.left // 2, self.left // 2 + self.left % 2, self)
|
||||
|
||||
def split_right(self):
|
||||
self.right = Pair(self.right // 2, self.right // 2 + self.right % 2, self)
|
||||
|
||||
def __repr__(self) -> str:
|
||||
return str(self)
|
||||
|
||||
def __str__(self) -> str:
|
||||
return f"[{str(self.left)}, {str(self.right)}]"
|
||||
|
||||
def __eq__(self, __o) -> bool:
|
||||
try:
|
||||
return self.left == __o.left and self.right == __o.right
|
||||
except Exception as e:
|
||||
return False
|
||||
|
||||
def list(self) -> str:
|
||||
return [
|
||||
self.left if isinstance(self.left, int) else self.left.list(),
|
||||
self.right if isinstance(self.right, int) else self.right.list()
|
||||
]
|
||||
|
||||
def __add__(self, __o):
|
||||
new = Pair(self, __o)
|
||||
self.parent = new
|
||||
__o.parent = new
|
||||
new.reduce()
|
||||
return new
|
||||
|
||||
def reduce(self):
|
||||
reduce_again = False
|
||||
while True:
|
||||
lvl = 0
|
||||
old_queue = []
|
||||
queue = [self]
|
||||
new_queue = []
|
||||
while len(queue) != 0 and lvl <= 4:
|
||||
lvl += 1
|
||||
for n in queue:
|
||||
if not isinstance(n.left, int):
|
||||
new_queue.append(n.left)
|
||||
if not isinstance(n.right, int):
|
||||
new_queue.append(n.right)
|
||||
old_queue = queue[:]
|
||||
queue = new_queue[:]
|
||||
new_queue = []
|
||||
queue = old_queue[:]
|
||||
|
||||
if lvl <= 4:
|
||||
break
|
||||
queue[0].left_most_pair().explode()
|
||||
|
||||
# verbose(f"{lvl = }, {queue = }")
|
||||
# if lvl > 4 and len(queue) > 0:
|
||||
# verbose(f"needing to explode some stuff, {queue = }")
|
||||
# reduce_again = True
|
||||
# for n in queue:
|
||||
# n.explode()
|
||||
# else:
|
||||
# break
|
||||
|
||||
queue = [self]
|
||||
new_queue = []
|
||||
while len(queue) != 0:
|
||||
lvl += 1
|
||||
for n in queue:
|
||||
if isinstance(n.left, int):
|
||||
if n.left >= 10:
|
||||
verbose(f"splitting left of {n}")
|
||||
reduce_again = True
|
||||
n.split_left()
|
||||
else:
|
||||
new_queue.append(n.left)
|
||||
|
||||
if isinstance(n.right, int):
|
||||
if n.right >= 10:
|
||||
verbose(f"splitting right of {n}")
|
||||
reduce_again = True
|
||||
n.split_right()
|
||||
else:
|
||||
new_queue.append(n.right)
|
||||
queue = new_queue[:]
|
||||
new_queue = []
|
||||
|
||||
if reduce_again:
|
||||
self.reduce()
|
||||
|
||||
def mag(self):
|
||||
res = 0
|
||||
res += 3 * (self.left if isinstance(self.left, int) else self.left.mag())
|
||||
res += 2 * (self.right if isinstance(self.right, int) else self.right.mag())
|
||||
return res
|
||||
|
||||
|
||||
def parse(arr, parent = None):
|
||||
ret = Pair(None, None, parent)
|
||||
ret.left = arr[0] if isinstance(arr[0], int) else parse(arr[0], ret)
|
||||
ret.right = arr[1] if isinstance(arr[1], int) else parse(arr[1], ret)
|
||||
return ret
|
||||
|
||||
|
||||
def result(inp, part = 1, partial = False):
|
||||
partial_res = inp[0]
|
||||
for p in inp[1:]:
|
||||
verbose(f"adding {partial_res} and {p}")
|
||||
partial_res += p
|
||||
|
||||
verbose()
|
||||
|
||||
if partial:
|
||||
return partial_res
|
||||
return partial_res.mag()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
VERBOSE = False
|
||||
print(result(get_input(), part = 1))
|
4
2021/18/sample_p1
Normal file
4
2021/18/sample_p1
Normal file
@ -0,0 +1,4 @@
|
||||
[1,1]
|
||||
[2,2]
|
||||
[3,3]
|
||||
[4,4]
|
5
2021/18/sample_p2
Normal file
5
2021/18/sample_p2
Normal file
@ -0,0 +1,5 @@
|
||||
[1,1]
|
||||
[2,2]
|
||||
[3,3]
|
||||
[4,4]
|
||||
[5,5]
|
6
2021/18/sample_p3
Normal file
6
2021/18/sample_p3
Normal file
@ -0,0 +1,6 @@
|
||||
[1,1]
|
||||
[2,2]
|
||||
[3,3]
|
||||
[4,4]
|
||||
[5,5]
|
||||
[6,6]
|
10
2021/18/sample_p4
Normal file
10
2021/18/sample_p4
Normal file
@ -0,0 +1,10 @@
|
||||
[[[0,[4,5]],[0,0]],[[[4,5],[2,6]],[9,5]]]
|
||||
[7,[[[3,7],[4,3]],[[6,3],[8,8]]]]
|
||||
[[2,[[0,8],[3,4]]],[[[6,7],1],[7,[1,6]]]]
|
||||
[[[[2,4],7],[6,[0,5]]],[[[6,8],[2,8]],[[2,1],[4,5]]]]
|
||||
[7,[5,[[3,8],[1,4]]]]
|
||||
[[2,[2,2]],[8,[8,1]]]
|
||||
[2,9]
|
||||
[1,[[[9,3],9],[[9,0],[0,7]]]]
|
||||
[[[5,[7,4]],7],1]
|
||||
[[[[4,2],2],6],[8,7]]
|
10
2021/18/sample_p5
Normal file
10
2021/18/sample_p5
Normal file
@ -0,0 +1,10 @@
|
||||
[[[0,[5,8]],[[1,7],[9,6]]],[[4,[1,2]],[[1,4],2]]]
|
||||
[[[5,[2,8]],4],[5,[[9,9],0]]]
|
||||
[6,[[[6,2],[5,6]],[[7,6],[4,7]]]]
|
||||
[[[6,[0,7]],[0,9]],[4,[9,[9,0]]]]
|
||||
[[[7,[6,4]],[3,[1,3]]],[[[5,5],1],9]]
|
||||
[[6,[[7,3],[3,2]]],[[[3,8],[5,7]],4]]
|
||||
[[[[5,4],[7,7]],8],[[8,3],8]]
|
||||
[[9,3],[[9,9],[6,[4,9]]]]
|
||||
[[2,[[7,7],7]],[[5,8],[[9,3],[0,2]]]]
|
||||
[[[[5,2],5],[8,[3,7]]],[[5,[7,5]],[4,4]]]
|
108
2021/18/test.py
Normal file
108
2021/18/test.py
Normal file
@ -0,0 +1,108 @@
|
||||
from prog import *
|
||||
import unittest
|
||||
|
||||
class Tests(unittest.TestCase):
|
||||
|
||||
def test_eq(self):
|
||||
for l in [
|
||||
[1,2],
|
||||
[[1, 2], 3],
|
||||
[[[[[9,8],1],2],3],4],
|
||||
[[[[0,9],2],3],4],
|
||||
[7,[6,[5,[4,[3,2]]]]],
|
||||
[7,[6,[5,[7,0]]]],
|
||||
[[6,[5,[4,[3,2]]]],1],
|
||||
[[6,[5,[7,0]]],3],
|
||||
[[3,[2,[1,[7,3]]]],[6,[5,[4,[3,2]]]]],
|
||||
[[3,[2,[8,0]]],[9,[5,[4,[3,2]]]]],
|
||||
[[3,[2,[8,0]]],[9,[5,[7,0]]]],
|
||||
[[[[[4,3],4],4],[7,[[8,4],9]]],[1,1]],
|
||||
[[[[0,7],4],[7,[[8,4],9]]],[1,1]],
|
||||
[[[[0,7],4],[15,[0,13]]],[1,1]],
|
||||
[[[[0,7],4],[[7,8],[0,13]]],[1,1]],
|
||||
[[[[0,7],4],[[7,8],[0,[6,7]]]],[1,1]],
|
||||
[[[[0,7],4],[[7,8],[6,0]]],[8,1]],
|
||||
]:
|
||||
l1 = parse(l)
|
||||
l2 = parse(l)
|
||||
with self.subTest(l=l, l1=l1, l2=l2):
|
||||
self.assertEqual(l1, l2)
|
||||
|
||||
def test_parse(self):
|
||||
for l in [
|
||||
[1,2],
|
||||
[[1, 2], 3],
|
||||
[[[[[9,8],1],2],3],4],
|
||||
[[[[0,9],2],3],4],
|
||||
[7,[6,[5,[4,[3,2]]]]],
|
||||
[7,[6,[5,[7,0]]]],
|
||||
[[6,[5,[4,[3,2]]]],1],
|
||||
[[6,[5,[7,0]]],3],
|
||||
[[3,[2,[1,[7,3]]]],[6,[5,[4,[3,2]]]]],
|
||||
[[3,[2,[8,0]]],[9,[5,[4,[3,2]]]]],
|
||||
[[3,[2,[8,0]]],[9,[5,[7,0]]]],
|
||||
[[[[[4,3],4],4],[7,[[8,4],9]]],[1,1]],
|
||||
[[[[0,7],4],[7,[[8,4],9]]],[1,1]],
|
||||
[[[[0,7],4],[15,[0,13]]],[1,1]],
|
||||
[[[[0,7],4],[[7,8],[0,13]]],[1,1]],
|
||||
[[[[0,7],4],[[7,8],[0,[6,7]]]],[1,1]],
|
||||
[[[[0,7],4],[[7,8],[6,0]]],[8,1]],
|
||||
]:
|
||||
with self.subTest(l=l):
|
||||
self.assertEqual(parse(l).list(), l)
|
||||
|
||||
def test_explode(self):
|
||||
t1 = parse([[[[[9,8],1],2],3],4])
|
||||
t1.left_most_pair().explode()
|
||||
t2 = parse([[[[0,9],2],3],4])
|
||||
self.assertEqual(t1, t2)
|
||||
|
||||
t1 = parse([7,[6,[5,[4,[3,2]]]]])
|
||||
t1.right_most_pair().explode()
|
||||
t2 = parse([7,[6,[5,[7,0]]]])
|
||||
self.assertEqual(t1, t2)
|
||||
|
||||
t1 = parse([[6,[5,[4,[3,2]]]],1])
|
||||
t1.left.right_most_pair().explode()
|
||||
t2 = parse([[6,[5,[7,0]]],3])
|
||||
self.assertEqual(t1, t2)
|
||||
|
||||
t1 = parse([[3,[2,[1,[7,3]]]],[6,[5,[4,[3,2]]]]])
|
||||
t1.left.right_most_pair().explode()
|
||||
t2 = parse([[3,[2,[8,0]]],[9,[5,[4,[3,2]]]]])
|
||||
self.assertEqual(t1, t2)
|
||||
|
||||
t1 = parse([[3,[2,[8,0]]],[9,[5,[4,[3,2]]]]])
|
||||
t1.right_most_pair().explode()
|
||||
t2 = parse([[3,[2,[8,0]]],[9,[5,[7,0]]]])
|
||||
self.assertEqual(t1, t2)
|
||||
|
||||
def test_add_and_reduce(self):
|
||||
self.assertEqual(parse([[[[4,3],4],4],[7,[[8,4],9]]]) + parse([1, 1]), parse([[[[0,7],4],[[7,8],[6,0]]],[8,1]]))
|
||||
self.assertEqual(parse([[[0,[4,5]],[0,0]],[[[4,5],[2,6]],[9,5]]]) + parse([7,[[[3,7],[4,3]],[[6,3],[8,8]]]]), parse([[[[4,0],[5,4]],[[7,7],[6,0]]],[[8,[7,7]],[[7,9],[5,0]]]]))
|
||||
|
||||
|
||||
def test_mag(self):
|
||||
self.assertEqual(parse([9, 1]).mag(), 29)
|
||||
self.assertEqual(parse([1, 9]).mag(), 21)
|
||||
self.assertEqual(parse([[9, 1], [1, 9]]).mag(), 129)
|
||||
self.assertEqual(parse([[1,2],[[3,4],5]]).mag(), 143)
|
||||
self.assertEqual(parse([[[[0,7],4],[[7,8],[6,0]]],[8,1]]).mag(), 1384)
|
||||
self.assertEqual(parse([[[[1,1],[2,2]],[3,3]],[4,4]]).mag(), 445)
|
||||
self.assertEqual(parse([[[[3,0],[5,3]],[4,4]],[5,5]]).mag(), 791)
|
||||
self.assertEqual(parse([[[[5,0],[7,4]],[5,5]],[6,6]]).mag(), 1137)
|
||||
self.assertEqual(parse([[[[8,7],[7,7]],[[8,6],[7,7]]],[[[0,7],[6,6]],[8,7]]]).mag(), 3488)
|
||||
|
||||
# def test_part1_partial(self):
|
||||
# self.assertEqual(result(get_input(sample = True), partial = True), parse([[[[1,1],[2,2]],[3,3]],[4,4]]))
|
||||
# self.assertEqual(result(get_input(sample = True, part = 2), partial = True), parse([[[[3,0],[5,3]],[4,4]],[5,5]]))
|
||||
# self.assertEqual(result(get_input(sample = True, part = 3), partial = True), parse([[[[5,0],[7,4]],[5,5]],[6,6]]))
|
||||
# self.assertEqual(result(get_input(sample = True, part = 4), partial = True), parse([[[[8,7],[7,7]],[[8,6],[7,7]]],[[[0,7],[6,6]],[8,7]]]))
|
||||
# self.assertEqual(result(get_input(sample = True, part = 5), partial = True), parse([[[[6,6],[7,6]],[[7,7],[7,0]]],[[[7,7],[7,7]],[[7,8],[9,9]]]]))
|
||||
|
||||
# def test_part1(self):
|
||||
# self.assertEqual(result(get_input(sample = True, part = 5)), 4140)
|
||||
|
||||
# def test_part2(self):
|
||||
# self.assertEqual(result(get_input(sample = True), part = 2), 5)
|
||||
|
6
2021/Makefile
Normal file
6
2021/Makefile
Normal file
@ -0,0 +1,6 @@
|
||||
N=$(shell find ./* -maxdepth 0 -type d | grep -v git | wc -l)
|
||||
DIR_NAME=$(shell printf "%02d" $(N))
|
||||
|
||||
.PHONY: new
|
||||
new:
|
||||
cp -r 00_template "$(DIR_NAME)" && curl -s -H "Cookie: session=$$AOC_SESSION" "https://adventofcode.com/2021/day/$(N)/input" > "$(DIR_NAME)"/input
|
Loading…
Reference in New Issue
Block a user