Completed day 2. Needs speed improvements
This commit is contained in:
48
day_02/src/lib.rs
Normal file
48
day_02/src/lib.rs
Normal 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
33
day_02/src/main.rs
Normal 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());
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user