[2016][rust][2.1]
change youxvmqzyzwyqtwnpqwnsuxulmkwrmnv
commit 7915b5b6a19c42278a1d4bef27875721252fb474
author Alpha Chen <alpha.chen@gmail.com>
date
parent qsuqvvuv
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),