summaryrefslogtreecommitdiffstats
path: root/2023/rs/code/six/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to '2023/rs/code/six/src/main.rs')
-rw-r--r--2023/rs/code/six/src/main.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/2023/rs/code/six/src/main.rs b/2023/rs/code/six/src/main.rs
new file mode 100644
index 0000000..3504380
--- /dev/null
+++ b/2023/rs/code/six/src/main.rs
@@ -0,0 +1,28 @@
+static INPUT: &str = include_str!("input.txt");
+
+#[inline(always)]
+fn exceeding_count(time: u64, dist: u64) -> u64 {
+ let fac = (2..time).find(|a| a * (time - a) > dist).unwrap();
+ time - fac * 2 + 1
+}
+
+fn main() {
+ let (times, distances) = {
+ let mut lines = INPUT.split('\n').filter(|s| !s.is_empty());
+ let times = lines.next().and_then(|l| l.split(":").nth(1)).unwrap();
+ let distances = lines.next().and_then(|l| l.split(":").nth(1)).unwrap();
+ (times, distances)
+ };
+
+ let time_dist = {
+ let times = times.split_ascii_whitespace().map(|a| a.parse().unwrap());
+ let distances = distances.split_ascii_whitespace().map(|a| a.parse().unwrap());
+ times.zip(distances)
+ };
+ let ways = time_dist.map(|(t,d)| exceeding_count(t, d)).product::<u64>();
+ println!("Number of ways to beat past 'winners'(losers): {ways}");
+
+ let (bigtime, bigdistance) = (times.replace(' ', "").parse().unwrap(), distances.replace(' ', "").parse().unwrap());
+ let ways = exceeding_count(bigtime, bigdistance);
+ println!("Number of ways to beat past (really long race) 'winners'(losers): {ways}");
+}