Watch
1
0
Fork
You've already forked advent-of-code
0
This commit is contained in:
Jeremy Kaplan 2022-12-08 22:39:03 -08:00
commit e014644461

View file

@ -8,45 +8,40 @@ use serde::{
const INPUT: &str = include_str!("../../input/day09.txt"); const INPUT: &str = include_str!("../../input/day09.txt");
fn main() { fn main() {
println!("{}", part1(INPUT)); println!("{}", simulate(INPUT, 2));
println!("{}", simulate(INPUT, 10));
} }
fn part1(input: &str) -> usize { fn simulate(input: &str, num_knots: usize) -> usize {
let steps = parse_input(input); let steps = parse_input(input);
let num_knots = 10;
let tail = num_knots - 1;
let mut knots = vec![RC::new(0, 0); num_knots]; let mut knots = vec![RC::new(0, 0); num_knots];
let tail = num_knots - 1;
let mut tail_visited: HashSet<RC> = HashSet::new(); let mut tail_visited: HashSet<RC> = HashSet::new();
tail_visited.insert(knots[tail]); tail_visited.insert(knots[tail]);
// render(&knots, &tail_visited);
for step in steps { for step in steps {
println!("> {:?}, {}", step.d, step.n);
for _ in 0..(step.n) { for _ in 0..(step.n) {
knots[0] = knots[0].mv(step.d.delta()); knots[0] = knots[0].mv(step.d.delta());
for i in 1..(knots.len()) { for i in 1..(knots.len()) {
knots[i] = knots[i].follow(knots[i - 1]); knots[i] = knots[i].follow(knots[i - 1]);
} }
// dbg!(head);
// dbg!(tail);
tail_visited.insert(knots[tail]); tail_visited.insert(knots[tail]);
// render(&knots, &tail_visited);
} }
// render(&knots, &tail_visited);
// std::thread::sleep(std::time::Duration::from_millis(500));
} }
render(&knots, &tail_visited); render(&knots, &tail_visited);
tail_visited.len() tail_visited.len()
} }
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
struct Step {
d: Direction,
n: i64,
}
fn parse_input(input: &str) -> Vec<Step> { fn parse_input(input: &str) -> Vec<Step> {
aoc::split_lines(input) aoc::split_lines(input)
.iter() .iter()
@ -61,12 +56,6 @@ fn parse_input(input: &str) -> Vec<Step> {
.collect() .collect()
} }
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
struct Step {
d: Direction,
n: i64,
}
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
struct RC { struct RC {
r: i64, r: i64,
@ -89,27 +78,15 @@ impl RC {
} }
} }
fn follow(&self, head: RC) -> RC { fn follow(&self, target: RC) -> RC {
// dbg!(head.r); let dr = target.r - self.r;
// dbg!(head.c); let dc = target.c - self.c;
// dbg!(self.r);
// dbg!(self.c);
let dr = head.r - self.r;
let dc = head.c - self.c;
// dbg!(dr);
// dbg!(dc);
// Adjacent // Adjacent
if dr.abs() < 2 && dc.abs() < 2 { if dr.abs() < 2 && dc.abs() < 2 {
// dbg!("OK");
return *self; return *self;
} }
// dbg!(sign(dr));
// dbg!(sign(dc));
RC::new(self.r + sign(dr), self.c + sign(dc)) RC::new(self.r + sign(dr), self.c + sign(dc))
} }
} }
@ -164,6 +141,7 @@ fn render(knots: &[RC], tail_visited: &HashSet<RC>) {
} }
}; };
// (r, c) is probably something like (-y, x), but it's too late to change that now...
for r in (lo.r..=hi.r).rev() { for r in (lo.r..=hi.r).rev() {
for c in lo.c..=hi.c { for c in lo.c..=hi.c {
print!("{}", chr(r, c)); print!("{}", chr(r, c));