diff options
author | Andreas Grois <andi@grois.info> | 2021-12-04 18:26:46 +0100 |
---|---|---|
committer | Andreas Grois <andi@grois.info> | 2021-12-04 20:19:08 +0100 |
commit | 236b5298a7ebdfe0f4a7aa41ea45ba577ff45147 (patch) | |
tree | 2e68c8f02033cbdb776559abee3083c188e9909d /src/day3.rs | |
parent | e25bd1153d2f54a5b115e3fe840c44b04d697e1f (diff) |
Prepare day 3 part 2 for additional solvers.
Diffstat (limited to 'src/day3.rs')
-rw-r--r-- | src/day3.rs | 27 |
1 files changed, 15 insertions, 12 deletions
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<Item=&'a u32>+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<Item=&'a u32>+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<Item=&'a u32>+Clone { - find_wanted_rating(iterator, max_len, |a,b| a<b) + solver(iterator, max_len, |a,b| a<b) } -#[aoc(day3, part2)] +#[aoc(day3, part2, CloneableIterator)] pub fn solve_part2((input, max_len) : &(Vec<u32>, usize)) -> Option<u32> { - 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)) } |