使用Clojure矢量来模拟7张牌扑克牌

时间:2013-03-29 00:59:24

标签: clojure

我有一个代表7张扑克牌的牌,我希望使用以下方法找到下一手牌:

  • 值为0到12并已排序(例如[0 0 7 11 11 12 12]
  • 有效矢量最多只有4个值
  • 第一个有效的向量是[0 0 0 0 1 1 1]
  • 如果indexindex + 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 %)

1 个答案:

答案 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])