gpt4 book ai didi

haskell - 如何在 Haskell 中将整数列表转换为 True 和 False 矩阵

转载 作者:行者123 更新时间:2023-12-02 00:16:45 25 4
gpt4 key购买 nike

在本练习中,我应该编写一个函数,该函数接收整数列表作为参数并给出矩阵或列表列表。制作矩阵的要点在于,整数代表矩阵每列中 True 的数量。例如

[2,4,1]

必须翻译为:

enter image description here

在系统中表示为列表的列表:

[ [0,1,0], [0,1,0], [1,1,0], [1,1,1] ]

由于按列操作矩阵(列表列表)并不容易,因此我使用了一个技巧,使用 transpose 将矩阵向左旋转 90 度,这使得矩阵如下所示:

enter image description here

然后我开发了以下算法来解决这个问题:

  1. 获取输入列表的第一个元素
  2. 创建一个长度最大xs的列表(每个列表的长度等于列表中的最大元素)
  3. 在列表中放入第一个元素确定的 True
  4. False填写列表的其余部分
  5. 对所有元素执行相同操作并旋转矩阵

我尝试实现两种解决方案,但每个解决方案都有一个我无法解决的问题:

  1. 这个适用于第一个元素,但我不知道如何将其应用于输入列表的所有元素

    listToMatrix x = (replicate ((maximum x) - (head x)) False) ++ (replicate (head x) True)`
  2. 这适用于所有元素,但无法保留内部列表的长度,因此列表具有不同的长度。

    listToMatrix lst@(x:xs) = ((replicate ((maximum lst) - x) False) ++ (replicate x True)) : listToMatrix xs`

问题 1:如何通过最少的更改使这些功能正常工作?

问题 2:是否有更优雅、更紧凑的解决方案?

附注我在矩阵中使用了 1 和 0 来使它们更具可读性,但它们实际上是 True 和 False

最佳答案

我会使用以下方法,该方法与您的方法兼容。

正如您所建议的,我们在最后使用转置,因为转置矩阵看起来更容易生成。

f :: [Int] -> [[Bool]]
f xs = transpose (...)

然后,xs 的每个元素都必须生成一个新行。我们可以使用列表理解(如下完成),或者使用 map

f :: [Int] -> [[Bool]]
f xs = transpose [ row x | x <- xs ]
where row :: Int -> [Bool]
row x = ...

正如您所建议的,我们还需要 maximum 来生成每一行,因此我们计算一次:

f :: [Int] -> [[Bool]]
f xs = transpose [ row x | x <- xs ]
where m = maximum xs
row :: Int -> [Bool]
row x = ... -- we know x and m, we need m-x Falses and x Trues

现在,您只需调整代码即可。

关于haskell - 如何在 Haskell 中将整数列表转换为 True 和 False 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33986050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com