2

私は現在、クラスの課題に取り組んでおり、要件の 1 つは、rotate90 という関数を作成することです。この関数は基本的に [[Char]] を受け取り、時計回りに 90 度回転します。

例えば:

type Picture = [[Char]]
pic :: Picture
pic = [ "123",
    "456",
    "789" ]

になる:

[ "741",
  "852",
  "963" ]

これまでの私のコードは次のようになります。

rotate90 :: Picture -> Picture
rotate90 (x:xs)
    | (x:xs) == []          = []
    | xs == [] && x /= []   = formRow ([[]]) (formCol x)
    | xs /= []              = formRow (rotate90 xs) (formCol x)


formCol :: [Char] -> [[Char]]
formCol y = [[a] | a <- y]

formRow :: [[Char]] -> [[Char]] -> [[Char]]
formRow (x:xs) (y:ys)
    | xs == [] || ys == []  = (x++y):[]
    | otherwise             = (x++y):formRow xs ys

現在、マトリックスの最初の「行」のみを出力します。これは、例から「741」です。残りを印刷するにはどうすればよいですか?

4

1 に答える 1

6

の観点からの単純な実装Data.List.transpose

-- | Rotate clockwise
cw = map reverse . transpose
-- | Rotate counter-clockwise
cw = reverse . transpose

元の画像を転置すると、

147
258
369

各行を逆にすると、画像が回転します

741
852
963

一般に、次の3つの機能の組み合わせを使用して、ミラーリングと任意の方向への回転を表現できます。

transpose
map reverse -- mirror left <-> right
reverse -- mirror top <-> bottom
于 2013-02-04T12:29:16.520 に答える