advent_of_code_2024::day_21

Struct KeyPad

source
struct KeyPad<T> {
    controller: Option<Rc<RefCell<KeyPad<DirectionalButton>>>>,
    cache: HashMap<(KeyPadButton<T>, KeyPadButton<T>), usize>,
}
Expand description

Encodes a KeyPad. The layout comes from the button input type (T)(

Fields§

§controller: Option<Rc<RefCell<KeyPad<DirectionalButton>>>>§cache: HashMap<(KeyPadButton<T>, KeyPadButton<T>), usize>

Implementations§

source§

impl<T> KeyPad<T>
where T: Keys<T> + Copy + Clone + Eq + Hash,

source

fn direct_entry() -> KeyPad<T>

A new KeyPad that expects a person to be pressing the keys

source

fn controlled_by(controller: KeyPad<DirectionalButton>) -> KeyPad<T>

A new KeyPad that expects a robot arm controlled by another pad to be pressing the keys

source

fn repeat( positive: DirectionalButton, negative: DirectionalButton, a: u8, b: u8, ) -> Vec<DirectionalButton>

Given positive and negative unit length movement keys for an axis, and a start and end point on that axis, return the list of movements to move from the start to the end.

source

fn check_moves(moves: &Vec<&DirectionalButton>, start: &(u8, u8)) -> bool

Given a list of moves, follow them and check it doesn’t leave the key pad

source

fn controller_presses(&mut self, moves: Vec<&DirectionalButton>) -> usize

Given a list of moves, pass those up the keypad chain to get the total key presses needed for that move.

source

fn presses_for_pair( &mut self, (a, b): (KeyPadButton<T>, KeyPadButton<T>), ) -> usize

Work out the valid paths between two keys and recurse the required movements up the keypad chain to find the route with the shortest number of presses. The result is cached for performance.

source

fn key_presses(&mut self, keys: &Vec<T>) -> usize

Solves the puzzle for this keypad chain, return the number of key presses needed at the top of the keypad chain to press the expected list of keys on this keypad.

Auto Trait Implementations§

§

impl<T> Freeze for KeyPad<T>

§

impl<T> !RefUnwindSafe for KeyPad<T>

§

impl<T> !Send for KeyPad<T>

§

impl<T> !Sync for KeyPad<T>

§

impl<T> Unpin for KeyPad<T>
where T: Unpin,

§

impl<T> !UnwindSafe for KeyPad<T>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> MaybeSendSync for T