diff --git a/src/day13.rs b/src/day13.rs new file mode 100644 index 0000000..f9d4e56 --- /dev/null +++ b/src/day13.rs @@ -0,0 +1,76 @@ +use aoc_runner_derive::{aoc, aoc_generator}; +use itertools::Itertools; +#[aoc_generator(day13, part1)] +fn parse(input: &str) -> (i32, Vec) { + let (start, buses) = input + .lines() + .collect_tuple() + .unwrap(); + + let buses = buses + .split(',') + .filter_map(|num| num.parse::().ok()) + .collect_vec(); + + (start.parse::().unwrap(), buses) +} + +#[aoc(day13, part1)] +fn part1((start, buses): &(i32, Vec)) -> i32 { + let mut cur = 0; + loop { + if let Some(bus) = buses.iter().find(|x| (cur + start) % *x == 0) { + return bus * cur; + } + cur += 1; + } +} + +#[aoc_generator(day13, part2)] +fn parse2(input: &str) -> Vec> { + let buses = input + .lines().skip(1).next().unwrap(); + + let buses = buses + .split(',') + .map(|num| num.parse::().ok()) + .collect_vec(); + + buses +} + +#[aoc(day13, part2)] +fn part2(input: &Vec>) -> i64 { + let mut min_value = 0; + let mut running_product = 1; + + for (v, k) in input.iter().enumerate() { + if let Some(k) = k { + while (min_value + v as i64) % k != 0 { + min_value += running_product; + } + running_product *= k; + } + } + + min_value +} + + +#[cfg(test)] +mod tests { + use super::*; + +const EX: &str = r"939 +7,13,x,x,59,x,31,19"; + + #[test] + fn part1_example() { + assert_eq!(part1(&parse(EX)), 295); + } + + #[test] + fn part2_example() { + assert_eq!(part2(&parse2(EX)), 1068781); + } +} \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index e1e8654..c08e87f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,4 @@ +mod day13; mod day12; mod day10; mod day9;