defmodule AdventOfCode.Day02 do @input "18 21 22 24 26 29 28 9 11 14 17 18 21 21 48 51 54 56 60 6 8 10 11 16 75 76 79 82 80 83 28 31 33 32 33 30 94 96 94 96 96 42 44 45 44 46 50 25 28 29 26 33 37 39 39 42 43 49 51 53 56 56 57 55 88 91 91 93 96 99 99 56 59 59 61 62 65 68 72 30 33 35 37 39 42 42 49 14 17 19 23 24 2 4 5 9 12 15 16 14 88 89 93 96 99 99 68 70 71 74 78 81 85 46 47 49 53 58 36 39 41 47 49 50 51 54 81 82 85 91 93 95 96 94 11 14 16 18 23 23 72 75 81 84 85 89 40 41 44 46 51 53 58 70 68 71 73 76 77 78 80 83 80 83 86 83 44 42 45 47 49 51 51 78 77 80 81 83 85 88 92 34 33 34 36 38 45 54 51 52 54 56 57 56 59 57 54 53 55 52 48 46 47 49 47 47 70 67 64 65 67 70 72 76 42 41 42 45 44 46 53 44 41 44 47 47 50 51 53 12 11 13 13 12 27 25 25 26 26 57 55 55 58 61 65 65 63 65 68 69 69 71 78 88 87 91 93 94 84 82 84 86 90 92 93 92 22 21 25 27 28 28 35 33 35 36 40 43 44 48 32 30 31 33 37 44 30 28 30 36 38 70 67 69 70 77 75 42 39 44 47 47 47 45 48 53 57 32 29 34 35 36 39 40 46 71 71 74 75 77 14 14 16 18 20 19 43 43 44 47 49 51 51 71 71 72 73 75 76 80 10 10 12 14 15 16 22 42 42 45 42 45 48 72 72 75 73 74 75 73 82 82 85 87 84 86 89 89 68 68 65 67 71 19 19 20 21 19 26 87 87 89 89 92 78 78 80 81 82 82 80 11 11 11 13 13 54 54 57 58 58 62 23 23 23 26 29 34 8 8 12 13 16 19 38 38 42 43 46 47 49 47 30 30 31 35 36 37 37 23 23 27 29 31 35 4 4 6 10 13 16 18 25 44 44 47 52 54 56 57 32 32 39 40 37 10 10 13 18 20 23 23 46 46 52 55 59 66 66 73 76 81 54 58 61 64 66 69 71 74 7 11 14 17 19 22 20 16 20 21 23 24 27 29 29 83 87 90 91 95 1 5 6 8 13 60 64 65 64 67 68 69 71 54 58 61 64 66 69 66 64 74 78 81 80 83 83 61 65 68 70 69 70 72 76 84 88 90 91 88 90 96 78 82 85 87 87 89 91 94 75 79 81 81 82 84 86 83 2 6 7 7 8 9 9 9 13 14 14 15 19 1 5 5 8 14 76 80 82 86 88 90 78 82 84 88 89 86 60 64 68 71 74 74 40 44 46 50 54 30 34 35 38 42 45 47 52 51 55 62 64 67 70 71 72 37 41 42 43 48 51 48 11 15 16 17 24 24 20 24 29 32 33 37 61 65 67 72 74 81 45 52 55 56 59 60 63 23 29 32 34 32 63 70 71 72 75 78 80 80 66 73 75 78 81 84 88 19 24 25 28 29 36 67 72 70 71 74 75 77 80 30 35 36 38 37 38 39 37 82 89 90 92 94 91 91 67 74 77 78 81 84 82 86 27 34 35 32 33 35 38 45 20 27 30 30 33 71 78 81 82 82 79 54 60 60 63 64 64 31 37 38 40 40 44 66 71 73 73 78 32 37 39 41 43 47 50 50 55 56 60 62 60 69 76 80 81 84 84 52 59 63 64 68 53 59 60 64 71 72 78 80 86 87 89 92 28 33 36 38 44 46 45 34 40 43 44 47 52 52 2 9 11 17 20 24 32 39 46 47 50 55 41 38 35 34 32 31 28 29 84 81 80 78 77 77 56 54 51 49 48 47 43 65 62 60 59 56 53 46 35 34 31 34 32 29 27 25 41 40 39 42 45 63 60 57 56 59 58 58 68 67 66 63 66 64 62 58 94 91 90 93 91 90 83 60 58 56 56 54 52 51 49 85 82 82 79 77 76 75 76 70 68 66 66 65 62 62 56 53 50 50 46 48 47 46 43 42 42 41 35 68 67 66 65 61 59 65 62 59 58 56 55 51 53 76 74 73 70 69 65 65 29 28 27 23 20 19 15 88 86 82 81 79 78 76 71 78 75 70 67 65 63 22 20 14 13 15 80 79 77 72 72 39 38 36 33 26 23 19 69 68 66 59 56 53 51 45 55 56 55 53 51 50 38 41 38 35 34 37 70 73 71 68 66 66 57 60 58 56 52 39 40 37 34 28 6 9 7 6 4 7 5 3 82 85 84 87 90 13 14 15 14 12 12 97 98 96 98 94 21 24 26 23 21 16 39 41 41 39 38 36 85 87 87 84 82 79 82 80 81 81 79 77 77 67 69 68 65 65 61 80 82 82 80 77 74 67 89 92 89 85 82 49 50 49 45 47 59 62 58 57 55 53 52 52 32 35 31 30 26 39 41 39 38 37 35 31 24 29 30 29 24 23 21 19 17 13 14 12 7 8 31 33 31 30 23 22 19 19 24 26 21 18 16 12 37 39 38 33 32 31 25 91 91 90 89 86 83 80 56 56 55 53 55 84 84 83 81 79 79 38 38 35 33 31 28 25 21 35 35 32 31 29 28 25 19 23 23 22 23 21 20 17 16 22 22 19 21 24 9 9 10 9 7 7 82 82 79 81 79 75 29 29 30 29 23 16 16 15 15 12 10 32 32 29 27 25 25 26 23 23 20 20 20 98 98 97 96 93 93 89 60 60 57 57 55 53 48 72 72 69 65 62 61 58 57 57 57 54 53 49 51 59 59 57 53 51 51 77 77 73 71 67 20 20 18 14 13 7 20 20 13 11 10 8 74 74 71 70 69 68 62 63 38 38 33 31 28 26 23 23 91 91 90 84 80 86 86 83 82 80 78 71 64 94 90 88 85 84 81 61 57 56 55 52 50 48 51 31 27 25 22 19 19 79 75 73 70 68 65 61 87 83 81 78 75 70 23 19 16 14 13 16 14 11 9 5 7 4 7 88 84 82 84 84 21 17 15 14 17 14 11 7 60 56 55 54 55 53 51 45 57 53 53 50 48 47 46 66 62 60 57 54 51 51 54 74 70 69 67 66 66 64 64 31 27 24 21 21 20 17 13 38 34 31 28 28 21 86 82 81 78 76 72 69 21 17 14 12 11 7 10 17 13 11 7 7 36 32 31 28 24 22 20 16 41 37 33 31 28 27 20 36 32 31 25 22 21 69 65 62 56 59 47 43 42 37 35 32 32 52 48 46 44 39 36 32 98 94 93 86 84 78 75 69 68 66 65 62 60 58 74 68 66 63 62 65 36 29 26 25 24 23 23 74 69 68 65 63 60 58 54 75 70 67 65 63 61 54 43 38 39 36 33 30 31 25 22 19 20 19 21 13 8 5 6 4 4 19 14 12 15 14 10 37 31 33 30 27 21 93 88 88 86 83 19 13 13 11 10 11 79 74 74 71 71 45 39 39 38 35 34 31 27 52 47 45 42 42 40 33 54 47 44 41 40 36 35 33 18 13 11 8 4 2 5 83 78 74 73 70 70 16 10 9 5 1 35 30 26 25 24 19 63 57 55 50 47 44 42 20 15 8 7 5 7 68 61 56 54 54 80 75 69 67 65 61 35 30 29 27 24 18 13 60 61 63 64 67 64 20 23 25 27 28 28 62 63 65 67 70 72 76 83 86 89 92 93 99 14 16 17 16 18 21 23 7 8 11 8 10 7 40 43 40 43 45 45 76 79 78 79 82 85 88 92 40 43 45 44 47 50 52 58 69 72 73 74 77 79 79 80 11 13 15 15 16 15 2 3 3 5 8 11 11 64 67 68 68 72 48 51 54 54 60 1 2 6 9 10 13 79 80 82 86 88 89 86 22 23 27 30 33 36 36 73 76 78 82 86 9 11 13 17 18 23 55 58 59 61 68 71 5 8 11 18 17 22 25 27 28 29 35 35 60 63 64 67 74 77 81 66 67 73 75 78 84 62 60 62 63 66 23 20 21 23 24 21 38 37 38 40 42 42 9 7 8 9 12 16 79 78 80 82 84 85 88 95 13 12 14 11 14 60 57 60 59 61 58 11 10 11 8 8 7 6 9 11 8 12 25 23 24 25 23 30 3 2 3 3 4 5 65 63 66 68 71 74 74 72 51 50 50 51 53 53 67 66 69 72 72 76 67 64 66 66 69 74 74 71 74 76 79 83 84 76 75 77 81 82 79 43 42 46 49 50 50 19 17 19 21 24 26 30 34 33 31 33 37 40 41 43 49 22 19 20 25 27 30 62 60 66 69 66 55 53 58 59 61 63 66 66 19 16 21 22 25 29 31 29 31 36 38 43 24 24 25 26 29 32 35 16 16 19 20 18 42 42 43 46 46 86 86 89 92 96 56 56 57 60 65 62 62 59 61 64 75 75 77 80 77 80 83 82 31 31 33 32 32 60 60 62 63 65 62 66 5 5 7 6 8 9 14 41 41 44 46 46 49 52 55 12 12 14 16 16 19 20 18 23 23 24 24 25 26 27 27 3 3 3 5 7 11 83 83 84 84 86 91 62 62 66 67 68 39 39 41 43 46 48 52 50 28 28 31 32 34 38 38 11 11 15 17 21 77 77 81 82 83 85 90 49 49 52 59 62 64 67 70 32 32 37 39 38 80 80 85 86 88 88 7 7 10 16 20 33 33 36 38 40 46 51 68 72 75 77 80 83 84 87 58 62 63 66 67 66 7 11 13 16 17 17 17 21 23 24 25 26 30 53 57 60 63 70 27 31 30 32 33 35 26 30 31 33 30 27 16 20 21 22 21 24 25 25 21 25 26 29 32 31 35 66 70 67 69 70 72 74 80 17 21 21 23 25 27 29 57 61 64 67 67 68 67 87 91 93 94 94 97 97 76 80 82 82 83 84 87 91 19 23 24 27 27 32 34 38 40 44 47 6 10 13 14 17 20 24 21 48 52 53 57 59 59 79 83 87 89 93 73 77 79 82 84 88 93 41 45 48 50 52 57 58 59 49 53 58 60 61 58 8 12 17 18 20 20 2 6 7 10 12 14 20 24 75 79 85 87 88 90 93 99 60 67 70 73 76 78 80 61 67 68 69 68 63 69 70 73 73 42 48 51 52 54 56 60 71 78 79 81 88 79 86 89 91 94 93 95 96 48 55 52 54 56 59 58 32 38 41 43 46 43 43 54 61 62 60 63 67 83 89 90 92 93 92 98 34 41 43 43 45 47 44 49 49 51 48 36 43 44 44 44 54 61 64 67 67 71 21 28 31 31 34 40 3 8 12 15 18 19 54 59 60 61 65 63 20 25 29 30 30 61 67 70 72 76 79 80 84 56 63 66 67 71 72 75 80 12 19 26 28 29 31 42 49 51 53 58 56 22 29 30 36 36 64 71 74 76 81 85 65 72 79 82 87 60 58 56 53 51 52 26 23 22 20 18 17 17 50 48 46 43 41 40 36 99 96 95 92 86 23 21 19 20 19 17 14 13 82 79 78 75 73 71 74 76 85 83 84 81 81 79 77 75 73 71 72 68 63 62 64 63 60 58 51 16 13 11 8 5 5 4 1 22 20 17 16 16 15 13 16 54 51 48 48 48 92 91 91 88 84 22 19 17 16 13 13 11 4 47 45 42 40 39 36 32 29 55 53 49 48 46 43 45 32 30 28 27 23 20 20 87 85 81 80 79 76 75 71 78 75 71 68 67 66 59 18 17 14 12 9 4 1 44 43 40 38 33 36 76 74 72 66 64 64 17 15 12 7 5 1 31 30 27 21 18 16 11 12 15 12 11 8 7 5 4 40 42 40 39 37 34 31 32 64 67 65 63 60 59 58 58 12 14 12 11 8 7 3 38 39 37 34 32 31 30 23 91 94 93 96 94 91 96 97 99 98 96 95 96 69 71 68 67 69 68 68 89 90 93 90 86 30 31 28 30 25 85 87 84 84 81 40 42 42 41 43 95 98 96 96 93 93 68 71 71 68 66 64 61 57 53 55 55 52 50 44 58 59 56 55 51 49 46 85 88 84 83 84 73 75 73 69 68 65 65 11 13 10 6 2 65 66 64 60 55 46 48 43 41 38 11 12 7 6 3 5 39 40 39 34 34 94 96 91 90 87 86 82 78 81 78 76 69 67 65 59 99 99 96 93 91 86 86 85 82 85 60 60 58 56 55 53 53 97 97 94 91 88 84 57 57 54 52 50 48 46 41 48 48 50 49 46 96 96 95 97 95 92 94 82 82 81 80 81 81 61 61 58 61 57 47 47 44 45 42 39 34 17 17 15 12 12 9 8 73 73 71 69 69 66 65 68 51 51 48 46 46 43 41 41 34 34 31 28 28 25 21 53 53 52 50 50 47 46 41 73 73 69 68 65 63 81 81 77 75 72 74 41 41 39 37 36 35 31 31 89 89 88 87 84 80 76 56 56 54 51 48 46 42 37 22 22 20 19 12 9 6 3 11 11 5 4 7 92 92 89 88 87 86 81 81 48 48 42 41 40 37 36 32 34 34 31 24 17 34 30 28 26 24 23 22 92 88 87 86 85 82 85 93 89 87 84 83 81 81 62 58 57 56 52 47 43 42 39 36 31 90 86 83 84 83 34 30 29 26 23 24 25 73 69 72 69 67 66 66 44 40 39 42 38 93 89 87 86 88 82 57 53 51 51 49 46 44 83 79 78 78 77 74 75 48 44 43 42 40 40 37 37 24 20 20 19 16 12 63 59 56 56 53 48 39 35 34 31 28 24 23 48 44 40 37 34 33 32 33 72 68 64 63 62 62 84 80 76 74 72 70 66 76 72 71 68 67 63 60 53 47 43 42 41 36 35 33 32 63 59 58 57 51 48 47 50 34 30 23 22 22 81 77 75 73 72 71 64 60 92 88 81 78 75 69 51 45 44 43 42 39 36 49 44 43 40 38 40 83 77 75 72 72 37 30 27 24 21 17 94 87 86 83 82 81 80 75 95 90 93 91 88 87 85 82 39 33 30 27 29 30 62 56 59 57 54 51 48 48 59 53 55 53 49 29 22 20 19 18 17 19 14 69 63 62 62 61 59 57 29 24 21 21 18 21 88 82 81 80 79 79 77 77 58 51 50 50 46 85 80 78 78 75 69 66 61 60 56 53 52 49 47 20 13 10 6 4 3 5 16 10 8 7 3 2 2 72 65 61 58 57 55 51 58 52 48 46 44 42 39 32 62 55 49 48 46 43 93 86 83 81 80 74 76 77 70 68 61 61 50 45 43 37 36 35 33 29 41 36 33 26 21 52 55 60 62 63 63 68 66 66 65 64 62 62 19 20 18 14 12 71 75 78 80 80 82 89 1 8 13 14 18 78 83 84 85 86 88 86 85 83 80 76 73 72 72 32 31 35 37 39 37 71 72 71 70 68 61 14 18 21 21 23 26 29 32 54 60 62 65 63 69 74 72 69 71 75 12 9 12 15 17 18 15 54 61 66 69 72 74 74 41 46 47 49 51 55 77 71 74 71 68 65 59 43 43 42 42 41 39 40 68 61 60 57 56 49 48 45 13 13 15 16 14 85 87 88 88 90 92 98 14 11 8 8 6 50 50 47 44 40 37 36 31 79 80 82 83 85 86 87 91 39 46 49 49 53 3 10 13 15 16 16 15 45 41 40 37 37 22 20 22 19 21 19 17 17 15 16 18 19 26 68 65 72 75 74 51 55 58 61 61 62 65 62 36 36 33 30 29 28 26 19 15 20 19 21 23 25 26 29 43 41 39 37 40 43 69 66 66 68 69 69 63 63 62 59 56 55 15 19 21 23 25 28 32 52 55 53 46 44 40 25 19 17 13 12 11 6 8 10 11 14 19 21 19 52 48 46 43 39 30 30 29 27 23 43 45 42 41 37 36 36 20 20 27 30 33 35 88 89 94 95 98 72 73 69 66 59 57 64 67 69 74 76 82 79 76 77 76 73 71 64 96 98 96 95 94 92 92 92 92 94 91 88 86 82 85 97 93 93 92 89 88 85 83 18 22 25 29 32 33 36 38 38 34 34 32 35 37 38 37 36 35 32 30 30 67 68 71 71 73 76 44 43 43 42 45 47 49 48 46 42 38 27 23 20 16 9 7 9 8 10 3 92 85 82 81 78 74 72 73 24 20 23 20 19 15 87 87 84 83 80 77 70 70 55 58 58 56 52 69 76 77 80 86 56 59 65 68 72 87 83 82 78 77 73 68 73 75 79 80 83 82 55 51 51 48 42 12 17 20 19 20 21 22 19 92 95 98 99 97 97 34 30 27 24 25 23 22 20 23 27 27 28 28 52 50 50 48 44 75 73 71 64 61 69 69 63 61 57 20 20 21 22 26 29 25 27 29 29 32 35 38 36 28 32 34 35 36 43 45 41 41 42 47 47 44 41 43 48 50 71 71 74 75 78 82 86 16 16 16 14 12 12 7 8 11 14 14 18 26 30 32 34 36 36 62 63 61 54 52 53 65 71 72 75 72 75 75 54 58 62 64 70 35 35 38 39 43 45 50 78 82 83 87 88 92 32 32 35 32 30 52 49 51 54 56 28 28 31 29 27 27 2 2 5 6 7 14 18 75 75 78 82 79 64 61 59 56 54 52 49 48 55 53 50 49 47 46 45 44 55 53 51 48 46 45 42 65 67 70 72 74 75 88 91 92 93 95 97 98 99 96 95 93 92 91 1 3 6 9 11 73 72 70 68 66 64 40 42 45 46 49 56 57 59 60 62 65 67 64 62 60 59 57 54 51 49 23 22 21 18 15 14 12 8 10 12 14 17 20 21 20 18 15 13 10 9 26 28 29 32 33 36 39 21 20 17 15 14 11 10 32 30 29 27 25 24 27 30 32 34 37 39 29 31 33 35 37 39 42 45 41 44 46 47 50 51 52 55 19 18 16 15 13 56 55 52 49 47 62 64 65 68 70 71 72 73 63 64 66 69 72 41 39 38 36 35 9 12 15 17 19 21 18 21 24 26 27 28 81 82 84 87 88 91 92 93 31 34 36 37 40 41 42 45 31 29 27 25 23 20 19 67 70 72 74 75 76 65 63 60 57 54 52 51 38 35 34 33 30 29 27 60 61 62 64 66 68 69 75 74 71 69 67 37 35 34 33 32 37 38 40 42 45 48 50 76 77 80 82 84 58 61 63 64 65 67 69 83 80 78 76 75 11 8 7 6 3 2 55 58 59 61 63 65 66 69 77 79 80 81 83 28 30 33 34 35 36 39 78 76 74 72 71 85 88 90 91 94 46 44 41 40 38 36 33 32 35 37 40 41 43 46 49 37 38 41 42 43 30 33 34 36 37 39 40 41 35 32 29 26 23 22 85 86 87 89 90 93 95 82 83 84 86 88 90 25 24 22 21 19 17 74 71 68 67 66 63 27 29 30 31 32 34 35 37 16 19 21 23 26 28 31 76 77 79 80 83 86 84 82 80 78 31 32 35 37 39 41 43 45 95 92 90 87 84 81 79 77 34 31 28 27 26 23 20 18 9 8 5 3 1 55 52 51 50 47 44 41 39 10 12 15 18 19 21 20 17 16 13 10 50 53 56 58 61 63 66 69 96 95 94 91 88 87 71 69 67 65 64 28 29 31 33 35 13 15 18 19 22 71 68 66 63 62 61 58 57 54 51 50 47 45 44 42 84 81 79 77 76 73 71 69 40 43 44 46 48 17 20 22 24 25 26 31 33 36 38 41 44 47 49 13 16 19 20 22 25 28 30 71 69 68 67 65 63 49 52 54 57 60 63 66 63 61 59 57 56 55 87 90 93 96 97 98 75 77 78 80 82 85 19 20 22 24 27 42 43 46 47 49 52 9 6 5 3 2 1 77 74 71 68 65 64 63 62 15 13 12 10 7 20 18 15 14 12 11 9 68 66 64 61 60 58 3 5 8 11 12 14 16 26 24 23 20 17 15 13 49 51 53 54 57 58 15 16 19 21 23 25 26 29 44 47 48 51 52 54 55 56 72 74 76 77 79 80 83 13 12 10 8 7 4 3 5 7 9 11 12 65 62 60 57 54 52 50 47 43 45 46 49 50 51 53 56 88 90 92 94 96 70 71 74 77 78 81 82 11 10 9 6 3 2 51 53 56 59 61 62 64 66 24 25 27 30 33 18 15 14 12 11 10 8 6 31 34 35 36 39 42 43 46 82 85 88 89 91 94 95 67 69 72 73 74 5 8 10 11 12 13 45 43 40 37 36 34 33 50 52 53 54 55 13 12 11 8 7 5 24 26 29 32 35 37 40 37 34 31 28 41 44 47 50 51 49 52 55 58 60 62 63 57 56 54 53 52 50 49 10 7 4 3 2 14 11 9 8 6 4 3 44 42 39 37 36 34 51 53 54 57 58 60 62 53 52 50 48 46 44 43 41 46 44 43 42 40 68 65 63 62 59 57 55 49 51 52 54 56 57 52 50 48 47 45 44 41 73 72 69 66 65 79 82 84 87 89 91 94 39 41 42 44 45 46 49 50 85 82 79 77 76 47 45 42 41 40 39 36 34 35 33 32 30 29 28 27 66 69 70 72 73 74 76 77 29 26 25 23 21 87 86 83 82 80 77 74 71 51 54 57 60 61 63 66 95 94 91 89 87 84 82 80 66 64 61 59 56 54 51 48 49 51 54 56 58 34 36 37 38 39 41 20 23 25 28 29 30 32 34 36 34 32 29 27 26 25 22 27 24 22 21 18 15 12 54 55 56 58 60 62 63 65 88 87 84 82 79 76 73 49 51 54 57 59 60 62 65 64 61 58 57 55 52 18 19 20 22 24 27 30 44 42 39 36 33 80 81 83 85 88 89 90 72 70 67 64 62 60 45 47 50 52 54 57 59 62 19 22 23 26 29 30 33 34 69 71 72 75 76 77 80 36 33 31 30 29 28 26 25 19 16 13 11 9 7 34 32 30 27 24 23 23 20 18 17 14 11 90 91 94 95 98 24 23 21 20 17 14 4 7 9 11 14 17 9 10 12 13 15 18 52 50 49 47 44 42 39 20 23 24 26 27 28 29 31 68 65 62 59 56 54 53 52 76 73 70 67 64 61 59 99 98 97 94 93 92 90 89 32 29 26 25 24 79 81 83 86 89 90 93 95 50 48 46 45 43 41 38 38 39 41 43 46 48 4 6 8 10 13 14 20 17 16 15 12 10 8 35 32 31 30 27 24 71 68 66 63 61 60 57 69 72 74 77 79 46 49 52 55 57 59 62 24 22 21 19 18 31 29 28 26 24 58 60 61 64 66 76 75 74 73 72 69 67 64 36 39 41 42 43 46 47 50 14 11 9 7 6 3 2 3 4 5 8 10 73 72 69 67 65 63 61 59 31 29 27 25 22 21 19 67 65 62 60 59 57 55 32 35 37 38 39 24 23 20 17 16 15 13 12 60 61 62 65 66 51 52 54 55 58 75 72 70 68 66 64 62 22 25 26 27 28 30 32 35 95 94 91 88 86 84 55 57 59 60 63 64 70 69 68 66 63 62 21 22 25 26 28 31 33 11 14 17 19 22 23 26 72 75 77 79 80 82 85 32 29 26 24 23 38 39 40 41 42 43 46 49 26 24 21 20 17 16 14 13 65 64 63 62 60 72 69 68 67 64 63 62 32 34 37 38 41 15 12 11 8 7 6 4 3 26 28 31 33 34 36 38 41 75 76 79 81 84 85 86 69 72 75 76 79 81 84 51 53 54 56 59 61 88 91 93 95 97 98 57 56 53 51 49 62 59 57 56 53 51 50 47 84 87 89 90 91 94 69 72 74 77 78 80 81 15 17 19 22 23 25 26 6 8 11 12 13 16 44 42 40 39 37 35 34 3 6 9 10 11 12 20 19 18 17 14 11 10 9 26 23 21 19 16 90 91 93 94 97 74 72 70 68 67 65 63 61 60 57 54 52 69 66 65 63 62 30 29 27 26 23 20 18 27 28 31 32 35 51 52 53 56 59 62 65 68 85 82 81 80 78 77 74 73 37 34 33 32 30 29 28 86 87 88 91 92 95 96 72 71 69 68 66 64 43 46 47 49 52 53 56 59 87 84 83 81 78 76 75 73 2 5 8 10 13 16 19 22 75 74 71 69 67 64 61 58 62 63 66 69 71 23 21 18 16 13 75 72 71 68 66 63 61 58 61 58 55 52 50 48 45 13 10 7 5 2 1 81 82 83 84 86 89 92 94 46 43 42 41 38 37 18 16 15 14 11 9 35 33 31 30 29 7 9 10 11 13 15 33 35 38 41 42 45 46 49 85 87 88 90 92 71 68 66 65 64 21 23 25 28 29 32 33 35 28 25 23 22 20 17 16 15 12 11 8 6 5 4 97 96 93 92 89 86 85 82 28 26 23 22 21 20 18 15 44 45 46 47 48 45 43 42 40 39 38 37 39 40 41 44 47 49 58 57 56 54 52 75 76 77 78 79 82 85 57 60 62 65 68 22 23 24 26 28 30 32 35 51 52 53 55 57 58 60 63 57 54 51 48 45 42 41 39 84 83 82 81 78 75 74 73 99 98 95 93 92 90 42 39 36 33 31 29 27 94 92 89 87 84 81 80 79 23 26 28 30 31 32 33 34 24 23 22 19 18 16 14 11 64 62 61 58 56 53 51 35 38 40 42 43 43 46 47 48 50 53 55 58 59 57 56 54 53 51 40 42 43 45 48 50 53 97 96 94 92 89 87 74 72 69 66 63 64 66 68 69 72 75 78 81 41 44 45 46 48 50 53 55 54 53 51 49 47 44 43 40 20 18 17 14 12 11 10 9 8 5 4 1 74 73 71 70 67 66 26 24 23 21 19 16 15 86 87 90 92 94 87 84 82 79 78 8 6 4 2 1 57 60 61 64 67 19 22 24 26 28 2 5 8 11 14 15 18 77 74 71 68 66 2 3 4 5 6 9 12 14 92 90 88 86 84 81 79 12 9 7 6 5 9 12 13 14 16 58 60 61 64 66 68 69 72 84 86 87 89 90 83 85 88 89 90 93 95 89 86 84 81 80 77 80 83 84 85 87 65 62 60 57 56 70 68 67 64 62 59 56 54 51 49 47 44 42 40 37 16 15 13 11 8 66 65 62 60 58 56 71 70 69 66 64 61 55 57 59 60 62 7 9 12 15 18 52 50 47 44 41 38 36 34 11 14 17 19 21 27 25 22 21 19 17 15 14 68 65 63 60 57 55 54 58 57 56 53 51 50 62 60 58 57 55 52 53 56 57 58 59 60 67 70 71 72 74 76 77 79 79 76 73 72 69 67 65 12 15 16 19 21 24 26 69 66 64 63 61 50 48 47 45 44 42 40 38 21 19 17 15 12 11 32 30 27 26 25 23 21 19 37 35 32 30 29 27 41 43 46 49 51 52 53 55 20 23 25 27 30 32 87 85 84 82 80 78 75 74 26 28 30 31 34 37 39 42 82 81 80 77 75 35 33 30 27 25 24 21 20 45 46 49 50 53 59 57 55 52 49 48 47 92 89 87 86 83 80 77 75 94 91 88 86 85 83 50 49 47 45 42 39 38 36 65 62 60 57 55 54 52 63 64 65 68 70 72 73 76 27 24 22 20 17 14 13 28 25 23 21 20 28 31 34 35 38 41 44 46 44 46 48 51 53 54 57 60 24 21 19 18 15 13 67 65 62 60 57 10 8 7 4 2 50 49 47 45 44 62 64 67 70 71 72 64 67 69 72 73 75 77 23 26 27 28 29 32 30 27 24 23 21 18 16 87 90 91 92 93 94 96 5 7 10 13 15 38 35 32 30 28 27 26 74 77 79 80 82 66 64 63 60 57 56 55 87 84 83 82 81 78 77 85 87 90 93 95 96 98 20 22 25 27 29 31 40 38 35 32 31 30 29 27 14 11 9 6 3 87 85 83 80 77 74 73 70 95 92 91 88 85 83 82 79 41 42 44 45 46 48 51 53 40 39 36 33 32 31 29 27 26 23 22 21 89 87 86 83 82 80 77 66 63 62 61 60 29 27 26 23 21 18 24 26 29 31 32 34 37 39 29 31 33 36 38 39 42 43 15 18 19 22 25 28 31 32 16 17 20 22 23 25 27 30 33 30 29 26 23 21 57 59 62 63 65 17 14 13 12 10 7 4 40 37 36 33 31 28 25 24 70 69 67 66 63 61 47 48 51 52 55 10 9 6 4 2 63 65 66 69 72 74 77 80 30 29 26 23 20 17 16 14 91 88 85 84 81 78 75 72 80 78 76 74 72 94 96 97 98 99 35 33 32 29 27 26 24 11 14 17 19 20 22 25 28 58 60 63 64 66 67 83 80 78 76 75 73 54 52 49 48 47 45 57 56 54 52 51 49 47 58 60 62 65 68 46 44 41 39 37 16 17 18 19 20 77 78 79 82 85 49 47 44 43 41 93 94 95 97 98 87 86 83 81 80 78 77 76 50 51 53 55 58 97 94 91 88 87 86 2 5 8 11 13 14 15 20 21 23 26 28 95 94 91 89 87 86 84 25 22 20 18 17 14 12 70 67 65 62 59 57 56 71 72 75 76 79 81 82 15 18 21 22 25 27 39 41 42 43 46 48 51 46 48 51 52 53 55 35 38 40 43 45 56 58 60 61 63 66 69 37 35 33 32 31 29 26 40 43 44 47 49 51 64 62 61 58 56" @input_test "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" defp parse_reports(input) do String.split(input, "\n") |> Enum.map(fn report -> String.split(report) |> Enum.map(fn level -> String.to_integer(level) end) end) end def part1() do parse_reports(@input) |> Enum.map(fn report -> is_safe?(report) end) |> Enum.filter(fn result -> result == true end) |> length() end defp is_safe?(report) do difference_is_within_limits?(report) and (is_ascending_order?(report) or is_descending_order?(report)) end defp is_ascending_order?(report) do Enum.with_index(report) |> Enum.reduce(true, fn {level, index}, acc -> case index == length(report) - 1 do true -> acc false -> acc and level < Enum.at(report, index + 1) end end) end defp is_descending_order?(report) do Enum.with_index(report) |> Enum.reduce(true, fn {level, index}, acc -> case index == length(report) - 1 do true -> acc false -> acc and level > Enum.at(report, index + 1) end end) end defp difference_is_within_limits?(report) do Enum.with_index(report) |> Enum.reduce(true, fn {level, index}, acc -> case index == length(report) - 1 do true -> acc false -> difference = abs(level - Enum.at(report, index + 1)) acc and difference >= 1 and difference <= 3 end end) end def part2() do reports = parse_reports(@input) first_round = reports |> Enum.map(fn report -> is_safe?(report) end) safe_results = Enum.filter(first_round, fn result -> result == true end) |> length() potentially_safe_results = Enum.map(reports, fn report -> case is_safe?(report) do true -> nil false -> Enum.with_index(report) |> Enum.reduce(false, fn {_level, index}, acc -> case acc do true -> true false -> List.delete_at(report, index) |> is_safe?() end end) end end) |> Enum.filter(fn result -> result == true end) |> length() safe_results + potentially_safe_results end end