我有一个表示七张扑克牌的向量,想要使用以下方法找到下一手牌:
并返回这张有效的牌:
- 值的范围从0到12,并已排序(例如:[0 0 7 11 11 12 12])
- 有效向量最多只能有4个相同的值
- 第一个有效向量是[0 0 0 0 1 1 1]
- 如果index和index + 1处的值不同,则将index处的值加1,并将0到index-1处的所有值设置为0
- 重复上一步直到向量有效
[0 0 1 1 1 1 1] (invalid)
[0 1 1 1 1 1 1] (invalid)
[1 1 1 1 1 1 1] (invalid)
[0 0 0 0 0 0 2] (invalid)
[0 0 0 0 0 1 2] (invalid)
并返回这张有效的牌:
[0 0 0 0 1 1 2]
这是我拥有的sudo代码,但需要将其转换为clojure。请注意,我在手末尾添加了一个非常大的整数以使最后一次比较始终为true。因此,在[1 1 1 1 1 1 1 99]
的情况下,第一个循环将在i=6
处结束,且1 < 99 == true
。
let hand = [hand 99]
while hand is invalid
for i in range(0,6)
if hand[i] < hand[i+1]
increment hand[i]
break
for j in range(0,i-1)
hand[j] = 0
编辑时间:2013年3月29日星期五:
为了使选择方案与扑克牌手模型配合使用,我添加了一个is-valid
函数,代码如下:
(defn is-valid [v]
(let [distinct-ranks (partition-by identity v)
count-distinct (map count distinct-ranks)
max-count (apply max count-distinct)]
(<= max-count 4)))
并且更新为(filter #(is-valid %)
在next-hand
中。
core.logic
的工作。 - Alex Taggart