Optimize & simplify day 3

bram-benchmarks
Bram 2025-12-03 10:56:33 +01:00
parent 4ae1fea299
commit 3faee72c5d
1 changed files with 19 additions and 42 deletions

View File

@ -1,66 +1,43 @@
use crate::utils;
pub fn answer(text : String) -> ( u16, u64 ) {
( text.as_str().split_whitespace().map(BatteryBank::from).sum()
, text.as_str().split_whitespace().map(BigBatteryBank::from).sum()
)
pub fn answer(text : String) -> ( u64, u64 ) {
text.as_str()
.split_whitespace()
.map(|s|
( BatteryBank::from(s, 2), BatteryBank::from(s, 12) )
)
.fold((0, 0), |(t1, t2), (b1, b2)| (t1 + b1, t2 + b2))
}
struct BatteryBank {
highest_digit : u8,
highest_value : u8,
digits : Vec<u8>,
size : usize,
}
impl BatteryBank {
fn add_battery(&mut self, b : u8) {
let joltage = 10 * self.highest_digit + b;
if joltage > self.highest_value {
self.highest_value = joltage;
}
if b > self.highest_digit {
self.highest_digit = b;
}
}
fn from(s : &str) -> u16 {
let mut bank = BatteryBank{ highest_digit : 0, highest_value : 0 };
for n in s.chars().filter_map(utils::char_to_u8) {
bank.add_battery(n);
}
bank.highest_value as u16
}
}
struct BigBatteryBank {
highest_digit : Vec<u8>,
}
impl BigBatteryBank {
fn add_battery(&mut self, b : u8, min_pos : usize) {
for i in min_pos..12 {
match self.highest_digit.get(i) {
for i in min_pos..self.size {
match self.digits.get(i) {
Some(x) =>
if b > *x {
self.highest_digit.truncate(i);
self.highest_digit.push(b);
self.digits.truncate(i);
self.digits.push(b);
return;
},
None => {
self.highest_digit.push(b);
self.digits.push(b);
return;
},
}
}
}
fn from(s : &str) -> u64 {
let mut bank = BigBatteryBank { highest_digit : Vec::new() };
fn from(s : &str, size : usize) -> u64 {
let mut bank = BatteryBank { digits : Vec::new(), size : size };
let l : usize = s.len();
for (i, n) in s.chars().filter_map(utils::char_to_u8).enumerate() {
let offset : usize = l - i;
bank.add_battery(n, if offset > 12 { 0 } else { 12 - offset });
bank.add_battery(n, if offset > size { 0 } else { size - offset });
}
bank.measure_joltage().unwrap()
@ -69,8 +46,8 @@ impl BigBatteryBank {
fn measure_joltage(&self) -> Option<u64> {
let mut joltage : u64 = 0;
for i in 0..12 {
let n : &u8 = self.highest_digit.get(i)?;
for i in 0..self.size {
let n : &u8 = self.digits.get(i)?;
joltage = 10 * joltage + (*n as u64);
}