[2018][rust][06.1]
change ssnwozprvzxuulzlvnlvwxpxrxuuvwsp
commit 6b30ab64327603ceccf68e109c54e98405beecb4
author Alpha Chen <alpha.chen@gmail.com>
date
parent qyvsnnlp
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<Error>> {
     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<String, Box<Error>> {
+fn part_two(input: &str, max_distance: usize) -> Result<String, Box<Error>> {
+    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<String, Box<Error>> {
     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<String, Box<Error>> {
 }
 
 #[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<C: Into<Coord>>(&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<Error>;