Compare commits

...

3 commits

2 changed files with 48 additions and 17 deletions

View file

@ -1,3 +1,4 @@
#![feature(iterator_try_reduce)]
#![warn(clippy::pedantic)]
use std::{
@ -7,15 +8,14 @@ use std::{
use aoc::vec2::{Direction, Vec2};
fn tail_movement(following: Vec2, tail: Vec2) -> Vec2 {
let (dx, dy) = (following - tail).into();
fn knot_movement(previous: Vec2, knot: Vec2) -> Option<Vec2> {
let (dx, dy) = (previous - knot).into();
let movement = if dx.abs() <= 1 && dy.abs() <= 1 {
(0, 0)
if dx.abs() <= 1 && dy.abs() <= 1 {
None
} else {
(dx.signum(), dy.signum())
};
movement.into()
Some((dx.signum(), dy.signum()).into())
}
}
fn simulate_knots(num_knots: usize, instructions: &[(Direction, usize)]) -> usize {
@ -31,15 +31,12 @@ fn simulate_knots(num_knots: usize, instructions: &[(Direction, usize)]) -> usiz
for _i in 0..*distance {
knots[0] += Vec2::from(*direction);
let tail = knots
.iter_mut()
.reduce(|following, knot| {
*knot += tail_movement(*following, *knot);
knot
})
.unwrap();
tail_positions.insert(*tail);
if let Some(tail) = knots.iter_mut().try_reduce(|previous, knot| {
*knot += knot_movement(*previous, *knot)?;
Some(knot)
}) {
tail_positions.insert(tail.copied().unwrap());
}
}
}

View file

@ -1,5 +1,6 @@
use std::{
ops::{Add, AddAssign, Sub, SubAssign},
fmt,
ops::{Add, AddAssign, Mul, Sub, SubAssign},
str::FromStr,
};
@ -22,6 +23,17 @@ impl Vec2 {
y: f(self.y),
}
}
#[must_use]
pub fn len(self) -> f64 {
(f64::from(self.x).powi(2) + f64::from(self.y).powi(2)).sqrt()
}
}
impl fmt::Display for Vec2 {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", (self.x, self.y))
}
}
impl Add for Vec2 {
@ -60,6 +72,28 @@ impl SubAssign for Vec2 {
}
}
impl Mul<i32> for Vec2 {
type Output = Self;
fn mul(self, n: i32) -> Self::Output {
Vec2 {
x: self.x * n,
y: self.y * n,
}
}
}
impl Mul<Vec2> for i32 {
type Output = Vec2;
fn mul(self, Vec2 { x, y }: Vec2) -> Self::Output {
Vec2 {
x: x * self,
y: y * self,
}
}
}
impl From<(i32, i32)> for Vec2 {
fn from((x, y): (i32, i32)) -> Self {
Self { x, y }