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