2017-09-23 10:01:46 +02:00
|
|
|
import Data.List (mapAccumL)
|
2019-09-12 10:33:56 -07:00
|
|
|
import Control.Arrow ((&&&))
|
2017-09-23 10:01:46 +02:00
|
|
|
|
|
|
|
|
floyd :: Int -> [[Int]]
|
|
|
|
|
floyd n =
|
|
|
|
|
snd $
|
|
|
|
|
mapAccumL
|
2018-08-17 15:15:24 +01:00
|
|
|
(\a x ->
|
2019-09-12 10:33:56 -07:00
|
|
|
((succ &&& enumFromTo a) (a + x)))
|
2017-09-23 10:01:46 +02:00
|
|
|
1
|
|
|
|
|
[0 .. pred n]
|
|
|
|
|
|
2018-08-17 15:15:24 +01:00
|
|
|
-- TEST -------------------------------------
|
2017-09-23 10:01:46 +02:00
|
|
|
showFloyd :: [[Int]] -> String
|
|
|
|
|
showFloyd xs =
|
|
|
|
|
let padRight n = length >>= (<$> mappend (replicate n ' ')) . drop
|
|
|
|
|
in unlines $
|
|
|
|
|
(concat .
|
|
|
|
|
zipWith ((. show) . padRight) ((succ . length . show) <$> last xs)) <$>
|
|
|
|
|
xs
|
|
|
|
|
|
|
|
|
|
main :: IO ()
|
|
|
|
|
main = mapM_ putStrLn $ (showFloyd . floyd) <$> [5, 14]
|