"ACM国際大学対抗プログラミングコンテスト" の問題を解こう

http://www.acm-japan.org/past-icpc/domestic2006/contest/all_ja.html の Problem B を (ものすごく適当に) 解いてみる。

これ、もしかしたら Arrow を使うとすごくきれいに書けるんじゃないだろうか。けどお腹痛いから細かいことを考えられない。

うむ、とりあえず関数と引数の名前が無駄に長すぎたね。

import System
import Data.List

type Container = Char

strageLine :: [Container] -> [([Container],[Container])]
strageLine containers = do nth <- [1..length containers - 1]
                           return $ splitAt nth containers
reversalLine :: [Container] -> [[Container]]
reversalLine containers = [containers, reverse containers]
depatureLine :: ([Container],[Container]) -> [[Container]]
depatureLine (containers1, containers2) =
    [containers1++containers2, containers2++containers1]

organize :: [Container] -> [[Container]]
organize containers = do (a,b) <- strageLine containers
                         aa <- reversalLine a
                         bb <- reversalLine b
                         depatureLine (aa, bb)

main = do (arg:_) <- getArgs
          mapM_ print $ nub $ organize arg