day 8!
This commit is contained in:
parent
5fd58b14a7
commit
bd93ac4c3d
6
day08/Cargo.toml
Normal file
6
day08/Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "day08"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
99
day08/src/main.rs
Normal file
99
day08/src/main.rs
Normal file
@ -0,0 +1,99 @@
|
||||
use std::iter;
|
||||
use std::collections::HashSet;
|
||||
use std::collections::HashMap;
|
||||
use std::fs;
|
||||
use std::env;
|
||||
|
||||
type Coord = (i32, i32);
|
||||
|
||||
fn main() {
|
||||
println!("Hello, AoC day 04!");
|
||||
|
||||
let args: Vec<String> = env::args().collect();
|
||||
if args.len() != 2 {
|
||||
println!("wrong number of arguments!");
|
||||
std::process::exit(1);
|
||||
}
|
||||
|
||||
let file_path = &args[1];
|
||||
|
||||
let contents = fs::read_to_string(file_path).expect("Should have been able to read the file");
|
||||
let mut grid: HashMap<Coord, char> = HashMap::new();
|
||||
|
||||
let mut x;
|
||||
// build our grid!
|
||||
let mut y = 0;
|
||||
for line in contents.lines() {
|
||||
x = 0;
|
||||
for c in line.chars() {
|
||||
grid.insert((x,y), c);
|
||||
x += 1;
|
||||
}
|
||||
y += 1;
|
||||
}
|
||||
|
||||
let mut antennas: HashMap<char, Vec<Coord>> = HashMap::new();
|
||||
let mut antinodes: HashSet<Coord> = HashSet::new();
|
||||
|
||||
for (&location, &character) in grid.iter() {
|
||||
if character == '.' { continue; }
|
||||
|
||||
if antennas.contains_key(&character) {
|
||||
let other_antennas = antennas.get(&character).unwrap();
|
||||
for &other_location in other_antennas {
|
||||
let a = antinode(location, other_location);
|
||||
if grid.contains_key(&a) { antinodes.insert(a); }
|
||||
let b = antinode(other_location, location);
|
||||
if grid.contains_key(&b) { antinodes.insert(b); }
|
||||
}
|
||||
} else {
|
||||
antennas.insert(character, Vec::new());
|
||||
}
|
||||
|
||||
antennas.get_mut(&character).unwrap().push(location);
|
||||
}
|
||||
|
||||
let count = antinodes.len();
|
||||
println!("there are {count} antinodes in the naive assumption");
|
||||
|
||||
let mut antennas_b: HashMap<char, Vec<Coord>> = HashMap::new();
|
||||
let mut antinodes_b: HashSet<Coord> = HashSet::new();
|
||||
|
||||
for (&location, &character) in grid.iter() {
|
||||
if character == '.' { continue; }
|
||||
|
||||
if antennas_b.contains_key(&character) {
|
||||
let other_antennas = antennas_b.get(&character).unwrap();
|
||||
for &other_location in other_antennas {
|
||||
for node in find_antinodes(location, other_location) {
|
||||
if grid.contains_key(&node) { antinodes_b.insert(node); }
|
||||
else { break; }
|
||||
}
|
||||
}
|
||||
for &other_location in other_antennas {
|
||||
for node in find_antinodes(other_location, location) {
|
||||
if grid.contains_key(&node) { antinodes_b.insert(node); }
|
||||
else { break; }
|
||||
}
|
||||
}
|
||||
} else {
|
||||
antennas_b.insert(character, Vec::new());
|
||||
}
|
||||
|
||||
antennas_b.get_mut(&character).unwrap().push(location);
|
||||
}
|
||||
|
||||
let count_b = antinodes_b.len();
|
||||
println!("there are {count_b} antinodes in the complex scenario");
|
||||
}
|
||||
|
||||
fn antinode(a: Coord, b: Coord) -> Coord {
|
||||
let a_to_b = ( b.0 - a.0, b.1 - a.1 );
|
||||
return ( b.0 + a_to_b.0, b.1 + a_to_b.1 );
|
||||
}
|
||||
|
||||
fn find_antinodes(a: Coord, b: Coord) -> impl Iterator<Item = Coord> {
|
||||
let a_to_b = ( b.0 - a.0, b.1 - a.1 );
|
||||
return iter::successors(Some( b ),
|
||||
move |&x| Some((x.0 + a_to_b.0, x.1 + a_to_b.1)))
|
||||
}
|
Loading…
Reference in New Issue
Block a user