module Exercise05 where -- May or may not be useful: computes the logarithm base 2 (rounded down) of the given number. -- You don't have to move this into the WETT tags if you want to use it. log2 :: (Integral a, Num b) => a -> b log2 = let go acc n = if n <= 1 then acc else go (acc + 1) (n `div` 2) in go 0 {-WETT-} decompose :: [Integer] -> [Integer] decompose ds = recursive ds [] -- dimensions, interim result => new interim result recursive :: [Integer] -> [Integer] -> [Integer] recursive ds xs = if c > 0 then recursive ds (old ++ rest ++ [c]) else xs where l = length xs d = fromIntegral (length ds) c = getCubiodCount ds l rest = [(xs !! (l - 1)) - (c * 2 ^ d) | l /= 0] old = if l == 0 then [] else take (l - 1) xs -- dimensions, length => count getCubiodCount :: [Integer] -> Int -> Integer getCubiodCount ds l = product [d `div` (2 ^ l) | d <- ds] {-TTEW-}