diff --git a/old/day06/Cargo.lock b/old/day06/Cargo.lock deleted file mode 100644 index a16c0bf..0000000 --- a/old/day06/Cargo.lock +++ /dev/null @@ -1,7 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "day6" -version = "0.1.0" diff --git a/old/day06/Cargo.toml b/old/day06/Cargo.toml deleted file mode 100644 index 89d04ae..0000000 --- a/old/day06/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[package] -name = "day6" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] diff --git a/old/day06/src/main.rs b/old/day06/src/main.rs deleted file mode 100644 index a5f6430..0000000 --- a/old/day06/src/main.rs +++ /dev/null @@ -1,56 +0,0 @@ -use std::fs; - -fn main() { - let input = fs::read_to_string("input.txt").unwrap(); - let input: Vec<_> = input.split('\n') // Separate the Time and Distance lines - .map(|line| { - line[line.find(':').unwrap() + 1..] // Drop "Time:" and "Distance:" - .split_whitespace() // Split the numbers into their own elements - .flat_map(|s| s.chars()).collect::() // Combine the strings into a single one - .parse::().expect("Couldn't parse number") // Parse numbers into i32 - }).collect(); // Collect into Vec - - let time = input[0]; - let dist = input[1]; - let mut valid = 0; - - for remaining_time in 0..time { - if (time - remaining_time) * remaining_time > dist { - valid += 1; - } - } - - println!("{}", valid); -} - - - -// use std::fs; - -// fn main() { -// let input = fs::read_to_string("input.txt").unwrap(); -// let input: Vec<_> = input.split('\n') // Separate the Time and Distance lines -// .map(|line| { -// line[line.find(':').unwrap() + 1..] // Drop "Time:" and "Distance:" -// .split_whitespace() // Split the numbers into their own elements. -// .map(|num| num.parse::().expect("Couldn't parse number")) // Parse numbers into i32 -// .collect::>() -// }).collect(); // collect into Vec - -// let mut valid_total = 1; - -// for round in 0..input.first().unwrap().len() { -// let time = input[0][round]; -// let dist = input[1][round]; -// let mut valid = 0; - -// for remaining_time in 0..time { -// if (time - remaining_time) * remaining_time > dist { -// valid += 1; -// } -// } -// valid_total *= valid; -// } - -// println!("{}", valid_total); -// } diff --git a/src/day6.rs b/src/day6.rs new file mode 100644 index 0000000..a7341c6 --- /dev/null +++ b/src/day6.rs @@ -0,0 +1,80 @@ +use aoc_runner_derive::{aoc, aoc_generator}; +#[aoc_generator(day6, part1)] +fn parse(input: &str) -> Vec> { + let input: Vec> = input.split('\n') // Separate the Time and Distance lines + .map(|line| { + line[line.find(':').unwrap() + 1..] // Drop "Time:" and "Distance:" + .split_whitespace() // Split the numbers into their own elements. + .map(|num| num.parse::().expect("Couldn't parse number")) // Parse numbers into i32 + .collect::>() + }).collect::>(); // collect into Vec + + input +} + +#[aoc(day6, part1)] +fn part1(input: &Vec>) -> i32 { + let mut valid_total = 1; + + for round in 0..input.first().unwrap().len() { + let time = input[0][round]; + let dist = input[1][round]; + let mut valid = 0; + + for remaining_time in 0..time { + if (time - remaining_time) * remaining_time > dist { + valid += 1; + } + } + valid_total *= valid; + } + + valid_total +} + +#[aoc_generator(day6, part2)] +fn parse_part2(input: &str) -> Vec { + let input: Vec = input.split('\n') // Separate the Time and Distance lines + .map(|line| { + line[line.find(':').unwrap() + 1..] // Drop "Time:" and "Distance:" + .split_whitespace() // Split the numbers into their own elements + .flat_map(|s| s.chars()).collect::() // Combine the strings into a single one + .parse::().expect("Couldn't parse number") // Parse numbers into i32 + }).collect(); // Collect into Vec + + input +} + +#[aoc(day6, part2)] +fn part2(input: &Vec) -> i32 { + let time = input[0]; + let dist = input[1]; + let mut valid = 0; + + for remaining_time in 0..time { + if (time - remaining_time) * remaining_time > dist { + valid += 1; + } + } + + valid +} + + +#[cfg(test)] +mod tests { + use super::*; + + const EX: &str = r"Time: 7 15 30 +Distance: 9 40 200"; + + #[test] + fn part1_example() { + assert_eq!(part1(&parse(EX)), 288); + } + + #[test] + fn part2_example() { + assert_eq!(part2(&parse_part2(EX)), 71503); + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 98455a0..88d157d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +mod day6; mod day5; mod day3; mod day14;