diff options
72 files changed, 7285 insertions, 0 deletions
diff --git a/2023/day1/input b/2023/day01/input index 6edee3a..6edee3a 100644 --- a/2023/day1/input +++ b/2023/day01/input diff --git a/2023/day1/solve.py b/2023/day01/solve.py index b6a47c1..b6a47c1 100644 --- a/2023/day1/solve.py +++ b/2023/day01/solve.py diff --git a/2023/day1/solve2.py b/2023/day01/solve2.py index e545cf3..e545cf3 100644 --- a/2023/day1/solve2.py +++ b/2023/day01/solve2.py diff --git a/2023/day2/input b/2023/day02/input index df90739..df90739 100644 --- a/2023/day2/input +++ b/2023/day02/input diff --git a/2023/day2/solve.py b/2023/day02/solve.py index 939b134..939b134 100644 --- a/2023/day2/solve.py +++ b/2023/day02/solve.py diff --git a/2023/day2/solve2.py b/2023/day02/solve2.py index c79821a..c79821a 100644 --- a/2023/day2/solve2.py +++ b/2023/day02/solve2.py diff --git a/2023/day3/input b/2023/day03/input index e51b04f..e51b04f 100644 --- a/2023/day3/input +++ b/2023/day03/input diff --git a/2023/day3/input_test b/2023/day03/input_test index 624ea4f..624ea4f 100644 --- a/2023/day3/input_test +++ b/2023/day03/input_test diff --git a/2023/day3/solve.py b/2023/day03/solve.py index bc84dc0..bc84dc0 100644 --- a/2023/day3/solve.py +++ b/2023/day03/solve.py diff --git a/2023/day03/solve2.py b/2023/day03/solve2.py new file mode 100644 index 0000000..5b23f13 --- /dev/null +++ b/2023/day03/solve2.py @@ -0,0 +1,104 @@ +class Gear:
+ def __init__(self, line_idx, column_idx):
+ self.line_idx = line_idx
+ self.column_idx = column_idx
+ self.connecting_parts = []
+
+
+def add_part_to_gear(line_idx, column_idx, part_number_line_idx, part_number_column_idx, gears):
+ for gear in gears:
+ if gear.line_idx == line_idx and gear.column_idx == column_idx:
+ gear.connecting_parts.append((part_number_line_idx, part_number_column_idx))
+ break
+ else:
+ new_gear = Gear(line_idx, column_idx)
+ new_gear.connecting_parts.append((part_number_line_idx, part_number_column_idx))
+ gears.append(new_gear)
+
+
+def check_if_part_number(line_index, column_index, lines, gears):
+ ret_val = False
+
+ current_line = lines[line_index]
+ if column_index > 0 and current_line[column_index - 1] != ".":
+ if current_line[column_index - 1] == "*":
+ add_part_to_gear(line_index, column_index - 1, line_index, column_index, gears)
+ ret_val = True
+
+ max_column_index = column_index
+ for index in range(column_index + 1, len(current_line)):
+ if not current_line[index].isdigit():
+ break
+ max_column_index = index
+
+ if max_column_index + 1 < len(current_line) and current_line[max_column_index + 1] != ".":
+ if current_line[max_column_index + 1] == "*":
+ add_part_to_gear(line_index, column_index + 1, line_index, column_index, gears)
+ ret_val = True
+
+ min_other_column_index = max(column_index - 1, 0)
+ max_other_column_index = min(max_column_index + 1, len(current_line) - 1)
+
+ if line_index > 0:
+ other_line = lines[line_index - 1]
+ for current_column_index in range(min_other_column_index, max_other_column_index + 1):
+ other_char = other_line[current_column_index]
+ if not other_char.isdigit() and other_char != ".":
+ if other_char == "*":
+ add_part_to_gear(line_index - 1, current_column_index, line_index, column_index, gears)
+ ret_val = True
+
+ if line_index + 1 < len(lines):
+ other_line = lines[line_index + 1]
+ for current_column_index in range(min_other_column_index, max_other_column_index + 1):
+ other_char = other_line[current_column_index]
+ if not other_char.isdigit() and other_char != ".":
+ if other_char == "*":
+ add_part_to_gear(line_index + 1, current_column_index, line_index, column_index, gears)
+ ret_val = True
+
+ return ret_val
+
+
+def main():
+ lines = []
+ positions = []
+ gears = []
+ with open("input", "r") as f:
+ for line in f:
+ lines.append(line.strip())
+
+ part_numbers = []
+
+ parsed_number = None
+ is_part_number_parsed = False
+ for line_index, line in enumerate(lines):
+ for column_index, char in enumerate(line):
+ if not char.isdigit():
+ if is_part_number_parsed:
+ part_numbers.append(int(parsed_number))
+
+ parsed_number = None
+ is_part_number_parsed = False
+ elif parsed_number is not None:
+ parsed_number += char
+ else:
+ parsed_number = char
+ is_part_number_parsed = check_if_part_number(line_index, column_index, lines, gears)
+ if is_part_number_parsed:
+ positions.append((line_index, column_index))
+
+ if is_part_number_parsed:
+ part_numbers.append(int(parsed_number))
+ parsed_number = None
+ is_part_number_parsed = False
+
+ gears = [gear for gear in gears if len(gear.connecting_parts) == 2]
+ ratios = []
+ for gear in gears:
+ ratios.append(part_numbers[positions.index(gear.connecting_parts[0])] * part_numbers[positions.index(gear.connecting_parts[1])])
+ print(sum(ratios))
+
+
+if __name__ == '__main__':
+ main()
diff --git a/2024/day1/input b/2024/day01/input index 921687d..921687d 100644 --- a/2024/day1/input +++ b/2024/day01/input diff --git a/2024/day1/solve.py b/2024/day01/solve.py index e01ded4..e01ded4 100644 --- a/2024/day1/solve.py +++ b/2024/day01/solve.py diff --git a/2024/day1/solve2.py b/2024/day01/solve2.py index 8b00942..8b00942 100644 --- a/2024/day1/solve2.py +++ b/2024/day01/solve2.py diff --git a/2024/day02/input b/2024/day02/input new file mode 100644 index 0000000..0501d5f --- /dev/null +++ b/2024/day02/input @@ -0,0 +1,1000 @@ +24 25 28 31 28
+41 44 45 48 49 50 50
+5 8 10 13 15 16 17 21
+11 13 16 17 19 26
+79 81 78 79 82 84
+16 19 20 18 20 22 25 22
+84 87 90 92 94 97 96 96
+86 87 88 91 88 91 95
+40 43 41 44 49
+8 10 10 11 13
+91 94 95 95 92
+18 19 20 20 21 23 25 25
+15 17 19 19 23
+35 37 37 39 40 43 50
+2 5 6 10 12
+82 85 87 88 91 93 97 94
+30 32 35 38 42 43 43
+64 66 68 72 76
+73 74 77 80 84 86 91
+64 67 72 73 74 76
+72 73 75 81 82 81
+24 25 32 35 37 38 38
+59 60 62 64 65 70 74
+44 46 47 48 50 52 58 63
+54 52 53 56 57 58
+77 76 77 80 82 81
+48 45 48 49 52 54 54
+74 71 74 76 78 81 85
+20 18 19 21 27
+88 86 88 91 92 89 92
+17 16 14 17 18 15
+95 92 91 93 95 96 96
+7 5 6 9 8 11 14 18
+15 12 9 12 14 16 21
+3 2 2 5 6
+58 55 55 57 58 57
+36 35 36 36 36
+73 72 72 75 79
+80 77 78 78 79 82 87
+20 19 23 25 27 28 31 32
+92 90 91 95 97 96
+86 84 86 90 93 96 98 98
+36 33 34 38 41 45
+82 81 85 88 89 92 99
+70 69 71 77 78 81
+51 49 50 57 60 58
+28 27 30 33 35 40 40
+40 37 38 45 49
+53 52 54 55 56 61 67
+27 27 29 31 34
+82 82 84 86 89 92 89
+91 91 93 96 96
+55 55 58 60 64
+80 80 81 82 83 85 88 95
+84 84 87 84 85
+81 81 80 82 79
+25 25 22 24 24
+71 71 74 76 77 74 78
+86 86 87 86 87 88 93
+41 41 43 43 46
+70 70 70 72 71
+12 12 13 13 14 15 15
+23 23 23 26 28 31 35
+84 84 86 88 88 89 91 98
+4 4 5 7 8 9 13 14
+31 31 35 36 37 36
+19 19 23 26 26
+80 80 84 85 88 90 94
+51 51 53 54 58 60 61 66
+35 35 36 42 43
+9 9 12 15 18 24 21
+2 2 8 11 14 15 15
+25 25 30 33 36 38 39 43
+13 13 18 19 26
+10 14 15 17 19
+35 39 40 43 45 46 48 45
+41 45 47 50 50
+16 20 23 25 28 31 34 38
+10 14 15 18 20 25
+42 46 49 46 48
+25 29 32 31 34 31
+7 11 14 11 14 14
+90 94 92 94 98
+27 31 34 32 35 37 44
+50 54 54 56 59 61 63
+48 52 52 53 50
+84 88 89 90 91 91 91
+48 52 54 54 56 60
+85 89 89 91 98
+9 13 15 17 21 23
+43 47 49 52 53 57 55
+76 80 82 83 86 90 93 93
+5 9 11 15 16 20
+53 57 61 62 65 66 73
+65 69 70 73 76 81 82 83
+15 19 21 27 24
+51 55 57 63 65 65
+15 19 22 25 27 33 37
+1 5 6 7 9 11 16 22
+50 56 58 60 63 65 68 70
+36 42 43 44 41
+36 42 44 47 50 52 54 54
+79 84 87 88 90 92 94 98
+35 42 45 46 47 49 52 58
+74 80 83 80 81 82 84 85
+60 67 69 72 73 71 72 71
+85 92 94 97 96 98 98
+17 22 25 27 25 28 32
+22 28 26 28 31 33 40
+51 57 60 61 61 62 63
+7 13 16 16 19 18
+80 87 87 89 89
+70 76 79 81 84 84 88
+39 45 46 49 49 51 52 58
+38 43 45 48 52 55 57 58
+79 84 86 89 93 94 92
+39 45 48 52 52
+58 63 67 69 70 74
+76 83 86 90 97
+13 18 25 27 29 31
+60 66 69 72 75 80 82 81
+21 26 29 31 33 38 38
+31 37 42 45 46 50
+15 21 23 24 30 32 38
+51 48 45 43 44
+45 43 41 40 38 37 36 36
+66 64 61 60 57 53
+89 86 83 81 76
+36 33 30 33 30 29 28 27
+91 88 91 89 86 85 83 85
+12 10 12 11 11
+31 30 27 30 28 27 23
+35 32 31 34 32 26
+11 10 10 9 6 5 4 3
+44 41 38 38 37 35 34 36
+80 78 76 73 72 71 71 71
+45 43 40 37 37 33
+97 94 91 88 87 86 86 80
+58 56 53 51 47 44
+66 63 62 60 58 56 52 53
+73 72 71 68 65 61 61
+95 92 88 86 82
+19 17 16 12 11 10 5
+80 77 74 71 66 64 62 61
+64 62 59 56 51 52
+47 46 43 42 39 38 33 33
+45 44 41 39 34 30
+95 92 89 87 82 81 80 74
+94 96 94 91 88
+89 91 90 88 89
+40 41 38 36 36
+70 72 70 68 67 63
+22 25 24 21 19 18 13
+41 42 39 40 38 37
+35 36 35 32 31 29 32 35
+31 34 31 34 34
+88 90 89 91 90 88 85 81
+54 57 60 59 56 50
+83 85 82 82 80
+66 68 68 65 62 61 62
+35 36 36 34 32 30 30
+79 80 80 78 76 74 70
+44 45 45 43 37
+37 40 37 33 31
+63 65 63 59 56 55 54 56
+19 22 21 17 15 13 11 11
+94 95 91 90 88 84
+22 23 19 18 16 14 7
+29 32 30 23 22
+64 67 64 58 56 57
+29 30 27 24 18 18
+33 36 34 27 24 22 20 16
+50 52 49 48 46 39 37 31
+31 31 28 25 22 21 19 16
+47 47 44 43 40 37 38
+88 88 85 84 84
+41 41 38 36 32
+73 73 70 69 67 66 60
+80 80 81 80 79 77 76 75
+36 36 34 32 34 35
+59 59 57 60 59 58 56 56
+30 30 27 28 25 23 19
+9 9 7 6 5 8 3
+89 89 87 86 85 85 82
+52 52 49 46 46 47
+60 60 59 59 59
+21 21 19 19 15
+17 17 17 16 13 12 10 4
+33 33 29 28 26 25
+67 67 63 61 58 60
+27 27 25 24 20 20
+78 78 76 74 72 68 64
+62 62 59 55 49
+47 47 44 38 36 33 31
+31 31 28 21 23
+81 81 80 79 78 72 72
+75 75 69 66 62
+97 97 91 89 87 85 78
+35 31 28 27 26 25
+35 31 28 27 25 22 21 23
+37 33 32 31 28 28
+73 69 67 65 62 59 55
+67 63 60 58 53
+52 48 47 44 47 46 43
+73 69 70 68 69
+18 14 13 16 16
+91 87 84 81 82 79 77 73
+96 92 90 92 91 88 81
+40 36 35 35 34 33 31
+93 89 86 83 82 82 80 81
+86 82 79 79 78 77 77
+20 16 13 13 12 8
+30 26 23 23 21 19 17 10
+76 72 69 66 62 60 57 54
+57 53 49 46 48
+64 60 58 54 54
+20 16 15 12 8 5 1
+40 36 34 31 27 25 19
+25 21 20 18 16 14 9 6
+48 44 43 40 38 36 29 31
+96 92 90 89 83 81 80 80
+45 41 34 32 28
+35 31 28 27 21 19 14
+35 30 27 26 23
+73 66 63 61 64
+60 55 53 51 50 50
+68 62 61 60 56
+55 50 49 46 43 42 37
+29 23 22 25 22 20 18 16
+96 90 88 85 84 86 83 85
+47 41 39 36 37 37
+72 66 69 68 66 62
+52 47 49 46 43 36
+77 71 68 68 67 66
+99 94 94 93 96
+45 38 35 33 31 31 31
+23 16 13 10 10 6
+33 26 25 25 23 20 18 11
+44 37 33 30 28 27
+90 85 81 79 80
+91 85 82 79 77 73 70 70
+98 91 88 86 82 78
+68 63 61 58 54 52 45
+64 58 57 50 49
+66 59 56 49 52
+89 82 77 76 73 70 70
+80 73 72 67 63
+73 66 60 59 57 50
+11 14 15 17 20 23 21
+47 50 52 55 56 56
+16 17 18 19 20 23 27
+82 83 85 88 90 91 94 99
+59 61 59 61 64 67 70 73
+32 33 36 37 38 36 39 38
+86 89 90 91 89 92 94 94
+67 68 71 68 71 73 76 80
+28 30 31 33 34 32 39
+3 4 6 6 7 10 12 13
+61 64 64 66 69 71 68
+49 50 52 52 53 55 55
+8 11 14 16 16 20
+59 62 62 63 70
+43 45 49 52 55 57
+80 82 86 88 89 92 93 91
+81 82 86 87 88 91 94 94
+38 41 45 48 51 53 57
+35 38 40 41 45 47 54
+6 9 12 14 15 17 22 23
+81 82 83 85 91 90
+74 76 83 84 87 87
+24 27 28 35 37 41
+69 71 72 77 80 85
+12 9 12 13 15 17 20 23
+77 75 76 77 78 81 78
+60 57 59 61 61
+13 10 11 14 16 20
+81 80 81 84 85 90
+6 5 6 7 5 7 10 13
+54 51 54 52 54 55 54
+72 71 70 73 73
+89 86 88 90 91 88 90 94
+8 6 3 5 10
+10 7 8 10 12 12 15 16
+14 11 12 14 16 16 19 18
+39 37 38 38 39 42 44 44
+13 11 12 13 15 15 16 20
+10 8 8 11 14 20
+42 40 42 45 49 50
+67 66 70 73 76 78 77
+32 30 34 35 37 37
+47 44 45 49 51 55
+36 35 39 40 43 45 47 53
+68 66 67 68 73 74
+40 37 38 39 40 46 47 45
+28 26 27 30 35 35
+45 42 48 50 54
+44 43 45 48 54 59
+61 61 62 63 64 66 67
+57 57 58 61 59
+66 66 69 71 73 75 78 78
+59 59 61 64 67 71
+28 28 29 30 31 33 36 41
+41 41 42 41 44 45
+11 11 10 13 15 12
+37 37 40 38 41 41
+41 41 40 42 46
+68 68 69 72 69 71 78
+95 95 95 97 98 99
+9 9 9 10 13 14 17 16
+81 81 82 85 88 88 88
+86 86 86 89 92 96
+58 58 59 62 62 67
+80 80 81 85 87
+84 84 87 91 88
+3 3 7 10 11 12 12
+74 74 75 79 81 82 85 89
+26 26 28 29 31 35 37 44
+38 38 39 46 49
+77 77 80 81 87 88 85
+75 75 78 81 87 90 92 92
+28 28 31 37 40 43 47
+11 11 12 18 20 27
+15 19 21 22 23 26
+58 62 64 65 66 69 71 69
+56 60 61 63 63
+46 50 53 56 58 62
+67 71 73 76 81
+52 56 58 56 58 60
+6 10 11 8 7
+81 85 86 89 87 88 88
+72 76 79 76 79 82 86
+39 43 44 46 43 49
+38 42 45 45 46
+41 45 48 51 51 48
+79 83 86 86 86
+24 28 29 31 33 33 34 38
+55 59 59 61 62 65 67 74
+73 77 80 82 86 87 90
+45 49 50 53 57 54
+80 84 88 90 92 92
+14 18 20 22 24 28 32
+61 65 69 70 73 76 82
+50 54 57 59 62 63 69 70
+75 79 81 82 83 89 92 89
+45 49 52 59 61 63 63
+38 42 44 45 48 55 57 61
+62 66 69 71 74 80 86
+28 35 37 40 41 43
+25 30 32 33 34 37 35
+14 19 20 21 22 22
+8 14 17 20 23 27
+23 28 29 31 38
+68 74 77 78 76 79 80
+14 21 18 20 22 23 25 22
+18 23 20 22 22
+65 72 71 74 76 80
+8 14 15 17 14 17 20 25
+59 65 68 70 70 73
+59 65 68 68 71 74 71
+34 41 43 43 43
+20 25 25 28 32
+43 48 50 50 53 56 58 64
+38 45 49 52 55 58
+23 30 34 35 33
+4 9 11 14 18 20 21 21
+51 57 61 63 67
+67 74 78 81 82 88
+20 26 29 36 37
+9 14 15 18 20 26 29 28
+73 79 82 87 90 90
+9 16 18 24 28
+8 14 19 22 29
+80 77 75 73 76
+93 90 88 85 84 81 78 78
+25 22 20 18 15 12 11 7
+51 48 47 44 42 40 37 31
+77 74 77 75 73 72
+94 91 92 90 88 89
+28 27 26 24 21 22 20 20
+94 91 88 87 86 89 85
+91 90 87 85 82 80 81 74
+59 56 56 54 52 50
+89 88 88 87 84 82 85
+96 95 93 90 89 86 86 86
+25 22 22 19 15
+39 36 34 34 33 31 24
+53 52 49 47 43 40
+93 92 88 85 87
+82 80 76 75 72 69 66 66
+57 55 52 49 47 43 39
+43 40 36 33 26
+33 30 28 21 18
+72 70 67 66 59 61
+26 23 22 19 14 12 10 10
+25 22 20 18 13 10 9 5
+33 30 27 21 19 16 13 6
+96 98 97 95 93 90 89
+47 48 46 45 47
+10 12 9 8 7 5 3 3
+48 49 48 47 43
+25 28 26 25 22 15
+2 4 1 4 3
+59 62 65 64 65
+24 25 22 19 20 17 17
+53 54 52 54 51 48 46 42
+21 23 21 18 19 18 12
+48 49 46 46 43 41 40
+58 61 59 57 57 59
+84 85 83 80 79 78 78 78
+20 22 22 19 17 15 11
+87 89 87 86 86 81
+97 99 95 94 91
+15 18 16 15 11 13
+54 55 53 49 49
+28 30 26 25 23 21 17
+34 37 34 32 28 21
+33 36 33 31 28 21 18 15
+66 69 68 63 61 58 55 58
+93 94 93 87 85 85
+17 18 13 12 8
+81 83 80 78 71 68 63
+68 68 66 65 63
+65 65 62 61 58 57 60
+28 28 26 23 23
+48 48 46 45 44 43 39
+16 16 13 11 6
+30 30 29 26 29 28
+23 23 20 22 20 17 20
+41 41 43 41 41
+39 39 36 39 36 32
+34 34 36 35 30
+88 88 87 85 85 84
+6 6 4 3 3 5
+41 41 38 38 38
+14 14 11 8 8 7 5 1
+75 75 72 72 70 64
+59 59 55 52 51
+91 91 88 84 81 79 80
+95 95 92 88 85 85
+62 62 60 59 55 51
+17 17 13 11 4
+67 67 66 65 63 58 56
+63 63 56 55 57
+46 46 45 39 39
+42 42 39 38 32 28
+91 91 86 84 78
+30 26 24 22 21 20 19
+58 54 53 50 53
+10 6 5 4 4
+93 89 88 86 85 83 81 77
+52 48 46 43 38
+89 85 84 81 83 82 79
+46 42 41 39 42 44
+48 44 41 44 43 42 39 39
+61 57 56 53 54 51 47
+55 51 54 52 50 43
+23 19 16 16 15 13 11 8
+23 19 17 16 14 14 13 14
+23 19 19 17 14 11 9 9
+24 20 19 16 14 14 10
+94 90 88 85 85 84 77
+47 43 41 39 36 32 30
+54 50 46 45 42 43
+88 84 81 77 77
+29 25 21 20 18 15 12 8
+67 63 59 58 51
+16 12 6 3 1
+68 64 61 59 53 51 50 53
+70 66 60 58 58
+84 80 75 73 70 66
+92 88 86 85 78 77 71
+93 86 83 82 79 77 74 73
+56 50 48 46 48
+25 20 19 16 13 13
+79 74 73 72 70 69 67 63
+77 71 70 67 64 62 56
+80 74 71 68 67 69 68 65
+36 29 27 26 28 31
+88 82 83 82 82
+13 6 5 7 3
+17 11 12 9 6 1
+87 82 81 80 80 78 75
+23 17 14 11 11 12
+70 64 61 58 58 58
+96 91 90 87 87 85 81
+92 85 85 83 80 74
+23 17 13 12 11
+70 63 59 56 55 53 54
+85 80 79 76 73 70 66 66
+81 75 74 73 72 68 64
+69 62 59 55 54 49
+68 62 60 58 52 49
+81 75 74 71 69 64 66
+71 65 58 55 55
+39 32 31 26 24 22 19 15
+53 47 42 40 33
+39 40 43 44 46 48 55 61
+41 37 35 31 29 25
+33 28 26 23 23 24
+53 49 48 45 43 39
+45 45 46 47 49 49 50 57
+55 52 51 50 47 46 46 42
+43 40 39 33 27
+31 37 42 44 46 46
+38 36 34 33 30 29 27 30
+25 31 33 35 32 38
+74 74 80 82 83 87
+34 40 40 41 44 45 50
+75 68 66 63 61
+72 69 67 64 61 54 54
+23 27 27 29 34
+53 57 58 60 60
+47 40 35 34 35
+28 24 22 20 18 16 16
+55 58 56 52 52
+9 9 11 14 15 12 16
+38 33 29 27 26 21
+19 18 19 19 20 24
+59 59 55 54 53 52 46
+9 13 16 18 20 21 22 26
+36 32 25 24 21 15
+40 41 44 45 47 46 49 53
+2 4 7 7 9 11 18
+16 21 20 22 23 25
+90 84 82 79 75 72 68
+74 74 78 79 81 81
+59 61 64 63 61 59 52
+76 76 75 68 67 64 65
+85 85 85 86 85
+34 37 35 32 29 25 24
+86 84 84 83 80 77 75 68
+15 16 20 21 23 26 29
+65 71 75 76 73
+95 95 94 91 88 90
+81 87 88 91 94 96 97 97
+4 8 11 13 14 12 15
+34 40 42 44 47 45 43
+34 36 38 41 48 51 55
+44 46 44 44 41 40 38 38
+95 98 97 96 93 93
+54 53 50 48 44 38
+25 25 23 20 17 15 11
+82 82 81 81 81
+52 56 58 62 64 68
+39 39 36 35 34
+83 86 88 85 87
+46 39 41 40 34
+18 24 27 34 37
+34 30 28 26 24 23 24
+65 67 70 72 74 77 76
+18 23 24 27 34 36 37 36
+10 10 11 14 16 21
+2 6 9 12 13 13 15 14
+46 51 52 56 57 59 63
+69 75 80 81 85
+60 61 64 61 58 57 60
+84 87 86 80 79 79
+76 73 75 73 73
+72 66 65 62 65 63 60
+10 14 16 17 18 25 27 31
+15 16 17 17 18
+94 94 91 86 82
+39 46 47 49 52 56 58
+1 1 2 2 2
+3 7 8 10 17 20 20
+26 26 24 19 17 14 12
+43 43 42 44 42 37
+62 62 59 60 59 58 55 55
+19 23 27 28 30 36
+41 44 42 44 41 41
+12 10 10 12 13 15 17 22
+52 53 54 55 62 65 67 67
+21 22 21 20 20 19 16 17
+50 46 45 43 41 40 40 40
+69 70 74 77 77
+83 87 89 89 90 94
+14 11 9 11 15
+86 83 84 88 89 92 93 97
+47 44 44 47 47
+83 87 89 89 92
+65 61 57 55 57
+65 69 71 75 78 81 81
+72 72 73 80 81 84 82
+31 28 30 34 35 36 39 41
+94 89 83 82 81 80 79
+55 55 52 48 45 45
+64 66 64 61 59 54 50
+7 6 11 14 17 21
+83 79 75 73 72 71 70 70
+37 36 36 33 31 29 28 31
+92 94 93 92 91 86
+71 70 69 68 63
+80 83 82 83 82 79 77
+51 55 57 61 58
+53 50 47 46 42 42
+89 89 90 96 99
+34 33 36 39 40 44 42
+77 73 69 68 66
+10 10 13 14 16 13
+76 77 74 74 69
+91 92 93 95 96 99 99 99
+17 15 11 10 9 6 5
+47 47 44 41 39 40 41
+21 25 28 30 28 35
+52 55 52 48 49
+44 44 42 45 43 39
+36 36 37 41 42 44 46 44
+43 43 40 40 37 40
+19 22 19 15 10
+61 62 59 56 55 51
+31 37 38 41 45 45
+1 5 8 9 10 15
+42 38 40 38 37 30
+60 61 59 57 55
+36 34 36 33 30
+38 40 41 42 40 42 44 43
+58 55 53 52 51 49 46 42
+91 88 91 89 88 89
+53 53 51 50 50
+89 91 92 95 92 99
+18 13 15 13 11 11
+64 65 66 68 69 70
+71 74 77 80 83 84 86
+40 42 45 48 51 52 54 57
+29 31 32 34 37 39 42
+13 14 15 18 19 22 25 27
+20 18 16 13 12
+21 19 16 13 12 10 7
+88 91 94 95 97
+25 22 21 18 15 13
+55 53 51 48 45 42 40 38
+63 62 61 58 55 52 50 48
+61 58 56 55 54 52 49
+59 60 62 65 67 69
+68 69 72 74 76 77
+73 70 68 65 63 61
+88 89 92 95 96
+37 36 34 33 30
+50 51 52 55 56 59 62 63
+67 70 71 73 76 78
+90 92 93 95 96
+41 42 43 45 46
+60 59 56 54 52 50 47
+39 38 36 35 32 31 28 27
+14 17 19 20 21 24 25
+60 58 56 55 53 51
+11 10 7 6 5
+10 11 14 15 17 19
+14 11 8 5 4 3
+64 62 61 58 55 52 51
+17 14 13 12 11 10 7
+72 70 69 68 66 64 61
+74 77 80 82 85 86 88 89
+26 29 32 35 36 38
+62 60 59 57 56 53 50
+26 25 23 22 20 19 16 13
+7 10 13 16 17 20 21
+71 70 69 67 65 62 61
+11 13 14 15 18 21
+22 20 17 14 11 9 6 5
+3 4 6 8 11 12 14 15
+2 4 6 9 12
+81 84 86 88 91 94 97 98
+32 33 36 37 38 41
+78 77 76 74 73
+71 72 74 76 78
+44 45 48 49 51 53 54
+78 75 74 73 70 69 66 64
+75 74 71 69 66 63
+84 82 79 78 75 74 71 69
+62 61 58 56 54 52 51 48
+98 95 92 89 88 87 85
+3 5 7 9 10 12 14
+89 87 85 83 82
+80 79 77 75 73 71 68
+61 62 64 66 69 72 74 76
+51 49 46 44 43 40 39 38
+70 67 64 63 62
+35 34 33 31 29 27 24 23
+42 44 47 50 51 52
+52 55 58 59 62 64 65
+67 69 72 74 77 80
+14 12 11 9 8
+53 51 48 45 43
+57 58 60 63 65 68 70
+30 32 35 36 38 41 43
+99 97 96 94 91 89 88
+68 65 63 61 59 57 56
+92 90 88 86 85
+44 46 47 49 52
+49 52 53 54 56 57 59
+28 27 25 22 21 20 17 16
+48 46 43 41 40
+79 80 82 85 87 88 89
+58 56 54 53 52 51 49 47
+54 57 60 61 62 64 65
+40 39 38 36 35 33
+32 30 29 27 24 23 22
+17 14 11 9 7 5
+91 89 88 87 86 83
+19 16 14 11 9 8
+40 41 42 45 46 49 51 52
+86 84 81 80 77 74 71 68
+42 41 39 37 36 34
+36 33 32 29 26 23 20
+24 21 20 17 16
+12 9 8 5 4
+76 79 82 85 88 91 92
+64 66 69 72 75
+35 37 38 41 44 46 49 51
+94 92 89 87 86 85
+66 68 71 74 76
+81 80 79 77 75 74 72 71
+83 86 89 92 94
+43 40 37 34 31
+36 37 38 41 43
+31 28 25 23 20 18
+45 44 42 41 38 36
+86 85 84 82 80 77 74
+58 57 55 54 53 50 49 47
+70 71 73 75 78
+73 76 79 80 82
+85 83 81 78 75 72
+37 38 39 42 45 48 50
+64 67 68 71 72
+66 63 61 58 56
+61 64 65 67 68 69 72 74
+95 94 91 90 89 87 85 84
+84 87 89 91 94
+63 65 68 71 72 73
+40 39 38 37 35 34 32
+88 87 86 83 82 81 80
+71 70 68 65 63 62
+92 90 88 85 82 81 80
+76 74 71 68 65 64
+9 11 12 14 17
+74 75 77 78 80 82
+30 33 36 38 39 42 44 45
+59 62 63 65 67 69
+83 86 88 91 94 95
+29 28 26 23 21
+70 71 74 77 78 80 82
+70 72 74 75 76
+6 9 12 15 18 21 24 25
+32 31 29 26 23 22
+76 75 74 72 70 68
+93 92 91 90 89
+56 58 59 60 63 64
+72 73 74 76 78 80 83 85
+96 95 92 89 86 84
+98 95 94 93 90
+27 29 31 33 36 37 39 40
+48 47 44 41 39 38 37 36
+20 19 16 14 13
+98 97 96 95 92
+71 72 74 75 78 80
+49 51 53 55 57
+63 60 59 56 53
+78 80 82 83 84
+80 79 77 75 73 71 69 66
+24 25 27 30 33 34 36
+81 82 84 86 89
+35 36 39 42 43 44 46
+14 15 16 18 21 23 25 28
+83 84 86 89 92 93
+82 81 78 76 73
+19 21 24 27 28 30 32
+61 60 58 56 53
+7 8 10 12 14
+69 67 66 64 61 59
+29 28 25 23 21
+44 46 49 52 54 55 57 60
+6 7 9 10 12 14 15
+27 25 22 19 18 17 14
+50 52 54 56 59 60 63 65
+40 39 36 33 32
+10 11 12 14 16
+30 27 26 24 23 21 19 18
+24 22 20 19 18 16 14
+89 91 93 95 97 98 99
+60 57 54 53 51 48 47
+1 3 6 7 8 10 13
+14 13 11 10 8
+57 55 53 51 50
+48 46 45 42 40 39 36 35
+42 43 45 47 50
+92 90 88 86 85 82
+94 91 90 88 87 85 84 82
+45 46 48 50 53
+24 21 20 17 14 11 9 7
+65 64 62 60 59 56 55 53
+54 51 50 48 47 44 43
+49 47 45 42 39 38 37 34
+37 34 32 30 27 26 25
+87 88 91 92 94 97
+86 84 81 79 76 73 71 70
+59 60 63 64 65
+39 42 43 44 46
+14 16 17 18 21 23 24 27
+5 6 7 9 12 14 16 19
+64 65 67 70 73
+90 89 88 85 84 81 78
+83 85 88 90 92 93 96 97
+83 81 79 76 74 73
+68 71 74 77 78 80 83 86
+41 40 38 35 34
+34 31 28 27 24
+87 88 90 92 93 94 96
+52 55 56 57 60 62
+17 20 23 24 25 27
+30 28 27 24 21 18 15 12
+28 27 26 25 22 19
+72 69 68 67 66 64
+59 56 55 54 52 49 47 45
+26 28 31 32 35 36 38
+52 49 46 45 42 41 39
+9 10 11 12 14 15 17
+35 36 37 39 40 42 44 47
+59 58 55 54 53 52
+11 10 9 8 6 4 3
+18 20 22 23 24 27
+10 8 7 6 5 4 3
+68 71 72 74 76 77
+64 63 62 59 56 54 51
+37 36 35 33 31 28
+98 97 96 95 93 92 90 87
+18 19 21 24 27
+23 24 26 29 30 33 36 39
+52 51 49 47 46 45 42 41
+50 48 47 44 43
+40 43 46 49 52 54 55 58
+45 43 40 37 35 33 31 29
+35 33 30 27 24 23 20 18
+82 83 84 86 88
+19 16 13 10 9
+37 34 33 32 29
+86 83 80 77 76
+77 78 79 81 84 87 88 90
+13 15 18 21 22 25 27
+6 7 9 11 13 14 17 18
+51 50 48 47 46 44 41 40
+79 80 82 83 85
+74 72 69 67 65 63 62 59
+58 57 55 53 50
+54 57 60 62 64 65 68
+28 30 32 34 37 38
+10 13 15 18 20 22 24 27
+80 79 77 74 73 71 70
+21 20 18 15 13 11 9
+21 23 26 29 31 33 35
+74 75 76 78 81 83
+61 58 56 55 54 53 51 50
+54 55 56 57 60 62 64 65
+45 43 42 41 38 37 35 34
+47 50 53 56 57 59
+98 95 94 93 92 90
+13 12 9 7 6 4 2
+68 70 73 76 79 80 81 84
+59 62 65 68 69 72 75
+80 82 84 87 89 92 95
+63 65 68 70 71 72 73 76
+92 90 87 86 85 82 80 77
+20 18 15 13 11 9 7
+60 59 58 55 54 51 48 47
+18 16 15 13 11 9
+71 68 65 62 61 59 57
+69 68 65 62 60 57 56
+75 74 73 72 70 67 65 62
+17 20 22 25 28 31
+43 45 46 48 50 51
+28 25 22 21 19 17 15
+36 33 30 29 27 24 22 21
+13 14 15 18 20 23
+84 82 81 78 77 76 75
+23 26 27 30 33
+56 53 50 47 46
+25 27 28 30 31 32 34 37
+90 92 94 95 96 99
+82 83 85 88 90 92 95
+49 46 45 43 42 40
+55 58 61 63 65 68 69 72
+61 62 65 66 68 69
+49 52 54 55 56 58 59 61
+41 43 44 46 49
+74 71 70 68 65 62 61 58
+26 29 30 31 32 35 38 40
+11 12 14 15 18 21
+79 76 74 72 71 68 66
+17 20 23 25 27 30 33 35
+52 53 55 58 60
+6 7 9 11 12
+88 85 84 83 81 79 77
+71 74 76 77 79
+70 72 75 78 79
+54 56 58 59 62
+97 96 94 91 90
+6 9 10 11 14 17 20 22
+23 21 18 15 14
+99 98 96 94 91 88 87
+96 93 92 90 89 88
+91 89 88 85 84 82 80 77
+86 87 88 91 94
+3 4 7 10 11 12
+56 59 61 64 67
+40 41 44 46 48 49 52 53
+35 34 32 31 30 27 24 22
+48 47 44 43 42 40 38 36
+31 29 26 23 20 19 16
+25 27 28 29 30 32
+4 7 10 13 15
+36 39 40 42 43 45 48
+20 23 25 27 28 31 34
+40 42 45 48 49 52 54
+14 12 10 9 7 4 2 1
+76 74 71 68 66 64
+25 27 29 30 31
+34 31 29 28 25 24 22
+63 64 67 70 72 73
+95 93 90 89 87 85
+29 27 25 22 20 18
+28 30 32 33 34 37
+53 52 49 46 43 42
+41 40 38 36 33 31 30
+81 79 77 75 74 73
+97 96 95 94 93 90
+77 79 81 82 83
+67 64 62 59 56 54
+55 54 52 50 48 46 45
+74 73 70 69 67
+90 88 85 82 80
+16 14 13 12 11
+32 31 29 26 24 23
+17 18 21 24 27
+21 18 16 14 11 9 6
+37 39 41 42 45 47
+6 8 9 11 13
+35 34 32 30 28 27 25 23
+80 78 77 75 73 71
+4 5 6 9 12 15
+48 51 52 53 55 56 57
+31 33 34 35 37 38 40 42
+75 77 78 80 83 86 87
+39 40 43 46 49 51
+70 71 72 74 75 77 79
+95 92 89 87 85 84 82
+5 7 10 12 14 17 18 20
+68 67 66 65 62
+61 63 64 66 68 69 70 73
+61 59 57 55 53 51
+38 36 33 32 31 30 29
+83 82 79 76 75 74 72 69
+17 20 22 23 26 28
+81 83 86 87 90 93 94
+85 82 81 79 77
+7 10 11 12 13
+94 93 90 87 84 82
+63 64 66 69 70 71 73
+35 36 37 39 42 45
+48 47 45 44 41
+93 92 91 89 88 86
+47 50 52 54 55
+33 35 38 40 43 46 48 49
+70 73 76 77 80
+96 95 92 91 88 87 84 83
+14 17 20 21 22 23 25 28
+14 15 16 17 18 20 21
+72 71 70 68 65 63 60 59
+57 60 61 64 67 68
+18 17 16 13 10
+49 47 44 42 40 38
+30 32 34 37 38
+70 69 68 65 63 62 61
+37 40 43 44 47 48
+55 54 53 52 50 47 45
+90 88 86 85 83 81 80
+90 88 85 83 80
+38 40 43 45 46
+64 67 70 73 75
+91 93 95 98 99
+18 15 12 9 8 6 4 1
+80 77 75 73 70 67 64 62
+29 26 24 21 19 16 15
+61 63 64 67 69 72
+60 59 57 54 53
+63 61 59 57 56 54 53
+49 50 52 53 54
+57 59 60 63 66
+61 63 64 65 66 67 69 70
+24 21 19 18 16 14
+42 39 36 35 34 33
+95 94 92 91 89 86 83
+72 75 77 78 81 83 86
+4 5 6 8 9 12 14
+20 22 25 28 30 33
+65 68 70 71 73 74
+1 3 4 6 9 11 12 15
+75 77 79 81 83 85
+21 22 25 28 29 31 34
+8 7 4 3 2
+39 37 34 31 28
\ No newline at end of file diff --git a/2024/day02/input_test b/2024/day02/input_test new file mode 100644 index 0000000..2d6faf5 --- /dev/null +++ b/2024/day02/input_test @@ -0,0 +1,6 @@ +7 6 4 2 1
+1 2 7 8 9
+9 7 6 2 1
+1 3 2 4 5
+8 6 4 4 1
+1 3 6 7 9
\ No newline at end of file diff --git a/2024/day02/solve.py b/2024/day02/solve.py new file mode 100644 index 0000000..3ec9967 --- /dev/null +++ b/2024/day02/solve.py @@ -0,0 +1,31 @@ +safe = unsafe = 0
+
+
+def is_safe(report: str) -> bool:
+ last_num = 0
+ increase = True
+ for ii, num in enumerate((int(elem) for elem in report.split())):
+ if ii != 0:
+ if ii == 1:
+ increase = num > last_num
+
+ if (num > last_num) != increase:
+ return False
+
+ diff = abs(num - last_num)
+ if diff < 1 or diff > 3:
+ return False
+
+ last_num = num
+
+ return True
+
+
+with open("input") as f:
+ for report in f.readlines():
+ if is_safe(report):
+ safe += 1
+ else:
+ unsafe += 1
+
+print(f"safe: {safe}\nunsafe: {unsafe}")
diff --git a/2024/day02/solve2.py b/2024/day02/solve2.py new file mode 100644 index 0000000..8e2f8e7 --- /dev/null +++ b/2024/day02/solve2.py @@ -0,0 +1,42 @@ +from typing import Generator
+
+safe = unsafe = 0
+
+
+def is_safe_with_dampening(report: str) -> bool:
+ numbers = [int(elem) for elem in report.split()]
+ for ii in range(len(numbers)):
+ if is_safe((elem for idx, elem in enumerate(numbers) if idx != ii)):
+ return True
+
+ return False
+
+
+def is_safe(numbers: Generator[int, None, None]) -> bool:
+ last_num = 0
+ increase = True
+ for ii, num in enumerate(numbers):
+ if ii != 0:
+ if ii == 1:
+ increase = num > last_num
+
+ if (num > last_num) != increase:
+ return False
+
+ diff = abs(num - last_num)
+ if diff < 1 or diff > 3:
+ return False
+
+ last_num = num
+
+ return True
+
+
+with open("input") as f:
+ for report in f.readlines():
+ if is_safe_with_dampening(report):
+ safe += 1
+ else:
+ unsafe += 1
+
+print(f"safe: {safe}\nunsafe: {unsafe}")
\ No newline at end of file diff --git a/2024/day03/input b/2024/day03/input new file mode 100644 index 0000000..64eaed9 --- /dev/null +++ b/2024/day03/input @@ -0,0 +1,6 @@ +from()$&mul(602,165)why()mul(305,64)?(where()-:mul(80,703);)why()*from()%select()mul(290,957)}/?%'from()]mul(851,335)mul(844,49)what()]![from(667,522)]}how()how()mul(938,695)#/)*?@~?@select()mul(706,392)^mul(242,513)who()@]mul(871,132)( ] from()$mul(41,656)^{(&how()from()[when()-when()mul(628,478)mul(287,621)why():'mul(127,825)# ]mul(360,578)select()?^^select() @:why()mul(136,849);{how()%*@%+how()[mul(544,891)mul(436,21)from()}mul(184,294)+/from(81,871) how()&?]mul(297,492)select()/}%;$$~{*mul(161,703)when():+(,mul(335,695) ()&where()?who();'mul(689,420)^how()from()how()what()>]where()don't()}%mul(78,176)~$where():@,>%mul(62,695)@{#how()mul(742,538)who(){$$who()@{+(mul(282,209)%mul(428,514)/+from()}>@<mul(131,844)mul(431,946)&mul(171,87)+mul(164,733)mul(760,223)/^$*@?[mul(485,824)! *(^-^;mul(465,327)@}when()+~&$?[%don't()$:/!]mul(249,931)mul(963,891)}$%>mul(665,815),mul(762,48)[+/mul(591,445)~?who()#mul(36,3)select()~$ [<}*/do()''>~'$mul(109,905)}how(){!@where()%/mul(380,929)*){~:where()mul(547,552)$:*mul(58,881)where(145,89)[why(634,213)mul(699,443)mul(826,660)what()from()-how()}'from()what()<;mul(700,665)] #(*?how()<+mul(507,719))~*/-^(%mul(941,551)$;don't()#;:when()+#>mul(87,663)who()/how()mul(332,238)~mul(290,235)',why()mul(950,204);where(),(when()mul(233,633)-^}@who()^mul(289,147)$>-'$select(736,261)*~]mul(899,836)'why()do()@when()why()from()mul(975,883);select()who()mul(165,847)why();^/{^mul(31,153)?;'don't()( <!from()from()~'(&mul(352,285)mul(912,583)<mul(192,230)/+~}<!mul(710,930)-how(461,167)][^why()do()*#mul(543,422)^*from()/^#~do()mul(832,873)]#when(455,108)^}who()/]mul(448,716)why()#/&mul(319,598)when()]{/ /'why()mul(865,894): +what()>from()+})what()mul(262,509)!*where()}/-#~/mul(308,953);*!]mul(741,76)[mul(256,536)[)>%-who()<^[$mul(382,338)where()[ when():select()<>mul(993,630)@$mul(411,640)/+where(623,926)/~mul(807,676)+*],mul(579,979who()what()from()when()how()what(),mul(882,434)&who()'mul(154,824)from()#<<,,{where()$mul(259,438)from()}?:;mul(641,967?from())<,>~mul(325,912)%select()mul where()do()where()where();(!,[$why()mul(131,307)mul(323,794)mul(570,548+!$from()!}what(588,195)<select()select()mul(622,782)why()mul(304,116)${(mul(942,260why()[?<$mul(420,225);~,>-from()mul(319,524)!/why()mul(737,137)+^&]/mul(228,919)@mul(672,604)+when(773,127)select()+why(941,245)mul(121!<[?$?;from(987,370):mul(904,487)#^what()from()({?mul(791,791)!,::)@^(mul(517,686)what()*how(),why()&mul(218,978)#,who()&$who()how(205,211)where()[mul(70,357)^$[?^$^what()mul(245,237)where()why()?{/mul$when()+},why()mul(264,30)@*:when(628,215):+&why()[mul(346,794){:}~-,select(),mul(115,926)~mul(140,56)[/:#~don't()@</mul(750,438)}::]!*!mul(64,9)}# ^mul(827,948)where(885,400)&mul(795,610)@mul(302,983)>:mul(889,788);;*!<$[when(),%mul(177,883)[mul(815,344)when()@$+ @)where(935,128)}{mul(638,520)why()-] when()] mul(639,171)!>[mulwho()~^:what()why()] <what() mul(595,754);mul(85,286)%<:mul(945,972)-mul(964,104)mul(163,666)don't()how()select(6,421),what()]mul(94,79)select()~[),-?mul(669,316)what()mul(452,152*~@]~why()how()when()mul(33,805)[how()select()[@]>mul(560,354)from()where()/];,how()} mul(980,896)
+>/;%who()&where(504,464);!do(),where()/mul(901,274)!when()mul(76,577)>select()mul(257,297)^+(/what(52,6)@%from()who()mul(331,276),what()when())+]{:&mul(653,163)''; '~mul(946,195)+/[from()mul(345,866)mul(975,684)#-:/why();-<:&mul(416,406)where(864,494)}{mul(343,101where()~ $/!where(331,467)who()@:mul(484,862)' mul(629,780)&%why(436,493)what()$mul(104,102)$,where()mul(2,157)who()%mul(404,895)mul(154,983)):]]%#:do()]from()+/#)/mul(682,696)what(518,168)select()where()+when(518,618)mul(799,756)+}why()}:mul(565,289);mul(687,685);@%!>?why()&;-mul(819,190)}]mul(596,898)mul(113,184)who();<mul(327,372) -when()+mul(327,170)>{@do()@?)why(),*/select()[mul(351,147):{+}}~^from()why()mul(350,104$''(from()<when();$$+mul(992,327);->$!when()<don't()mul(586,163))why()*<:;%mul(698,938)~mul(812,610)))where()^<^^*,<mul(50,331)]),/'}mul(469,997)^&who(){$[!]^#mul(468,630)@(+,}how()mul(97,867)! >mul(574,321)-mul(325,17);<& who(){]mul(960,765)^from())<<$:how()mul(412,562);mul(220,976)<what()how()!~{what()why()@what()mul(350,479)}when()&#@{<mul(135,697)[%mul(419,107)mul(33,102)&mul(430,537)?select(676,300)>*mul(338,463),$/#',from();select()*mul(982,199)&^:&mul(607,915)who()mul(473,531)$mul(490,191)select()&-~+>when()mul(105where()'/!do()<;[#why()mul(453,793)&*,^who()who()what()-<mul(722,985){what()[why()mul(526,659)![mul(863,260)select() /%&what()mul(81,404)}from(947,811)&mul(471,334)//why()}]why()what()~mul(160,947)'mul(679,16)>@why()from(642,548)%^(from()+don't()?-mul(976,65)what();]mul(155,153))where()who()when()[]mul(44,452)}mul(51,177)~$[mul(462,949)$}^select()#[)]mul(743,555)?[mul(750,557)}#{from()%(why()where()mul(807,786)+})>{)what()}do()mul(231 (how()*mul(667,833)when()~from()why(),who()(;)mul(729,999)mul(805,756)when()}what()who()!**who()]mul(920,392*]when(26,462)mul(558,874)!~?+$$';mul(694,195)when()/$?from()mul(198,978)%>;/why()who()}+why()@mul(248,980)$ how()>'select();mul(888,351)mul(476,169)[>@-mul(282,926)#<mul(301,964)mul(736,489)* when()?^mul(306,875) from()%'%from(){+when()<do()~/{#,>why()mul(637,563)-'~@!how()'^what()$mul(303,12)]how()~mul(922,806)^+when()[?don't(){,when()!*select()select(828,14)who()'why()mul(237,256)#mul(603,548)mul(887,362)!>%/how()[,%]don't()&mul(499,574)select()}%how() mul(787,625)what()who()) '*,mul(197,610)?!~('where()%'select()how()mul(840,759)} {$mul(19,916)}/mul(965[)) *who()how()~from()who()how()mul(319,356),where(196,245) who()mulwhat())^when(211,851)select()do()-$>+}'?from();>mul(349,592)&;>mul(473,196)where()~mul(939,515)$?{;^{}what()mul(417,24){??where(390,662)~from(),mul(93,289) when()] #from()$mul(543,426)&;&*;why()where()mulfrom(){-?'>,;who()mul(65,960):!how()*}*mul(544,316)%what(585,366)how():>mul(453,85)&[-from()/-#<select(992,327)mul+$^]from()<%-mul(612,429)/[select(41,104)} }?mul(493,119)$;why();from()%mul(83,70)]><mul}how()-mul(752,957)/%why()#-{mul(148{mul(756,579)who()^-select()-#]mul>?how(829,900)why(){mul(544,588)mul(178,94)from()where()mul(84,939)+^]who()]select()(&mul(951,416)how()[-] mul(324,907)who(){< )mul-select()![@&mul(578,700)mul>@~]%){mul(543,266)#how()!*why()$@%don't()>$what()mul(451,107)/mul(307,230)+@$when()from()?['mul(822,895)$mul(530,529)+mul(792,795]$from()what(158,547){what()mul(851,381)?when(649,20),*mul(73,793)<] :(:@+;mul(93,749)from()];'mul(419,25);:!who()-mul(102,426)'why()+from();mul(186,663)
+select()$how()]%]{~mul(183,456)::,+;![when()>mul(513,696)mul(835,886) from()##* select()%{mul(820,742)don't()why()mul(295,615)^]what()how()-what()*who()why(931,57)when()mul(688,219)!@mul(191,470)how()>?from()from(764,712):where(){:mul(951,673)!mul(536,960)[>?':]mul(353,508)!*how(977,514){)'mul(135,970)}>%select()select()::where()mul(580,976)'^when()mul(144,491)what()%&]mul(360,420(who()how() :@mul(925,707)mul(723,986){mul(465,348) mul(153,323)#~when();from()@}-;<mul(579,823)select())-?$&{select()?~mul(957,611%?from()what()select()('?mul(87,471)#select()-who()@mul(885,437)>] how()[^ :what()mul(990,144)}mul(567,848)select();@where()'(^@mul(620,639))how(711,187)how()select()+?)+^don't()mul(776who()$mul(592,515)what(),who(),mul(870,763)where():when()^>{}mul(503,440)mul(524,563)why(112,173)how()(,[;mul(235,893)how()*?/]mul(524,355%/],^]*^!%where()mul(464,297)select()from()who()};%what();{mul(289,689)#<mul(159,534)-[<why()%~?$<mul(789,482)-{$select()&{how()mul(220,671))!mul(122,701)mul(747,45)#(mul(249,127)~%'#~-where()how(),mul(83,660)}how()!who(882,504)from()where(){{mulwho()<+when(132,720){(from()how()@,mul(829,58):}[mul+)don't()#$?(@'{%where()how()mul(155,396)how()who()];-mul(454,202)mul(733,864))+]<mul(735,897)/ <;mul(80,402))mul(730,574)([*{who(){*who():what()mul(832,674))select()}+(who()-'mul(427,836)mul(79,877)mul(436,288)what(),:,*from()who()how()(mul(327,609)why()!)% &when()mul(372,811)where(623,779)where()@]when()don't()[{from(){mul(842,562)~who()]mul(814,697)']why()mul^*-where()from()>who()[&[mul(604,447)select()~#<;(~^mul(807,738)[~/from()mul(477,588) ^-]-mul(820,399)@-when()>%mul(580,918)mul(401why()*;],why()]]+!mul(343,445)*<+why()$mul(830~@who(),;from()#mul(776,674)?$who(){+mul(295,290){where()when()mul(321,389)&{'@<mul(338,854)*$do()()why()where()select()#where()what()$mul&'$mul(438,58)+mul(176,945)!$<&;do()when())select()}mul]!*why()where()from(),^^(,mul(765,384)@from()why(111,662) }(mul(496,9)*<#mul(391,60)!:;?!]:from()~mul(494,14)(mul(390,353)}@:why()@]where()&mul(885,604)+%@/?mul(254,601)@&:,mul(100,15)%select(301,302)*mul(71,315)(select()mul(871,371)mul(870,594);*#{>$}who()mul(879,995)*{from()/(;)mul(569,107)mul(223,576)~~>*@when()]]mul(624,981)?{^'$>(mul(812,37)what()-?:>&{+mul(731 < %-who()select()mul(656,82)how()'from()mul(446,744)'<;~why()}^:,]mul(461,437)when(245,888);$[%when(896,829)who()>{mul(791,568),-%$! ?#*mul(134,101),~<-'}how(672,596)?/mul(641,129) :from()#?mul(414 )]-%from(),@)(mul(53,315):@& ,who()where(734,227)^mul(271,699)from()>how():when(595,247)'}%',mul(730,933)from()',]why()+ how()where()mul(231,37)~<+&[$:}!:mulwhen(572,105)}who()mul(374,347)/-<mul(660,713)++when()?;who() mul(885,672)>why()*what()how()#!@}mul(230,754)-what()-</# ]don't()~+-:}+why()how()>:mul(759,756)select() $what()]^select()#how()?mul(567,572)mul(757,309)'[mul(530when()+/(*{mul(736,155)+*where(960,885)%: {:mul(713,672)!$*{#%mul(17,60)&what(966,667)what()why(): select(428,568)*!&mul(228,28)where()where()@/])do()}!/{^?{[why()mul(218,633)mul(156,644)>{~^[?mul(377,886) where()%who(159,149));how(909,452)-mul(869,404)>:mul(920,501){what())+how()mul(545,793)~-mul(74,347)where()!-;how()when()>)%mul(647,960})>;&why()mul(767,582)~^+;who()<)<)mul(494,399/;-from()^don't()why()mul(215,704)%%from()mul(392,808)-who()+where()[{-*/mul(869,412)from()mul(501,148)?'don't()from():}select()mul(796,221)select()mul<)@ ,when()}[:[what(96,456)mul(651,592)when()';$ (*why()mul(134,209);select())[mul(434,869)@{+'$mul(292,419)mul(175,874),from()select()$?[{^mul(866,742)
+how()?}% #who()']#!/usr/bin/perlmul(875,840);]:::mul(127,915)>^>select(736,608)why()+ mul(13,855) ++ how()>mul(568,520)<)'mul(332,245)::where()@&mul(625,889):who()^}+<mul(395,46)})mul(123,827){%,~mul(524,599)%-do()#$mul+;when()%where()/]mul(792,461)who()~#~#>who()mul(392,15)*<where(474,62)[-&^mul(908,825),why()what()who(){who()where(168,259)why()&-mul(254,516)[^:who()>how()mul(437,461)select()<who()mul(60,583)/why()+mul(193,822)&,!(}+mul(373,499)mul(574,712)#?)@how()who()mul(365,781)mul(414,354)*#$-;don't()@+from()#(who()mul(798,611)+>]+how()$(!mul(219,47)^mul(518,535)(select()#mul(776,790)who()^how()~)where()mul(622,336)<when(80,174)who()]select()+)]{;mul(506,377)[%(+do()>why(171,784)>];@who()where()mul(255,591) >when()what()-,)&(mul(827,655):)(*mul(457,68)]what()^[&[mul(758</>'/select()mul(351,283)<{&{*%,mul(345,900)&when()<;[:[(when()<mul(752,407){[(,$-select()~<mul[:,]%>select()^(^@mul(904,504){{from()(&mul mul(537,360)why()/{)what())<!how();mul(443,831):&why(),from()%from(644,149)(mul(665,473)$mul(344,505)why()?from()!&don't()!-)'^#*<mul(115,607)~[from():'what()mul(637,79)/@select()when()&#mul(673,108)&&how()}mul(140,971)#select()/mul(659,539)]from()select()select()*mul(855,794)who()/(;&^&/!>mul(812,420){!mul(320,4)who(275,101)who()}^who()^why(562,771)%;-don't()<}}]mul(943,216):{)mul(17,572)&$why()where()mul(86,371)from()$$ +,>,mul(793,733)^?how()&?{;mul(174,855)(#/ what()select()where()[*mul(706,247)who()~why()/#;*mul(459,541) where()}mul(586?(<mul(738,226)(select(){who()mul(395,492)^select()%what():what(661,644)!^^mul(128,575)>mul(470,802)who(773,148){what()?/why(397,830)),where()from()mul(532,611){[select())}why()when()mul(855,381))@?-/) (do()who()mul(4?*select()$select()where()!!mul(758,795)/*:mul(221,874)mul(587,201)~{<mul(495,109)[#{-]? mul(679,206)]}*%-what()*mul(149,552)!mul(422,434))>?{;/why()mul(757,730)'$-$how();do()why(423,32)}%!*from(930,638)mul(196,228)%mul(753,37)<don't()}[>'mul(970,912)[what();~mul(643,558)(where())how()mul(525,660)when()}$#) +mul(770,997)mul(523,352)/%when()mul(139,306)/(mul(435,619)who()$;)mul(353,463)/how()$who()#what()!where()select()mul(218,409)'$:what()^don't()#when()from() &}>where()?mul(41,95)%mul(93,123)mul(615,917)how()^#mul>!@~how()>mul(801,12)select()what(76,678)from()$#}>mul(206,424)/;~select()what()who()%:/mul(920,696)'^+mul(467,893how()mul(732,924)when()*{mul(212,801)select()}$mul(253,942)from(245,298)$%select():mul(200,773)(what() ,mul(484,816%[@:what()$#mul(392,392)select()/mul(603,982){?'}{%mul(767,605)(*select(839,960)from()%,[-{%mul(810,348)<)}:<mul(346,603)%$what()+?$])!mul(915,360)select()who()<!;; )%mul(199,551)&[!'}]*[select()mul(903,980)when()what()what()mul(64)]^-from(),};]mul(492,955)/^%when():what()mul(941,906)/mul(961,134)/when()why()}/,when()mul(21,216)#'when()>$why()-mul(568,717$/*!*:#<<<mul(904,260)why()~why()when()?[{how()$mul(109,697)]when(505,150)--}-why()mul(59,922)?why()&}from(458,92){]mul(177,574)~mul(700,873),#]%#mulwhy()^ mul(671,271)select()&<:~mul(997,472)((mul(995,279)what()(mul(504,172)mul(620,601)!from()<-'@!mul(70,715)&mul(230,991))what())(++mul(448,128)mul(870,892)('mul(583,189)*<why()$!#+;mul(842,739):when()from()why(),what()<select()mul(241,966)from():from(634,254)##-^>mul(519,560)mul(371,303)#mul(444,873)/#;~! mul(825,442)
+;'?,&@@mul(687,295)mul(992,56)from()@$:when();mul(839{*;~mul(577,183)@-where()}why()~@^from()mul(226,901)how() >%when()?[~mul(281,291)#&>#$how()}mul(500,749)&>^-;why()@!@]do()/@?*,</mul(637,962)why())#@]mul(150,192)%(+mulselect()( /mul(455,843)@({-;how()>]~)mul(530,987)who()why()why()@>mul(282,486)*,-from(),>'what()mul(147,97)- /select()<$do()mul(339,632)<+mul(476,603)#$!mul(249,732)![]mul(552,713)}%^:[~who(294,666)!mul(335,971)>#mul(190(how();who():)mul(364,772)[~,when()*mul(350,52;who(640,301)from()-$,%:};mul(407,507))&#why()/{&[mul(668,42),~mul(849,891)what()*-:/who()$mul(335,214)?:why(); ,%mul;}mul(561,325){mul/+?when()<mul(732,879)#+where(){mul(372,617)what()#/mul(307<who()<]where()when()$mul(302,561)where()-mul(165,848):';why()why(){&mul(800,615)how()where()$from()!mul(617,736)select()-~-<!why()$where();mul(505,440)<!;%mul(36,639)!)what() [[}<,mul(100,765)when()(mul(418,224)select();do()-/*!^mul(480,518)>select()#do()!{!)/!mul(398,351)'$]how()%?:)from(716,264)}mul(976,539)when()}/mul(800,619)who())[?mul#+who()}mul(527,856)mul(479,693)[<mul(728,432)*mul(713,727)# }( where()mul(80,482)what()%,~)-'+/'mul(765,963)[mul&-how()mul(887,370)-{/$'-'where()who()what(295,542)mul(107,111)mulwhere()!where() how()/$mul(461,345)!from()mul(707,778);>what()#}{where()where()mul(310,5)$]>mul(687,149))!how(),why()how(941,130)where()when()what()mul(187,693)(mul(24,418){':}mul(304,601)when()mul(66,524)how()']select()from()>what()mul(217,884)~~<where() ^[mul(304,545)/why(){)[-,what()mul(782,464)why()*when(),}}mul(767,112)*mul(620,773)mul(89,154);]how()<::when()where() mul(430,945)*))mul(143,829)from(192,329)#!{who()($-mul(825,949)do()<%where()![mul(467,327)[&mul(727,778)!*(?@~mul(12,864)from()(; what()where()do()mul(975,968)how()mul(572,737):why()[when()mul(6,295)what()(where()$why()){mul(899,746)-where()mul(28,836)!what()!*,mul(362,377)who(),mul(449,514):?/@%{mul(593,723)^who()(!;[;mul<who()}what()$?from() %:]mul(409,707)<why()why()-;mul(847,518)][select(733,913)@-@why()who()when()mul(159,434)~^^#mul(973,188)-( [,#(%why();mul(970,535)~-,;{mul(776,519)select()'(how()+(mul(341,437)+ >-when())?@/mul(62,572)))when(482,658){select(561,928)when()!({mul(388,507)from()/+mul(64,284)who()why(899,74)when()why()mul(734,117)<-+}#:what()mul(567:where()select()mul(694,323)/[select()mul(772,515)[/'>why()when()/(*@mul(663,798)$when()select()$%#<,select()mul(810,58):~,(+select()[from()~'mul(838,509)mul(227,633)] mul(300,309)]>,!}'mul(369,74)$~({ ~'}{]don't()~)&<[>who()>mul(76,891)!]~ }:)${/mul(226,65)~/&<)^mul(981,600)[who(271,199)~-$&;[where(691,309)mul(69,207)*>select()*(+mul(935,119)<> ?;->mul(116,703)'where()-;;from()mul(324,982from()what()@<^mul(144,872)@+mul(569,48)mul(475,850)*how()'~^-mul(486,714)~![why()why()}<<mul(436,514)mul(574,28)when()'!how()@'what()select()mul(181,123))>/select()how()mul(789,342)?select()]!why()#mul(485,483)'%why();?%who()mul(921,916)do()'*]where()how(977,165)@mul(441,964)*-who()]&mul(395,170)> }mul(583,793)<*-how(){{mul(794,26)<how()&mul(670,885)/? -~<+]mul(32,656)(why()/>%~/;mul(297,812)mul(264,703)[select(253,420)select()mul(665)*when()*/>when()from()/where()!mul(264,312)where(756,949),+{}from()+;mul(454,375),do(){mul(72,780)(who() mul(4,67)
+<mul(299,165) -mul(606,634)&select() /@who()<when()^mul(773,105)when(140,544)mul(565,610)>/why()[*>when())from()mul(163,222)who();select()@?select()mul(631,370)where()^%mul(48,604)%where()select()]%:!{mul(492,16):?select(566,72)'@+when()})mul(277,631)when()when()+%#mul(356,136)mul^who() from()!from()~[don't()?:#!mul(536,636){how()why(167,58){from()$;&mul(170,241)-~$mulwho(),mul(295,979)^when()$}mul(872,817)'^+ %%%@%;mul(796,401){@$from():%(@who()where()do()how();,>where()*how()mul(562,34)mul(851,857)([how()mul(870)do()^#]what()mul(855,774)>from()mul(19,63)<mul(20,808)what()when()}mul(9,565)')#where(){;/mul(485,358){?~#),{when()mul(760,344)where()~#what()from()}}{*'mul(76,561) }why();;what()select()where()#?mul(202,590)#{do();mul(537,456)#^'mul(231,127)when()(%],(}[-^mul(928!how()<when()+(mul(278,743)where()$mul(138#{{mul(612,612){select()@what(186,303),mul(577,261)/{*why()mul(739,172)$@-*;~mul(217,239)(-~;%who()why(681,472)where()who()mul(2%mul(30,720)'what()(~~mul(414,37)/when()%*}}%why()^mul(293,928)%,$#when()/^'don't()&from()mul(662,652why()when()mul(134,920)what()*?!;!how()@from()do()*!~~mul(472,62)])mul:*?@<$when()mul(403,2)mul(682,860):,when(198,260)?:[}[,&mul(940,144<+]*#:mul(274,552)*select()#}<mul(721,529),:who()mul(938,454)[where()mul(816,770)$#^*what()select()'~{select()mul(201,567where(223,485)^]from(721,470)why()>)from()/'#mul(502,592)$(mul(330,265)-*'why()/<@mul(919,336)'when()when()(~ mul(222,37)mul}*?mul(716,440);how(254,405)#mul(938,798)]why()+mul(370,761);+select())mul(308,872):!who()%mul(376,736)when()[don't()$;#~,how():select()~what()mul(793,522)){?who()/mul(812,372)<;@mul(627,289)[!don't()^+)how()$from()##mul(500,501)#{why(120,25)mul(571,651):&{?mul(792,25))@$(@>don't()who()?^')' from()[mul(323,38)when()where()*/who()%mul(623,356)?mul(629,625))}+how()mul(950,826)(+,#mul(947,453)why();'how()&]from()mul(510,94)-?[from(){mul(34,148){when()mul(661,839)do()/}who()mul(597,740)^;mul(6,887)~#how(287,928) $>?}:don't()/-%(,;/))mul(910,743)!:%,%}/mul(626,661)((&([mul(320,446){what()'~<-@mul(573,309)^:?why(352,585)how(328,377)(@mul(996,815),~don't()mul(558,873), what()?>]^$mul(647,533);$@]!when();;when()mul(508,819)&select()( select()mul(823,518)/<when():when()~why(744,571){mul(405,772):;where();(mul(132,162)] !how(74,640):select()/mul(721,482)$why(),*{mul(925,155)*!!<-!}don't(){)+#^mul(990,837)?,mul(867,142)mul(764,232)mul(754,292)$#,select()>-how(),]mul(584,720)mul(127,993)''why()'/![where()mul(130,642)*what()<?where()mul(325,585)select()when()>when()mul(648,223)#}])don't() !when(647,635)+&$ mul(154,204)@~~?mul(90,691)when()]^&from()'[mul(236,768)~where())^~->(&mul(378,233)<?mul(366,515)how()},don't()*what()what()~/select()mul(507,554)<+<mul(145,19)mul(444,536)%!%mul(861,889)#where()}-:{:^ mul(790,870)!from()why(343,804){*-how()from()mul(989,194)<!!when(586,215)where(238,474)}mul(430,90){+who(308,211),mul(365,640)mul(684,600)$^:}from()'&mul(745,81)how()select()who(897,36)]$+?&^don't()what()who(){from()}('$mul(782,153)mul(270,449)#*mul(371,710)]&what()*!{?mul(487,920)(mul(474,993)@%mul(70,96)what()?<@~*mul(639,92)<?%-(mul(154,267));mul(588,135)*$*: [where()mul(2,108)who()/~(why()~/,^mul(364,558)who()#'do()[select()(: when()mul(324,801)where())'#,mul(696,843)*,[mul(946,677)}[how(532,32)[when()'-where(){mul(254,222){select()
diff --git a/2024/day03/input_test b/2024/day03/input_test new file mode 100644 index 0000000..2e1a90a --- /dev/null +++ b/2024/day03/input_test @@ -0,0 +1 @@ +xmul(2,4)%&mul[3,7]!@^do_not_mul(5,5)+mul(32,64]then(mul(11,8)mul(8,5))
\ No newline at end of file diff --git a/2024/day03/input_test2 b/2024/day03/input_test2 new file mode 100644 index 0000000..b774ec9 --- /dev/null +++ b/2024/day03/input_test2 @@ -0,0 +1 @@ +xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))
\ No newline at end of file diff --git a/2024/day03/solve.py b/2024/day03/solve.py new file mode 100644 index 0000000..a651ff3 --- /dev/null +++ b/2024/day03/solve.py @@ -0,0 +1,12 @@ +import re
+
+pattern = re.compile('mul\\(([0-9]{1,3}),([0-9]{1,3})\\)')
+
+with open("input") as f:
+ data = f.read()
+
+result = 0
+for match in pattern.findall(data):
+ result += int(match[0]) * int(match[1])
+
+print(result)
diff --git a/2024/day03/solve2.py b/2024/day03/solve2.py new file mode 100644 index 0000000..3564eca --- /dev/null +++ b/2024/day03/solve2.py @@ -0,0 +1,38 @@ +import re
+
+pattern = re.compile('mul\\(([0-9]{1,3}),([0-9]{1,3})\\)')
+do_pattern = re.compile('do\\(\\)')
+dont_pattern = re.compile("don't\\(\\)")
+
+with open("input") as f:
+ data = f.read()
+
+do_dont_intervals = []
+
+for match in do_pattern.finditer(data):
+ do_dont_intervals.append((match.start(), True))
+
+for match in dont_pattern.finditer(data):
+ do_dont_intervals.append((match.start(), False))
+
+do_dont_intervals.sort(key=lambda elem: elem[0])
+
+
+def get_do_state(intervals: list[tuple[int, bool]], pos: int):
+ current_state = True
+ for elem in intervals:
+ if elem[0] > pos:
+ break
+ else:
+ current_state = elem[1]
+
+ return current_state
+
+
+result = 0
+for match in pattern.finditer(data):
+ if get_do_state(do_dont_intervals, match.start()):
+ result += int(match.group(1)) * int(match.group(2))
+
+
+print(result)
diff --git a/2024/day04/input b/2024/day04/input new file mode 100644 index 0000000..ea53c2c --- /dev/null +++ b/2024/day04/input @@ -0,0 +1,140 @@ +MMSSMSMXAMXMSSSSMMXSSMSAMASASXXAAXMAXXAMXAXSXMAMXMMMMSSMXMAAAMXMMMXXAMMAMSAMXXAMMMAAMMMSMMMMMXXSAMXMASXMXSMSXMXMMMSMSAMXSSMMXMMASMSMSMMMAMMS +AASAAAXMSMMAMAXAASMMAAMASXMMSASMSSXASAMXXAXMASAXXMMMAAAXMAMXMSAMSMSSMSMAMMMMSMAMASMMSXMAXXAASXAXAMXMASAMMSAMXMXMAAAXMASXMAMSAXXMSAAAAAASASXS +MXSMMMMAAMAAMXMSMMASMMMAMAAAMAMAAMMAXAMXSSXSAMSMSAMMMSSSMSXMAMAMXMAAXXMMSMAAASAMXSXASMSMSXSMSAMSXMAXASAMAMAMXMASMSXXSAMMSSMSAMSASMMSMSMSASAS +MMMASXSSMXSASXAXASMMAXMMSSMMMXMMMMSSSMSMMAAXXMAXXAMXMMXAAXAXASXMAMSXMSAMXMMSXSXSXMMXMAMXMAMMXAMAMMSMASMMASXMSSXSAMAAMAMMAMXMAAMAMMXXXXXMAMAX +SASXMAAXXMMAMXMMAMXSXMMMXASMMMMXSAAAAAAXMMMMMMXXMAMXMMSMMMSMXAXXXMAASAMXASXMAXXAMXASMSMAMXMASMMXSAAMXMASASAMAMAMAMMXAAMMAMXMMMMMXSAMASMMXMXM +SXSAMXMXMSMAMAMSAMXMXXAASAMXXASAMMSMMXMSMAMAMMASXSSMAAAAAAXMMMMXSMMMSAMMMMAMAMSMSMMSAMMMSSMAMXAXMMMSMSXMASXMASAMAXXAXAXSASAXAXXAAXAMAMAMAMAA +SASXSASAAASMSMMAAMXMSXMMXASXSSMXXAMXSMMXMASMXMXSAAMMMXXSMSXSAASMMSMASAMAAXMMAXXXAAXMXMASAAMAXMMSAMMAAXAMXMMSAXXXSXSAMSMSASXSASMMSSXMASAMAXXX +MAMXSASMSMSMAXMSSMXXMASMSXMASXMSMXSAXAAMMXSXXSMMMMMSMSAMXMASMXMAAXXAMAMSMSXSMSMSSSMSMSXSSSMXSASMASMSMSSMXMAMMSXMXAMXXMASMMAMAXXXAMXXXSXSSSSS +MAMMMAMXAXXMAXXAMXMASAMAASMSMAXXAAMMMMMSMAMXAMAXMMAAAMAMAMAMMSSMMMMSMSMAMSAMAAAXAMXAASAMAXXMAXXMAMXAMAAAMAXXMAXAMXMASMAMMMAMMMSMMSSSXXAXXAAA +SASXMAMSASAMXSMMXSMAMAMXMAXMSAMMMMMSASAMMAMSASXMSSMMMMAMXMSXAXXMASMXAMSSSMAMXMSMSMSMSMAMAMXAXMXMMSSMMSXMASXSSSMXSXXXXMAMXXAXAMXASAAMAMSMMMMM +SXXMMSMMASMMAMASAAMXXMMMXMAMAMXXMAASAXAXMAXAAAAAAAASMSSXSXXMSSMSXSAMMMAXAMXMSAMXAAXMMMAMMSMSASXSXAMXAAMSXXAMAAXAMMMMSSSSMSMSSXSMMMSMAAAXMASX +XMSSXMAMAMAXASAMSSMSXXSAAMXXAXXSXMMMASXMMSSMMMMMSSMMAXMASXMAMAAAXMAMXMASXMAMAMXXMSMAASASXAXMAXXMMMMMMXMXAMAMSMMXSAMAXAAXAAMMMASMXXMXXSSSMASM +MMAMASAMXSXMMMMXXXAMAASMXMMMMAMSAMXMMXMAXAMXXXXXMXAMXMMAMAMMMMAMSXASASASMSSSMMXSAXXSMSMMXSSMSSXSAXAASXMMXXAMMAMXAXSMMMMMMMSAMAMXMASXXMXAMASM +AMASMMMXMXAAXAXXAMAMMMXAXXAAAAASXMASAAMXMMMAMSASMSXMXXMASXMMSMMAMXAMAMAMAMXAAAMMAMAXAMAAAMXMXMAMSMXMSASAASMMMXMAMAXMSAMMSMSASMXXASAMXSXMMASX +MSASAASXSSSMMSSSXXAXMXMMXSSSSSXXMAMAMSMSMXMAXXAAAAXAMXSAMASAAAMSMSMMSMSMSSXSMXSMSMMMMMMMSSMSAMXMMSMAXAMMXMSASASMSMSXXAXSAASAMXSMXMAAMSAMMXSM +MMMSMMSAAMXMXMAMAXSMMXXSAMXAAXXMASXMAMAXMAMMMXSMSMXSAMMXSAMSMSMAAAXSXAXAXMAXSXMAMXXAAAXMXAMSMSMSAAMMMSMXMASMMASAAASASXMSMXMXMAXMAXAMXMAMAMMM +XMAMXAMMMMAMXMAMSMXASMSAMSSMMMAXAMXXAMSMSSSSSMAAXMAXXAAAMMMMXAMMSMSMMMMSMMSMAMMAMMSSSSSXSSMXMXAMMMXAXAAMMAMXMAMMMXMAAAXXMSMXMXSXAMSMSSMMMSAA +MMASMXSMMSASMSAMAAXAMXMAMAAAXSMMSSXMXXAAAAAAXAMSMMMSSMMMMXAXSMMMMMMXAMAXAMMAAAMASXXMAAMAMXMXMMSSXMSSSMXSMXSAMXSSMMSMSXMSMAMAMXXMMMXAXAXSASMS +XSASMSAMXSXAASMSMSMSMSSMMSSMMAAAMMXMSSMSMMMMMSXMASAAAXSSSMMXSAASMMSSXSASAMASMMSASMSMMXMASAMASMASXXAMAXXMAXSASXMMAMXAXXMASMSASASASXSSSMMMASAX +XMSSMAAXMSXMAMXAAAAXAMMSAXAMSSMMXMAXMAXXXMXAMXXSAMMSXMASMAMAXMMMAAAAXMXSXMAMMXMAXAXXMASASASASMAMMMMSAMXMXMSAMMASXMMMMAMAMXSMSAXSAAAAXXAAAMAS +ASAMXMXMAXAXMAXMSMSMXMAMXSAXAAXAASMSSSMMMAASMMMMMSXMAXXXSAMSSMXXXMMMMSMMXMMXSAMXMSMSAMMASXXASMASAAAMASXXMAMAMSMMMXMASXMAMMXAMAMMMMMMMXMAXXXA +MMMSXXAXMMAMXSMAAAAMAMXMASAMXMMSMSAAXAAXMAAAAAAAAXXMSMSMSXXAAXSSSMSXAXAMMSMAMAXXSXAMSSMAMXMAMXXXMXMSXMMMAMMSMSAMXMXXXMSSSMMMMAXAMXMASXSSMSXM +XSXAMMSMSAMSAMMXMMAXAXMSAMXAXXXAXMMMXSAMXSXXXMMMMMSAMAAAXMMSSMMAAAAMSXSAASMMSSMMAMSMAMMMSAMASXMSSSXMMAXAXSAXSXMXAAMMAXAAAXAXMXSMMAMXMXMAAASX +SAMXSAMAMAMSAXAXSSMXMMAMASMSSMSMXMAAAMAMAMASMSMSAAMAMSMMMAAMAXMAMMMSMMMMMMAAAAMSAMAMAMAAXMSASAAAAXAXXXMXXMAMAMXSASAMMMMSMSMMSAXMSMMAAAXMMMAX +SSMAMASMMAMMMMSMMASAAMSMXMXAAAAAAMMMMSAMSXMXAAAMMMMAMAAMSMMSAMMSXXXMXAASXSMMSXMMASAMMSMMSMMAMMMMSMMMSXSXMMSMMXMAXMMXMAXAAMAAMAMXAASMSMSXXXMM +XAMXXAXAMXXXSAXMSAMMXMXAAMMSMSXSMSSXMSMMXAMMMMMMMSSSSMSMAAMMMXXXXSMSSSMSAAXXXMSSMMAMMAMMAXSSSXMAMAXXAAMAMAAAXXMAXMMMXSSMSMMMSAXMAXXAAXAMXSXS +SSMSMSSMMSMMMAXAMXMSMXSSXSAXMXMAXAXAMXMASAMXXAXMXAXMAXAXSXMAMMMSMMAAMXAMMMMMAMAAAMMMSAXSAMXMAAMAXXMXMMSAMSSMMMSAMMAMXMAMXXSASXASMMMSMMXMASAS +MAAAAXAAAAASMSMSMAASXAXXAMMSMXASMSSMMMMMSAMXSMSMMMSASXXXMASXXAAXAMMMMMSMAXAAAMSSMMMAMXMMMSMSSMMSSMXMXXMAMAAXSAMASXSSXSAMMAMASAMXAXXMASXXAMAM +SMMMSSSMSSSMAXAAXSXSMMMSAMAAAXSXAXXXAMAMMMAAMXAXSXSAMXMMMMAASMXMAMXSAAASXSSSXMMMAAMSSSMXXAAMAXXMAXXASAMMMMSASMMXMAAAXSAMXAMXMMXSXMXSMMMMSMAM +XAAXXAAAAMAMXMSMXXMXAXXMASMXSMMMMMSMMMAMAMMSMMSXMXMAXXAAAAAMAAMSSMASMMMSXAAMXMMMMXSAAAASMMSSSMMSAMMMSAMXSSMASAMSMXMMMSAMSMSMXMASMMASAAXAAMAX +SSMSMMMMMMAMXAMMAMMMSAMSXMMXAAXMAAAASXMXMSAAMSMASXSMXMASXSSSMMXAAMXSASXXMMXMAMAAXMAMMMMMAXMMXAXMAMSASAMAMXMSMXMAAXAXAMAMXMAAAMXSAMASXMMSMSSM +XXMAXASXXSASMSSMMMSAAMAXMASXSMMSMXMSMASAAMMMXAXXMXAAAAMMAMAXXMMSSXAMMAXMAXSSMSSXSAAXXXXSXMMASMMAMXMASMMMSAMXAASAMXMMMMMMXSXSMSXSMMXSAXMXMAMA +MMSAMMSAAXAMAMXAAAMASXSXMXMMXMASAXSAXAMMSMAMXASMMSXSMSAMAMMMMMMXMMMMXMAXXSAMXMAAAMASMMXMMMMXMSXXXMMMMXAAXMSMSMSAXXXXMASMMSXXXXXMXSMMMXSSMASX +XMAMXSMXMSSMMMSAMXSSMMMAMMXXAAMMAMSAMXSXAMASMMMAAMMMXMMSXSAMAAAAMASXMXSXMAMMASMAMXSAMXAAAXXAXAXMASAAXSMSMMAAAAMMMSMMSASAASAXASXMASAMXMMXMASA +XSAXXMASXMAAXMAMMAMMAASAMASXSSSMSMMXMASXMMASASMMAMXSAMXMASAMSSSMSAMAXAMAMXMSAXAXXMXMAXSSMSSMSMAMXMASMXXAAMMSMSMAAXXAMSSMMMMMXAAMASAMMASAMAMM +XSAMMMXMASXMMASAMSSSSMSASMSAAAAAMXSAMMMMXMMXAMASAMXMAMAMMMSMXAXXMASMMXMAMAMMMSSMMMMMSMMXMXMMAXMASMXMMMMSSMXXAXMMMSMXMMMXMAAAAMSMASAMASAXSAAX +ASMXMASXXMMMSAMMMAAAXASAMXMAMXMXMASXXAAXMSSMAMXXSXXMASAXXAMMMMMAMAAXSMSMMMSAXXXSXAAAAXXXMASMMMSMMSAAAXXAAMSMAXAXAAMSMXMASMSSMXAMXSAMMXAMMMSM +MXMASMSAMXMAMXSXMMSMXMSMSAMMXMXAMXMASXSSMAXSAMSAMXMSASMSMXSAXMAXXMMAMAAMAAMASXAXSSMMSMXXMASAXAMAASMSMSMXSXAMMMMMMSAAMASMSMAAMXMMASAMXMXSXAAA +XMSMSAMXMAMASMMMAMXXAAMASAMXAAXAAXMXMMAAMAMSXSMXMAXMASXAAXSXSASMSMSAMSMSMXSAMMXMAXMXAMAAMXSASMSMMSAAXAAAMMXAAMXMAXMMSASMXMSSMMXMMMAMMMAMMMMS +MXAAMXMAXXSASAAMMMXSMSXAMAMSASMMMXMMASXSMSXXMSAMXMSMXMXMSMSAMAMAAAXAXAMXMXMAXMMXSAMSAMAXXAMAMMAAMMXMSMSMSASMMSXMASAXMXSXXXAAAMXSMSSMAMASXAMX +ASMMXMXSMAAMSMMXAMAXAXMMMSMMAMMASAASAMAXAMXSAMXSAAXXAMAXMAMXMAMSMSMXXSAMXAXMASAAXAMSAMXAMXMAMSSMMAMXMXMAAMSAAXAMASAMMXSAMMXSMMAXMAAMXXAMMMSA +MXSMAMAXMSMMXMASXSXMAXAAAMAMSXSASXXMAMAMXMASXSASMSMSSSSSMMMAXXMAAAAMSMSMSMXSASMMMSMXMMSXMMMAXMAMSMSASAMXMXSMMSXMAXMMXASMAMXMMMMSMSSMSMSXSAAX +XAXMMMSSXAXXAMASAAMMSSSMXXAMAAMMSMXSAMAMAXXMAMAMSAMXAAASXASMSMXMSMSMAAAXAAAMAXAAAXXMSAMAMAMMSSSMAAXXSMSXXXXXMXMMMSMSMASXSSMMASMXXAMMAAMAMASX +SSSMXAMXXSSSMMAMMMMAMAAXXMSMMXMAXMAXMSMSMSSMAMMMSMSMMMMMSXSAAAMXMAXMMMMMXMSMSSSMSSMXMASMSMSAAAXMMSMASAMXXMASMMMAAAMMAXMAAMXMAMXXMASXMSMMMAMA +AAAXMSSMXXAMAAAXXXMXSSXMAMMAXSMSSMSSXAAAAAMMXMXMXMXMXXXAMSSMMSAMXAMXSMSMSMXAAAAAXXAXSAMMAASMMSMXAAMMSAMXAMXAAASXSMSXXAMMMAASXMSXSASXMAMXMAMX +MMMMAMAMSMAMSSSSSMMAMMAXMASMMSAAAAAXXMSMMSSXSAMSAMASXSMAXAXAMXMXXSXMASAAXSMMMXMMMASXMAXMMAMAAMAMXXXASXMSSSMSSMSXMXMASXXSMMMSAASASASMSASASMSM +XAXXMXAMAAMMAXMAXAMAMSXMSMSMAMMMMMMMAMXASAAAMXMMAMAXAMXSMMSSMSMXXMASMMMXMAMMXMSASXMMXAXSSSSMMSXMXSMMXAXAAAMMXMSASAXXAASXXXAMMMMAMAMXXAMXXMAA +XASASXSSXSMMXSMSXSMSXMAXXXMMSMSXMSXMSSMMSMMMMASMMSSMAMAXAAXAAAAXSSMMXSAAXAMSAMSAAXXXXXXXAAXMXXASASASXMMMSMMSAMMAMXMMSMMMMMMAMXMAMXMXMSMSSSMM +ASMMXAASAMXXAXAMAXXMASXSXSMAMXXASAXMAAAASXMASMXAAAXMAMASMMSMSMXMAAAXMMSXMAXXAXMAMMASMSMMMMMSSMMMAXAMAXXXAMXSAMMSMSXAASAXXASAMMMMMASMMAASASMX +MXAMMSMMXMAXAMXMAMXMAMAXAXMASXSMMMMMSSMMSASASXSMMMSSMSXSAMXAXMAXSMMMAMAMXMMMSMXAXAMAAAMAMXXXAASMSMSMMMSAMXMSXMXXAMMSMSSXXASXXAAASXXASMSMAMXX +XXAMXAAXXASMSMXMMSASXMMMSMSASAAXMXAAXAAMXXMXSAXXAAMAMMAMAMMSMSXMAAAXSMMMXSAAXMSSXSSMSMSSMMSMSMMAAAXSAMXMASXMSMAMAMAMXXAXMXMXSSSXMMXXMMMMXMMS +MSMMSMSAAAXAXMXSAMXSAAXAAMXMMXMXXXMSSMMMMSAAMXMSXXSAMSASAMXMAAMSSMMSMASAAMMMSAXMAMXAAASAAAXAXXMMMSMXXMAMXSMMAMMSAMXSSMMXMAAAMXMAXSSMAXMXMASA +XASMAMXMMAMAMSXMMSMSMMMSSSMSAAMMSXXXAXAASMSSMSMXMXMXMSASMSAMMMMXAMXXXAMMXSXXMXMMMMMMMSSXMSSMMMMAXXMAMMSMXXASMSAMXSMAXASXSMSMSAMAMAASXMSMSMAM +XAASMSAXMAAMXSMSXXXMAMXMAAAMMSAAAMMSMMXSAAAMMAXAAMXSXMXMAMXSAMXMXMSAMXSSMMMMAMXAMAXASAXAXAXXAXXSSMSSXAAMMSMMMMAMAMMASMMAXAAXSXXAXMXSXAAAXAMX +MSMXXSAXSAMMAXAAXMMSAMXMXMMMXMMMMXAAXAXXMMMSSMSMXSAMXMAMSMMSASMMAMXMMMAXAAMMMASMMMMXXASXMASMMSMMAAAMMSMSAAMAASAMASMXSMMMMSMMMMSMSXAXMSMXMSXM +XMXSMMSAMSAMXMSMXSAAXSAMSSXAAXAAAMSMMXSXMAAXAXAAAMAMAXAXAAMSXMMMASASAMXXXXXASMSAASXSMXMASAXXAAAMMSMSAXXXMMXSXXMSXXMAMXAXAXXAXAASAMXMMXSXXMAX +SMAMAAMXAXXMAAAXMMAXMXAXAXAMMSMMXMAASASASMSSSMMMMSSSMSSSSSMMAMXXASASASMSSXSMSAMMAMAAMXSAMXSMSSSMXXXMASMSASAMXSMMXMXAXSXSSSSSSSMSXSMMSAMXMMAM +AMAMMXSMXMASXSSSMSAMSSSMMMMAMAMAMXSAMASAMXMXXAAMMAMXAAAXMXASXMXXMMXMXMAMAASXMXMASMSMMXMXSAXXXAAXXXAMXMAAMMAMAAAAAXMAMMXMAXAXMAMXMXAAMAXSAMXA +MSMSAAXAAMMMMXAAAMXXXAAMXXMASXXXSMMMMMMAMXSAMXSSMSSSMMSMMSXMXAXSSSSSMMMMMMMAXAXMMMAAMXMMMMMSMSMMSSMMSMMMSMSMSMMSXSAMAMXMXMXMSAMAAMMMSAMXSASX +XAXAMMSSMMSAMXMMMMSSMXMMAMMASMSSMMMSAXSXMAMAMAXXMXMASXAAMSAMMSMAAMAAMAASXSSSMSAMXXSXMAMMAAAXXAAAAMAAAAAXMAMAAXXAMXMXMAXMAMAAMASASXAAMXSAXMAX +SXSMSAAAMASASXAXXMXAAXSMMSAMXAXAAAXMAMSMMMSAMSSSXSXMASMSMSAMAXMSMMSMMAXSAAAXSMXMAMAASXMASMSSSSMMMSAMXSMSMAMSSSMXSAAASMMXASXSSXMAXXMSSXSAMXMX +SMXAMMSSMMSAMXMMSASMMMXAASXSSSSMMMSMSAMXXXAMXAAXASMXAMMMXMAMASMMMAXMAMXMAMSMSMMSSSMMSAMAMAMXAXXSXMASMMMMMXXMAMAMSXSXMAXSASAAXAXASMXAXXMXMMXX +SAMSMXMAMAMMMSXAXXXAASMMMSAAAXXAAAXMMAAXMASXMSMMXMAMXMAXMMMMMMAAMXMXSAMXSXMAMMAAAAAXSMMMXAMMMMASASAMAASXMXXMMMMXMMMXMAMMXMMMMSMAXMAMAMAAMXSM +XAMAAAXMMXXMASMSMSMSMSAXAMXMMSSSMSSXSXMXAAMXAAMAXMXMMSXMAASAMXSMSSMMMAMAMAMMMMMSSSMMXAAMXMMAMSASAMASXMMAMMMMXXXAAAAAMAMMAMXXAXMMMSAMAAXMXAAA +AXSXXMSSSSXMXSXMASAAASAMXSAXXXAAAXAXXASMSMSMSMSXXMASXAAMSMSASMXAAXAAXAMMSAMAAXAMXAMMSMMSAMMXMMAXMSAMXSSMMAXMAMSSSMSXSAXSASAMXSASASASXSAAASXM +MXMASMXAAMMMAMAMAMXMMMXMAXMXMMXMSSMASMMAAAMMMMAMMMMSMMXMAAXAMXMMMSMMSSMXSXSSXSASXMMAMXASASXMXMAMASASAMAASMMMMMAMXXAASXMSASXSXSXMASXMAMMMMXAS +XXSAAAMMMMAMAXAMMSMSMSAMSXSASAMXMAAAXAMXMMMAAXAXAASXMAAXMSMSMAAXAMAMXXXXMXMAMMMAMXMAMSMSXMASAMAAMSAMMSSMMSAASMMMSMMMMXXMXMAMAMXMAMMMXMSASMMM +XXMASXSSXSXSSSSSXXAAAMXSAASASXAASXMMSSMASASXMMXSMMMAMSMXAAXAXMMMMSSMMMSAMXAMXSSMAMSSMSAMMSMSASMSXMXMAXASAXMAMASAMASAMXSMMMXMMMAMMMSXMAMASMXA +SMSMMAMXAAMAAAAXAMSMMMMMMXMAMMSXSXSAXXMASASAMSXMMSXXMASMSMSMMSAMMAXAAASAMXAMAXAXSMAMMMMMAAXXAMXXMASMMSAMMSXMMAMXSASMSAAXXASXSSXSAASAMAMSMMSS +AMAAMXMMXMSXMMAMMMXASXMASAMAMMMMXXMASMSMMMMXMAASASMSMAMMAAXXASASXASXMMSAASAMXSSMMMMXAAAMMSSMSMMMXSAAXMMMXMXSMXSMMMSAMXSMMASAAXASMSMXMAMXAAAM +MSSSMAMSMXSXSMXMAAXSAASMSAMAMASAMXSMSAAAASAMXSXMASAXMASMSMXMMSMMMMMMSMXAAMAXXAAASAMMSXSSMXMXXAMAXAXAMMSMSMAXXXXMAAMMMAXXMXMMMMMMMMMSSSSSMMSS +XXMAMASAMXMAMSAMXMSMMXSMSXSXSAMXAMXAMXSSMSXXAMXXAMXMASXAAAXSXMXAAAASAMXMASMMMSMMMASAASAAXAMXMAMSSMMSSMAAAMMSMMMSMMSXMSXXXAXAXAAXAMXAAAXAAAAM +XXMASMSASMMAMAXMAXAXXAMAMAAAMMMXSAMMMAXAXXXMSSSMASASXMMSMSXMASXXMXXXASXMXAAMAMXAXAMMSAXXMASASAMXAXAAAXMSMXAAAAXXXXMMXXASMSXMXMSSXXMMXMXXMMSS +MMAAAASAMXMMSMMMXXSMSMMAMXMMMXAAAXAXMSMMAAMXAAMXXMXMAXAXMAMSXMASMSMMMMAXSSSMAMMSMSSXAMSMSMAXSMXSMMMSSMXAXMMSSMSMAMXXMSMXAMXSAXXMMASAMMXXMAMA +AAMXSAMAMMMAAXAXMAMASXMAXAXAXMASMSSMXMAXXAAAMSMSMSASAMSSSMAXASAMXAAASMSMMMXMASAAAAAAMXAASXMASAMAXXAAAMXMSSMAXAAXSAMXMAAMSMAMAMMASMMASAASMSSS +SXSAMXSXMAMSMMASXXMAMAMSSSSMSXMXAAAXASXMAMXXSAAAAMAMAMAAMSAMXMASXMSMSAAMAAAXXMXMSAMMXMMSMAXAXMAAMMMSASXMAMMMMSMMMSAAMASMAMMMAXMAMASAMXMSAXAX +MSMXSMMMMSAMXMMAMXMMMSAAAAXMAMAMMMMMMSSSXSAXXMSMSMXMAMMSMXMAMSSMMAMAMXMMASMSAMXXAASXXMSAXXMMXXMSMXMMAMXMASXMAXASAAMMXMMXXSSMMSMASAMASMMMXMAM +XXXMXMAAAXXMASMAXAXXAMMMSMMMAXMASAMMXSAXAMASMXXAXMSSSSXXMASXXXAAXSMAMAXXMMMXMXMASAMMAMMAXSASAMXAAAXMMMXMASAMMSAMXSXSAAXAMAAAAMXAMXXMMXAAMMXM +SMXMAMMXSXAMAXSSSMXMXSMXAXAMXXXMXMMMMMAMAMAMAAMAMAAAXXXXSAMXMMMMMMSASASXXAMXMAXXMAAMSMMSMMASASMMSMSMAMSMMXMMMMMXXXASXSSMMSSMMMMXSXSXXSAMSSXM +ASXSAMMMXMMMAXXMAMAMMMMMMMSMSXSSXMASASMMSAXSXMXAMMMMMSMXMASXSASAAASXSAMXSMSASXSXXSMXMAAAAMAMMMMAAXAXASAMXSAMXAMMSMAMAAAAAXXXSXSMSASAAXXSXMAS +MSMMMXXAXAXAXSASAMMXAAMAXAMASAMXXSASASAXXAAMAMSASXSAAAAAXXAASASXSMMAMAMXAXSMMAAMXMMASMMSXMSMMAMMMSASMSMXMASMMAXAXMAMSSSMMSAASXXAMAMMMMMAASMM +XXAXAAMXMMMMMSAMXSXSSSSSMAMAMXMAAMAMMMMSAMXMAMXAMASMSMSSSXMXMAMXMAMMSSMMMMSXMSMMAXSASAMMMAMXMAXAMMMSXMXMAXMXSAMSMSXMAAXMSMMMXAMMMXMAAAMMAMXS +MMSMMXSAAXAXXMMMMAMAAAAMMXMAMXMASMMMAXXAXMXMAXMAMXMXXXAAMXMAMXMASAMXAXAASAMXXMASXXMASXAAMAMASXSXSAAMMMAMMAMAAAXAASXSMMMMAXASXXMAAASXSXSXMMAS +SAAXMAMXSMMMSAMMAAMMMMMMAXXAMSAMXMASMSXASAXAAXSXMSMASAMAMAMASAMMSAMXASXMMMSMXMMMMMMMMMSXMAXXMXAASMMSASAXSAMXMSAMXMASXXMSMSSXMASXMXMXMASXSMAS +MSSSMMSMXMMMXAMXSXSAMXXMAMMAMXAXXXXAXMMMXMSMMMMAMAMMSASAXSSMMASXXXMMAAMSXMSXSAAAMSSMMMMASAMSAMMMMAMXXMAMSMMSXXMXSMMMAXMAMXXAXXMASMSMSASASMMM +MAMXXMAMMSXSSMMXMXSMSMMMAMSSMSSMMMSSXMASMXSASASASASMSAMAXXAMXSAMXAXSMSXSAASAMSSMSAAAAAMXMAMSAMSASAMSSSXXXAAXMASAMAXSSMSMSMSMMMMMAAAMAAMXXAAA +SAMMMSAMXAAXMSMAMAMXSAASAMXXAXAAAXAXASXSAMXASASASASAMAMXMSAMMAAXSMMXAXASMMMSMAMXMMSMMSSXSMMMAMXASXSAMXMASMMSMSMMXSMMXAXAAAAMAMAXMMASMXMSMMMS +AAAAMMMMMMSMAAMAXXSAMMMMAXXMMMSXMXAXMMMXMAMXMMMMMMMAMXMXXMMMSSMMXSAMXMXMXSAAMAMSXMXXAXXXXMSXSMMXMMMMXAAAXAMSMXASAXAXMAMSMSASASXSSMASXSSMXSMM +XSMXSASAMXAMMMSXSAMXSAMSSMMAMAMASMSMSASXMSXSAAXAAXXXSXMSXAAAMAMMXMSSXMASAMXXMAXAMXMSMXMMMMMAMAMAXAASMSMXSMXMASAMASMMAXMXAMMMASAAXMAMMSAAASXS +XXMMSASXMSASXAAMMMMAXXXAAXASMASXMXAASAMAAMASXMSMSXSMXAAAXSMXXAMSAAAMASAMASASMSSMAAAAMAAAAAMXMASMSSMXAXMAMXAMMMSMMMMXSSMMXSSMAMMMMMMSXSMMMSAM +XSAMMAMAXSAMXMMSAMMMSMMSSMSMMMSMSXMMMSMMMMAMAMSMMAAASMMMXMXSSSMSMSSSMMASAMASAMXXXMSASXSSSMSAXXMAMAAMSMSMSXXXXAMXSAXAMAASAMXMMXAXAAASXMASAMMM +MSAMXAMXMMAMMMASXSASAAMXXMXSAMXASAXXAAXXXMASAMXASAMXAMXXAXAMAXAMAAXXXSAMMMXMMMMSXAMXXAMAMASMSMMASMMMMAAAMMSMMXMASXMSXSXMASAMSSSSSSXSASAMAMXS +ASAMSSSXSSSMAMXXXSMSMSSMSMMSXSMXXSMMSSXMMSMSMXMXMAXXMXSSMMSMAMMMMMSSMMMMXSAAMMAAMSMSMSMAMXMAAAXASAMXMMMXMAAAASMMSXAXAMMSXMASAAAMAXASAMXSMMAM +MXAMXXMAAAAMXXASAMXSMAMASAMMXMXMSMMMAMXAXXAXXSAMXXMMMMMAMAMXSSMASXAXXAMXASXSMSAMAMAMAXMAMSSSXSAASXXXAXMAMSSSMSAAMMMMAMASAMXMMSMSSMMMSMMXMMXX +MSSMMMMMMMMSMMSAMMASMASMSAMXAXAXAAXMASXSMMMMMAAASXSXSASAMXSMXAMASMSMSASMMMAXAXXXAMAMMMSMSAAMAMMXMASMMASXXAAAASXMMAAMSMMSAMAMAMXAXXXAAXXXMMMS +XAMAMAAAAXSAAXMASMXMXASXSMMSMSMSMMMMXMAMXAAMMMMSXASAMXSASMSAMMMXMXXAMAXMSMAMSMMSMSXSAAAXMMMMAMXASXMASAXMMSSMXMASXSXSAAXSAMXMASMMXAMSSSMXMAAA +MXSASXSXXXSMMMSAMMAMMXSAXMAAMAAAAASXMMAMSSMMAASAMXMAMAXXXMMXASAMMSMXMXMXAMMSMAXMASASMMSSMXXMAXSASASMSAMXXAMXAMMMAMMXXXMSAMSSMSAXAXAMMAAASMSM +AASXSMXXSXMSSMMSMMAXSXSASMSSSMXMSMSAMSSXMAAMXMMAMMSAMMSMXSMSMMASXAAXMAMMMSMAXAMXAMAMAAXMAXMMAMMAMAMXMMXMSASMXMAMAMMSMSAMXMASMSMSXSSSMMSMSAMX +MMSASASMSAAXXXAAXMAMSAMAMXAXMAMXMASAMAMASMMMSASAMASXXMAMAMXAAXAMMMXASMXXAAXAMXSXSMSXMMMSASXSSMMSMMMSXMAMMAMASMSSMMAAASXSSSMSXXXSAMAMMAXMXAXM +SXMXMAMASMMMXMASAXXAMAMMMMMSMMAAMASMMAMXMAAMAXXASXMAMSXMASXSSMMSAXMMAXAASMMMSAXXXAMSMSMAAXAAASAXASAXASXSMSMAMXMAMMMMMXAMAAXMMSMMMMAMMMMMMAMA +MASXMMMAMAAAXAMMASMMSXMXAASAAMSXMASAMASMSSMSMSSMMMSAMMASAXXAAAXXXMXMAMXMAAAAMMSAMXMAXAMMMMMSMMXSAMXXMMMMAAMXSXSAMXSMSMXMMMMXAAAAMMXSAAAMXMAS +SAMAAXMAXMMSAMAAAXAXAMSSMSSMSMXAMXMXMAXXAMAMXMAAMASAXSAMMSSSMMMSSMSMSAXXSMMSAMXXXAXMSMSAAXXMAXAMMXSSMAXMMMSAMAMMSXMAAAASMMXMSSSMSSMSXSSMASMX +MASMMMSSMXAAMXAMMSMMMSAAXAMMXASXMAMMASMMXMAMASMMMASAMMMXXAAAMXMXAAAAMSMXMXAAXSAMXXXXAXXXSSXSAMXSMAMASMSSMXSAMSMAMAMSMSASXAMMMMAAAXAXXXAXAXMX +SAMMXXMAASAMXMXAMAMAXMXXMMSMMXMXMMSMAMSAAXASAMMSMXXAXASXMSXXMSASMMMSMXXAMMSMSMXSAXSSMSXAXAMXMSMAMSSXMMAASMSXMAMASMMXAMAMXSAAAMMMMXSMMSSMMSSS +MASMXSMXMMAAMSSXSASMMXSMMMAAMXXAMAMMSMMXMXAMMSMAXSSMMMXAAMASAMAMMAMXXXMMXAXXMMAMMXXAASAMMAMAMAMXXAMASMSMMMMMMSSMXXSMMMSMAMSSSSMXSMXAXAAAAAMA +SMMMAMAMXSXMSMMASASMMAMAASMSMMSMSAMXMSMASMSMAAXXSMAXSMSMMMMXAAAMMSMSXMASAMSAAMAMXMMMMMAXSAMASMSMMASXMAXAMXSAAMAMXSMSMAAMAMMXMAMAMXSMMSMMMSSM +XAAMXMAAMMMMAAMAMXMAMMSSMSAMAAAXSXMSMMMAMAAMSSSMMXXMAMSXMAXSAMXSXXASASAMXXSMMSMMSAMSXSSMSXSASXAXSXMASASAMMMMXXAMSAAAMSXSMMSASXMMXAMXAMMSAMAX +SSMSMSMXAAAMSSMMMAMAMXAXSMAMMMSXMAMMASMSSSXXXMXAXXXSXXMASMMMSMASXMMMAMXXSAMXXAMAAMAMAMAAXMMXMMAXAMSAMAXAMAXMSSSMMMSMXMASAASASXAASXMMMSMMASMX +XAAXAAXXSSXMAAASXXMASMMXAMAMXMMAXMMMXMAMAMXXMASMMXMXMMXXMSAXAMASASXMXMXAMXSXSASMMXXMAMMSMXSAMXMSMMMSMMSMSMSAXXMAXXAXAMAMMMMAMMMMXXAAMAXSAMXM +XMAMSMMMMAXMXSMMASMMMXXXSMMSXSSSMSSSSMXMAMXSAMXAXAXAMXXMASXSXSXSAMXMAMMMAASXMAMMXMAXASXMAXMASAXAAXAXXXAMAAMMMMSXMXMAMMXMXXSAMXSAMSSMSMMMXXAX +MXMAAASMMMMXAXAMAMAAMMSMMASMMAAAASAXXAASAMAAAMSSXMSMXSAMAMMSAXMMXMXSAXAXMMSASAMMASMSMSAMMXMAMXSSSMMSXSASMMXAAAMXMMXMXMMSSMMAXMMAXMAASXASMSSS +ASXMMSMAAMXMASAMXMMAMAAAXXMAXMMMMMMMMSMSASMSSMAXAAAXXAAMXSAMAMAMSMMMSSSSMXSAMMXMASXAAXAMXSMXSAMXXAXSAXAMXXSSMSMAMAXXAMASAMSSMAXMMSMMMSASAAAA +SXMASAMSMMAXXXAMXASXMSMSMMSSMXXXAAXAXXXXAMXAXMASMMMSSSMMXMXXXAMXAAAAXMMAMAMAMAAMMMMSMSMMXMAAMAMXSSMMAMSMSAMXAXXMXAXSMSMSAMAMASXXAAAXXMMMMMMM +ASMMSAMXMSXSMMAMXMSAAXAXAXAMXAXSSSSSSXMMSMMMXMASAMAMMAASXMSMXSSSSSMXSMSSMXSAMMXXAAXXMAXMXSXMXAMXMAAMAMAAXXXMXMASMMMXAAASXMXMXXAMMXMMXMASXXXA +MXMASMMAMSAAAASMSSMMMMAMXMAXAMAMXAAXMAMAAAAXXMXSAMXMMSMMAMAXMXAAMXMAAMAAAMAMMXASMSMMSMSMAAAXSSMMXSMMMSMMMMXMXSMXASASXMMMSMASXXMAXAASAMXSXAXA +MMSASMSXMMMMXMXAXAXMXMXMASXMSSXMMMMMSSMSSMMMMMMXMXXSAXMSSSMSXMMMMAMSXMMSMMAMMMMAAAXAAAAMMMSAXAAMXXAXAMAMASXMASXMXMAMSAAAXMAMAAXAXSSMASAMXSMM +XAMXSMMXSAMXSXMXMMMSXMAMXMMXAAXSAMXMAAAXMAXXASMAMXMMASXXAAXMASXMMXXAASXXXSXSXXXMSMSSMSMSMAXMSSMMASAMXMXSAXAMAMMXSMSMSXMSSMMSSMMSXXAXAMAAAMAM +MSSSMXSASMSAAAAXMXXAAMMSSSMMMSXMASAMSMMMSAMASXMASASMMMMMMMXMMXAXMMMSSMASAMAXMAMXXXMMAAMXMMSMMMAMASXMMSMMASMMSSSMAAAAXASXAAAAAAAXXSAMXSXMXSAM +SAMAAAMAMXMMSXSASAMMSXAAAAAMXMMMAXXMAMXXMASXMASMSASAXASMSMASMSMMSAMXAMAMAMAMMXMAMAXMSMXSAMXXAXMMMXASXAAMAMXAAAAXMMMMMMMAXMMSSMMSMMAMXSAMXMMM +MASMMMMAMAXMAAMXSASAAXMMSSMMXXAMMSMSMSMXMASAMMAMMMMMSXSAASASMAMASASXSMXMASXSMAAASAMXMXASXXXSXMMASMMMSMSMMSSSMSMMXAXSASXSMMXMXAAAASAMXXAAASAS +SAMXMXSXSASMMSMASMMASXXAXAAMASAMXAMMXMXASAMXAAAMASAAMXMMMMSSMXMAXMAMXASMAXMAMXSMSXAASMMSMMXMAXSAXSAAAXAAXXAMAAAAXSXSASAAXXAAXMMSMMASMMMMASAS +SAMXMASAMXSASMMMSXSMMMSSSSMMAAXXSSMSASMMMMSMSSXSASMSMSXMXMASXSMMSAMXSASMSMSMMXMASXSASMXMASXSAXMXMAXSXMXSMMMMXMASMXAMAMMMMMXSASAXASXMAAMAMMMM +XXAAMMSAMASXMAAASMMAAXMAAMAMMXMMMMAMASXXAMSAAXMMMSMXAMAMXMASXSAAXAMAMAMAAXAASXMASXMAXMASXMAMXSXSSSMMXSAMMAXXXXAXAMXMXMMMSXAXAMXSMSAMSSSMMAXA +MSSSXXXAMXSMSMMXSAMSSSMMMMSMMAAAAMAMSMMSMSMMMSXMASXMMSAMAMMSXMAMXXMXMMMXMSMMMAMASXMMMMMMSMXMAXAMAXXAASASXSSMXMAXMXMXMAAASXMMXMASASMMXAXXXXMM +AAAMMMSAMXMMAMSAMMMAMXXSXMXASXSSXMAXXAAXSAMAMSAMXSAMXAAMAXMXMMAMXSXMSAMXMAMASXMASAAAAAAAMMSSSMAMMMMMMXAMAAXAMSMSMAXMASMMSAXAXMXMAMXSMSMSXSSS +SMMMAXSMMMSAMXMAXSMASMAMMSMMMAAAAASASMMSMMSAXMXMASAMXMMMXXSAXMAMXAAASAMXSXSAMAMAXXSXSSMSSMAAASXMXAAASMSMMMMXMAAAMXMAXXSASAMMSMAMAMSAAMAMAXAM +AXXMSMMAAXXMXMSMMASMXMAAMXAXMMMSMAXASAMXAASMMSXSASXMMMSSSMMASMXMMMSXSAMAMXMASXMMSMXAMXXAXMMSMMXXSMSASAAASXSASMSMMSASXAMXXXMAAXASASXMMMAMMMSM +MMSXMAMSASXMAXAAAMXXXMXSAXSMXXAMXMMSMXMSMMXAASMSASAMAXAAAMMMMASXSXXAMXSAMASMMXAXXAXAXXMASMXAAXAXSAAMMXMMMAXAXAAAXXAMMSMSSSSXSSMSXSAMXSXSAAXM +SMSASAMMAMXSASXSMXMMSMAAMSMMAMAMAXMXMAMMASXMMSAMAMAMSMMSMMAAMAMAXXMXMAMASASMAXXSSMSSMMXAMAMSXMXXMAMMMMSAMSMSMSMXMSMMAMAAAAAAXMASAXMAXAASMMSS +SASAMASMAMXMASMMMAMAAMAMXAXMAAMSSMMXSAXMAMMXMMMMXSMMXAAMXSXMMAMXMSMMMMSAMAMMSXMAAAAXAMMSSMAXASXXSSMSXASMSXAXMAMSMMMAXMMMSMMAMXAMSMMSSMAMAAMA +MAMAMXSXMMMMMMMASAMSSSSXSMSSMSAAXAXASXSMXSAAXMXMAXAXSMMMASAMSASMSAAAAMMXMAMMMAMMMMMXAMXAAXMSAMAAAAAXMMSXMMSMXMMMAAAAXSXAMXSXMAXMAMXAAXXMMMSM +MSMXAAMAMXAXMAXXXAXMMAMMMXMAAAMMSMMXSAMAMAMMSXSMMSMMASMMAMAMXMMMMXSMSMSASXSAMAMXXAXMSSSSSMAMAMXMSMMMMXSAMAMAXSASXMMMASMMSASAASXSASMSMMMXSAMX +SMMSSMXAMMAMMMMSSSMAMAMASAMXMMMAAASAMAMAMMXXMASXMAMXMAXSAMMMSMMMSMXXMASAMXMXMSMMSXSAAAXMAMXSSMMMXAAXSASAMXXXXMASAAXSAXAAAASXMAASAMXAAXAAXASM +AAXAAASMXSASASXAAXSXMAXAXASMSMMSSXMASXMASAMMMMMAXAMMXMMXASXAAAAMAASAMAMAXSMSXAAXAAXMMMMSXMAXAAXXSSMSMASAMXXMAMXSMSAMXSMMMMMASMXMAMXSMMMMSAMX +MSMMSMXAASASASMMMMAMSSSMSAMAMXXMAMXAMXSXMMMAAMMAMMSAMXXSXMMSSSMSMSMMMSMAMSAMXSMMMSMMXXMXAMXMSXMAMAMXMAMAAAASXMAMXXMXMMMMXMSXMMMMMMAMMSAAMAMX +XAAXMXMMMMAMXMAAXXXAAXAMAMMSMSMMAXMASXSMSSSSSSMAXSAXAAXMXSXAAMMSXXAMAXMXSMASAMXSXXASMSSSMMSMMMSMSAMMMMSXMSMSAMXSAMXAAAAAAXMAMXAAMMXSAMXSMSMA +SMSXSASAMXMMMSSMXSAMSSXMAMXAAAMMAMSMMASAAMMAXAMXXSAMMSSMASMMXMASXXAMXSXMXMAMAXAXMSAMAMAAMAAMMAXASMSAAAAXAAASAMASAASXSSMXAMSSMSSSXAAMXMXMAMAA +SXMAMXSAMAMAXAAMASXMAAASAXSMSMSMAMAAMAMMMSSSSSXSAMXMXAMMAMAXAMXSMSMMASAMASMSXMMSMMAMSMSMMSSSMMMXMAXXAMXMSMXMMMMSAMXAXAMSSMAMAMAMXMMSAMAMAMAX +XAMAMXMXSASXSSXMASAXMSMSAMSAAAXXSSSSMAXAAMMAAXAASXAXMASMASMSSSXMAAAMASMMAXXAXAAAAAXMAMAAXAAXAASAMXMMXAXXXSAMXAASMMMSMMMAAMAMAMAMXAAXMSMSXSMX +SXMASMAMSAMXMASMMSAMXAMXMASMMXMAMMXXXXSMSSMMMMXMASXSXSXMMSXXMAMMSXSAMXMMASMXMMSSSMSSXSSSMMSSSMSMSAXXMASXMASXSMMSXSXAASMMSSMSXSXSXMSMMAMXMAMS
\ No newline at end of file diff --git a/2024/day04/input_test b/2024/day04/input_test new file mode 100644 index 0000000..c41c5ea --- /dev/null +++ b/2024/day04/input_test @@ -0,0 +1,10 @@ +MMMSXXMASM +MSAMXMSMSA +AMXSXMAAMM +MSAMASMSMX +XMASAMXAMM +XXAMMXXAMA +SMSMSASXSS +SAXAMASAAA +MAMMMXMMMM +MXMXAXMASX
\ No newline at end of file diff --git a/2024/day04/solve.py b/2024/day04/solve.py new file mode 100644 index 0000000..da301c9 --- /dev/null +++ b/2024/day04/solve.py @@ -0,0 +1,43 @@ +def check_direction(lines: list[str], row_idx: int, col_idx: int, row_step: int, column_step: int) -> bool: + column_count = len(lines[0]) + row_count = len(lines) + for step, letter in enumerate("MAS"): + current_row = row_idx + (step + 1) * row_step + current_col = col_idx + (step + 1) * column_step + if current_row >= row_count or current_row < 0: + return False + + if current_col >= column_count or current_col < 0: + return False + + if lines[current_row][current_col] != letter: + return False + + return True + +def get_current_pos_words(lines: list[str], row_idx: int, col_idx: int) -> int: + if lines[row_idx][col_idx] != 'X': + return 0 + + count = 0 + for row_step in range(-1, 2): + for column_step in range(-1, 2): + if row_step == 0 and column_step == 0: + continue + + if check_direction(lines, row_idx, col_idx, row_step, column_step): + count += 1 + + return count + +data = [] +with open("input") as f: + for line in f: + data.append(line.strip()) + +result = 0 +for row, line in enumerate(data): + for col in range(len(line)): + result += get_current_pos_words(data, row, col) + +print(result)
\ No newline at end of file diff --git a/2024/day04/solve2.py b/2024/day04/solve2.py new file mode 100644 index 0000000..8866fc0 --- /dev/null +++ b/2024/day04/solve2.py @@ -0,0 +1,33 @@ +def is_xmas(lines: list[str], row_idx: int, col_idx: int) -> bool: + if lines[row_idx][col_idx] != 'A': + return False + + if row_idx == 0 or col_idx == 0 or row_idx == len(lines) - 1 or col_idx == len(lines[0]) - 1: + return False + + found_mas_count = 0 + for row_step in range(-1, 2, 2): + for column_step in range(-1, 2, 2): + current_corner = lines[row_idx + row_step][col_idx + column_step] + if current_corner == 'M': + if lines[row_idx - row_step][col_idx - column_step] == 'S': + found_mas_count += 1 + else: + return False + elif current_corner != 'S': + return False + + return found_mas_count == 2 + +data = [] +with open("input") as f: + for line in f: + data.append(line.strip()) + +result = 0 +for row, line in enumerate(data): + for col in range(len(line)): + if is_xmas(data, row, col): + result += 1 + +print(result)
\ No newline at end of file diff --git a/2024/day05/input b/2024/day05/input new file mode 100644 index 0000000..75195a7 --- /dev/null +++ b/2024/day05/input @@ -0,0 +1,1387 @@ +24|55
+38|32
+38|21
+48|51
+48|92
+48|14
+78|35
+78|54
+78|87
+78|44
+72|29
+72|65
+72|87
+72|82
+72|37
+23|56
+23|51
+23|81
+23|83
+23|25
+23|87
+25|14
+25|18
+25|55
+25|22
+25|15
+25|77
+25|17
+54|96
+54|65
+54|33
+54|21
+54|36
+54|29
+54|56
+54|89
+56|78
+56|88
+56|77
+56|52
+56|22
+56|81
+56|14
+56|85
+56|17
+33|23
+33|22
+33|83
+33|14
+33|89
+33|25
+33|55
+33|92
+33|72
+33|78
+96|78
+96|21
+96|14
+96|77
+96|92
+96|68
+96|88
+96|24
+96|83
+96|55
+96|91
+97|56
+97|54
+97|17
+97|43
+97|13
+97|33
+97|48
+97|96
+97|65
+97|89
+97|83
+97|37
+35|92
+35|23
+35|25
+35|52
+35|24
+35|33
+35|51
+35|21
+35|55
+35|88
+35|17
+35|56
+35|89
+52|44
+52|61
+52|88
+52|82
+52|64
+52|71
+52|51
+52|99
+52|97
+52|68
+52|85
+52|91
+52|18
+52|55
+22|43
+22|61
+22|72
+22|68
+22|15
+22|87
+22|64
+22|85
+22|97
+22|88
+22|51
+22|71
+22|18
+22|63
+22|91
+29|14
+29|81
+29|35
+29|89
+29|96
+29|21
+29|13
+29|36
+29|23
+29|65
+29|48
+29|17
+29|24
+29|52
+29|33
+29|99
+65|17
+65|15
+65|25
+65|48
+65|56
+65|22
+65|52
+65|21
+65|92
+65|23
+65|36
+65|83
+65|24
+65|55
+65|37
+65|89
+65|81
+36|77
+36|96
+36|83
+36|99
+36|56
+36|89
+36|68
+36|21
+36|55
+36|92
+36|78
+36|88
+36|51
+36|72
+36|52
+36|14
+36|24
+36|17
+32|24
+32|83
+32|13
+32|29
+32|21
+32|25
+32|92
+32|56
+32|33
+32|99
+32|96
+32|14
+32|35
+32|22
+32|88
+32|17
+32|65
+32|81
+32|37
+64|42
+64|48
+64|37
+64|96
+64|44
+64|56
+64|71
+64|76
+64|36
+64|29
+64|33
+64|23
+64|65
+64|13
+64|25
+64|38
+64|43
+64|32
+64|97
+64|54
+55|64
+55|76
+55|61
+55|43
+55|38
+55|87
+55|71
+55|72
+55|54
+55|68
+55|18
+55|67
+55|85
+55|63
+55|51
+55|78
+55|77
+55|44
+55|15
+55|97
+55|91
+43|14
+43|96
+43|32
+43|89
+43|48
+43|35
+43|23
+43|36
+43|83
+43|24
+43|33
+43|52
+43|56
+43|65
+43|13
+43|25
+43|21
+43|17
+43|54
+43|76
+43|42
+43|37
+92|85
+92|71
+92|38
+92|77
+92|64
+92|76
+92|44
+92|51
+92|63
+92|68
+92|87
+92|55
+92|88
+92|18
+92|99
+92|15
+92|72
+92|97
+92|43
+92|82
+92|61
+92|91
+92|78
+17|18
+17|81
+17|82
+17|52
+17|92
+17|77
+17|64
+17|21
+17|14
+17|68
+17|51
+17|83
+17|99
+17|24
+17|91
+17|72
+17|88
+17|15
+17|87
+17|85
+17|55
+17|22
+17|67
+17|78
+83|68
+83|77
+83|18
+83|99
+83|67
+83|51
+83|15
+83|72
+83|92
+83|22
+83|82
+83|85
+83|88
+83|63
+83|78
+83|44
+83|52
+83|24
+83|91
+83|55
+83|87
+83|61
+83|14
+83|64
+76|25
+76|14
+76|56
+76|22
+76|89
+76|23
+76|42
+76|35
+76|83
+76|29
+76|48
+76|32
+76|81
+76|33
+76|96
+76|13
+76|65
+76|21
+76|36
+76|52
+76|24
+76|17
+76|37
+76|54
+67|32
+67|71
+67|33
+67|25
+67|56
+67|97
+67|42
+67|43
+67|38
+67|37
+67|64
+67|29
+67|76
+67|35
+67|48
+67|44
+67|36
+67|82
+67|54
+67|23
+67|61
+67|63
+67|65
+67|13
+71|25
+71|48
+71|29
+71|33
+71|96
+71|42
+71|17
+71|89
+71|97
+71|35
+71|37
+71|54
+71|23
+71|43
+71|83
+71|36
+71|21
+71|13
+71|38
+71|76
+71|81
+71|65
+71|56
+71|32
+42|22
+42|35
+42|29
+42|24
+42|92
+42|36
+42|32
+42|99
+42|89
+42|14
+42|48
+42|65
+42|56
+42|17
+42|37
+42|96
+42|23
+42|25
+42|13
+42|21
+42|52
+42|81
+42|33
+42|83
+51|67
+51|78
+51|61
+51|71
+51|63
+51|97
+51|42
+51|87
+51|72
+51|77
+51|18
+51|29
+51|15
+51|64
+51|85
+51|82
+51|44
+51|43
+51|68
+51|54
+51|38
+51|76
+51|91
+51|32
+85|61
+85|67
+85|76
+85|25
+85|37
+85|33
+85|36
+85|32
+85|23
+85|97
+85|43
+85|63
+85|38
+85|35
+85|13
+85|48
+85|29
+85|44
+85|64
+85|82
+85|65
+85|42
+85|54
+85|71
+81|82
+81|72
+81|52
+81|87
+81|91
+81|15
+81|14
+81|83
+81|92
+81|22
+81|78
+81|68
+81|77
+81|18
+81|24
+81|67
+81|51
+81|85
+81|64
+81|99
+81|88
+81|55
+81|61
+81|21
+63|29
+63|44
+63|38
+63|89
+63|36
+63|48
+63|25
+63|33
+63|96
+63|17
+63|81
+63|32
+63|43
+63|42
+63|35
+63|37
+63|13
+63|76
+63|56
+63|97
+63|54
+63|65
+63|71
+63|23
+37|22
+37|56
+37|99
+37|36
+37|33
+37|78
+37|92
+37|23
+37|52
+37|14
+37|24
+37|55
+37|13
+37|48
+37|25
+37|81
+37|89
+37|83
+37|21
+37|96
+37|15
+37|17
+37|88
+37|51
+15|67
+15|61
+15|29
+15|77
+15|76
+15|68
+15|97
+15|71
+15|85
+15|32
+15|64
+15|63
+15|54
+15|35
+15|87
+15|91
+15|38
+15|43
+15|78
+15|42
+15|44
+15|82
+15|18
+15|72
+82|71
+82|54
+82|36
+82|65
+82|61
+82|63
+82|35
+82|96
+82|32
+82|33
+82|48
+82|76
+82|97
+82|56
+82|29
+82|43
+82|89
+82|23
+82|38
+82|25
+82|42
+82|37
+82|44
+82|13
+88|42
+88|78
+88|71
+88|15
+88|44
+88|54
+88|51
+88|85
+88|97
+88|43
+88|72
+88|91
+88|76
+88|87
+88|18
+88|64
+88|82
+88|63
+88|77
+88|38
+88|67
+88|68
+88|55
+88|61
+14|85
+14|77
+14|68
+14|87
+14|55
+14|67
+14|44
+14|99
+14|22
+14|91
+14|92
+14|61
+14|38
+14|64
+14|71
+14|15
+14|72
+14|52
+14|51
+14|82
+14|63
+14|78
+14|88
+14|18
+18|65
+18|64
+18|71
+18|38
+18|33
+18|63
+18|43
+18|61
+18|67
+18|91
+18|37
+18|13
+18|82
+18|29
+18|48
+18|97
+18|44
+18|42
+18|23
+18|35
+18|85
+18|54
+18|76
+18|32
+77|54
+77|68
+77|97
+77|63
+77|67
+77|85
+77|37
+77|42
+77|38
+77|61
+77|72
+77|18
+77|65
+77|29
+77|44
+77|35
+77|91
+77|82
+77|43
+77|71
+77|32
+77|76
+77|87
+77|64
+44|38
+44|35
+44|25
+44|36
+44|29
+44|33
+44|89
+44|76
+44|56
+44|37
+44|23
+44|48
+44|96
+44|65
+44|97
+44|43
+44|54
+44|71
+44|17
+44|21
+44|81
+44|42
+44|32
+44|13
+21|61
+21|22
+21|14
+21|82
+21|72
+21|92
+21|91
+21|18
+21|15
+21|24
+21|87
+21|67
+21|83
+21|55
+21|85
+21|99
+21|77
+21|63
+21|68
+21|51
+21|88
+21|64
+21|52
+21|78
+87|37
+87|65
+87|64
+87|48
+87|67
+87|91
+87|33
+87|82
+87|29
+87|63
+87|54
+87|85
+87|42
+87|61
+87|76
+87|38
+87|97
+87|44
+87|35
+87|43
+87|32
+87|18
+87|13
+87|71
+89|87
+89|81
+89|92
+89|78
+89|15
+89|88
+89|64
+89|91
+89|17
+89|68
+89|24
+89|72
+89|77
+89|99
+89|55
+89|83
+89|22
+89|18
+89|14
+89|52
+89|21
+89|85
+89|51
+89|67
+61|63
+61|97
+61|33
+61|23
+61|65
+61|17
+61|35
+61|13
+61|56
+61|71
+61|44
+61|96
+61|42
+61|38
+61|37
+61|29
+61|76
+61|48
+61|32
+61|54
+61|36
+61|43
+61|89
+61|25
+91|65
+91|67
+91|44
+91|13
+91|76
+91|32
+91|61
+91|82
+91|63
+91|85
+91|29
+91|43
+91|36
+91|64
+91|48
+91|71
+91|38
+91|37
+91|33
+91|42
+91|97
+91|35
+91|23
+91|54
+68|87
+68|65
+68|63
+68|91
+68|38
+68|37
+68|61
+68|35
+68|54
+68|32
+68|82
+68|97
+68|18
+68|71
+68|13
+68|72
+68|64
+68|85
+68|44
+68|42
+68|29
+68|76
+68|43
+68|67
+99|91
+99|15
+99|38
+99|55
+99|72
+99|64
+99|77
+99|18
+99|97
+99|54
+99|76
+99|61
+99|78
+99|44
+99|71
+99|68
+99|82
+99|43
+99|51
+99|88
+99|85
+99|63
+99|67
+99|87
+13|15
+13|14
+13|99
+13|89
+13|17
+13|21
+13|25
+13|51
+13|56
+13|33
+13|48
+13|36
+13|78
+13|83
+13|77
+13|81
+13|24
+13|52
+13|88
+13|23
+13|22
+13|55
+13|92
+13|96
+24|18
+24|87
+24|77
+24|92
+24|52
+24|14
+24|44
+24|61
+24|22
+24|71
+24|82
+24|72
+24|78
+24|68
+24|64
+24|63
+24|51
+24|67
+24|88
+24|99
+24|15
+24|85
+24|91
+38|43
+38|65
+38|54
+38|42
+38|23
+38|33
+38|76
+38|83
+38|96
+38|25
+38|37
+38|48
+38|35
+38|81
+38|56
+38|97
+38|29
+38|13
+38|36
+38|89
+38|24
+38|17
+48|33
+48|83
+48|23
+48|78
+48|55
+48|81
+48|22
+48|77
+48|89
+48|25
+48|24
+48|21
+48|99
+48|36
+48|17
+48|96
+48|68
+48|56
+48|52
+48|15
+48|88
+78|68
+78|72
+78|77
+78|43
+78|64
+78|38
+78|61
+78|97
+78|71
+78|76
+78|42
+78|32
+78|85
+78|65
+78|91
+78|63
+78|82
+78|18
+78|67
+78|29
+72|32
+72|67
+72|97
+72|64
+72|61
+72|13
+72|42
+72|85
+72|76
+72|71
+72|91
+72|35
+72|18
+72|54
+72|48
+72|63
+72|43
+72|38
+72|44
+23|96
+23|68
+23|92
+23|99
+23|22
+23|14
+23|89
+23|72
+23|77
+23|17
+23|24
+23|55
+23|52
+23|15
+23|78
+23|88
+23|36
+23|21
+25|72
+25|51
+25|52
+25|21
+25|92
+25|78
+25|87
+25|91
+25|24
+25|88
+25|96
+25|83
+25|99
+25|81
+25|68
+25|89
+25|56
+54|83
+54|22
+54|81
+54|42
+54|48
+54|92
+54|24
+54|25
+54|13
+54|35
+54|52
+54|37
+54|32
+54|14
+54|23
+54|17
+56|68
+56|24
+56|99
+56|72
+56|15
+56|55
+56|51
+56|18
+56|21
+56|91
+56|87
+56|92
+56|83
+56|89
+56|96
+33|56
+33|99
+33|96
+33|52
+33|81
+33|88
+33|15
+33|36
+33|68
+33|77
+33|17
+33|51
+33|24
+33|21
+96|72
+96|52
+96|67
+96|51
+96|85
+96|81
+96|89
+96|87
+96|18
+96|17
+96|22
+96|15
+96|99
+97|42
+97|29
+97|14
+97|36
+97|81
+97|32
+97|23
+97|21
+97|35
+97|76
+97|24
+97|25
+35|65
+35|22
+35|99
+35|37
+35|13
+35|96
+35|81
+35|36
+35|14
+35|48
+35|83
+52|92
+52|15
+52|78
+52|63
+52|67
+52|22
+52|72
+52|38
+52|87
+52|77
+22|92
+22|78
+22|99
+22|82
+22|44
+22|67
+22|77
+22|38
+22|55
+29|55
+29|92
+29|56
+29|88
+29|22
+29|83
+29|25
+29|37
+65|14
+65|99
+65|88
+65|13
+65|51
+65|96
+65|33
+36|81
+36|87
+36|25
+36|15
+36|22
+36|18
+32|36
+32|48
+32|89
+32|23
+32|52
+64|82
+64|63
+64|61
+64|35
+55|32
+55|42
+55|82
+43|81
+43|29
+92|67
+
+42,54,21,36,22,33,13,29,35
+83,67,22,14,78,99,18,92,15,77,52,68,82,55,21,61,85,91,51,64,72,24,88
+85,67,64,82,61,63,44,71,38,97,43,54,42,32,29,35,65,37,13,48,33,23,36
+96,81,21,14,52,99,88,55,51,15,77,68,72,18,85
+63,52,77,85,91,83,22,61,14,64,82,68,51,24,55
+63,97,76,32,29,35,13,48,33,36,25,56,96,89,17
+15,99,51,88,21,83,72,56,81,18,92,52,55,17,89,96,87
+92,22,17,96,78,87,72,14,24,55,81,91,52,83,68,88,18,99,56
+87,18,61,67,64,76,72,85,97,65,91,68,32,44,29,43,37
+87,63,72,64,85,38,43,78,76,82,77,67,88,54,55
+51,77,87,85,67,61,63,44,97
+35,65,37,13,48,36,25,56,81,24,22,92,88
+85,29,32,42,35,87,43,13,63,37,71,72,82,76,91
+56,35,81,96,55,92,83
+54,68,67,77,61,18,63,76,82,55,97,15,42,91,51,38,85,43,72,87,71
+99,88,55,15,77,68,72,87,18,91,67,82,61,44,71,38,97,43,76
+14,17,81,91,55,22,21,87,64
+92,51,68,96,81,17,88,89,83,22,23,15,14,21,25,99,24,78,56,72,36,77,55
+68,87,18,85,82,44,71,43,76,54,42,32,29,35,37
+92,22,88,14,21,55,24,17,25,36,13,23,48
+92,25,18,68,88,51,17
+32,17,37,54,89,71,43,33,42,21,25
+33,36,25,56,96,89,17,81,83,24,14,52,22,92,99,55,51,15,78,77,68
+61,63,44,71,38,43,76,54,42,32,65,13,48,33,36,56,89
+14,88,51,87,64,44,71
+14,92,88,51,15,77,68,87,71
+42,21,89,83,35,65,81,24,23,32,33,13,29,14,52,25,17
+17,83,14,22,92,55,51,15,78,77,18,91,85,67,64
+21,83,22,18,92,67,15,99,64,85,68,87,55,91,78,51,88,77,14,61,52
+64,15,77,85,92,61,88,83,78,22,18,72,68,52,82,91,87,63,14,99,55
+89,21,76,35,96,83,17,13,38,25,54
+77,68,91,85,64,82,44,38,65
+54,64,91,38,63,51,71,61,85,97,44,18,67,76,43,72,78,15,32
+51,87,52,85,72,14,83,24,68,15,21,17,92
+21,83,99,96,36,17,52,81,56,65,25,14,48,13,24,92,55,23,89
+76,42,29,48,33,36,25,56,96,89,17,81,83
+77,55,22,78,87,64,61,88,67,68,71,72,51,44,52,82,99,15,14
+37,33,85,54,44,76,38,23,13,42,36
+43,25,29,13,33,38,35,97,48,56,65,32,17,54,89,81,44,37,36,23,71
+81,92,88,78,68,91,85,67,82
+56,81,21,24,14,88,55,51,77,68,91
+97,29,65,33,17,83,24
+38,33,56,43,61,35,76,54,64,32,36
+63,44,71,38,43,76,54,42,37,13,48,23,36
+22,17,96,89,14,92,83,37,99,88,29,21,52,48,23,81,35,24,36,13,25
+77,61,18,87,72,51,38
+24,92,99,55,51,85,44
+64,82,77,35,38
+87,51,15,88,67,52,18,82,72,77,99,71,64,22,44
+99,88,51,15,78,72,87,18,85,67,64,61,63,71,76
+23,36,25,56,96,17,81,83,14,52,92,88,55,51,78,68,72
+52,92,99,15,78,77,68,72,87,91,85,64,82,61,44,71,38
+13,23,17,14,99,55,78
+25,17,35,37,44,54,71,81,56,65,32
+38,64,55,52,87,77,71,99,88,68,18
+71,38,97,76,54,42,32,29,35,65,13,33,23,36,25,56,96,89,17,81,21
+82,91,52,83,21,18,14,77,85,61,92,64,88,51,68,99,78,22,24
+29,35,13,33,25,56,96,89,17,21,83,24,14,52,22,92,88
+91,61,14,88,18,15,55,99,82,77,64,92,78,87,71,68,51,85,72
+13,36,35,32,38,76,63,82,37,43,65,42,54,48,64,29,56,97,33
+61,88,71,68,92,55,77,63,67,51,38
+18,85,88,63,77,52,38,61,64
+89,83,99,88,55,15,78,77,68,72,87,18,91,85,67
+13,17,35,89,48,33,43,54,21,23,38,83,76
+36,25,56,96,89,17,81,21,83,24,14,52,22,92,99,88,51,15,78,77,68,72,87
+24,52,22,55,51,15,78,72,87,64,82,61,44
+55,15,78,87,18,85,63,71,38,97,54
+37,44,61,32,85,76,71,68,87
+23,65,89,56,33,21,37,22,48,17,96,25,92
+24,14,52,92,99,88,55,51,15,72,87,18,91,61,63
+24,14,22,92,99,88,51,15,78,68,72,87,18,85,64,82,61,63,44
+64,44,97,43,76,54,42,35,37,13,33,36,56
+15,87,91,67,82,61,97
+63,18,32,76,67,82,15,64,91,72,85,68,54,43,42,71,61,87,97,44,38,78,29
+48,33,25,56,96,89,81,21,14,52,22,92,99,88,55,51,15,78,77
+89,17,81,83,52,88,15,78,77,72,87
+51,55,92,77,88,72,68,24,87,89,85,99,52,14,83,81,21,91,15,17,22,18,96
+76,35,33,13,14,42,81,43,23,29,89,24,21,96,17,37,32,25,65
+89,25,13,56,78,15,92,48,17,23,88,99,14,51,52
+21,83,54,33,35,25,13,22,48,37,56,14,36,89,42
+61,71,29,37,13
+96,17,24,14,22,92,88,51,77,72,85
+99,88,55,51,77,68,72,87,18,91,85,82,61,63,71,38,97,43,76
+65,35,42,32,13,17,25,83,33,23,54,14,24
+76,54,87,72,61,18,97,91,44,42,65,85,82,71,77,35,29
+91,87,92,78,21,52,18,24,68,85,77,15,81,83,22,64,72,51,99,82,14,67,88
+43,32,35,37,13,96,17
+33,36,96,21,24,14,52,22,92
+77,83,92,85,81,91,21,68,24,64,82
+61,71,48,63,44,32,42,65,37,56,96,43,35,76,29,23,38
+44,71,38,54,32,35,13,33,23,56,96
+23,17,81,21,83,24,92,99,88,55,51,15,78,77,72
+42,33,61,67,23,64,25,65,82
+81,13,48,22,29,23,35,14,21,92,89
+33,23,36,25,56,96,17,81,21,83,24,14,52,22,92,99,88,55,51,15,78,77,68
+32,29,35,65,37,48,23,36,56,96,89,17,81,21,83,24,52,22,99
+65,37,13,25,96,89,17,21,92
+48,76,13,82,71,97,23,61,56,29,36,33,44,42,25,43,38,54,37,96,35
+21,99,61,87,68,22,88
+18,38,54,32,35,48,33
+97,63,55,78,15,77,68,87,61,18,38,51,71,91,88,99,92,22,44,85,82,67,64
+56,99,36,96,13
+56,25,43,76,23,33,64,29,36
+99,51,68,87,91,82,63,44,71,43,76
+82,54,85,91,29,64,33,61,42,37,97
+56,42,17,33,97,43,63
+77,17,21,99,52,85,15,91,78,88,14,67,51,24,92,22,64
+55,51,15,78,77,68,72,87,18,91,85,67,64,82,61,63,44,38,97,43,76,54,42
+87,78,67,18,42,61,55,82,91,71,85,97,15,72,43,76,63,44,64,38,54,77,51
+37,44,64,13,29,97,25,82,61,67,36,35,43,63,23
+33,23,25,56,96,89,17,21,83,14,52,22,92,99,88,51,78,77,68
+33,36,32,35,48,23,24,21,22,17,99,83,25,37,96,29,81,92,14,65,52
+76,32,71,42,33,82,97,36,54,44,35,13,29,43,37,63,48,96,65
+65,37,13,48,33,23,36,25,56,96,89,17,81,21,83,24,52,22,92,99,88,55,51
+42,32,29,35,37,13,48,23,36,56,96,21,83,14,52,22,92
+42,43,25,65,23,37,61,44,48,29,76,33,36,38,54,97,96,89,35
+52,99,55,51,78,18,64,82,63,71,38
+36,96,89,17,81,83,14,52,88,51,15,78,77
+96,81,51,15,99,37,24,36,13,17,33
+21,83,24,14,52,99,88,55,51,15,68,72,91,85,67,64,61
+25,51,81,22,99,56,18,52,78,14,87,92,15,77,68,83,55
+81,77,92,21,51,15,99,96,56
+71,43,65,82,54,42,13,36,25,61,23,33,35,63,67,38,76,97,37,32,29
+37,76,63,61,96,56,25,35,13,36,43,29,82,32,48,33,97
+35,52,23,14,96,42,89,21,81,83,76
+48,23,36,25,56,96,89,17,81,21,83,24,14,52,22,92,99,88,55,51,15,78,77
+44,61,85,92,91,77,15,64,51
+37,13,48,33,23,25,56,81,83,52,92,51,15
+56,78,96,88,92,36,23,17,25,52,48,99,24,89,55,21,15,81,51
+64,22,67,55,97,72,15,18,68,38,88
+85,64,68,44,54,87,76,91,82,63,88
+85,38,78,82,18,87,91,32,77,43,76,72,15,42,51
+22,92,88,72,87,91,67,82,61,44,97
+55,18,54,38,87,88,85,15,76
+83,24,14,52,22,92,88,55,51,15,78,77,68,72,18,91,85,67,64,61,63
+42,32,35,65,37,13,48,33,23,36,25,56,96,89,21,83,24,14,52,22,92
+32,17,29,83,48,14,21,25,52,42,96,33,37,65,76
+35,89,81,14,32,83,29,65,52,25,92,13,22,36,33,48,37,42,24
+81,42,35,36,89,54,71,25,32,43,76,37,38,44,65,23,17,33,56
+21,18,87,52,22,56,51,15,77,92,25,55,72,99,78,96,14,83,24
+56,25,37,81,38,89,21,43,65,83,33,36,35,96,48,42,29
+55,15,77,68,87,18,91,85,61,44,38,97,43,76,42
+22,99,72,83,67,52,61,21,68,14,87,18,77,51,64
+92,55,85,14,22,17,52,89,78
+88,68,18,14,81,22,91,52,83,99,72
+36,17,29,83,96,65,54,89,43,35,56,23,25,13,81,76,14
+88,51,78,63,43,76,54
+91,67,82,61,38,97,43,76,54,42,32,29,35,13,48,33,23
+67,63,35,71,54,68,37
+85,35,33,32,61,76,65,54,37,67,91,42,97,48,71,82,38,29,13,44,43
+77,15,81,89,96,25,14,92,78,22,51,24,21,83,56,18,88,99,68
+23,36,25,22,92,15,72
+23,25,54,36,65,17,14,76,56,96,35,48,81,24,37,21,89
+85,64,61,38,32,29,65
+56,89,17,24,14,92,99,55,78,18,91
+18,85,61,63,44,71,38,48,33
+81,21,14,52,92,88,72,67,82
+55,51,15,78,77,64,63,44,38,43,76,54,42
+76,54,48,23,96,81,83,24,52
+21,83,13,14,22,96,25,37,56,81,36,92,42,89,23,32,24,33,52,35,17
+42,13,91,38,43,82,35,18,87,29,37,85,64,67,54,32,63,76,72,61,44
+23,22,29,21,24,36,14,99,89,56,88
+77,56,15,33,48,24,81,22,92
+78,87,85,67,44,71,97,29,35
+61,15,78,63,77,71,44,68,91,87,32,85,72,43,76,82,29,97,42,54,18,38,67
+99,18,81,82,87,24,78,51,83
+54,65,48,36,14,52,22
+63,44,38,97,54,42,32,65,37,56,96,89,17
+83,88,68,72,81,52,55,36,25,22,17,92,87
+44,38,97,54,42,37,13,33,23,36,81
+61,18,67,64,38,35,65,85,68,29,37,63,71,42,91,82,97
+65,54,23,35,89,43,29,38,36,76,81,21,32,17,56,71,42
+96,78,55,91,17,77,85
+64,82,61,44,38,97,43,42,32,35,65,37,48,33,23
+23,36,25,56,89,17,81,21,83,14,52,22,92,99,88,55,51,15,78,68,72
+97,43,54,42,32,29,35,37,13,48,33,23,56,96,89,17,21,83,24
+54,65,36,23,71
+13,44,33,63,48,97,25,38,64,82,61,56,76,42,54,65,71,43,23,35,36,37,32
+65,13,48,23,36,56,89,21,52,22,88,55,51
+68,51,14,83,64,18,77,17,91
+76,37,38,25,13,33,71,21,42
+21,92,81,87,24,56,51
+48,83,35,37,81,97,89,54,33,29,36,13,96,23,38,21,65,17,76,56,32,43,25
+13,48,17,83,14,15,78
+18,22,92,82,68,87,24,52,44,99,67
+77,99,87,92,22,51,52,68,71,14,82
+22,67,83,63,14,15,82
+64,44,97,61,67,32,37,65,38,29,35,48,71,36,54,76,85
+24,14,92,99,15,78,87
+63,71,76,54,32,29,35,65,37,13,48,33,23,36,25,56,96,89,17
+42,96,71,35,25,65,23,33,44,81,32,97,29,76,13,54,43,56,17
+87,91,67,82,44,71,38,97,43,76,29,35,65,37,48
+33,38,13,48,65,43,61,82,37,76,54,32,35,44,67,29,85
+24,52,22,92,55,51,78,68,72,18,91,85,64,82,44
+63,48,85,67,38
+42,32,35,65,13,48,33,36,25,89,17,81,14
+63,44,71,43,35,65,37,13,23,36,17
+25,21,97,33,54,32,76,42,37,17,35,65,89,81,83,96,36,23,48,43,13,38,29
+42,32,29,35,65,37,33,25,56,89,17,21,24,14,52,22,92
+37,48,81,21,83,14,22,88,55,51,15
+55,51,77,68,87,18,91,85,67,82,63,44,38,97,54
+35,65,13,33,36
+61,48,44,64,43,36,82,42,56,29,23,54,33
+92,99,88,55,15,78,77,68,72,18,91,67,64,82,61,63,44,71,38,97,43
+32,29,33,23,96,83,22,92,99
+63,55,61,92,87,64,88,85,72
+67,92,77,64,52,51,81,91,17,85,21,22,14,78,15,88,18,72,83,55,68
+36,78,92,22,51,87,99
+37,13,36,56,81,92,88,55,15
+29,35,37,13,48,33,23,25,56,96,89,17,81,21,83,24,52,22,92,99,88
\ No newline at end of file diff --git a/2024/day05/input_test b/2024/day05/input_test new file mode 100644 index 0000000..2508bd7 --- /dev/null +++ b/2024/day05/input_test @@ -0,0 +1,28 @@ +47|53
+97|13
+97|61
+97|47
+75|29
+61|13
+75|53
+29|13
+97|29
+53|29
+61|53
+97|53
+61|29
+47|13
+75|47
+97|75
+47|61
+75|61
+47|29
+75|13
+53|13
+
+75,47,61,53,29
+97,61,53,29,13
+75,29,13
+75,97,47,61,53
+61,13,29
+97,13,75,29,47
\ No newline at end of file diff --git a/2024/day05/solve.py b/2024/day05/solve.py new file mode 100644 index 0000000..b2b578a --- /dev/null +++ b/2024/day05/solve.py @@ -0,0 +1,27 @@ +def middle_page_if_update_correct(update: list[str], rules: list[tuple[str, str]]) -> int:
+ for idx, page in enumerate(update):
+ for previous_page in (update[previous_idx] for previous_idx in range(idx)):
+ if (page, previous_page) in rules:
+ return 0
+
+ return int(update[len(update) // 2])
+
+
+rules = []
+updates = []
+
+reading_updates = False
+with open("input") as f:
+ for line in f.readlines():
+ if reading_updates:
+ updates.append(line.strip().split(","))
+ elif line == "\n":
+ reading_updates = True
+ else:
+ rules.append(tuple(line.strip().split("|")))
+
+result = 0
+for update in updates:
+ result += middle_page_if_update_correct(update, rules)
+
+print(result)
diff --git a/2024/day05/solve2.py b/2024/day05/solve2.py new file mode 100644 index 0000000..4675e85 --- /dev/null +++ b/2024/day05/solve2.py @@ -0,0 +1,36 @@ +from functools import cmp_to_key
+
+def is_update_correct(update: list[str], rules: list[tuple[str, str]]) -> bool:
+ for idx, page in enumerate(update):
+ for previous_page in (update[previous_idx] for previous_idx in range(idx)):
+ if (page, previous_page) in rules:
+ return False
+
+ return True
+
+
+rules = []
+updates = []
+
+reading_updates = False
+with open("input") as f:
+ for line in f.readlines():
+ if reading_updates:
+ updates.append(line.strip().split(","))
+ elif line == "\n":
+ reading_updates = True
+ else:
+ rules.append(tuple(line.strip().split("|")))
+
+for idx in range(len(updates) - 1, -1, -1):
+ if is_update_correct(updates[idx], rules):
+ updates.pop(idx)
+
+for update in updates:
+ update.sort(key=cmp_to_key(lambda item1, item2: -1 if (item1, item2) in rules else 1 if (item2, item1) in rules else 0))
+
+result = 0
+for update in updates:
+ result += int(update[len(update) // 2])
+
+print(result)
diff --git a/2024/day06/input b/2024/day06/input new file mode 100644 index 0000000..f297efc --- /dev/null +++ b/2024/day06/input @@ -0,0 +1,130 @@ +........#.............................#......#................#..................#..................#.........#.#.#...............
+...........................................#..#......................#............................#...........................#.#.
+.............#..........#........#.#...........#........................#............................##...........................
+............#.............#.....................................#........................#.....#..................................
+.........#...........#................#................................#......#.....................#.............#..............#
+...........................##...........................................................................................#.........
+...........#.......#.................................................................#..............#....................#........
+.......................#.............................................#.........................................#.#..............#.
+.#...................#..................#...........#...#.........#...##..........................................................
+.................#..........#.....#.........#.....................................................................#..........##...
+....#.#............#..........#.......................#.........................#.................#.........#.............#....#..
+...#....................................#.............#..............................#............#.....................#........#
+....................#..............................#...#.#...#.#..........#.................................#..................#..
+........................................................................................#.....#.........#............#.........#..
+...................#.................#.......................................................................................#...#
+..............#.......#..................#........#....#........#.....................#..........................#................
+...........#..#....................................#.............#.#..#.......................................#.........#.#...#...
+...#.............#............................#..............#....................#.#.............................................
+..#...........#.#.........#...............................................#...#...............#.#...........#........##....#......
+.............................................#..#.........#......#................................................................
+.................................#.................#..............#.....#...................................................#.....
+............................#.......#............#...............................................................#................
+.....#....................#...........................................#..........................#..........#..#...#......#...#...
+........................#......#...#.......................#....##.......#..........#...............#.............................
+#..#....................................................................................................#.........................
+...........................................#......#..........................#..............................#.............#.....#.
+..............#......................#..#...................................#.#..................#.......#............#...........
+.................#...................................#..........#......#....#.#.#...#....................#..........#......#......
+........#....................................#........#.........................................#......#.#...............#......#.
+..................................#......#........#........#.#......#.........................#.#.......#......................#..
+......#..#.........#............#...........................................................#.............#.........#.............
+.........................#......................#.....#........#..........#.......................................................
+#.......#..................#............................................................#.........................................
+.........#.....#.............#...............#......#.....................#.......................................................
+.........#..#.........................................................#.........##..................##........#...................
+.#.....#..............#..............#.........................................#.....................................#............
+..............................#......................................................................................#............
+..............#..........................#................................#.#.....#...........#.........#.........................
+....................#...#.#...........................................................................#...........#...............
+...........#.............................#....................#........#...............................##....#....................
+.....................#......................#.#.....#...........................#.......#........#................................
+#..........#...............#.......#..................................#.....................................................##....
+.........................................................#...#....#...............................................#.........##....
+.....................#......................#..............#..................................................#...................
+......#.............#........#..................................................#...#.............................#......#........
+....................#............#........#...............#......#.......#........................................................
+..........................................................................#........................#......#.............#.......#.
+.....................................................#..#........#....................#.....................#.....................
+..#.................#........................................#................................................##...............#..
+.............#......#.........#................................................................................#..................
+#......#.......................................................................................................#......#...........
+.......##.......................#...................#.........##..........#.............................#........................#
+...........................................................#................................#...............#............##.......
+..........................#...................#...........................................................#.............#........#
+...#......................#..##................................................................................................#..
+............#..#.........#...#.........................................................#........#..............#..................
+.................#.................#........#............................................................................#........
+............#..#..#..#....#...........................#.................................................#..#...................#..
+....................................................#..#.................................#.#..............................#.......
+.........#.#................................................#..#............................................................#.....
+...##............................................#.....#.#...........................#....#.................#.#..........#........
+...............#.#.#.........................................#......#.....#..............................................#....#...
+.............#........................................#....#.......................................#...#....#.....................
+...........#.................................#...............................................#...........#..#..#......#...........
+#.......................................###....#....#.........................................#......#.............#..............
+...............#.#.....................................................................................#....................#.....
+##.........#..............#................................#..#..#..........#....................#..#..........#.....#............
+...................#..........................................#........................#.......................................#..
+#........#.#.....#............................................................##......#....#...........................#..........
+...............##....#.............#......................................#......................#...................#.#..........
+....................................##....#.............................................#..........#...................#....#.....
+.....#...............#........#..............#.............#..#..#...#.................................................#.#...##...
+........##.....................................................#..................................................................
+.........#.............................................................#..........................................................
+.............#.............#............................................................................#....#..........#.......#.
+.#........#...........................................#....#.........#......#............#.#................................#....#
+...............................................#.......#.............#.............#....................#.....................#...
+......................................#....................................................#...................................#..
+....#........#.....................................................#.......................................##.....................
+..........................................#............................................#.......#.....................#...#........
+................#.#.............#.....#....................#............#.............................................#...........
+..............................#..............#.................#...................#...#.......#..................................
+.#...............................................................#..................#......#............#................#........
+...................................#.................................##...........................................................
+...............................................................#....#..##...................#..#..............................#...
+..............................#...........#.................................................#.#....#...............#.....#........
+............................#........#.........#.........................................#....#...................................
+........................#................................................#....#..............#.........................#..........
+.........#....#....................#.......................#.#.......................................................#............
+.........................#......................................................#.................................................
+.............#...#...........#...................#.#..............^........................................#....#.................
+.................##...............................................................................................................
+..................#......#..............................#...............#.##.........................#............................
+....................................................###...........................................................................
+........#....................................................#........#........................................##...#.......#.....
+.........................##.....#.........................................................................#.........#.............
+.................#...........................................................................#........#..............#..#.........
+.........#.#..................................#..#...................................#.................................#..........
+.....#............#...#............#..............................#..........#.........#....#...........#.........................
+#...#...........................................................................................#.....#....#.........#.....#......
+......................................................#.#...............#......#.................#...............#.............#..
+.......................................................................................#.........#...#...........#..............#.
+.........................#................#.................#...............................#........#.##....................#....
+.....#...#................................#......................#...........#........................................#..#........
+.................#................................#.#.....................#............................................#....#.....
+...................#............................................................................#........#.....................##.
+.....#.................................................................#..................#........#.......#...#..................
+...............................#..#...................................#..........#...........#......................#.............
+....#................#..................#..........................................................................#........#.....
+......#.........................#............................................#....................#....#..........................
+.#.......#....#.#...#....#................#........................#...................#...................#......#...............
+..#...................#......#.#........#.........................#.........................#............#........................
+..#....#...#.......................................................................#......................#....................#..
+.......#...#............................................................#.................#......................................#
+..##..........#..................#...............#.....#..#...........#....#...............................................#......
+...##....#............##..................................................................................................#.......
+...........#.........................#....#......#...#.............................................#....................#........#
+............................................................................#...............#..#..............#...................
+.....#............................#.....................................................................................#......#.#
+.........#.............................#.....#.........................................................#.#.....#..................
+.......................#..#.#.......#..#................................#.....#..............#.........................#..........
+.................#.....................#............................................................................#........#....
+........#...............................................................#....#........#.........#.......#......#......#...........
+..............#............#......#..............#.#...........#.............................##...##.#..............#.....#.......
+##....................................................................#.......................#.................#.................
+............#...................................................................................................................#.
+...#....#....................#..............................................................................#........#............
+....#......................#......................................................#...............................................
+.#...#...........#....#........#...#.................#..............................#................#.##.........................
+...#.................#..............................#................................#...........#................................
\ No newline at end of file diff --git a/2024/day06/input_test b/2024/day06/input_test new file mode 100644 index 0000000..f76349a --- /dev/null +++ b/2024/day06/input_test @@ -0,0 +1,10 @@ +....#.....
+.........#
+..........
+..#.......
+.......#..
+..........
+.#..^.....
+........#.
+#.........
+......#...
\ No newline at end of file diff --git a/2024/day06/solve.py b/2024/day06/solve.py new file mode 100644 index 0000000..7e8a972 --- /dev/null +++ b/2024/day06/solve.py @@ -0,0 +1,55 @@ +import sys
+
+lines = []
+with open("input") as f:
+ for line in f.readlines():
+ lines.append(list(line.strip()))
+
+found_guard = False
+guard_row_idx = None
+guard_col_idx = None
+direction = None
+
+directions = [(-1, 0), (0, 1), (1, 0), (0, -1)]
+
+for line_idx, line in enumerate(lines):
+ for icon_idx, guard_icon in enumerate(("^", ">", "v", "<")):
+ if guard_icon in line:
+ guard_row_idx = line_idx
+ guard_col_idx = line.index(guard_icon)
+ direction = directions[icon_idx]
+ found_guard = True
+ break
+
+ if found_guard:
+ break
+
+if not found_guard:
+ sys.exit("Could not found guard.")
+
+row_count = len(lines)
+col_count = len(lines[0])
+while True:
+ lines[guard_row_idx][guard_col_idx] = "X"
+ new_row_idx = guard_row_idx + direction[0]
+ new_col_idx = guard_col_idx + direction[1]
+
+ if new_row_idx < 0 or new_row_idx >= row_count or new_col_idx < 0 or new_col_idx >= col_count:
+ break
+
+ if lines[new_row_idx][new_col_idx] == "#":
+ dir_idx = directions.index(direction)
+ if dir_idx == len(directions) - 1:
+ dir_idx = 0
+ else:
+ dir_idx += 1
+ direction = directions[dir_idx]
+ else:
+ guard_row_idx = new_row_idx
+ guard_col_idx = new_col_idx
+
+count = 0
+for line in lines:
+ count += line.count("X")
+
+print(count)
diff --git a/2024/day06/solve2.py b/2024/day06/solve2.py new file mode 100644 index 0000000..faaf88a --- /dev/null +++ b/2024/day06/solve2.py @@ -0,0 +1,78 @@ +import sys + +def traverse(room: list[list[str]], guard_current_row: int, guard_current_col: int, direct: tuple[int, int], check_for_loop: bool) -> bool: + row_count = len(room) + col_count = len(room[0]) + previous_directions: list[list[list[tuple[int, int]]]] = [] + for _ in range(row_count): + previous_directions.append([]) + for _ in range(col_count): + previous_directions[-1].append([]) + + while True: + if not check_for_loop: + room[guard_current_row][guard_current_col] = "X" + else: + if direct in previous_directions[guard_current_row][guard_current_col]: + return True + + previous_directions[guard_current_row][guard_current_col].append(direct) + + new_row_idx = guard_current_row + direct[0] + new_col_idx = guard_current_col + direct[1] + + if new_row_idx < 0 or new_row_idx >= row_count or new_col_idx < 0 or new_col_idx >= col_count: + break + + if room[new_row_idx][new_col_idx] == "#": + dir_idx = directions.index(direct) + if dir_idx == len(directions) - 1: + dir_idx = 0 + else: + dir_idx += 1 + direct = directions[dir_idx] + else: + guard_current_row = new_row_idx + guard_current_col = new_col_idx + + return False + +lines = [] +with open("input") as f: + for line in f.readlines(): + lines.append(list(line.strip())) + +found_guard = False +guard_row_idx = None +guard_col_idx = None +direction = None + +directions = [(-1, 0), (0, 1), (1, 0), (0, -1)] + +for line_idx, line in enumerate(lines): + for icon_idx, guard_icon in enumerate(("^", ">", "v", "<")): + if guard_icon in line: + guard_row_idx = line_idx + guard_col_idx = line.index(guard_icon) + direction = directions[icon_idx] + found_guard = True + break + + if found_guard: + break + +if not found_guard: + sys.exit("Could not found guard.") + +traverse(lines, guard_row_idx, guard_col_idx, direction, False) + +count = 0 +for row_idx, line in enumerate(lines): + for col_idx, char in enumerate(line): + if char == "X": + lines[row_idx][col_idx] = "#" + if traverse(lines, guard_row_idx, guard_col_idx, direction, True): + count += 1 + lines[row_idx][col_idx] = "X" + +print(count) diff --git a/2024/day07/input b/2024/day07/input new file mode 100644 index 0000000..f617be2 --- /dev/null +++ b/2024/day07/input @@ -0,0 +1,850 @@ +9151: 132 1 8 714 972 5 21 1 +740: 136 4 40 1 85 71 +1959240: 61 84 4 6 563 +9619353: 62 7 1 9 92 19 44 17 3 4 +85383: 141 8 4 6 9 5 49 +468373294: 7 25 841 46 101 329 4 +634495747544: 83 6 5 5 5 8 95 8 3 7 542 +1473921: 18 1 54 270 8 1 +191617: 9 2 3 78 617 +105545: 1 49 5 1 209 +3074260824: 89 4 90 5 9 4 3 62 452 9 +7871304: 9 3 6 7 96 456 3 1 9 6 8 +113179142: 7 7 96 6 70 6 6 4 49 3 2 7 +65190: 79 7 3 7 246 +111675278: 3 856 13 5 11 9 1 69 7 1 +18232286011544: 911 6 143 5 4 11 544 +2525217842: 2 9 9 8 5 1 4 8 6 4 310 3 +2754: 4 5 8 51 7 4 6 +9742: 77 15 27 6 8 6 81 7 80 +996566149: 674 4 12 668 45 22 1 7 +161036550888: 71 12 27 7 8 550 880 7 +6631527185: 7 5 98 5 9 764 1 7 185 +626: 72 3 379 8 23 +339047997: 914 3 409 904 88 +91402: 115 786 951 60 1 +2463205322: 9 2 8 60 5 821 1 6 8 5 2 +11096244: 24 9 2 43 508 +2761679223799: 8 8 8 5 1 8 490 1 22 799 +9228832: 43 19 8 4 353 +27049036274445: 8 9 5 4 9 791 5 34 3 8 4 2 +1366911546: 793 7 22 123 91 +123461: 53 1 9 5 38 5 338 88 +3822: 63 7 6 +18091789: 1 697 8 7 951 83 785 4 +7714: 469 92 1 13 408 +30391973: 8 593 8 6 1 2 3 8 5 7 6 71 +353583: 6 41 6 29 7 83 +198733471: 66 244 3 595 876 +358201: 6 49 29 7 6 5 47 57 +986380800: 148 51 7 24 64 85 +101112: 931 72 22 29 37 724 +743680946: 7 9 7 5 38 34 23 9 3 49 7 +115585260: 6 6 92 6 5 25 894 +15917620: 1 4 414 140 272 180 +28029104911: 84 15 3 278 4 114 8 +1123377777: 2 50 299 7 5 176 4 4 4 +108274258: 39 209 8 80 65 4 527 2 +6517: 7 7 40 1 3 9 2 5 7 3 144 1 +34114050: 4 8 38 57 9 8 43 123 5 1 +116285217: 10 9 322 2 88 1 4 9 4 15 +57634: 1 496 99 1 6 15 4 4 4 4 2 +26014: 986 9 26 55 89 +9106125640: 956 3 6 1 8 496 522 5 8 +721: 6 60 361 +4047586935: 59 61 1 679 32 +44558521: 856 72 52 859 49 1 +560032830: 10 1 2 1 915 8 7 20 85 6 +1855165370808: 8 7 5 4 1 76 1 4 370 80 8 +1146142: 7 578 3 7 48 94 +329511: 469 7 2 10 11 +420024: 2 73 6 4 516 +126044109: 61 9 6 729 91 25 9 +48703404994: 408 9 3 8 54 6 397 79 4 +5979: 8 7 9 731 88 8 7 3 9 7 3 +10432490441: 939 853 2 4 5 3 37 41 +119418127: 2 64 3 3 1 1 7 5 60 1 2 7 +87128064: 4 39 44 4 8 696 +2130168: 1 5 8 6 9 757 8 7 329 1 9 +97426804: 75 36 97 372 4 +806038: 1 26 6 24 69 3 536 686 +1313845: 26 19 8 6 9 5 +22504: 7 9 6 962 940 400 +3587483330: 92 39 874 4 286 +874581: 8 7 458 3 +8216470392: 3 7 74 81 2 8 3 314 5 9 4 +139797569: 4 1 9 8 1 7 268 71 5 61 8 +50791720425: 7 4 25 2 1 48 76 80 8 4 9 +946998094001: 721 7 46 130 93 994 7 +173645680: 310 56 4 5 680 +34416111: 956 45 8 64 49 +3093564117903: 66 72 42 781 80 155 4 +60037497240: 670 4 1 8 5 9 5 63 30 7 4 +310072: 738 2 35 18 4 +47077801344: 9 966 18 476 632 +126008: 453 669 9 669 70 8 +264843: 20 1 3 6 1 4 51 4 45 +81426920: 9 9 426 1 9 20 +466206: 19 5 178 38 2 2 9 9 1 3 6 +752675046: 858 6 35 3 2 6 5 78 62 6 +4462816920: 59 823 27 746 978 +84744: 6 2 844 9 11 +11830537: 1 3 3 6 44 8 7 19 7 1 39 +63332543: 623 9 60 1 71 527 5 9 +194775: 7 330 4 19 1 12 1 6 5 15 +394568496: 494 85 42 651 976 +24439099581: 41 73 887 9 907 +174366325623: 6 900 722 95 35 624 +444: 66 7 41 1 80 247 +837: 67 1 3 330 69 367 +196056917: 88 2 8 1 147 7 9 2 908 8 +409060: 6 615 82 86 30 94 8 4 +47090: 9 164 1 3 2 33 4 7 2 80 4 +7175: 64 2 823 8 66 7 +20344478588: 3 405 972 2 53 513 2 +659821815620: 613 343 263 5 69 620 +802485555: 2 444 5 7 6 88 16 5 535 +102625677: 1 8 65 2 608 7 3 4 5 +51268162: 879 90 529 80 62 +1662663653: 40 9 6 653 6 6 9 4 46 1 5 +1749: 3 6 89 1 769 +2104465: 6 9 7 49 7 1 9 7 1 1 2 243 +39785040: 3 975 678 4 3 5 +325326: 463 7 9 49 64 3 +505443247: 3 6 3 4 31 2 3 9 322 2 8 1 +6685230840: 84 5 8 1 8 35 79 13 841 +555959866: 3 47 111 2 7 5 98 68 1 +1232050199: 943 6 6 4 7 864 6 1 2 20 +24433540629540: 82 5 83 718 629 541 1 +139844572: 834 9 31 601 286 +352024115: 81 457 8 1 6 294 7 95 +466754400: 72 51 3 9 224 63 +1956636464: 397 89 61 66 463 4 +179284672885: 40 8 82 86 796 56 8 85 +12195470: 7 7 3 710 95 1 38 4 3 +1450501930: 9 5 2 1 7 95 19 1 4 28 5 5 +214898: 8 406 2 96 9 4 4 7 16 2 +27864: 6 966 4 +34977: 4 7 6 6 30 +1128443492504: 8 37 9 749 46 25 2 2 +7965: 13 4 17 9 9 +7258: 1 8 50 7 7 5 8 +9527870: 3 451 8 118 7 46 +9428848: 7 543 125 5 91 +4401902: 5 5 3 1 53 4 3 5 9 2 146 2 +14286283265: 26 996 54 98 65 +2644109705: 279 32 16 2 413 808 +2068932: 61 7 5 969 7 92 9 7 2 +20472203604: 1 9 3 6 2 2 7 3 37 760 1 4 +58617495: 2 171 3 9 177 104 214 +398838423580: 301 18 8 8 92 235 80 +18786839: 26 8 7 1 7 64 919 9 +6278462: 3 956 655 389 1 +9088797: 36 17 3 5 1 5 99 3 +2974506427701: 493 1 2 8 8 737 754 1 +19231: 5 9 420 4 5 271 24 27 +2350420985703: 3 7 1 23 5 6 7 7 53 9 877 +2736: 334 1 8 63 1 +2231907992: 9 149 18 81 509 248 +1118593: 86 1 13 483 106 4 +420262: 68 123 545 571 6 +1386900: 2 67 5 21 516 1 2 2 1 5 5 +26430: 5 522 50 12 68 +1832437: 277 35 189 80 +27477720: 8 66 48 6 48 15 1 508 +789621523: 4 983 8 1 2 1 515 8 +49684854: 77 5 6 9 8 252 90 5 84 +2088517152: 4 3 90 63 7 2 876 53 +4067837: 763 8 42 567 5 +844082: 43 7 7 5 76 29 2 2 9 512 +54108: 67 9 8 56 1 81 +54075944: 870 92 47 4 299 +7776679: 89 5 7 48 71 66 7 1 8 +819893: 3 98 9 3 4 9 2 800 8 693 +1052: 5 1 7 25 +794511615: 18 49 79 9 613 +5775164984242: 765 937 754 42 4 2 +166105353: 2 8 1 1 557 8 994 +449204: 8 9 959 556 2 1 28 +1307419: 1 2 2 4 4 8 4 9 8 178 5 7 +136481: 1 2 21 2 780 3 5 5 7 6 89 +2845449257: 284 5 449 257 +147060: 4 3 2 9 190 +1154: 6 3 8 8 2 +8713340202: 2 3 8 1 567 66 49 749 2 +285498: 154 269 672 495 747 +93244906260: 257 48 31 5 59 60 33 +199254: 9 362 8 51 3 22 +52132: 5 6 8 3 9 6 3 85 990 5 7 +81110: 4 912 157 16 6 +217141: 75 4 7 71 41 +243480250794: 6 67 8 6 7 4 6 744 1 7 7 4 +1461781: 90 66 6 42 9 1 1 +17748024: 7 7 80 926 5 4 10 87 24 +3203786001678: 46 7 4 1 45 85 8 1 678 +202847059: 7 1 943 2 470 59 +19485111: 39 9 575 2 496 5 146 +112166340: 701 2 8 60 2 74 69 +2188134198: 51 3 7 4 1 341 1 6 82 +10944961: 9 5 7 161 89 9 10 6 3 3 6 +42331808802: 2 1 4 5 7 65 37 2 746 6 2 +5325792196: 8 9 374 2 40 1 2 7 2 7 9 +12021872: 51 614 23 393 1 1 2 +4767141: 611 17 2 39 15 +3718357725: 7 1 1 5 1 5 5 5 44 2 5 417 +7646335: 41 4 41 889 84 851 +40469: 8 5 1 3 67 +615330: 643 26 918 300 888 +50260150: 359 700 5 2 8 8 6 5 +125520: 5 5 963 73 120 +647346227: 6 437 8 76 87 295 34 +29711242851815: 70 474 259 897 47 4 1 +5548803: 5 2 32 7 66 332 87 +450: 19 3 23 5 9 +132343: 8 54 40 4 2 3 52 4 3 4 27 +1179858960: 6 70 333 5 7 74 18 +497886150: 199 444 805 7 4 86 +141950: 4 7 8 1 7 8 46 543 4 6 9 4 +149735820035: 153 5 752 975 35 +100199700585: 91 94 765 708 1 583 +1044062784: 2 3 1 755 4 8 661 4 1 16 +5204633552: 5 5 52 4 63 22 7 5 1 5 5 +3620: 1 4 28 6 94 3 45 +295284: 3 41 40 60 84 +48248907: 902 19 8 938 3 5 4 9 3 +615145: 2 1 209 29 84 +2709056: 443 8 5 6 56 +54847043762: 2 7 704 3 746 4 5 5 5 1 8 +1120898: 56 6 6 556 +106037568094: 89 6 770 442 40 36 9 4 +19146429617: 32 28 7 2 7 1 6 959 7 53 +15963224760: 2 248 993 7 4 5 6 212 +776736688: 211 9 63 5 31 87 688 +364586: 18 346 49 9 6 +14059350: 8 2 363 6 8 6 785 +8619: 4 2 619 +16720759: 636 291 710 9 4 9 6 +798569985: 637 928 823 5 51 +210270837: 964 1 7 862 3 541 3 7 2 +2778624710: 231 10 2 4 9 4 8 7 1 2 1 +2153: 387 13 26 1 3 5 +3148076678: 314 807 667 6 1 +16220433195: 9 9 6 3 45 275 1 899 46 +29050653: 7 7 4 29 9 64 7 3 3 +4504999: 8 9 3 9 7 91 2 2 6 8 501 7 +24476553: 2 610 799 84 7 25 553 +960837415277: 24 68 388 213 26 4 77 +362770: 58 781 28 8 5 15 142 +98892626: 120 44 67 9 626 +56: 2 1 53 +264046: 4 970 7 5 53 +362427305: 6 2 9 423 84 4 6 15 7 +319715433: 8 928 7 9 259 8 7 69 69 +227299: 415 3 3 7 1 2 1 6 9 3 4 80 +2284578: 8 660 4 242 784 2 +2808058480: 90 390 731 8 2 +516: 22 1 22 5 464 2 +992: 4 39 50 31 7 7 3 8 99 5 2 +289123: 141 2 17 694 8 3 +564264010: 9 159 96 17 44 14 +485047: 67 740 4 598 69 +3790642776: 984 6 2 21 207 642 +95881: 604 2 1 3 9 52 877 +593105029510: 920 969 644 993 511 +24022618098: 1 5 3 9 3 9 8 5 972 4 7 94 +58556544: 30 4 1 5 794 218 6 32 +253136185: 506 270 5 11 26 57 +5474366: 741 6 246 414 4 3 8 96 +16587427068: 729 79 72 304 767 4 3 +50874781: 6 96 883 139 7 9 +5895: 75 7 130 9 +242279046: 13 9 6 520 4 52 8 80 6 +2242: 4 559 8 +11592154: 1 89 1 268 1 1 664 490 +16020118: 6 709 400 62 1 56 646 +1299962: 20 47 80 98 27 7 16 4 +295680: 1 3 5 40 52 800 5 8 +10464417: 9 2 6 27 3 3 34 83 +34462664411: 78 5 3 1 5 666 4 38 3 2 +8555: 96 88 59 44 4 +1169280986289: 9 4 35 928 9 86 289 +276164011: 119 444 60 49 14 1 +318180816: 53 6 175 5 814 +2591: 2 5 75 2 58 8 3 +32533493: 6 6 5 7 3 55 9 30 53 3 23 +229398: 266 4 1 45 1 5 9 16 663 +1728893159421: 8 1 28 9 8 566 69 11 1 8 +76054443206: 7 7 1 3 54 28 4 7 8 6 58 7 +35589: 20 57 66 1 7 1 1 14 +1253928: 74 5 65 64 52 +13626929426: 2 90 700 2 147 26 +17809524054: 51 5 1 97 4 5 72 54 +224832107: 93 68 3 8 107 +71645285: 98 143 73 89 5 +1030424: 4 6 5 87 596 4 5 92 7 5 +14471016: 516 57 82 52 6 +172454: 4 9 9 2 266 78 8 +855653: 5 2 82 8 65 287 366 +1226600: 7 37 1 473 5 58 8 7 979 +447240: 3 64 833 8 323 426 +15238243461: 21 7 39 2 69 9 730 2 +1071922335: 7 7 4 3 2 96 116 5 2 5 +229848187: 3 241 942 149 38 +45344183: 3 3 77 42 308 3 651 81 +4901: 888 7 5 2 424 +46609776: 568 1 34 82 589 6 +47824041: 469 33 515 6 108 3 +4985084: 1 912 5 34 2 13 +93130324833: 4 3 8 9 2 71 28 9 2 4 67 3 +149374: 30 1 118 37 4 +1027499: 6 55 3 7 100 248 3 34 1 +1019443816: 5 5 94 393 92 7 892 +148406254: 4 2 397 86 89 +1046424933: 5 48 276 19 5 40 9 837 +789121218468: 394 17 64 3 12 184 68 +24606: 394 61 1 26 531 8 6 +32826875: 5 3 24 35 2 7 449 8 75 +78610925642: 4 61 99 8 7 14 9 256 40 +563129: 19 9 9 1 939 5 501 1 3 2 +1185206173: 469 9 41 824 5 3 2 5 4 9 +88615648: 9 7 3 2 94 806 3 6 9 7 21 +3541: 44 3 74 8 55 +104271660: 3 487 26 633 6 8 15 3 +20881: 32 651 3 2 44 +1876729: 4 168 9 780 748 +28509624384: 996 8 4 286 3 84 +1026553844795: 74 92 52 5 527 4 72 7 5 +29043744111: 6 437 2 2 6 47 8 5 2 9 1 +1722468804: 9 2 4 636 9 6 142 1 866 +270229300: 6 6 890 10 4 3 48 5 92 +3004099: 894 6 28 6 8 2 78 45 +3616992: 3 60 600 8 1 5 51 1 4 9 2 +214643388: 39 55 73 70 388 +914715656: 7 1 20 11 3 352 9 4 8 8 +21106475520: 119 1 213 6 1 130 2 32 +53262303: 68 2 8 5 780 5 +507716: 498 7 81 85 60 45 6 +19438755840: 4 3 6 9 96 28 16 5 558 +684865: 66 7 18 52 71 9 78 5 +50379008: 2 9 8 843 83 261 2 5 6 7 +1751841: 125 36 403 9 3 +411768738: 9 65 20 73 78 92 231 6 +25: 5 8 12 +69387321: 69 3 8 731 8 +74878624: 1 20 379 7 8 1 2 6 7 4 4 +17592: 8 9 5 8 9 +55543298: 7 822 1 9 710 +52244409: 884 985 6 4 5 +27014: 270 1 4 +290549879: 538 3 5 83 360 +57134: 9 693 9 1 79 965 +1602647: 6 9 68 23 7 +2542: 24 47 1 7 88 +1341748: 134 167 7 1 8 +49167143: 3 79 37 108 38 12 336 +1229666510: 17 376 391 45 3 1 4 2 4 +918: 9 1 7 54 +1066482049: 2 2 7 7 6 3 7 53 6 9 535 9 +401582160: 340 7 86 6 327 +11328164873: 3 77 9 1 54 5 7 9 34 2 4 1 +4608: 6 5 719 6 6 78 +523320: 27 6 9 81 602 534 +5810: 8 70 8 84 9 109 +678988872: 9 3 99 4 126 8 56 4 4 9 +3745560: 28 7 546 35 2 +10516660: 3 3 53 9 34 26 3 8 7 70 2 +255469822776: 7 87 7 3 48 79 95 4 3 9 8 +69634: 2 298 5 3 26 74 +16699318278: 9 277 3 99 30 1 6 5 6 5 4 +18603: 69 8 5 3 8 +67053055690: 1 2 515 434 4 1 569 3 +141888: 733 6 1 3 64 +873288345622: 15 161 19 6 6 96 6 2 3 +112480808: 8 15 6 61 8 64 628 1 4 4 +8506730: 69 70 93 658 766 +10772735: 8 3 624 8 26 +29935635: 36 8 22 85 1 5 811 +870: 46 85 22 1 715 +96866: 8 1 260 7 5 2 5 2 1 9 8 7 +21406467537232: 37 24 2 35 5 8 376 482 +24602893: 72 8 2 2 8 8 2 96 3 873 7 +140909724814: 297 27 7 9 158 5 1 1 3 4 +3454011: 575 49 2 3 354 3 +286400393: 706 86 89 57 53 +18063592456: 9 808 6 56 511 767 +27428489: 421 83 2 544 9 +1796674401: 9 11 4 7 6 72 2 326 5 4 9 +337021994: 6 311 29 9 692 2 +7026159: 78 8 53 8 59 6 159 +443282: 382 16 45 1 68 34 7 73 +1046899268800: 466 6 9 779 4 1 7 880 4 +3651: 346 8 7 30 74 +572386770216: 6 8 69 7 7 50 55 6 486 +21346403103: 981 207 3 40 876 57 6 +2463381202: 7 4 6 3 3 8 52 77 55 3 94 +30407481: 9 5 621 318 4 +13515323217: 681 1 592 6 49 33 +1087609539: 332 9 2 90 431 416 +410953440: 9 91 93 5 987 955 485 +171585054: 124 6 72 1 256 174 9 +28973728: 25 3 1 96 5 1 8 6 83 4 7 8 +345430: 60 2 55 269 778 +2723562: 7 1 7 9 5 5 5 2 37 5 8 2 +24545063129: 6 6 3 3 4 2 9 43 20 1 930 +189356832874: 4 836 2 2 3 6 2 786 874 +1664708: 3 1 79 2 2 523 +3234: 566 1 4 9 66 8 879 6 +51568806: 978 8 44 9 4 97 91 8 2 +21978100: 17 65 67 525 4 +516143: 6 309 278 731 +1604981961: 862 1 4 8 5 7 7 6 69 8 4 9 +230: 9 21 2 7 1 31 +29711: 3 981 22 6 55 +7387441984: 52 2 76 2 557 839 +2497700061: 2 7 26 37 81 29 9 +283450487882: 9 446 7 3 5 8 4 9 596 5 6 +4611600047: 823 5 160 35 47 +18762785: 3 101 90 688 60 965 +6039720: 6 4 9 699 1 2 7 1 5 5 25 4 +18778179043: 7 9 81 3 6 8 7 528 3 1 13 +107610050: 8 50 7 4 952 8 13 6 7 3 2 +322506: 930 55 36 95 270 9 9 +112567: 1 3 874 8 8 72 1 2 12 27 +2187945065478: 6 853 342 5 2 6 5 9 6 5 +378542670168571: 94 635 6 67 542 4 571 +95370: 36 20 2 5 66 +60925172439: 572 3 202 5 2 710 19 +1864083431: 11 65 2 8 83 429 +130006538: 3 49 5 50 6 4 1 1 93 45 +45205660: 3 44 5 7 2 98 20 9 6 1 4 +4473939: 5 8 902 6 79 885 9 +9229836: 3 4 6 5 5 811 9 194 80 6 +126846796: 4 1 4 3 783 79 6 +354965538790: 3 48 6 965 5 3 878 1 2 +1523: 8 561 881 2 71 +2911951343: 41 157 34 5 9 1 343 +3411360640: 3 5 1 885 2 103 6 3 641 +8384: 90 5 11 3 8 +58070691758: 9 796 988 626 6 +4606: 38 79 56 669 2 +1855761377: 1 2 4 177 57 6 12 95 82 +8785483574: 6 27 5 2 1 5 53 8 2 82 1 7 +12108: 70 32 969 889 58 6 +14567: 1 6 12 78 7 4 480 237 +150941: 5 7 5 90 941 +786264: 6 788 1 989 396 602 +51732: 39 781 63 2 70 +4021802: 7 718 7 8 6 436 +307443454: 482 30 405 76 6 +6876720: 68 767 1 6 1 +3775473626: 94 38 684 4 26 +477729: 96 211 222 93 7 +186422884169: 1 2 86 92 6 2 8 6 4 16 9 +10320797: 130 8 4 992 29 +5947214674: 5 94 72 146 74 +75017587536: 75 10 1 758 753 6 +87977: 28 7 80 579 93 +595019375: 3 2 736 1 199 7 976 63 +5401506: 68 355 82 223 +423147: 6 7 23 6 2 38 9 +37519365: 9 8 92 5 360 98 5 8 5 +153574577: 86 21 7 172 8 829 670 +749: 292 79 378 +1322409: 397 871 46 8 409 +1616671693: 9 6 3 4 4 43 2 6 9 9 2 469 +8395504261: 2 4 39 542 3 5 4 2 63 +1485870: 6 2 9 8 9 7 35 847 4 722 +1438: 4 13 880 463 3 40 +272444064: 7 3 3 5 33 7 7 2 6 1 944 6 +463128200: 92 625 6 40 5 +17757: 5 62 57 81 7 +223440: 6 94 9 264 3 9 95 2 +17536: 183 3 337 22 8 +159298: 73 85 491 802 5 +7217725681: 3 1 88 3 3 2 94 7 7 40 46 +9102004482: 8 6 20 37 4 99 8 1 143 2 +73: 6 8 11 9 5 +522: 73 14 6 +2317: 3 88 75 6 654 +45537732: 7 1 1 58 95 2 1 5 9 5 2 6 +292143828: 683 6 801 6 89 972 +26166150: 82 7 25 7 6 2 95 8 6 3 75 +524161499002: 73 825 563 24 71 +535311: 89 675 7 90 65 356 +912: 4 6 866 +26016: 796 8 89 47 4 +1953265: 8 8 8 3 5 8 5 64 3 9 7 370 +184602403: 18 10 3 32 62 40 403 +16262943763: 146 8 88 2 90 6 8 29 6 2 +102402849: 328 214 8 39 81 +28237920: 1 5 575 902 14 2 4 267 +823891: 85 2 736 8 94 +146882851: 706 25 9 885 94 919 +5015: 9 1 3 412 71 1 +39960936: 2 5 365 2 85 6 92 184 +149149800: 79 4 7 41 47 860 +245273298: 272 525 6 1 7 7 5 9 +36014801803: 3 5 1 9 2 296 5 180 2 +9268771223: 122 92 8 754 23 +3879: 1 7 5 97 +6366882079: 5 280 25 1 73 5 4 3 2 5 9 +22651880: 4 566 2 2 376 5 +416: 397 2 17 +7522024: 666 3 8 7 7 644 36 76 +12054942: 1 16 48 872 6 125 13 3 +1804617: 8 77 14 505 4 2 16 +4979592: 1 684 479 62 69 +13230: 7 7 5 6 9 +188694006: 260 7 955 1 68 74 +664824301: 76 399 783 4 7 925 +99691298: 7 72 2 989 98 +2957: 40 58 8 516 52 61 +20566962720: 48 3 2 704 221 2 4 6 54 +768427128109: 8 50 10 3 904 810 7 +6527661: 8 36 61 9 1 993 2 9 2 4 +28558016: 237 908 7 738 4 3 17 4 +5416190: 6 9 136 814 7 3 611 4 5 +3058632: 384 4 2 895 7 59 92 +13389382: 8 7 1 2 759 7 295 1 7 2 +162903312071: 6 520 30 6 586 9 55 68 +1105: 4 2 86 1 184 +156: 83 34 5 2 32 +75682: 2 97 759 5 79 +738707: 7 4 7 9 54 916 7 +181872944: 2 6 48 511 3 339 93 9 5 +6916941511: 3 688 6 9 3 83 1 8 24 11 +215342: 3 3 7 2 534 69 1 67 540 +399338: 7 114 8 7 956 +2973648: 9 333 992 84 7 533 +3201299426: 1 2 3 5 1 8 43 2 57 2 3 23 +522701569: 5 22 58 3 9 15 5 2 1 6 8 2 +303731392: 5 1 9 9 930 84 35 63 6 8 +34897940825: 610 13 46 89 44 8 25 +29346: 8 3 49 67 6 +60466566943: 4 6 3 3 3 29 91 68 438 9 +3078173: 276 237 6 164 9 +1526065: 61 5 316 3 2 44 73 +1346: 382 814 9 45 96 +9683184: 9 2 5 537 16 7 7 +47632853: 79 363 25 6 54 +18427387459263: 2 9 42 7 385 2 4 592 62 +72445: 1 1 76 9 93 +354603: 9 3 8 2 29 4 893 975 +30207570456: 21 449 202 83 84 +1601402382: 623 34 56 7 6 47 18 +805: 51 5 618 89 42 +453218: 453 156 52 2 8 +2454691634: 3 7 52 4 58 67 7 16 34 +4249375: 376 8 3 2 5 4 44 8 7 18 4 +11202362: 466 76 1 5 24 +13890175488: 495 575 352 9 778 36 +77784300: 82 512 5 97 15 6 3 +3417: 17 5 91 3 3 2 46 16 2 3 3 +158868604400: 295 538 158 604 400 +14794788: 7 3 3 10 469 72 734 6 +496329: 55 9 51 2 1 90 726 +49702: 5 967 66 69 2 +5820848128: 65 789 227 5 1 8 611 +9911: 900 9 905 +2116507855: 939 7 7 46 926 920 9 +678377763: 7 35 8 866 57 3 8 1 9 6 1 +15252661: 8 7 25 265 8 +432963: 6 1 16 8 1 9 4 395 8 1 4 7 +462883134: 2 314 4 1 5 5 4 9 5 5 989 +20394944733: 2 40 259 72 280 1 93 +25449007500: 56 3 875 82 630 +673: 4 6 6 9 98 35 +433234809674: 481 369 3 45 2 962 5 4 +2231307: 932 1 1 5 239 +5496: 421 29 8 1 1 12 +361056486: 95 38 527 33 4 86 +14832: 2 119 7 +55377: 355 66 256 9 58 2 9 +3672207430366: 64 290 1 229 9 7 33 96 +924506: 8 1 8 7 7 307 4 825 72 7 +585727992: 406 75 29 24 2 5 72 +4464: 4 3 50 9 8 +969362: 2 30 8 420 +91356570230: 3 6 6 34 2 9 92 9 3 6 2 28 +21019: 41 38 543 7 +24076855887: 481 53 2 3 2 1 17 7 5 2 +5655436: 4 1 5 666 6 62 8 5 22 3 3 +2196815: 6 1 6 6 742 76 +197984593: 394 39 502 4 806 +225: 7 3 3 1 9 +54870: 914 4 1 6 +966: 25 9 641 93 7 +37809635: 53 269 851 87 321 2 3 +3735230: 18 717 5 43 1 36 995 +514763246: 3 8 21 10 76 3 23 1 7 1 9 +203727: 7 6 82 79 720 9 +17269915: 8 7 15 4 4 2 95 6 69 2 65 +10989115532: 7 8 1 650 6 4 6 2 3 11 3 5 +42746579602: 70 422 7 607 2 86 414 +128541973: 67 37 954 2 1 4 +2255236: 5 80 424 931 61 5 +335089472: 6 10 5 904 5 6 68 478 +342735588: 17 14 40 433 36 +9159: 9 21 35 27 5 384 +955712: 6 199 64 8 +429600: 1 96 52 29 4 100 +16629466: 870 9 41 38 70 4 46 7 1 +428326080: 2 8 6 715 4 6 2 6 4 65 6 +11696320: 36 547 4 40 8 +3480960: 60 14 8 74 7 +9707101: 995 6 975 +1408: 2 510 386 +82190387178: 821 871 32 8 7 1 81 +3057975750: 765 3 47 3 7 9 8 8 4 5 5 6 +1089290533: 3 4 3 5 1 603 7 69 533 +4645808: 451 2 133 771 37 +1875141773: 24 353 997 74 34 6 3 5 +1485138665414: 3 99 28 74 6 95 47 414 +37584: 87 9 6 8 +54241847: 3 530 6 7 341 +831532886240: 7 3 8 3 525 1 827 140 8 +2269440: 34 64 2 97 15 768 +3335: 5 3 8 6 92 24 3 640 +1607: 9 5 1 35 +926184: 88 19 82 7 7 84 +211117960879: 9 5 8 20 866 7 67 691 7 +9035504: 8 36 1 7 193 2 8 +1081599840165: 4 7 30 8 782 9 34 33 5 +1193940730: 958 47 18 66 7 30 +655320: 6 551 71 9 28 94 17 +2132901: 8 6 2 3 9 6 9 3 7 10 277 7 +6688892: 1 667 88 83 3 6 +5173437: 14 87 8 35 64 +29980: 23 13 54 26 +78634578: 65 55 8 3 34 6 803 +51202768: 420 4 2 878 2 359 409 +329599694594: 533 1 258 84 32 23 +419178834: 4 41 5 2 9 2 8 1 2 5 9 246 +203412475243: 4 168 6 5 2 6 47 4 5 7 4 1 +27075: 7 2 1 3 62 852 +416831779: 8 533 5 399 91 7 7 +3976787: 52 2 9 7 865 9 +240484: 70 1 885 5 48 8 2 1 236 +1959168: 573 4 2 4 223 9 3 8 4 8 3 +13400405953: 7 403 5 392 181 +54686971: 6 6 3 12 1 9 479 3 559 1 +15780086: 8 2 4 24 4 8 9 2 94 8 80 4 +5328139588: 877 15 9 50 9 7 1 9 6 13 +103650: 7 9 9 6 3 4 14 2 51 984 6 +1132504: 3 47 906 5 5 4 +1325436: 64 445 1 4 651 +522368033: 985 59 53 53 36 +17934048: 5 4 6 748 74 +32923: 8 80 5 92 3 +1684403: 68 375 9 66 64 2 734 9 +111745: 89 91 7 88 411 2 452 +13263230: 163 3 131 62 4 +3868986962: 6 42 362 167 98 72 8 5 +11345670: 3 43 145 63 27 +319239004896: 50 6 72 85 768 16 8 63 +3034544540: 3 5 867 4 33 12 4 3 +40627: 4 51 4 9 +47169937111206: 47 1 69 937 111 208 +112164822847: 5 804 2 7 7 66 3 84 5 2 1 +5803503559: 7 7 904 7 6 868 88 2 6 +11634120945: 947 6 29 4 306 943 +34851742: 913 7 9 3 63 55 98 +6297303600: 8 72 2 2 653 5 4 6 5 490 +9669310775124: 869 94 1 629 308 611 +4741903666: 6 1 9 6 182 6 77 1 6 4 2 6 +1410872158446: 7 5 271 80 3 958 7 4 98 +343116238185: 10 359 7 898 36 92 9 +400086541453: 837 478 54 1 453 +6515098: 63 25 7 270 254 +348: 30 4 6 +239609608: 1 1 6 19 5 33 607 28 53 +7414288540: 49 42 859 3 5 4 10 +96771: 6 200 1 8 43 1 37 56 3 +1894118717: 281 674 2 176 68 3 7 +6310857469: 80 8 6 160 6 3 5 11 7 6 9 +6182479: 6 72 92 77 2 +1032: 925 2 57 48 1 +1091687: 8 8 2 736 2 6 915 2 999 +543443: 92 1 59 3 49 +165718061: 2 7 6 22 24 445 5 6 5 +610745: 754 9 9 1 5 +5361319385: 8 8 2 3 777 193 76 9 +6159: 191 1 4 907 61 5 339 +493628437516: 7 421 75 9 5 9 3 7 1 886 +15757062: 104 293 147 2 9 9 3 51 +11216: 79 480 142 2 8 +6822: 23 13 3 7 543 +3388859842: 5 8 555 43 87 25 170 +8334: 25 77 9 75 9 +2250866676: 8 7 29 9 3 9 42 5 7 86 7 4 +89826408460: 4 411 863 36 6 457 +153485: 23 922 642 7 437 112 +36262905: 3 4 4 61 2 571 1 5 13 5 5 +22502497: 970 280 2 9 2 498 +2331369: 84 70 3 5 900 5 734 27 +22804091: 54 711 60 593 869 +24912366556: 76 4 88 3 700 607 7 44 +781102: 324 8 7 20 39 24 +341021: 41 9 881 3 51 46 118 1 +125012160: 48 14 56 952 36 45 2 +8601135: 928 45 3 6 9 20 971 17 +580850: 29 5 40 96 712 44 +26137464000: 61 1 95 10 860 4 129 +86455555: 868 9 199 1 5 +353502837: 5 11 261 66 969 86 9 +1766966: 243 665 65 2 908 +40398720: 8 59 727 795 64 +15777929: 1 36 6 6 886 8 6 35 +26640: 12 14 9 26 7 52 2 7 7 1 9 +6825793: 8 245 8 578 6 2 4 759 4 +7785132: 64 310 18 2 7 7 8 9 3 +5165452178: 239 350 658 34 633 +41027: 607 6 4 50 406 7 +109810788: 3 1 6 860 2 4 9 95 7 1 1 3 +3302: 87 63 8 60 27 226 7 5 +9182593: 1 5 274 62 98 2 9 2 5 73 +111608008784: 5 9 702 6 213 8 6 3 688 +82474315: 4 407 77 8 591 20 51 7 +3266534: 4 211 645 9 27 6 6 2 +235297: 806 22 7 5 5 8 7 26 71 +2902992: 12 32 5 8 67 1 36 38 8 +757673: 39 75 7 37 98 +5392: 852 6 13 26 241 +30316819: 606 5 1 15 799 21 +84160936096: 8 9 153 530 4 944 +18573: 2 2 9 7 72 29 397 3 +3400587: 339 9 6 9 88 +59117080933: 6 58 4 707 23 7 3 8 5 8 1 +709244949: 7 164 99 8 7 6 8 5 5 8 +256666: 631 3 4 3 380 5 30 278 +149736926: 594 4 77 5 3 21 6 96 2 +51400927: 8 69 782 45 853 +24013402569: 7 9 3 614 54 584 98 9 +41468325: 2 74 88 3 8 15 382 769 +80871091: 36 3 720 1 18 25 1 2 8 3 +437200704: 4 10 7 860 4 131 5 49 +52531364: 52 53 136 5 2 1 +1159045536329: 60 1 95 2 276 79 2 5 29 +30401139: 3 36 415 44 92 1 5 654 +855593039661: 7 8 4 7 1 3 6 328 2 6 2 66 +19362670: 1 314 442 87 98 3 124 +9366020992: 124 88 15 31 5 8 541 2 +79281216: 411 66 28 742 8 +2185054238: 79 63 8 343 2 61 7 40 +53587566: 6 918 47 69 78 3 +356106996: 4 5 8 7 96 92 9 175 7 7 4 +5372: 71 8 68 +42886097: 561 8 78 6 67 140 737 +2103466457: 4 72 14 60 9 73 +724634064: 8 2 2 599 2 8 6 4 26 2 72 +8940017483: 73 575 5 39 9 135 98 +734376: 2 4 62 455 888 +54967: 24 21 7 8 214 86 787 +25455: 2 3 8 467 8 925 3 3 3 2 3 +1706: 792 13 901 +16791586: 6 3 582 4 4 27 26 9 75 +1710311: 85 9 85 4 13 92 8 98 2 +178: 90 81 7 +2750345348: 5 7 298 853 8 4 4 3 2 3 2 +14913758: 9 271 33 16 264 9 58 1 +26509773: 4 6 104 10 192 13 771 +317152: 4 8 13 8 748 +54215093: 541 1 150 92 1 +14652360: 24 4 2 6 1 297 61 2 +147456741: 46 37 318 72 68 +135995340: 755 18 9 530 2 38 +5483610: 41 568 288 2 9 +265251335: 7 7 9 9 7 3 34 64 2 4 3 5 +444155: 38 74 566 78 75 +126994861: 23 4 157 3 17 4 861 +5528579: 6 5 3 8 8 1 3 7 7 7 34 624 +2198016422: 646 2 1 8 424 424 +16522: 5 7 9 9 51 +159183412: 320 141 392 9 52 +650538326: 6 46 7 1 26 8 4 3 824 8 6 +77169: 237 65 8 7 5 69 +49257063: 584 1 842 56 7 +51989200: 553 94 6 9 56 4 10 4 56 +636276292: 357 69 1 7 9 9 41 +5011587678720: 51 320 643 32 7 678 +62832226: 9 87 2 6 35 364 3 226 +324973544: 1 4 6 9 54 9 735 44 +43107424: 6 62 423 63 93 4 +1329: 3 7 11 1 921 +8127180: 4 5 2 35 1 5 9 43 55 5 3 +1646401: 6 276 1 7 2 1 7 6 8 800 1 +15569384: 37 40 4 763 1 597 787 +553222: 2 78 2 5 349 57 +667200: 91 610 24 66 12 +516301112: 573 630 6 365 9 1 721 +1375256534: 764 9 28 267 2 +24960320: 229 2 5 23 494 14 40 4 +54337879040: 7 2 37 3 3 37 878 98 5 7 +194164: 57 85 4 6 30 4 +214404579: 127 55 5 7 877 4 +91527: 3 6 73 5 2 7 +2551884: 287 616 314 9 6 +48941720325: 6 7 9 74 6 40 4 6 2 9 2 9 +9203: 16 575 5 +14256435294: 348 5 681 409 4 +3318458: 83 563 71 697 2 +36500: 52 7 32 6 62 +16233851004: 143 9 4 6 4 18 157 2 7 +130073: 73 9 22 8 9 +41452: 7 1 7 7 893 8 8 4 4 6 54 +29730573: 81 4 8 6 6 5 82 6 509 73 +451552: 27 147 928 2 2 292 8 +3607962: 5 67 97 3 6 37 1 784 8 3 +26553: 9 4 8 5 5 3 4 653 4 6 33 +99871: 3 26 67 3 871 +7974822: 79 7 431 6 506 +1065219: 42 1 44 12 48 771 +5804229: 602 964 37 58 1 +583501: 1 53 20 3 8 19 8 +8588035: 8 1 556 80 38 1 6 5 +2580648233: 9 7 2 8 1 6 727 8 6 9 9 69 +4013: 8 7 47 541 177 657 3 +4153099: 3 4 4 2 3 1 15 3 6 3 615 4 +232804: 539 972 51 533 5 3 7 +2309375607: 68 6 3 1 5 74 7 195 1 8 +769560: 3 90 7 40 458 8 1 6 2 8 4 +1016784: 78 7 6 6 307 +1178617147: 864 3 489 278 3 5 +38149143: 6 69 282 57 69 +665229: 98 7 5 67 9 580 +4130590464: 406 987 78 33 192 6 +447: 4 86 357 +3914899837: 4 2 156 4 4 66 3 1 1 3 1 6 +56259883189: 3 48 8 2 6 92 2 2 7 28 6 9 +2622: 12 7 4 2 74 +194536: 97 268 2 +31098614: 921 6 97 72 8 78 3 58 +948415: 4 4 8 8 96 8 527 67 2 4 5 +2672: 752 90 680 554 596 +476795: 45 8 6 6 9 6 4 6 5 9 4 412 +20759512: 2 6 8 8 4 938 8 869 840 +88817568: 97 6 7 6 2 668 9 6 1 8 12 +670085900344: 351 76 350 7 8 1 4 49 4 +755086: 4 3 7 840 59 730 9 2 4 +432946594: 432 946 1 49 396 46 +620888945040: 79 8 6 3 49 7 510 4 91 6 +9711: 856 9 839 168 135 +194558935285: 2 2 772 237 63 4 285 +758: 7 750 2 +6280922826: 4 32 9 3 3 7 6 5 7 81 9 +138895: 8 322 4 68 95 +1025917474: 6 30 395 917 47 4 +164811353: 4 3 67 35 66 1 356 +75636042382: 9 950 7 38 88 42 379 6 +3167998: 619 12 29 960 5 +1481204467: 5 2 5 8 4 175 2 4 38 8 8 1 +9923388: 2 515 47 23 8 51 12 +541863871: 541 86 38 7 2 +56829631: 3 5 7 676 9 144 632 1 1 +3465276611: 5 5 2 9 21 11 25 1 613 +10455518: 2 9 163 4 221 8 +45296160: 99 681 3 3 7 85 6 7 16 +142800: 8 6 7 34 2 971 1 8 5 50 +91872: 30 3 30 498 24 +55018317: 16 95 832 472 39 546 +4901324998: 919 5 77 83 53 8
\ No newline at end of file diff --git a/2024/day07/input_test b/2024/day07/input_test new file mode 100644 index 0000000..87b8b25 --- /dev/null +++ b/2024/day07/input_test @@ -0,0 +1,9 @@ +190: 10 19 +3267: 81 40 27 +83: 17 5 +156: 15 6 +7290: 6 8 6 15 +161011: 16 10 13 +192: 17 8 14 +21037: 9 7 18 13 +292: 11 6 16 20
\ No newline at end of file diff --git a/2024/day07/solve.py b/2024/day07/solve.py new file mode 100644 index 0000000..4737c9c --- /dev/null +++ b/2024/day07/solve.py @@ -0,0 +1,38 @@ +def is_valid_entry(ent: tuple[int, list[int]], current_result: int = 0, current_index: int = 0) -> bool: + if current_index == 0: + current_result += ent[1][current_index] + return is_valid_entry(ent, current_result, current_index + 1) + + if current_index >= len(ent[1]): + if current_result == ent[0]: + return True + return False + + new_result = current_result + ent[1][current_index] + + if new_result <= ent[0]: + if is_valid_entry(ent, new_result, current_index + 1): + return True + + new_result = current_result * ent[1][current_index] + + if new_result <= ent[0]: + if is_valid_entry(ent, new_result, current_index + 1): + return True + + return False + +entries = [] + +with open("input") as f: + for line in f: + line = line.strip() + split = line.split(": ") + entries.append((int(split[0]), [int(elem) for elem in split[1].split(" ")])) + +result = 0 +for entry in entries: + if is_valid_entry(entry): + result += entry[0] + +print(result)
\ No newline at end of file diff --git a/2024/day07/solve2.py b/2024/day07/solve2.py new file mode 100644 index 0000000..f508ad9 --- /dev/null +++ b/2024/day07/solve2.py @@ -0,0 +1,44 @@ +def is_valid_entry(ent: tuple[int, list[int]], current_result: int = 0, current_index: int = 0) -> bool: + if current_index == 0: + current_result += ent[1][current_index] + return is_valid_entry(ent, current_result, current_index + 1) + + if current_index >= len(ent[1]): + if current_result == ent[0]: + return True + return False + + new_result = current_result + ent[1][current_index] + + if new_result <= ent[0]: + if is_valid_entry(ent, new_result, current_index + 1): + return True + + new_result = current_result * ent[1][current_index] + + if new_result <= ent[0]: + if is_valid_entry(ent, new_result, current_index + 1): + return True + + new_result = int(f"{current_result}{ent[1][current_index]}") + + if new_result <= ent[0]: + if is_valid_entry(ent, new_result, current_index + 1): + return True + + return False + +entries = [] + +with open("input") as f: + for line in f: + line = line.strip() + split = line.split(": ") + entries.append((int(split[0]), [int(elem) for elem in split[1].split(" ")])) + +result = 0 +for entry in entries: + if is_valid_entry(entry): + result += entry[0] + +print(result)
\ No newline at end of file diff --git a/2024/day08/input b/2024/day08/input new file mode 100644 index 0000000..8f67508 --- /dev/null +++ b/2024/day08/input @@ -0,0 +1,50 @@ +..F..........L............5....................... +............................L.U................... +.................................................. +.............z.L.........5.....4........8....1.P.. +...F................D..4.8.............P......J... +......f................8....z........U..J......... +.......D..f........B..o.........m..........JX..... +......o...5........F..........m.......6....X...... +....s........f...n.....54.U....E................3. +....F.......l.......k..............6.3n........... +L..........z....7..U............E...k.P..3b....... +..s.......D..........h...k.....G........y..m...... +d..............o.........X............8...n....... +...........o.......D.......J...................... +....................z.....1.9....G6..Y.b....y..... +.d................4.........EN..G.9.b............. +.......................7.......................... +..d................l.........pc..n................ +..............l........1Nm..........G..9.......... +.f.........s...7........1........E........X....y.. +.............d...................6......v......... +........................h.............B........... +.......l.......................h........B.....p..y +........w......A................................M. +.....s.................O...........p.......2...... +...............9.........................B.b...... +......................w..0..............H......... +.....................w7.j..O....................e. +.A......Z...................K...h...M............. +.................S....KZ.......................... +.................V..............x................. +......Z...............................N........... +.......................a.......................... +....A..........................K.................M +.......Z..................ON.KT.........c......... +...........................YO....t.......x........ +..............g........w.T.............k...c...... +..........................v....................... +....S..................................u.......... +..........0............v...............c...e..C.p. +.......S............V.j........v.......x.......... +......S..0W.......HT....a......................... +A..............H...W..a......C.................... +................T.2.....V......H..t...u........C.. +.................g.j....2.........u..t...e......C. +.........W...........g.......................u.... +........W...0.................Y.........e.tM...... +................g..a.j............................ +.................................................. +.................2........Y...........x...........
\ No newline at end of file diff --git a/2024/day08/input_test b/2024/day08/input_test new file mode 100644 index 0000000..de0f909 --- /dev/null +++ b/2024/day08/input_test @@ -0,0 +1,12 @@ +............ +........0... +.....0...... +.......0.... +....0....... +......A..... +............ +............ +........A... +.........A.. +............ +............
\ No newline at end of file diff --git a/2024/day08/solve.py b/2024/day08/solve.py new file mode 100644 index 0000000..9dba99e --- /dev/null +++ b/2024/day08/solve.py @@ -0,0 +1,34 @@ +lines = [] + +with open("input") as f: + for line in f: + lines.append(line.strip()) + +antennas: dict[str, list[tuple[int, int]]] = {} +for row_idx, line in enumerate(lines): + for col_idx, char in enumerate(line): + if char != ".": + if char not in antennas: + antennas[char] = [] + + antennas[char].append((row_idx, col_idx)) + +row_count = len(lines) +col_count = len(lines[0]) +antinodes: set[tuple[int, int]] = set() +for antenna_list in antennas.values(): + for idx, antenna1 in enumerate(antenna_list): + for antenna2 in antenna_list[idx + 1:]: + row_diff = antenna2[0] - antenna1[0] + col_diff = antenna2[1] - antenna1[1] + + pos1 = (antenna1[0] - row_diff, antenna1[1] - col_diff) + pos2 = (antenna2[0] + row_diff, antenna2[1] + col_diff) + + if 0 <= pos1[0] < row_count and 0 <= pos1[1] < col_count: + antinodes.add(pos1) + + if 0 <= pos2[0] < row_count and 0 <= pos2[1] < col_count: + antinodes.add(pos2) + +print(len(antinodes))
\ No newline at end of file diff --git a/2024/day08/solve2.py b/2024/day08/solve2.py new file mode 100644 index 0000000..1642e35 --- /dev/null +++ b/2024/day08/solve2.py @@ -0,0 +1,35 @@ +lines = [] + +with open("input") as f: + for line in f: + lines.append(line.strip()) + +antennas: dict[str, list[tuple[int, int]]] = {} +for row_idx, line in enumerate(lines): + for col_idx, char in enumerate(line): + if char != ".": + if char not in antennas: + antennas[char] = [] + + antennas[char].append((row_idx, col_idx)) + +row_count = len(lines) +col_count = len(lines[0]) +antinodes: set[tuple[int, int]] = set() +for antenna_list in antennas.values(): + for idx, antenna1 in enumerate(antenna_list): + for antenna2 in antenna_list[idx + 1:]: + row_diff = antenna2[0] - antenna1[0] + col_diff = antenna2[1] - antenna1[1] + + pos = antenna1 + while 0 <= pos[0] < row_count and 0 <= pos[1] < col_count: + antinodes.add(pos) + pos = (pos[0] - row_diff, pos[1] - col_diff) + + pos = antenna2 + while 0 <= pos[0] < row_count and 0 <= pos[1] < col_count: + antinodes.add(pos) + pos = (pos[0] + row_diff, pos[1] + col_diff) + +print(len(antinodes))
\ No newline at end of file diff --git a/2024/day09/input b/2024/day09/input new file mode 100644 index 0000000..05fbed5 --- /dev/null +++ b/2024/day09/input @@ -0,0 +1 @@ +5431847070532496548683598739901860448277147866475038393766447341891019504128283373957976605946436441241236811885153744258354395071637574322351864096571311551468137491833165146849824580464475754760251418232452114431434259695642141245709431459954722698744893399714126740663440275179501517601918806129411288749118168218139469993280814857837114254464734195195312581984488698125727477534117156511558449647991544166549428852446699158325945697464880859478338398358989692786506371298875262629775220733211319536949661409681177899661819133589587837478769915792119798458492485427985488801357232373138732236748853462233448396097281084437925358378424490596177228014974044637170281031411429583021775820273180839559456619452796556872676571556132186797984630934680644481779522232033418913761869766059334561685786914061585846271165837225977234962171539171385066548764879325678073916884925119179078128940908332557416655183248323334358765491852559446282862866349124154590119681586042429512902389444932342329139884998043265179483952358664763341471227294624507498634144468012513455669730253344542554438142798341903946752622894422519240385796399363717319304814181892109738948665244361816480626477334749981979308584646175341164573480549421979318518594936370651431662318398947936837193535164589903222891022332885625080504141242599545644433935715924677964665418679330388028609495768366198370316998746089196271168416567214661857542999179081936071603466413839118250589241209020542762287693592767238247623811266816968276402382293979624192268668637036804913553238444566923090766430739958608386294233277545111832373416143936493751532758733280682014363414117968555347599278345211412189268587111399691082246434754984853280343750316443484873967790503155417985875354106379479357516451925436107072982673394312215523339155295820782375189785144345754763268799346793342314856097703855315398459116995688511766962837349459926842559986423586723942724897226261409562133772359969259862418466838896426851973163817027988413995770144848119225254288424049701995727140737943455214449560656338294728439759809799763425997920276967372080482878507424779452694873427362228081697697985177836773155381675733764259506619722139231248145764987187508975187280418228215517708861937121696383262778212815859213169451298698526612563886932297721459123695633235302241664520895115475321499824565659598696441059363272335349832694891161511441216250455735428875393038226162707338195613887579835648438174479117532744286042476474265937392422189395238882743338903911918571174478959075613513737752812365929031604634571198154518583489648311478180759234109935711785976621932724132957994329794475268026605132326181796042177116298720353424855067585095136516743020811142974945483793498939937644301322215938744669865280191033894695819215193477768848168133163219358376716855991487125725866149302929881931999942465855924986277446491375587968646039634442274364953762114649513686272281165175296277741949969276412876826675288238413427584350795131174936246533427546224472971880525188156967946995612471892837333421346813787195408235144669663817919566509060434235595770635849325288937495822745779459628058204660688974221776926399406658157148716541346183613151106187655651894691184227242674155024867848543518248733155526834036987190526586731111846461158470389516435668793433403843303636626710591756901917271960682788844096558636925272659527193180931568955124917728989323298823884730215727907081776268471195634592442322224749917255769174554580974318672542145684258435813469413454657331533297624961571098274383128826142886178892896249544976501783668999656618538668647427649245173273109879296856838117951162694076988095889976892813789356179113263330286485547976988339435725987217455613809148996029371559673755551164865778172919673553131246865579777031838685665230718288143530352130504667635918445851385520546274251648145730983494767031286316275154738369898657782476611269882092114932377881382117471677308269641034609577675451459673909135686710902448605742824844852396447251184813327923498011253815153549116224376869328657611831245696483849429232628360672338869530144294488472369615254273876654195013263545895498946166529765504417257077403339731368261688225543913199508015835855453738493499706884363165179243835670161917635535454590386649477885568876782550263443936690649136261936517612734965878147419729149361814724812069907061167660244295136648714745792558212553407576435452294783565860592337418941679648722853938298663830662897399473627350178498566954192399692521691490781880599410569351631788576024278298749293113128133936302497841555687342615269922625163352926888784429425338864368475649933262803619656110664834792326735096114311143814172044275432864185582792202877417961473942905140498314968638605678798454107358102617525651132698108560129633886387224458256797158581349380354465524548433159353416849616957939572242353134341479514420511050167317825682911142548297427835607434143149268044997798807982281017936513258518752391722349518631153686875245168026682958393581692515842980854270712384186672355487212831419532101149595519124299607365247366797434499964698874211832812980248426603167274296247872122862519352718217245244493752717783346017458931399278736485964182161259532641671397764094897033317026745451674435156215753752138630722836869394405610254496366388409649862261412399805284145277686535226752122116122767839474665254578914245869939635226613853194766176615640251399949267526447101668701391282857391214324299343781987865309787275174816213548139341867545582265572149374486153645057447465429321122056782781809957832642428762341572468231932697736883199115341415332785455358889719675787912855144691646552619817441869788564973758837281375664716326441558945013361611246518925538654127979454423763425392761252151759138749292749889739304586737120401054519772828367143187555363611441175938973189339919808277886526399775429872681990473255823889804341127553189632688594119141865182986546129158577968161453746654948322733083745621761932594354981440252123484728118615486673829042445945135023561779452933647424106686341536495744311366944487218461185940868215533122953492539720554357507273383560645494241099991834446978507416648557144869117045571079578588752041478126235922426661186856483544499922633585199453902063519787618156687014941353467818514199522218504175888882297877331760569055769938605349402241876764763379232658184021956091159626882997548844291358849280453331457351541385827619557838727085801215291381625633649588895582188577315191489866463164105610957977126933527590435567916152253672274532189916395728637693374121609777673053169914785423299312831424484869627379342023236269524839779275365945137482542974381722269866487037366814539291139086411459699420214480334366884685785772471212538243428131122333796856468164612879981426866512659094108247227015267522715549835217836258923253194315417415453017546920406713761675413932111679356824524536724729571797572725156255472228169580954986296563661246166083942377114546758556125757531273388933769377121130639617229248239196887153124163618315501511222486322930534746346361525799279318447446101965281848911142356964336133535578492268339398699379993354742878356745502027765864908077703918651589807538204210701810772598686478379089858478457158884642821358382184865315481732687776695696463699559552836522162114832160102745186118235073487253473848523280145727852239717218239911567567871649351364811786285052762735589278205485528953107270447920776891175836897938584663927582439513719446537235197026636175195242999765437860387586132086881828419981412171153220435614881951521772467671784643749191467288509468674583471815524372198795976625703121236330505782243316836042267341148494592549423223935396822729106681568726341250758072556647827087231792196430215967654575116286175249947781771380751436633426865445198640987941324252779916166394388922869624341829627063971459552678734611751644251571931270876237882547515143503622626151887141601041755014364143481643607877531370558777745851817098602346822746812945882715636942459665217532809177673560679438715995627048873754723474664633392691227972489290878115727977689474347937749968623215859286936582937393623823459414965135637690237520929318239052191270279668948485346585222684452250662972849397733360246253622698688072644163655036256962566852308677305948788382418735518355103314285397814724299194275245965419331642772255912979776015572581364268398830159554921111957863771446199315267932548927786637172149446776608256581381681950539443691688339712582774109526635076499265795292982934168892652476765344434874937263671478143288832641665347482482285483209584371050674799709863362062892063788921745356217059912326367017289784175456242878193274851654522714784837793120656851219436706831172514746875564240319577236920584420834589232888449349713730888810687276208882858238474749968333716123837887936528651338994440628447748972953646303022458935784286714331331833659613146455921298629384271751625431204831837242464121773138593124963270828014565875209718549645214610592544561762348362265288979219554052149214957073371584649429178317294311606191321361545296228316803211337540106774845548106141681184254330296067841619626084713394279885817948681193752530976058477111106925168545614371578698738234278218902583513723764847688232661291561083529046963056442549493478883691667046972542815848956763528699244423306066552793919728826887674035232141165019793917705920328363153072175059497031391222284345366745992652793794581178629620644173259468841071938470724386307627829074849991122893387277784165303872825459791985552176756541499678471791766228836315584186502452542741428389444059468359514561918073551313631072288370168921177847859255462895331885217012757426868976849568728259485836907386861565338973704239594422423524736448846662911435441053784043453112466084897851439928307412597940202954623945176610674955659346241391488035988422528139786466606088774868132421254026107289834271684410947075942153222937438848944223859953514149597156701624452579153273815651723012878841489991437626287212621626938452549092455997791542838720925129503438921981735074653842582172694493196079376431871828911175727621771283219316809164963942995661516198525813213777881219751736238985262611612658434622783114349369999853586359318282736722734431542442512485962350563469258922704623799249697861273566769947851710115280673778339225465539833882981378492785318263458289851064963527926555884884185197101574589439902325919628519739559986437581769285214735171311844741821680673863556173186642594445545037414324275132177740303456454212222113945624553653207740414662769989163778719692267160386531252189537983291047575814991644745593349942694355546246299851334138342951384380754058222211567091808687635733113168942949149426543761723439761382913521502283106014477173579293472692228779646418527053498131599721301261876175984637884720145616852095149084382688277620409874578855781918881559159752264565618033637551907568997765948889697996136260539953463180474486919530943420964725638757311741836536623973619165224184858173882353138723768772178912119029609641495371102220563448168252364125302116259144543145418077792624272246876012406979559964648896574655832220644699312953154332905185284987925254563370909476514838187255833182281189479845108766201316579561862614772160113396328868579912207094941437665238546318361630992946302362674693589443388084918330218018319379955588709378992766832275622582817558947016312221833526653216918917669942709081412528357967866325148655635551498834863031324077793655823424167573123050276842206028989541609816262237384281738834798636748822683857635938785735566220786893723220969273752969685283224367197496157713884751996685472983211112646887111965733114667524633685405932468421708127733481965268512788692679994595218868814048719510949473743681966476229975261348817488407525201282448429876643466436691931821999954870372789372026443868311361986243965238476328413940451232344628438478424559251865921683112566628220603442868858801181898474573061657486475566544945624677946213921262309623364331212481468041583883492118873226604939487198946073346762531960454442849629882818599161185511576374632682938186342287824325913334809618845946652887786398149676275946915693184114919365549696449157617461308545805916166931676853347424959647698852687967682378663512501052252264353473606016312133139574229774321069504033623623314048335389217752379186822025232564798762531191198147251451885167738810884865751783607746892691183284314014159625162359225995374855294973905875601139953971621356838125288873658513829059228389374112267146524813923696995951951060327335763063627046339613559551394498196733126078166130562675833739662344211586156339637271159755435888369058949243175117123943952521412379998885294943103067231395836136787785658060653260815125907869911826365658888396984041281454992028636972117951151279392776705472374131297311589235743235989821682379585945569692149823887985893357117874302452779615544383259451596565913798436675971210761720141834924686675333948683445614461074624939449746893352546524664286772817109263912322205494771580938955619393219919827714954357637326456321903566188012597138194479919521971045314557684492978447636471393121846732266441127076929623452516469268515317351628916587653659981342524117303834251237803839852555848889253361377523385888536714181952737070557349104427543995206220468098124947165735885399881037441662599849291148828619247425471556775383346452956367907881245461105521535493449371873849398575678737963748105473965877731143931917784438675510391816833918212926191423283193947744615997302247631170475076353034433639647526832483194840657612487422175442682438649468519756889331194188446571101379148474551622164026951155676372462365825337962393944826462553324532734675843069875692998515352629395470319465398696685446846256555739825487858185267130113083709996998944674751374025224866392743298866964633489199398443821877266932608199922665493786878028334675496229138994519344228994381048787918936325311876626788316492888046542231421329814532287484238660819780397322812293676472113115553936307856594873801385746328781850621387995451239347194331873118143956741890317649961053339934384753576873839373818011858962308068359681448187801477714058676777505220214574982396208164807666165465663577513256148131332588451217389060866941629865425474727775594422106344629184884146328247343243942345149242441738157138673148656441659746108697922042559242831428586727636826102477314240597591296994586154382323748697715168543617925131463291175730281711909950313171598913439386313548644112258366426873577370455121271858392822589810897696318271861971688392917271768982498251736437464038884378275090401950266581985720657245911546661988628195404062274023501219958745142910587599786710989528166993146288984074704035181498403498342026189730304114186818154894226128991350261851553634853257717894477792924480308757559153103453391355714177687379841772153859187888991944928974816166394438531288526029429370827118338158373215557653117382902747882350289342573567566591496621125720149010156192333939348577768371276173254839457341579052884855899521455687826219552559353379583287743033373612237922344221398523743885887722145446159091858835326923143598736739776979383162124240376176724756902714422972877386456950359015679783254498665554197313386574946684672440649448928046823952452925875883123474764275683163247982559056783385108478641526541624633941307929665173822474104635274379276669794170231970331184579771981818713214303463802831593179696066521869822420628133599083798358617070787562878410639996794328985566419669725183436737934471487348293520763025987951905770247895541890291192502974213273894629429398517496269934718745472252852785799067413916332610907571353097806547719675572225686585437313706289764926897495283399504894865225947940671578373835792384915864517240451857897837474158666738127882626758926834954212234737347096589835594052622629782514725228801653459682113745362183353647597457236010442151759884878312124331477432807798334447873457868094866830917015754699393346955052658889968069276211835255266477346510198639736226638637348634998789821924918536665568703098683122372819322311298938894359379639133780835641406350463468184916611188867842371777442592313685833473444698689034551998113048234791762027446146727025544042103813784261583650848618484157775543396899383931947511211562491598253548798817799677298815266868175529218241572267174813597458635056447033653576279680728866202215641798761728465765398039702536851465601653688836239621484579886494949445518139504085564648403876616138898496977053705635456441166131237224212132457566818246409089255141604655566937294999779883239684306324139396662378187398583547383351442099886790745214231652707661893686852484253311575649883256286310728911168770135847847942505813249239613554658598458912756751555288445954364137168460381974352139819957517178997591758873416983229795354474556256222931289088956288236930765034996259985143391893819191619668299219457076656449957972739232707651283426189323173271511414963553631022738796229234709891788138421335962389202938472745429665429421449451828085626764373551669023288756897584137125288852204671513465741496258695431468534328534786204128332247938047578049193590876237562413251153815982503377716515745527975074111071683263628779365586288331518624267254838841421857507639557142984366667415719537651198812476439941893225313178772634404228859482432389529689179427561264206830828252847099196970992621215159239039191873638118353095751690804720759335482625874568869589758016947947722134828779851791229873453645154499253778621951665526763263812750673364188063315663685536786662452774668460425338448652267153396698403794958557117715707363427158414910714223613042738143262253545414445189734445315660832126774686261890207990951637852027117940866025941189112113591465909359747259208783322997964321395272386512286648988834728496902721734886267547847471528672747847205387574295736985241696516932844212494268506043999992662783792963516320447644674575318472898870224758505820603968302945492310875523643925961688303462183260763231418028951332213344725539975677345186234844846882656482495455602511518890873842883913163495822973217267608421684631899788622362729088357511278117256797634947232283132985573467816042973454892624277734328412908178282097447928846043263685891259571019642339408836131653632836323611554584763366633141913941913514839123396930803475957244302131978337446772164529446735719434462040324016531972388438518097179281232588371466482375313721177284703522295719881595897528431976558461796918764460253069864598923894166764378191789811405427797728366039795560523235307788142311586556943966573542562778297041212055997021434276525392632292627028243972111236516045344554731635358525661482319167618087669596573080965369323656464519117444929754516615864868623247905514213980949883735267281975164653387557709597488746917291354321839956233319716495715332934056616433602361854259165844846090727098261292975468959076396531881222519084273968952676356676517184209580109527865832358621375142707298585957705594597037138119263760155135724927656715688663178947673197722867479666278737285755951147892235479733939680614837681327436117657554745358946584327728125026319675496256103242646557956076593121132642617859102832225453314322344922816232297078592240951327184982997272807466668041439188581269891715594611336035872923113621737723764275734260183252964896487287778175807776874023883020938542177574348674671731384857458727786498574318365160439216302981267031568420557343643518103231998888608240128736299952507093531952568543364344277955389690521695784333592258666685953773303886807356237197155570385415824262894017205735472558107075984966103557507538768451641875131653916934309186813794405290166210507279741191239829434593938221811876947948319740367520725730977275267584617975723090554087545923817529938752614582655064265520633957992758664213442269404450999660277698162279969594648110484768509395459144512625749275497361337059832341259675242276911271246628238676841296573698947212413442657350581068345095715399782690255967584390922549567242112617131694895561356960275436202317131
\ No newline at end of file diff --git a/2024/day09/input_test b/2024/day09/input_test new file mode 100644 index 0000000..5ff5aae --- /dev/null +++ b/2024/day09/input_test @@ -0,0 +1 @@ +2333133121414131402
\ No newline at end of file diff --git a/2024/day09/solve.py b/2024/day09/solve.py new file mode 100644 index 0000000..1b0f759 --- /dev/null +++ b/2024/day09/solve.py @@ -0,0 +1,35 @@ +with open("input") as f:
+ data = f.read()
+
+blocks = []
+for idx, count in enumerate(data):
+ block_char = "." if idx % 2 == 1 else str(idx // 2)
+ for ii in range(int(count)):
+ blocks.append(block_char)
+
+empty_seek_idx = 0
+last_non_empty_idx = len(blocks) - 1
+while empty_seek_idx < last_non_empty_idx:
+ if not blocks[empty_seek_idx] == ".":
+ empty_seek_idx += 1
+ continue
+
+ if blocks[last_non_empty_idx] == ".":
+ last_non_empty_idx -= 1
+ continue
+
+ blocks[empty_seek_idx], blocks[last_non_empty_idx] = blocks[last_non_empty_idx], blocks[empty_seek_idx]
+
+
+def calculate_checksum(blocks: list[str]):
+ checksum = 0
+ for index, elem in enumerate(blocks):
+ if elem == ".":
+ break
+
+ checksum += index * int(elem)
+
+ return checksum
+
+
+print(calculate_checksum(blocks))
diff --git a/2024/day09/solve2.py b/2024/day09/solve2.py new file mode 100644 index 0000000..bed2825 --- /dev/null +++ b/2024/day09/solve2.py @@ -0,0 +1,58 @@ +with open("input") as f:
+ data = f.read()
+
+blocks = []
+last_file_id = None
+for idx, count in enumerate(data):
+ block_char = "." if idx % 2 == 1 else str(idx // 2)
+ for ii in range(int(count)):
+ blocks.append(block_char)
+ last_file_id = block_char
+
+end_seek_idx = len(blocks) - 1
+for file in range(int(last_file_id), -1, -1):
+ file_block = str(file)
+ file_start_block = None
+ file_end_block = None
+ for idx in range(end_seek_idx, -1, -1):
+ if blocks[idx] == file_block:
+ if file_end_block is None:
+ file_end_block = idx
+ else:
+ if file_end_block is not None:
+ file_start_block = idx + 1
+ end_seek_idx = idx
+ break
+ else:
+ break
+
+ file_size = file_end_block - file_start_block + 1
+
+ empty_block_size = 0
+ for idx, block_content in enumerate(blocks):
+ if idx > end_seek_idx:
+ break
+
+ if block_content == ".":
+ empty_block_size += 1
+ else:
+ empty_block_size = 0
+
+ if empty_block_size == file_size:
+ empty_block_start = idx - file_size + 1
+ for ii in range(file_size):
+ blocks[empty_block_start + ii], blocks[file_start_block + ii] = blocks[file_start_block + ii], blocks[empty_block_start + ii]
+ break
+
+def calculate_checksum(blocks: list[str]):
+ checksum = 0
+ for index, elem in enumerate(blocks):
+ if elem == ".":
+ continue
+
+ checksum += index * int(elem)
+
+ return checksum
+
+
+print(calculate_checksum(blocks))
diff --git a/2024/day10/input b/2024/day10/input new file mode 100644 index 0000000..02b092c --- /dev/null +++ b/2024/day10/input @@ -0,0 +1,45 @@ +012589824304345454345653403898787654310365890
+323456712215216783238732312345693201223456781
+450144603304306690129641002105892100378901672
+343223454456987601234553213456743898465432543
+234019765567898501246764789122156784567643456
+105678876678983454334895601033021093298932167
+987619989569332569543210592344534580112341098
+294501238410221078632346787659645676903654348
+103410549322101010701458698998765019854789239
+212321678989230127890569542345674326761021178
+101436769476541436909878431089781015432430087
+212345854300498545415678921678196727034567696
+210256901211067636324105670543067878123678545
+367107810562109897013234787102158969243989430
+458998765673456708943101496234549054552170121
+321043234589843217652112345109632143461078760
+423450103477876876501001232238761232678989654
+214567612100945983492376521045690101021234523
+105678998761238012385489431058788987120098012
+210987787687439121076378942389005678967127656
+309456712596528732154307875470114343458934565
+498349803487015678567210566965223062101703403
+567208701236012569458923417854332176019812212
+610119654345643454345698706763894385498703389
+231023543210789843210789210012765294307654471
+132984980125632310107650123498874101212343560
+045675670346541001238943210567943079810014541
+125036561257892890547765300343012986701321632
+034123498766783087654854301250123875432430701
+945671210345892167898901232765234566001521894
+876980343210763012789876501875678987189654323
+567878432198754803650105432984789843278789010
+438969567087634984543215678793212658943898123
+821054698456125675643454349783104367652387654
+981023789307087676012067245692323456701098578
+672316548218996587654198130541214987898123469
+543007437100105498903210021230301854302210158
+432108128901234567810347130765415675211000147
+543219037654323216921438941891034986732789230
+698349898341010105434567234567127867845654321
+786458723038765123457870123898221058965421032
+665467012129851034566962123765432348974330541
+674398543122345643677870054878901067889245670
+983287654031298762986521067965013454900196989
+210189876540107601095432398874322103210187878
\ No newline at end of file diff --git a/2024/day10/input_test b/2024/day10/input_test new file mode 100644 index 0000000..40a0591 --- /dev/null +++ b/2024/day10/input_test @@ -0,0 +1,8 @@ +89010123
+78121874
+87430965
+96549874
+45678903
+32019012
+01329801
+10456732
\ No newline at end of file diff --git a/2024/day10/solve.py b/2024/day10/solve.py new file mode 100644 index 0000000..235fbdf --- /dev/null +++ b/2024/day10/solve.py @@ -0,0 +1,35 @@ +def move_on_trail(summits_found: set[tuple[int, int]], map_positions: list[list[int]], current_row: int, current_col: int, next_height: int) -> None:
+ row_count = len(map_positions)
+ col_count = len(map_positions[0])
+ for dir_row, dir_col in ((-1, 0), (1, 0), (0, -1), (0, 1)):
+ next_row = current_row + dir_row
+ next_col = current_col + dir_col
+
+ if not (0 <= next_row < row_count and 0 <= next_col < col_count):
+ continue
+
+ if map_positions[next_row][next_col] == next_height:
+ if next_height == 9:
+ summits_found.add((next_row, next_col))
+ else:
+ move_on_trail(summits_found, map_positions, next_row, next_col, next_height + 1)
+
+
+def get_trailhead_score(map_positions: list[list[int]], head_row: int, head_col: int) -> int:
+ summits_reached = set()
+ move_on_trail(summits_reached, map_positions, head_row, head_col, 1)
+ return len(summits_reached)
+
+
+data = []
+with open("input") as f:
+ for line in f:
+ data.append([int(elem) for elem in tuple(line.strip())])
+
+count = 0
+for row, line in enumerate(data):
+ for col, height in enumerate(line):
+ if height == 0:
+ count += get_trailhead_score(data, row, col)
+
+print(count)
diff --git a/2024/day10/solve2.py b/2024/day10/solve2.py new file mode 100644 index 0000000..df633ad --- /dev/null +++ b/2024/day10/solve2.py @@ -0,0 +1,37 @@ +def move_on_trail(map_positions: list[list[int]], current_row: int, current_col: int, next_height: int) -> int:
+ summits_found = 0
+
+ row_count = len(map_positions)
+ col_count = len(map_positions[0])
+ for dir_row, dir_col in ((-1, 0), (1, 0), (0, -1), (0, 1)):
+ next_row = current_row + dir_row
+ next_col = current_col + dir_col
+
+ if not (0 <= next_row < row_count and 0 <= next_col < col_count):
+ continue
+
+ if map_positions[next_row][next_col] == next_height:
+ if next_height == 9:
+ summits_found += 1
+ else:
+ summits_found += move_on_trail(map_positions, next_row, next_col, next_height + 1)
+
+ return summits_found
+
+
+def get_trailhead_rating(map_positions: list[list[int]], head_row: int, head_col: int) -> int:
+ return move_on_trail(map_positions, head_row, head_col, 1)
+
+
+data = []
+with open("input") as f:
+ for line in f:
+ data.append([int(elem) for elem in tuple(line.strip())])
+
+count = 0
+for row, line in enumerate(data):
+ for col, height in enumerate(line):
+ if height == 0:
+ count += get_trailhead_rating(data, row, col)
+
+print(count)
diff --git a/2024/day11/input b/2024/day11/input new file mode 100644 index 0000000..6142429 --- /dev/null +++ b/2024/day11/input @@ -0,0 +1 @@ +4 4841539 66 5279 49207 134 609568 0
\ No newline at end of file diff --git a/2024/day11/input_test b/2024/day11/input_test new file mode 100644 index 0000000..528f9d5 --- /dev/null +++ b/2024/day11/input_test @@ -0,0 +1 @@ +125 17
\ No newline at end of file diff --git a/2024/day11/solve1_2.py b/2024/day11/solve1_2.py new file mode 100644 index 0000000..e2eef43 --- /dev/null +++ b/2024/day11/solve1_2.py @@ -0,0 +1,50 @@ +memoize = {} +class Globals: + memoize_used = 0 + +def count_digits(number: int) -> int: + if number == 0: + return 1 + + count = 0 + while number != 0: + number = number // 10 + count += 1 + + return count + +def count_after_blinks(stone: int, blink_remaining: int): + if blink_remaining == 0: + return 1 + + elif (stone, blink_remaining) in memoize: + Globals.memoize_used += 1 + return memoize[(stone, blink_remaining)] + + else: + if stone == 0: + result = count_after_blinks(1, blink_remaining - 1) + + else: + digits = count_digits(stone) + if digits % 2 == 0: + divisor = 10 ** (digits // 2) + result = count_after_blinks(stone % divisor, blink_remaining - 1) + count_after_blinks(stone // divisor, blink_remaining - 1) + + else: + result = count_after_blinks(stone * 2024, blink_remaining - 1) + + memoize[(stone, blink_remaining)] = result + return result + +data = [] +with open("input") as f: + data.extend((int(elem) for elem in f.read().strip().split())) + +count = 0 +for elem in data: + count += count_after_blinks(elem, 75) + print(f"elem {elem} done") + +print(Globals.memoize_used) +print(count)
\ No newline at end of file diff --git a/2024/day12/input b/2024/day12/input new file mode 100644 index 0000000..1fd9182 --- /dev/null +++ b/2024/day12/input @@ -0,0 +1,140 @@ +CCCCCCCCCBBBMMGGGGGGGGGGGGGYWWWWWWWWWWWWOOOOOOOOOOOOOOOOHLLHHHHHHHHHHTHUUUULBBBBBBBBBBBBPPPPPPPPPPPKKWWWWCCCWWWWWWWWWWWWWWWWWWWWEEEEYNNNYYLL
+CCCCCCCCCBBBBBBGGGGGGGGGGGGGWWWWWWWWWWWWOOOOOOOOOOOOOOOOHHHHHHHHHHHHHHHHUUULBBBBBBBBBBBPPPPPPPPPPPPPPPWWWCCCWWWWWWWWWWWWWWWWWWWBEEEYYYNYYLLL
+CCCCCCCBBBBBBBBGGGGGGGGGGGGWWWWWWWWWWWWWOAOOOOOOOOOOOOOOHHHHHHHHHHHHHHHHUUULLLLLBBBBBBBBPSPPPPPPPPPPPMMWWCCCCCCCWWWWWWWWWWWBWWWBBBBYYYYYYYLL
+CCCCCCCCBBBBBBBGGGGGGGGAAGWWWWWWWWWWWWWWWWOOOOOOOOOOOIOOHHHHHHHHHHHHHHHHUUULLLLLLLBBBJBJSSPPPPPPPPPPMMMMMCCCCCCCWWWWWWWWWBBBBBWBBBBYYYYYYYYY
+CCCCCCCCCBBBBBBGGGGGGGGGAAWPPWWWWWWWWWWWWWOOOOOOOOOIIIOHHHHHHHHHHHHHHHHUULLLLLLLLBBBBJJJSSPPPPPGGGGPEEMCCCCCCCCCCCCCCCBBWWBBBBBBBBBBYYYYYYYY
+CCCCCCCCCBBBBBBBGGGGGGGGAAASSWWWWWWWWWWWWWOOOUOOOIIIIIIIYHHHHHHHHHHHHHHHHHNLLLLLLLBBBBJJJJVPPPPGGGGPEEMCCCCCCCCCCCCCCCBBBBBBBBBBBBBYYYYYYYYY
+CCCNNNCCBBBBBBBBGEGGGGGAAAAASWWWWWWWWWWWWWXOOOOIIIIIIIYYYHHHHHHHHHHHHHHHGGLLLLLLLLLBBJJJJJJPPPPGGGGPMEMCCCCCCCCCCCCCCCBBBBBBBBBBBBBYYYYYYYYY
+CCNNNNNBBBBBBBBBBEBSGGGGGGSSSWWWWWWWWUWXXXXXXOOIVVVIIIIIYHHHYYHHHYYYYHHHGLLLLLLLLLLLLJJJJJPPPPPGGGGPMMMMMMMCCCCCCCCCCBBBBBBBBBBBBYYYYYYYYYYM
+NNNNNNNVVVBBBBBBBBBSGGSSSSSSSSWWWWWWWUWWXXXXXXOVVVIIIIIIYYYYYYYYHYYYYYHHGGLLLLLLLLLLLJJJJJJJPPPGGGGPMMMMMMMCCCCCCCCCCBBBBBBBBBBBBBBYYYYYYMMM
+NNNNNNNVVVBBBBBBBBBSGGSSSSSSSDDWWWWWWWWXXXXXXXOOIIIIISIIYYYYYYYYYYYYDYYGGGLLLLLLLLLLLJJJJJJJPGGGGGGPPPMMMMMCCCCCCCCCCBBBBBBBBBBBBBBYYYYYYMMM
+NNNNFNNNNBNBBBBBBBSSSSSSSSSSSSSSWDWWUUNXXXXXXXXXIIIIISSSSYYYYYYYYYYYYYYGGGLLLLLLLLJJJJJJJJJJGGGGGGGPDMMMMMMCCCCCXWWWWWBBBBBBBBBBBBBYYYYYMMMM
+NNNNNNNNBBBBBBBBBBSSSSSSSSSSSSSSSDDDNUNNNXXXXXXXIIXIISSSYYYYYYYYYYYYYYYGGGGGLLLLLLLJJJJJJJJJGGGGGGGPDDMDMMMXXXXXXXXXWWWWWWBBBBBBBBBYYYYMMMMM
+NNNNNNNBBBBBBBBBBBSSSSSSSSSSSSSSSSNNNNNNNNXXXXXXXXXXXXSSSQQNYYYYYYYYYYGGGGGGLLLLLLLLJJJJJJJDGGGGGGGDDDDDMMDXXXXXXWWWWWWWWBBBBBBBBBHYYYMMMMMM
+NNNNNNAAXXXBBBBXXBBBSSSSSSSSSSSSSENNNNNNNNNNXXXXXXXQXXQQQQQNYYYYYYYYYYYGGGGGGLLLLLLLJJJJJJJDGGGGGGGDDDDDDDDXXXXXWWWWWWWWWWWBBBBBBHHYYYMMMMMM
+NNNNNNNNXXXXXXXXBBBSSSYSSSSSSSSSSNNNNNNNNNNZXXXXXXEQQQQQQQQYYYYYYYYYYYYGGGGGLLLLLLLGJJJJJJJJGGGGGGGDDDDDDXXXXXXXXWWWWWWWWWWBBBBBBHHHYYMMMMMM
+NNNXXNNNXXXXXXXXXXXYYYYYSSSSSSSSIIINNNNNNNNXXCXXXXEQQQQQQQQQYYYYYYYYYYYGGGGGGGGLGLGGJJJJJJJDGGGGGGGDGDDDGGXXXXXXCWWWWWWWWWWWWABOOHHHYMMMMMMM
+SNNSXNNNRXXXXXXXXXXXYYYYYSSSSSSIIIINNNNNNNNXXCCXEEEQQQQQQQQYYYYYYYYYYYYGGGGGGGGGGGGJJJJJJJJUGGGGGGGGGGGGGGGGGGXCCCWCCWWWWWAAAAAOOHHHHMMMMMMM
+SSSSXSNNRXXXXXXXYYYYYEYNYSSSMHSIIIIINNNNNNNNCCCCTTEQYYQQQQQQYYYYYUYYYYYGGGGGGGGGGGJJJJJJJJJJGGGGGGGGGGGGGGGGGGXGCCCCCWWWWWAAAAAHOHHHHMMMMMMM
+SSSSSSNNSJJJXXXYYYYYYYYYMSMMMMGMIMIINNNNNNNCCCCCTTEYYYQYQQQQQQMYUUYUYYGGGGGGGGIIIJJJJJJJJJJUGGGGGGGGGGGGGGGGGGDGCCCCWWWWWWAAAAAHHHHNMMMMMMMM
+SSSSSSSSSSSJXXXYYYYYYYYYMSMMMMMMMMIIINNNNNNCCCCCTTEYYYYYYQQQQBBBUUYYYYYOOOOGGGIIIPJJJJJJJJUUGGGGGGUGGGGGGGGGGGGGCCCCCCAAAAAAAAAHHHHNMMMMMMMM
+SSSSSSSSSSSJJJJYYYYYYYYYYMMMMMMMMMIIIINNNCCCCCCTTTTCYYYYQQQBBBBBBUUYYYYOGOOOOGIIIIIIIJJJJUUUGGGGGGGGGGGGGGGGGGGGCCCHHHAAAAAAAAAHHHHNNMMMMMMM
+SSSSSSSSSSSSSJJJYYYYYYYMMMMMMMMMMMIIIINNNCSCCTTTTTYYYYYYPPQBBBBBBUUUYGYGGOGGGGIIIIIIIJJIIUUUGGGGGGGGGGGGGGGGGGCGGCCCCCAAAAAAAAAHHHNNAAAMMQMM
+SSSSSSSSSSSJJJJJYYYYYYYYMMMMMMMMMIIISISSSSSCCTTTTTYYYYYYPPPPBBBBUUUUUGGGGGGGGGIIIIIIIIJIIUUUGGGGGGGGGGGGGGGGGGCCGCCCCCAAAAAAAAAKKKAKAHAMMQMY
+SSSSSSSSSSSSJJDJJJYYYYYMMMMMMMMMMOOSSSSSSSSSCTETTTTYYYPYPPPPPPBBBBUGUGGGGGGGYYIIIIIIIIIIIUUUGGGGGGGGGMMMGGGGGGCCCCCCCAAAAAAAAAAKKKKKHHAAMQMY
+SSSSSSSSSSSSJJDJJJYYOOMMMMMMMMMOQOFFFFSSSSSCCCCOOYYYYYPSPPPPBPBBBBGGGGGGGYGGYYIIIIIIIIIIUUUUUUUUUUUUUUMMGGGGGCCCCCCCBAAAAAAAAAAAAKKKHHHHHHYY
+SWSSSSSSSSSSJJDJDDYYMOOMMMMMOMOOOOOOSSSSSSSSCCYYYYYYYYPPPPPBBBBBBBIIIIGGGYYYYYYIIIIIIIIIIIIUUUUUUUUUUMMMMMMGKCCKKCCCCAAAAAAAAAAAAKKKHHHHHHYY
+SSSSSSSSSSSSJDDDDDDYMMMMMMMMOOOOMOOOOOSSSSSNCCZZZZYYYYPPPPPBBBBBBBBBBBWYGAAAAAAAIIIIIIIIIIUUUUUUUUUUUMMMMMKKKKCKKCCCBAAAAAAAAAAAAKKHHHHHHYYY
+SSSSSSSJSSSSJDDDDDDMMMMMMMMMMGGOOLOCSSSSSSSSCCZZZZZYYYEEPPPBBBBBBBBBBBBYWAAAAAAAIIIIIIIIIIUUUUUUUUUUUMMMMKKKKKKKCCBBBAAAAAAAAAAAAKHHHHHHPHHY
+SSSSSSSSSYYSDDDDDDDDDDMMMMMMMMMMLLSCCSSSSSSZZZZZZZZZYSPPPPPPBBBBBBBBBBBYYAAAAAAAIIIIIIIIIIUUUUUUUUUUUUUKKKKKKKKKKCCBBAAAAAAAAAAAAHHHHHHHHHHY
+YYSYSSYYYYYDJDDDDDDDDDMMMMMMMMLLLLSSSSSSSSSZZZZZZZZVSSPPPMPBBBBBBBBBBBBYYAAAAAAAIIIIIIIIIIUUUUUUUUUUUKKKKKKKKKKKKBBBBAAAAAAAAAAAAHHHHHHHHHHH
+YYYYSSYYYYYDDDDDDDDDDMMMMMMMMLLLLLSSSSSSSSSSZZZZZVVVSSPPPPBBBBBBBBBBBBYYYAAAAAAABIIIIJJIIIUUUUUURVKKKKKKKKKKKKKKKBBBBAAAAAAAAAAAAHHHHHHHHHHF
+YYYYYYYYYYYDDDDDDDDDMMLMMMMLLLGGLLLLSSSSSSSSZZZZZVVVVSVBPBBBBBBBBAAAAAAAAAAAAAAABIIIIJJJIRRRRRRRRRRRKKKKKKKKKKEKKBBBBAAAAAAAAAAAAHHHHHHHHHHF
+YYSSSYYYYYYDDDDDDDDDDMLLLLLLLLGGGGLLSSLLSSSZZZZZZVVVVVVBBBBBBAAAAAAAAAAAAAAAAAAABBIIRRRRRRRRRLRRRRRRKKKKKKKKKKKKWWWBBAAAAAAAAAAAAHHHHHHHHFFF
+SSSSSSYAAYYYYDDDDDDDDDDLLLLLGGGGGGGLLLLLLSSZZZZZZVVVVVBBBBBBBAAAAAAAAAAAAAABBYYBBRIIRRRRRRRRRRRRRRRKKKKKKKKKKKKKWWWWWAAAABBBBBBBCHHHHHHAAFFF
+SSSSSAAAAYAYYYYDDDDDDDDDDZZZGGGGGGGGGGLLLSSZZZZZZVVVFVBBBBBBBAAAAAAAAAAAAAABBBBBBRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKWWWWAAAAABAABIBHHHHHHHHAAAFF
+SSSSSAAAAAAAYYYYDDDDDDDDZZZZGGGGGGGGGGGLLSZZZZZZVVVVVBBBBBBBBAAAAAAAAAAAAAABBBBBBBNRRRRRRRRRRRVRRRRRKKKKKKKKKKKWWWWWAAAAAAABBIIIHHHHHAAAAAAA
+SSSAAAAAAAAAAAAZDDDDDDDDZZZZGGGGGGGGGGGLLZZZZZZZZVVVVVBBBBBBBAAAAAAAAAAAAAABBBBBBBBRRRRRRRRRRRVRRRRRRKKRKKKRKKWWWWWWWAAAAAAAIIIIHHHHHMAAAAAA
+SSSAAAAAAAAAAADZKKKDDDDZZZZZGGGGGGGGGGGGLZYKKZKUVVVVVVBBBBBBBAAAAAAAAAAAAAABBBBBBRRRRRRRRRRRRVVVRRRRRRRRRRRRRWWWWWWWAAAAAAAAAIIIIISSAAAAAAAA
+SSSAAAAAAAAAAKKKKKKKDDZZZZZZZGGGGGGGGGGGGGKKKKKUUVVOODOOBBBBBBBBBJJJJJJBBBBBBBBBBBRRRRRRRRRRRVVVRRRRRRRRRRRRWWWWWWWAAAAAAAAAAIIIISSSSAAAAAAA
+SSSAAAAAAAAAAKKKKKKKZZZZZZZZZVGGGGGGGGGGXKKKKKKUVVOOOOOOBBBBBBBJJJJJJJJJJBBBBBBBBBCCRRRRRRRRRVVRRRRRRRRRRRRRWWWWWWWAAAAAAAAAAIIIIIIAAAAAAAAA
+SSSAAAAAHHHHHHHHHHHHHHHHHHZZZVGGGGGGGGGKKKKKKKKUVVOOOOOOCBBBBBBBJJJJJJJJJBBBBBBBBCCRRRRRRRRIRRRRRRRRRRRRRRWWWWWWWWWAAAAAAAAAAIIIIIIAAAAAAAAA
+SSSSAAAAHHHHHHHHHHHHHHHHHHZZZZQQGQQGGGQKKKKKKKKVVVOOOOOOCCBBBBBBJJJJJJJJJJJJJJBCCCCRRRCCCCCIIIRRRRRRRRRRRRWWWWWWWWAAAAAAAAVVIIIIIIIOAAAAAAAA
+SSSSSSAAHHHHHHHHHHHHHHHHHHZZZZZQQQQQQQQQQKKKKKKKOOOOOOOOCCBBBBBJJJJJJJJJJJJJJJBCCCCCCCCCCCIIKKKRRRYRRRRWWWWWWKWWWKKAAAAAAAAIIIIIIIIIHAAAAAAA
+SSSSSSSAABBBBKKKHHHHHHHHHHZZZZZQQQQQQQQQQQKKKKKKOOOOOOOOCCCBBBBJJJJJJJJJJJJJJCBCCCCCCCCCCCCCKKKKKRKRRRRWWWWWWKKKKKKWAAAAAAAIIIIIIIIIHAAAAAAA
+SSSSSSSSABBBBBZZHHHHHHHHHHZCCEECCCCQQQQQQQKKKKKKOOOOOOOOOCBBBBBJJJJJJJJJJJJSCCCCCCCCCCCCCCCCKKKKKKKKKKKKWWWGGKKKKKKWWWAATTIIIIIIIYHHHHAAAAAA
+SSSSSSSSSSSBBBBHHHHHHHHHHHZZCCCCCCCQQCQQQQNKKNOOOOOOOOOOOBBBBBBBBJJJJJJJJJJSSCCCCCCCCCCCCCCCCKKKKKKKKKKMMMGGYYKKKKKWWWWATTIIIINIIYYHYYAAAAAA
+SSSSSSSSSSSSBBBHHHHHHHHHHHKKKCCCCCCCCCQQQNNKKNNOOOOOOOOFFBBBBBBBBJJJJJJJJJJJCCCCCCCCCCCCCKCCKKKKKKKKMMMMMMMGGKKKKKKWWWWTTTTITIIIKYYYYYAAAAJA
+SSSSSSSSSSSSSSBHHHHHHHHHHHHHKCCCCCCCCCNNNNNNNNNNOOOOOOOFFFFBUBHHHHHJJJJAJQQJQCCCDCCCJCKKCKKKKKKKKKKMMMMMMMGGGKKKKKKTTTTTTTTTTTTIKYYYYYAYAAAU
+SSSSSSSSSFFFFBBHHHHHHHHHHHHHHCCCCCCCYCYNNNNNNNNNNNNOOOORRRRRRTZHZZZJJJJJJQQQQCBCCCCCCCKKKKKKKKKKKKKKMMMMKMGGGKKKKKKTTTTTTTTTTTTTTTYYYYYYYAAU
+SSSSSSSSFFFFFBBHHHHHHHHHHHHHHCCCCCYCYYYYYNNNNNNNNNNOONARRRRRZZZZZZZJJJJQQQQQQQCCCCCCCDKKKKKKKMMKKKKKKMMMKMGGGKKKKKKTTTTTTTTTTTTTXTYYYYYYYYYY
+SMSSSSSSJFFFFFBHHHHHHHHHHHHHHHCCCCYYYYYYYYYNNNNNNNNNNNRRRZZZZZZZZZZZZJJQQQQQQQQQCCCCDDKBKKBKMMMKKKKKKMMKKKJGGGGGKKKTTTTTTTTTTTTTTTTTTYYYYYYY
+YJJSSSSJJFGFFFBHHHHHHHHHHHHHHHCCCYYYYYYYYYNNJNNNNNNNNNVRRRRZZZZZZZZZZQQQQQQQQQQQCCCCCGBBBBBBBMAMKKKKKKKKKCGGGGGKKKKTTTTTTTTTTTTTTTTYYYYYYYYW
+YGJJSSSJJJFFJJJHHHHHHHHHHHDLHHHCYYYYYYYYYYYYNNNNNNNNNVVVVRRRZZZZZZZZZQQQQQQQQQQQQQCCCGBBBBGBBMMMKKKKKKKKKCCGGGGKKKKKTTTTTTTTTTTTTTTTYYYYYYYY
+YGJSSJJJJJJJJJJHHHHHHHHHHHLLLLLLYYYYYYYYYYYYNNNNNNNNNNVVVRRRRRZZZZZZZQQQQQRQQQQQQQQCGGGGGBGMMMMMMMKKCKKCCCCCZGGKKKKKTTTTTTTTTTTXTTTTYMMYYYYY
+GGJJJJJJJJJJJJJJJHHHHHHHLLLLLLLLLYYYYYYYYYYYYNNNNNNNNNVVVRRRRRZZZZZZRQQRRQRRQKKQQQQCQGGGGGGMMMMMMKKCCCKCCCCCCGKKKKKKTTTXXXXXTTTXTTMTMMMMMYYY
+GGGGJJJJJJJJJJJJJHHHFHHLLLLLLLLLLYYYYYYYYYYYYNNNNNNNNNNVRRRRRZZZZZZZRRRRRRRRRKKKQQQQQQGGGGGGMMMCMCCCCCCCCCCCCCKKKKKKTTTXXXXXXXXXXXMMMMMMAYYY
+GGGGGJJJJJJJJJJJJHHHHHHLLLLLLLLLLYYYYYYWYYWYYYNNNNNNNNSSSRRRRAAZZZZRRRRRRRRRRKEKKQQQQGGGGGGOOOMCCCCCCCCCCCCCCNNNNNNNNNNNNNNNNNNMMMMMMMMMMYYA
+GGGGGJJGTTTTJJJJJLLLLLLLLLLLLLLLLLLYWYWWWWWYYNNNNNNNNNSSSSRKAAAZZZRRRRRRRRRKKKKKKQQQQQGFGGGOOOICCCCCCCCCCCCCCNNNNNNNNNNNNNNNNNNXMMMMMMMMMMYA
+GGGPPGJGTTTTJTJJJLLLLLLLLLLLLLLLLLYYWWWWWWWWYYYNSNNNNSSSSABAAAAZZRRRRRRRRRRKKKKKNNNNQQFFFFGOOOCCCCCCCCCCCCCCCNNNNNNNNNNNNNNNNNNMMMMMMMMMMMAA
+GGGGGGGGTTTTTTTLLLLHLLLLLLLLLLDLLLLWWWWWWWWWYYYSSNNSSSSSSAAAAAAAAARRRRRRRRRRKKKKKNNNNQQFFOOOOOOCCCCCCCCCCCCJGNNNNNNNNNNNNNNNNNNMMMMMMMMMMMAN
+GGGGGGGGGTTTTTTTTTTHLSLLLLLLLLDLLLXXWWWWWWWWYYYSNNNSSSSSSAAAAAAALLRRRRRRRRRRRKKRNNNNQQRFFOOOOOOCCCCCCCCCCCCJJNNNNNNNNNNNNNNNNNNMMMMMMMMMNDNN
+GGGGGWGGGTTTTTTTFFSSSSSSLLLLLLLLLBWWWWWWWWWWYYYSSSSSSSSSSAAAAAAAAARRRRRRRRRRRRRRNNSSRRRRRRROOOOOOCCCCCCCCJJJJNNNNNNNNNNNNNNNNNNXXXMMMNNNNNNN
+GGGGWWWGGTTTTTTFFSSSSSSSLLLLLLLLKBWWWWWWWWWWYYYYSSSSSSSSBJJAAAAAAARRRRRRRRRRRRNNNNNNOORRRRRROOOOOCCCCCCCJJJJJNNNNNNNNNNQQQQXXXXXXXXXXNNLNNNN
+GGGWWWWTTTTTTTTTTOSSSSSSBLSSHLLLKKJWWWWWWWWWWYYRRSRSRSBBBJJJAAAAAAARRRRRRRRRRRNNNNNNOOOORRRRRRROOOOOOJJJVJJJJJJJNNNQQQQQQQQQXXXXXXXXXNNNNNNQ
+GGGWWWTTTTTTTTKSSSSSSSSSSSSSHLLLKKKWMWWWWWWWWWYRRRRRRBBBBBAAAAEEEAARRRRRRRRRRNNNOOOOOOORRRRRRROOOOOGJJJJJJJJJJJJNNNQQQQQQQQQXXXXXXXNNNNNNNNN
+WWWWWWTTTTTTTTTJSSSSSSSSSSSSSKKKKKKWMWWWWWWWWWYRRRRRBBBBBBAAAAEEEEEEERRRRRRRRRRROOOOORRRRRRRRRROOOGGJHJJJJJJJJJJNNNQQQQQQQQQXXXXXXXNXNNNNNNN
+WWWWWTTTTTTTTTTTSSSSSSSSSSHKKKKKKKUKMWWWWWWWWKKKKRRBBBBBEEEEEEEEEEEEETRRDDRRRRROOOOOORRRRRRRRRROOGGGGJJJJJJJJJJJJJQQQQQQQQQQQQQQXXXXXNNNNNNN
+WWWWWWWTTTTTTTTSSSSSSSSSSSKKKKKKKKKKKWWWWWWWKKKKKRRBBBBBBBBEEEEEEEEETTRRDDRRRRRROOOLOORRRRRRROOOGGGGGJJJJJJJJJJJJCQQQQQQQQQQQQQXXXXNNNNNNNNN
+WWWIWWWTTTTTTTSSSSSSSSSSSSKKKKKKKKKYYWWWWWWWWKKKKLRBEBEEEEEEEEEEEEETFTTTDDDTTTRBLLLLLLRRRRRRROOHGGGGGGJJJJJJJJJJJJWQQQQQQQQQQQQQXXXNNNRNNNNN
+WWIIIWWWTTLTTTSSSSSSSSSSKKKKKKKKKPPYYWWWWWWWWKKKKLLEEEEEEEEVVVVVEEETTTTDDTTTTTTLLLLLLLLRRRRRRHHHGGGGMJJJJJJJJJJJQQQQQQQQQQQQQQQQQQNNNRRNNNNN
+WWIIWWWTTKGTTTSSSSSSSSSKKKKKKKKKPPPPMMMMWWWKKKKLLLLEEEEEEVVVVVVEEEETTTTTTTTTTTTLLLLLLLLRRRIRHHHHGGGGGJJJJJJJJJJQQQQQQQQQQQQQQQQQQQQRRRDDDNNN
+IIIIIWWWWGGGVVSSSSSSSSSSKKKKKKKKPPPPMMMMWWKKKKKKLLLLELEEEVVVVVVEEEEEETTTTTTTXLLLLLLLLLLLLLLHHHHHGGGGGGJJJJJJJJQQQQQLLLQQQQQQQQQQQQQQRRDDMMDD
+IIIIIIWWGGGGGVVVSSSSSSSSKKKKKKKFEPPMMMMMMMKKKKKLLLLLLLEVVVVVVVVEEEEETTTTTTTTLLLLLLLLLLLLLLLHHHHHHHGGGGJJJJJJJJNQQQQQLLQQLLQQQQQQQQQQDDDDDDDD
+IIIIIIGGGGGGGGGVSSSSSSSSSSKKKKKFFPPMMMMMMMKKKSSLLLLLLVVVVVVVVVEEEETETTTTTTTTTLLLLLLLLLLLLLLHHHHHHHGGGGGAJJJJJDQQQQQLLLQLLLLQQQQQQQQQDDDDDDDD
+IIIIIGGGGGGGGZZZGSSSSSSSSSKKKFFFFHPMMMMMMMKSSSSLLLLLLVVTVVVVVVEEEETTTTTTTTTLLLFFFFFFFFFFLLHHHHHHHHGEEGDDDJDDDDQQQQQLLLQQLQQQQQQQQQQQDDDDDDDD
+IIIIIGGGGGGGGZZZTTSSSSSSSSKKKKFFFFPMMMMMMMKKSSSLLLLLLLVVVVVVVEEEEEETTTTTTTTLLLFFFFFFFFFFHHHHHHHHHHGEDDDDDDDDDDQQIQQQQLLLLQQQQQQQQDQQDDDDDDDD
+IIIIIICGGGGGGZZZTTNSSSKKKKKKKFFFFFFMMMMMMMKSSSSSLZLLLLVVVVVVVEEEEEETTTTTTTTLLLFFFFFFFFFFHHHHHIIIHHEEDDDDDDDDDDDTDDQLLLLLTTQQQQQQDDDQDDDDDDDD
+IIIIIIGGGGGGGZZZNNNNKKKKKKKKKKFFFFFMMMMMMMKSSSSSFZLLLLLVVVVPVLLEETTTTTTTTTTQLLFFFFFFFFFFHHHIIIHHHHEEDDDDDDDDDDDDDDLLLLLTTTTTQQQQQDDDDDDDDDDD
+ZZIIIIUGWGGGGZZZNNNNNKKKKKKKKKFFFFBKKKKKKKKSKSSSFZLLLLLLVZVPPLLLETTTTTTTTTTTOOLLLLLLLILIHIIITTTHHHEEDDDDDDDDDDDDDLLLLLLLTTTTTTDQDDDDDDDDDDDX
+ZZIIIUUGWWZZZZZZNNNNNKKKKKKFFFFFFFFKKKKKKKKKKKKZZZZLLLLLVVLLLLLLEETTTTTTTTTOOONNNNNLIIIIIIIIIIIHHEEEEEDDDKKDDDDDDDLLLIIIIIIIIIIQDDDDDDDDDDDD
+ZIIIIUZGGGZZZZZZNNNNKKLKLFFFFFFFFFFKKKKKKKKKKKKKZZZLLLLLLLLLLLLLEETTTSTTTTSSFNNNNNNNIIIIIIIIIIIHEEEEEEEDDKKDDDDDDLLLLIIIIIIIIIIDDDDDHHHHHHNN
+ZIIIZZZZZNZZZZZZNNNNNNLLLLFFFFFFFFFKKKKKKKKKKKKKZZLLLLLLLLLLLLLEEEEETSSTTSSLFNNNNNNNIIIIIIIIIIIHHEEEEEEKKKKDDDDDDLLLLIIIIIIIIIIDDDDDHHHHHHNN
+ZZIZZZZZZNZZZZZZNNNNNNLLLLFFFFFFFFFKKKKKKKKKKHKKGGSLLSLLLLLLLLLLEEESSSSSSSLLFFNNNNNNNPIIIIIIIIIIIEEEEEEEKKLLDLLLDLLLLIIIIIIIIIIDDDDDHHHHHHHN
+ZZZZZZZZNNZZZZZZNNNNNLLLLLLFDFFFFQQKKKKUKKKKKKKKSGSLLSLSSSSLLLLEEEESSSSSLSLLFFFNNNNKQQQIIIIIIIIJIEEEEELLLLLLLLLLLLLKKIIIIIIIIIIDDDDDHHHHHHHH
+ZZZZZZZZZZZZZZZNNNNNNNLLLLLQQQQQQQGKAKKEKKKKEEESSGSSSSSSSSSTLLLJJJESSSSLLLLLLQQQQNNNQQQIIIIIIIIIIEEEEELLLLLLLLLLKKKKKIIIIIIIIIIDDDHHHHHHHHHH
+ZZZZCZZZNNZZZZZNNNNNNNLLLLLQQQQQQQQKAAKEEEEEEEESSSSSSSSSSGZTTTLJJJJSSSSSLLLLLQQQQQNNQQQIIIIIIIIIEEEEEELYLLLLLLLLKKKKIIIIIIIIIIIDHHHHHHHHHHHH
+CCCCCCZZNNZZZZZNNNNNUNNLLLLQOQQQQQQQQAKEEEEEEEEESSSSSSSSEZZTTTJJJJJFSJNNLLLLLQQQQQQQQQQIIIIIIIEEEEEEEELYYLLFFLLLLPPKIIIIIIIIIIIHHHHHHHHHHHHH
+CCCCCCZZNNNNNNNNNNNNLLLLLLLOOOOQQQQQQQKEEEEEEEEESSSSSSSSEZZTTTJJJJJJJJLLLLLLLQQQQQQQQQQIIIIIIIEEEEEEEEYYYLYLLLLLLLLKIIIIIIIIKKHHHHHHHHHHHHHH
+LCCCZZZZZZNNNNNNNNNNNLJRRLLLOOOOOQQQQTTEETEEEEEEESSSSSSEEEZZTTJJJJJJJJJJLLLQQQQQQQQQQQQQIIIHIEEEEEEEEEEEYYYYLLLLLKMKIIIIIIIIKKHHHHHHHHHHHHHH
+LCLLLZLZLNNNNNNNNNRNNRRROOLOOOOOOQQQQTEEETTTTTEEEESSSEEEEZZTTTTJJJJJJJJJLLLLQQQQQQQQQQQQIIIHHHEEEEEEEYYYYYYYYLLZLKKKIIIIIIIISSHHHHHHHHHHHHHH
+LLLLLLLZLNNNNNNNRRRFRRRROOLOOOOQQQQQQTTTTTTTTTEEEEEEEEEEEZZTTTZZJJJJJJJJLLQQQQQQQQQQQQQQQQIHHHHEEYYYYYYYYYJJJJJJJKKKIIIIIIIISSSSHHHHHHHHHHHH
+LLLLLLLLLNLLLLLLRRFFRRRROOLOOOOQQQQDQRTTTTTTTTEEEEEEEZZZZZZTZZZJJJJJJJJLLLQQQQQQQQQQQQQQQQHHHHHNNYYNNNNNNNCJJJJJFKKKIIIIIIIISSSGHHHHHHHHHHHH
+LLLLLLLLNNLLLLLRRFFFFFRRROOOOOOYFQQQQTTTTTTTTEEEEEEEZZZZZZZZZZZZZJJJJJLLKLQQQQQQQMQQQQQQQNHHHHNNNYYYNNNNNNCJJJJJFKKKIIIIIIIISSSGGHHHHHHHHHHM
+LLLLLLLLLLLLLLLFFFFFFFFFFFOOOOOYYAAAATTTTTTTTTEEEEZZOZZZZZZZZZZUZJJJJLLLQQQQQQQQMMQQQNNNNNNNNNNNNYNNNNNNNNCCOCCCFFKKIIIIIIIISSSSSSSSSPXXHMHH
+LLLLLLLLLLLLLLLFFFFFFFOFOOOOOOYYYYYAAATTQTTTQTTQEEZZZZZZZZZZZZZZZJJJJJICCCCCCQQQOMQQQDDNNNNNNNNNNNNNNANNNNCCCCCCFFFFKKKKKKSSSSSSSSSSSPGGHHXX
+LLLLLLLLLLLLLLLFFFFFFFOOOOOOOOOYYYYAAATTQQTTQQQQEEEEEZZZZZZZZZZZZJJJJJJCCCCCCYQQOMDDDDDNNNNNNNNNNNNNNNNNNCCCCCCFFFFFKKKKKKSSSSSSSSRSPPGGXXXX
+SSSLLLLLLLLLLLLFFFFFFFFYOOYYYYYYYYYYAATTQQQQQQQQEEEEEZZZZZZZZZZZZJJJJJCCCCCCCCCCODDBDDDDDNNNNNNNNNNNNNNNNCCCCCCCFFFFFFKKKKKSSSSSSSPPPPGGGNNX
+SSLLLLLLLLLLXXLFXFFFXXXYYYYYYYYYYYYAAAQQQQQQQOQQQEEEEZZZZZZZZZZZYJJYGGCCCCCCCCCCOODDVDDDDINNNNNNNNNNNNNNCCCCZQFFFFFSSFFFFKSSSSSSSSAPPPPGPNNN
+LLLLLLLLLLLLXXLXXXXXXXXYYYYYYYYYYYYYYQQQQQQQQQQQQQEEEEZZZZZZZZBYYYYYGGCCCCCCCCCDDDDDDDDDDNNNNNNNNNNNNNNNNCCCZQFFFFFSSFFFFKSSSSSSSSSPPPPPPNNN
+LLLLLLLLLLLLLXXXXXXXXXXYYYYYYYYYYYYQQQQQQQQQQQQPQQEEEEEFZZLZZZBYYYYYYGCCCCCCCCDDDDDDDDDDDNDNNNNNNNNNNNNNNNCCZQFFFFFSSFFFFSSSSSSSSSSSPPNNPPNN
+QQQYLYYYYLLLJXXXXJXXXXYYYYYYYYYYYYYYQQQQQQQQQQQPPPPPPFFFFFLZZZZYYYYYYYCCCCCCCCCAADADDDDDDDDDNNNNNLNNJJJJCCCCZQQFFFSSSFFFSSSSSSSSSSLLPNNNNNNN
+QQYYYYYWWLLLJJJJJJJXXXYYYXXXXXXXXXYYQQQQQQQQQQQPPPPNFFFFFFLLZZZYYYYYYYCCCCCCCCZAAAADDDDDDDDDDNNNLLLLJJJJJCCCQQQFQSSSSFKFSSSSSSSSSSSPPPNNNNNN
+QQQQYYYYWLLLJJJJJJJJJJSNBXXXNXXXUYYYYIIJJJQQBBBPPPPPFFFFFFFZZDYYYYYYYYZCCZCCZZZAAAADDDDLLLDDDDNLLLLJJJJJJQQQQQQQQSSSSKKKKSSSSSSSHSSHHHNDDNNN
+QQQQYYYYWLLLJJJJJJJJJZNNNNNNNJXXUUUYYYJJJJQQQBPPPPPFFFFFFFFKKYYYYYYKYYZZZZTTTTZZAAAAALLLKLLDLDLLLLJJJJJJJQQQQQQQQSSSSKKKKSSSSSSSHHHHHDDDDNNN
+QQQYYYYYYYJJJJJJJJZZZZNNNNNNNNUUUUUUYJJJJJJJJBBPPPFFFFFFFFFKKKKKYYYKKZZZZZZZZZZZZAAAAALLLLLLLLLLLLLLLJJJQQQQQQQQQSSSSSKKKKKSSSSSSHHHHDDDDNNN
+YYYYYYYYYYYJJJJJJJJZZNNNNNNNNUUJJJJJJJJJJJJJJJJBFFFFFFFFFFFFKKKKKKKKKZZZZZZZZZZZAAAAAAAGLLLLLLLLLLLJJJJJJQQQQQQQQSSSSSSKKKKKSSSSTTTTTTTDNNNN
+SYYYYYYYYYYJJJJJJJJZNNNNNNNNNUUUJJJJJJJJJJJJJBBBBBFFFFFGFFFKKKKKKKKKKZZZZZZZZZAAAGGGAGGGLLLLLLLLLLLLJJJQQTQQQQQQQQQSSSKKKKKKKESTTTTTTNNDNNNN
+SCYYYYYYYYYJJJJJJUZZZNNNNNNNNNUUUUJJJJJJJJJJJJBBBBFFFFGGFKKKKKKKKKKZZZZZZZZZZZAAAGYGAGGGGLLLLLLLLLLJJJJQQQQQQQQQQQQSSSSSKKKTTTTTTTTTTNNNNNNN
+SCCYYYYYYJYJJJJJJUUUZNNNNNNNNUUJUUJJJJJJJJJJJLBBBBBGGGGGGKKKKKKKKKKZZZZZZZZZZZAAAGGGAGGGGLLLLLLLLLLLLLJQQQQQQQQQQQQSSSSSKKKTTTTTTTTTTTNNNNNN
+CCCYYYYYJJJJJJJJUUUNZNNNNNNNNNUJJJJJJJJJJJLJJLLLBBBGGGGGGKKKKKKKKKKZZZZZZZZZZAABAGGGGGGGGGGLLLLLLLLLLLQQQQQQQQQQQQQQSSSSKKTTTTTTTTTTTTNNNMNN
+CCCYYYYJJJJJJJUUUUUNNNNNNNNJJJJJJJJJJJJJJJLLLLLLLLBBGGGGGKGKKKKKKKKZZZZZZZZZZZABBBBGGGGGGGGLLLLLLLLLLLQQQQQQQQQQQQQQSSSSKKTTTTTTTTTTTTTMMMNN
+CCCCCYYCJJJJJUUUUUUUNUUNNNNJJJJJJJJJJJJJJLLLLLLLLLLLGGGGGGGKKKKKKKKZZZZZZZZZZZBBBBGGGGGGGGGGGOOLLLLGGGGQQQQQQQQQQQQQSSSKKTTTTTTTTTMMTTTMMMMM
+CCCCZZCCJJJJJUUUUUUUUUUUUUUJJJJJJJJJJJJJZZLLLLLLLLLLFGGGGGGGGGKKKKKZZZZZZZZZZZBBBGGGGGGGGGGGGGLLLGGGGEEEQQQQQQQQQQSQSSSSSTTTTTTTTMMMTTMMMMMM
+CCCCZZZCCCJJUUUUUUUUUUUUUUUJJJJUUJJJJDDJJZZLLLLLLLZZGGGGGGGGGGKKKKKZZZZZZZZZZZBBBBGGGGGGGGGGGGLLGGGGETEEEEQQQQSSSSSSSSSXTTTTTTTMTMMMTTTMMMMM
+CCCCCCCCCCJUUUUUUUUUUUUUUUUUJJJUUUDDDDDJJZZFFLLLFLZZZGGGGGGGGGGKKKKZZZZZZZZZBBBBBBGGGGGGGGGGGGLLLGGEEEEEEEQQJQSSSSUSSSSMMTMMMTTMMMMMTTTMMMMM
+CCCCCCCCCCCUUUUUUUUUUUUUUUUUUJJUUUDDDDDZZZZFFLLLLLLZGGGGGGGGGGGKKKKZZKKKKZZZZBBBBBJBGGGCGGGGGGGLLGGGEEEEEEQQQSSUUUUSSSMMMMMMMMMMMMMMTTMMMMMM
+CCCCCCCCCCCUUUUUUUUUUUUUUUUUUUUUUDDDDDDDZZFFFFLPWWLEGGGGGGGGGGKKKKKKKKKLZZZZZZBBBBJBGCCCCGGGGGGGLGGGEBBEEEEQSSUUUUUSUSSMMMMMMMMMMMMMMMMMMMMM
+CCCCCCCCCCCCUUUUUUUUUUUUUUUUUUUUUUDDDDDZZFFFFPLPWWWEGGGGGGESSSSSSSSSSSLLLLZZBBBBBBBBGGGCCCGGGGGGGGGGGGEEEEEESSUUUUUUUMMMMMNNNNNNNMMMMMMMMMMM
+CCCCCCCCCCCCUUUUUUUUUUUUUUUUUUUUUUDZDDDDZZZZZPPPWWPEEEEEEEESSSSSSSSSSSLLLLLZBBBBBBBBGGCCCXGGGGNNKNGGGAAEEEEEEBBUUUUUMMUMNNNNNNNNNNMMMMMMMMMM
+CCCCCCCCCLLUUUUUUUUUUUUUUUUUUUUUUUUZZZZZZZZPPPPPPPPPEEEEEEESSSSSSSSSSSLLLLLLBBBBBIBBGGCCXXGGNNNNNNGGAAAEAAAENBBUUBUUUUUMMNUNNNNNNMMNMMMBMBBS
+CCYYCCCCCLLLUUUUUUUUUUUUUUUUUUUUUUUZZZZZZZZPPPPPEPPPPEEEEEESSSSSSSSSSSLLLLLBBBBBBBBIIGCCXCCWWWNNZNVGAAAAAAABBBBCBBBUUUUUUNUNNKNNNNNNNMMBBBBB
+YCYYYYYCCLLLUUULUUUUUUUUUUUUUUUUUUUUZZZZZZZPPPPPPPPPPEEEEEKKKSSSSSSSSSLLLLLLBBBBBBIIIIICCCCWWNNNNVVVFAFAAAABBBBBBBBBBBBUUUUUNNNNNNNNNMBBBBBB
+YYYYYYYCLLLLLLLLLUWUUUUUUUUUUUUUUUUUZZZZZZZZPPPPPPPPPEEEEEKKKSSSSSSSSSLLLLLLBBBBBIIIIIIUCFCWWNNNVVVVFFFFAAAABBBBBBBBBBUUUUUUNNNNNNNNABBBBBBB
+YYYYYYCCLLLLLLLCLCCRUUUUUUUUUUXXUUUUZZZZZZPPPPPPPPPPPEEEKKKKKSSSSSSSSSLLLLLLLBBBBBYIIIIIIFFNNNNNVVVFFFFFFFFABBBBBBBBBBBUUUUUNUUNNNNNANNNBBBN
+YYYYYYYYYYPPLLCCCCCCCCUUUUUUUUXXNDNZZZZZZZPPPPPPPPPRREEEEEERASSSSSSSSSLLLLLLLBYBBYYYYYYYIFFNNNNNNVVFFFFFFFFABBBBBBBBBBBBUUUUUUUNNNNNNNNNNNNN
+QYYYYYYYYYPLLLLCCCCCCCCCTTUUUUNNNNNZZZZZZZZPPPPPPPPRNNEEEEEESAAAABBBLLLLLLLLLLYBYYYYYYYYFFKKKKKKKKZFFFFFFFFFBBBBBBBBBBBBUUUUUUUUNNNNNNNNNNNN
+YYYYYYYYPPPPPLLCCCCCCCCCCCAAUUNNNNNZZNNNZPPPPPPPPPPRRREREMESSQAAALLLLLLLLLALAYYYYYYYYYYYFFKKKKKKKKZZFFFFFFFRRRRBBBBBBBBUUUUUUUUUNNNNNNNNNNNN
+EEYYYYYYPPPPPPPCCCCCCCCCCAAAUUNNNNNZZNNNZPPPPPPPPRRRRRRRORRSSQQAAALALLLLLLAAAAYYYYYYYYYNNNKKKKKKKKZZFFFFFFFFRRRBBBBBBBUUUUUUUUUUNNNNNNNNNNNN
+EEYMMPPPPPPPPPPCCCCCCCCCCCCNNNNNNNNNNNNXPPPPPPPPPRRRRRRRRRRRQQQAAAAAALLLLLAAAAYYYYYYYYNNNNKKKKKKKKZZFFFFFFFFRRBBBBBBBBUUUUUUUUUUNNNNNNNNNNNN
+EEYYPPPPPPPPPPGCCCCCCCCCCCDNNNNNNNNNNNNNPPPPPPPPRRRRRRRRRRRYQQQQQQQQALLLAAAAAAAYYYYYNNNNNNKKKKKKKKFFFFFFFFFFFRRRBBBBBRRRUUUUUUUUNNNNNNNNNNNN
+EEENNPPPPPPPPGGCMCCCCCCNNNNNNNNNNNNNNNNNPPPPPPPPRVRVRRRRRRYYYFQQQQQEQQQVAAAAAAAYYYYYYNNNNNKKKKKKKKKKKKFFFFFFFFFBBBCCBRRRRRUUUUUUNNNNNNNNNNNN
+EEEPPPPPPPPPPPPCMCCCCCCNNNNNNNNNNNNNNNNNKPPPPPPPPVRVRRRRRYYYYFQQQQQQQQQQQAAAAAAYYYYYYNNNNNKKKKKKKKKKKKFFFFFFFFFFFFFCRRORRRRUUUUUNANNNNNNNNNN
+EEEPPPPPPPPPPPMMMMCCCICMMNNNNNNNNNNNZNNNTTPTTPPPVVVVRRRRRYYYYQQQQQQQQQQQQQAAAAAYYYYYNNNNNNNNNKKKKKKKKKFFFFFFTCCCCCCCRRRRRRRUUIUNINNNNNNNNNNN
+EEELPPPWWPPPMMMMMMCCCCCCMMMNNNNNNNNNZNNZTTTTTPPTVVVVVRRRYYYYQQQQQQQQQQQQAAAAAAYYYNNNNNNNNNNNNKKKKKKKKKCCCTTTTTCTTRRRRRRRRRTIIIINNNNNNNNNNNNN
+UUEEEPPWMPPPPMMMMMCCCCCMMMMNNNNNNNZZZNNZTTTTTYTTVVPPVVRRRYYYYQQQQQQQQQQASAAYYAYNNNNNNNNNNNNNNNYCKKKKKKCSSTTTTTCTTTTRRRRRRTTTIITTNNNNNNNNNNNN
+UUUUMMMMMPPPMMMMMMCMMMMMMMMNNNNNNNZZZZZZCTTTTTTTPPPPVVVRRRRYYQQQQQQQQQQAAAYYYYYYNNNNNNNNNNNNCYYCCCCCCCCCCTTTTTTTTTTERRRRRRRTTITTNNNNNNNNNNNN
+UUUMMMMMPPMMMMMMMMMMMUUMMNNNNNNNNNZZZZZCTTTTTTTQPPPPVPPPYYYYYYQQQQQQQQQQEAAYYYYYYNNNNNNNNNNCCCCCCCCCCCCCTTTTTTTTTTTRRRRRRRRTTTTTNTNNNNNNNNNN
+UUMMMMMMMMMMMMMUMMMMMMUUMMMNNNNNNNZZZZOTTFTTTTTQPPPPPPPPBYYYYQQQQQQQQQQQQYYYYYYYYYNNNNNNNANCCJCCCCCCCCCCTSTTTTTTTTTTTTRRRTTTTTTTNTNTTNNNNNNN
+UMMMMMMMMMMMMMMUUUUUMUUUMMMNBNNNNZZZZZZZFFFFTTTTPPPPFPPPBYYYQQQQQQQQQQQQCQYYYYYYYYYNNNNNNCCCCCCCCCCCCCCCCCTTTTTTTTTTTTRRTTTTTTTTTTTTTNNNNNNN
+UUMMMMMMMMMMMMMUUUUUUUUUUMMMBNNNZZZZZZZZFFFFUUTPPPPPPPPBBYYYQWQQQQQQQQQQQQQYYYYYYYYNNNNNNCCCCCCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTNNNNNNNNN
\ No newline at end of file diff --git a/2024/day12/input_test b/2024/day12/input_test new file mode 100644 index 0000000..876b524 --- /dev/null +++ b/2024/day12/input_test @@ -0,0 +1,10 @@ +RRRRIICCFF
+RRRRIICCCF
+VVRRRCCFFF
+VVRCCCJFFF
+VVVVCJJCFE
+VVIVCCJJEE
+VVIIICJJEE
+MIIIIIJJEE
+MIIISIJEEE
+MMMISSJEEE
\ No newline at end of file diff --git a/2024/day12/solve.py b/2024/day12/solve.py new file mode 100644 index 0000000..e7a6b7b --- /dev/null +++ b/2024/day12/solve.py @@ -0,0 +1,92 @@ +from typing import Optional
+from functools import cmp_to_key
+
+
+def chart_region(plots: list[list[Optional[str]]], current_pos: tuple[int, int],
+ charted_positions: list[tuple[int, int]], fence_positions: list[list[tuple[int, int]]]) -> tuple[int, int]:
+ charted_positions.append(current_pos)
+ current_plot = plots[current_pos[0]][current_pos[1]]
+
+ plot_count = 1
+ fence_count = 0
+
+ row_cnt = len(data)
+ col_cnt = len(data[0])
+ for dir_idx, direct in enumerate(((-1, 0), (1, 0), (0, -1), (0, 1))):
+ new_pos = (current_pos[0] + direct[0], current_pos[1] + direct[1])
+ if 0 <= new_pos[0] < row_cnt and 0 <= new_pos[1] < col_cnt and plots[new_pos[0]][new_pos[1]] == current_plot:
+ if new_pos not in charted_positions:
+ result = chart_region(plots, new_pos, charted_positions, fence_positions)
+ plot_count += result[0]
+ fence_count += result[1]
+ else:
+ fence_positions[dir_idx].append(current_pos)
+ fence_count += 1
+
+ return plot_count, fence_count
+
+
+def compare_row_first(item1: tuple[int, int], item2: tuple[int, int]):
+ row_diff = item1[0] - item2[0]
+ if row_diff != 0:
+ return row_diff
+
+ return item1[1] - item2[1]
+
+
+def compare_col_first(item1: tuple[int, int], item2: tuple[int, int]):
+ col_diff = item1[1] - item2[1]
+ if col_diff != 0:
+ return col_diff
+
+ return item1[0] - item2[0]
+
+
+def calculate_discount(fence_positions: list[list[tuple[int, int]]]) -> int:
+ adjacents = 0
+ for charted_positions in fence_positions:
+ charted_positions.sort(key=cmp_to_key(compare_row_first))
+ last_pos = None
+ for current_pos in charted_positions:
+ if last_pos is not None and last_pos[0] == current_pos[0] and last_pos[1] + 1 == current_pos[1]:
+ adjacents += 1
+
+ last_pos = current_pos
+
+ charted_positions.sort(key=cmp_to_key(compare_col_first))
+ last_pos = None
+ for current_pos in charted_positions:
+ if last_pos is not None and last_pos[1] == current_pos[1] and last_pos[0] + 1 == current_pos[0]:
+ adjacents += 1
+
+ last_pos = current_pos
+
+ return adjacents
+
+
+use_discount = True # for part two
+
+data = []
+with open("input") as f:
+ for line in f:
+ data.append(list(line.strip()))
+
+row_count = len(data)
+col_count = len(data[0])
+
+final_sum = 0
+
+for row in range(row_count):
+ for col in range(col_count):
+ if data[row][col] is not None:
+ charted_pos: list[tuple[int, int]] = []
+ fence_pos: list[list[tuple[int, int]]] = [[], [], [], []]
+ chart_result = chart_region(data, (row, col), charted_pos, fence_pos)
+ fences = chart_result[1]
+ if use_discount:
+ fences -= calculate_discount(fence_pos)
+ final_sum += chart_result[0] * fences
+ for pos in charted_pos:
+ data[pos[0]][pos[1]] = None
+
+print(final_sum)
diff --git a/2024/day13/input b/2024/day13/input new file mode 100644 index 0000000..83a1772 --- /dev/null +++ b/2024/day13/input @@ -0,0 +1,1279 @@ +Button A: X+27, Y+65
+Button B: X+58, Y+17
+Prize: X=2211, Y=4587
+
+Button A: X+87, Y+22
+Button B: X+25, Y+77
+Prize: X=7656, Y=8085
+
+Button A: X+99, Y+92
+Button B: X+15, Y+64
+Prize: X=9099, Y=8756
+
+Button A: X+50, Y+26
+Button B: X+34, Y+59
+Prize: X=11084, Y=7900
+
+Button A: X+24, Y+87
+Button B: X+90, Y+57
+Prize: X=6354, Y=5532
+
+Button A: X+14, Y+64
+Button B: X+78, Y+26
+Prize: X=16652, Y=3842
+
+Button A: X+69, Y+16
+Button B: X+24, Y+72
+Prize: X=16322, Y=12832
+
+Button A: X+20, Y+47
+Button B: X+64, Y+31
+Prize: X=12000, Y=9474
+
+Button A: X+50, Y+11
+Button B: X+25, Y+48
+Prize: X=5775, Y=6808
+
+Button A: X+99, Y+94
+Button B: X+58, Y+12
+Prize: X=12605, Y=9298
+
+Button A: X+63, Y+71
+Button B: X+82, Y+17
+Prize: X=3940, Y=2555
+
+Button A: X+27, Y+23
+Button B: X+18, Y+86
+Prize: X=1665, Y=4669
+
+Button A: X+85, Y+22
+Button B: X+28, Y+96
+Prize: X=2909, Y=3238
+
+Button A: X+41, Y+14
+Button B: X+18, Y+68
+Prize: X=4228, Y=12416
+
+Button A: X+12, Y+35
+Button B: X+66, Y+12
+Prize: X=12434, Y=2314
+
+Button A: X+37, Y+12
+Button B: X+15, Y+28
+Prize: X=2161, Y=1580
+
+Button A: X+11, Y+59
+Button B: X+83, Y+22
+Prize: X=18275, Y=2635
+
+Button A: X+29, Y+59
+Button B: X+68, Y+37
+Prize: X=8698, Y=8632
+
+Button A: X+96, Y+13
+Button B: X+58, Y+61
+Prize: X=9524, Y=3947
+
+Button A: X+38, Y+97
+Button B: X+80, Y+28
+Prize: X=3102, Y=6861
+
+Button A: X+54, Y+26
+Button B: X+42, Y+89
+Prize: X=6330, Y=7931
+
+Button A: X+12, Y+35
+Button B: X+58, Y+14
+Prize: X=10190, Y=10931
+
+Button A: X+76, Y+28
+Button B: X+23, Y+70
+Prize: X=19054, Y=7956
+
+Button A: X+23, Y+50
+Button B: X+46, Y+14
+Prize: X=353, Y=13712
+
+Button A: X+97, Y+22
+Button B: X+49, Y+91
+Prize: X=7826, Y=4571
+
+Button A: X+27, Y+57
+Button B: X+42, Y+18
+Prize: X=5241, Y=5835
+
+Button A: X+66, Y+20
+Button B: X+21, Y+51
+Prize: X=9767, Y=18953
+
+Button A: X+73, Y+39
+Button B: X+17, Y+55
+Prize: X=9040, Y=13328
+
+Button A: X+95, Y+34
+Button B: X+15, Y+18
+Prize: X=9150, Y=4500
+
+Button A: X+29, Y+53
+Button B: X+71, Y+14
+Prize: X=5737, Y=2266
+
+Button A: X+12, Y+44
+Button B: X+63, Y+13
+Prize: X=7307, Y=18161
+
+Button A: X+46, Y+15
+Button B: X+19, Y+33
+Prize: X=6646, Y=8327
+
+Button A: X+62, Y+26
+Button B: X+26, Y+56
+Prize: X=3774, Y=14802
+
+Button A: X+17, Y+63
+Button B: X+49, Y+42
+Prize: X=3801, Y=5292
+
+Button A: X+14, Y+64
+Button B: X+83, Y+26
+Prize: X=1869, Y=6070
+
+Button A: X+22, Y+69
+Button B: X+42, Y+11
+Prize: X=10104, Y=12772
+
+Button A: X+31, Y+47
+Button B: X+43, Y+16
+Prize: X=8826, Y=8112
+
+Button A: X+31, Y+58
+Button B: X+41, Y+13
+Prize: X=17723, Y=4139
+
+Button A: X+85, Y+14
+Button B: X+18, Y+28
+Prize: X=3152, Y=1120
+
+Button A: X+23, Y+45
+Button B: X+61, Y+25
+Prize: X=11409, Y=15365
+
+Button A: X+70, Y+33
+Button B: X+11, Y+46
+Prize: X=11210, Y=10845
+
+Button A: X+57, Y+38
+Button B: X+11, Y+36
+Prize: X=19514, Y=11248
+
+Button A: X+45, Y+14
+Button B: X+45, Y+82
+Prize: X=1925, Y=2062
+
+Button A: X+22, Y+49
+Button B: X+61, Y+29
+Prize: X=19547, Y=2416
+
+Button A: X+77, Y+44
+Button B: X+25, Y+80
+Prize: X=2360, Y=6540
+
+Button A: X+18, Y+87
+Button B: X+75, Y+19
+Prize: X=5721, Y=3263
+
+Button A: X+52, Y+28
+Button B: X+12, Y+41
+Prize: X=16460, Y=7575
+
+Button A: X+57, Y+20
+Button B: X+12, Y+63
+Prize: X=13184, Y=2170
+
+Button A: X+61, Y+17
+Button B: X+49, Y+63
+Prize: X=4704, Y=3038
+
+Button A: X+49, Y+11
+Button B: X+73, Y+89
+Prize: X=10054, Y=8066
+
+Button A: X+85, Y+86
+Button B: X+17, Y+74
+Prize: X=3961, Y=5314
+
+Button A: X+25, Y+48
+Button B: X+69, Y+41
+Prize: X=1850, Y=15717
+
+Button A: X+16, Y+68
+Button B: X+76, Y+12
+Prize: X=3608, Y=5084
+
+Button A: X+60, Y+80
+Button B: X+28, Y+11
+Prize: X=18676, Y=12367
+
+Button A: X+87, Y+18
+Button B: X+38, Y+54
+Prize: X=8670, Y=3870
+
+Button A: X+81, Y+12
+Button B: X+71, Y+85
+Prize: X=10212, Y=5088
+
+Button A: X+17, Y+27
+Button B: X+45, Y+19
+Prize: X=6991, Y=577
+
+Button A: X+52, Y+31
+Button B: X+14, Y+90
+Prize: X=5328, Y=9382
+
+Button A: X+40, Y+30
+Button B: X+32, Y+76
+Prize: X=4976, Y=5708
+
+Button A: X+29, Y+57
+Button B: X+80, Y+35
+Prize: X=2809, Y=3932
+
+Button A: X+38, Y+11
+Button B: X+25, Y+68
+Prize: X=18956, Y=1433
+
+Button A: X+26, Y+46
+Button B: X+47, Y+27
+Prize: X=13190, Y=9290
+
+Button A: X+97, Y+22
+Button B: X+60, Y+86
+Prize: X=7042, Y=4710
+
+Button A: X+55, Y+88
+Button B: X+95, Y+43
+Prize: X=9760, Y=8204
+
+Button A: X+16, Y+63
+Button B: X+64, Y+21
+Prize: X=18400, Y=18281
+
+Button A: X+40, Y+35
+Button B: X+25, Y+77
+Prize: X=2580, Y=4683
+
+Button A: X+71, Y+74
+Button B: X+82, Y+12
+Prize: X=8649, Y=5782
+
+Button A: X+77, Y+14
+Button B: X+27, Y+94
+Prize: X=4708, Y=6736
+
+Button A: X+66, Y+42
+Button B: X+20, Y+92
+Prize: X=7206, Y=11958
+
+Button A: X+24, Y+75
+Button B: X+55, Y+14
+Prize: X=3433, Y=5834
+
+Button A: X+34, Y+73
+Button B: X+88, Y+23
+Prize: X=6872, Y=5130
+
+Button A: X+23, Y+63
+Button B: X+37, Y+13
+Prize: X=4745, Y=10593
+
+Button A: X+40, Y+59
+Button B: X+73, Y+33
+Prize: X=10217, Y=8424
+
+Button A: X+14, Y+51
+Button B: X+47, Y+16
+Prize: X=12481, Y=8354
+
+Button A: X+48, Y+99
+Button B: X+95, Y+20
+Prize: X=4597, Y=7546
+
+Button A: X+13, Y+41
+Button B: X+29, Y+12
+Prize: X=263, Y=1388
+
+Button A: X+19, Y+50
+Button B: X+41, Y+24
+Prize: X=11548, Y=7664
+
+Button A: X+97, Y+43
+Button B: X+27, Y+73
+Prize: X=7998, Y=4522
+
+Button A: X+21, Y+43
+Button B: X+62, Y+12
+Prize: X=4390, Y=4276
+
+Button A: X+14, Y+44
+Button B: X+77, Y+48
+Prize: X=18113, Y=19392
+
+Button A: X+14, Y+43
+Button B: X+33, Y+18
+Prize: X=1207, Y=18546
+
+Button A: X+11, Y+39
+Button B: X+50, Y+25
+Prize: X=9397, Y=14203
+
+Button A: X+35, Y+60
+Button B: X+92, Y+27
+Prize: X=8135, Y=2835
+
+Button A: X+15, Y+47
+Button B: X+33, Y+17
+Prize: X=3491, Y=11363
+
+Button A: X+20, Y+78
+Button B: X+68, Y+31
+Prize: X=2560, Y=6471
+
+Button A: X+36, Y+16
+Button B: X+46, Y+79
+Prize: X=4098, Y=6213
+
+Button A: X+22, Y+73
+Button B: X+93, Y+13
+Prize: X=3155, Y=6035
+
+Button A: X+91, Y+80
+Button B: X+14, Y+87
+Prize: X=7973, Y=11192
+
+Button A: X+45, Y+17
+Button B: X+25, Y+71
+Prize: X=9440, Y=16002
+
+Button A: X+71, Y+21
+Button B: X+22, Y+68
+Prize: X=4637, Y=4017
+
+Button A: X+97, Y+29
+Button B: X+48, Y+97
+Prize: X=10461, Y=5607
+
+Button A: X+66, Y+25
+Button B: X+11, Y+31
+Prize: X=16809, Y=9722
+
+Button A: X+12, Y+30
+Button B: X+57, Y+28
+Prize: X=8939, Y=1420
+
+Button A: X+44, Y+12
+Button B: X+47, Y+74
+Prize: X=9821, Y=17594
+
+Button A: X+46, Y+31
+Button B: X+16, Y+34
+Prize: X=18700, Y=18424
+
+Button A: X+66, Y+86
+Button B: X+81, Y+30
+Prize: X=10791, Y=9906
+
+Button A: X+13, Y+65
+Button B: X+77, Y+76
+Prize: X=2910, Y=5898
+
+Button A: X+55, Y+20
+Button B: X+29, Y+68
+Prize: X=10013, Y=18356
+
+Button A: X+26, Y+13
+Button B: X+44, Y+68
+Prize: X=18626, Y=3889
+
+Button A: X+13, Y+74
+Button B: X+97, Y+18
+Prize: X=3977, Y=7682
+
+Button A: X+34, Y+11
+Button B: X+13, Y+67
+Prize: X=4243, Y=3537
+
+Button A: X+21, Y+67
+Button B: X+74, Y+21
+Prize: X=17831, Y=14155
+
+Button A: X+84, Y+13
+Button B: X+48, Y+45
+Prize: X=3924, Y=1246
+
+Button A: X+17, Y+42
+Button B: X+49, Y+21
+Prize: X=11445, Y=18029
+
+Button A: X+49, Y+74
+Button B: X+88, Y+22
+Prize: X=3289, Y=2860
+
+Button A: X+49, Y+13
+Button B: X+30, Y+66
+Prize: X=17781, Y=16557
+
+Button A: X+79, Y+86
+Button B: X+99, Y+13
+Prize: X=12460, Y=6930
+
+Button A: X+30, Y+67
+Button B: X+32, Y+14
+Prize: X=13872, Y=10152
+
+Button A: X+21, Y+47
+Button B: X+73, Y+31
+Prize: X=6722, Y=4454
+
+Button A: X+46, Y+65
+Button B: X+63, Y+20
+Prize: X=3443, Y=4520
+
+Button A: X+61, Y+11
+Button B: X+18, Y+79
+Prize: X=6665, Y=1404
+
+Button A: X+63, Y+11
+Button B: X+19, Y+78
+Prize: X=13512, Y=14869
+
+Button A: X+32, Y+67
+Button B: X+34, Y+15
+Prize: X=9010, Y=663
+
+Button A: X+24, Y+47
+Button B: X+46, Y+22
+Prize: X=17534, Y=15547
+
+Button A: X+19, Y+12
+Button B: X+11, Y+32
+Prize: X=354, Y=1516
+
+Button A: X+66, Y+26
+Button B: X+14, Y+94
+Prize: X=2244, Y=6724
+
+Button A: X+27, Y+99
+Button B: X+91, Y+24
+Prize: X=3358, Y=3642
+
+Button A: X+69, Y+53
+Button B: X+12, Y+78
+Prize: X=4548, Y=4250
+
+Button A: X+23, Y+26
+Button B: X+82, Y+24
+Prize: X=9646, Y=4172
+
+Button A: X+74, Y+41
+Button B: X+15, Y+39
+Prize: X=11784, Y=18519
+
+Button A: X+81, Y+14
+Button B: X+68, Y+95
+Prize: X=7383, Y=3274
+
+Button A: X+29, Y+58
+Button B: X+41, Y+11
+Prize: X=2365, Y=4058
+
+Button A: X+35, Y+22
+Button B: X+30, Y+60
+Prize: X=2025, Y=3618
+
+Button A: X+56, Y+14
+Button B: X+13, Y+76
+Prize: X=19427, Y=8192
+
+Button A: X+18, Y+38
+Button B: X+31, Y+11
+Prize: X=4677, Y=3017
+
+Button A: X+76, Y+25
+Button B: X+30, Y+43
+Prize: X=798, Y=892
+
+Button A: X+30, Y+53
+Button B: X+35, Y+12
+Prize: X=14085, Y=17167
+
+Button A: X+55, Y+65
+Button B: X+74, Y+25
+Prize: X=4732, Y=1970
+
+Button A: X+13, Y+87
+Button B: X+91, Y+24
+Prize: X=8138, Y=2982
+
+Button A: X+86, Y+63
+Button B: X+32, Y+93
+Prize: X=4654, Y=3618
+
+Button A: X+79, Y+34
+Button B: X+19, Y+73
+Prize: X=3384, Y=5994
+
+Button A: X+13, Y+60
+Button B: X+56, Y+22
+Prize: X=15079, Y=15910
+
+Button A: X+29, Y+91
+Button B: X+58, Y+16
+Prize: X=4031, Y=8167
+
+Button A: X+30, Y+58
+Button B: X+46, Y+25
+Prize: X=11614, Y=4607
+
+Button A: X+25, Y+40
+Button B: X+36, Y+12
+Prize: X=15112, Y=4864
+
+Button A: X+74, Y+70
+Button B: X+11, Y+62
+Prize: X=2977, Y=3590
+
+Button A: X+75, Y+73
+Button B: X+15, Y+90
+Prize: X=7170, Y=9844
+
+Button A: X+11, Y+45
+Button B: X+34, Y+16
+Prize: X=6530, Y=598
+
+Button A: X+84, Y+21
+Button B: X+57, Y+87
+Prize: X=9606, Y=6621
+
+Button A: X+97, Y+65
+Button B: X+22, Y+54
+Prize: X=2949, Y=2565
+
+Button A: X+34, Y+11
+Button B: X+36, Y+51
+Prize: X=5464, Y=4916
+
+Button A: X+53, Y+13
+Button B: X+30, Y+65
+Prize: X=12915, Y=7010
+
+Button A: X+55, Y+14
+Button B: X+13, Y+62
+Prize: X=13741, Y=18810
+
+Button A: X+73, Y+47
+Button B: X+12, Y+32
+Prize: X=7667, Y=6381
+
+Button A: X+79, Y+38
+Button B: X+15, Y+47
+Prize: X=1663, Y=17231
+
+Button A: X+16, Y+45
+Button B: X+82, Y+53
+Prize: X=9494, Y=11698
+
+Button A: X+26, Y+53
+Button B: X+21, Y+11
+Prize: X=2743, Y=2697
+
+Button A: X+76, Y+82
+Button B: X+62, Y+16
+Prize: X=6114, Y=4510
+
+Button A: X+52, Y+56
+Button B: X+17, Y+84
+Prize: X=939, Y=3836
+
+Button A: X+65, Y+15
+Button B: X+14, Y+36
+Prize: X=6941, Y=10169
+
+Button A: X+44, Y+84
+Button B: X+80, Y+12
+Prize: X=3120, Y=2016
+
+Button A: X+19, Y+48
+Button B: X+62, Y+21
+Prize: X=18113, Y=18134
+
+Button A: X+43, Y+17
+Button B: X+11, Y+35
+Prize: X=6850, Y=19080
+
+Button A: X+42, Y+13
+Button B: X+23, Y+60
+Prize: X=7937, Y=11818
+
+Button A: X+11, Y+29
+Button B: X+78, Y+62
+Prize: X=2096, Y=5944
+
+Button A: X+99, Y+78
+Button B: X+19, Y+58
+Prize: X=986, Y=992
+
+Button A: X+63, Y+89
+Button B: X+50, Y+14
+Prize: X=8427, Y=7997
+
+Button A: X+75, Y+21
+Button B: X+19, Y+65
+Prize: X=7070, Y=1658
+
+Button A: X+77, Y+16
+Button B: X+80, Y+77
+Prize: X=10226, Y=6472
+
+Button A: X+42, Y+26
+Button B: X+14, Y+37
+Prize: X=14396, Y=10963
+
+Button A: X+61, Y+38
+Button B: X+20, Y+44
+Prize: X=18781, Y=4678
+
+Button A: X+41, Y+23
+Button B: X+19, Y+36
+Prize: X=16818, Y=7290
+
+Button A: X+14, Y+75
+Button B: X+21, Y+13
+Prize: X=1673, Y=7072
+
+Button A: X+12, Y+28
+Button B: X+76, Y+19
+Prize: X=8220, Y=4455
+
+Button A: X+56, Y+13
+Button B: X+24, Y+76
+Prize: X=5416, Y=8768
+
+Button A: X+13, Y+54
+Button B: X+33, Y+13
+Prize: X=12445, Y=11874
+
+Button A: X+26, Y+82
+Button B: X+65, Y+57
+Prize: X=4641, Y=9161
+
+Button A: X+25, Y+58
+Button B: X+65, Y+23
+Prize: X=9410, Y=11930
+
+Button A: X+77, Y+93
+Button B: X+71, Y+20
+Prize: X=2645, Y=959
+
+Button A: X+29, Y+26
+Button B: X+89, Y+17
+Prize: X=3223, Y=943
+
+Button A: X+58, Y+18
+Button B: X+27, Y+65
+Prize: X=3127, Y=1933
+
+Button A: X+67, Y+48
+Button B: X+12, Y+36
+Prize: X=13551, Y=776
+
+Button A: X+26, Y+45
+Button B: X+56, Y+26
+Prize: X=15224, Y=2714
+
+Button A: X+42, Y+12
+Button B: X+14, Y+35
+Prize: X=9132, Y=6708
+
+Button A: X+68, Y+27
+Button B: X+23, Y+67
+Prize: X=3977, Y=7308
+
+Button A: X+18, Y+47
+Button B: X+52, Y+21
+Prize: X=9882, Y=13544
+
+Button A: X+16, Y+70
+Button B: X+58, Y+13
+Prize: X=13098, Y=6951
+
+Button A: X+49, Y+24
+Button B: X+18, Y+45
+Prize: X=19509, Y=13154
+
+Button A: X+53, Y+59
+Button B: X+86, Y+18
+Prize: X=7733, Y=5499
+
+Button A: X+81, Y+17
+Button B: X+27, Y+90
+Prize: X=1593, Y=4045
+
+Button A: X+69, Y+22
+Button B: X+22, Y+64
+Prize: X=2925, Y=1962
+
+Button A: X+25, Y+57
+Button B: X+92, Y+49
+Prize: X=3909, Y=4572
+
+Button A: X+52, Y+98
+Button B: X+78, Y+47
+Prize: X=8554, Y=6821
+
+Button A: X+11, Y+83
+Button B: X+63, Y+30
+Prize: X=3466, Y=3439
+
+Button A: X+16, Y+64
+Button B: X+58, Y+19
+Prize: X=18736, Y=4768
+
+Button A: X+93, Y+11
+Button B: X+69, Y+58
+Prize: X=14382, Y=5439
+
+Button A: X+57, Y+14
+Button B: X+15, Y+37
+Prize: X=269, Y=12944
+
+Button A: X+21, Y+29
+Button B: X+88, Y+34
+Prize: X=8709, Y=3887
+
+Button A: X+15, Y+41
+Button B: X+42, Y+22
+Prize: X=5837, Y=7547
+
+Button A: X+36, Y+70
+Button B: X+60, Y+24
+Prize: X=13640, Y=7416
+
+Button A: X+38, Y+90
+Button B: X+75, Y+16
+Prize: X=10317, Y=9080
+
+Button A: X+36, Y+53
+Button B: X+24, Y+11
+Prize: X=8924, Y=5732
+
+Button A: X+82, Y+11
+Button B: X+15, Y+82
+Prize: X=10504, Y=6178
+
+Button A: X+30, Y+73
+Button B: X+43, Y+14
+Prize: X=7059, Y=14604
+
+Button A: X+16, Y+92
+Button B: X+73, Y+58
+Prize: X=6760, Y=12824
+
+Button A: X+86, Y+31
+Button B: X+52, Y+98
+Prize: X=2618, Y=1657
+
+Button A: X+49, Y+13
+Button B: X+18, Y+45
+Prize: X=14508, Y=1215
+
+Button A: X+94, Y+34
+Button B: X+37, Y+83
+Prize: X=10087, Y=9009
+
+Button A: X+24, Y+58
+Button B: X+69, Y+38
+Prize: X=9839, Y=18698
+
+Button A: X+51, Y+18
+Button B: X+16, Y+29
+Prize: X=19247, Y=17528
+
+Button A: X+71, Y+42
+Button B: X+26, Y+51
+Prize: X=7232, Y=7377
+
+Button A: X+78, Y+69
+Button B: X+84, Y+13
+Prize: X=9156, Y=2214
+
+Button A: X+28, Y+11
+Button B: X+18, Y+44
+Prize: X=10000, Y=19768
+
+Button A: X+63, Y+17
+Button B: X+39, Y+64
+Prize: X=5511, Y=2824
+
+Button A: X+86, Y+30
+Button B: X+34, Y+79
+Prize: X=4208, Y=5362
+
+Button A: X+14, Y+87
+Button B: X+78, Y+73
+Prize: X=2820, Y=6408
+
+Button A: X+53, Y+26
+Button B: X+12, Y+25
+Prize: X=18982, Y=4199
+
+Button A: X+50, Y+20
+Button B: X+32, Y+66
+Prize: X=16348, Y=17274
+
+Button A: X+16, Y+53
+Button B: X+51, Y+17
+Prize: X=5062, Y=12215
+
+Button A: X+77, Y+45
+Button B: X+12, Y+48
+Prize: X=3828, Y=3908
+
+Button A: X+78, Y+19
+Button B: X+17, Y+76
+Prize: X=15074, Y=1032
+
+Button A: X+24, Y+61
+Button B: X+56, Y+18
+Prize: X=1528, Y=490
+
+Button A: X+46, Y+47
+Button B: X+14, Y+84
+Prize: X=3018, Y=9635
+
+Button A: X+84, Y+44
+Button B: X+34, Y+77
+Prize: X=7864, Y=6842
+
+Button A: X+56, Y+41
+Button B: X+16, Y+67
+Prize: X=5240, Y=8204
+
+Button A: X+11, Y+42
+Button B: X+49, Y+12
+Prize: X=19454, Y=782
+
+Button A: X+20, Y+60
+Button B: X+35, Y+16
+Prize: X=9760, Y=18208
+
+Button A: X+68, Y+15
+Button B: X+61, Y+60
+Prize: X=7245, Y=4065
+
+Button A: X+89, Y+22
+Button B: X+15, Y+88
+Prize: X=7530, Y=6666
+
+Button A: X+42, Y+17
+Button B: X+30, Y+47
+Prize: X=5618, Y=13205
+
+Button A: X+22, Y+57
+Button B: X+78, Y+13
+Prize: X=6576, Y=4936
+
+Button A: X+11, Y+48
+Button B: X+74, Y+59
+Prize: X=5060, Y=7565
+
+Button A: X+97, Y+11
+Button B: X+58, Y+66
+Prize: X=9112, Y=2816
+
+Button A: X+80, Y+25
+Button B: X+15, Y+61
+Prize: X=3950, Y=18621
+
+Button A: X+49, Y+33
+Button B: X+19, Y+39
+Prize: X=14357, Y=1721
+
+Button A: X+20, Y+51
+Button B: X+58, Y+35
+Prize: X=13354, Y=9640
+
+Button A: X+39, Y+37
+Button B: X+24, Y+98
+Prize: X=2613, Y=3457
+
+Button A: X+36, Y+50
+Button B: X+89, Y+35
+Prize: X=7991, Y=6225
+
+Button A: X+32, Y+97
+Button B: X+94, Y+81
+Prize: X=7664, Y=8548
+
+Button A: X+49, Y+11
+Button B: X+23, Y+82
+Prize: X=262, Y=9138
+
+Button A: X+47, Y+15
+Button B: X+22, Y+43
+Prize: X=8222, Y=10349
+
+Button A: X+96, Y+89
+Button B: X+12, Y+54
+Prize: X=7572, Y=7663
+
+Button A: X+62, Y+30
+Button B: X+32, Y+62
+Prize: X=1100, Y=10678
+
+Button A: X+29, Y+70
+Button B: X+97, Y+14
+Prize: X=8685, Y=5334
+
+Button A: X+64, Y+36
+Button B: X+12, Y+30
+Prize: X=7672, Y=17876
+
+Button A: X+64, Y+95
+Button B: X+56, Y+16
+Prize: X=9656, Y=7822
+
+Button A: X+41, Y+66
+Button B: X+47, Y+18
+Prize: X=19713, Y=3014
+
+Button A: X+77, Y+20
+Button B: X+12, Y+45
+Prize: X=10253, Y=10055
+
+Button A: X+20, Y+52
+Button B: X+71, Y+28
+Prize: X=3183, Y=17812
+
+Button A: X+38, Y+12
+Button B: X+11, Y+16
+Prize: X=14518, Y=17124
+
+Button A: X+71, Y+20
+Button B: X+76, Y+95
+Prize: X=9726, Y=8995
+
+Button A: X+82, Y+20
+Button B: X+31, Y+96
+Prize: X=7453, Y=2260
+
+Button A: X+85, Y+59
+Button B: X+29, Y+83
+Prize: X=7467, Y=6629
+
+Button A: X+17, Y+30
+Button B: X+35, Y+20
+Prize: X=11302, Y=14110
+
+Button A: X+39, Y+81
+Button B: X+54, Y+20
+Prize: X=3093, Y=2277
+
+Button A: X+76, Y+14
+Button B: X+45, Y+71
+Prize: X=3328, Y=3874
+
+Button A: X+19, Y+91
+Button B: X+68, Y+60
+Prize: X=4259, Y=4723
+
+Button A: X+15, Y+53
+Button B: X+78, Y+33
+Prize: X=6851, Y=8685
+
+Button A: X+20, Y+59
+Button B: X+36, Y+12
+Prize: X=1208, Y=18047
+
+Button A: X+52, Y+17
+Button B: X+31, Y+70
+Prize: X=758, Y=17044
+
+Button A: X+13, Y+26
+Button B: X+62, Y+26
+Prize: X=7073, Y=380
+
+Button A: X+33, Y+23
+Button B: X+11, Y+28
+Prize: X=13454, Y=7460
+
+Button A: X+51, Y+40
+Button B: X+20, Y+57
+Prize: X=4943, Y=6397
+
+Button A: X+90, Y+21
+Button B: X+18, Y+68
+Prize: X=4680, Y=1730
+
+Button A: X+55, Y+50
+Button B: X+19, Y+84
+Prize: X=2015, Y=7170
+
+Button A: X+19, Y+55
+Button B: X+69, Y+17
+Prize: X=19115, Y=15807
+
+Button A: X+42, Y+81
+Button B: X+49, Y+18
+Prize: X=7336, Y=6957
+
+Button A: X+37, Y+77
+Button B: X+82, Y+25
+Prize: X=3724, Y=7313
+
+Button A: X+41, Y+18
+Button B: X+42, Y+67
+Prize: X=18780, Y=12045
+
+Button A: X+13, Y+36
+Button B: X+70, Y+42
+Prize: X=15942, Y=5696
+
+Button A: X+45, Y+67
+Button B: X+33, Y+12
+Prize: X=14717, Y=15673
+
+Button A: X+31, Y+57
+Button B: X+68, Y+29
+Prize: X=8718, Y=7483
+
+Button A: X+16, Y+72
+Button B: X+50, Y+36
+Prize: X=4454, Y=5868
+
+Button A: X+97, Y+19
+Button B: X+58, Y+55
+Prize: X=7379, Y=4151
+
+Button A: X+53, Y+38
+Button B: X+19, Y+96
+Prize: X=4772, Y=10094
+
+Button A: X+54, Y+16
+Button B: X+12, Y+27
+Prize: X=13058, Y=7571
+
+Button A: X+18, Y+59
+Button B: X+73, Y+50
+Prize: X=5266, Y=5147
+
+Button A: X+73, Y+19
+Button B: X+18, Y+62
+Prize: X=1721, Y=3371
+
+Button A: X+13, Y+62
+Button B: X+75, Y+12
+Prize: X=16285, Y=10524
+
+Button A: X+44, Y+14
+Button B: X+25, Y+55
+Prize: X=10918, Y=12418
+
+Button A: X+54, Y+38
+Button B: X+17, Y+47
+Prize: X=2549, Y=2039
+
+Button A: X+47, Y+16
+Button B: X+70, Y+90
+Prize: X=4111, Y=1598
+
+Button A: X+40, Y+38
+Button B: X+93, Y+22
+Prize: X=10108, Y=4560
+
+Button A: X+70, Y+15
+Button B: X+16, Y+48
+Prize: X=730, Y=825
+
+Button A: X+43, Y+80
+Button B: X+53, Y+31
+Prize: X=3837, Y=4164
+
+Button A: X+49, Y+68
+Button B: X+36, Y+12
+Prize: X=1627, Y=11004
+
+Button A: X+70, Y+26
+Button B: X+15, Y+63
+Prize: X=5645, Y=1901
+
+Button A: X+76, Y+58
+Button B: X+27, Y+99
+Prize: X=6694, Y=7774
+
+Button A: X+20, Y+72
+Button B: X+66, Y+21
+Prize: X=17662, Y=10379
+
+Button A: X+41, Y+69
+Button B: X+50, Y+24
+Prize: X=17575, Y=4523
+
+Button A: X+70, Y+21
+Button B: X+56, Y+63
+Prize: X=9030, Y=6405
+
+Button A: X+96, Y+82
+Button B: X+26, Y+79
+Prize: X=6758, Y=7533
+
+Button A: X+72, Y+49
+Button B: X+16, Y+35
+Prize: X=17192, Y=14963
+
+Button A: X+18, Y+60
+Button B: X+75, Y+18
+Prize: X=6144, Y=6096
+
+Button A: X+77, Y+40
+Button B: X+12, Y+45
+Prize: X=7417, Y=13410
+
+Button A: X+31, Y+13
+Button B: X+26, Y+59
+Prize: X=19602, Y=4158
+
+Button A: X+72, Y+11
+Button B: X+92, Y+90
+Prize: X=7488, Y=3878
+
+Button A: X+51, Y+96
+Button B: X+66, Y+25
+Prize: X=3675, Y=2849
+
+Button A: X+29, Y+70
+Button B: X+47, Y+14
+Prize: X=12636, Y=15796
+
+Button A: X+13, Y+34
+Button B: X+91, Y+11
+Prize: X=8164, Y=1376
+
+Button A: X+35, Y+67
+Button B: X+56, Y+17
+Prize: X=10805, Y=4589
+
+Button A: X+39, Y+16
+Button B: X+19, Y+28
+Prize: X=6368, Y=16416
+
+Button A: X+24, Y+64
+Button B: X+79, Y+46
+Prize: X=5664, Y=7200
+
+Button A: X+62, Y+25
+Button B: X+16, Y+38
+Prize: X=4952, Y=2470
+
+Button A: X+51, Y+31
+Button B: X+37, Y+71
+Prize: X=1394, Y=1672
+
+Button A: X+13, Y+63
+Button B: X+37, Y+12
+Prize: X=1966, Y=3716
+
+Button A: X+17, Y+77
+Button B: X+62, Y+13
+Prize: X=12283, Y=15031
+
+Button A: X+17, Y+50
+Button B: X+39, Y+21
+Prize: X=4196, Y=15923
+
+Button A: X+58, Y+30
+Button B: X+33, Y+64
+Prize: X=5343, Y=3186
+
+Button A: X+46, Y+21
+Button B: X+49, Y+73
+Prize: X=13427, Y=10951
+
+Button A: X+21, Y+58
+Button B: X+66, Y+47
+Prize: X=7536, Y=9585
+
+Button A: X+88, Y+51
+Button B: X+26, Y+72
+Prize: X=7596, Y=5427
+
+Button A: X+55, Y+48
+Button B: X+94, Y+15
+Prize: X=10975, Y=5556
+
+Button A: X+12, Y+26
+Button B: X+60, Y+39
+Prize: X=924, Y=1092
+
+Button A: X+49, Y+23
+Button B: X+35, Y+60
+Prize: X=15285, Y=7315
+
+Button A: X+11, Y+82
+Button B: X+78, Y+15
+Prize: X=4905, Y=5989
+
+Button A: X+19, Y+61
+Button B: X+74, Y+56
+Prize: X=2004, Y=5526
+
+Button A: X+11, Y+12
+Button B: X+94, Y+23
+Prize: X=1709, Y=1228
+
+Button A: X+30, Y+63
+Button B: X+99, Y+56
+Prize: X=6276, Y=6496
+
+Button A: X+13, Y+51
+Button B: X+60, Y+29
+Prize: X=17520, Y=789
+
+Button A: X+72, Y+27
+Button B: X+16, Y+42
+Prize: X=1552, Y=2778
+
+Button A: X+68, Y+87
+Button B: X+61, Y+14
+Prize: X=5879, Y=6561
+
+Button A: X+34, Y+94
+Button B: X+67, Y+33
+Prize: X=8854, Y=11082
+
+Button A: X+14, Y+73
+Button B: X+89, Y+64
+Prize: X=4490, Y=5809
+
+Button A: X+74, Y+14
+Button B: X+26, Y+88
+Prize: X=4150, Y=2696
+
+Button A: X+53, Y+19
+Button B: X+18, Y+68
+Prize: X=15211, Y=12095
+
+Button A: X+13, Y+83
+Button B: X+57, Y+56
+Prize: X=895, Y=2635
+
+Button A: X+72, Y+76
+Button B: X+93, Y+24
+Prize: X=10377, Y=5836
+
+Button A: X+29, Y+86
+Button B: X+19, Y+16
+Prize: X=2240, Y=2810
+
+Button A: X+24, Y+14
+Button B: X+11, Y+47
+Prize: X=1676, Y=4062
\ No newline at end of file diff --git a/2024/day13/input_test b/2024/day13/input_test new file mode 100644 index 0000000..c51f154 --- /dev/null +++ b/2024/day13/input_test @@ -0,0 +1,15 @@ +Button A: X+94, Y+34
+Button B: X+22, Y+67
+Prize: X=8400, Y=5400
+
+Button A: X+26, Y+66
+Button B: X+67, Y+21
+Prize: X=12748, Y=12176
+
+Button A: X+17, Y+86
+Button B: X+84, Y+37
+Prize: X=7870, Y=6450
+
+Button A: X+69, Y+23
+Button B: X+27, Y+71
+Prize: X=18641, Y=10279
\ No newline at end of file diff --git a/2024/day13/solve.py b/2024/day13/solve.py new file mode 100644 index 0000000..ade85f0 --- /dev/null +++ b/2024/day13/solve.py @@ -0,0 +1,27 @@ +def solve_machine(a_x: int, a_y: int, b_x: int, b_y: int, prize_x: int, prize_y: int) -> int:
+ cheapest_solution = 500
+ for a_press_times in range(101):
+ for b_press_times in range(101):
+ if a_press_times * a_x + b_press_times * b_x == prize_x and a_press_times * a_y + b_press_times * b_y == prize_y and a_press_times * 3 + b_press_times < cheapest_solution:
+ cheapest_solution = a_press_times * 3 + b_press_times
+
+ if cheapest_solution == 500:
+ return 0
+
+ return cheapest_solution
+
+
+with open("input") as f:
+ all_text = f.read()
+
+result = 0
+for details in all_text.split("\n\n"):
+ lines = details.split("\n")
+ button_a = lines[0][10:].split(", ")
+ button_b = lines[1][10:].split(", ")
+ prize = lines[2][7:].split(", ")
+ result += solve_machine(int(button_a[0][2:]), int(button_a[1][2:]),
+ int(button_b[0][2:]), int(button_b[1][2:]),
+ int(prize[0][2:]), int(prize[1][2:]))
+
+print(result)
diff --git a/2024/day13/solve2.py b/2024/day13/solve2.py new file mode 100644 index 0000000..f329f62 --- /dev/null +++ b/2024/day13/solve2.py @@ -0,0 +1,26 @@ +def solve_machine(a_x: int, a_y: int, b_x: int, b_y: int, prize_x: int, prize_y: int) -> int:
+ b_press_times = (a_y * prize_x - prize_y * a_x) / (a_y * b_x - b_y * a_x)
+ a_press_times = (prize_x - b_x * b_press_times) / a_x
+ cheapest_solution = a_press_times * 3 + b_press_times
+
+ if a_press_times.is_integer() and b_press_times.is_integer() and a_press_times >= 0 and b_press_times >= 0:
+ return int(cheapest_solution)
+
+ return 0
+
+
+with open("input") as f:
+ all_text = f.read()
+
+result = 0
+add_price_pos = 10000000000000
+for details in all_text.split("\n\n"):
+ lines = details.split("\n")
+ button_a = lines[0][10:].split(", ")
+ button_b = lines[1][10:].split(", ")
+ prize = lines[2][7:].split(", ")
+ result += solve_machine(int(button_a[0][2:]), int(button_a[1][2:]),
+ int(button_b[0][2:]), int(button_b[1][2:]),
+ int(prize[0][2:]) + add_price_pos, int(prize[1][2:]) + add_price_pos)
+
+print(result)
diff --git a/2024/day14/input b/2024/day14/input new file mode 100644 index 0000000..5c10a9d --- /dev/null +++ b/2024/day14/input @@ -0,0 +1,500 @@ +p=26,88 v=80,92 +p=2,90 v=77,99 +p=43,54 v=-92,-36 +p=96,14 v=-15,13 +p=33,54 v=97,-64 +p=94,53 v=55,67 +p=45,28 v=79,6 +p=64,90 v=-49,54 +p=71,41 v=-9,67 +p=15,37 v=58,-14 +p=43,53 v=9,8 +p=57,88 v=43,-55 +p=37,96 v=-30,-69 +p=35,54 v=-57,22 +p=56,35 v=23,53 +p=84,66 v=-94,75 +p=15,30 v=-43,21 +p=10,97 v=24,-99 +p=88,63 v=21,-54 +p=77,56 v=47,75 +p=83,30 v=38,-38 +p=95,97 v=-2,-91 +p=7,32 v=-1,-42 +p=62,84 v=-66,69 +p=79,66 v=-48,-34 +p=54,39 v=-12,21 +p=87,9 v=-6,-39 +p=66,101 v=-57,-87 +p=47,83 v=-48,69 +p=48,24 v=2,28 +p=71,48 v=-14,-73 +p=25,36 v=40,-66 +p=10,12 v=-29,5 +p=44,10 v=-79,-17 +p=9,65 v=-7,-65 +p=12,83 v=77,-85 +p=70,38 v=-69,-19 +p=60,38 v=-31,-15 +p=98,20 v=7,-38 +p=38,73 v=-61,33 +p=34,32 v=-21,-96 +p=48,44 v=-19,-34 +p=26,49 v=-50,29 +p=79,84 v=82,-93 +p=50,43 v=41,57 +p=9,76 v=-19,-80 +p=81,20 v=25,36 +p=18,19 v=45,-2 +p=36,85 v=-34,89 +p=38,16 v=63,75 +p=45,31 v=-18,-78 +p=7,42 v=-16,66 +p=55,57 v=-77,-11 +p=30,28 v=-43,-23 +p=57,58 v=43,-49 +p=36,57 v=97,-58 +p=7,47 v=-64,-14 +p=73,33 v=26,-48 +p=52,48 v=7,-48 +p=42,66 v=23,75 +p=77,8 v=-28,-82 +p=52,99 v=44,4 +p=27,15 v=37,-3 +p=72,57 v=65,53 +p=59,85 v=69,-54 +p=58,50 v=57,-95 +p=54,73 v=-66,-19 +p=54,64 v=31,-95 +p=91,33 v=53,-43 +p=67,2 v=-5,34 +p=58,65 v=-31,38 +p=65,93 v=62,17 +p=68,59 v=-44,-42 +p=9,27 v=-60,-99 +p=4,73 v=77,-87 +p=88,60 v=18,-20 +p=82,9 v=-96,-9 +p=99,39 v=-11,-24 +p=23,18 v=-56,28 +p=63,101 v=66,-48 +p=4,63 v=-46,97 +p=41,80 v=31,-49 +p=21,25 v=45,36 +p=89,43 v=-2,63 +p=37,78 v=11,86 +p=37,100 v=32,93 +p=77,33 v=-94,29 +p=25,34 v=-12,-81 +p=31,87 v=-30,70 +p=40,37 v=62,7 +p=16,102 v=-82,4 +p=98,45 v=-8,95 +p=60,23 v=-53,-60 +p=12,83 v=-8,19 +p=49,8 v=-70,-39 +p=38,27 v=25,-49 +p=95,25 v=-59,28 +p=42,56 v=18,-51 +p=5,28 v=24,-73 +p=92,73 v=7,33 +p=41,27 v=88,80 +p=78,16 v=18,3 +p=11,80 v=99,62 +p=100,56 v=46,98 +p=97,47 v=20,8 +p=27,6 v=-78,78 +p=45,12 v=-48,-98 +p=41,29 v=-44,-46 +p=84,69 v=-76,-94 +p=89,4 v=-70,-52 +p=40,62 v=-60,72 +p=62,26 v=40,-48 +p=21,55 v=23,-87 +p=80,45 v=-49,-82 +p=28,100 v=23,49 +p=67,38 v=6,-2 +p=66,40 v=17,-44 +p=72,32 v=-85,-28 +p=53,60 v=35,-14 +p=11,14 v=45,72 +p=86,13 v=-36,49 +p=65,88 v=-58,3 +p=97,79 v=72,17 +p=51,55 v=27,24 +p=2,83 v=33,91 +p=78,76 v=-31,-89 +p=83,12 v=86,49 +p=56,93 v=13,19 +p=20,50 v=-38,45 +p=46,6 v=58,17 +p=48,40 v=66,-8 +p=40,26 v=40,14 +p=71,21 v=92,-59 +p=5,67 v=59,-27 +p=65,53 v=-62,44 +p=14,83 v=69,75 +p=95,35 v=-37,58 +p=36,71 v=-57,-43 +p=68,58 v=-97,37 +p=45,75 v=66,61 +p=25,22 v=-75,-66 +p=38,8 v=-17,-83 +p=32,8 v=-8,71 +p=85,78 v=-44,54 +p=48,64 v=53,-65 +p=97,82 v=77,-78 +p=10,32 v=99,-27 +p=84,39 v=8,-21 +p=83,58 v=74,75 +p=67,65 v=48,-6 +p=78,43 v=25,59 +p=22,83 v=23,19 +p=36,45 v=-65,-95 +p=95,51 v=-32,-59 +p=66,5 v=74,78 +p=76,27 v=-42,52 +p=99,64 v=75,-46 +p=51,102 v=44,-25 +p=97,14 v=-41,78 +p=78,56 v=-76,1 +p=77,12 v=-1,-97 +p=58,1 v=13,34 +p=5,28 v=68,-8 +p=30,6 v=31,-83 +p=11,91 v=78,-82 +p=15,39 v=78,-26 +p=32,58 v=84,-36 +p=16,55 v=-36,75 +p=100,96 v=16,42 +p=89,28 v=-6,87 +p=48,19 v=-57,21 +p=42,50 v=-31,15 +p=54,11 v=92,-24 +p=77,98 v=-9,-33 +p=71,36 v=2,60 +p=18,44 v=-55,-66 +p=26,16 v=-62,79 +p=35,80 v=93,-41 +p=90,30 v=29,-96 +p=44,59 v=-26,-4 +p=87,52 v=-43,89 +p=91,39 v=3,-52 +p=35,52 v=49,8 +p=27,60 v=-12,-35 +p=7,18 v=-53,-14 +p=65,67 v=-32,91 +p=13,6 v=19,93 +p=94,28 v=35,33 +p=22,29 v=-38,-78 +p=91,59 v=26,-39 +p=84,43 v=-76,67 +p=29,102 v=-8,-99 +p=84,92 v=-46,-36 +p=56,10 v=-88,20 +p=88,81 v=16,63 +p=19,20 v=-41,79 +p=43,54 v=48,59 +p=11,0 v=28,-61 +p=4,40 v=-94,-82 +p=38,101 v=-18,55 +p=88,18 v=-2,8 +p=13,19 v=28,21 +p=29,11 v=6,-69 +p=76,91 v=16,49 +p=74,29 v=78,74 +p=45,53 v=58,-80 +p=86,11 v=94,1 +p=65,59 v=-14,-6 +p=60,62 v=98,64 +p=57,3 v=48,-32 +p=46,48 v=83,15 +p=54,78 v=58,-63 +p=91,35 v=-19,-74 +p=36,83 v=55,-11 +p=67,53 v=63,-20 +p=20,86 v=-25,63 +p=37,7 v=-30,79 +p=42,7 v=75,-54 +p=76,73 v=14,1 +p=34,57 v=1,-21 +p=31,76 v=79,-44 +p=53,93 v=26,35 +p=60,65 v=-97,-42 +p=99,102 v=-46,-55 +p=65,1 v=-32,-25 +p=86,14 v=60,-61 +p=9,95 v=85,-39 +p=63,86 v=-95,95 +p=4,93 v=94,92 +p=7,81 v=99,-40 +p=28,0 v=28,5 +p=52,41 v=-2,7 +p=14,64 v=-16,-57 +p=22,78 v=-56,54 +p=44,98 v=-88,45 +p=52,72 v=22,-79 +p=63,35 v=13,-52 +p=62,64 v=-62,39 +p=10,53 v=67,31 +p=16,100 v=-69,-63 +p=17,47 v=92,-56 +p=86,22 v=69,94 +p=49,37 v=-79,95 +p=92,96 v=-50,48 +p=54,5 v=-48,70 +p=67,12 v=-76,34 +p=10,10 v=73,34 +p=100,4 v=6,72 +p=1,32 v=-90,37 +p=33,22 v=-8,14 +p=10,96 v=94,-9 +p=84,95 v=-19,-25 +p=42,27 v=66,-60 +p=67,91 v=-76,11 +p=21,23 v=-95,50 +p=53,24 v=-57,-97 +p=19,1 v=47,-62 +p=84,59 v=-5,-2 +p=10,35 v=37,-88 +p=56,76 v=-92,-33 +p=92,83 v=16,62 +p=6,97 v=72,11 +p=65,29 v=4,-82 +p=37,52 v=4,29 +p=78,53 v=39,74 +p=100,50 v=83,-3 +p=43,48 v=-61,8 +p=78,102 v=-22,-99 +p=89,73 v=25,2 +p=91,86 v=7,48 +p=88,37 v=-45,20 +p=80,91 v=81,32 +p=6,6 v=24,-83 +p=86,57 v=3,-14 +p=16,12 v=32,-76 +p=46,53 v=-67,47 +p=79,11 v=-54,64 +p=87,99 v=-35,-7 +p=8,34 v=-37,-75 +p=73,61 v=-70,13 +p=38,2 v=-84,40 +p=92,23 v=9,25 +p=35,60 v=-25,31 +p=72,9 v=16,27 +p=9,33 v=-7,-31 +p=98,17 v=50,28 +p=62,15 v=34,-54 +p=72,4 v=21,86 +p=46,53 v=-39,61 +p=80,58 v=84,-86 +p=83,88 v=-86,29 +p=2,38 v=62,-38 +p=70,61 v=23,-97 +p=100,77 v=-64,-72 +p=27,45 v=58,-14 +p=25,3 v=40,72 +p=73,102 v=-74,34 +p=80,63 v=-58,-56 +p=50,52 v=53,-7 +p=33,82 v=19,99 +p=28,15 v=-52,57 +p=66,43 v=-54,-6 +p=44,40 v=-56,63 +p=31,12 v=36,65 +p=3,41 v=-99,52 +p=35,87 v=-4,-86 +p=79,84 v=-67,99 +p=88,22 v=16,-2 +p=71,85 v=92,70 +p=96,60 v=76,98 +p=38,48 v=14,-7 +p=86,15 v=-33,-75 +p=75,57 v=66,-85 +p=85,68 v=-19,-27 +p=46,95 v=75,48 +p=14,71 v=32,1 +p=74,71 v=-54,-95 +p=11,12 v=-64,13 +p=17,37 v=81,53 +p=2,15 v=23,-3 +p=9,75 v=-39,47 +p=46,70 v=44,-34 +p=86,48 v=-15,-98 +p=32,45 v=62,81 +p=22,3 v=59,94 +p=24,81 v=-82,25 +p=85,11 v=-3,-32 +p=96,86 v=20,39 +p=43,2 v=62,42 +p=45,98 v=-26,-54 +p=51,16 v=92,-53 +p=77,13 v=-45,-61 +p=58,54 v=-44,30 +p=52,3 v=-49,-33 +p=28,76 v=-12,-64 +p=45,38 v=-53,34 +p=11,28 v=85,-67 +p=29,88 v=90,4 +p=44,102 v=-21,17 +p=15,37 v=94,66 +p=73,32 v=30,80 +p=65,86 v=-19,-21 +p=34,64 v=-26,16 +p=60,2 v=-18,78 +p=39,0 v=-34,94 +p=28,15 v=32,-93 +p=8,100 v=98,40 +p=62,62 v=48,60 +p=37,44 v=25,10 +p=39,72 v=-96,91 +p=84,33 v=93,18 +p=81,44 v=69,52 +p=37,22 v=89,-48 +p=0,42 v=-63,-36 +p=35,42 v=-17,-22 +p=90,39 v=-76,-30 +p=55,74 v=-22,-92 +p=1,55 v=-64,-86 +p=60,23 v=-9,-97 +p=21,4 v=-91,64 +p=90,72 v=56,95 +p=35,41 v=58,22 +p=57,81 v=-9,-96 +p=11,102 v=-73,-17 +p=45,58 v=-43,52 +p=43,25 v=48,-37 +p=78,12 v=12,42 +p=48,43 v=79,-29 +p=31,100 v=-30,-54 +p=24,63 v=-61,28 +p=44,67 v=-35,-94 +p=100,49 v=-98,-52 +p=29,54 v=41,-64 +p=29,33 v=50,44 +p=22,40 v=-47,8 +p=56,67 v=-5,75 +p=78,95 v=78,-48 +p=58,72 v=-48,-65 +p=6,94 v=90,9 +p=76,58 v=12,-80 +p=68,62 v=-58,61 +p=62,85 v=57,91 +p=16,88 v=94,-5 +p=72,0 v=-74,-91 +p=0,75 v=11,-93 +p=48,42 v=92,-6 +p=24,102 v=68,-78 +p=21,86 v=-56,25 +p=3,63 v=-11,-43 +p=36,102 v=14,-4 +p=56,52 v=4,-58 +p=5,55 v=-1,84 +p=92,1 v=-94,-84 +p=27,50 v=54,-88 +p=80,91 v=-76,33 +p=50,19 v=9,87 +p=69,37 v=-58,-8 +p=34,63 v=14,61 +p=17,52 v=19,37 +p=93,65 v=-15,46 +p=37,15 v=-13,56 +p=100,63 v=-68,17 +p=41,81 v=97,-92 +p=62,17 v=-72,13 +p=0,16 v=-77,-31 +p=14,17 v=41,28 +p=27,34 v=58,-74 +p=35,40 v=14,21 +p=8,88 v=-24,98 +p=35,28 v=-94,46 +p=93,42 v=-59,22 +p=83,26 v=-11,1 +p=2,22 v=-42,65 +p=35,102 v=-25,-4 +p=21,22 v=41,-81 +p=35,0 v=5,41 +p=70,99 v=74,34 +p=75,28 v=4,81 +p=11,91 v=-56,33 +p=16,52 v=65,-38 +p=55,14 v=-66,78 +p=39,68 v=-71,7 +p=25,53 v=-56,-29 +p=70,42 v=-33,-35 +p=40,81 v=-70,47 +p=15,78 v=-82,26 +p=85,97 v=51,-33 +p=78,72 v=43,-48 +p=92,60 v=-77,10 +p=55,65 v=-14,-79 +p=46,45 v=92,-72 +p=15,54 v=-3,-51 +p=65,2 v=-80,-70 +p=73,30 v=78,-74 +p=23,12 v=-64,-98 +p=85,3 v=-68,-11 +p=30,69 v=-21,69 +p=57,38 v=-18,37 +p=11,88 v=-82,-19 +p=55,101 v=-54,44 +p=68,56 v=57,-65 +p=4,81 v=-12,92 +p=43,70 v=62,-27 +p=42,25 v=-31,13 +p=0,61 v=-16,-64 +p=45,25 v=31,-82 +p=23,75 v=-47,92 +p=57,33 v=-30,25 +p=0,34 v=-94,-36 +p=78,57 v=34,-43 +p=67,99 v=-22,4 +p=3,46 v=-99,8 +p=44,28 v=80,-66 +p=84,60 v=72,18 +p=51,66 v=-88,67 +p=38,7 v=-61,-47 +p=34,23 v=40,-88 +p=66,46 v=83,-81 +p=73,98 v=51,33 +p=37,56 v=62,81 +p=30,98 v=28,58 +p=71,99 v=38,62 +p=64,7 v=52,86 +p=26,53 v=-12,89 +p=87,50 v=43,-29 +p=65,101 v=87,-96 +p=34,52 v=-21,66 +p=14,84 v=-60,3 +p=4,7 v=-50,49 +p=45,73 v=-17,-64 +p=18,92 v=-29,40 +p=83,54 v=2,-64 +p=95,26 v=60,50 +p=86,80 v=95,25 +p=5,52 v=-25,15 +p=99,98 v=-46,77 +p=81,52 v=25,9 +p=53,89 v=-54,-83 +p=60,36 v=92,73 +p=78,27 v=7,15 +p=55,51 v=-63,-74 +p=5,85 v=-56,-97 +p=26,17 v=6,46 +p=37,36 v=-67,51 +p=69,52 v=96,67 +p=24,86 v=-11,35 +p=44,1 v=-21,26 +p=55,95 v=61,-33 +p=75,101 v=65,-3 +p=16,17 v=-29,29 +p=80,69 v=12,68 +p=78,61 v=-11,-7 +p=99,99 v=11,-62 +p=41,47 v=47,-86 +p=52,81 v=31,54 +p=86,60 v=-37,16 +p=15,89 v=-43,-18 +p=72,99 v=12,26 +p=42,15 v=-13,-47 +p=37,79 v=-41,70
\ No newline at end of file diff --git a/2024/day14/input_test b/2024/day14/input_test new file mode 100644 index 0000000..72a324a --- /dev/null +++ b/2024/day14/input_test @@ -0,0 +1,12 @@ +p=0,4 v=3,-3 +p=6,3 v=-1,-3 +p=10,3 v=-1,2 +p=2,0 v=2,-1 +p=0,0 v=1,3 +p=3,0 v=-2,-2 +p=7,6 v=-1,-3 +p=3,0 v=-1,-2 +p=9,3 v=2,3 +p=7,3 v=-1,2 +p=2,4 v=2,-3 +p=9,5 v=-3,-3
\ No newline at end of file diff --git a/2024/day14/solve.py b/2024/day14/solve.py new file mode 100644 index 0000000..acbd6af --- /dev/null +++ b/2024/day14/solve.py @@ -0,0 +1,86 @@ +input_file = "input" + +def print_positions(robots, col_count, row_count, iter_count): + print_data = {} + for robot in robots: + key = (robot[1], robot[0]) + if key not in print_data: + print_data[key] = 0 + + print_data[key] += 1 + + longest_line_threshold = 10 + longest_line = 0 + print_this = False + for row in range(row_count): + for col in range(col_count): + key = (row, col) + if key in print_data: + longest_line += 1 + if longest_line >= longest_line_threshold: + print_this = True + break + else: + longest_line = 0 + + if print_this: + break + + if print_this: + print(f"Positions after {iter_count + 1:000} seconds") + for row in range(row_count): + for col in range(col_count): + key = (row, col) + if key in print_data: + print(print_data[key], end="") + else: + print(".", end="") + print() + + input() + + +def move_robots(robots: list[list[int]], col_count: int, row_count: int): + for robot in robots: + robot[0] += robot[2] + robot[1] += robot[3] + + if robot[0] < 0: + robot[0] += col_count + elif robot[0] >= col_count: + robot[0] -= col_count + + if robot[1] < 0: + robot[1] += row_count + elif robot[1] >= row_count: + robot[1] -= row_count + +data: list[list[int]] = [] +with open(input_file) as f: + for line in f: + data.append([int(elem) for elem in line.strip().replace("p=", "").replace(" v=", ",").split(",")]) + +wideness = 101 if input_file == "input" else 11 +height = 103 if input_file == "input" else 7 + +print_mode_on = True +# second part + +range_max = 100 if not print_mode_on else 10000 +for ii in range(range_max): + move_robots(data, wideness, height) + if print_mode_on: + print_positions(data, wideness, height, ii) + +middle_col = wideness // 2 +middle_row = height // 2 + +quads = [[0, 0], [0, 0]] +for elem in data: + if elem[0] == middle_col or elem[1] == middle_row: + continue + + quads[0 if elem[0] < middle_col else 1][0 if elem[1] < middle_row else 1] += 1 + +result = quads[0][0] * quads[1][1] * quads[0][1] * quads[1][0] +print(result) diff --git a/2024/day15/input b/2024/day15/input new file mode 100644 index 0000000..a153680 --- /dev/null +++ b/2024/day15/input @@ -0,0 +1,71 @@ +################################################## +#.#.#......O....##.#O.##..O.........O........O.#.# +#......O..........O..O.O.....O.........#O.......O# +#.OO....#.O.O.OO#....#.OO.....O.##....O.......O.O# +#..........O...#O#.......#OO....O.O..O#........OO# +#O..O.....O..O..#.O.O...O..#.O.O.....O.#....OOO..# +#O#O..O..O.OO.#..O...........#.......#O.OO.O.O..## +#.O..OO.O.#.#.......O......O..........O.O..#.....# +#...O..O..O...OO....O....O....#.OO.#..O.....O..### +###.#.O..O.O.O..O.....O.O.#.....O.O......OO....#O# +#....O.....OO.O#..#..O.O...OO..................#O# +#....OO...O.O.OO.O#.O...O..#..O.#.#....O.O.O.OO.## +##.##....O#O.......O#..O.OOO....O.....O....O#..O.# +#...O..O....#O...O..O.OO..OOO.##O...........O.#O.# +#..O....O.#O...OO....OO.O..O.#OO..O....O.....O...# +#O#O..O.......OO...#.....O#OOO....#.O...O.......O# +#O.O.....OO#.#.O..........#..O#.....O..O#...O..### +#...#.....O#..O....##OO.O.#.#......O......OOO..O.# +#OO.O....O.OO..O.........OO.O.....#.O.O...O..O#O.# +#..O#..O#.OO.OOOO..O..O.......#O#..OO...OO.O....O# +#O.#O#....#..O.#..O#O.OO..O.O.#....#.OOO...O.....# +#.......#..OOOOO...O..OOO..O...O.OO....OO.OOOO...# +#...O..#..OO..OOO.O.#O.#..#.O..O...O#.....O.....O# +#.OOOO.....OOOOO...OO........O#....O.....O.#...#.# +#O#OO.#O..........O..OOO@.O.....O.....#O...O..OOO# +#.#............OO....O......O#O..#O..O.O.........# +#.O.O.....O....O.O.OO.O..O...#........OO.#O....O.# +#......OOOO......O#.#.O...#O.O.OO..O.O...O.O...OO# +#OO#.#O..O...#.O..O.....O...OO.O.....##.O.....O..# +#..#O.#OO.OOO..OOO.#..OO..#.O...OOO......#......## +#O.O#.O..O.......O..OO....#....O..O..O....O...#..# +#..OO.O...............##O..O..OO....O.OO...O...OO# +#.#O........O...O.O....#O#........O.....#..#O....# +#......#....O#......#.#.#...#........O..OOO..O..O# +#O.#OO.##..........O.#O.O.#O.#OO#....O..OO...OO..# +#...OO.......#...##..#......O.O.OO.OOOO.O.#.#....# +##.O..#..O#......OO.....#....O..#..O..O.#.OO..#..# +#....O.OOO.O..O#........O.O...OO...O...O.O....O..# +#OOOO.OO...O.O..#O.OO.O#......#OO..O.O.....O..O..# +#..#.O..O..#O......O...OO.......#O...#..#O#.O..O.# +#O...#..OOO.O#O.O.O.O.O..O...O.O#..O..O..O.#..OO.# +#.....O.O.O..O.O..OO.........#O.....O...O......O.# +#O...OOO....O.OO..#....O#O...O.O..O.O.......OOO.O# +#OO#..O##..O...O.#..O....##..OOO...O.O##.##..#.OO# +#OO.......O##.#..O.OO......O..O..O..O....O.O...O.# +#.....O...O.O.#..O..O.#..O.OOO#.......#.........## +#..O.O.OO....#...OOO.OO..O....O.#.O.O##....OOO...# +#OO#O..#.....O.....O.....O...O#O..O..O#......O#..# +#O....#.OOO.O#.OO..O...OOO.OOOO...OO#O.O.O.....OO# +################################################## + +<><>^<^^vv>^^v^vvvv<>>^<>v>v>^<^v<><<v^^v^<><<>>>><>vv^^v<^><^<v<><v<^^<<^<^vv^^vv^v^v^<^v^>^vv^<v^>v^><>vvvv^v><>^v>>><^vvv<>v<>^^^vvv<>v>>^v>>^<v<^>^>>>>^<^^^>^>v><<^v><<>>v><v>^>vv<v>^^<^<v>^<v^^>^>^>^>vv<^^<v>>>><^v><vvv^><^<>v<v^vv<<>v<><v<><^vv^>>^v><v>v^<^>>vvv^<>vv<<<<<v^>^<^v<><^v^<>>v<<^<>v^>^>>^^>v>v>^<^^<>^v^<<v<>>v<^>^^v>^v^<<v>^<^v><^vvv>^^^<^<<vvv>>vv<><<<>v>>><v>v^v<v^><<^><vv^>v^v>>vv^><>v^v^<<>vv>><>v<<v>^>>vv<>v^v>^^v<^<>^^<^>^^^<^^<<v<^>vvv><>>^^>>>^>^vvvvv<v^^vv<^^><^v^<><<<>>>v<><v>v><vv><<v^>v>v>v<>vv^>>><v^>v><<<v>v^>^^v<<>v<v<>>v<>v<>>^^<v^<>^>>><<>v^>^vv<^<^^v^^^<vv^v^^^<>v>v>^^^^^>v>v^v><^v>^<<^<<v<>>>>^>><>>^v><^<<>><v^^v<^<>^^<<v>^>^vv<v><<v<v<>>^^><<^^v^>>^<<^^^^<v^^^>v>><<v^^v^>^v^v<^>>vv^^<<^v>><v^^<v<>v^^^<><<v<<^^v>>><vvv^<<<<^<>v>vv<<><^v^>>v^^v^^v<^<^<v>v^<vv>^<<<><><<^<^vv<^<<^^^^v^^>>><<^<^><<>v<>^v<v^>vvv^v^v>>><v>v<<>v>><v><<>><v>>v^>>>^^<^>^^^v<<><<^<<^<>v>^^^v>><>v>^>v<>^><vv^^<<>^v><<<>^^vv>>v^><<^v^<^>>^^v^^vv^v>v^>^^v>v<^<<v><<^>>^^><<<^^v<v +>^^v<v<^^^^v^^>v^v^^^^v<v^vvv<><^^<<<>>>v^v<>^<>^<vv<>>^^v>^v<^^v>v<>vv<^v>>><^^^vv>>v^><><v>^^>v>^vv<<vv^<^>><^v^<^>^><v<^^><v^<>^<^v<>v>v^<vv^<^<>><<>><^>><<v><vv^>vv<^><v^>>^v<v>v>^^<<<<>v^^<v<^<^<v^>^><<<><v^>><^>v^v<^v>><>^<<^^^^v^>^>vv>>v^<^<v><<><>^<v<>vvvvv>v<>vv^><^<^v^<v>^v<v>vv>v><>v<<><v^v^<>^^<><^<>v^>>^>vv<><<<<^v^<vv<v>^<<>v<^v^v><>>vv>>>>>^v>^v^>><v>^^v^<>v>v>>^><<<v^v<<^v<<<>>>>vv<>v<<^v><<<>v<v^v<><<^><<<vv>^>v^<^v>^<^>>v<v<><^<<^^vv>^>^vv^^<<<<><^<>^<>vv^^^v><vv><>>>vvv<>vv>^<>>^^<>>v^vv>>v<vv><v^^<v<vv<>>><<^^><>v^><v>^>^>v^^vv<>^><>>>>>vv>^^^^^>>^<<<><<^^>>v>^^>^^v^>v^v^<^<^><vv>><v<><^v^^^>>^<v<>><^^><^vv<^v<^^^<<<vv^^^>><<>>v^<>^v>v<<v^v<<<^v><v<^<vvv^^^>^v>^vv>>v^>^<v^^<vv><><>v><<v<vvv><><v^^<<<^><>v<v>v>^<^^>vv^vv^>^<^<v<><v><<^v^<<<^v^^^<<<<^>v>^^vv<v<>>><<>v<>^><v^><<>^<<^^<>>>vv<^>><^<v>^><^v<v<<^^<vvv><<<>^>>v<^><<^v<^v>v>^^v<v^v<<^>vv<<vv^<v^v>><<^v>>>>^v>vvv><>>v^<>><^<<^^>v><><^<v<v<>^v<<v^<>>^>^<<<^v>v<^>><v^>>>v^vv><^v<><v<<<v^<v^><<^>vvv>v^<>v<^v><v< +^>v>v<>^v>vv<>^<>v<>v<^v<^^<<><<<^<>v<vvv^><<<^v><^<^v>vv^^>v>v<^^<>>>v<<>^<>v<>v<^<>vv<<^<<v^^^><^<vv<^<<v^^<vv>^v^>v^^^^^^vvv^<<^<^<v>>>^<^<>^vv<^^v^v<v><^^vv><<<>>^<v^>^>^v<<<>><v<<>v<>vv<<v>^^<>v^<>^v<^v>><v<><<>><^^><<^v^>>>^^<v^v>v>^><^>^^^^^^<^^<<^v<vvvv<^>>v>v^<>v><^vv>v<<^^<>>>v^^><v<^vv<v<v>>^>><<^vv><v^>^^^^<^^^<v>>^^v<^^<v<v^<v^v<v>vv<<>^^<>^<<v><v>>^><v>><^^vv<^^v<>v>>vvv>>^v<vv<v<^<^^^v<v<<<v><<v<^<<>^<^^<^v^>^^<^><^<^><^^v>v<<^v<<^^^<^<^<v<<<><<v>^>v<<<^<>^>>v<<<^vvv^><v<v>^<<^v<<v><>^<v^v>>vv<<>vv<v<^>vv^^^>v<^^^v<<<vv^<<v>^><v<vv<^^>^<v<>^>><vv^><<>v^><v<v>>vvv^v>vv^^vv^^v<v^<<<v<v>^<>^^v^^><><^v^>v>>vvv<^<<>>>vv^><>v^v>>vvv^vv^v<<>vvv^^<^<<v>^^v>^^>^^v^><<^<<<<>^v<v^^^<><<><>v^<^>^>v^><v>v^v>^>>v^v<^v<<<<v>>^>v<^<v>>^vvv^<^^><<^>>v><^^^>>^vv<^<<^vvv^^><v<v>v^v<>>^>^>>v^^^vv>>^<vv><><>^<<>v<<<vv<v<<<^>^v>^v>^<<<v^^^v>>><v^<><v>^><vv<v><<^^<^>><><v>vv<>vv^^><>^>^v<<^<^^<^^v^><<vvv^>><<><>>v^^<^>v<><^^v^v^v>>v>^v><<<<<^<<<>>>^v^<v>v<v><^^><<>vvv^v<^<^v<<<^^>v>>^>>^<vvv>> +^>><<v<<>^v^><^^><>^><^<>^>>>vv^v>>^^<vv^^<v<><^^>^^<><<>><>^v><<<<><<v<<<<v<^<>>><>^<^<<v>v<><><v<>>^v^<<>^^<^^^^v^v^<^v<^v<^v^<<^>v<<v>vv>^<<^<vv^v<>^vvv<>>><<<vvv><^^v^^<vv^vv<<^^vv<v<><>^v>>><<^v<v^^<>>>^>^v<<v>><<v^v^^^vvv^v<v^v^v^v^<<vv^>><>v<^><^>v<^v<^^^^<<^v><>><^v<>>><><>v<^vv><<<<^<<>vv<>v>>>^<vv<<^<<<v<^<^^<^^<v<<vvv^^<<>>v>>>^>^>v<v<>^^^v>v<^<v<>>>>vv><>vv<^<>v>^^<v<<<><>><<<<>>^<>>>>^^>v<^v>v^><>v^^^>^v^vv<vvv<^<^>^v^>vvv^<<<>>vv<^^<^>v^v>^^<^v^v<>v>v<v><<<<<>^^<<>>vvv><vv<<<>v><vv>^>><<v>>^^v<v>>v^<^<^>^<^v<>>v<><vv>>v<<v^v>>>^>vvv>><^<vv>^v><<>v<<>v<<>vv^^v<vv^v>^^^>v<^v><v<v^v<vvv<<<<<^<^<>v>^v>^^>>vv^^v^<^vv^^>>v>v<v<vv^>v<>v><><><vvvv<v^<vv^v^v^<<<><<>v><v^>>v<>vv<<><<^v<v^>^>v><v<>^vv>>^^<^<v^><>v>>^><v^<>^^<>>>v<^v>v^vv>^^vv^v>vvvv<v^><>vv^>^vv>><<>^v^<><<>v>>^v<^v^<^^><>v<^v<v><<<><^v^^v><<vv<^v<<>v^<<<^>>>v>^>^vv>>^^^>v>v>><v^>>v>^<v<v>>^<v^v^v>^v>^<<v<^^<<>v>v<vv>v<<^<v^v<<>vv<v<>>v<<>v>^><vv<><<v<^>^^>^^vv>^<vv>^<<^><^^vvv^>>^v<^><v>^vv^^>v>>><^^^^^>>^v><^^<^>v +^<<v>^^v<>v^><^v^<^^^v<^><^^<<v><^^vv>vv^<><^vv<<<<<<v^>^<<><<^v^>vv>^><^>>v>v^<^^v<<><^>v>^>vv^v<><><v^<<<v<<v<>><^>^v<v>^^^<vvvv>^v^<>>v^^^<^v><><<>^v>><<vv^v<<v>^v<>^<<vvv<^v<^v<><^v^>>>^<vv^>>>>vv^<<<vv^^v<<v^>>v>>v>><vv<>>^vv>v><v>><<<vvvvv^^vv^^^v^^v<v^^v^><^<^vv>>v>v<^>v^<>^>v^>>v<<^vv><<vvv^>>v<v^>v<^v<v><>^>v^<><<vv<^^><^<v^^<<vv<v<>><v<^<><>>>>vvvvv<^<<v>>v^vv^>v^<>vv<>><>>>>^<v>v><^<>>vv>v<>v^v<<>><>^v<<^>^^^^<>^<<^><vv>v<>^v^<<^vv^^>v^^^<^<^>v>>vv<<^<vv<>>><<^vvv^^><<v<vvv><^>^vv>^^^^<^<^vvv^<>vv>vvv>^^^><vv^><>>v^^v><><^vvv>>>v<<^<^>^^v>^<>v<>^v^>v^^><^>^><>^v<>^<^><><>vv>v>^vvv>^^<^<<^v>^^v>v<v>v<><v^<><<<v>>^>v>>^<^v<<<v>^^>v>vvvv^>><<^^>v^>>^>vv<^<vv^v><<^^v<>>v><vvv><^<v><>v^^^<>><>^>vv^^v<>><^v>^^<><^>^v^^^<v>v>v>>>^v<>v<><^v^<<>v><^v><^>^^>^>^v<>vv<vv><^>^<^><^v><v<^^>>><>>><>>v<<^v><><^^^v<^^<vv><><vv<vv<^>>>>><<^>^>^>v<v>v^^^v^>v>v^^^vv>><^^>>v><^^vv<>^<>>^^v<vv^vv><<>><v<<^v^v>^><^<v^^^^><vvv<^>v<<>vv^v^<><<^<v>vv<<v<vv<^vv<>^^v>vv^v>v^^vv^^><^<vvv>v^^<>^^vvv>v>vv +<>v<>>^^<^>v^><v<vv^^v>>>^^^<^v^^^v^^<>v<>>^<vv<vvv^<<>^^><v><^v<vv^^^v<><>^<<<^<^<<<vv><v>^v^^<<<v>>^^^v>vv^^>><<><><>^^<>>^^<>^<^<^<v>^<v><>>^<v<<^vv^v<vv>v>><vv^>>>^v<<>>>^>>^<<^^v<^^vv>><vv<^>^v<<>v<v^^>^v^^v^>v^vv>>^>>v<>>v<>>^v^<vv<>v<v<v<<vv>v<v^^^<>>^vvvv^^^<<>><v^>^v^v<<<^<<<^>vvv>>^><^^>v^>vv^<<<^<^v>>^^<^<>><<^^<<vv<v^<v<v>^v<vv<v^v^>>><<vv<v<<<><>vv>>>^<<<>>vv^>^^<<<<<v<vv>^<vv^>^>v<<>^<^v<>^vvv<<>>^^^<^^^v>^^v^v^^^^>vv>^>vvvv^<v<><<v^<^vv<^vvv><^vv^>>>>>>vv^<v<<v<^>v<<vvv<<><v>v<>^>vv>>>^<>v<^><^>^<>vv>>>^v^>^v>^v^<v>v<<<<<<v^><>^^<>^v^<<^^^v>v<<><^<><<<^<<<<><>^><v^>v>^^<><^vv^<vv<^><<vv^v<^>^^><v<>v<<v>><>v<<v><<^v<^<^<v<vvv>^^vv>><>^>vv<>^><v^^v^^<><<^>^v<>^^v>v<^>^^^<<v<<^vv^v<vvv^><v>^<^>v^vv>>>>>>v^v><vv<<>v<v>>v^vv>v>^v>v><^<<>v<>v<<vv<^><v<<^>>vvvvv^^^><v^><^>^^^<vvv^v>v^v<^>>vv^><<^^>^v<v<v<<<<<v^v^<v>><>>^v^>>vv<v^v^^>vv^<v^^^<^v>v><<><<^v><<>^v>^^^>^<<^>v<>v^<vv>^>>^<v^^<><^vv^^<>v>v>v^^><v><^<v><^<>v^<<<^^<<>>v^^vvv^v<vv<>v>^>^^vv<<<^><vv^>^v<>v^<>v>v>vv^v<<v<^ +^>^<>^^^^v^<v><<><>v^v^<>vv><v<>>^<^<<<v^vv<<^^<<>v<v>vvv<^<^^<>v>v^v<vv<^vv^<>^><v<<^v^^<>^>>v<>><<^>v<v<<^v>v^^>v^v<^<^<^^<^><^^>>v^<^<<^<v^^><>>v^<^<<<^<v><><>^>v<<v>vv<vv^<v>^<<<>>v<^<><<>^><v<v^<v^^v<<>v^^v<<^<v<>^>^v<^^v<^><v>vv><<^^v>vv<^^<^<<<^<>v><^^v><>>vv<^v><<v>v>^^^><>v^v^>v><^^<v<>^^^<>^v^vv>v>^^^^^v>^<v<<>v><>^vv><<>vvv>v^^^>vv>^>vv>v>^v^<<><<vv><<>^vv^^><vvv<v<>^>>^^><^<<^v><v^^<^<>v>>>^>>^<<v^v>v^>^^^^>v<^^><^v>v>^^><>^^<^v^<<<<v^<<^v<^>>v><^v>vv^<^>v^^^<v^<<v>v<vv^<vv>v^>vv<v<^v><v><^^><><<v^^<>>^>>><v<^^<^><>vv>><>>>^vv<v^v^><v<<^<>vvv>>><>^>v><^^^><v^v^<><<v>v^v^>>>v>^^^>^>^v^<v<>^<<<^<<<^<<>^>v<^<^v^vv>v<vvv^<>v>v<vv>^v^^v<<><<^^^^vvvvvv^v^<v<><<>v<>^>v<^<v>^<v^<>><<<v<vv>><<^>v><>^<v^<vv<>vvv<^><><<v<v^><^vvvv<>>^v<v^v^<^v^^>^^<v>^^>v^vvv^><<v>v<>^><^>v>>v^>vv<<v>^>v<^^>>^^>^<>^<<^vvv<<><^^>>>>^><^^><^^^>><><v^<v^>>>v^^<v^v>v<><><<<<v>>>>^<^v>^>^><<v^<>><><<vv>^<>v>v<>^^>>vv^>>v<^<<>vv>v^<v^^>>>>><>><>><v^><^v>v<><^v^v<>>><>^^>>^vv>^^^^^^<v^^><<^>^^>v<^^><>^>v><<< +>^<^v^<v>^<v<^v^v>v<v<><>v^<>v>^^<<v^<>v><<v<v<v<<<<^v<v>^>v<vv<<>>v><><v>^v^^>>>>^<v^v>>^>^^v<^^v<<vv<^v^>v<><v>v<v<vv><vvvv<<>v^v^v<>^v>>v<v>>v^v<^<v>>^v>>v<>^^<vv^v<><<^vv<v<<>^<v>^><<^>vv^v<<>vvvv<^vv^<v^^^^^^v<^>vv>vvv>v^v^<<>v^<<>^^^^<>v<^^<^>^^vv><v>^<><>^v<^vv>>vv<<^<^<<<>v^>v>v>vvvv^<>vvv><<><<>vv^<<vv>^<v^>vvv<v^^v>^><^<^>^^<v^<v^vv<^v>^>v^><<vvv^<<vv^^^^>>v<>>vv>vv>>^^^<^v<^><<v>^><^^v<^v<><^v<^<>v>>>>^><><>>>>v<<>><^^v^v^><vv^>v^<<><^>>><vvvv<^<^>^>^>v<>^>><v<>vv<vvv>v<v><v^<<>>>>><>v<^^<<<^^>>><v^<v<>vv<^^<<><v><^<vv>v<^^<>><^>v^><>^v>v><>v^>><><<^<^<>^^^<>^^v>v<^><><vvvv^^<^>^v^vv><^v><vv^^<^v<vv>>>v<<><^>>>>>>>^^<v<^<<^^^>^>v^^>v><>^vv^^<><>v>^>><^^^^>v>^<>>><v<^^^^<>>v<<v<^>v<^<^v><vv^>^^vv^>^>^>>>^v^^>><vv^^v<v<v>><<>vvv<^<^v>>^<v>>v^<v<v^^^<^<<vv>^^>vv<>><^<<<^^><^^>v>^v^^^<<<^>v<><>>>^<>^^<><<v>v><><<<<>^>>>><>>>>><v^<^^>v^^^^>v>>v>>^vv><<<^<^^^^v>v><^<^^><<vv<^^v^v<<v<<^<<^^>^^>>><>^<v^>><<^v><<><v^<>v^^v^v<v>vv^^<>>v<<^<>v<v^<^v<>>^<<^>><^^v^v^<<><><<v>v><v>v<v<<>< +<v^^v>^v>^<^vvvv>>vv^<>v^^v<>>>^^<v<<><>^>^^<^>^v^><v<^v^^<^<v><<v>^>>v^^^v^><>v>><>>v>>vv>v^^><>v^<>^<^<<<v^vvv><^<^<v^v^^v<v^v>vv<^^v^v^v^>><>>>>^^^^^<v>>v>v^v<>>vv^>>^<^^vvv>><^v<<<v^^^^<^><v<v<>^<^<vv>><<^^v>><<<^^^v>v<^^<<vv<>><>v^^^>v<^^>>^<^<^<^><<>v<^^<vvv<vv<v^<>^>><>^>^>^^vv><>>^v><<^>v<>>vv>v^><<vvv<<<<><>^<<vv><^vv<v<>^<^<<v><>v>>^<>^><v<<>^<<vv^<^^v<<^>^^vvv<>v<<<^vv<>>vv^^v^^v^^><^<^^<^<>>>^<<^v<>><<v^<v<>><^v<v^>^><>><vvvv>v^><^>^v<><v>>^<v>><^<^>^v^>>v>^v^<<<>^^<v>v<v^v>v<^^v<<<^vv^v<^<>vv><^v<^>><><^<<>>v>>vv^^<><v<vv^<^<<<>>v^>v^>^<v<<v^<<^>^<^<<<vv><<>><v>>>v<v><^<><v^>>vv^<v^>vv^<v<<<v>>v<vv^><v^vvv>v^v^><^v>^<v>v^^<<v^^v<vv><v>v>><<^^<<v<vv>^>v^^>^>v^><v>><>><v^^v<^^vv^^^v<v>^<<v><^<<v<^v>>^^v^vv^^v^vvv<v^v^^<^v>^v<<v<>v>^<<^v^>>vv<<^^^^^^^v^^>v><<^v^vv^>v><<<<v>v>v^^<vvv<<^^^>>v<>>^><<^<>v^>>v><v^>^<v^v<>vv^>v^^<^>^<v>^^<^>v<<vv><^><<<><>vv^v<^>^<><<<>v^vv^<<>>^^v>^v^v^^>^<^<<^^v>>>^v>v><<^>>^^<v>^^v>v>^v^<>vv><^<<v>^><<<>>v^^v>>>^>^^v^^>^^>^vv>^^^v^<<<^<<><>^^^^> +><<<>>v^<>vvv^>>>>>v<v<vv><>v<<v^^>v<^>>><<^<v^^v^^>vv>>><<^<<v>>v^v<>^^>^v>>v^^<v<<<v>v><<vvv<^>>v<^^<v^><<<v^<v^v>>^vv<><^vv<>v><v>><v>v><<^>v<>>>^>v^vv^vvvv<>v>^^<>>^v>^<v><^v<^>><<>v^^>v<^>vvvvv<v<^<>>>^^>v>^v^^>><^^v<^v^<^>vv^>vv^>^>^^vvv<>>v^vv<v>v^^^^^>v<^^>><<><^>>>^<^^><<<^<^vv>>>vv^vvvv<v>vv>vv<>v^>><<>>^>>v^^v><^^><<>v<^v<<^v^>>^^v>^^vvv^^^>v<v^^<>^^>vv<^v<<>><<^v<^^>>>^^><><^^^v><vv>v>>>vv^<>>>^>>><>><v^^>>v^>^^v^v^vv<v>v<^><^<<<<>v^v^>^<^v^<vv<vv^v<<<^^><<^^^v<>^><^<>>vvv^<^^<>>><<^<^v^v^^>^<v>v>><>>>v<>><<>^^>^><vv>^<^<^>^v^>^^v<>v^<v^^v^<<>>>v<>^^^vv>^^vv^^<>^^^v<<vv>^^v<<v<>vvv^<<<<<v^^^v>>^>^v>v><v^<<v<<v^<v^<>^^>>^><>^<v^>^>><>^><<vv>v>v^<^vvv^><>v^v<<v><^v<>><<>v<v<vv<^<v<<v^>>^vv<><>><v^v^<^<^>^^<<>>>><><^>><v<^><vv<vv<^>^>^vv^<vv<<^>>><^<^<><^vv^^<<v^>v>>vv^>>^vv>^>v>>^<>>>v<><<^>^vv^^><>v>>^<<v^<<^vv<><<v^>v^^^^vv^<><><^v<v>^>vv^<vv>>vv>v>^>>>>v<v<^<v><<^<><><<v^^<>>><<v>v<>>>>^>^v>>><<<<><><v><><vv^<<<v>v>^>^v<>vvvv^<v^>^v^>>><>v<v^>^>^vv<v><>^<<>><vv>vv<^<v^>v>< +vvv^^<^v^><<^<v<>><^<>><^^^^>>vv<vv<^><<^^^<vv><><>^v^>v^<v<v><v^^><v<<^<v><><v>^<<>^^v>vv><^vvv^^vv<^v<><<v^>vvv>>^<<>vv^^^v>v<v^<>>v^vv<<v>v<^^<>v^<>>>v>v>^<<v<<>^<>^<^<>vv^>v>v>^vvvv^>v^<<<<^^><^>v^>^^^>vv>v<v<>^^>vv<^><^<^<<v<vv<v^^><><^v<^^^^>><^><>><>v>>v>vvv>>v<><>>v<^>^vv>v>>v^^>^v<^><v^v<>vv^v^<vv<v<v^<v^^<v>^<^>^<^<^^<><^<<<<>><vv<^v^><<<v<<v<v^^^v<<<^<<vv>>v^v^>v^^><<<^>^<>>v>^<^v>^^<<v^vvvv<^^v>>^vv^<vv>^^^>v<><<^^^v^^>v>v<<<>^><<v^<v>v^v><>^^<>v^v>v>vv^>^vv<^>>vvv<<^v<^v<>><v>>^vv><v<<><<v>>^<v<v^<v^<>vv>v<v^<v>>v^^<>^>>>^<>^vv><<<<><^^<v<<<>^<v^<>^v<v><>^^>>^<vv^><v^^>>^^v>vv^>vv<<<^^^<>v>^>v^<v<^v^v^><>><v^><^v^>v^<>^v>v<^<^<<>>>>>v^^><><>^v>><^<^^v<<<^><^<^v<v^vv^<<>>^v>v^<^>^<^><v><<>v^vv>><vv<^v^^>^^v>^>^>vv>v>><^>^<>^<>>v<<<<v^^<^<^<vvv>^>>>v^^<v>v<^>^>vvv>v<>v^v<vvvv^<<<v^<><>>vv<<^>>>^>vv^^<v<<^>><v^^>^>v>v><v^<^v<^v<^>><<v<<vv>vv<<<>^^><^<<v^<v>vv^><<<v<^^v^>v<>^^^^>^v>>^>^v<v^^vvv<^<>>>><><vv^^><<<<>><>^<^^v>v^><<vv^<^v^^^v^^v>^>>><<v^<>^>^^<v<^^<^^<vv><>^<>^<>>^ +v^<v<>^>>^v^<<v><v^<v^<<><<>>>^v<^^><>>v<>v>^<^><v><><<<v><^<^vv<v^v^<vv<v<<^<v<^^><v^v<>^>>>v<<<<<^v<><>^v>v^^><<>>vv^<^>v<v><^>v^v<^vv^<vv^>>^v<<<<<v^^v<>v^>>vvv<v^>v^<>vv<<v<><vv>><v^^^<^<^^>^v>vv^v^>><>vv^>^>^<vv><v^vv^^^^v>v^<v<^v>v<<>^<^>vvvv<>v^>^v<vv><v^<<>v><<<<><v^v>^^^v^<^vv>^<<<>^v^>^<>v^>vv<vv>v<<<^vvv<<v^v<v<>v<vv^<<<v>>>>^v>^>v<<^<<^^><^<<<<v<<<>>>^<>v^^>>>^^v<^^^^^^^><^<>^<v><<^v<>v>>>v<^>>^v<>^>>v><<><<^>>^vvv>^>^>v<^><<><^<>>vv^v^^<>v^v^v^<<<^>>v><<vv><>v<><^^v<>v^v^<^v^><>v><^<^vv^<^<^^^<<vvvv><^^^>vvv<^<>^>^^>><vv<>v<><<<<<>^v<><v>^>><^>>>v>>><>^vv<>vv^<v^>>^^>^<^<v>>^^^^^>^><<<<^<v><v>^vv^^>>v^<<^>v<<<v^v>^^vv>v<>^v^>><>v^<^>v^<v<vvv>vvv>>>^^^<^v>^^^<<^>^>v>^>^vv<<<>^>><v<<v^>v>v>v^^^>>><^<<^<^<^^vv^>>^>^vvv^v<>v^<<^v^>^v>v<v^^^vv^v^>vv><<^^^>v><<<><^vv^>v<v<<v^><<v<^><<>^^>>^^vv<v><>v<v<v><^>>^^>v<v>^v<^<><^>v^v<v^>vv<<^<<<^>>vv^^>^>^v<v^^v^vv^<^>v><<^v^^>>>><^v<<v>><v<v^^<<<v<v>>^>v^^v<^v<><<<v^<><<^v>vvv^>>^<><v^><<><>v<v>>v<<<<^^^><^<v^v^^<^^v^>^>v^<<>^v<^v>^<v +<<^<^>vv<>v>>>^<^^>vv^>v^vv^<^<v^><vv>><v>><v><<>^^<v><v<<vv<^>^^v<v<<^<<v^^>^><^<>^<^v<^^<vv^^v^<v^>>^<<>v^v>^v<>^<^^>^<<><>>>^^<<^>^><>^^v<^^>^v^v<vv^^v<v^v>vv<v>><>>^vv^<^<<^>><vv>vv>vv^<^^>^^v<^^>vv^^v<v>vv<^v^<^>>^<vv^<>vv^<>>v^vv<<v>vv>>><<^>v<<^^<>v<v^v^v><>^<v^^><>>^^>>^>v>>>^>^>v<v>v^v>^<>v^<^>><^v>v<<<<^<<^^v>v^<v^>v^v>^>v^^>^<v>vvv><<<^<>^<>v>v>v<>>vvv^vv><v>^v><^>^^<v^>>^v<<v^v<>>v>^<><<^^<^^^^v^>^v<<^^>^>^>^^<<vvvv^v<>v>v^vv><<>><^^^v^^<v^v<>vv^><^^v><v<<v^^vvvv<>><<vv<v<<>>^vvvv<<<v^vv>v><<v<<v>vv<^<>^<<^vvv>^^^v><<<<>>>^v>^v^><^>v^^v^<^><>vv<vv<v^>v^^^^^v^<v<<>vvvv<^^^>v>><<^^v^v>^>><>>vv>^<<>v^<^^<>v^>^>><>v<>^^^^><><<v<vv<^v^<vv<v<v<v^>v<v>v^v<^<<<^<v<<^<<><><<^>>^^v^<^^v^<<><>v^^v<v^^v<^^<<v<>>^<v<^>v^><v^>^<v<><<v>^<><<^>^^><<<>>><<v>>^^>^><>^<v<<>v>><>^>^><>>v<>vvv<>^vv>><>vv^<<<<<^<<<>vvv><^<<<v<^^>v<>^<>v<<>^<v<<<^v>^v>v><v<>^v><v><v^vv^<^<v^vv><<v><vv>v^^>v>>>v<vv^v<^<><v<<>v<><<<<<<vv^^vv^vv^>>^v^v^vv>>>>><^v>>v<^<^^v<<>^<>v<<>^>>>vv<>v^^^>^v<v<v<<>>^v><vv>^^^<< +<<v^<v<vvv^^^<<>>><v<>>^>v<<vv<^>>>v>v>^v^^<>^v><<>>^v<<vvv<>>>>>^v>^><^>v>>^v^<>^>^>v^vv<^>v>^^^^v<^vv<>>vv<v>vv<><<v<<>v^^<<>vv>^^<<<v^v>v<>^>^v><v>>v<v^<vvv^<^<^<<<><^vv><<vv>^^vvv^^<vv<>vv^v>v<^^v^v^<<>>>^v^<^<vv^<>>>^<^<v<>>>^<<>^v>^^^<v>v^^v><v^<>v^^>v>^^vvv^><<v^>vv<<^^^^^v<^>v^<>v<<<><>^^<><>v<<^vvvv^v>>v<v><^>^^><><v>^^^^<vv><v^v<v>v>v>^>v^^><<>v^<>>v<^v>^v<^^<^v>>vvv^<<><<<^><>>^v>>^<v<^v><<^<v<vv<^^>v><><><<v<^v^>v<<<<^>v>^^^<>^^^>>v>><>^<>v<<v>^<<<^v<><v><v^<vv<>^>vv<>v^^v<^<^>><>>v<>v^>^v>>^>v><<>^<^^^><>^vvv^vvv<>^><^v>^>^^><v>vv>vv^v><>vvvv<^^^^^^<v>vvv<^>^^^^^^v>^^^<v<v<><><v>^>vv>v^<^v^<vv>><>>>v>>><v^><^v<vv>^v^<>v^v>v>^^^<>>vv^<>^v<^<^>vv>^^vv<<vv^^vv>><<v<><v^v^^>><><^vv<<vv<<<v>^>v<v^>>^>>^^^^<<v>v<^^^v<^>v<v<vv>v<v>^^>v>^vv^^^>v<<<^^>v>^>>><<^vv>>^^>^^^<>v^>^>^<^<>vvv<v<>><<^v^<^<>vv>vv<>vv^vv^><<<^>v>^<v^>^>><<<<<>v^><^>^>><>^v^<vv^>v<v^>>v<v<^v<vvv<v^vvv^^v><^<^<<v<^^>><v<^v<^^>v>^><<<><<>v^>><><<v>>^><v^^vvvv^v>^>v>^v>v>^^v^<v>^v<^<<>^^<^^><v>v>>>><<>v>><vv^^v> +vv<^v^>v>>>^^>><<vvv<v<^^<^^^^v>>^<^v>vv>v<^^<>>^v^>^v^<<<^<>>v>v<>v^v<<v^v^<^<>vvvvv>vv^<^v<^^^v<^^<vvvv<v<v>^v^^<<v^>^<<v<^<v^^>>v^^^>^vv^^>^<<^v^<>^^><<^<vv^v<>><^v<<>v<<>^<v><<v^<<v>v^>^^^v<>^^vv<<<v>>^v>v>vv<>v^^^>^^><>^vv>>^<<^v>>>^><v^<>>v>><>v^>v<^>v^^v<<>v<v^<^><v^<vv>^^vv<<><<v>^<><>>>vv<vv<<v<<v>v>^<>^^^>v^<^v^<<<<>>^>vv>v><>><v><><<<<<<vv^<vv><^^>^>>><>^>>^^<^^^>^><v^<>^<^vv^<<^><<vv<><v<^v^<<^^^>^vv^<>^<v><^^>>^>^^<<<^v>>^^^vv^^<v<>^>v<^vvv>vv>^<v^<^<v^^^^^<>v^v<v^>vvvvv><^^><v^<v>v>>>^><^v<>^^v>vv<<<<^^<<vv<<v>v^<v<>>^^<>^>>>>^><<v<^>>^<^^v>v^<><^v>^<^^v<^>^^>>v^>>>>>>^<<<<^><<><^<^><>><^^^vv^vv>><>^v>v^^^^<>^^v><>><><vvv<v>>>v>v><^^v<v>>^>^v<>^<^^><vv>>>>>>v<^v><^>^<><^v<<^<>><^<v>>><<><<>v>v^v<<><^^>>vv^v>>^v>><^v^vv>>^>^^>v<<<vv<>v<<^<>^^>>><^^>>>^^>^v<>v<<v<^v<^>v><vvvv^>^><><<^^><v><v>>^<><>>vv^<^>>^>>v<<vv>><^>^v><v>^<>vv^<vvv^vv<vv<^><vv^v>vv>v>>^v>v^<<v>>v>>><v><^vv><><v^v^<<v>>>^^>v><^<<^v<^v<>>v^^v><><>^<<v^<^v^^<v<><^^^^v<v^^vv^v><v<<v^>^<v<<>^>v<^v^v<>>^<>^v>> +v<<v<<<<v><<><^v<^^vv<v>><v^>>><<v^^<^^>>>v><<<>^>v<<^<^>v<<>>^v^<<<<v<v^>>^>>v>>><>vv><<^v<>><^><^><vv^^^>vv>^^<^v><vvv>v^>^<^v>>>>vvvv>>><>^^<^<<^v<^v<<>vvvvv><v<<v><<^<>>v^<<<v^vv<v<v^>^^vv>vv^vv>>>^><vvv^^^<<>v>>v>><<^^>v^^v<<v>vv><^v^>>v>^<<v>v><v^^>v^<^^^<<^<v><vv<v>^>>v<v><><><>>^^^^^>>vv^vvv^v>^^^<>^>^v>^vv^^><>>^<^<<^>^<<>>^v^v<<>v<v>^<^vv<>^v>>>v<><>^v><v^v<^><<<^v^>^<vv<^<v^>>^>^^^vvvv^v^^^<><v^v<>^v>><<^v^v<^<^v>>><>v<>^>>^>vv^<^<^v^>v^^vv^^<^^<>v>v<<^v^^^>^<>>^vv^v<<<v>>>><<>v>v><^<<v^<v^<<^>^v^>vvv<>^><v>>vv>^^<^v^>^v^>>v<v<v^v>v><^><<<v<^v>>>>>v^^<v^^<v<<>^><<>v>>^vv^>^<v<^v^<<<<v^><>v<<v^<><>><v>v^<<^>^>>>v^vv>>v<<^<v<vv><vvv^^><v^<^^^>v^v<v>v>>v^><>>^<>>^^>><^<^>>v^^^<>>v<>v<>>v^v<<^<<<^>^<><<^<^^vv>v^<<^^v^<^v<>^<^vv><>>>v<>^^<<^v^vv<<v^><<vv><^><<<^v>v<vv>v^>>>>>v><^>><vv<^><^><>>^<v<^>>^<^<<><v^<<><<^<v><v>v>>><<^>>^>^^^<v^vvv<>v>>vv>>^v<>>^vv^^^v^>>^<><v>v<><^>v<v^>^^v^^vv<vv^v>v^><v^^^v<^v^><>^<^^>>^<<><<v>>^^<<>><><>v<^<<^^<vv>>v^v<^^^>><^>^<<<^>^<<vv>><^>v^<>v<v +vvv>>^^>v>v<>>^^<>><>^v^<>v<>^v^<^>>^><^^>v><>^><<^v<<<<<v>v^<<v<><<v<v<<><^>v>v>^>v^^^vvv><^^<^vvv<<<^v>v^>>^^><vvvv><^<^>v^>>>vv>v>>>v^<><^vv>v<v<><v>><<^v><<<<<>v>^>vvv^v<>^<^v^<<<v>^vv^^^^^^>^><^><><^vv^<<^<>>^^>>^v^><vvv^^v>^><<^v>^<^>>v<^^>>v><vv<^<><<<>vvv<v>^^<^<v<^><>>^>v<^^<v^<<v>><^>v>>>v^^<>^>v^>>^<v<<<<v<<><<<<>v^><v><^v<^v^>><vv^v><>v><><>v<><v^>^<><>vv>v^>^>>^v^>vv^^>^<^<>>^>>v<^<vv>>v>>^v<<<v<^<^v<>^v^v>^^v<v^<>v^v>v<v>><vv>v>v<><^vvv<vvv^v>v<<^<<>>>v>>><vv>^v^<<>^>v>^>^^<^<<>^v^^>^^v<^>^<><>^^<>v^>v<v^vv^v^v^<v<<><><>v><v^vvv^v<>>>^<^^<>v<^^>>v^>v^^<^>>>>><^^<>>>v^<^>^<^<<^<>^v<v^^<>v^<v>^v<<<>^v^^^<><vv^^><^v<>>>^<>^<<>v><<<^vv>>vv^vv<^v^>v>v^>v>><<<<v^^^^vv<v>^v<<^<>>v>>v<>vv^v>>>vv>^vvv^v^v^v^<<>^^>vv>^>v>^v>>>^v^>v><>v<>><>>><>vv<<>>^^v>vv>v^<>>><^vv>v<>^v<v^<v^^^><>^v^><>^>>>^v^^vv>>><>v<>>^<^^^v<>v>^v^^>><^v^>><vvv>><v<<^^^>>>><^^v>v^v><v>v^<v<^>>^v^<<^<v^><vv<^^>vv^v<<><v><^^^<<^^v>^^v<vvvvv^>><><>v^^<<v>>^^>>^>>^<v^<<vv^>^<>>^v^v^<^<>^>^>^^vv^^vvv>>>^^>v^><<^<< +vv<^v^>^<^>^^><vvv>^vvv<v^v<v<vvv^><v^<>^>^<^<<<<<<<>>v^^>v^<<^><>^>^>><<<><^<>^>v^^<<vv>vv<><vvv^>v<^^^^>v<<v<<v^<>v<<>><^^<^^^>>><>v<>v^<>vv><^>>>>v<v^<v<>v<>^<<v<^^<<^v><^^>^v<v><<v^v>vv^^v<<>>^^^<><<v<^^^^v<vv^<v^>v^>^<^vv<>>>v>>><^<^<v>^<<<v>v^>>v^v<<^vv<^<v^>v<<>><vvv^<^><^^<>><<v>^><<>^v<>><><vv<<^<><>v>>v^>>^><v^^><>><>v^<<<><>^>vv^^^<^v><v<v>v^^^^v><>>^><>>v^^v>v<<><<^^<^>>v^^<v>v^^v><v><<<^>vv<<>^<v<v^v^>v^<v<<v<>>>^vvv<>^<><^^><^v<>^>v<vv>>>><^>>><>><^<<>vv><^<>^v^<^v<^>v^^>v^<v><<v>><^vv<^vv<>^>v^<v>><<v><><^>v>^<<vv^v<<^^<<vv>v<v<v^>^>>^>v>>v>>>>><>v<^>><^^>>^vvv><v^^v^<v^<^<>v^^vv<^><<><^vv><v<<<><^^<>><v^<^<^v><^v<>v>vv^<^v<<^^^><<vv>v<^v><<>vv^vv<>v^^^^^>>^>v<<<>v^^<<<^<<v<^>>>vv>^>^<v>>^^<v^^<<vv><<<vvv>v><^<^<>v^<>^>^^>v<<><>><>><^<<v<><v<v<v>^^<<^>vv<>^>v^<<><^<<><<^<v><><>v>v^^>>v<>^v<<^>>^vv><>v^^>^vv<>v<v>vv^v^>^^><<^><^>v>>^^<^<v<v<^><<v>vv<^v<^>>v><><<v^^<<^^<>^^>>v<<>^v>v^^^<v>vv><v^>>><^vvvv><^^vvv<v<>vv^^<^<<><<>^v<^<^v^v^>><<vv>^<^<v<<>vv<<^<<>v<<<<<<vv>v^v< +<^vv>^v>^<<>vv<<>>vv<v^<^v>^<>^^><^^^<><v<<<>>^>v<^v>>^>><^<<><^<<^^v<v><^^^^<>v><^>>>vv^>>v<v^<<v^<>v^>^^><>vv<^>^>>>v^v<>v><^>v<<<<^v^>^v><vv^>^^>>v^<v^v>>^>>>^>>vvv>>v<^><>><^^>>v>v>v^^<v<><>^<v<^vv<<^^><>v^><>^>>v>v<>^<vv>v<>^><>^>vv>^v><v><>><<><<v>^<<^>v^<v<vv><v<<v^^><v>vv<v^>v<>>^^<<^<^^^v>v<v><v<<^<^>v^<>>><<^>^<<^<^v<v^^^v^^v<>vv<>^v^^^^^>^><>^^^^>>^>v^^>^v<>vvvv<><v>vv<<><^<>^<<<<^^^><^<^>>>^<^v^vv^^^v^v^^<<<^vv<^<^>^<><><<>>vv^^>><>><<^^<v<<><v>v^><>^^<^v>v^^<v<<<>^><^<<>>^^<^^<>v^vvvv>^<^v>^<v^>^v<vv^v>^^vv>vv^>^>v>^v^<>^v<><>^<>vv^<^>v^^^<vv^>^vv><v<v>v<>^>vv>v<^<v<>v^>^<>><v^><<<^v^v>>v^^>>>^^><v>^>^<>v<v^<>^v<<>v^>^>>v><v><>>>^<><><v>^^^v^^v<<v^><><v>>v>^^<<<<^^^^v>v>v^^>v>^^v^^^v><vv^vvv<^v^<v>>vv<^^v>^^v^<>vvv^^>>v>^<^<^v>^<<vv^<<<>^>><^<<^><>v^v>v^<>><<<<^^<>>^>^>>v<>v<^<v>>>v<<<<>>v^<^v>v>^^v<<v<<^>><<<^v^^<<<<v<<^v<^>>^v^^vvv^v>>^^>v<>v^>>>v<<>^><><<<v^v>>^vv>^v^^v^><v^<^>v^^^vv<^<>vvv><v>^v>><<^>v<v><v<^>>v^<^^vv>v<>^>><v<^v>>><vv^<vv^^^>>>v<^>v<^^<>^vvv><^<>^>>>^ +><<<^v>v>^>^^>^>^^v>>^v>v<v>>^^v<^<<>^^<<v^^>>v><>vv>v^>^^>v<v^^v^^v^^>v>^<vv^^<<^><<><^v^>vv<^v>^vv^<<^<<<^v^^<><^><<<<>>^><^>^vvv>><v^<^<v>^vv>><v>v>><^^v^>^^<^<^<>^v>^v>^v><<>^>v^^vv^^^v^v^v<^vv^^vvv^^^v>^>>^>vvv>>^^<^>^v<>>^^>>v>^^<v><>v>>v<^<vv^<vv>^>v<^^v>^<>>^^v><>^^v^v^<^<<^^<vv^^^<v><<<>^v>v^<<<v<v<>^v>vv<v<^<v>^^>>><<^^><^v>^vv<<^>>^>^vvv><>v<^v>vvv<v<^<>^^^>^^>^^>v^><^<^v<><<<v^v>>^<^<v<^<v<<<>>v><v>v>><>^>><^<<>v^<<^v><^<^<>><^<<^v><^^><v^>^^v<<v<^<^^^<>^>>^^v<<^<<v^>>v<v<^^^v><v<<^>^v>v><<^<<^<>^>v>^^<vvv<^><vv<<<^v><^^vv<<>^v^<^>v^v>v<<^v>><><v<v><<><><<^<<>^>vvv<><<^<v<^^^^><<^v><>v<>v>v>v><^>v^v<^<v^^<>^v^^<v><vv><>vvv>^^<><><>^><^<>><^^^>>>^^>v<v^<<<<>>v<v^<<^^^^vvv^^<^v^><v>><>v<v<>>^^v<v>^<<^^<>>>^>>vv><^>v>^<>^v>v^<^>v^><<<^<<^><><^^v<^<<>v<>>>>v><^<v^^<^<>^vvvv^<^^^^><^^<^><v>>^v>v^^v^<^vv^>^<><><v<>>^v<v<<v>vv<<^>v>v><v^><^v^^<>^<^<<<>>>v>>^v^><>v^<>vvv<<v<v^v^^^<><>v>^v>^<v>^v>^vv^<<v<>^^<^vv>v<^^v^^<^^>^<v<v<<<v>vv^><v^^>v>vv<<>>v^^<^<v^<v^<<vv>^^v^>v<>^^<<v<^v<
\ No newline at end of file diff --git a/2024/day15/input_test b/2024/day15/input_test new file mode 100644 index 0000000..c6138ff --- /dev/null +++ b/2024/day15/input_test @@ -0,0 +1,10 @@ +######## +#..O.O.# +##@.O..# +#...O..# +#.#.O..# +#...O..# +#......# +######## + +<^^>>>vv<v>>v<<
\ No newline at end of file diff --git a/2024/day15/input_test2 b/2024/day15/input_test2 new file mode 100644 index 0000000..b2bce78 --- /dev/null +++ b/2024/day15/input_test2 @@ -0,0 +1,21 @@ +########## +#..O..O.O# +#......O.# +#.OO..O.O# +#..O@..O.# +#O#..O...# +#O..O..O.# +#.OO.O.OO# +#....O...# +########## + +<vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^ +vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v +><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv< +<<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ +^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^>< +^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^ +>^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ +<><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> +^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v> +v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^
\ No newline at end of file diff --git a/2024/day15/solve.py b/2024/day15/solve.py new file mode 100644 index 0000000..5459df4 --- /dev/null +++ b/2024/day15/solve.py @@ -0,0 +1,67 @@ +def move(data: list[list[str]], current_pos: tuple[int, int], + current_order: str, movement_dict: dict[str, tuple[int, int]]) -> tuple[int, int]: + assert data[current_pos[0]][current_pos[1]] == "@" + + direction = movement_dict[current_order] + can_move = True + steps = 0 + while True: + steps += 1 + current_tile = data[current_pos[0] + direction[0] * steps][current_pos[1] + direction[1] * steps] + if current_tile == "#": + can_move = False + break + elif current_tile == ".": + break + + if can_move: + data[current_pos[0]][current_pos[1]] = "." + if steps > 1: + data[current_pos[0] + direction[0] * steps][current_pos[1] + direction[1] * steps] = "O" + current_pos = (current_pos[0] + direction[0], current_pos[1] + direction[1]) + data[current_pos[0]][current_pos[1]] = "@" + + return current_pos + +def calculate_gps_data(data: list[list[str]]): + result = 0 + for row_pos, row in enumerate(data): + for col_pos, char in enumerate(row): + if char == "O": + result += row_pos * 100 + col_pos + return result + +movement_dirs = { "<": (0, -1), "v": (1, 0), "^": (-1, 0), ">": (0, 1) } +map_data = [] +movement_data = "" + +with open("input") as f: + reading_movement = False + for line in f: + line = line.strip() + if reading_movement: + movement_data += line + else: + if line == "": + reading_movement = True + else: + map_data.append(list(line)) + +for row_idx, row in enumerate(map_data): + for col_idx, char in enumerate(row): + if char == "@": + robot_row = row_idx + robot_col = col_idx + break + else: + continue + break + +new_pos = (robot_row, robot_col) +for order in movement_data: + new_pos = move(map_data,new_pos, order, movement_dirs) + +for line in map_data: + print("".join(line)) + +print(calculate_gps_data(map_data))
\ No newline at end of file diff --git a/2024/day15/solve2.py b/2024/day15/solve2.py new file mode 100644 index 0000000..86e5c82 --- /dev/null +++ b/2024/day15/solve2.py @@ -0,0 +1,119 @@ +def get_affected_boxes_if_can_move(data: list[list[str]], current_pos: tuple[int, int], + affected_box_positions: list[tuple[int, int]], direction: tuple[int, int]) -> bool: + current_char = data[current_pos[0]][current_pos[1]] + if current_char == "]": + current_pos = (current_pos[0], current_pos[1] - 1) + + if current_char in affected_box_positions: + return True + + if current_char != "@": + affected_box_positions.append(current_pos) + + pushed_positions = [] + if current_char == "@": + pushed_positions.append(direction) + elif direction == (0, 1): + pushed_positions.append((0, 2)) + elif direction == (0, -1): + pushed_positions.append(direction) + else: + pushed_positions.append(direction) + pushed_positions.append((direction[0], 1)) + + for pushed in pushed_positions: + pushed_pos = (current_pos[0] + pushed[0], current_pos[1] + pushed[1]) + pushed_char = data[pushed_pos[0]][pushed_pos[1]] + if pushed_char == "#": + return False + elif pushed_char == "[" or pushed_char == "]": + success = get_affected_boxes_if_can_move(data, pushed_pos, affected_box_positions, direction) + if not success: + return False + + return True + + +def move(data: list[list[str]], current_pos: tuple[int, int], + current_order: str, movement_dict: dict[str, tuple[int, int]]) -> tuple[int, int]: + assert data[current_pos[0]][current_pos[1]] == "@" + + direction = movement_dict[current_order] + can_move = True + steps = 0 + affected_box_positions = [] + success = get_affected_boxes_if_can_move(data, current_pos, affected_box_positions, direction) + if not success: + return current_pos + + data[current_pos[0]][current_pos[1]] = "." + for box_pos in affected_box_positions: + data[box_pos[0]][box_pos[1]] = "." + data[box_pos[0]][box_pos[1] + 1] = "." + + current_pos = (current_pos[0] + direction[0], current_pos[1] + direction[1]) + data[current_pos[0]][current_pos[1]] = "@" + + for box_pos in affected_box_positions: + data[box_pos[0] + direction[0]][box_pos[1] + direction[1]] = "[" + data[box_pos[0] + direction[0]][box_pos[1] + direction[1] + 1] = "]" + + return current_pos + +def calculate_gps_data(data: list[list[str]]): + result = 0 + max_cols = len(data[0]) + for row_pos, row in enumerate(data): + for col_pos, char in enumerate(row): + if char == "[": + result += row_pos * 100 + col_pos + return result + +movement_dirs = { "<": (0, -1), "v": (1, 0), "^": (-1, 0), ">": (0, 1) } +map_data = [] +movement_data = "" + +with open("input") as f: + reading_movement = False + for line in f: + line = line.strip() + if reading_movement: + movement_data += line + else: + if line == "": + reading_movement = True + else: + new_line = [] + map_data.append(new_line) + for char in line: + if char == ".": + new_line.append(".") + new_line.append(".") + elif char == "#": + new_line.append("#") + new_line.append("#") + elif char == "O": + new_line.append("[") + new_line.append("]") + else: + new_line.append(char) + new_line.append(".") + +for row_idx, row in enumerate(map_data): + for col_idx, char in enumerate(row): + if char == "@": + robot_row = row_idx + robot_col = col_idx + break + else: + continue + break + +new_pos = (robot_row, robot_col) +for order in movement_data: + new_pos = move(map_data,new_pos, order, movement_dirs) + +for line in map_data: + print("".join(line)) + +print(calculate_gps_data(map_data))
\ No newline at end of file diff --git a/2024/day16/input b/2024/day16/input new file mode 100644 index 0000000..3f2737a --- /dev/null +++ b/2024/day16/input @@ -0,0 +1,141 @@ +#############################################################################################################################################
+#.................#.....#.#...#...............#.......#.......#.......#.....#.........#.............#...#.......#.#.......#.........#...#..E#
+#.#.#.#.###.#####.###.#.#.#.#.#.#####.#######.#.###.###.#.###.###.#.#.###.#.###.#.###.#######.#.###.#.#.###.###.#.#.#.#####.#.#####.#.#.###.#
+#...#.#...................#.#...#.....#...#...#...#...............#.#.....#...#.#.#...#.....#.#...#.#.#...#.#...#.#.#.....#.#.....#...#.....#
+#.###.#######.#####.###.###.#####.#####.#.#.###.#.#.#.#####.###.###.#########.###.#.###.###.#####.#.#.###.#.###.#.#.#####.#.###.#.#########.#
+#.#.#.......#.#.............#...#.....#.#.....#.#.#.#.#...#.#.......#.......#.....#.#...#.#.#.....#.#.#...#...#.#.....#.....#...#.#.......#.#
+#.#.#######.#.#.#######.#.###.#######.#####.#.###.###.#.#.#.###########.###.#######.###.#.#.#.#####.#.#.#####.#.#######.###.#.#.#.###.###.#.#
+#.....................#...#.........#.......#.#...#.............................#...#...#.#...#.......#.#.....#.#.....#.......#.#...#...#.#.#
+#.#########.#####.###.#.#.#####.###.#####.#.#.#.#.#.###.#.#.#.#.#.#.#.#.#.#####.#.###.###.#####.#######.###.###.#.###.#########.###.#####.#.#
+#.#.......#...#...#.#...#.................#...................#.#...#.................#.......#.#...#.......#.#...#.#.....#.....#...#.....#.#
+#.#.#####.#.#.#.#.#.###.#.#.#####.#.#.#.###.#####.###.###.#.#.#.###.#########.#.#.#.#####.#.###.#.#.#########.#####.#####.#######.###.###.#.#
+#.#.#.....#.#.#.#.....#...#.#.#.........................#.#.#.#...#.............#.#...............................#.#...#...#.....#...#...#.#
+###.#####.###.#.#.#.###.###.#.#.#.#.#.###.#.#.#.#.#####.#.#.#.#.#.###.#.#.#.#####.#####.###.#.###.###.#.###.#.#.#.#.#.#.###.#.#######.#####.#
+#...#...#.....#.#...#.....#.#...#.#.#...#.#.#.#...#.....#.....#.#.....#.#...#.................#...#.#...#...#.#.#.#.#.#...#.#.#.......#.....#
+#.###.#.###.###.#.###.#.###.#.###.#.###.#.#.#.#####.#####.#.#######.###.#.###.#.#####.#.#.###.#.###.#####.#####.#.#.#.###.#.#.#.#.###.#.#####
+#...................#.#.#...#.#.#.....#.#.#.#.#.....#.....#...#...#.#...#.#...#.......#.#...#.#.#.......#...#...#...#.#.#...#.#.#...#.#...#.#
+#.#####.###.#.###.#.#.#.#.###.#.#####.#.#.#.#.#.#######.#.###.#.#.###.#####.#########.###.#.###.#.###.#####.#.#####.#.#.#####.###.#.#####.#.#
+#.#...#...#.#.....#...#.....#.#.....#.#.#...#.#...#.....#...#...#...#.....#.#.#.....#...#.#.#...#...#.....#.#.#.....#.....#.#...#.#.........#
+#.#.#####.#.#####.###.#.###.#.#.###.#.#.#####.###.#.#####.#######.#.#.###.#.#.#.###.###.###.#.#####.#####.#.#.#.#########.#.#.#.#.#######.#.#
+#.#.....#.#.#...#...#...#...#.#.#.#...#.....#.......#.......#...#.#.#...#...#.#.#.#.#.......#...#.#...#...#.#.#.#.....#.......#.#...#...#...#
+#.#.#.###.#.#.#.###.###.#.###.#.#.#.#######.#.#.#####.#####.#.#.###.#.#####.#.#.#.#.###########.#.###.#.#.#.#.###.###.#.###.###.#####.#.#.#.#
+#.#.#...#.#.#.#...#.#...#.......#...#.......#.#.#.....#.......#.#...#.#...#...#...#.....#.......#.....#.#.#.#.....#...#...#.#.#.#.........#.#
+#.#####.#.#.#.###.#.###.#.###########.#########.#.#####.#######.#.#####.#.#######.#####.#.#############.###.#.#####.#.###.#.#.#.#.#######.#.#
+#.#.....#.#.#.#...#...#.#.#.....#.....#.........#.......#...#.....#.....#.......#.#...#.#.............#.#...#.....#.#.#...#...#.....#.....#.#
+#.#.#####.#.#.#.#####.#.#.#.###.#.###.#.###########.#.###.#.#####.#.###########.#.###.#.#.#.###.#.###.#.#.#######.#.#.#.###########.#.#.#.###
+#.#.....#.......#.#...#.#.....#.#.#...#.#.........#.#...#.#.......#...#.......#.#...#.#...#.....#.#.#.#.#.....#.#.#.#...#.......#.#.#.#.#...#
+#.#####.#.#####.#.#.#.#########.#.#####.#.#.#####.#.#####.###.#.#####.###.###.#.###.#.###########.#.#.#.#####.#.#.#.#####.#.###.#.#.#.###.#.#
+#.....#.#...#.....#.......#...#.#.#...#.#.#.#...#.#.......#.#.............#...#.....#...........#.#...#.....#.#.#.#.....#...#...#...#.....#.#
+#####.#.###.#####.#######.#.#.#.#.#.#.#.#.#.#.#.###########.#######.###############.#####.#####.#.#.###.###.#.#.#.###.#.###.###.#########.#.#
+#...............#.......#.#.#...#...#.#.#.#...#.....#.......#...#...#.....#.......#...........#...#...#...#.#.#.......#...#...#...#.....#.#.#
+###.#.#.#.#.#.#.#######.#.#.#.#######.#.#########.#.#.#####.###.#.#.#.###.#.#####.#########.#.#######.#.#.#.#.###########.###.###.#.###.#.#.#
+#...#...#.#.#.#.....#.#.#.#.#.#.....#...........#.#...#...#.#...#.#...#.#...#...#...#...#...#.#.......#.#.#.#.......#...#...#...#...#.#.#...#
+#.#######.#.#.#####.#.#.#.#.#.#.###.#.###.#.###.#.#####.#.#.#.###.#####.#####.#####.#.#.#.###.###.#######.#.#######.#.#####.#.#.#####.#.#.#.#
+#.....#...#.....#...#...#.#.#.#.#...#.#.......#.#.....#.#.#.#.#...#.....#.........#...#.#.#.#...#...#.....#...#.....#...#...#.#...#.......#.#
+#.###.#.#####.###.#######.#.#.#.#.###.#.#####.#.#.###.#.#.#.#.#.#####.###.#######.#####.#.#.###.###.#.###.#####.#####.#.#.###.###.#.#####.###
+#...#.#.#.#...#...#.........#.#.#.#...#.....#...#...#.#.#.....#.....#...#.#...#.......#...#...#.#.....#...#.....#.....#...#.....#.#...#.....#
+#####.#.#.#.#.#.###.###########.#.###.#####.#####.#.#.###########.#.###.#.#.#.#.#############.#.###########.#####.###########.#.#.#####.#.#.#
+#...#.#.#...#.#...#.#...........#...#.......#.......#.....#.....#.#.....#...#.#...............#.#...#.......#.#...#.........#.#...#.....#...#
+#.#.#.#.#####.###.#.#.#############.#######.#####.#######.#.###.###.#.#######.#######.#######.#.#.#.#.#######.#.###.#######.#.###.#.#####.#.#
+#.#...#.#.....#.#...#...#.#.......#.......#.....#.....#...#...#.....#.......#.#...#...#.....#.#...#...........#.....#...#...#...#...#.....#.#
+#.###.#.#.###.#.#######.#.#.###.#########.#####.#.#####.#.###.#######.###.#.#.#.#.#.###.#####.###########.#.#.#######.#.#.###.#.#.###.###.#.#
+#...#.#.#...#.....#...#.#.#.#.#.......#...#.....#.#...#.#.....#...#...#...#.#.#.#.#.#.........#.........#.#.#.#...#...#.#...#.#...#...#.....#
+###.#.#.###.#####.###.#.#.#.#.###.#####.###.#####.#.#.#.###.#.###.#.###.###.#.###.#.#######.###.#######.#.#.#.#.###.###.###.#.###.#.#####.###
+#...#.#.....#...#...#.#.#.......#.#.....#.......#.#.#...#...#...#.....#.....#.....#.......#...#.#...#...#.#.#...#...#.....#.#...............#
+#.#####.#####.#.###.#.#.#####.###.#.###########.###.#######.###.#.###.#####.#####.#######.###.#.#.#.#.#####.###.#.###.#.#.#.#.#.#.#######.#.#
+#.........#...#...#...#.....#.#...#.........#.#...#.#.....#.#...#...#...#.#.....#...#...#.#.#.#.#.#.#.......#...#...#.#...#.#...#.#.........#
+#.#.###.#.#.###.#####.#####.###.#####.###.#.#.###.#.#.###.#.#.###.#.###.#.#.#######.#.#.#.#.#.#.#.#.#.#######.#####.#.#.#.#.#####.#.#.#.#.#.#
+#...#...#...#.#.....#.#...#.....#...#.....#.#...#.#.....#.#.#.#...#...#.#.#.......#...#.#.........#.#...#.......#...#.#.#.#.#.......#.#...#.#
+#.###.#.#####.#####.#.#.#######.#.#.#####.#.###.#.#######.#.#.#.#####.#.#.#######.#####.#.#######.#.#.#.###.#####.###.#.#.#.#.###.#######.###
+#...#.......#.....#...#.....#...#.......#.#...#.#.....#...#.#...#...#...#.#.......#.....#.#.....#.#...#...#...#.....#.#...#.#.#.........#...#
+###.###.#####.###.#####.#.###.###.#####.#####.#.#####.#.#####.#.###.#.#.#.#.#######.#####.#.###.#.#######.###.#.#####.#.###.#.#.#.#####.#.#.#
+#.#...#.......#.#.....#.#...#.#...#...#.......#.#.....#.....#.#.....#.....#.........#.#...#.......#.....#.#...#...#...#.#...#.#.#.....#.....#
+#.###.#.#######.###.###.###.#.#.###.#.#########.#.#########.#.#####.###########.#####.#.#####.#######.#.#.###.###.#.###.#.#####.#.#.#.###.#.#
+#.#...#...........#.....#...#.#.#...#...........#...#.....#.#.#.#...#...#.....#.....#.#...#...........#.#...#.#...#.#...#.#.....#...#.#.....#
+#.#.#.#.###########.#####.#.#.#.#############.#.###.#.###.#.#.#.#.###.###.###.#####.#.###.#.###.#.#####.###.#.#.###.#.###.###.###.###.#.#.###
+#.................#.#.....#.#.#.........#...#.#...#.#.#.#...#.#...#...#...#.#.#...#...#...#.....#.#...#.#.#.#.#...#.#.#...#...#...#...#.....#
+#.###.###.#.#####.###.#####.#.#########.#.#.#.#####.#.#.###.#.###.###.#.###.#.#.#####.#.#.###.###.#.#.#.#.#.#####.#.###.###.###.#.#.#######.#
+#.....#.#...#...#.#.....#...#.#...#...#.....#.#...#...#.#...#...#.#...#...#.#.#.....#...#.....#.....#.#.....#.....#.....#...#...#...#.....#.#
+#####.#.#######.#.#.###.#.###.#.###.#.#####.#.#.#.#####.#.#####.#.#.#####.#.#.###.#####.###.###.#####.###.#.#.#.###########.#.###.#####.###.#
+#...............#...#.....#.#.#.#...#.....#.#...#...........#.#.#...#...#.#.#...#.#.....#...#...#.......#.#.#...............#...#.......#...#
+#####.#.###.###.#####.#.###.#.#.#.#####.#.#.#.#.###########.#.#.###.#.#.#.#.###.#.#.#####.#.#.###.#######.#.#################.#.#######.#.###
+#.......#.....#.#...#.#...#.#.#.......#.#.#.#...#.........#.#.#...#.#.#.#.#.#...#.#.....#.#.#.#.#.........#.........#.........#.#.......#...#
+#.###.#.#.#.#.#.#.#.#.###.#.#.###.#####.#.#.#####.#######.#.#.###.###.#.#.#.#.###.###.###.#.#.#.#############.#####.#.###.#####.###########.#
+#.....#.#.#.#.#...#...#...#.#...#.#.....#.#.#...#...#...#.#.....#.....#...#.#...#.#...#...#.#.....#.....#...#.#...#.#...#.....#...........#.#
+#.###.###.#.#.#########.###.###.#.#.#####.#.#.#.###.#.###.###########.#####.###.#.#.###.###.#####.#####.#.#.#.#.#.###.#.#.###############.#.#
+#.#.#.....#.#...............#...#.#...#...#...#.....#...#...#...#...#.......#...#.#...#...#...#.........#.#...#.#.......#...........#.....#.#
+#.#.#.#####.#################.#######.#.###############.#.#.#.#.#.#.#######.#.#.#.###.###.#####.#########.#####.#######.#####.#####.#.#.###.#
+#.#...#.........#...#.........#.......#.#.................#...#.#.#.#...#.....#.#.......#.......#...#.....#.....#...........#.#...#.#.#.....#
+#.#.#.#.###.#.###.#.#.#########.#.#######.#########.#####.#####.#.#.#.#.###.###.#####.#######.###.#.#.#####.#####.#####.###.###.#.#.#.#.#####
+#.#.....#...#.....#.#...#.......#.#...#...#...#...#...........#.#.#...#...#.#...#...#.#.....#...#.#...#.....#...#.....#...#...#.#.#.#...#...#
+#.#.#.#####.#######.###.#######.#.#.#.#.#####.#.#.#######.###.#.#.#######.#.#.#.#.#.###.###.###.#.###.#.#####.#.#########.###.#.#.#.#####.#.#
+#.#...#...#.......#...#.#.....#.#...#.........#.#...#...#.#...#.......#.#.#.#.#.#.#.#.....#.#...#...#.#...#...#...........#.#.#.#.......#.#.#
+#.###.#.#.#.#.###.###.#.#.###.#.###.#########.#.###.#.#.###.#.#########.#.###.###.#.#.#####.#######.#####.#.###############.#.#.#######.###.#
+#.#.....#.....#.#...#.#.#.#.......#...#.....#.#...#...#.....#...#.......#.#...#...#...#.....#.......#...#.#...#.......#.....#...#.....#...#.#
+#.#.#.#########.###.#.#.#.###.###.#.#.#.###.#####.#############.#.#######.#.###.#######.#####.#######.#.#.###.#.#.###.#.###.###.#.#.#.###.#.#
+#.#.#.......#.....#.#.#.#...#...#.#.#...#.........#...........#.#.#.......#.....#...#...#.......#.....#...#...#.#...#.#...#.........#.#...#.#
+#.#.#.#####.#.#####.#.#.#.#.###.#.#.#####.#####.#############.#.#.#.#######.#######.#.#########.#.#########.###.###.#.###.#####.#.###.#.###.#
+#.#...................#.#.#...#.#.#.#.....#...#...............#.#...#.....#.#.......#.....#.....#.#.........#.#...#.#.....#.........#.#.....#
+#.###.#.#####.#.#####.#.#####.#.#.#.#######.#.###.###.#######.#.#####.#.#.#.#.#.###.#.###.#.#####.###.#######.###.#.###.#.#.###.#.#.#.###.#.#
+#.....#.....#...#.....#.......#.#.#.........#.......#.#...#...#...#...#...#.#.#...#.....#.#...........#...#.....#.#.#.......#.......#.#...#.#
+###########.#.###.#############.#.#############.#.#.###.#.#######.###.#.#.#.###.#.#####.#.#.#######.###.#.###.#.#.#.###.#.#####.#.###.###.#.#
+#.......#...#.#.#.#.........#...#...#.........#.#.#.....#...#...#.......#.#...#.#...#.#.#.#...#.....#...#...#.#...#.#...#.....#.#.........#.#
+#.###.###.###.#.#.#.###.###.#.###.###.#######.#.#.#########.#.#.#########.###.#.###.#.#.#.#####.###.#.#####.#.#####.#.#####.#.###.#########.#
+#...#.#...#.....#.....#.#...#...#.#...#.....#...#...#.....#.#.#.....#...#.#.#.#.#...#...#...#.........#.....#...#...#.......#.......#.......#
+#.#.#.#.#############.#.#.#####.#.#.###.#.#########.#####.#.#.#.###.###.#.#.#.#.#.###.#####.#.###.###.#.#########.#####.#########.#.#.#######
+#.#.#.#.#.........#...#.#.....#...#...#.#.........#.#.....#...#.#.....#.#.#.#.#.#...#...#...#.#...#...#.#.......#.....#.#.....#...#.#.......#
+#.#.###.#.#######.#####.#####.#.#.###.###.#####.###.#.###.#####.#####.#.#.#.#.#.###.#####.###.#.###.###.###.#.#.#####.#.###.#.#.#.#.#######.#
+#.#.....#.....#.#.......#.#...#.#.#.#...#.....#...#.#...#.#...#.#.......#...#.#.#...#...#.....#.......#...#...#.......#...#.#...#.#.......#.#
+#.#######.###.#.###.#####.#.###.#.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.###.###.#.###.###.#.#######.#########.#.#############.#.#.###.#########.#
+#.#...#...#...#.....#...#.....#.#.#...#.#.#.#...#.#.#.#.#...#.#...#...#...#.#.....#...#.......#...#...#...#.........#.......#.#...#.....#...#
+#.###.#.###.###.###.#.#.###.#.#.#.#.#.#.###.###.#.#.#.#.#############.#####.#.#####.#########.#####.#.#.#####.#.###.#######.#.#.#.#.###.#.###
+#...#.#.#.#.#...#.....#...#.#...#...#.#.....#...#.#.#.#.............#.......#.......#...#...#.......#...#...#.#.............#...............#
+###.#.#.#.#.#####.#####.#.#.#.###.#######.#.#.###.#.#########.#####.#######.#.#.#####.###.#.#######.#####.#.#.###.#########.#.###.#.#.#.#.#.#
+#...#.....#.........#...#.#.#...#.........#.......#.#.......#.#...#.....#.....#...#.......#.........#.....#.....#.#.......#.#...#.....#.#...#
+#.###.#.#.#.#######.#.#.#.#####.#.#########.#.#####.#.#####.#.#.#.#####.#.#######.###.#####.#######.###.#########.#.#.#####.#.#####.###.###.#
+#.....#...#.......#.#.#...#.....#.#.........#.#...#.#.#.....#...#.....#.#.......#...#.#.....#.....#.....#.......#.#.#.....#...#...#.#...#...#
+#####.#.###.#.###.#.#.#.###.#####.###.###.#.###.#.#.#.#.#####.#########.#####.#####.###.#####.#####.#.###.#####.#.#######.#####.#.###.###.###
+#...#.....#.#.....#.#.#.#...#...........#.#.....#.....#.....#.#...#...#.....#.......#...#...#.......#.#...#.................#...#.#...#...#.#
+#.###.#.#.#.#.#####.#.###.###.###.#####.###.###########.###.###.#.#.#.#.#.###.#.#####.###.###.#.###.#.#.#####.#####.###.#####.###.#.###.###.#
+#.......#...#...#...#...#.#.......#...#...#.#.........#...#.....#...#...#.#...#.#.....#.......#...#...#...........#...#.#.....#.#.#...#...#.#
+#.#.#.#######.#.#######.#.#####.###.#####.#.#.#######.#.#.#####.###.#######.###.###.###########.#.#####.#########.###.###.#.###.#.###.###.#.#
+#.#.....#.....#.#.......#.....#.#.........#.#.#.....#.#.#...#.....#.#.....#...#...#.............#...........#.....#...#...#.............#...#
+#.###.#.#.#.#.#.#.#.#########.#.#.#.#.#######.#.###.#.#.###.#####.#.#.###.###.###.#########.#########.#####.#.#.#.#.#.#.###.#.#######.#####.#
+#.#.#...#.#.#.#.#.#.........#.#.#.#.#.#.......#.#.....#...#.....#...#.#.#.......#.#.......#.......#...#.#.....#.#.....#.....#.#...#...#...#.#
+#.#.#.###.#.#.#.#.#.#####.###.#.#.###.#.#######.#########.#####.#####.#.#########.#.#####.###.#####.###.#.###########.#####.#.#.#.#####.#.#.#
+#...#...#.#.....#.#.#...#.#...#.#...#...#.....#.........#.#...#...#...#.....#...#.#.....#...#.#...#...#.....#.......#.#...#.#.#.#...#...#.#.#
+###.#.#.#.###.###.#.###.#.#.###.###.#########.#####.###.#.#.#.###.#.###.#.###.#.#.#.###.###.###.#.###.#.#####.###.#.#.###.#.###.###.#.###.#.#
+#...#...#.....#.....#...#.#.#.......#...........#.....#.#...#...#.#.....#.#...#...#...#.#.......#...#.#...#...#.#...#.....#.....#.#...#.#...#
+#.###.#.###.#.###.###.#.#.#.#.#####.#.#########.#.###.#.#.#######.###.#####.###########.###########.#.###.#.###.#.#######.#######.#####.#####
+#...#.#.....#...#.....#.#.#.....#...#...#.........#.#.#...#.....#.....#.....#...........#.........#.#...#.#.#...#.......#.#.......#...#.....#
+###.#.#####.#.#.#######.#.#####.#.###.#.#.###.#####.#.#####.###.###.###.#######.#.#######.#######.#.###.#.#.###.#######.#.#.#####.#.#.#.#####
+#.#.#.....#.....#...#...#.#.....#.#...#.....#.#.....#.....#...#...#.#...#.......#.....#...#.#.....#...#.#.#.......#...#.#.......#...#.#.....#
+#.#.#.###.#.#.###.#.#####.#.#.###.###########.#####.###.#.#.#.###.#.#.###.###.###.###.#.###.#.#######.#.#.#######.#.#.#.#####.#.#####.###.#.#
+#...#.#...#.#.....#.#.....#...#.........#.....#...#.......#.#...#.#.#.#.#.#.#...#.#.#...#...#...#...#...#.....#...#.#...#...#.#.....#.......#
+#.###.#.###.#.#####.#.###.###.#########.#.#####.#.#########.###.#.###.#.#.#.###.#.#.#####.#.###.#.#.#.#######.#.###.###.#.#.#.###.#######.#.#
+#...#.#.......#.......#.....#.......#.#.#.#.....#.........#...#.#.....#.#.....#...#.........#.#.#.#...#.....#.#.#.#...#.#.#.....#.....#.....#
+###.#.#####.#.#####################.#.#.#.#.#############.#.#.#.#######.#####.###.###.#.###.#.#.###.###.###.#.#.#.###.#.#####.#.#.#.#.#.#.###
+#.#.#.#...#.#.....#.....#.........#.#...#.#.#.......#...#.....#.#.........#.#...#...#.#.#.#...#.......#...#.#.#.#...#.#.....#...#...#.#.#...#
+#.#.#.#.#.#.#.###.#.###.#.#####.###.#.#.#.#.#.###.#.#.#.#######.#.###.###.#.###.#.#.###.#.###.#######.###.#.###.###.#.#####.#.###.#.###.#.#.#
+#.#...#.#.....#...#.#.#.#...#.#.....#.......#...#.#.....#...........#...#.....#...#.....#...#.#.....#.....#.....#.......#...#.....#.#...#.#.#
+#.###.#.###.###.###.#.#.###.#.#########.###.###.#.#####.#.###.#.###.###.#####.#####.#####.###.#####.#############.#####.#.###.###.#.#.###.###
+#.#...#.#.....#...#...#...#...#...#...#.....#...#.......#...#.....#.#.#.#.....#.....#.....#...#.....#...............#...#.#...#.....#.#.....#
+#.#.###.#.#.#.###.###.#.#####.#.#.#.#.#.#####.#.#.###.###.###.#####.#.#.###.###.###.#.###.#.###.###.#.#.###########.#.###.#.#.###.#.#.###.#.#
+#.#.#.#...#...#.#...#.#.......#.#...#.#.#.....#.#...#.#...#...#...#...#...#.......#.#...#.#...#.#...#.#.#...#...#...#...#...................#
+#.#.#.#####.###.#.#.#.#########.#####.#.#.#####.###.#.#.#.#.###.#.#.#####.#.#.###.#.###.#.###.#.#.###.#.#.#.###.#.#####.#######.#.#.#####.#.#
+#.#.#...#...#...#.#.#.#.........#.....#.#.#...#.#...#...#.#.....#.#.#.....#.#...#.#.#...#...#...#.#...#.#.#.....#.....#...#.....#.#.....#.#.#
+#.#.###.#.###.#.#.###.#######.###.#.#.#.#.#.#.#.#.#.#.#.#.#######.#.#.#####.###.#.#.#######.#####.#.###.#.###.#.#####.###.#.#####.#.#.###.#.#
+#.#.....#.#...#.....................#.#.....#.#.....................#.#.....#...#.#.............#.#...#...#.....#...#...#...#...#...#.....#.#
+#.#####.#.#####.#######.###.#.#.###.#.###.#######.###.###.#.#.#.#####.###.###.#.#.###########.###.#.#.###.#.#.#.#.#.###.#####.#.#.#########.#
+#.#.....#...#.........#.#.....#.#.#...#...#.....#...#.#.#...#.#.....#...#.#...#...#.....#.....#...#.#.....#...#.#.............#.....#.......#
+#.#.#######.#.#######.#.#######.#.#####.#.#.###.###.#.#.#####.#####.###.#.#.###.###.#.###.#####.###.#####.###.#.#.###.#####.#####.#.#.#####.#
+#...#.................#.......#.....#...#...#...#...#.#...#...#...#...#.#.#...#...#.#.......#.#.#...#...#.#...#...#.#.......#...#.#.#...#.#.#
+#.#.#.###.###.#.#######.#####.#####.#.###.###.###.###.#.#.#.###.#.#.#.#.#.###.#.#.#########.#.#.#.###.#.#.#.#.#####.#####.###.#.#.#.###.#.#.#
+#...#...#.#...#.......#...#.#.#.....#.#.....#.#...#...#.#...#...#.#...#.#...#.#.#.......#.....#.#...#.#.#.#.......#.......#...#...#.....#...#
+###.###.#.###.#######.###.#.#.#.#####.#.#.#.#.#.###.###.#######.#.#.#.#.###.#.#.#######.#######.#####.#.#####.###.#####.###.#############.###
+#.#...#.#...#.....#.#...#.#.#.#...#...#.#.#.#.#...#.#.#.....#...#.#...#.#.#.#.....#.....#.....#.#.....#.#...#...#.....#.#.......#.#...#...#.#
+#.#.#.#.###.#####.#.###.#.#.#.###.#.###.#.#.#.#.#.#.#.#####.#.###.#.###.#.#.###.###.#####.###.#.#.#####.#.#.#.###.###.#.#.#####.#.#.#.#.###.#
+#.#...#...#.....#.#.#...#...#.#...#.#.#...#...#.#...#.....#...#.#.#...#.#...........#...#...#.#.#.#.#...#.#.#...................#.#.#.#.#...#
+#.#.###.#.#####.#.#.#.#######.#.###.#.###.#######.###.#.#######.#.#.#.#.#######.#####.#.###.#.#.#.#.#.###.#.#.#####.#.#.###.#.#.#.#.#.#.#.#.#
+#S......#.....#...#...........#.....#.............#...#...............#...............#.....#.....#.......#...#.......#.....#...#...#.....#.#
+#############################################################################################################################################
\ No newline at end of file diff --git a/2024/day16/input_test b/2024/day16/input_test new file mode 100644 index 0000000..94e806c --- /dev/null +++ b/2024/day16/input_test @@ -0,0 +1,15 @@ +###############
+#.......#....E#
+#.#.###.#.###.#
+#.....#.#...#.#
+#.###.#####.#.#
+#.#.#.......#.#
+#.#.#####.###.#
+#...........#.#
+###.#.#####.#.#
+#...#.....#.#.#
+#.#.#.###.#.#.#
+#.....#...#.#.#
+#.###.#.#.#.#.#
+#S..#.....#...#
+###############
\ No newline at end of file diff --git a/2024/day16/input_test2 b/2024/day16/input_test2 new file mode 100644 index 0000000..a98e558 --- /dev/null +++ b/2024/day16/input_test2 @@ -0,0 +1,17 @@ +#################
+#...#...#...#..E#
+#.#.#.#.#.#.#.#.#
+#.#.#.#...#...#.#
+#.#.#.#.###.#.#.#
+#...#.#.#.....#.#
+#.#.#.#.#.#####.#
+#.#...#.#.#.....#
+#.#.#####.#.###.#
+#.#.#.......#...#
+#.#.###.#####.###
+#.#.#...#.....#.#
+#.#.#.#####.###.#
+#.#.#.........#.#
+#.#.#.#########.#
+#S#.............#
+#################
\ No newline at end of file diff --git a/2024/day16/solve.py b/2024/day16/solve.py new file mode 100644 index 0000000..92a24f2 --- /dev/null +++ b/2024/day16/solve.py @@ -0,0 +1,75 @@ +from bisect import insort
+from typing import Optional
+
+
+class Globals:
+ start_position = None
+ end_position = None
+
+
+class Node:
+ def __init__(self, position: tuple[int, int], previous_node: Optional["Node"], cost: int):
+ self.position = position
+ self.previous_node = previous_node
+ self.cost = cost
+
+ self.estimated_total_cost = cost + abs(Globals.end_position[0] - position[0]) + abs(
+ Globals.end_position[1] - position[1])
+
+
+def is_node_in_list(node_list: list[Node], position: tuple[int, int]):
+ for node in node_list:
+ if node.position == position:
+ return True
+ return False
+
+
+data = []
+with open("input") as f:
+ for line in f:
+ data.append(line.strip())
+
+for row_idx, line in enumerate(data):
+ for col_idx, char in enumerate(line):
+ if char == "S":
+ Globals.start_position = (row_idx, col_idx)
+ if Globals.end_position is not None:
+ break
+ elif char == "E":
+ Globals.end_position = (row_idx, col_idx)
+ if Globals.start_position is not None:
+ break
+ else:
+ continue
+ break
+
+row_count = len(data)
+col_count = len(data[0])
+traveled_to_positions = []
+open_nodes = []
+open_nodes.append(Node(Globals.start_position, None, 0))
+while True:
+ current_node = open_nodes.pop()
+ if current_node.position == Globals.end_position:
+ print(current_node.cost)
+ break
+
+ traveled_to_positions.append(current_node.position)
+ if not current_node.previous_node is None:
+ prev_pos = current_node.previous_node.position
+ forward_dir = (current_node.position[0] - prev_pos[0], current_node.position[1] - prev_pos[1])
+ came_from_dir = (forward_dir[0] * -1, forward_dir[1] * -1)
+ else:
+ came_from_dir = None
+ forward_dir = (0, 1)
+ for direct in ((-1, 0), (1, 0), (0, -1), (0, 1)):
+ if direct == came_from_dir:
+ continue
+
+ is_forward_dir = forward_dir == direct
+
+ new_pos = (current_node.position[0] + direct[0], current_node.position[1] + direct[1])
+ if 0 <= new_pos[0] < row_count and 0 <= new_pos[1] < col_count and data[new_pos[0]][new_pos[1]] != "#" and \
+ new_pos not in traveled_to_positions and not is_node_in_list(open_nodes, new_pos):
+ new_node = Node(new_pos, current_node, current_node.cost + (1 if is_forward_dir else 1001))
+ insort(open_nodes, new_node, key=lambda x: -x.estimated_total_cost)
|