【问题标题】:Rotate char Matrix image in Haskell在 Haskell 中旋转字符矩阵图像
【发布时间】:2013-02-04 12:22:53
【问题描述】:

我目前正在为我的班级分配一项作业,其中一项要求是创建一个名为 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”。 如何让它打印其余部分?

【问题讨论】:

    标签: list haskell matrix rotation


    【解决方案1】:

    Data.List.transpose 的一个简单实现是

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

    转置您的原始图片产生

    147
    258
    369
    

    并反转每一行导致旋转的图片

    741
    852
    963
    

    一般来说,您可以使用以下三个函数的组合来表达任意方向的镜像和旋转:

    transpose
    map reverse -- mirror left <-> right
    reverse -- mirror top <-> bottom
    

    【讨论】:

    • 哦等等,有没有不使用转置的另一种方法?除了 map 和 reverse,我们不应该使用任何内置函数。
    • 你总是可以自己定义transpose,它只依赖于模式匹配和递归。 The code can be found here.
    • 如果你无法理解transpose的实现:最后一行的第一个括号取所有子列表的第一个元素,并将它们组合成一个列表,这使得第一行你的转置矩阵。然后递归转置其余部分。转置[] 产生[],转置第一行为空的内容只是忽略该空行。
    猜你喜欢
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多