Haskell Min Avg Two Slice
import Data.Array (Array, listArray, (!))

minAvgTwoSlice :: [Int] -> Int
minAvgTwoSlice a = fst (foldl step (0, avg2 0) [0 .. n - 2])
  where
    n   = length a
    arr = listArray (0, n - 1) a :: Array Int Int

    avg2 i = fromIntegral (arr ! i + arr ! (i + 1)) / 2 :: Double
    avg3 i = fromIntegral (arr ! i + arr ! (i + 1) + arr ! (i + 2)) / 3 :: Double

    candidate i
      | i + 2 <= n - 1 = min (avg2 i) (avg3 i)
      | otherwise      = avg2 i

    step (bestIdx, bestVal) i =
      let cur = candidate i
      in  if cur < bestVal then (i, cur) else (bestIdx, bestVal)

This leans on the key trick for this problem: the minimum average slice is always length 2 or 3.