• + 0 comments

    Haskell:

    module Main where
    
    import Data.List (transpose)
    
    solve :: String -> String
    solve plain = encrypted
      where
        plain' = filter (/= ' ') plain
        len = length plain'
        rows = floor . sqrt $ fromIntegral len
        cols = ceiling . sqrt $ fromIntegral len
        grid = [take cols $ drop (i * cols) plain' | i <- [0 .. rows]]
        grid' = filter (/= "") grid -- edge case, final is ""
        encrypted = unwords $ transpose grid
    
    main :: IO ()
    main = interact solve