パソコン甲子園というのを見つけた。
プログラミング部門の問題が公開されてるので(↓)ちょっとやってみよう。
正方行列つながりってことで問題01。
8文字×8行のパターンを右回りに90度、180度、270度回転させて出力し終了するプログラムを作成してください。
rotateMatrixR で右に90度回転させる。左に回転させる rotateMatrixL があるのは,勘違いしてさきに書いちゃったから。でも考えると右回転はちょっと面倒そうだな。これで正解かも。
main は手抜き。美しくない。
module Main (main) where main :: IO () main = do cs <- getContents >>= return . lines putStrLn "90" showMatrix $ rotateMatrixR cs putStrLn "180" showMatrix $ rotateMatrixR $ rotateMatrixR cs putStrLn "270" showMatrix $ rotateMatrixR $ rotateMatrixR $ rotateMatrixR cs rotateMatrixL :: [[a]] -> [[a]] rotateMatrixL [xs] = [[x]| x <- reverse xs] rotateMatrixL (xs:xss) = zipWith (:) (reverse xs) (rotateMatrixL xss) rotateMatrixR :: [[a]] -> [[a]] rotateMatrixR = reverse . rotateMatrixL . reverse showMatrix :: [String] -> IO () showMatrix = putStr . unlines
実行例。
D:\>type input01.txt #******* #******* #******* #******* #******* #******* #******* ######## D:\>runhaskell problem01.hs < input01.txt 90 ######## #******* #******* #******* #******* #******* #******* #******* 180 ######## *******# *******# *******# *******# *******# *******# *******# 270 *******# *******# *******# *******# *******# *******# *******# ########
追記:
右回転の方が簡単だった……orz
rotateMatrixR' :: [[a]] -> [[a]] rotateMatrixR' = transpose . reverse
*Main> showMatrix sampleMatrix #******* #******* #******* #******* #******* #******* #******* ######## *Main> showMatrix $ rotateMatrixR' sampleMatrix ######## #******* #******* #******* #******* #******* #******* #******* *Main> showMatrix $ rotateMatrixR' $ rotateMatrixR' sampleMatrix ######## *******# *******# *******# *******# *******# *******# *******#
さらに追記:
ちがう!左回転も同じくらい簡単だ。
rotateMatrixL' :: [[a]] -> [[a]] rotateMatrixL' = reverse . transpose