]> aoc.elinar.fr Git - aoc_2023/commitdiff
Day06 - part 2
authoralex <null>
Wed, 6 Dec 2023 10:59:47 +0000 (11:59 +0100)
committeralex <null>
Wed, 6 Dec 2023 10:59:47 +0000 (11:59 +0100)
src/day06.rs

index 170cd7907a3852b5010e4486632db351a3946cd3..6ab699e5cacf34e4ee3524538cabf4a870384111 100644 (file)
@@ -88,7 +88,42 @@ fn run_part1(input: &str) -> Result<i32, Box<dyn Error>> {
 
 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)
 }
 
@@ -127,6 +162,6 @@ Distance:  9  40  200";
     #[test]
     fn day06_part2() {
         let res = run_part2(TEXT_INPUT);
-        assert_eq!(0, res.unwrap());
+        assert_eq!(71503, res.unwrap());
     }
 }