Compare commits
No commits in common. "daad18c6af28c2a944490c10bcff9cba7a031de8" and "7896aafcd779f298102cd53ad5b9f72f77d7ef19" have entirely different histories.
daad18c6af
...
7896aafcd7
2 changed files with 17 additions and 48 deletions
|
@ -1,4 +1,3 @@
|
||||||
#![feature(iterator_try_reduce)]
|
|
||||||
#![warn(clippy::pedantic)]
|
#![warn(clippy::pedantic)]
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
|
@ -8,14 +7,15 @@ use std::{
|
||||||
|
|
||||||
use aoc::vec2::{Direction, Vec2};
|
use aoc::vec2::{Direction, Vec2};
|
||||||
|
|
||||||
fn knot_movement(previous: Vec2, knot: Vec2) -> Option<Vec2> {
|
fn tail_movement(following: Vec2, tail: Vec2) -> Vec2 {
|
||||||
let (dx, dy) = (previous - knot).into();
|
let (dx, dy) = (following - tail).into();
|
||||||
|
|
||||||
if dx.abs() <= 1 && dy.abs() <= 1 {
|
let movement = if dx.abs() <= 1 && dy.abs() <= 1 {
|
||||||
None
|
(0, 0)
|
||||||
} else {
|
} else {
|
||||||
Some((dx.signum(), dy.signum()).into())
|
(dx.signum(), dy.signum())
|
||||||
}
|
};
|
||||||
|
movement.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn simulate_knots(num_knots: usize, instructions: &[(Direction, usize)]) -> usize {
|
fn simulate_knots(num_knots: usize, instructions: &[(Direction, usize)]) -> usize {
|
||||||
|
@ -31,12 +31,15 @@ fn simulate_knots(num_knots: usize, instructions: &[(Direction, usize)]) -> usiz
|
||||||
for _i in 0..*distance {
|
for _i in 0..*distance {
|
||||||
knots[0] += Vec2::from(*direction);
|
knots[0] += Vec2::from(*direction);
|
||||||
|
|
||||||
if let Some(tail) = knots.iter_mut().try_reduce(|previous, knot| {
|
let tail = knots
|
||||||
*knot += knot_movement(*previous, *knot)?;
|
.iter_mut()
|
||||||
Some(knot)
|
.reduce(|following, knot| {
|
||||||
}) {
|
*knot += tail_movement(*following, *knot);
|
||||||
tail_positions.insert(tail.copied().unwrap());
|
knot
|
||||||
}
|
})
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
tail_positions.insert(*tail);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
use std::{
|
use std::{
|
||||||
fmt,
|
ops::{Add, AddAssign, Sub, SubAssign},
|
||||||
ops::{Add, AddAssign, Mul, Sub, SubAssign},
|
|
||||||
str::FromStr,
|
str::FromStr,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -23,17 +22,6 @@ impl Vec2 {
|
||||||
y: f(self.y),
|
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 {
|
impl Add for Vec2 {
|
||||||
|
@ -72,28 +60,6 @@ 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 {
|
impl From<(i32, i32)> for Vec2 {
|
||||||
fn from((x, y): (i32, i32)) -> Self {
|
fn from((x, y): (i32, i32)) -> Self {
|
||||||
Self { x, y }
|
Self { x, y }
|
||||||
|
|
Loading…
Reference in a new issue