diff --git a/src/solutions/day05.rs b/src/solutions/day05.rs index f20b2e7..4e9aba9 100644 --- a/src/solutions/day05.rs +++ b/src/solutions/day05.rs @@ -22,9 +22,35 @@ impl Solution for Day05 { fn part2( &self, - _input: &mut Vec, + input: &mut Vec, ) -> Result, Box> { - Ok(Box::new("Ready")) + let (seeds, maps) = self.get_mappings(input)?; + + let seeds = seeds.iter() + .tuples() + .map(|(&a, len)| (a, a + len)) + .collect::>(); + let locations = maps.iter().fold(seeds, |seeds, mappings| + seeds.iter().flat_map(|&(start, end)| { + let mut mapped = Vec::new(); + let mut unmapped = vec![(start, end)]; + for &(dst, src, len) in mappings { + let mut m = Vec::new(); + for (start, end) in unmapped { + let a = (start, end.min(src)); + let b = (start.max(src), (src+len).min(end)); + let c = ((src+len).max(start), end); + if a.0 < a.1 { m.push(a); } + if b.0 < b.1 { mapped.push((b.0-src+dst, b.1-src+dst)); } + if c.0 < c.1 { m.push(c); } + } + unmapped = m; + } + mapped.extend(unmapped); + mapped + }).collect() + ); + Ok(Box::new(locations.iter().map(|&(s, _)| s).min().unwrap())) } fn get_day(&self) -> u8 { @@ -90,6 +116,6 @@ mod test { .unwrap() .to_string(); - assert_eq!(answer, "Ready"); + assert_eq!(answer, "46"); } }