This commit is contained in:
Adam Jeniski 2022-12-09 20:35:40 -05:00
parent 7de62c73bf
commit 6b1de80d54
4 changed files with 2150 additions and 0 deletions

2000
2022/input/day_9.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,8 @@
R 5
U 8
L 8
D 3
R 17
D 10
L 25
U 20

141
2022/src/day_9.rs Normal file
View File

@ -0,0 +1,141 @@
use std::collections::HashSet;
use Direction::*;
#[derive(Debug)]
enum Direction {
L,
R,
U,
D,
}
#[derive(Debug)]
struct Instruction {
direction: Direction,
steps: i32,
}
#[derive(Debug, PartialEq, Eq, Hash, Clone, Copy)]
struct Location {
x: i32,
y: i32,
}
type Data = Vec<Instruction>;
type Output = usize;
fn parse(input: &str) -> Data {
input
.lines()
.map(|line| {
let (direction, steps) = line.split_once(' ').unwrap();
Instruction {
direction: match direction {
"L" => L,
"R" => R,
"D" => D,
"U" => U,
_ => panic!("expected L, R, D, or U. got {}", direction),
},
steps: steps.parse().unwrap(),
}
})
.collect()
}
fn part_one(data: Data) -> Output {
let mut locations = HashSet::<Location>::new();
let mut head = Location { x: 0, y: 0 };
let mut tail = head;
locations.insert(tail);
for instr in data {
for _ in 0..instr.steps {
// println!("{:?}", tail);
match instr.direction {
L => {
head.x -= 1;
if tail.x == head.x + 2 {
tail.x = head.x + 1;
tail.y = head.y;
}
}
R => {
head.x += 1;
if tail.x == head.x - 2 {
tail.x = head.x - 1;
tail.y = head.y;
}
}
U => {
head.y += 1;
if tail.y + 2 == head.y {
tail.x = head.x;
tail.y = head.y - 1;
}
}
D => {
head.y -= 1;
if tail.y == head.y + 2 {
tail.x = head.x;
tail.y = head.y + 1;
}
}
}
locations.insert(tail);
}
}
locations.len()
}
fn part_two(data: Data) -> Output {
let mut locations = HashSet::<Location>::new();
let mut rope = [Location { x: 0, y: 0 }; 10];
locations.insert(rope[9]);
for instr in data {
for _ in 0..instr.steps {
match instr.direction {
L => {
rope[0].x -= 1;
}
R => {
rope[0].x += 1;
}
U => {
rope[0].y += 1;
}
D => {
rope[0].y -= 1;
}
}
for i in 1..rope.len() {
if rope[i].x.abs_diff(rope[i - 1].x) == 2 && rope[i].y.abs_diff(rope[i - 1].y) == 2
{
rope[i] = Location {
x: rope[i - 1].x + if rope[i - 1].x > rope[i].x { -1 } else { 1 },
y: rope[i - 1].y + if rope[i - 1].y > rope[i].y { -1 } else { 1 },
};
} else if rope[i].x >= rope[i - 1].x + 2 {
rope[i].x = rope[i - 1].x + 1;
rope[i].y = rope[i - 1].y;
} else if rope[i].y >= rope[i - 1].y + 2 {
rope[i].x = rope[i - 1].x;
rope[i].y = rope[i - 1].y + 1;
} else if rope[i].y <= rope[i - 1].y - 2 {
rope[i].x = rope[i - 1].x;
rope[i].y = rope[i - 1].y - 1;
} else if rope[i].x <= rope[i - 1].x - 2 {
rope[i].x = rope[i - 1].x - 1;
rope[i].y = rope[i - 1].y;
}
}
locations.insert(rope[rope.len() - 1]);
}
}
locations.len()
}
advent_of_code_macro::generate_tests!(
day 9,
parse,
part_one,
part_two,
sample tests [88, 36],
star tests [6337, 2455]
);

View File

@ -7,3 +7,4 @@ mod day_5;
mod day_6;
mod day_7;
mod day_8;
mod day_9;