1
0
Fork 0
advent-of-code/2023/src/bin/06.rs

92 lines
2.2 KiB
Rust

advent_of_code::solution!(6);
struct Race {
time: u64,
distance: u64,
}
impl Race {
fn winning_times(&self) -> Vec<u64> {
let mut result: Vec<u64> = vec![];
for t in 0..=self.time {
if t * (self.time - t) > self.distance {
result.push(t);
}
}
result
}
}
fn parse(input: &str) -> Vec<Race> {
let mut lines = input.lines();
let times: Vec<u64> = lines.next().unwrap().split(": ").collect::<Vec<&str>>()[1]
.trim_start()
.split(" ")
.filter_map(|t| t.parse::<u64>().ok())
.collect();
let distances: Vec<u64> = lines.next().unwrap().split(": ").collect::<Vec<&str>>()[1]
.trim_start()
.split(" ")
.filter_map(|t| t.parse::<u64>().ok())
.collect();
assert_eq!(times.len(), distances.len());
(0..times.len())
.map(|i| Race {
time: times[i],
distance: distances[i],
})
.collect()
}
pub fn part_one(input: &str) -> Option<u64> {
Some(parse(input)
.iter()
.map(|race| race.winning_times().len() as u64)
.collect::<Vec<u64>>()
.iter()
.product())
}
pub fn part_two(input: &str) -> Option<u64> {
let races = parse(input);
let time = races
.iter()
.map(|race| race.time)
.collect::<Vec<u64>>()
.iter()
.map(|t| t.to_string())
.collect::<Vec<String>>()
.join("")
.parse::<u64>()
.unwrap();
let distance = races
.iter()
.map(|race| race.distance)
.collect::<Vec<u64>>()
.iter()
.map(|t| t.to_string())
.collect::<Vec<String>>()
.join("")
.parse::<u64>()
.unwrap();
let race = Race { time, distance };
Some(race.winning_times().len() as u64)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_one() {
let result = part_one(&advent_of_code::template::read_file("examples", DAY));
assert_eq!(result, Some(288));
}
#[test]
fn test_part_two() {
let result = part_two(&advent_of_code::template::read_file("examples", DAY));
assert_eq!(result, Some(71503));
}
}