diff --git a/2016/input/day_02.txt b/2016/input/day_02.txt new file mode 100644 index 0000000..799cb46 --- /dev/null +++ b/2016/input/day_02.txt @@ -0,0 +1,5 @@ +RDRRDLRRUDRUUUULDDRDUULLDUULDURDDUDRULDLUDDRLRDUDDURRRRURDURLLRDRUUULDLLLURDRLLULLUULULLLDLLLRRURRLRDUULRURRUDRRDRLURLRURLLULRUURRUURDDLDRDLDLLUDUULLLUUUUDULLDRRUURLDURDDDDDRLLRRURDLUDRRUUDLRRLLRDURDUDDDLRDDRDLRULLUULRULRLLULDDRURUUDLDDULDRLLURDDUDDUDRDUDLDRRRDURRLDRDRLDLLDUDDDULULRRULRLLURDRRDDUUUUUULRUDLRRDURDLRDLUDLDURUDDUUURUDLUUULDLRDURDLDUUDLDDDURUUDUUDRLRDULLDUULUDRUDRLRRRDLLDRUDULRRUDDURLDRURRLLRRRDRLLDLULULRRUURRURLLUDRRLRULURLDDDDDURUDRRRRULLUUDLDDLUUL +ULURUDLULDULDLLDDLLLDRRLLUDRRDRDUDURUDLRRRRUDRDDURLRRULLDLURLDULLUDDLUDURDUURRRRLDLRLDDULLRURLULLDDRUDLRRRLDRRRDLDRLLDDRRDDLUUDRUDDLULRURLDURRLLDLRUDLLRRUULUDRLLLRLDULURRRRRDDUURDRRUUDULRUULDDULRLUDLUDDULLRLRDDLRLLURRRULDLRRRUURRLDDRDLRDLRRDRDLDRDUDRDURUUDRLRRULRDLLDLLRRRDRLDRLRLRLLLURURDULUUDDRLLDDDRURRURLRDDULLRURUDRRDRLRRRLDLRLRULDRLUURRUUULRLDLLURLLLDLLLDRRDULRURRRRLUDLLRRUDLRUDRURDRRDLUUURRDLRLRUUUDURDLUDURRUUDURLUDDDULLDRDLLDDDRLDDDRLDLDDDDUDUUDURUUDULRDDLULDRDRLURLUDRDLUULLULRLULRDDRULDUDDURUURULUDLUURLURU +URLURDDRLLURRRLDLDLUDUURDRUDLLLRRDLUUULRRLURRRLUDUDLRLDDRUDLRRRULUDUDLLLULULLLRUDULDDDLLLRRRLRURDULUDDDULDLULURRRDLURDLRLLDUDRUDURDRRURULDRDUDLLRDDDUDDURLUULLULRDRRLDDLDURLRRRLDRDLDULRULRRRLRLLDULRDLURLRUUDURRUUDLLUDRUDLRLDUUDLURRRDDUUDUDRLDLDDRURDDLLDDRDLRLRDLLLUDLUUDRLRLRDDRDLRDLLUULLLLUULLDLLDLRDLRLRRLUUDLLRLRUDRURULRLRLULUDRLLUDDUDDULRLDDRUUUURULDRRULLLDUURULUDRLLURLRRLDLRRLDDRRRDUDDUDLDDLULUDDUURDLLLRLDLRDRUUUUUDDDLDRDDRRRLRURRRRDURDRURUDLURRURDRLRUUDDLDRRULLDURDRLRRDURURUULRDUDLDRDDLULULRDRRUDDRLLRLULRLLUUDRDUUDDUDLRUUDLLUULLRUULUDDLURRRLLDRLRRLLRULLDUULURLLLLUUULDR +LDUURULLRLDRRUUDUUUURUUUDDDURRDDLRDLLRDDRULDDUURUDDURLLUDRDUDRDULDRRRLULUDRULLLLDRLLDRDLDLLRURULUDDDDURDDDRLLUDLDRULRDLDUDDDUUDLLRLLLDLRLRLRRUDDULDDDUDLDDLUDDULDLLLLULLLLDDURDDURRRDDRLRLLUDLLUDDDUDURUDRLRDRULULDDRULDLULULLRUULRLDULUURRDRDRRDLDDDRRLUULDLUDRDDUDLRURULLDDURLDDRULUDLDDDRDRLLRDLLUURRRURDRLRURLDDLURDRURDDURLLRLRUDUUDLDUDURRDDURDRDDUDDDUDUURURDDLLRUUDDRRDULDDLLDLRULUULRUUDLLDRLULDULDDUDLULRULDRLLDUULDDDLRLLRLULDDULDDRRRLDRRLURULRDDRDLRRDUDDRDRRRRUDUDLLRRDRRURRUURDRULDDUDURLUDDURDUDRDUULLDRURUURURDRRLDDLDLUURLULRUDURDRUUURRURRDRUDRUURDURLRULULLLULDLLDLRRLDRDLUULUDDDLRDRLRLDRUDUDRLLRL +LURLUURLURDUUDRUDLDLLURRRDLDRRRULDDRRDRDUUDRUDURDDDURLUDDLULUULRRLLRULUDRDDRRRLDURDUDDURDDDLRLDDLULLDRDDLUUDUURRRLULRUURRRRLLULDUDRDUURRRURRDRDUDUDLUDULLDLDDRLUDRURDULURLURRLLURLLLRLUURLRUDLUDDRLURRUULULRLURRURUDURDLDLDDUDDRDLLRLLRRULDDRUDURUDDDUDLLRDLRUDULLLRRRUURUDUUULLRDUDRURUDULLDLLUUUDRULRLLRRDDDDUDULDRDRLLDDLLDDDURRUDURLDLRDRUURDDURLRDRURLRRLLRLULDRRLRUDURDUURRLUUULUDDDLRLULRDRLLURRRDLURDUUDRRRLUURRLLUDLUDLUULLRRDLLRDDRURRUURLDDLRLRLRUDLDLRLRDRRDLLLRDLRDUDLLDDDRD \ No newline at end of file diff --git a/2016/rust/src/day_02.rs b/2016/rust/src/day_02.rs new file mode 100644 index 0000000..8073eec --- /dev/null +++ b/2016/rust/src/day_02.rs @@ -0,0 +1,95 @@ +use std::char; + +pub fn solve(input: &str) -> String { + let arrangement = vec![ + vec!['1', '2', '3'], + vec!['4', '5', '6'], + vec!['7', '8', '9'], + ]; + let mut keypad = Keypad { + arrangement: arrangement, + current: (1, 1), + }; + + 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!(); }, + } + } + answer.push(keypad.button()); + answer +} + +#[test] +fn test_solve() { + let instructions = "ULL +RRDDD +LURDL +UUUUD"; + + assert_eq!(solve(instructions), "1985".to_string()); +} + +struct Keypad { + arrangement: Vec>, + current: (usize, usize), +} + +impl Keypad { + fn move_(&mut self, dir: Dir) { + let (dx, dy): (isize, isize) = match dir { + Dir::Up => (0, -1), + Dir::Down => (0, 1), + Dir::Left => (-1, 0), + Dir::Right => (1, 0), + }; + + let x = (self.current.0 as isize + dx) as usize; + let y = (self.current.1 as isize + dy) as usize; + + if self.button_at(x, y).is_some() { + self.current = (x, y); + } + } + + fn button(&self) -> char { + let (x, y) = self.current; + self.arrangement[y][x].clone() + } + + fn button_at(&self, x: usize, y: usize) -> Option { + self.arrangement.get(y).and_then(|row| row.get(x)).cloned() + } +} + +enum Dir { + Up, Down, Left, Right +} + +#[test] +fn test_keypad() { + let arrangement = vec![ + vec!['1', '2', '3'], + vec!['4', '5', '6'], + vec!['7', '8', '9'], + ]; + let mut keypad = Keypad { + arrangement: arrangement, + current: (1, 1), + }; + + assert_eq!(keypad.button_at(1, 1), Some('5')); + assert_eq!(keypad.button(), '5'); + + keypad.move_(Dir::Up); + assert_eq!(keypad.button(), '2'); + + keypad.move_(Dir::Up); + assert_eq!(keypad.button(), '2'); +} diff --git a/2016/rust/src/lib.rs b/2016/rust/src/lib.rs index 83a7f75..f396c42 100644 --- a/2016/rust/src/lib.rs +++ b/2016/rust/src/lib.rs @@ -1 +1,2 @@ pub mod day_01; +pub mod day_02; diff --git a/2016/rust/src/main.rs b/2016/rust/src/main.rs index 3742d65..bbd3b10 100644 --- a/2016/rust/src/main.rs +++ b/2016/rust/src/main.rs @@ -8,5 +8,5 @@ fn main() { let mut input = String::new(); io::stdin().read_to_string(&mut input).ok(); - println!("{}", day_01::solve(&input)); + println!("{}", day_02::solve(&input)); }