[TASK] Solved day 3

This commit is contained in:
2020-12-03 21:12:11 +01:00
parent 4cc35ef3e5
commit 7ae633a16e
4 changed files with 389 additions and 0 deletions

52
src/day3.rs Normal file
View File

@@ -0,0 +1,52 @@
use super::util;
pub fn solve() {
let lines = util::read_file("input/day3.txt");
let forest = Forest {
map: lines.iter().flat_map(|l| l.chars().map(|c| c == '#')).collect(),
width: lines.iter().next().unwrap().len(),
height: lines.len()
};
let angle = Angle { x: 3, y: 1 };
println!("Day 3 Part 1: {}", forest.trees_on_angle(&angle));
let angles = [ Angle {x: 1, y: 1}, Angle {x: 3, y: 1}, Angle {x: 5, y: 1}, Angle {x: 7, y: 1}, Angle{x: 1, y: 2}];
let part2 = angles.iter().map(|a| forest.trees_on_angle(a)).fold(1, |res, cur| res * cur);
println!("Day 3 Part 2: {}", part2);
}
struct Forest {
map: Vec<bool>,
width: usize,
height: usize,
}
struct Angle {
x: usize,
y: usize
}
impl Forest {
fn is_tree(&self, x: usize, y: usize) -> bool {
if y >= self.height {
panic!("Invalid coordinate!");
}
return self.map[(x % self.width) + y * self.width];
}
fn trees_on_angle(&self, angle: &Angle) -> u32 {
let mut res = 0;
for i in 0..(self.height / angle.y) {
if self.is_tree(angle.x * i, angle.y * i) {
res += 1;
}
}
return res;
}
}

View File

@@ -4,6 +4,7 @@ use std::time::Instant;
mod util;
mod day1;
mod day2;
mod day3;
fn main() {
@@ -16,12 +17,14 @@ fn main() {
match args[day_arg_idx.unwrap() + 1].parse::<u8>().unwrap() {
1 => day1::solve(),
2 => day2::solve(),
3 => day3::solve(),
_ => println!("This day is not yet implemented")
}
} else {
// Solve all days:
day1::solve();
day2::solve();
day3::solve();
}
println!("Execution took {} μs", now.elapsed().as_micros());