|
|
|
@ -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),
|
|
|
|
|