[2016][rust][12.0] Decrement
diff --git a/2016/rust/src/day_12.rs b/2016/rust/src/day_12.rs
index 92ff01b..13fb643 100644
--- a/2016/rust/src/day_12.rs
+++ b/2016/rust/src/day_12.rs
@@ -89,11 +89,28 @@ impl Increment {
}
// dec x decreases the value of register x by one.
+struct Decrement {
+ register: Register,
+}
+
+impl Decrement {
+ fn run(&self, state: &State) -> State {
+ let pc = state.pc + 1;
+ let mut registers = state.registers.clone();
+ let value = state.value(self.register.into()) - 1;
+ registers.insert(self.register, value);
+ State {
+ pc: pc,
+ registers: registers,
+ }
+ }
+}
+
// jnz x y jumps to an instruction y away (positive means forward; negative means backward), but only if x is not zero.
#[cfg(test)]
mod tests {
- use super::{Variable, Register, State, Copy, Increment};
+ use super::{Variable, Register, State, Copy, Increment, Decrement};
#[test]
fn test_state_value() {
@@ -140,4 +157,19 @@ mod tests {
assert_eq!(increment.run(&state), expected);
}
+
+ #[test]
+ fn test_decrement() {
+ let decrement = Decrement { register: Register::A };
+ let state = State {
+ pc: 0,
+ registers: vec![(Register::A, 41)].into_iter().collect(),
+ };
+ let expected = State {
+ pc: 1,
+ registers: vec![(Register::A, 40)].into_iter().collect(),
+ };
+
+ assert_eq!(decrement.run(&state), expected);
+ }
}