diff --git a/2018/rust/src/bin/day_06.rs b/2018/rust/src/bin/day_06.rs index 236f739..1a53587 100644 --- a/2018/rust/src/bin/day_06.rs +++ b/2018/rust/src/bin/day_06.rs @@ -8,13 +8,47 @@ fn main() -> Result<(), Box> { let mut input = String::new(); io::stdin().read_to_string(&mut input)?; - let output = solve(&input)?; + let output = part_two(&input, 10_000)?; println!("{}", output); Ok(()) } -fn solve(input: &str) -> Result> { +fn part_two(input: &str, max_distance: usize) -> Result> { + let coords = Coords::from_str(input)?; + + let min_x = coords.0.iter().map(|c| c.x).min().unwrap(); + let max_x = coords.0.iter().map(|c| c.x).max().unwrap(); + let min_y = coords.0.iter().map(|c| c.y).min().unwrap(); + let max_y = coords.0.iter().map(|c| c.y).max().unwrap(); + let top_left = Coord { x: min_x, y: min_y }; + let bottom_right = Coord { x: max_x, y: max_y }; + + let grid = Grid::new(top_left, bottom_right, |coord| { + coords.total_distance(*coord) + }); + + let area = grid.locations.values().filter(|&&x| x < max_distance).count(); + Ok(area.to_string()) +} + +#[test] +fn test_part_two() { + let input = r" +1, 1 +1, 6 +8, 3 +3, 4 +5, 5 +8, 9 + "; + + let output = part_two(&input, 32).unwrap(); + assert_eq!(output, "16".to_string()); +} + +#[allow(dead_code)] +fn part_one(input: &str) -> Result> { let coords = Coords::from_str(input)?; let min_x = coords.0.iter().map(|c| c.x).min().unwrap(); @@ -53,7 +87,7 @@ fn solve(input: &str) -> Result> { } #[test] -fn test_solve() { +fn test_part_one() { let input = r" 1, 1 1, 6 @@ -63,7 +97,7 @@ fn test_solve() { 8, 9 "; - let output = solve(&input).unwrap(); + let output = part_one(&input).unwrap(); assert_eq!(output, "17".to_string()); } @@ -149,6 +183,11 @@ impl Coords { None } } + + fn total_distance>(&self, c: C) -> usize { + let c = c.into(); + self.0.iter().map(|x| x.distance(c) as usize).sum() + } } #[test] @@ -171,6 +210,23 @@ fn test_closest() { assert_eq!(coords.closest((0, 4)), None); } +#[test] +fn test_total_distance() { + let coords = Coords::from_str( + r" +1, 1 +1, 6 +8, 3 +3, 4 +5, 5 +8, 9 + ", + ) + .unwrap(); + + assert_eq!(coords.total_distance((4, 3)), 30); +} + impl FromStr for Coords { type Err = Box;