diff --git a/src/day1.rs b/src/day1.rs index 0e8d0f7..dc5710a 100644 --- a/src/day1.rs +++ b/src/day1.rs @@ -1,15 +1,18 @@ - - pub fn run(input: &str) { - let step_list = input.lines() - .map(|l| l.replace("L", "").replace("R", "-").parse::().unwrap()); - let counted = step_list.scan(50, |dial, steps| { - let at_0 = (*dial..(*dial + steps)) - .chain((*dial + steps + 1)..=*dial) - .filter(|num| *num % 100 == 0).count(); - *dial += steps; - Some((*dial % 100 == 0, at_0)) + let step_list = input.lines().map(|l| { + l.split_at(1).1.parse::().unwrap() * if l.split_at(1).0 == "R" { 1 } else { -1 } }); - println!("Part 1: {}", counted.clone().filter(|(is_0, _)| *is_0).count()); - println!("Part 2: {}", counted.fold(0, |acc, num| acc + num.1)); + let counted = step_list.fold((50, 0, 0), |track, steps| { + let at_0 = (track.0..(track.0 + steps)) + .chain((track.0 + steps + 1)..=track.0) + .filter(|num| *num % 100 == 0) + .count(); + ( + track.0 + steps, + track.1 + if (track.0 + steps) % 100 == 0 { 1 } else { 0 }, + track.2 + at_0, + ) + }); + println!("Part 1: {}", counted.1); + println!("Part 2: {}", counted.2); } diff --git a/src/day2.rs b/src/day2.rs new file mode 100644 index 0000000..d3d9f97 --- /dev/null +++ b/src/day2.rs @@ -0,0 +1 @@ +pub fn run(_input: &str) {} diff --git a/src/inputs/day2.txt b/src/inputs/day2.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/inputs/test1.txt b/src/inputs/test1.txt new file mode 100644 index 0000000..d03fad7 --- /dev/null +++ b/src/inputs/test1.txt @@ -0,0 +1,10 @@ +L68 +L30 +R48 +L5 +R60 +L55 +L1 +L99 +R14 +L82 \ No newline at end of file diff --git a/src/inputs/test2.txt b/src/inputs/test2.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/main.rs b/src/main.rs index 793e624..ca7328a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,19 +1,30 @@ +use std::time::Instant; + use dialoguer::Select; -mod utils; mod day1; +mod day2; +mod utils; -const CHOICES: [&str; 2] = [ +const CHOICES: [&str; 5] = [ "Exit", "Day 1: Secret Entrance", + "Day 1 (testing): Secret Entrance", + "Day 2: ", + "Day 2 (testing): ", ]; fn main() { while let Some(choice) = get_input() { + let start = Instant::now(); match choice { 1 => day1::run(include_str!("inputs/day1.txt")), - _ => println!("Invalid selection") + 2 => day1::run(include_str!("inputs/test1.txt")), + 3 => day2::run(include_str!("inputs/day2.txt")), + 4 => day2::run(include_str!("inputs/test2.txt")), + _ => println!("Invalid selection"), } + println!("Execution time: {:?}", start.elapsed()) } } @@ -27,6 +38,6 @@ fn get_input() -> Option { match selection { 0 => None, - _ => Some(selection) + _ => Some(selection), } }