縦書き変換

30分プログラム、その649。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_208にインスパイアされて、縦書き変換を作ってみました。でも、日本語はできません。

普通に書いててもつまんないよねー、とか思って、ArrowやらHUnitやらを使ってます。どうせ時間をかけるなら、日本語表示にチャレンジすべきだったと思います。しまったなぁ。

使い方

$ echo "puts\nhello\nworld" | tate
w h p
o e u
r l t
l l s
d o

ソースコード

import Control.Arrow
import Data.List
import Test.HUnit.Base
import Test.HUnit.Text

sameSize :: a -> [[a]] -> [[a]]
sameSize pad xs = map (\x-> take n $ x ++ repeat pad) xs
    where n = maximum $ map length xs

tate :: [String] -> [String]
tate = sameSize ' ' >>> transpose >>> map (intersperse ' ' >>> reverse)


test1 = TestCase (assertEqual "empty" [] $ tate [])
test2 = TestCase (assertEqual "empty" ["g d a","h e b","i f c"] $
                     tate ["abc","def","ghi"])
test3 = TestCase (assertEqual "empty" ["g d a","h e b","i f  "] $
                     tate ["ab","def","ghi"])

tests = runTestTT $ TestList [TestLabel "test1" test1,
                              TestLabel "test2" test2,
                              TestLabel "test3" test3]

main = interact (unlines.tate.lines)