Quadratics are fun

This commit is contained in:
Tyler Beckman 2023-12-06 06:59:37 -07:00
parent 81f604249c
commit c15d9534bd
Signed by: Ty
GPG key ID: 2813440C772555A4

View file

@ -8,7 +8,7 @@ pub struct Day6 {
impl Day for Day6 {
fn part1(&mut self) -> String {
let lines = self.input.lines().map(|l| l.split_ascii_whitespace().skip(1).collect::<Vec<_>>()).collect::<Vec<_>>();
let races = [
let races: [(f64, f64); 4] = [
(lines[0][0].parse().unwrap(), lines[1][0].parse().unwrap()),
(lines[0][1].parse().unwrap(), lines[1][1].parse().unwrap()),
(lines[0][2].parse().unwrap(), lines[1][2].parse().unwrap()),
@ -18,13 +18,16 @@ impl Day for Day6 {
let mut acc = 1usize;
for (time, record_distance) in races {
let mut wins = 0usize;
for time_holding_button in 0..time {
let distance = (time - time_holding_button) * time_holding_button /* velocity */;
if distance > record_distance { wins += 1; }
}
// let mut wins = 0usize;
// for time_holding_button in 0..time {
// let distance = (time - time_holding_button) * time_holding_button /* velocity */;
// if distance > record_distance { wins += 1; }
// }
// Mathy solution:
let b = ((time+((time*time-4.0*record_distance).sqrt())) / 2.0).ceil();
let a = ((time-((time*time-4.0*record_distance).sqrt())) / 2.0).ceil();
acc *= wins;
acc *= (b - a) as usize;
}
acc.to_string()
@ -33,13 +36,19 @@ impl Day for Day6 {
fn part2(&mut self) -> String {
let lines = self.input.lines().map(|l| l[10..].split_ascii_whitespace().collect::<String>()).collect::<Vec<_>>();
let (time, record_distance): (u128, u128) = (lines[0].parse().unwrap(), lines[1].parse().unwrap());
let mut wins = 0u128;
for time_holding_button in 0..time {
let distance = (time - time_holding_button) * time_holding_button /* velocity */;
if distance > record_distance { wins += 1; }
}
let (time, record_distance): (f64, f64) = (lines[0].parse().unwrap(), lines[1].parse().unwrap());
// Boring solution:
// let mut wins = 0u128;
// for time_holding_button in 0..time {
// let distance = (time - time_holding_button) * time_holding_button /* velocity */;
// if distance > record_distance { wins += 1; }
// }
wins.to_string()
// wins.to_string()
// Mathy solution:
let b = ((time+((time*time-4.0*record_distance).sqrt())) / 2.0).ceil();
let a = ((time-((time*time-4.0*record_distance).sqrt())) / 2.0).ceil();
(b - a).to_string()
}
}