From 4301b064d443b13854dd42ef8242d20bef548fe9 Mon Sep 17 00:00:00 2001 From: Santo Cariotti Date: Tue, 5 Dec 2023 19:12:55 +0100 Subject: part 1 of day5 --- 2023/day5/src/lib.rs | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 2023/day5/src/lib.rs (limited to '2023/day5/src') diff --git a/2023/day5/src/lib.rs b/2023/day5/src/lib.rs new file mode 100644 index 0000000..aab4feb --- /dev/null +++ b/2023/day5/src/lib.rs @@ -0,0 +1,166 @@ +use std::str::Split; + +fn get_data(data: &mut Split<&str>) -> Vec> { + data.nth(0) + .unwrap() + .split(':') + .nth(1) + .unwrap() + .trim_start() + .split('\n') + .map(|x| x.split(' ').map(|y| y.parse::().unwrap()).collect()) + .collect() +} + +pub fn part1(input: &str) -> i64 { + let mut input = input.trim().split("\n\n"); + + let mut seeds: Vec = input + .nth(0) + .unwrap() + .split(':') + .nth(1) + .unwrap() + .trim() + .split(' ') + .map(|x| x.parse::().unwrap()) + .collect(); + + let mut data: Vec>> = vec![]; + for _ in 0..7 { + let x: Vec> = get_data(&mut input); + + data.push(x); + } + // 0 -> seed-to-soil + // 1 -> soil-to-fertilizer + // 2 -> fertilizer-to-water + // 3 -> water-to-light + // 4 -> light-to-temperature + // 5 -> temperature-to-humidity + // 6 -> humidity-to-location + + for d in &data { + let mut checked: Vec = vec![]; + for i in d { + let drs = i[0]; + let srs = i[1]; + let incr = i[2]; + + for seed in &mut seeds { + if !checked.contains(&*seed) && *seed >= srs && *seed <= srs + incr { + *seed = *seed - srs + drs; + checked.push(*seed); + } + } + } + } + + let mut res = seeds[0]; + for seed in seeds { + if seed < res { + res = seed; + } + } + + res +} + +pub fn part2(input: &str) -> i64 { + let mut input = input.trim().split("\n\n"); + + let s: Vec = input + .nth(0) + .unwrap() + .split(':') + .nth(1) + .unwrap() + .trim() + .split(' ') + .map(|x| x.parse::().unwrap()) + .collect(); + + assert_eq!(s.len() % 2, 0); + let mut seeds: Vec = vec![]; + let mut i = 0; + while i < s.len() { + for j in s[i] as usize..(s[i] + s[i + 1]) as usize { + seeds.push(j as i64); + } + + i += 2; + } + println!("{seeds:?}"); + + let mut data: Vec>> = vec![]; + for _ in 0..7 { + let x: Vec> = get_data(&mut input); + + data.push(x); + } + // 0 -> seed-to-soil + // 1 -> soil-to-fertilizer + // 2 -> fertilizer-to-water + // 3 -> water-to-light + // 4 -> light-to-temperature + // 5 -> temperature-to-humidity + // 6 -> humidity-to-location + + for d in &data { + let mut checked: Vec = vec![]; + for i in d { + let drs = i[0]; + let srs = i[1]; + let incr = i[2]; + + for seed in &mut seeds { + if !checked.contains(&*seed) && *seed >= srs && *seed <= srs + incr { + *seed = *seed - srs + drs; + checked.push(*seed); + } + } + } + } + + let mut res = seeds[0]; + for seed in seeds { + if seed < res { + res = seed; + } + } + + res +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn example_part1() { + let input = include_str!("../example.txt"); + let result = part1(input); + assert_eq!(result, 35); + } + + #[test] + fn input_part1() { + let input = include_str!("../input.txt"); + let result = part1(input); + assert_eq!(result, 251346198); + } + + #[test] + fn example_part2() { + let input = include_str!("../example.txt"); + let result = part2(input); + assert_eq!(result, 46); + } + + #[test] + fn input_part2() { + let input = include_str!("../input.txt"); + let result = part2(input); + assert_eq!(result, 71585); + } +} -- cgit v1.2.3-18-g5258