From 87b28627e8a5918ff5f6160ab6f55644caedb825 Mon Sep 17 00:00:00 2001 From: Andreas Grois Date: Sat, 4 Dec 2021 16:52:07 +0100 Subject: Minor --- src/day3.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'src/day3.rs') diff --git a/src/day3.rs b/src/day3.rs index 5c17ebd..b82ad75 100644 --- a/src/day3.rs +++ b/src/day3.rs @@ -30,16 +30,13 @@ trait ClonableIterator: Iterator + DynClone {} impl ClonableIterator for I {} clone_trait_object!( ClonableIterator); -fn get_most_or_least_common_bit_by_comparison<'a, T, U>(iterator : T , bit_from_right : usize, comparison : &U) -> bool +fn count_ones_and_zeros<'a, T>(iterator : T , bit_from_right : usize) -> (usize, usize) where T : Iterator, - U : Fn(usize,usize)->bool { - let (ones, zeros) = iterator.fold((0,0), |(ones, zeros), value| if value & (1 < bool { +fn has_record_desired_bit(record : u32, most_common_bit_mask : u32, target : u32) -> bool { (record & most_common_bit_mask) == target } @@ -50,9 +47,11 @@ fn find_wanted_rating<'a, T,U>(iterator : T, max_len : usize, comparison : U) -> let init : Box> = Box::new(iterator); let result = (0..max_len).rev().fold(init,|iterator, bit_from_right| { let mask = 1 << bit_from_right; - let target_bit_value = if get_most_or_least_common_bit_by_comparison(iterator.clone(),bit_from_right, &comparison) { mask } else { 0 }; + let (ones, zeros) = count_ones_and_zeros(iterator.clone(), bit_from_right); + println!("ones: {}, zeros: {}", ones, zeros); + let target_bit_value = if comparison(ones, zeros) { mask } else { 0 }; println!("Most common for bit_from_right {} : {}", bit_from_right, target_bit_value); - let filtered = iterator.filter(move |&&value| has_record_most_common_bit(value,mask,target_bit_value)); + let filtered = iterator.filter(move |&&value| has_record_desired_bit(value,mask,target_bit_value)); let boxed : Box> = Box::new(filtered); boxed }); -- cgit v1.2.3