2018-12-07 19:26:06 +01:00
use std ::fs ;
use std ::collections ::HashSet ;
use std ::collections ::HashMap ;
fn main ( ) {
let file = fs ::read_to_string ( " input " ) . expect ( " Unable to read file " ) ;
let lines = file . split ( " \n " ) . collect ::< Vec < & str > > ( ) ;
let mut anchorpoints = HashSet ::new ( ) ;
let mut points_nearest_to_anchor = HashMap ::new ( ) ;
let mut min_x = std ::i32 ::MAX ;
let mut min_y = std ::i32 ::MAX ;
let mut max_x = 0 ;
let mut max_y = 0 ;
for line in lines {
let coords = line . split ( | c | c = = ',' | | c = = ' ' ) . collect ::< Vec < & str > > ( ) ;
let x = coords [ 0 ] . parse ::< i32 > ( ) . unwrap ( ) ;
let y = coords [ 2 ] . parse ::< i32 > ( ) . unwrap ( ) ;
anchorpoints . insert ( ( x , y ) ) ;
if x < min_x { min_x = x . clone ( ) ; }
if y < min_y { min_y = y . clone ( ) ; }
if x > max_x { max_x = x . clone ( ) ; }
if y > max_y { max_y = y . clone ( ) ; }
}
for i in min_x .. ( max_x + 1 ) {
for j in min_y .. ( max_y + 1 ) {
let mut winning_x = 0 ;
let mut winning_y = 0 ;
let mut second_min_dist = std ::i32 ::MAX ;
2018-12-07 20:14:58 +01:00
let mut min_dist = std ::i32 ::MAX ;
2018-12-07 19:26:06 +01:00
for ( x , y ) in & anchorpoints {
2018-12-07 20:14:58 +01:00
let dist = ( x - i ) . abs ( ) + ( y - j ) . abs ( ) ;
2018-12-07 19:26:06 +01:00
if dist < min_dist {
min_dist = dist ;
winning_x = x . clone ( ) ;
winning_y = y . clone ( ) ;
} else if dist < second_min_dist {
second_min_dist = dist ;
}
}
if min_dist ! = second_min_dist {
2018-12-07 20:14:58 +01:00
* points_nearest_to_anchor . entry ( ( winning_x , winning_y ) ) . or_insert ( 0 ) + = 1 ;
2018-12-07 19:26:06 +01:00
}
}
}
let mut largest_area = 0 ;
2018-12-07 20:14:58 +01:00
for ( ( x , y ) , area ) in points_nearest_to_anchor {
if area > largest_area & & x > min_x & & x < max_x & & y > min_y & & y < max_y {
largest_area = area ;
2018-12-07 19:26:06 +01:00
}
}
println! ( " {} " , largest_area ) ;
}