我有一个代表7张扑克牌的牌,我希望使用以下方法找到下一手牌:
[0 0 7 11 11 12 12]
)[0 0 0 0 1 1 1]
index
和index + 1
的值不同,则在index
处增加值,将所有值从0
设置为{ {1}}为零例如,index - 1
会直接返回(next-hand [0 0 0 0 1 1 1])
。但是,[0 0 0 1 1 1 1]
会循环播放,
(next-hand [0 0 0 1 1 1 1])
并返回此有效手:
[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)
这是我的sudo代码,但需要将其转换为clojure。请注意我是如何在手的末尾添加一个非常大的整数以使最后一次比较始终为真。因此,在[0 0 0 0 1 1 2]
的情况下,第一个循环将以[1 1 1 1 1 1 1 99]
i=6
结束。
1 < 99 == true
编辑2013年3月29日星期五:
为了让select解决方案与扑克手模型一起使用,我添加了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
函数,如下所示:
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 %)
。
答案 0 :(得分:0)
一种可能的解决方案:
(defn next [v]
(let [i (->> (map < v (rest v))
(map-indexed vector)
(filter #(% 1))
first)
index (if i (i 0) 6)]
(for [[i x] (map-indexed vector v)]
(cond (= i index) (inc x)
(< i index) 0
:else x))))
(defn next-hand [v]
(->> (iterate next (next v))
(filter #(= 4 (apply + %)))
first
vec))
(next-hand [0 0 0 1 1 1 1])