about summary refs log tree commit diff
path: root/aoc2023/day2/src
diff options
context:
space:
mode:
Diffstat (limited to 'aoc2023/day2/src')
-rw-r--r--aoc2023/day2/src/main.rs158
1 files changed, 158 insertions, 0 deletions
diff --git a/aoc2023/day2/src/main.rs b/aoc2023/day2/src/main.rs
new file mode 100644
index 0000000..e42b9c5
--- /dev/null
+++ b/aoc2023/day2/src/main.rs
@@ -0,0 +1,158 @@
+/*
+--- Day 2: Cube Conundrum ---
+
+You're launched high into the atmosphere! The apex of your trajectory just barely reaches the surface of a large island
+floating in the sky. You gently land in a fluffy pile of leaves. It's quite cold, but you don't see much snow. An Elf
+runs over to greet you.
+
+The Elf explains that you've arrived at Snow Island and apologizes for the lack of snow. He'll be happy to explain the
+situation, but it's a bit of a walk, so you have some time. They don't get many visitors up here; would you like to play
+a game in the meantime?
+
+As you walk, the Elf shows you a small bag and some cubes which are either red, green, or blue. Each time you play this
+game, he will hide a secret number of cubes of each color in the bag, and your goal is to figure out information about
+the number of cubes.
+
+To get information, once a bag has been loaded with cubes, the Elf will reach into the bag, grab a handful of random
+cubes, show them to you, and then put them back in the bag. He'll do this a few times per game.
+
+You play several games and record the information from each game (your puzzle input). Each game is listed with its ID
+number (like the 11 in Game 11: ...) followed by a semicolon-separated list of subsets of cubes that were revealed from
+the bag (like 3 red, 5 green, 4 blue).
+
+For example, the record of a few games might look like this:
+
+Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
+Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
+Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
+Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
+Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
+
+In game 1, three sets of cubes are revealed from the bag (and then put back again). The first set is 3 blue cubes and
+4 red cubes; the second set is 1 red cube, 2 green cubes, and 6 blue cubes; the third set is only 2 green cubes.
+
+The Elf would first like to know which games would have been possible if the bag contained only 12 red cubes, 13 green
+cubes, and 14 blue cubes?
+
+In the example above, games 1, 2, and 5 would have been possible if the bag had been loaded with that configuration.
+However, game 3 would have been impossible because at one point the Elf showed you 20 red cubes at once; similarly,
+game 4 would also have been impossible because the Elf showed you 15 blue cubes at once. If you add up the IDs of the
+games that would have been possible, you get 8.
+
+Determine which games would have been possible if the bag had been loaded with only 12 red cubes, 13 green cubes, and
+14 blue cubes. What is the sum of the IDs of those games?
+
+--- Part Two ---
+
+The Elf says they've stopped producing snow because they aren't getting any water! He isn't sure why the water stopped;
+however, he can show you how to get to the water source to check it out for yourself. It's just up ahead!
+
+As you continue your walk, the Elf poses a second question: in each game you played, what is the fewest number of cubes
+of each color that could have been in the bag to make the game possible?
+
+Again consider the example games from earlier:
+
+Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
+Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
+Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
+Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
+Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
+
+    In game 1, the game could have been played with as few as 4 red, 2 green, and 6 blue cubes. If any color had even
+    one fewer cube, the game would have been impossible.
+    Game 2 could have been played with a minimum of 1 red, 3 green, and 4 blue cubes.
+    Game 3 must have been played with at least 20 red, 13 green, and 6 blue cubes.
+    Game 4 required at least 14 red, 3 green, and 15 blue cubes.
+    Game 5 needed no fewer than 6 red, 3 green, and 2 blue cubes in the bag.
+
+The power of a set of cubes is equal to the numbers of red, green, and blue cubes multiplied together. The power of the
+minimum set of cubes in game 1 is 48. In games 2-5 it was 12, 1560, 630, and 36, respectively. Adding up these five
+powers produces the sum 2286.
+
+For each game, find the minimum set of cubes that must have been present. What is the sum of the power of these sets?
+
+ */
+
+use std::cmp::max;
+use std::fs;
+
+fn main() {
+    let input = fs::read_to_string("input").unwrap();
+
+    let max_red = 12;
+    let max_green = 13;
+    let max_blue = 14;
+
+    let games:Vec<(i32, Vec<(i32, i32, i32)>)> = input.lines()
+        .map(construct_game)
+        .collect();
+
+    let total = games.iter().filter_map(|game| {
+        for cubeset in game.1.clone() {
+            if cubeset.0 > max_red || cubeset.1 > max_green || cubeset.2 > max_blue {
+                println!("Game {} is invalid", game.0);
+                return None
+            }
+        }
+        println!("Game {} is valid", game.0);
+        Some(game.0)
+    }).reduce(|acc, game| acc + game).unwrap();
+
+    println!("Part one answer: {total}");
+
+    let power_total = games.iter()
+        .map(game_power)
+        .reduce(|acc, e| acc + e)
+        .unwrap();
+
+    println!("Part two answer: {power_total}");
+}
+
+fn construct_game(line: &str) -> (i32, Vec<(i32, i32, i32)>) {
+    let t = line.split_once(":").unwrap();
+
+    let n = t.0.trim_start_matches("Game ")
+        .parse::<i32>().expect("game number is valid");
+
+    let cubesets = t.1.split(";")
+        .map(parse_cubeset)
+        .collect();
+
+    (n, cubesets)
+}
+
+fn parse_cubeset(set: &str) -> (i32, i32, i32) {
+    let mut red = 0;
+    let mut green = 0;
+    let mut blue = 0;
+
+    set.split(",")
+        .for_each(|cubes| {
+            if cubes.contains("red") {
+                red += cubes.trim().split_once(" ").unwrap().0
+                    .parse::<i32>().expect("can parse red cubes");
+            } else if cubes.contains("green") {
+                green += cubes.trim().split_once(" ").unwrap().0
+                    .parse::<i32>().expect("can parse green cubes");
+            } else if cubes.contains("blue") {
+                blue += cubes.trim().split_once(" ").unwrap().0
+                    .parse::<i32>().expect("can parse blue cubes");
+            }
+        });
+
+    (red, green, blue)
+}
+
+fn game_power(game:&(i32, Vec<(i32, i32, i32)>)) -> i32 {
+    let mut red = 0;
+    let mut green = 0;
+    let mut blue = 0;
+
+    for cubeset in game.1.clone() {
+        red = max(cubeset.0, red);
+        green = max(cubeset.1, green);
+        blue = max(cubeset.2, blue);
+    }
+
+    red * green * blue
+}
\ No newline at end of file