From e03fc564c131fef7e26852b0c1f689a2c061ab3a Mon Sep 17 00:00:00 2001 From: Sijmen Schoon Date: Tue, 15 Dec 2020 18:08:40 +0100 Subject: [PATCH] Rust: day 15 first working --- rust/src/main.rs | 105 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/rust/src/main.rs b/rust/src/main.rs index 8521e2a..32aadf4 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -377,6 +377,94 @@ mod day08 { } } +mod day09 { + use std::time::Duration; + + pub fn run(_: bool) -> Duration { + Duration::new(0, 0) + } +} + +mod day10 { + use std::time::Duration; + + pub fn run(_: bool) -> Duration { + Duration::new(0, 0) + } +} + +mod day11 { + use std::time::Duration; + + pub fn run(_: bool) -> Duration { + Duration::new(0, 0) + } +} + +mod day12 { + use std::time::Duration; + + pub fn run(_: bool) -> Duration { + Duration::new(0, 0) + } +} + +mod day13 { + use std::time::Duration; + + pub fn run(_: bool) -> Duration { + Duration::new(0, 0) + } +} + +mod day14 { + use std::time::Duration; + + pub fn run(_: bool) -> Duration { + Duration::new(0, 0) + } +} + +mod day15 { + use std::time::{Duration, Instant}; + + const END: usize = 30_000_000; + pub fn run(print: bool) -> Duration { + let input: Vec = "0,1,5,10,3,12,19" + .split(",") + .map(|i| i.parse().unwrap()) + .collect(); + let instant = Instant::now(); + + let mut history = vec![0; END]; + let mut last = input[0]; + for turn in 0..input.len() { + history[last] = turn; + last = input[turn]; + } + + for turn in input.len()..2020 { + let stored = history[last]; + history[last] = turn; + last = if stored == 0 { 0 } else { turn - stored }; + } + if print { + println!("Part 1: {}", last); + } + + for turn in 2020..END { + let stored = history[last]; + history[last] = turn; + last = if stored == 0 { 0 } else { turn - stored }; + } + if print { + println!("Part 2: {}", last); + } + + instant.elapsed() + } +} + fn main() { let days = [ day01::run, @@ -387,6 +475,13 @@ fn main() { day06::run, day07::run, day08::run, + day09::run, + day10::run, + day11::run, + day12::run, + day13::run, + day14::run, + day15::run, ]; if let Some(day) = std::env::args().nth(1) { @@ -395,10 +490,18 @@ fn main() { days[day - 1](true); } } else { - let repetitions = 2000; let mut total = Duration::new(0, 0); for day in 0..days.len() { + let first_run = days[day](false); + if first_run.as_nanos() == 0 { + println!("Day {:>2}: skipped", day); + continue; + } + + let repetitions = + 5000.min((Duration::new(5, 0).as_nanos() / first_run.as_nanos()) as u32); + let mut elapsed = Duration::new(0, 0); for _ in 0..repetitions { elapsed += days[day](false) / repetitions;