Add Rust day 2
parent
f6a860f283
commit
555e4aa024
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,2 @@
|
|||
pub mod part_1;
|
||||
pub mod part_2;
|
|
@ -0,0 +1,26 @@
|
|||
use crate::utils;
|
||||
|
||||
pub fn answer(text : &str) -> usize {
|
||||
text.split("\n")
|
||||
.map(parse_line)
|
||||
.filter(is_safe_line)
|
||||
.count()
|
||||
}
|
||||
|
||||
fn is_safe_line(v : &Vec<i32>) -> bool {
|
||||
let diff : Vec<i32> = v
|
||||
.windows(2)
|
||||
.filter_map(|v| Some(v.get(0)? - v.get(1)?))
|
||||
.collect();
|
||||
|
||||
let all_increasing : bool = diff.iter().all(|&x| x < 0);
|
||||
let all_decreasing : bool = diff.iter().all(|&x| x > 0);
|
||||
let all_bounded_ok : bool = diff.iter().all(|&x| x.abs() <= 3);
|
||||
|
||||
all_bounded_ok && (all_increasing || all_decreasing)
|
||||
}
|
||||
|
||||
fn parse_line(s : &str) -> Vec<i32> {
|
||||
s.split(" ").filter_map(utils::str_to_i32).collect()
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
use crate::utils;
|
||||
|
||||
pub fn answer(text : &str) -> usize {
|
||||
text.split("\n")
|
||||
.map(parse_line)
|
||||
.filter(is_dampened_safe_line)
|
||||
.count()
|
||||
}
|
||||
|
||||
fn is_dampened_safe_line(v : &Vec<i32>) -> bool {
|
||||
if is_safe_line(v) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for i in 0..v.len() {
|
||||
let mut cv = v.to_vec();
|
||||
cv.remove(i);
|
||||
|
||||
if is_safe_line(&cv) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
false
|
||||
}
|
||||
|
||||
fn is_safe_line(v : &Vec<i32>) -> bool {
|
||||
let diff : Vec<i32> = v
|
||||
.windows(2)
|
||||
.filter_map(|v| Some(v.get(0)? - v.get(1)?))
|
||||
.collect();
|
||||
|
||||
let all_increasing : bool = diff.iter().all(|&x| x < 0);
|
||||
let all_decreasing : bool = diff.iter().all(|&x| x > 0);
|
||||
let all_bounded_ok : bool = diff.iter().all(|&x| x.abs() <= 3);
|
||||
|
||||
all_bounded_ok && (all_increasing || all_decreasing)
|
||||
}
|
||||
|
||||
fn parse_line(s : &str) -> Vec<i32> {
|
||||
s.split(" ").filter_map(utils::str_to_i32).collect()
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
mod utils;
|
||||
mod day_01;
|
||||
mod day_02;
|
||||
|
||||
pub fn day_01() {
|
||||
let s : String = utils::read_from_file("inputs/01.txt");
|
||||
|
@ -7,3 +8,8 @@ pub fn day_01() {
|
|||
println!("Day 01 part 2: {}", day_01::part_2::answer(s.as_str()));
|
||||
}
|
||||
|
||||
pub fn day_02() {
|
||||
let s : String = utils::read_from_file("inputs/02.txt");
|
||||
println!("Day 02 part 1: {}", day_02::part_1::answer(s.as_str()));
|
||||
println!("Day 02 part 2: {}", day_02::part_2::answer(s.as_str()));
|
||||
}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
fn main() {
|
||||
aoc_2024::day_01();
|
||||
aoc_2024::day_02();
|
||||
}
|
||||
|
|
|
@ -10,6 +10,10 @@ pub fn read_from_file(name : &str) -> String {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn str_to_i32(s : &str) -> Option<i32> {
|
||||
s.trim().to_string().parse::<i32>().ok()
|
||||
}
|
||||
|
||||
pub fn str_to_u32(s : &str) -> Option<u32> {
|
||||
s.trim().to_string().parse::<u32>().ok()
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue