From 1abcc5d723b1cfb7a4ae3c953c698c0809b24ad8 Mon Sep 17 00:00:00 2001 From: Alpha Chen Date: Fri, 2 Dec 2016 09:17:34 -0800 Subject: [PATCH] [2016][rust][2.1] --- 2016/rust/src/day_02.rs | 52 ++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) 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>, + arrangement: Vec>>, 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 { - 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),