20 lines
469 B
Haskell
20 lines
469 B
Haskell
import Data.Bifunctor (bimap)
|
|
import Data.List (unfoldr)
|
|
import Data.Tuple (swap)
|
|
|
|
digSum :: Int -> Int -> Int
|
|
digSum base = sum . unfoldr f
|
|
where
|
|
f 0 = Nothing
|
|
f n = Just (swap (quotRem n base))
|
|
|
|
digRoot :: Int -> Int -> (Int, Int)
|
|
digRoot base =
|
|
head .
|
|
dropWhile ((>= base) . snd) . iterate (bimap succ (digSum base)) . (,) 0
|
|
|
|
main :: IO ()
|
|
main = do
|
|
putStrLn "in base 10:"
|
|
mapM_ (print . ((,) <*> digRoot 10)) [627615, 39390, 588225, 393900588225]
|