AdventOfCode/day6/src/main.rs

65 lines
1.9 KiB
Rust

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;
let mut min_dist = std::i32::MAX;
for (x,y) in &anchorpoints{
let dist = (x - i).abs() + (y - j).abs();
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 {
*points_nearest_to_anchor.entry((winning_x,winning_y)).or_insert(0) += 1;
}
}
}
let mut largest_area = 0;
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;
}
}
println!("{}", largest_area);
}