summaryrefslogtreecommitdiff
path: root/src/bin/day6.rs
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2023-12-06 15:39:40 +0100
committerReiner Herrmann <reiner@reiner-h.de>2023-12-06 15:39:40 +0100
commitfcc2250039ce0d395780d622149e944637331b86 (patch)
tree06ac915b4a7fa7a0cabda654674b27097752312e /src/bin/day6.rs
parent90d73f0b43c55842f4b484f0bc49e28737866661 (diff)
day6 solution 2
Diffstat (limited to 'src/bin/day6.rs')
-rw-r--r--src/bin/day6.rs48
1 files changed, 31 insertions, 17 deletions
diff --git a/src/bin/day6.rs b/src/bin/day6.rs
index 3d450cb..39f7ade 100644
--- a/src/bin/day6.rs
+++ b/src/bin/day6.rs
@@ -3,34 +3,47 @@ static DAY: u8 = 6;
fn main() {
let input = advent::read_lines(DAY);
println!("{DAY}a: {}", possible_ways(&input));
- println!("{DAY}b: {}", 0);
+ println!("{DAY}b: {}", possible_ways_single_race(&input));
}
-fn possible_ways(input: &[String]) -> u32 {
+fn count_ways(time: u64, record: u64) -> u64 {
+ let mut ways = 0;
+ for hold_button in 1 .. time {
+ let moving_time = time - hold_button;
+ let boat_distance = moving_time * hold_button;
+ if boat_distance > record {
+ ways += 1;
+ }
+ }
+ ways
+}
+
+fn possible_ways(input: &[String]) -> u64 {
let get_numbers = |x: &str| {
x.split_once(':').unwrap().1.to_string()
.split(' ')
.filter(|s| !s.is_empty())
.map(|s| s.parse().unwrap())
- .collect::<Vec<u32>>()
+ .collect::<Vec<u64>>()
};
let times = get_numbers(&input[0]);
let distances = get_numbers(&input[1]);
- let mut ways_list = Vec::new();
- for (time, record) in times.iter().zip(distances.iter()) {
- let mut ways = 0;
- for hold_button in 1 .. *time {
- let moving_time = time - hold_button;
- let boat_distance = moving_time * hold_button;
- if boat_distance > *record {
- ways += 1;
- }
- }
- ways_list.push(ways);
- }
- ways_list.iter()
- .product()
+ times.iter()
+ .zip(distances.iter())
+ .map(|(time, distance)| count_ways(*time, *distance))
+ .product()
+}
+
+fn possible_ways_single_race(input: &[String]) -> u64 {
+ let get_number = |mut x: String| -> u64 {
+ x.retain(|c| c.is_ascii_digit());
+ x.parse().unwrap()
+ };
+ let time = get_number(input[0].clone());
+ let distance = get_number(input[1].clone());
+
+ count_ways(time, distance)
}
#[cfg(test)]
@@ -44,5 +57,6 @@ mod tests {
"Distance: 9 40 200",
].iter().map(|&x| String::from(x)).collect::<Vec<_>>();
assert_eq!(possible_ways(&input), 288);
+ assert_eq!(possible_ways_single_race(&input), 71503);
}
}