Finished complete day 6 aoc, was way easier than previous day
This commit is contained in:
9
advent_of_code/2023/6/Cargo.toml
Normal file
9
advent_of_code/2023/6/Cargo.toml
Normal file
@@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "main"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
nom = "7.1.3"
|
||||
2
advent_of_code/2023/6/input.txt
Normal file
2
advent_of_code/2023/6/input.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Time: 35 93 73 66
|
||||
Distance: 212 2060 1201 1044
|
||||
100
advent_of_code/2023/6/src/main.rs
Normal file
100
advent_of_code/2023/6/src/main.rs
Normal file
@@ -0,0 +1,100 @@
|
||||
use std::iter::zip;
|
||||
|
||||
use nom::{
|
||||
bytes::complete::tag,
|
||||
character::complete::{multispace0, multispace1, u64},
|
||||
multi::separated_list1,
|
||||
sequence::tuple,
|
||||
IResult,
|
||||
};
|
||||
|
||||
fn parse_input(input: &str) -> IResult<&str, Vec<(u64, u64)>> {
|
||||
let (input, result) = tuple((
|
||||
tag("Time:"),
|
||||
multispace0,
|
||||
separated_list1(multispace1, u64),
|
||||
multispace0,
|
||||
tag("Distance:"),
|
||||
multispace0,
|
||||
separated_list1(multispace1, u64),
|
||||
))(input)
|
||||
.map(|(i, (_, _, times, _, _, _, distances))| (i, (times, distances)))?;
|
||||
|
||||
let result = zip(result.0, result.1).collect();
|
||||
|
||||
Ok((input, result))
|
||||
}
|
||||
|
||||
fn record_beating_ways(time_distance_pair: (u64, u64)) -> usize {
|
||||
(1..=time_distance_pair.0)
|
||||
.into_iter()
|
||||
.filter(|&time_charging| {
|
||||
(time_distance_pair.0 - time_charging) * time_charging > time_distance_pair.1
|
||||
})
|
||||
.count()
|
||||
}
|
||||
|
||||
fn solve_1(time_distance_pairs: &[(u64, u64)]) -> u64 {
|
||||
time_distance_pairs
|
||||
.iter()
|
||||
.map(|&pair| record_beating_ways(pair) as u64)
|
||||
.product()
|
||||
}
|
||||
|
||||
fn solve_2(time_distance_pairs: &[(u64, u64)]) -> u64 {
|
||||
let time_distance_pair = time_distance_pairs.iter().fold(
|
||||
(0, 0),
|
||||
|(output_time, output_distance), &(time, distance)| {
|
||||
let time_len = (time as f64).log10().floor() as u32 + 1;
|
||||
let distance_len = (distance as f64).log10().floor() as u32 + 1;
|
||||
|
||||
(
|
||||
output_time * 10u64.pow(time_len) as u64 + time,
|
||||
output_distance * 10u64.pow(distance_len) as u64 + distance,
|
||||
)
|
||||
},
|
||||
);
|
||||
|
||||
record_beating_ways(time_distance_pair) as u64
|
||||
}
|
||||
|
||||
fn main() {
|
||||
println!("Hello, this is Patrick!");
|
||||
|
||||
let input_text = include_str!("../input.txt");
|
||||
|
||||
let (_, time_distance_pairs) = parse_input(input_text).unwrap();
|
||||
|
||||
println!(
|
||||
"The product of the number of ways you could beat the record is {}",
|
||||
solve_1(&time_distance_pairs[..])
|
||||
);
|
||||
|
||||
println!(
|
||||
"The longer race can be won in {} ways",
|
||||
solve_2(&time_distance_pairs[..])
|
||||
);
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_1() {
|
||||
let input_text = include_str!("../test_input.txt");
|
||||
|
||||
let (_, time_distance_pairs) = parse_input(input_text).unwrap();
|
||||
|
||||
assert_eq!(solve_1(&time_distance_pairs[..]), 288);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_2() {
|
||||
let input_text = include_str!("../test_input.txt");
|
||||
|
||||
let (_, time_distance_pairs) = parse_input(input_text).unwrap();
|
||||
|
||||
assert_eq!(solve_2(&time_distance_pairs[..]), 71503);
|
||||
}
|
||||
}
|
||||
2
advent_of_code/2023/6/test_input.txt
Normal file
2
advent_of_code/2023/6/test_input.txt
Normal file
@@ -0,0 +1,2 @@
|
||||
Time: 7 15 30
|
||||
Distance: 9 40 200
|
||||
Reference in New Issue
Block a user