Optimize & simplify day 1

bram-benchmarks
Bram 2025-12-02 16:31:07 +01:00
parent a278f98f4b
commit d01764721a
1 changed files with 32 additions and 46 deletions

View File

@ -1,55 +1,41 @@
use crate::utils; use crate::utils;
struct Dial { pub fn answer(text : String) ->( u16, u16 ) {
points_at : i16, let mut old : i16 = 50;
clicks : u32, let mut clicks : u16 = 0;
passing_clicks : u32, let mut passing_clicks : u16 = 0;
}
impl Dial {
fn new() -> Dial {
Dial { points_at : 50, clicks : 0, passing_clicks : 0 }
}
fn rotate_by(&mut self, r : i16) -> () {
let start : i16 = self.points_at;
self.points_at += r;
self.points_at = self.points_at.rem_euclid(100);
self.passing_clicks += (r.abs() / 100) as u32;
if self.points_at == 0 {
self.clicks += 1;
// Avoid double counting when starting and landing on zero
if r / 100 != 0 && r % 100 == 0 {
self.passing_clicks -= 1;
}
}
if r < 0 && start < self.points_at && start != 0 {
self.passing_clicks += 1;
}
if r > 0 && start > self.points_at && self.points_at != 0 {
self.passing_clicks += 1;
}
// println!(
// "Dial {} now points at {} ({} clicks, {} passing)",
// r, self.points_at, self.clicks, self.passing_clicks
// );
}
}
pub fn answer(text : String) ->( u32, u32 ) {
let mut dial : Dial = Dial::new();
for d in text.split("\n").filter_map(str_to_dir) { for d in text.split("\n").filter_map(str_to_dir) {
dial.rotate_by(d); let new : i16 = old + d;
// Part 1 clicks
if new % 100 == 0 {
clicks += 1;
} }
( dial.clicks // Part 2 clicks
, dial.clicks + dial.passing_clicks if d > 0 {
) passing_clicks += (
new.div_euclid(100) - old.div_euclid(100)
) as u16
} else {
passing_clicks += (
(old - 1).div_euclid(100) - (new - 1).div_euclid(100)
) as u16
}
old = new;
}
( clicks, passing_clicks )
}
fn count_passing_clicks(old : i16, new : i16) -> u16 {
if old < new {
(new.div_euclid(100) - old.div_euclid(100)).abs() as u16
} else {
((new - 1).div_euclid(100) - (old - 1).div_euclid(100)).abs() as u16
}
} }
fn str_to_dir(s : &str) -> Option<i16> { fn str_to_dir(s : &str) -> Option<i16> {