Optimize & simplify day 3
parent
4ae1fea299
commit
3faee72c5d
|
|
@ -1,66 +1,43 @@
|
||||||
use crate::utils;
|
use crate::utils;
|
||||||
|
|
||||||
pub fn answer(text : String) -> ( u16, u64 ) {
|
pub fn answer(text : String) -> ( u64, u64 ) {
|
||||||
( text.as_str().split_whitespace().map(BatteryBank::from).sum()
|
text.as_str()
|
||||||
, text.as_str().split_whitespace().map(BigBatteryBank::from).sum()
|
.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 {
|
struct BatteryBank {
|
||||||
highest_digit : u8,
|
digits : Vec<u8>,
|
||||||
highest_value : u8,
|
size : usize,
|
||||||
}
|
}
|
||||||
impl BatteryBank {
|
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) {
|
fn add_battery(&mut self, b : u8, min_pos : usize) {
|
||||||
for i in min_pos..12 {
|
for i in min_pos..self.size {
|
||||||
match self.highest_digit.get(i) {
|
match self.digits.get(i) {
|
||||||
Some(x) =>
|
Some(x) =>
|
||||||
if b > *x {
|
if b > *x {
|
||||||
self.highest_digit.truncate(i);
|
self.digits.truncate(i);
|
||||||
self.highest_digit.push(b);
|
self.digits.push(b);
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
self.highest_digit.push(b);
|
self.digits.push(b);
|
||||||
return;
|
return;
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn from(s : &str) -> u64 {
|
fn from(s : &str, size : usize) -> u64 {
|
||||||
let mut bank = BigBatteryBank { highest_digit : Vec::new() };
|
let mut bank = BatteryBank { digits : Vec::new(), size : size };
|
||||||
let l : usize = s.len();
|
let l : usize = s.len();
|
||||||
|
|
||||||
for (i, n) in s.chars().filter_map(utils::char_to_u8).enumerate() {
|
for (i, n) in s.chars().filter_map(utils::char_to_u8).enumerate() {
|
||||||
let offset : usize = l - i;
|
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()
|
bank.measure_joltage().unwrap()
|
||||||
|
|
@ -69,8 +46,8 @@ impl BigBatteryBank {
|
||||||
fn measure_joltage(&self) -> Option<u64> {
|
fn measure_joltage(&self) -> Option<u64> {
|
||||||
let mut joltage : u64 = 0;
|
let mut joltage : u64 = 0;
|
||||||
|
|
||||||
for i in 0..12 {
|
for i in 0..self.size {
|
||||||
let n : &u8 = self.highest_digit.get(i)?;
|
let n : &u8 = self.digits.get(i)?;
|
||||||
joltage = 10 * joltage + (*n as u64);
|
joltage = 10 * joltage + (*n as u64);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue