I'm dumb.
This commit is contained in:
parent
77977f9bbc
commit
63ce6b5cf2
@ -1,3 +1,4 @@
|
|||||||
|
|
||||||
use std::{path::Path, str::FromStr, iter::zip};
|
use std::{path::Path, str::FromStr, iter::zip};
|
||||||
|
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
@ -77,22 +78,23 @@ impl FromStr for RecordsOverview {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn number_of_record_beating_chances(max_time: i128, record: i128) -> u32 {
|
||||||
|
let sqrt = ((max_time.pow(2) - 4 * record) as f64).sqrt();
|
||||||
|
|
||||||
|
let answer1 = -((-max_time as f64) + sqrt) / 2f64;
|
||||||
|
let answer2 = -((-max_time as f64) - sqrt) / 2f64;
|
||||||
|
|
||||||
|
(answer2.ceil() - answer1.ceil()) as u32
|
||||||
|
}
|
||||||
|
|
||||||
pub fn one() -> Result<u32, AdventError> {
|
pub fn one() -> Result<u32, AdventError> {
|
||||||
let overview = read_into::<RecordsOverview>(Path::new("resources/input6.txt"))?;
|
let overview = read_into::<RecordsOverview>(Path::new("resources/input6.txt"))?;
|
||||||
Ok(overview.records.iter().fold(1, |acc, record| {
|
Ok(overview.records.iter().fold(1, |acc, record| {
|
||||||
acc * ((0..(record.time + 1)).into_iter().map(|x| {
|
acc * number_of_record_beating_chances(record.time.into(), record.distance.into())
|
||||||
x * (record.time - x)
|
|
||||||
}).filter(|x| {
|
|
||||||
*x > record.distance
|
|
||||||
}).count() as u32)
|
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn two() -> Result<u32, AdventError> {
|
pub fn two() -> Result<u32, AdventError> {
|
||||||
let record = read_into::<Record>(Path::new("resources/input6.txt"))?;
|
let record = read_into::<Record>(Path::new("resources/input6.txt"))?;
|
||||||
Ok((0..(record.time + 1)).into_iter().map(|x| {
|
Ok(number_of_record_beating_chances(record.time.into(), record.distance.into()))
|
||||||
x * (record.time - x)
|
|
||||||
}).filter(|x| {
|
|
||||||
*x > record.distance
|
|
||||||
}).count() as u32)
|
|
||||||
}
|
}
|
@ -19,7 +19,7 @@ fn main() -> Result<(), AdventError> {
|
|||||||
(day6::one as fn() -> Result<u32, AdventError>, day6::two as fn() -> Result<u32, AdventError>),
|
(day6::one as fn() -> Result<u32, AdventError>, day6::two as fn() -> Result<u32, AdventError>),
|
||||||
];
|
];
|
||||||
|
|
||||||
if env::args().len() != 3 {
|
if env::args().len() == 1 {
|
||||||
Ok(days.into_iter().map(|(one, two)| {
|
Ok(days.into_iter().map(|(one, two)| {
|
||||||
let one_result = one()?;
|
let one_result = one()?;
|
||||||
let two_result = two()?;
|
let two_result = two()?;
|
||||||
@ -31,12 +31,17 @@ fn main() -> Result<(), AdventError> {
|
|||||||
};
|
};
|
||||||
}).fold((), |acc, _| { acc }))
|
}).fold((), |acc, _| { acc }))
|
||||||
} else {
|
} else {
|
||||||
let (one, two) = days[env::args().nth(1).ok_or(AdventError("Failed to parse day".into()))?.parse::<usize>()? - 1];
|
let day_index = env::args().nth(1).ok_or(AdventError("Failed to parse day".into()))?.parse::<usize>()? - 1;
|
||||||
|
let (one, two) = days[day_index];
|
||||||
|
if env::args().len() == 3 {
|
||||||
match env::args().nth(2).unwrap().parse::<usize>()? {
|
match env::args().nth(2).unwrap().parse::<usize>()? {
|
||||||
1 => Ok(println!("1: {}", one()?)),
|
1 => Ok(println!("1: {}", one()?)),
|
||||||
2 => Ok(println!("2: {}", two()?)),
|
2 => Ok(println!("2: {}", two()?)),
|
||||||
_ => return Err(AdventError("part must be either 1 or 2".into()))
|
_ => return Err(AdventError("part must be either 1 or 2".into()))
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Ok(println!("{}: ({}, {})", day_index + 1, one()?, two()?))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user