diff --git a/haskell/Puzzles/Day3.hs b/haskell/Puzzles/Day3.hs index 6abafa1..2167af3 100644 --- a/haskell/Puzzles/Day3.hs +++ b/haskell/Puzzles/Day3.hs @@ -32,9 +32,9 @@ maxBatteries :: Int -> Bank -> Maybe [Battery] maxBatteries n0 (Bank bs0) = flip unfoldrM (n0, toList bs0) \case (0, _) -> pure Nothing (n, bs) -> do - (b, i) <- findMax <$> nonEmpty (dropEnd (n - 1) bs) + (i, b) <- findMax <$> nonEmpty (dropEnd (n - 1) bs) pure $ Just (b, (n - 1, drop (i + 1) bs)) -- returns the leftmost element in case of a tie -findMax :: (Ord a) => NonEmpty a -> (a, Int) -findMax = foldl1' (\m x -> if fst x > fst m then x else m) . flip NE.zip (0 :| [1 ..]) +findMax :: (Ord a) => NonEmpty a -> (Int, a) +findMax = foldl1' (\m x -> if snd x > snd m then x else m) . NE.zip (0 :| [1 ..]) diff --git a/rust/puzzles/day3.rs b/rust/puzzles/day3.rs index 111c359..121c224 100644 --- a/rust/puzzles/day3.rs +++ b/rust/puzzles/day3.rs @@ -53,7 +53,7 @@ fn max_batteries(n: usize, v: &[u8]) -> Option> { let mut slice = v; while remaining > 0 { match find_max(&slice[..slice.len() - remaining + 1]) { - Some((b, i)) => { + Some((i, b)) => { result.push(*b); remaining -= 1; slice = &slice[i + 1..]; @@ -64,12 +64,8 @@ fn max_batteries(n: usize, v: &[u8]) -> Option> { Some(result) } -fn find_max(v: &[A]) -> Option<(&A, usize)> { - v.iter() - .enumerate() - .rev() - .max_by_key(|x| x.1) - .map(|(n, x)| (x, n)) +fn find_max(v: &[A]) -> Option<(usize, &A)> { + v.iter().enumerate().rev().max_by_key(|x| x.1) } fn digits_to_int(digits: &[u8]) -> usize {