[TASK] Solved day 3
This commit is contained in:
52
src/day3.rs
Normal file
52
src/day3.rs
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user