Day 9. Pretty straight forward. The borrow checker must have felt bad for me and did not give me any problems today
							parent
							
								
									273561c79f
								
							
						
					
					
						commit
						7fc1ca6ed4
					
				| @ -0,0 +1,7 @@ | ||||
| # This file is automatically @generated by Cargo. | ||||
| # It is not intended for manual editing. | ||||
| version = 3 | ||||
| 
 | ||||
| [[package]] | ||||
| name = "day9" | ||||
| version = "0.1.0" | ||||
| @ -0,0 +1,8 @@ | ||||
| [package] | ||||
| name = "day9" | ||||
| version = "0.1.0" | ||||
| edition = "2021" | ||||
| 
 | ||||
| # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||||
| 
 | ||||
| [dependencies] | ||||
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								| @ -0,0 +1,103 @@ | ||||
| use std::collections::HashMap; | ||||
| 
 | ||||
| fn main() { | ||||
|     let contents = std::fs::read_to_string("data.txt").expect("Failed to read file"); | ||||
|     let lines = contents.lines().collect::<Vec<&str>>(); | ||||
| 
 | ||||
|     let mut hash: HashMap<(i32, i32), bool> = HashMap::new(); | ||||
|     run(&lines, &mut hash, 1); | ||||
|     let part_1 = hash.keys().len(); | ||||
|     println!("Num visited, part 1: {:?}", part_1); | ||||
| 
 | ||||
|     let mut hash2: HashMap<(i32, i32), bool> = HashMap::new(); | ||||
|     run(&lines, &mut hash2, 9); | ||||
|     let part_2 = hash2.keys().len(); | ||||
|     println!("Num visited, part 2: {:?}", part_2); | ||||
| } | ||||
| 
 | ||||
| fn run(lines: &Vec<&str>, hash: &mut HashMap<(i32, i32), bool>, num_tails: usize) { | ||||
|     let mut head = (0i32, 0i32); | ||||
|     let mut tails: Vec<(i32, i32)> = vec![(0, 0); num_tails]; | ||||
| 
 | ||||
|     for line in lines { | ||||
|         let (dir, steps) = line.split_once(" ").unwrap(); | ||||
| 
 | ||||
|         for _ in 0..steps.parse().unwrap() { | ||||
|             match dir { | ||||
|                 "L" => head = (head.0, head.1 - 1), | ||||
|                 "R" => head = (head.0, head.1 + 1), | ||||
|                 "U" => head = (head.0 - 1, head.1), | ||||
|                 "D" => head = (head.0 + 1, head.1), | ||||
|                 _ => (), | ||||
|             } | ||||
|             // println!("\nnew head location {:?}", head);
 | ||||
| 
 | ||||
|             let mut parent = head; | ||||
| 
 | ||||
|             for tail_i in 0..num_tails { | ||||
|                 let mut tail = tails[tail_i]; | ||||
| 
 | ||||
|                 // find the distance from parent to tail
 | ||||
|                 let v_dist = parent.0 - tail.0; | ||||
|                 let h_dist = parent.1 - tail.1; | ||||
|                 let mut already_moved_diagonally = false; | ||||
| 
 | ||||
|                 // move vertically
 | ||||
|                 if v_dist.abs() > 1 { | ||||
|                     let v_diff = v_dist / v_dist.abs(); | ||||
|                     tail = (tail.0 + v_diff, tail.1); | ||||
| 
 | ||||
|                     // do we need to move horizontally?
 | ||||
|                     if parent.1 != tail.1 { | ||||
|                         let h_diff = h_dist / h_dist.abs(); | ||||
|                         tail = (tail.0, tail.1 + h_diff); | ||||
|                         already_moved_diagonally = true; | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 // move horizontally
 | ||||
|                 if h_dist.abs() > 1 && !already_moved_diagonally { | ||||
|                     let h_diff = h_dist / h_dist.abs(); | ||||
|                     tail = (tail.0, tail.1 + h_diff); | ||||
| 
 | ||||
|                     // do we need to move horizontally?
 | ||||
|                     if parent.0 != tail.0 { | ||||
|                         let v_diff = v_dist / v_dist.abs(); | ||||
|                         tail = (tail.0 + v_diff, tail.1); | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 // println!("new tail ({:?}) location {:?}", tail_i + 1, tail);
 | ||||
|                 if tail_i == num_tails - 1 { | ||||
|                     // for the last tail, record where it has been
 | ||||
|                     hash.insert(tail, true); | ||||
|                 } | ||||
| 
 | ||||
|                 tails[tail_i] = tail; | ||||
|                 parent = tail; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         let mut temp = tails.to_owned(); | ||||
|         temp.insert(0, head); | ||||
|         display(temp); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn display(rope: Vec<(i32, i32)>) -> () { | ||||
|     let v_min = rope.iter().map(|x| x.0).min().unwrap(); | ||||
|     let v_max = rope.iter().map(|x| x.0).max().unwrap(); | ||||
|     let h_min = rope.iter().map(|x| x.1).min().unwrap(); | ||||
|     let h_max = rope.iter().map(|x| x.1).max().unwrap(); | ||||
| 
 | ||||
|     for v in v_min..=v_max { | ||||
|         for h in h_min..=h_max { | ||||
|             match rope.iter().position(|&x| x == (v, h)) { | ||||
|                 Some(i) => print!("{i}"), | ||||
|                 None => print!("."), | ||||
|             } | ||||
|         } | ||||
|         println!(""); | ||||
|     } | ||||
|     println!(""); | ||||
| } | ||||
| @ -0,0 +1,8 @@ | ||||
| R 4 | ||||
| U 4 | ||||
| L 3 | ||||
| D 1 | ||||
| R 4 | ||||
| D 1 | ||||
| L 5 | ||||
| R 2 | ||||
| @ -0,0 +1,8 @@ | ||||
| R 5 | ||||
| U 8 | ||||
| L 8 | ||||
| D 3 | ||||
| R 17 | ||||
| D 10 | ||||
| L 25 | ||||
| U 20 | ||||
					Loading…
					
					
				
		Reference in New Issue