列表理解中的条件,找到可能性

时间:2017-05-16 20:34:21

标签: haskell permutation list-comprehension

有3个键和3个锁,我必须编写一个代码来显示可能的尝试。规则是:

  • 第二个密钥永远不能放在第一个密钥之前。
  • 不能多次尝试任何密钥。
  • 第一个密钥不能作为第一个密钥。
  • 并且您不能按照3 - 2 - 1
  • 的顺序放置它们
  • 并且作为提示,给出:[(x,y,z)| x< - [1..3],]

我希望以一种方式更改此代码,而不是" fst< - [3]"它说; " fst不能[1]" 而且我还想补充说2之前不能来1.我尝试了它(elemIndex 2(x,y,z))> (elemIndex 1(x,y,z))  但它没有用。一些想法我会很感激。

d = [(x,y,z) | x <- [1..3], y <- [1..3], z <-[1..3], fst <- [3] , tail <- 1], x /= y, y /= z, x /= z]

1 个答案:

答案 0 :(得分:1)

您可以使用以下内容:

d = [(3, y, z) | y <- [1..2], z <-[1..2], y /= z, y /= 2]

给出了

[(3,1,2)]

<强>解释

  

第一个键不能作为第一个键。

  

第二个密钥永远不能放在第一个密钥之前。

暗示x不能为1或2,因此必须为3.这就是

[(3, y, z) | y <- [1..2], z <-[1..2]

  

无法多次尝试任何密钥。

我们也有

, y != z

最后

  

第二个密钥永远不能放在第一个密钥之前。

给出

,y / = 2]

事实上,有些想法,你可以说你可以写

d = [(3, 1, 2)]