From b50b69b0b9d3ed334f7b609be6065b6547920458 Mon Sep 17 00:00:00 2001 From: Michael Preisach Date: Fri, 25 May 2018 11:10:23 +0200 Subject: [PATCH] level 3 finished --- day3.txt | 1 + src/day2.rs | 10 ----- src/day3.rs | 106 +++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 16 +++++++ src/tests.rs | 118 +++++++++++++++++++++++++++++++++++++-------------- 5 files changed, 209 insertions(+), 42 deletions(-) create mode 100644 day3.txt create mode 100644 src/day3.rs diff --git a/day3.txt b/day3.txt new file mode 100644 index 0000000..6e8d40e --- /dev/null +++ b/day3.txt @@ -0,0 +1 @@ +^^<<>^^>^^^><^>v^>v><><><^^v>v^v>>>^<>v<^<^>>>>><>^>>^>v^>><<^>v>v<>^v^v^vvv><>^^>v><>^><^^^v>>^v^>v><>v^^><vv^<<>v>>><<<>>^^^vv>>>^><<<>><><^>v<>^>v<^v^><<<<>^<>v>^v>vv<^<<>>>>^^v>vv^^<>^<>^^^^<^^^vv<^^v^^>v>^v^^^^>><v<>^v^><>^^><<^^<^^>vv<>v^<^v^>^^>^<>v^^vv<>>v><<<>vvv<>v<>><^<^v<>^vv>^^v<^<>>vv<^>>^>>vv^v>^v^<>^>>>>vv>^^>v>vv>v><^vv^<^<<^^vv^^v>^>>v><^<>v<><>^^<>v>><>^^>^^>>vvv^><<<<<^<^vv<^<>^^^<<<^>^^^vv<>^<>v<^v>^<<>^v<>>v<<^<^<<<><><>^>>>>^>v^v<>vv<^vvv^^^^vv>^v^^v^<^vv<^vv>v<^>vv<>>^>^><^>v>^v>vvv<>^>^v<><>vv>><^v^<><>>v^v^><^<^>vv>v<^>vvv>v<<<<<^>^vv>^><><>^<v^>^><><>>^>^>><^^^>^^>^^v^^<^v^^>v^^>>><<><><>^^<<^^v^>v>><>^^^><^vvv<^^^^^v><<><><>>^>vv>>^vv^^><v<^^>^<^^<^>>>^v<>v<^^^>vvv^v<<^><>>>>v>>>^^vvv^vvv<^^^^v^v^^<<^>v^v^<<><>><^v><<>><<<>^v>v<>^^vv>>^<>v^^<<^v>>v<>>^v^^>><^>v^<^v^^>><>v^>^v^v<<v<><>vv>>>>^>v<>v<<<>^^>vv^v<>^<<<<>>^^>^v<>^v<>>^v^<<^<^>>>^vv<>v^>>v<^^v>>^>><<><<<>>>^v>><^^vv>><>v^><>vv<^^v^^^v<>><^vvv<<^<>v>>>v>><>>><>>^v>v>^^<^>^>v><>vv>^v><<>>>>>>>^<<^vv^^vvvv<^^><<vvv<>^><v<>>^^<<^^vv>v>^vv>>^v^^vvvv>^^>>v^v^^><<^>v>>^^>^<^^<>vvv^vv>v>^v<><^vv^>^v>>>^^<^<^>^v^>^>>>^v>^>^^^>>^<>v^^<>^v<<^^>^^v<^v^>><^v^>^<>>^vv^vv^>v^><^^<^v<^><>v><^v^v^^^v>v^<>^<^^>^v^^<>v^<<>>vv<>>>>v>v<>^>>>v<>^^>^<^><>^><><>^<<>>><<^>^vv^v>>vv^<<^^<<><<^v^>>>v<<<v>^vv<^v>v<^>^^vv>v>><>><>^<>><><<^<<^v^v<v>vvv<^v^^^v^><^v>^<^>^<<>v^<><>>^v<>vvv<^>><^^>^>^v^vv<^><<^v>><^^v>^v<>^>vvvv><^>^<<>v>^>>^<^<<<^v^^^>^>>^>><><<^>v^^>v<<<^>vvv^^<<><^v^v^^^>^^>^vv<>v>>v^>vv^vv>v<^v^^>>^v^v<>>^^><><>>>^>^<>^^v^^><^<>><<^>vv^>>>v<<><<^>vv>vvv>^<><>>>>vv><<><<<<>><v>v^><>v^v^^><>v>v>^^v<^v<>>^^^^^>^^>v<^<^>>>^><^^>><<>>^><>^^^>v^^^>^^v^<>^^><^>>><><^>>vv<^>v<^v>v^<^vv^^><<<><><^v^v>v^>>^^vv^^v>^<^v<>^>^><^^v><^<^<>v^^>^><>>><<<><>v<<^v^^<^><>^<><>v<^^>^^<<>>^><^><^<^>^^v<>v>>><><<>^>v><><<<>^^^v>><<^v>^>>>>^vv<^<>>^<^^<^v>v^<<^<<<<<^<^>>^><<>><>v^v>^<^>v^<>^v^v^v><^vv<<^<>^^^<>^v>^v<>>^>v<<>v<>v^v>v<<<>>v>vv>>v<<>v<>v<^>^>^>v>^>^^^v<<>>>^vvv^^>^^<^vv^^^^>v>^v^>v^^v^>>^v>^vv>^^v^<<<<>^<><^<^<<^^>v^^^v<>>vvv>vv>^<^v>>^v<^^v^v>v<>^v<<<^^v^^^<^v>v^v^v>>v<>^v>vv^v>vv<<^v^v>v>><^vv>>>><<<><>^v^<^vvv>v<>><^v>^>>vv<><><>v><>>><^>vv>>^<>v^>>^><<<^><<>^v^>>><><>vv>^<>^>^v^^><^>>><<>v^<^vv>^<^vv>>vv<><<^><>v<^^<^>vv^^^^vv<<>vv<>v<>>>>^><>^<><>v<>><<>^^vvv>^^^<><>>vvv^v>><>vv^^^v^<<>^^v<><<^^v<>^^>^<^^v>>v^v^^>>v>>>^<<^<>^>^^v>>>>^v<<<^^vv><^>vv<>>vv^>v>>v^vvv^^>vv^<v^>>v^<>>><><<^^<^v>^>>>v>v>^v<>vv>v>^v<<<>><<><><>v^>>>v^>v^>>vv^^^<>>><^>v^<>^^>v<><<<>v^v>^>v<^<>v>v^^>>v>vv^v<>>^^^^<>v^>>>>>>>>^v<^<<>>><<<^<<^>^>v^<>^<<<>v>><^vv^>^>^>>>^v<<>^>^v^><>>v^>v^>^>>v<>vv^v<<>^^>>vv<>vv>>^v<^vv>^v>v<>v^<><>v^^><<<><>^>^v^<>>v^v>v<>>^^<<^<^^vv^<>>^vv^<>>^^^^v>v><^^^v^<<<>^<^<<>><>>v<<^v^>><>>^vv^v>vv>>>>>>^^<<>v^>v^v>^^>>>^v>>^^^<>><>v^<<v>v^^^>^v>^v<^<<><>vv>^^^<^^vv^^>vv>v<<^>^vv><^>^^^^v<v^<<^^>>^^vvvv^v^>vv>>v^vvv<>>^><>>v^^>>^<>>vvvv^>>>v<<^<<^>v^>><<v>v^>^v><>v<<>vv>>><^>>^^v>^>><>vv^><<>>vv<<<^<^^>^<<^>>>>>v>vv<^>^v><>>vv^vvvv>v^>>v><<^^^v>>vv^^>v>^v>^v^^>^<^vvvv<<^>>^<<^^>>^<^>v^><^vv>^^v>>><>v^v>^v<^><<<>vv>v<><>>v^<>^^>^<>^<<^>>vv^><^>v^>>v^>v>vv><>>v<^>><<vvv^vvv^vv^>^>v>>>>vv^>^<>v<^>^<^v>vv<^<<>>^<^<^^<>^<v<<>v>><^v<<^vvv>v>v<<^^<^^>v^^^>^>vv^^^vv>v<>>>vv>><><^><><<>vv>vv^v^>>><>v>>vv>^^vvv^>^^>^>^>^v<<^vv^>vvv^^vv><^>^v^>^><>v<^^vv<^<>>^^v^v>v^vv<>><^v>^<^v>^<>^v>>>><>>>v><^v^vv><<^v<<>^^<^v>vvv<><^^><<^v><>^<^v<^^<^vvvv^^>>>>vv>v>>>v<<<>v^>>vv^vvv<>vvv>>>><>>><>^v>><>>^vv<<^^vv><^v^vv^^^vv>^><^vvv<<>^vvv^>>>^<<<><<<<<^v<^^>>>>^>^v<<<^<^>>v^<<><<^^vvv^>v<>>^^>v>^v>>v>>>^<^<^>v^v^>><>^<<^vvv^^<>^v^>^^<<^>^vv>>v^v^>v>^<^^<>^>^>>>^^vvv^<<>v^<<>><>v<^<^>v^>^vv>^>>^<^v^<<<<^v^>v^><<<><^^^^>v>^^>v><>>^><<><^<>>^^>vv<^><^v^>>>vvv<^<>>^>>^v^<^^v>^^^v<^vv^>>^v><<^<><>>^>vv<<>^^^v^^><>>vv>v^>vvv^^v>^>>^>>v^<<v^<^v^vv^><^<^v<v>^v^<<^^>>^^^v>>>><^^v^>>^^>>^v^<^v>v^v^v^v^>v^vv<><>^^<>^><^^^<<<^v<<>^<^^^^^v^<^<<^^>^vv<>v^>><>>^>v>v<>^>v>><>^<>>>^>^>>v^>v><^vv^>v<v<><^><^v<<>v<>^^><<>v>vv<^vvv><><>vv^<<>^>^<^>>>^v>v<^v^^^vv<>>>^<<^>>><<^^v^>v^<^v>vvv>v^^vv>^^>>v<>^<<>^<><^^v^>><>^>v>>^^^<<^^v<>^^>^<>^>><^>^vvv><^>^<^>^>>vv<^>>^v>>^<>>^^>>>v^>v<>v^^vv>v><^v^^>v<<>v^^<><>^>vvv><^^^>^v^>v>>^vvv<^vv>^^>^>>v<>><<^v<^><>vv^<<^^vv>>^<^><^^v^<<>^v^^>v^>>^^^<^vv>v^>>>vv<<>v>>>^>v^^>v^<<>>vv<<^v>v<<^^>v>>v>v^>>^>>v>^><<^<<>^v>><^^<^<<^>vv<<>^<>^vv>^^^v<^v>vv>^^^^>v>v><<^<<<^vv><^<<<>>v<v>^v^v^<^<^vv>vvv<^^v<>v<<<<>v^<<><<<>v<^>^^v<^^v^>vv>vvv>v>>^><^>>v<v<<^^^v<<^v^^><><<<><<>v>^<<>v<<<^v>>v>><<^<><^v^^v^>^>vvvv<<><<>>^^^>v>v^><>>><^><<><<<^<>v^>>^v^>v^<>>v>^^><^<^v^>v>^vvv<>>v<>^vvvv><<<<<<<v<<<<^v<<><^<<>vv^<<>><^^<<>>>vv>>>>>>^v>v^v^^><<^v^^^<>^>>><>v^v^vvv^>>v>>>^^<<^^vv><<<^^^<<<^^>>>>vvv^v<^>^^>v<^<>v>>>^vv<<^^v^>^>^v>v>v^v^>v<><>>>>><<^v^<>^v<>vvv^>v>v^<><><>^>>><>^>^^<>v^^>^><>><>v^v^^v>>>>vv>>^v<<^v^<>^>v^^>^^<^><<<^^^v^^^^v<^<>v<^^<>vv^^v^<>^<<^>>v>v<<<^^^^vvv^<^<><>v<>><<><<^^^^vv><<>>>^v<<>^>>>v^>v>^^<>^<^>v>^>>>><>^^>v^^v>^vv^^v^><<<>>v<>v<<<>^<^<<>v>>>>^<vvv<^><^<<^>v>>v><>^>>>^v^v>v^^vv^>^<^^>>^><^vv^^vv^<>>^^^^<^^><>>^>>^>^vvv<^<^><>>>^^<><><<>>>>^<<>>>^<^v^>><<^>>>^<^>><>^^<>^v^^vv<><^>vv^^v^<^^^v^vvv^>><>>v<>^<^vvv<<^^>vv^^<<>>><^^vvv<<<^>^<><^>vv^><^<<>vv<>vv>v>v^<<>^^^^v^^^^^<<^><><^^v^>v>^>><^><<>v^>>^vvv>>^<^<>^^v^vv^^v><>>v<<<>v>^<>v<<>v^>^<<><<>v^>v<><^^>^<^v^^><^>vv>^>vvvv>^^><<>vv^>^v<<^<<^<<>vv>>^>>>>>v^v<^v>v>^^^vv^v<^<>v><>>vv>v><>v>^v<><<<<<>v^vv<<<<^<>^>><>^^vv>^<^<<>vv>>vv><>><^^><^<>^><>v^^^^v^^vv<>v<>v>^vv^>^<>^^^>v^>>>v><<^>>v<^v<>^^v<><<>v<^<^>v<>v^>v>^^<<<^^vv^<><<<>>v>^^<>v>>>><<>v^v<>v>><<<<^<<^>^>v^vv^><^v^^<>^^><>vv>^>vvv<^v^>>^>^>^^<<^>^>^v><>>^<^^v>^>>^^<><>>>^^>^^vvv>v<^^<>v^v^^v^v>><<^^^>>v>^vv>^>^^v<>^^<>v^^<>v^><<>vv<<^vvvv><<v>v^>v^<>v^>^^<>^>^^v<>><<<>^v^^v^v<<<^v^<>^<>v>^^>vv>^^<<<><<^>v<^^<^<<>^>>>>>^v^v<vvv<<>v>v>>^v^v^>><<<<>v^<<>>>^>>^>>< \ No newline at end of file diff --git a/src/day2.rs b/src/day2.rs index 0d5616f..1d734ee 100644 --- a/src/day2.rs +++ b/src/day2.rs @@ -66,14 +66,4 @@ struct Box { l: i32, w: i32, h: i32, -} - -impl Box { - pub fn new() -> Box { - Box { - l: 0, - w: 0, - h: 0, - } - } } \ No newline at end of file diff --git a/src/day3.rs b/src/day3.rs new file mode 100644 index 0000000..8926745 --- /dev/null +++ b/src/day3.rs @@ -0,0 +1,106 @@ +pub struct Data { + inst: Vec, +} + +impl Data { + pub fn new() -> Data { + Data { + inst: Vec::new(), + } + } + + pub fn parse(&mut self, input: String) { + for c in input.chars() { + match c { + '^' => { + self.inst.push(Dir::North); + }, + '>' => { + self.inst.push(Dir::East); + }, + 'v' => { + self.inst.push(Dir::South); + }, + '<' => { + self.inst.push(Dir::West); + }, + _ => (), + } + } + } + + + pub fn visit(&mut self) -> i32 { + let mut pos = Point{x: 0, y: 0}; + let mut way = Vec::new(); + way.push(pos); + for d in self.inst.clone() { + pos.walk(d, 1); + way.push(pos); + } + way.sort_by(|a, b| a.abs().cmp(&b.abs())); + way.dedup_by(|a, b| a.x == b.x && a.y == b.y); + way.len() as i32 + } + + pub fn robot(&mut self) -> i32 { + let mut pos = Point{x: 0, y: 0}; + let mut way = Vec::new(); + let mut pos_robot = Point{x: 0, y: 0}; + way.push(pos); + way.push(pos_robot); + for (i, d) in self.inst.clone().into_iter().enumerate() { + match i % 2 { + 0 => { + pos.walk(d, 1); + way.push(pos); + }, + _ => { + pos_robot.walk(d, 1); + way.push(pos_robot); + }, + } + } + way.sort_by(|a, b| a.abs().cmp(&b.abs())); + way.dedup_by(|a, b| a.x == b.x && a.y == b.y); + way.len() as i32 + } +} + +#[derive(Copy, Clone)] +struct Point { + x: i32, + y: i32, +} + +impl Point { + pub fn walk(&mut self, dir: Dir, dist: i32) { + match dir { + Dir::North => self.y += dist, + Dir::East => self.x += dist, + Dir::South => self.y -= dist, + Dir::West => self.x -= dist, + } + } + pub fn abs(&self) -> i64 { + ((self.x as i64) << 32) + self.y as i64 + } +} + +impl PartialEq for Point { + fn eq(&self, other: &Point) -> bool { + let mut res = self.x == other.x; + res &= self.y == other.y; + res + } +} + +impl Eq for Point {} + +#[derive(Copy, Clone)] +enum Dir { + North, + East, + South, + West, +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index e3f8ecd..167d78b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ mod day1; mod day2; +mod day3; mod tests; @@ -36,4 +37,19 @@ fn main() { } Err(msg) => println!("{}",msg), }; + + match File::open("day3.txt") { + Ok(mut f) => { + let mut input = String::new(); + match f.read_to_string(&mut input) { + Ok(_) => (), + Err(msg) => println!("{}",msg), + } + let mut d3 = day3::Data::new(); + d3.parse(input); + println!("day3 visit: {}", d3.visit()); + println!("day3 robot: {}", d3.robot()); + } + Err(msg) => println!("{}",msg), + }; } diff --git a/src/tests.rs b/src/tests.rs index 7547fd4..6285ccc 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -2,37 +2,43 @@ use super::*; #[test] fn day1_1() { - let mut input = String::from("(())"); + let input = String::from("(())"); let mut day1 = day1::Data::new(); day1.parse(input); - let mut res = day1.floor(); + let res = day1.floor(); assert_eq!(res, 0); +} - input = String::from("()()"); - day1 = day1::Data::new(); +#[test] +fn day1_2() { + let input = String::from("()()"); + let mut day1 = day1::Data::new(); day1.parse(input); - res = day1.floor(); + let res = day1.floor(); assert_eq!(res, 0); } #[test] -fn day1_2() { - let mut input = String::from("((("); +fn day1_3() { + let input = String::from("((("); let mut day1 = day1::Data::new(); day1.parse(input); - let mut res = day1.floor(); + let res = day1.floor(); assert_eq!(res, 3); +} - input = String::from("(()(()("); - day1 = day1::Data::new(); +#[test] +fn day1_4() { + let input = String::from("(()(()("); + let mut day1 = day1::Data::new(); day1.parse(input); - res = day1.floor(); + let res = day1.floor(); assert_eq!(res, 3); } #[test] -fn day1_3() { - let mut input = String::from("))((((("); +fn day1_5() { + let input = String::from("))((((("); let mut day1 = day1::Data::new(); day1.parse(input); let res = day1.floor(); @@ -40,38 +46,44 @@ fn day1_3() { } #[test] -fn day1_4() { - let mut input = String::from("())"); +fn day1_6() { + let input = String::from("())"); let mut day1 = day1::Data::new(); day1.parse(input); - let mut res = day1.floor(); + let res = day1.floor(); assert_eq!(res, -1); +} - input = String::from("))("); - day1 = day1::Data::new(); +#[test] +fn day1_7() { + let input = String::from("))("); + let mut day1 = day1::Data::new(); day1.parse(input); - res = day1.floor(); + let res = day1.floor(); assert_eq!(res, -1); } #[test] -fn day1_5() { - let mut input = String::from(")))"); +fn day1_8() { + let input = String::from(")))"); let mut day1 = day1::Data::new(); day1.parse(input); - let mut res = day1.floor(); + let res = day1.floor(); assert_eq!(res, -3); +} - input = String::from(")())())"); - day1 = day1::Data::new(); +#[test] +fn day1_9() { + let input = String::from(")())())"); + let mut day1 = day1::Data::new(); day1.parse(input); - res = day1.floor(); + let res = day1.floor(); assert_eq!(res, -3); } #[test] -fn day1_6() { - let mut input = String::from(")"); +fn day1_10() { + let input = String::from(")"); let mut day1 = day1::Data::new(); day1.parse(input); let res = day1.basement(); @@ -79,8 +91,8 @@ fn day1_6() { } #[test] -fn day1_7() { - let mut input = String::from("()())"); +fn day1_11() { + let input = String::from("()())"); let mut day1 = day1::Data::new(); day1.parse(input); let res = day1.basement(); @@ -89,7 +101,7 @@ fn day1_7() { #[test] fn day2_1() { - let mut input = String::from("2x3x4"); + let input = String::from("2x3x4"); let mut day2 = day2::Data::new(); day2.parse(input); let mut res = day2.paper(); @@ -101,12 +113,54 @@ fn day2_1() { #[test] fn day2_2() { - let mut input = String::from("1x1x10"); + let input = String::from("1x1x10"); let mut day2 = day2::Data::new(); day2.parse(input); let mut res = day2.paper(); assert_eq!(res, 43); - res = day2.ribbon(); + res = day2.ribbon(); assert_eq!(res, 14); } + +#[test] +fn day3_1() { + let input = String::from(">"); + let mut day3 = day3::Data::new(); + day3.parse(input); + let res = day3.visit(); + assert_eq!(res, 2); +} + +#[test] +fn day3_2() { + let input = String::from("^v"); + let mut day3 = day3::Data::new(); + day3.parse(input); + let res = day3.robot(); + assert_eq!(res, 3); +} + +#[test] +fn day3_3() { + let input = String::from("^>v<"); + let mut day3 = day3::Data::new(); + day3.parse(input); + let mut res = day3.visit(); + assert_eq!(res, 4); + + res = day3.robot(); + assert_eq!(res, 3); +} + +#[test] +fn day3_4() { + let input = String::from("^v^v^v^v^v"); + let mut day3 = day3::Data::new(); + day3.parse(input); + let mut res = day3.visit(); + assert_eq!(res, 2); + + res = day3.robot(); + assert_eq!(res, 11); +}