3

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

  • 值从 0 到 12 并已排序(例如[0 0 7 11 11 12 12]
  • 一个有效的向量最多有 4 个一个值
  • 第一个有效向量是[0 0 0 0 1 1 1]
  • 如果index和的值index + 1不同,则增加 at 的值index 并将所有值从0index - 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)

并返回这个有效的手:

[0 0 0 0 1 1 2]

这是我拥有的 sudo 代码,但需要将其转换为 clojure。请注意我如何在手牌末尾添加一个非常大的整数以使最后的比较始终为真。因此,在第一个循环的情况下,将以[1 1 1 1 1 1 1 99]结束。i=61 < 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 %)in next-hand

4

1 回答 1

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])
于 2013-03-29T05:09:50.470 回答