Add leading 0s to the single digit day crates

This commit is contained in:
Eryn Wells 2022-12-17 19:56:03 -08:00
parent a81545a012
commit 51d2ee871c
33 changed files with 0 additions and 0 deletions

14
2022/day09/Cargo.lock generated Normal file
View file

@ -0,0 +1,14 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
[[package]]
name = "day9"
version = "0.1.0"
dependencies = [
"geometry",
]
[[package]]
name = "geometry"
version = "0.1.0"

9
2022/day09/Cargo.toml Normal file
View file

@ -0,0 +1,9 @@
[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]
geometry = { path = "../geometry" }

2000
2022/day09/input.txt Normal file

File diff suppressed because it is too large Load diff

100
2022/day09/src/main.rs Normal file
View file

@ -0,0 +1,100 @@
use geometry::{Direction, Point};
use std::collections::HashSet;
use std::{env, fs};
type SignedPoint = Point;
struct Rope {
nodes: Vec<SignedPoint>,
}
impl Rope {
fn with_length(length: usize) -> Rope {
Rope {
nodes: vec![SignedPoint::zero(); length],
}
}
fn move_head(&mut self, direction: Direction) {
if let Some(head) = self.nodes.first_mut() {
head.move_by_one_in(direction);
for i in 1..self.nodes.len() {
let first = self.nodes[i - 1].clone();
let mut second = self.nodes.get_mut(i).unwrap();
let distance = second.distance_to(&first);
if distance.0 == 2 {
second.x += 1;
if distance.1 < 0 {
second.y -= 1;
} else if distance.1 > 0 {
second.y += 1;
}
} else if distance.0 == -2 {
second.x -= 1;
if distance.1 < 0 {
second.y -= 1;
} else if distance.1 > 0 {
second.y += 1;
}
} else if distance.1 == 2 {
second.y += 1;
if distance.0 < 0 {
second.x -= 1;
} else if distance.0 > 0 {
second.x += 1;
}
} else if distance.1 == -2 {
second.y -= 1;
if distance.0 < 0 {
second.x -= 1;
} else if distance.0 > 0 {
second.x += 1;
}
}
}
}
}
}
pub fn main() {
let args: Vec<String> = env::args().collect();
let filename = args.get(1).expect("Missing filename argument");
let file_contents = fs::read_to_string(&filename).expect("Unable to read file");
let mut visited_points: HashSet<SignedPoint> = HashSet::new();
let mut long_rope_visited_points: HashSet<SignedPoint> = HashSet::new();
let mut rope = Rope::with_length(2);
let mut long_rope = Rope::with_length(10);
for line in file_contents.lines() {
let mut split_line = line.split(" ");
let direction = Direction::from_relative_direction(split_line.next().unwrap()).unwrap();
let count = u8::from_str_radix(split_line.next().unwrap(), 10).unwrap();
for _ in 0..count {
rope.move_head(direction);
if let Some(last_node) = rope.nodes.last() {
visited_points.insert(last_node.clone());
}
long_rope.move_head(direction);
if let Some(last_node) = long_rope.nodes.last() {
long_rope_visited_points.insert(last_node.clone());
}
}
}
println!(
"Part 1: number of points tail node visited: {}",
&visited_points.len()
);
println!(
"Part 2: number of points tail node of long rope visited: {}",
&long_rope_visited_points.len()
);
}