diff --git a/2016/rust/src/day_02.rs b/2016/rust/src/day_02.rs
index 8073eec..806f06f 100644
--- a/2016/rust/src/day_02.rs
+++ b/2016/rust/src/day_02.rs
@@ -2,24 +2,38 @@ use std::char;
pub fn solve(input: &str) -> String {
let arrangement = vec![
- vec!['1', '2', '3'],
- vec!['4', '5', '6'],
- vec!['7', '8', '9'],
+ vec![None, None, Some('1'), None, None],
+ vec![None, Some('2'), Some('3'), Some('4'), None],
+ vec![Some('5'), Some('6'), Some('7'), Some('8'), Some('9')],
+ vec![None, Some('A'), Some('B'), Some('C'), None],
+ vec![None, None, Some('D'), None, None],
];
let mut keypad = Keypad {
arrangement: arrangement,
- current: (1, 1),
+ current: (0, 2),
};
let mut answer = String::new();
for c in input.chars() {
match c {
- 'U' => { keypad.move_(Dir::Up); },
- 'D' => { keypad.move_(Dir::Down); },
- 'L' => { keypad.move_(Dir::Left); },
- 'R' => { keypad.move_(Dir::Right); },
- '\n' => { answer.push(keypad.button()); },
- _ => { unreachable!(); },
+ 'U' => {
+ keypad.move_(Dir::Up);
+ }
+ 'D' => {
+ keypad.move_(Dir::Down);
+ }
+ 'L' => {
+ keypad.move_(Dir::Left);
+ }
+ 'R' => {
+ keypad.move_(Dir::Right);
+ }
+ '\n' => {
+ answer.push(keypad.button());
+ }
+ _ => {
+ unreachable!();
+ }
}
}
answer.push(keypad.button());
@@ -33,11 +47,11 @@ RRDDD
LURDL
UUUUD";
- assert_eq!(solve(instructions), "1985".to_string());
+ assert_eq!(solve(instructions), "5DB3".to_string());
}
struct Keypad {
- arrangement: Vec<Vec<char>>,
+ arrangement: Vec<Vec<Option<char>>>,
current: (usize, usize),
}
@@ -60,16 +74,19 @@ impl Keypad {
fn button(&self) -> char {
let (x, y) = self.current;
- self.arrangement[y][x].clone()
+ self.arrangement[y][x].unwrap().clone()
}
fn button_at(&self, x: usize, y: usize) -> Option<char> {
- self.arrangement.get(y).and_then(|row| row.get(x)).cloned()
+ self.arrangement.get(y).and_then(|row| row.get(x).and_then(|c| *c))
}
}
enum Dir {
- Up, Down, Left, Right
+ Up,
+ Down,
+ Left,
+ Right,
}
#[test]
@@ -78,7 +95,10 @@ fn test_keypad() {
vec!['1', '2', '3'],
vec!['4', '5', '6'],
vec!['7', '8', '9'],
- ];
+ ]
+ .iter()
+ .map(|row| row.iter().map(|x| Some(*x)).collect())
+ .collect();
let mut keypad = Keypad {
arrangement: arrangement,
current: (1, 1),