fn run_part2(input: &str) -> Result<i32, Box<dyn Error>> {
println!("Running day06 - part 2");
- let res = 0;
+
+ let input = remove_trailing_char(input, '\n');
+ let (str_time, str_dst) = input.split_once('\n').unwrap();
+
+ let mut time = String::from(str_time.split_once(": ").unwrap().1);
+ let mut dst = String::from(str_dst.split_once(": ").unwrap().1);
+
+ // on supprime les espaces
+ time.retain(|c| c != ' ');
+ dst.retain(|c| c != ' ');
+
+ // les valeurs récupérées ne tiennent plus dans des i32
+ let t: i64 = time.parse().unwrap();
+ let d: i64 = dst.parse().unwrap();
+
+ let (a, b, c): (i64, i64, i64) = (1, -t, d);
+
+ let D_b: i64 = b.pow(2);
+ let D_4ac: i64 = 4 * a * c;
+ let D = D_b - D_4ac;
+ if D < 0 {
+ // pas de solution
+ unreachable!();
+ }
+ let (a, b, c): (f64, f64, f64) = (a as f64, b as f64, c as f64);
+ let D: f64 = D as f64;
+ let mut x1: f64 = ( -b - D.sqrt() ) / ( 2.0 * a );
+ let mut x2: f64 = ( -b + D.sqrt() ) / ( 2.0 * a );
+
+ // gérer le cas d'egalite avec les bornes
+ if x1 == x1.ceil() { x1 = x1 + 1.0 }
+ if x2 == x2.floor() { x2 = x2 - 1.0 }
+
+ let (x1, x2) = (x1.ceil() as i32, x2.floor() as i32);
+
+ let res = x2 - x1 + 1;
Ok(res)
}
#[test]
fn day06_part2() {
let res = run_part2(TEXT_INPUT);
- assert_eq!(0, res.unwrap());
+ assert_eq!(71503, res.unwrap());
}
}