Struct aoc::year2021::day23::Room

source ·
struct Room {
    packed: u16,
}
Expand description

Pack the room state into only 2 bytes.

We use 3 bits for each amphipod plus a marker bit for a maximum of 13 bits. The room is a stack with the amphipod closest to the hallway in the least significant position.

The marker bit is used to determine how full a room is and to disambiguate empty from the A type.

Some example rooms:

  • Empty room 0000000000000001
  • Room with two As 0000000001000000
  • Room with ABCD where A is closest to hallway 0001011010001000

Fields§

§packed: u16

Implementations§

source§

impl Room

source

fn new(spaces: [usize; 4]) -> Room

Pack state into a compact u16 representation.

source

fn size(self) -> usize

The marker bit is always in the most significant position, so can be used to find out the size of a room.

source

fn peek(self) -> Option<usize>

Find the type of an amphipod closest to the hallway.

source

fn pop(&mut self) -> usize

Remove the top amphipod.

source

fn open(self, kind: usize) -> bool

A room is “open” if amphipods of that type can move to it. This means that it must be empty or only already contain amphipods of that type.

We use a multiplication by a constant to figure out the bit pattern. For example a room with three Bs would have a bit pattern of 0000001001001001 which is the marker bit plus B << 6 + B << 3 + B << 0 = B * 64 + B * 8 + B = B * 73.

source

fn push(&mut self, kind: usize)

Return an amphipod to the correct room.

source

fn spaces(self, index: usize) -> usize

Returns the amphipod at a specific index from the bottom of the burrow. 0 is the bottom amphipod furthest from the hallway, 1 the next closest and so on.

Trait Implementations§

source§

impl Clone for Room

source§

fn clone(&self) -> Room

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Hash for Room

source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl PartialEq for Room

source§

fn eq(&self, other: &Room) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Copy for Room

source§

impl Eq for Room

source§

impl StructuralPartialEq for Room

Auto Trait Implementations§

§

impl Freeze for Room

§

impl RefUnwindSafe for Room

§

impl Send for Room

§

impl Sync for Room

§

impl Unpin for Room

§

impl UnwindSafe for Room

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> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

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.

source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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.