From 0e0f2b3f298b98e12a91098ef8581f870f2982cc Mon Sep 17 00:00:00 2001 From: Bert Peters Date: Fri, 2 Dec 2016 12:43:48 +0100 Subject: [PATCH] Add solutions for day 2. --- 2016/day-02/input.txt | 5 +++ 2016/day-02/sample.txt | 4 ++ 2016/day-02/solution.rs | 85 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 2016/day-02/input.txt create mode 100644 2016/day-02/sample.txt create mode 100644 2016/day-02/solution.rs diff --git a/2016/day-02/input.txt b/2016/day-02/input.txt new file mode 100644 index 0000000..736d9a7 --- /dev/null +++ b/2016/day-02/input.txt @@ -0,0 +1,5 @@ +RDRRDLRRUDRUUUULDDRDUULLDUULDURDDUDRULDLUDDRLRDUDDURRRRURDURLLRDRUUULDLLLURDRLLULLUULULLLDLLLRRURRLRDUULRURRUDRRDRLURLRURLLULRUURRUURDDLDRDLDLLUDUULLLUUUUDULLDRRUURLDURDDDDDRLLRRURDLUDRRUUDLRRLLRDURDUDDDLRDDRDLRULLUULRULRLLULDDRURUUDLDDULDRLLURDDUDDUDRDUDLDRRRDURRLDRDRLDLLDUDDDULULRRULRLLURDRRDDUUUUUULRUDLRRDURDLRDLUDLDURUDDUUURUDLUUULDLRDURDLDUUDLDDDURUUDUUDRLRDULLDUULUDRUDRLRRRDLLDRUDULRRUDDURLDRURRLLRRRDRLLDLULULRRUURRURLLUDRRLRULURLDDDDDURUDRRRRULLUUDLDDLUUL +ULURUDLULDULDLLDDLLLDRRLLUDRRDRDUDURUDLRRRRUDRDDURLRRULLDLURLDULLUDDLUDURDUURRRRLDLRLDDULLRURLULLDDRUDLRRRLDRRRDLDRLLDDRRDDLUUDRUDDLULRURLDURRLLDLRUDLLRRUULUDRLLLRLDULURRRRRDDUURDRRUUDULRUULDDULRLUDLUDDULLRLRDDLRLLURRRULDLRRRUURRLDDRDLRDLRRDRDLDRDUDRDURUUDRLRRULRDLLDLLRRRDRLDRLRLRLLLURURDULUUDDRLLDDDRURRURLRDDULLRURUDRRDRLRRRLDLRLRULDRLUURRUUULRLDLLURLLLDLLLDRRDULRURRRRLUDLLRRUDLRUDRURDRRDLUUURRDLRLRUUUDURDLUDURRUUDURLUDDDULLDRDLLDDDRLDDDRLDLDDDDUDUUDURUUDULRDDLULDRDRLURLUDRDLUULLULRLULRDDRULDUDDURUURULUDLUURLURU +URLURDDRLLURRRLDLDLUDUURDRUDLLLRRDLUUULRRLURRRLUDUDLRLDDRUDLRRRULUDUDLLLULULLLRUDULDDDLLLRRRLRURDULUDDDULDLULURRRDLURDLRLLDUDRUDURDRRURULDRDUDLLRDDDUDDURLUULLULRDRRLDDLDURLRRRLDRDLDULRULRRRLRLLDULRDLURLRUUDURRUUDLLUDRUDLRLDUUDLURRRDDUUDUDRLDLDDRURDDLLDDRDLRLRDLLLUDLUUDRLRLRDDRDLRDLLUULLLLUULLDLLDLRDLRLRRLUUDLLRLRUDRURULRLRLULUDRLLUDDUDDULRLDDRUUUURULDRRULLLDUURULUDRLLURLRRLDLRRLDDRRRDUDDUDLDDLULUDDUURDLLLRLDLRDRUUUUUDDDLDRDDRRRLRURRRRDURDRURUDLURRURDRLRUUDDLDRRULLDURDRLRRDURURUULRDUDLDRDDLULULRDRRUDDRLLRLULRLLUUDRDUUDDUDLRUUDLLUULLRUULUDDLURRRLLDRLRRLLRULLDUULURLLLLUUULDR +LDUURULLRLDRRUUDUUUURUUUDDDURRDDLRDLLRDDRULDDUURUDDURLLUDRDUDRDULDRRRLULUDRULLLLDRLLDRDLDLLRURULUDDDDURDDDRLLUDLDRULRDLDUDDDUUDLLRLLLDLRLRLRRUDDULDDDUDLDDLUDDULDLLLLULLLLDDURDDURRRDDRLRLLUDLLUDDDUDURUDRLRDRULULDDRULDLULULLRUULRLDULUURRDRDRRDLDDDRRLUULDLUDRDDUDLRURULLDDURLDDRULUDLDDDRDRLLRDLLUURRRURDRLRURLDDLURDRURDDURLLRLRUDUUDLDUDURRDDURDRDDUDDDUDUURURDDLLRUUDDRRDULDDLLDLRULUULRUUDLLDRLULDULDDUDLULRULDRLLDUULDDDLRLLRLULDDULDDRRRLDRRLURULRDDRDLRRDUDDRDRRRRUDUDLLRRDRRURRUURDRULDDUDURLUDDURDUDRDUULLDRURUURURDRRLDDLDLUURLULRUDURDRUUURRURRDRUDRUURDURLRULULLLULDLLDLRRLDRDLUULUDDDLRDRLRLDRUDUDRLLRL +LURLUURLURDUUDRUDLDLLURRRDLDRRRULDDRRDRDUUDRUDURDDDURLUDDLULUULRRLLRULUDRDDRRRLDURDUDDURDDDLRLDDLULLDRDDLUUDUURRRLULRUURRRRLLULDUDRDUURRRURRDRDUDUDLUDULLDLDDRLUDRURDULURLURRLLURLLLRLUURLRUDLUDDRLURRUULULRLURRURUDURDLDLDDUDDRDLLRLLRRULDDRUDURUDDDUDLLRDLRUDULLLRRRUURUDUUULLRDUDRURUDULLDLLUUUDRULRLLRRDDDDUDULDRDRLLDDLLDDDURRUDURLDLRDRUURDDURLRDRURLRRLLRLULDRRLRUDURDUURRLUUULUDDDLRLULRDRLLURRRDLURDUUDRRRLUURRLLUDLUDLUULLRRDLLRDDRURRUURLDDLRLRLRUDLDLRLRDRRDLLLRDLRDUDLLDDDRD diff --git a/2016/day-02/sample.txt b/2016/day-02/sample.txt new file mode 100644 index 0000000..5139196 --- /dev/null +++ b/2016/day-02/sample.txt @@ -0,0 +1,4 @@ +ULL +RRDDD +LURDL +UUUUD diff --git a/2016/day-02/solution.rs b/2016/day-02/solution.rs new file mode 100644 index 0000000..b2ac5b6 --- /dev/null +++ b/2016/day-02/solution.rs @@ -0,0 +1,85 @@ +use std::cmp::min; +use std::io::prelude::*; +use std::io::BufReader; +use std::fs::File; +use std::path::Path; +use std::env; + +fn move_pos1(pos: i32, instruction: char) -> i32 +{ + match instruction { + 'U' => if pos > 3 { pos - 3 } else { pos }, + 'D' => if pos < 7 { pos + 3 } else { pos }, + 'L' => if pos % 3 != 1 { pos - 1 } else { pos }, + 'R' => if pos % 3 != 0 { pos + 1 } else { pos }, + _ => panic!("Unsupported direction {}", instruction), + } +} + +fn row_width(y: i32) -> i32 +{ + min(2 * y + 1, 9 - 2 * y) +} + +fn row_offset(y: i32) -> i32 +{ + (5 - row_width(y)) / 2 +} + +fn is_legal(pos: (i32, i32)) -> bool { + let (x, y) = pos; + let width = row_width(y); + let offset = row_offset(y); + + y >= 0 && y < 5 && x >= offset && x < offset + width +} + +fn move_pos2(pos: (i32, i32), instruction: char) -> (i32, i32) +{ + let (x, y) = pos; + let new_pos = match instruction { + 'U' => (x, y - 1), + 'D' => (x, y + 1), + 'L' => (x - 1, y), + 'R' => (x + 1, y), + _ => panic!("Unsupported direction {}", instruction), + }; + + if is_legal(new_pos) { new_pos } else { pos } +} + +fn pos2char(pos: (i32, i32)) -> String +{ + let (x, y) = pos; + let mut num = x + 1 - row_offset(y); + for i in 0..y { + num += row_width(i); + } + + format!("{:X}", num) +} + +fn main() +{ + let args: Vec = env::args().collect(); + let path = Path::new(&args[1]); + let f = File::open(&path).expect("Could not open file"); + let reader = BufReader::new(f); + + let mut pos1 = 5; + let mut pos2 = (0, 2); + let mut code1 = String::new(); + let mut code2 = String::new(); + for line in reader.lines() { + for instruction in line.unwrap().trim().chars() { + pos1 = move_pos1(pos1, instruction); + pos2 = move_pos2(pos2, instruction); + } + + code1 += &pos1.to_string(); + code2 += &pos2char(pos2); + } + + println!("Code 1 is {}", code1); + println!("Code 2 is {}", code2); +}