import qualified Data.Text as T splitOn :: String -> String -> [String] splitOn x y = map T.unpack $ T.splitOn (T.pack x) $ T.pack y transpose:: [[a]] -> [[a]] transpose ([]:xs) = [] transpose x = (map head x) : transpose (map tail x) addEmpty :: Int -> [a] -> [a] -> [a] addEmpty x v y | ysize == x+1 = y | ysize <= x = addEmpty x v (y ++ v) | otherwise = [] where ysize = length y formatLine :: [String] -> [String] formatLine x = map (addEmpty nb " ") x where nb = maximum $ map length x formatLines :: [[String]] -> [[String]] formatLines x = map formatLine x completeMatrix :: [[String]] -> [[String]] completeMatrix m = map (addEmpty nb [""]) m where nb = maximum $ map length m column :: [[String]] -> [[String]] column x = transpose $ formatLines $ transpose $ completeMatrix x putToLines :: [[String]] -> [String] putToLines x = map (foldr (++) " ") x main = do content <- getContents -- print $ column $ map (splitOn " ") $ lines content -- print $ putToLines $ column $ map (splitOn " ") $ lines content putStr $ unlines . putToLines $ column $ map (splitOn " ") $ lines content