94 lines
2.2 KiB
Rust
94 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));
|
|
}
|
|
}
|