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