【发布时间】:2021-05-05 14:54:01
【问题描述】:
我正在用 Haskell 写一个数独谜题,我有一个 [[Maybe Int]] 我需要检查哪个 [Maybe Int] 包含最少的 Nothing 元素。换句话说,在下面的代码中我应该返回 1,也就是只有两个 Nothing 的列表的位置:
newtype Puzzle = Puzzle [[Maybe Int]]
deriving (Show, Eq)
example :: Puzzle
example = [ [Just 3, Just 6, Nothing,Nothing,Just 7, Just 1, Just 2, Nothing,Nothing]
, [Just 7,Just 5, Just 4, Just 9, Just 4, Nothing, Just 1, Just 8, Just 2]
, [Nothing,Nothing,Just 9, Just 2, Nothing,Just 4, Just 7, Nothing,Nothing]
, [Nothing,Nothing,Nothing,Nothing,Just 1, Just 3, Nothing,Just 2, Just 8]
, [Just 4, Nothing,Nothing,Just 5, Nothing,Just 2, Nothing,Nothing,Just 9]
, [Just 2, Just 7, Nothing,Just 4, Just 6, Nothing,Nothing,Nothing,Nothing]
, [Nothing,Nothing,Just 5, Just 3, Nothing,Just 8, Just 9, Nothing,Nothing]
, [Nothing,Just 8, Just 3, Nothing,Nothing,Nothing,Nothing,Just 6, Nothing]
, [Nothing,Nothing,Just 7, Just 6, Just 9, Nothing,Nothing,Just 4, Just 3]
]
[编辑]
我已经想出了一个解决方案,可以满足我的要求,但这非常缓慢且效率低下,所以我想知道是否有任何方法可以以算法更快的方式编写它。
nrOfBlanks :: Puzzle -> [Int]
nrOfBlanks sud = map length [ filter isNothing r | r <- rows sud]
whichBlock :: Puzzle -> Maybe Int
whichBlock sud =
whichBlock sud = let i = nrOfBlanks sud
in head(map (\x -> case x of
0 -> elemIndex (foldl1' min (tail i)) i
_ -> elemIndex (foldl1' min i) i) i)
有什么帮助吗?提前致谢!
【问题讨论】:
-
你尝试了什么?什么不工作?
-
尝试组合使用
countNothing = length . filter isNothing、minimumBy、indexed = zipWith [0..],当然还有fst -
@WillemVanOnsem 我编辑了,所以你可以看到我到目前为止的内容
标签: list haskell functional-programming maybe