3

7 枚のカードのポーカー ハンドを表すベクトルがあり、次のメソッドを使用して次のハンドを見つけたいと考えています。

  • 値は 0 ~ 12 で、並べ替えられます (例: [0 0 7 11 11 12 12])
  • 有効なベクトルには、1 つの値が最大 4 つ含まれます。
  • 最初の有効なベクトルは[0 0 0 0 1 1 1]
  • indexとの値index + 1が異なる場合は、 の値を増やし、 からまでのすべての値をゼロ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]最初のループの場合、 with で終了し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 日金曜日の編集: select ソリューションがポーカー ハンド モデルで動作する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

4

1 に答える 1

0

考えられる解決策の 1 つ:

(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 に答える