optimize day 9

This commit is contained in:
kageru 2022-12-09 12:25:09 +01:00
parent 5180a1e9e1
commit dd34e0a854
2 changed files with 13 additions and 8 deletions

View File

@ -4,6 +4,7 @@ version = "0.1.0"
edition = "2021" edition = "2021"
[dependencies] [dependencies]
fnv = "1.0.7"
itertools = "0.10.5" itertools = "0.10.5"
paste = "1.0" paste = "1.0"
rayon = "1.6.0" rayon = "1.6.0"

View File

@ -1,6 +1,6 @@
#![feature(test)] #![feature(test)]
extern crate test; extern crate test;
use std::collections::HashSet; use fnv::FnvHashSet as HashSet;
use aoc2022::{boilerplate, common::*}; use aoc2022::{boilerplate, common::*};
@ -21,7 +21,8 @@ fn part2(parsed: &Parsed) -> usize {
fn rope<const KNOTS: usize>(parsed: &Parsed) -> usize { fn rope<const KNOTS: usize>(parsed: &Parsed) -> usize {
let mut knots = [(0i32, 0i32); KNOTS]; let mut knots = [(0i32, 0i32); KNOTS];
let mut positions = HashSet::from([(0, 0)]); let mut positions = HashSet::default();
positions.insert((0, 0));
for &(dir, n) in parsed { for &(dir, n) in parsed {
for _ in 0..n { for _ in 0..n {
match dir { match dir {
@ -31,31 +32,34 @@ fn rope<const KNOTS: usize>(parsed: &Parsed) -> usize {
b'R' => knots[0].0 += 1, b'R' => knots[0].0 += 1,
_ => unreachable!(), _ => unreachable!(),
} }
let mut tail_moved = true;
for i in 0..KNOTS - 1 { for i in 0..KNOTS - 1 {
let ro = knots[i]; let ro = knots[i];
if !step_towards(&mut knots[i + 1], ro) { if !step_towards(&mut knots[i + 1], ro) {
tail_moved = false;
break; break;
} }
} }
positions.insert(knots[KNOTS - 1]); if tail_moved {
positions.insert(knots[KNOTS - 1]);
}
} }
} }
positions.len() positions.len()
} }
#[inline]
fn step_towards(tail: &mut (i32, i32), head: (i32, i32)) -> bool { fn step_towards(tail: &mut (i32, i32), head: (i32, i32)) -> bool {
let xdiff = head.0 - tail.0; let xdiff = head.0 - tail.0;
let ydiff = head.1 - tail.1; let ydiff = head.1 - tail.1;
match (xdiff.abs(), ydiff.abs()) { match (xdiff, ydiff) {
(0 | 1, 0 | 1) => return false, (-1 | 0 | 1, -1 | 0 | 1) => false,
(_, 0) => tail.0 += xdiff.signum(),
(0, _) => tail.1 += ydiff.signum(),
_ => { _ => {
tail.0 += xdiff.signum(); tail.0 += xdiff.signum();
tail.1 += ydiff.signum(); tail.1 += ydiff.signum();
true
} }
} }
true
} }
boilerplate! { boilerplate! {