Completed day 2. Needs speed improvements

This commit is contained in:
Connor Johnstone
2023-12-01 22:38:12 -07:00
parent 6a32039ff0
commit 993c23dc1b
7 changed files with 811 additions and 0 deletions

48
day_02/src/lib.rs Normal file
View File

@@ -0,0 +1,48 @@
pub fn part1(input: &str) -> String {
let output: u32 = input.lines().map(|line| {
let mut iter = line.split(":");
let game_id = iter.next().unwrap().split(" ").last().unwrap().parse::<u32>().unwrap();
let results = iter.next().unwrap().split(&[';', ',']).map(|result| {
let mut result_iter = result.trim().split(" ");
let count = result_iter.next().unwrap().parse::<u32>().unwrap();
let color = result_iter.next().unwrap();
if color == "red" && count > 12 {
false
} else if color == "green" && count > 13 {
false
} else if color == "blue" && count > 14 {
false
} else {
true
}
}).all(|x| {x});
match results {
true => game_id,
false => 0,
}
}).sum();
format!("{}", output)
}
pub fn part2(input: &str) -> String {
let games = input.lines().map(|line| {
let mut iter = line.split(":");
let results_iter = iter.next().unwrap().split(&[';', ',']).map(|result| {
let mut result_iter = result.trim().split(" ");
let count = result_iter.next().unwrap().parse::<u32>().unwrap();
let color = result_iter.next().unwrap();
(count, color)
});
let red_max = results_iter.clone().filter(|x| {x.1 == "red"}).map(|x| {x.0}).max().unwrap();
let green_max = results_iter.clone().filter(|x| {x.1 == "green"}).map(|x| {x.0}).max().unwrap();
let blue_max = results_iter.clone().filter(|x| {x.1 == "blue"}).map(|x| {x.0}).max().unwrap();
red_max * green_max * blue_max
});
games.sum::<u32>().to_string()
}
pub mod prelude {
pub use super::part1;
pub use super::part2;
}

33
day_02/src/main.rs Normal file
View File

@@ -0,0 +1,33 @@
use day_02::prelude::*;
fn main() {
let input = include_str!("../input.txt");
println!("{}", part1(input));
println!("{}", part2(input));
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part1() {
let test_input = "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";
assert_eq!(part1(test_input), "8".to_string());
}
#[test]
fn test_part2() {
let test_input = "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";
assert_eq!(part2(test_input), "2286".to_string());
}
}