Day 5 Part 2 complete
This commit is contained in:
parent
916e52783a
commit
ed05221dff
@ -22,9 +22,35 @@ impl Solution for Day05 {
|
||||
|
||||
fn part2(
|
||||
&self,
|
||||
_input: &mut Vec<String>,
|
||||
input: &mut Vec<String>,
|
||||
) -> Result<Box<dyn std::fmt::Display>, Box<dyn std::error::Error>> {
|
||||
Ok(Box::new("Ready"))
|
||||
let (seeds, maps) = self.get_mappings(input)?;
|
||||
|
||||
let seeds = seeds.iter()
|
||||
.tuples()
|
||||
.map(|(&a, len)| (a, a + len))
|
||||
.collect::<Vec<_>>();
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user