Browse Source

level 3 finished

master
Michael Preisach 8 years ago
parent
commit
b50b69b0b9
  1. 1
      day3.txt
  2. 10
      src/day2.rs
  3. 106
      src/day3.rs
  4. 16
      src/main.rs
  5. 116
      src/tests.rs

1
day3.txt

File diff suppressed because one or more lines are too long

10
src/day2.rs

@ -67,13 +67,3 @@ struct Box {
w: i32,
h: i32,
}
impl Box {
pub fn new() -> Box {
Box {
l: 0,
w: 0,
h: 0,
}
}
}

106
src/day3.rs

@ -0,0 +1,106 @@
pub struct Data {
inst: Vec<Dir>,
}
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,
}

16
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),
};
}

116
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,7 +113,7 @@ 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();
@ -110,3 +122,45 @@ fn day2_2() {
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);
}

Loading…
Cancel
Save