#[path = "../lib.rs"] mod lib; fn parse_line(line: &str) -> Vec { return line .split_whitespace() .skip(1) .map(|s| s.parse().unwrap()) .collect(); } fn count_games(times: &Vec, dists: &Vec) -> u64 { let mut results = vec![]; for i in 0..times.len() { // how many integer x can satisfy // (times[i] - x) * x > dists[i] let p = (times[i] as f64) / 2.0; let q = p * p - (dists[i] as f64); assert!(q >= 0.0); let q2 = q.sqrt(); assert!(q2 < p); let x1 = (p - q2).floor() as u64; let x2 = (p + q2).ceil() as u64; results.push(x2 - x1 - 1); } return results.iter().product(); } fn main() { let mut lines = lib::iter_input(); let line1 = lines.next().unwrap(); let line2 = lines.next().unwrap(); let times1 = parse_line(&line1); let dists1 = parse_line(&line2); let times2 = parse_line(&line1.replace(" ", "").replace(":", ": ")); let dists2 = parse_line(&line2.replace(" ", "").replace(":", ": ")); println!("part2: {}", count_games(×1, &dists1)); println!("part2: {}", count_games(×2, &dists2)); }