From 8bee4a93b13ddb4f37037d1699b982055417a3a8 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Fri, 3 Dec 2021 00:32:07 -0500 Subject: [PATCH] Day 4 --- input/day4.txt | 601 +++++++++++++++++++++++++++++++++++++++++++++++++ src/day4.rs | 121 ++++++++++ src/main.rs | 3 +- 3 files changed, 724 insertions(+), 1 deletion(-) create mode 100644 input/day4.txt create mode 100644 src/day4.rs diff --git a/input/day4.txt b/input/day4.txt new file mode 100644 index 0000000..5338ded --- /dev/null +++ b/input/day4.txt @@ -0,0 +1,601 @@ +63,23,2,65,55,94,38,20,22,39,5,98,9,60,80,45,99,68,12,3,6,34,64,10,70,69,95,96,83,81,32,30,42,73,52,48,92,28,37,35,54,7,50,21,74,36,91,97,13,71,86,53,46,58,76,77,14,88,78,1,33,51,89,26,27,31,82,44,61,62,75,66,11,93,49,43,85,0,87,40,24,29,15,59,16,67,19,72,57,41,8,79,56,4,18,17,84,90,47,25 + +25 29 78 57 69 +47 51 7 21 82 +61 81 99 53 30 +50 80 41 94 46 + 9 37 48 71 91 + +26 10 29 27 90 +21 65 44 5 1 +42 51 35 11 98 +72 23 41 95 48 +40 97 99 92 2 + +20 70 21 58 5 +63 29 16 71 45 +43 7 26 0 62 +24 75 9 87 55 +88 10 11 47 4 + + 5 31 99 96 16 +61 37 91 92 23 +46 8 36 9 42 + 3 32 49 64 48 +15 2 47 53 55 + +28 40 96 38 9 +33 11 65 76 13 +24 35 20 3 99 +95 78 51 74 4 +80 14 44 98 58 + +24 55 8 59 65 +96 11 15 12 99 +21 75 35 85 34 +20 53 72 50 70 +61 48 74 41 36 + +61 32 13 42 90 +81 22 66 75 51 +46 1 41 9 34 +86 50 48 64 74 +72 85 97 11 71 + +16 32 41 37 61 +14 31 29 6 79 +28 97 11 15 9 +13 72 3 85 64 +81 95 20 77 69 + +42 76 14 78 35 +49 89 7 81 90 +13 18 32 24 9 +10 98 12 2 65 +82 21 67 70 84 + +89 38 21 83 5 + 7 87 37 14 98 +55 81 13 56 39 +42 19 51 36 30 +76 15 57 94 20 + +29 18 49 10 67 +91 93 37 45 34 +60 8 56 86 32 +95 89 71 51 59 +87 3 27 44 41 + + 9 71 95 12 42 +83 90 98 79 49 +72 1 53 80 33 +29 82 65 4 25 +92 5 76 54 66 + +72 85 4 39 29 +86 0 95 30 21 +11 51 2 99 38 +58 52 25 59 77 +69 74 37 87 32 + +99 16 9 63 55 +79 50 48 96 92 +47 35 15 93 76 +19 70 25 49 38 +80 60 43 69 81 + +50 19 10 7 83 +79 52 14 51 55 +68 65 54 21 62 +71 25 34 70 92 +44 26 61 4 46 + +75 26 15 76 61 +42 0 51 29 81 +82 57 16 91 4 +12 19 30 10 24 +78 58 55 74 53 + +36 80 46 9 85 +34 17 43 96 57 +37 6 33 88 28 +59 48 18 22 79 +55 52 20 2 61 + + 3 99 46 7 31 +61 43 17 78 4 +59 45 47 52 10 +55 95 33 9 35 +13 8 89 73 12 + +19 58 46 56 62 +11 72 82 0 12 +92 9 70 18 65 +35 61 79 87 36 + 1 27 22 8 74 + +60 92 94 2 84 +73 69 72 29 37 +50 74 56 58 6 +51 80 86 33 4 +32 24 20 7 78 + +47 25 76 89 61 +86 77 71 43 22 +42 18 70 24 98 +31 68 62 79 9 +17 10 78 16 84 + +90 41 71 1 58 +88 91 86 4 34 +48 31 3 74 21 +85 5 37 36 28 +18 46 17 49 69 + +41 55 52 58 44 + 4 75 81 12 48 +72 93 8 86 10 +66 29 94 85 69 +74 36 50 9 19 + +80 76 36 21 57 +58 8 27 18 86 +79 5 48 82 64 + 0 93 30 1 4 +78 40 52 50 62 + +58 60 77 25 22 +93 97 49 2 41 +59 38 95 36 44 +30 79 69 54 86 +23 4 80 85 27 + +27 67 68 46 41 +93 4 96 49 23 +11 54 80 88 75 +69 34 44 12 37 +39 78 66 5 43 + +20 32 71 99 19 +42 96 58 47 65 +72 31 70 59 26 +46 17 38 11 23 +18 85 52 77 67 + +38 98 42 31 40 +76 2 77 82 34 +92 73 55 93 19 +25 58 90 10 68 + 6 56 85 43 95 + +16 71 12 76 86 +78 26 15 34 45 +17 22 20 8 1 +51 52 24 90 79 +53 40 14 69 21 + +77 75 68 32 69 +61 9 74 58 44 +21 39 94 84 46 +14 29 93 31 63 +12 72 2 98 40 + +68 32 38 58 24 +61 11 76 55 39 + 6 21 31 93 99 +64 75 15 62 56 +34 12 14 73 77 + +50 24 71 22 67 +18 80 89 51 90 +54 64 31 19 44 +61 88 85 25 98 +73 69 37 72 39 + +79 2 62 91 97 +36 41 72 28 42 +26 89 98 86 10 +35 16 85 63 64 +43 51 39 60 55 + +47 86 44 56 74 + 0 96 39 84 54 +38 45 68 88 21 +11 33 17 52 97 +83 58 42 65 81 + +16 1 22 8 24 + 7 3 12 30 59 +79 91 53 69 68 +20 88 14 81 51 +89 71 54 56 52 + +25 12 32 53 3 +63 29 92 70 97 +54 6 21 4 86 +76 39 84 49 96 +68 0 15 72 28 + +56 20 35 71 23 +51 21 96 42 64 +83 1 8 94 55 +44 73 76 24 67 +81 70 6 61 46 + +85 37 30 39 97 +36 14 71 59 15 +46 26 27 25 9 + 6 56 79 52 67 +72 54 58 74 76 + +90 24 86 43 1 +18 70 89 20 9 +44 4 52 65 66 +56 17 96 78 67 +53 80 32 42 63 + +35 50 95 53 16 +75 1 85 31 81 +99 22 27 84 38 +98 8 19 25 92 +56 59 62 48 54 + + 8 22 67 70 91 +73 51 96 49 37 +31 4 99 52 27 +13 50 39 1 85 +19 9 40 55 47 + +59 35 52 60 91 +75 86 13 39 21 +33 99 11 64 50 +37 58 71 22 54 + 6 72 88 3 85 + +85 63 5 48 20 +96 55 53 35 60 + 0 17 26 22 13 +25 45 62 4 41 +78 40 46 95 33 + +23 53 82 22 74 + 5 45 15 44 65 +62 84 68 83 88 +52 46 61 77 59 +56 60 71 2 43 + +27 77 28 8 84 +33 0 22 62 40 + 3 44 19 53 91 +60 83 75 48 94 +29 93 23 82 65 + +77 34 72 62 4 + 9 8 76 52 60 +37 54 98 20 22 +11 13 86 48 57 +10 63 41 23 61 + +58 57 47 55 3 +38 11 39 15 9 + 5 65 92 98 41 +72 45 6 16 83 +74 40 99 50 30 + +72 46 35 9 53 +70 67 74 93 55 +24 4 30 38 47 +29 96 51 17 71 +90 5 69 54 61 + +90 59 93 99 34 +85 39 52 16 20 +32 66 75 35 17 +38 33 84 40 89 +91 77 26 86 54 + + 2 87 96 34 28 +98 74 56 17 37 +10 62 71 89 95 + 6 90 5 99 92 +39 73 55 18 8 + +87 44 72 2 45 +82 78 32 64 37 +46 75 95 67 80 + 8 60 57 97 56 +22 43 92 26 96 + +98 1 21 17 14 +85 6 33 69 16 +53 82 0 41 73 +46 72 2 35 23 +89 94 80 76 42 + +27 94 98 5 95 +64 19 77 15 92 +11 52 41 50 51 + 4 57 99 21 29 +20 35 78 34 87 + +52 83 84 21 59 +30 64 85 90 91 +24 32 57 0 81 +17 47 1 25 27 +10 51 65 79 34 + +83 9 94 14 85 +65 51 28 32 48 +81 71 8 12 31 +38 50 92 57 47 +34 49 56 73 27 + +54 8 72 38 29 +34 78 69 16 30 +82 24 9 0 13 +90 41 60 28 12 +71 22 70 80 66 + +71 50 24 86 21 +14 92 45 30 95 +57 60 0 88 91 +87 97 6 7 26 +61 98 25 5 84 + + 1 63 45 36 67 +27 16 54 72 41 +32 74 53 9 35 +95 29 90 19 26 +82 97 11 42 28 + + 2 93 86 28 43 +90 12 21 56 76 +98 30 25 9 75 +11 20 45 95 50 +22 31 39 49 6 + + 2 53 74 9 64 +24 8 85 86 59 +41 38 57 63 32 +88 93 14 11 55 +69 31 25 66 52 + +10 60 42 16 95 + 8 14 81 84 5 +98 32 68 12 6 +83 66 90 69 46 +54 40 59 73 91 + +24 66 62 30 83 +72 80 54 25 17 + 3 77 60 68 36 +26 22 8 74 95 +63 39 4 53 87 + +49 96 48 2 78 +14 21 38 98 45 +30 34 54 16 92 + 0 89 70 68 57 + 7 74 10 86 97 + +25 91 46 84 66 +44 50 40 10 67 +62 77 5 6 43 +63 29 79 51 53 +70 69 61 80 54 + +19 11 24 9 93 +21 53 81 2 61 +69 83 33 23 68 +73 22 77 71 52 +92 76 94 86 1 + +51 31 27 28 95 +16 50 36 13 57 + 1 11 79 45 90 +41 77 3 78 42 +56 74 85 44 52 + +58 0 63 88 30 +35 18 48 49 80 +36 11 46 13 76 +37 19 9 93 87 +68 15 17 8 82 + +96 20 7 81 11 +42 17 14 44 36 +99 98 68 58 56 +15 57 80 3 67 +61 66 38 83 59 + + 3 60 25 55 17 +42 45 66 24 14 +13 16 41 11 88 +89 96 97 35 1 +83 5 52 69 28 + +99 11 53 82 3 +88 74 42 38 13 +94 80 27 92 34 +29 56 8 14 76 +85 65 66 79 59 + +80 82 43 87 70 +85 22 53 10 1 +30 78 39 26 77 + 7 92 20 21 93 +75 36 61 13 90 + +53 41 29 77 58 +98 83 86 14 94 +10 99 24 17 32 + 3 87 42 19 61 +57 89 36 13 9 + +30 45 53 99 41 +80 85 25 18 10 +47 98 64 78 11 +58 94 9 91 87 +35 97 43 0 32 + +70 1 80 98 85 +73 69 90 63 20 +53 77 39 49 64 +28 7 78 84 57 +56 86 23 88 97 + +18 53 73 49 40 +36 95 46 42 94 +97 19 23 72 84 +21 47 91 8 17 +99 90 68 30 25 + +26 9 84 35 59 +44 47 66 8 48 + 0 82 68 54 58 +65 7 28 62 61 +55 37 21 72 86 + +47 55 12 75 61 +99 74 9 10 67 + 2 57 25 20 46 +83 97 43 49 59 + 3 79 94 69 70 + +12 2 41 69 24 +93 95 43 52 66 +71 92 57 14 58 +30 25 81 62 79 + 7 96 70 22 42 + +92 83 35 65 8 +63 71 43 33 19 +95 24 51 85 41 +66 13 68 12 20 + 7 1 22 40 75 + +30 56 10 85 72 +83 52 51 80 14 +32 29 67 41 74 +96 62 16 15 98 +73 45 99 48 79 + +24 9 5 38 52 +32 57 87 30 90 + 7 54 39 43 14 +31 76 96 65 0 +51 99 20 61 92 + +19 37 39 15 86 +53 32 42 57 70 + 9 26 84 93 10 +33 25 61 21 0 +34 60 30 99 7 + +62 50 33 29 54 +92 12 81 0 87 +60 2 27 7 9 +28 18 31 35 59 +20 63 38 72 14 + +96 89 34 56 63 +61 8 25 90 78 +94 26 10 47 84 + 1 32 7 83 73 +16 65 69 23 97 + +44 59 87 16 18 +31 50 27 9 38 +49 10 56 69 35 +13 24 91 46 70 +22 37 6 43 25 + +87 79 59 26 35 +81 73 36 66 51 +97 11 43 17 7 +24 94 71 91 48 +12 77 93 55 34 + +91 93 56 55 58 +24 11 82 35 86 +68 81 50 34 23 +59 73 1 8 37 +18 83 80 53 85 + +40 30 7 72 22 +68 94 95 89 42 +91 84 11 49 36 +64 29 26 73 76 +37 1 51 9 25 + +32 48 47 36 88 +54 91 59 72 50 +31 83 19 20 0 +24 67 61 46 99 +52 53 11 16 69 + +86 52 95 73 6 +56 45 8 13 80 +28 77 19 59 48 +99 33 47 10 85 +35 81 27 46 76 + +41 45 1 12 49 +32 16 21 85 27 +50 80 66 64 10 +76 11 9 59 52 +71 37 34 2 43 + +43 19 88 81 12 + 4 48 9 91 31 + 1 46 10 6 56 +72 41 30 36 94 +61 83 86 28 79 + +39 10 40 25 52 +29 60 38 18 31 +65 46 11 0 94 +68 12 42 4 84 +55 20 86 77 26 + +12 65 79 59 43 +93 6 68 1 29 +17 48 45 26 80 +37 22 5 66 47 +71 11 41 18 64 + + 5 45 54 82 64 +90 89 22 17 71 +81 60 65 32 34 +41 86 35 30 48 +67 47 23 51 6 + +19 65 11 58 49 +97 68 56 10 39 +87 29 43 40 83 + 9 41 26 79 77 +63 72 93 4 51 + +82 50 90 45 4 +53 96 93 30 19 + 8 95 73 74 98 +35 20 32 7 36 +56 52 59 26 16 + +94 67 97 34 75 +23 80 68 24 47 +56 8 21 66 36 +69 5 3 95 17 +29 38 44 42 28 + +84 35 72 8 38 +94 30 48 24 27 +81 61 18 87 90 +65 17 85 22 45 +32 15 74 52 68 + + 9 69 63 68 36 +44 31 35 12 39 +57 83 6 49 23 +64 0 10 85 81 +82 40 34 91 24 diff --git a/src/day4.rs b/src/day4.rs new file mode 100644 index 0000000..74cfca2 --- /dev/null +++ b/src/day4.rs @@ -0,0 +1,121 @@ +pub fn day4() { + // let input = r#" + // 7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1 + + // 22 13 17 11 0 + // 8 2 23 4 24 + // 21 9 14 16 7 + // 6 10 3 18 5 + // 1 12 20 15 19 + + // 3 15 0 2 22 + // 9 18 13 17 5 + // 19 8 7 25 23 + // 20 11 10 24 4 + // 14 21 16 12 6 + + // 14 21 17 24 4 + // 10 16 15 9 19 + // 18 8 23 26 20 + // 22 11 13 6 5 + // 2 0 12 3 7 + // "# + // .trim(); + + let input = include_str!("../input/day4.txt"); + + let mut parts = input.split("\n\n"); + let drawn = parts + .next() + .unwrap() + .split(",") + .map(|s| s.parse::().unwrap()); + let mut boards: Vec = parts.map(|b| b.into()).collect(); + + let mut found_p1_winner = false; + let mut in_progress_indices = (0..boards.len()).collect::>(); + + 'outer: for n in drawn { + for (i, b) in boards.iter_mut().enumerate() { + b.mark(n); + if b.is_winner() { + if !found_p1_winner { + found_p1_winner = true; + println!("p1: winning board index: {}", i); + println!("p1: winning board score: {}", b.score()); + println!("p1: final score: {}", b.score() * n); + } + + // boo, just let me remove an element + in_progress_indices.retain(|&it| it != i); + + if in_progress_indices.len() == 0 { + println!("p2: last remaining board index: {}", i); + println!("p2: board score: {}", b.score()); + println!("p2: final score: {}", b.score() * n); + break 'outer; + } + } + } + } +} + +#[derive(Clone)] +struct Board { + numbers: [[i32; 5]; 5], + marked: Vec<(usize, usize)>, +} + +impl Board { + fn mark(&mut self, n: i32) { + for x in 0..5 { + for y in 0..5 { + if self.numbers[x][y] == n { + self.marked.push((x, y)); + } + } + } + } + + fn is_winner(&self) -> bool { + for i in 0..5 { + let mut row = (0..5).map(|y| (i, y)); + let mut col = (0..5).map(|x| (x, i)); + if row.all(|pair| self.marked.contains(&pair)) + || col.all(|pair| self.marked.contains(&pair)) + { + return true; + } + } + false + } + + fn score(&self) -> i32 { + let mut sum = 0; + for x in 0..5 { + for y in 0..5 { + if !self.marked.contains(&(x, y)) { + sum += self.numbers[x][y]; + } + } + } + sum + } +} + +impl From<&str> for Board { + fn from(str: &str) -> Self { + let mut numbers = [[0; 5]; 5]; + for (i, line) in str.lines().enumerate() { + let mut row = [0; 5]; + for (j, num) in line.split_whitespace().enumerate() { + row[j] = num.parse().unwrap(); + } + numbers[i] = row; + } + Self { + numbers, + marked: vec![], + } + } +} diff --git a/src/main.rs b/src/main.rs index 06ffbba..1175b7d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,8 @@ mod day1; mod day2; mod day3; +mod day4; fn main() { - day3::day3(); + day4::day4(); }