Day 08 Part 2 complete :) Very efficient solution
This commit is contained in:
parent
4a095e2a74
commit
5627684494
@ -1,5 +1,7 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use crate::utils::{self};
|
||||||
|
|
||||||
use super::Solution;
|
use super::Solution;
|
||||||
|
|
||||||
pub struct Day08 {}
|
pub struct Day08 {}
|
||||||
@ -38,14 +40,17 @@ impl Solution for Day08 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut count = 0u32;
|
let mut count = vec![];
|
||||||
|
|
||||||
println!("{:?}", start_points);
|
|
||||||
for start in start_points {
|
for start in start_points {
|
||||||
count += self.traverse_to_end(&start, &"Z".to_owned(), &instructions, &map)?
|
count.push(self.traverse_to_end(&start, &"Z".to_owned(), &instructions, &map)?);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(Box::new(count))
|
let lcm = count
|
||||||
|
.iter()
|
||||||
|
.fold(1u64, |acc, x| -> u64 { utils::lcm(acc, *x as u64) });
|
||||||
|
|
||||||
|
Ok(Box::new(lcm))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_day(&self) -> u8 {
|
fn get_day(&self) -> u8 {
|
||||||
@ -87,6 +92,7 @@ impl Day08 {
|
|||||||
&self,
|
&self,
|
||||||
start: &String,
|
start: &String,
|
||||||
end: &String,
|
end: &String,
|
||||||
|
// detect_cycles: bool,
|
||||||
instructions: &String,
|
instructions: &String,
|
||||||
map: &HashMap<String, (String, String)>,
|
map: &HashMap<String, (String, String)>,
|
||||||
) -> Result<u32, Box<dyn std::error::Error>> {
|
) -> Result<u32, Box<dyn std::error::Error>> {
|
||||||
@ -105,7 +111,7 @@ impl Day08 {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if next.ends_with("ZZZ") {
|
if next.ends_with(end) {
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
24
src/utils.rs
24
src/utils.rs
@ -33,3 +33,27 @@ pub fn get_input(day: u8, input: InputType) -> Result<Vec<String>, Box<dyn Error
|
|||||||
|
|
||||||
Ok(data)
|
Ok(data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn lcm(first: u64, second: u64) -> u64 {
|
||||||
|
first * second / gcd(first, second)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn gcd(first: u64, second: u64) -> u64 {
|
||||||
|
let mut max = first;
|
||||||
|
let mut min = second;
|
||||||
|
if min > max {
|
||||||
|
let val = max;
|
||||||
|
max = min;
|
||||||
|
min = val;
|
||||||
|
}
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let res = max % min;
|
||||||
|
if res == 0 {
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
|
||||||
|
max = min;
|
||||||
|
min = res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user