From 236b5298a7ebdfe0f4a7aa41ea45ba577ff45147 Mon Sep 17 00:00:00 2001 From: Andreas Grois Date: Sat, 4 Dec 2021 18:26:46 +0100 Subject: Prepare day 3 part 2 for additional solvers. --- src/day3.rs | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/day3.rs b/src/day3.rs index bfb8ad2..81c5977 100644 --- a/src/day3.rs +++ b/src/day3.rs @@ -65,23 +65,26 @@ fn find_wanted_rating<'a, T,U>(iterator : T, max_len : usize, comparison : U) -> } } -fn find_oxygen_rating<'a, T>(iterator : T, max_len : usize) -> Option<&'a u32> - where T : Iterator+Clone +type Solver<'a, T> = fn(T, usize, fn(usize, usize)->bool) -> Option<&'a u32>; + +fn find_oxygen_rating<'a, T>(iterator : T, max_len : usize, solver : Solver<'a, T>) -> Option<&'a u32> + where T : Iterator+Clone, { - find_wanted_rating(iterator, max_len, |a,b| a>=b) + solver(iterator, max_len, |a,b| a>=b) } -fn find_co2_rating<'a,T>(iterator : T, max_len : usize) -> Option<&'a u32> +fn find_co2_rating<'a,T>(iterator : T, max_len : usize, solver : Solver<'a, T>) -> Option<&'a u32> where T : Iterator+Clone { - find_wanted_rating(iterator, max_len, |a,b| a, usize)) -> Option { - let oxygen_rating = find_oxygen_rating(input.iter(),*max_len); + let solver = find_wanted_rating; + let oxygen_rating = find_oxygen_rating(input.iter(),*max_len, solver); oxygen_rating.and_then(|oxygen_rating| { - find_co2_rating(input.iter(), *max_len).map(|co2_rating| co2_rating * oxygen_rating) + find_co2_rating(input.iter(), *max_len,solver).map(|co2_rating| co2_rating * oxygen_rating) }) } @@ -109,16 +112,16 @@ mod day3_tests{ } #[test] - fn test_find_oxygen_rating() { + fn test_find_oxygen_rating_clonable_iterator() { let data = get_day3_processed_testdata(); - let result = find_oxygen_rating(data.0.iter(),data.1); + let result = find_oxygen_rating(data.0.iter(),data.1, find_wanted_rating); assert_eq!(result, Some(&23)) } #[test] - fn test_find_co2_rating() { + fn test_find_co2_rating_clonable_iterator() { let data = get_day3_processed_testdata(); - let result = find_co2_rating(data.0.iter(), data.1); + let result = find_co2_rating(data.0.iter(), data.1, find_wanted_rating); assert_eq!(result, Some(&10)) } -- cgit v1.2.3