From 6489efa2795f22641a9e02e8bc8c966605e36764 Mon Sep 17 00:00:00 2001 From: Maxime Augier Date: Tue, 12 Dec 2023 15:33:05 +0100 Subject: [PATCH] Day6 --- .gitignore | 1 + day6/Cargo.lock | 16 +++++++++++++ day6/Cargo.toml | 9 ++++++++ day6/input | 2 ++ day6/src/main.rs | 60 ++++++++++++++++++++++++++++++++++++++++++++++++ day6/test | 2 ++ 6 files changed, 90 insertions(+) create mode 100644 .gitignore create mode 100644 day6/Cargo.lock create mode 100644 day6/Cargo.toml create mode 100644 day6/input create mode 100644 day6/src/main.rs create mode 100644 day6/test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eb5a316 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +target diff --git a/day6/Cargo.lock b/day6/Cargo.lock new file mode 100644 index 0000000..831171c --- /dev/null +++ b/day6/Cargo.lock @@ -0,0 +1,16 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "day6" +version = "0.1.0" +dependencies = [ + "anyhow", +] diff --git a/day6/Cargo.toml b/day6/Cargo.toml new file mode 100644 index 0000000..b58447b --- /dev/null +++ b/day6/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "day6" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +anyhow = "1.0.75" diff --git a/day6/input b/day6/input new file mode 100644 index 0000000..1e7db17 --- /dev/null +++ b/day6/input @@ -0,0 +1,2 @@ +Time: 56 97 77 93 +Distance: 499 2210 1097 1440 diff --git a/day6/src/main.rs b/day6/src/main.rs new file mode 100644 index 0000000..6a43586 --- /dev/null +++ b/day6/src/main.rs @@ -0,0 +1,60 @@ +use std::io::{stdin, BufRead}; +use anyhow::{anyhow, Result}; + +fn collect_list(prefix: &str, buf: &str) -> Result> { + Ok(buf.strip_prefix(prefix) + .ok_or(anyhow!("Incorrect line: {buf:?}"))? + .split_whitespace() + .map(|v| v.parse::()) + .collect::>()?) +} + +fn aggregate(nums: &[usize]) -> usize { + nums.iter().fold(0, |acc, d| { acc * (10u64.pow(d.ilog10() + 1) as usize) + d } ) +} + +fn ways((t,d) : (usize, usize)) -> usize { + if t*t < 4*d { return 0; } + let dq = t*t - 4*d; + + let delta = (dq as f64).sqrt(); + let b1 = ((t as f64 - delta)/2f64).floor() as usize + 1; + let b2 = ((t as f64 + delta)/2f64).ceil() as usize - 1; + + if b2 < b1 { return 0; } + + eprintln!("t={t} d={d} b1={b1} b2={b2}"); + + b2 - b1 + 1 +} + +fn main() -> Result<()> { + let mut stdin = stdin().lock(); + + let mut buf = String::with_capacity(1024); + + stdin.read_line(&mut buf)?; + let times = collect_list("Time:", &buf)?; + buf.clear(); + + stdin.read_line(&mut buf)?; + let distances = collect_list("Distance:", &buf)?; + buf.clear(); + + + let ways1: usize = times.iter().copied() + .zip(distances.iter().copied()) + .map(ways) + .product(); + + println!("Part 1: {ways1} ways."); + + let time2 = aggregate(×); + let dist2 = aggregate(&distances); + + let ways2 = ways((time2, dist2)); + + println!("Part 2: {ways2} ways."); + + Ok(()) +} diff --git a/day6/test b/day6/test new file mode 100644 index 0000000..28f5ae9 --- /dev/null +++ b/day6/test @@ -0,0 +1,2 @@ +Time: 7 15 30 +Distance: 9 40 200