7 枚のカードのポーカー ハンドを表すベクトルがあり、次のメソッドを使用して次のハンドを見つけたいと考えています。
- 値は 0 ~ 12 で、並べ替えられます (例:
[0 0 7 11 11 12 12]
) - 有効なベクトルには、1 つの値が最大 4 つ含まれます。
- 最初の有効なベクトルは
[0 0 0 0 1 1 1]
index
との値index + 1
が異なる場合は、 の値を増やし、 からまでのすべての値をゼロindex
に設定します。0
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)
そして、この有効な手を返します:
[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
。