Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 如何在扑克的赢牌功能中返回列表?_Clojure_Clojurescript - Fatal编程技术网

Clojure 如何在扑克的赢牌功能中返回列表?

Clojure 如何在扑克的赢牌功能中返回列表?,clojure,clojurescript,Clojure,Clojurescript,正如我在前面提到的,我正在clojure中进行扑克手的制作,我正处于完成的最后阶段。我只是在winning hand函数中遇到了问题,它应该像从最高的手牌列表中返回手牌一样,但是如果有平局,那么它应该返回所有这些手牌的列表。 下面是我的赢牌功能: (defn hand-rank "Return a value indicating how high the hand ranks." [hand] (let [ra

正如我在前面提到的,我正在clojure中进行扑克手的制作,我正处于完成的最后阶段。我只是在winning hand函数中遇到了问题,它应该像从最高的手牌列表中返回手牌一样,但是如果有平局,那么它应该返回所有这些手牌的列表。 下面是我的赢牌功能:

(defn hand-rank
              "Return a value indicating how high the hand ranks."
              [hand]
              (let [ranks (card-ranks hand)]
                (cond
                 (and (straight ranks) (u-flush hand)) (-> [] (conj 8) (conj (apply max ranks)))
                 (kind 4 ranks) (-> [] (conj 7) (conj (kind 4 ranks)) (conj (kind 1 ranks)))
                 (and (kind 3 ranks) (kind 2 ranks)) (-> [] (conj 6) (conj (kind 3 ranks)) (conj (kind 2 ranks)))
                 (u-flush hand) (-> [] (conj 5) (conj ranks))
                 (straight ranks) (conj [4] (apply max ranks))
                 (kind 3 ranks) (-> [3] (conj (kind 3 ranks)) (conj ranks))
                 (two-pair ranks) (-> [2] (conj (two-pair ranks)) (conj ranks))
                 (kind 2 ranks) (-> [1] (conj (kind 2 ranks)) (conj ranks))
                 :else (-> [0] (conj ranks))
            )))

            (defn winning-hand
              "Return the max hand of the given poker hands."
              [hands]
              (let [min-count (count (apply min-key count (for [hand hands]
                                                            (hand-rank hand))))]
                (reduce (fn [x y]
                          (if (<= 0 (compare (subvec (vec (flatten (hand-rank x))) 0 min-count)
                                             (subvec (vec (flatten (hand-rank y))) 0 min-count)))
                            x
                            y)) hands)))

            (defn allmax
              "Return a list of all items equals to the max of the sequence."
              [coll]
              (let [maximum (winning-hand coll)]
                (for [x coll :when (= maximum x)]
                  x)))

            (defn winning-list
              "Return a list of winning hands. poker([hand1, hand2, ...] => [hand, ..."
              [hands]
              (allmax hands))
(定义手秩)
“返回一个值,该值指示手牌排列的高度。”
[手]
(让[等级(牌等级手)]
(条件
(和(直列)(u-flush hand))(>[](连接8)(连接(应用最大列)))
(第4类等级)(第7类)(第4类等级)(第1类等级)
(和(第3类等级)(第2类等级))(>[](联合体6)(联合体3类等级))(联合体2类等级)))
(u形齐平手)(->[](连体5)(连体等级))
(直列)(联合[4](应用最大列)
(第三类等级)(>[3](联合(第三类等级))(联合等级))
(两对秩)(>[2](联合(两对秩))(联合秩))
(第2类等级)(>[1](联合(第2类等级))(联合等级))
:else(->[0](联合等级))
)))
(得胜手)
“返回给定扑克牌的最大牌数。”
[举手]
(让[最小计数](应用最小键计数)(对于[手]
(排名靠前)
(减少(fn[x y]

(如果(你测试的是手本身的相等性,而不是它的“值”(即直接刷新1到5)。你想要这样的东西

 (defn allmax
          "Return a list of all items equals to the max of the sequence."
          [coll]
          (let [maximum (winning-hand coll)]
            (for [x coll :when (= (hand-value maximum) (hand-value x)]
              x)))

一个更好的解决方案可能是为手部实现一个比较器,并在这里和其他地方使用它。

allmax
只返回与获胜手部返回的手部完全相等的手部。它应该将每只手部的得分与获胜手部的得分进行比较。
(-code>)[](conj x)(conj y))
非常奇怪。只写
[x y]
要简单得多。您好,使用hand值就是给我中奖手的列表,如果有的话。但是我现在有一个问题。如果我输入中奖手([“2H”“3S”“4C”“5D”“AD”][“TH”“AS”“QC”“KD”“JD]”),那么输出应该是([“TH”“AS”“QC”“KD”“JD]”)因为A比5快,但通过使用值,我得到的输出是([“2H”“3S”“4C”“5D”“AD”][“TH”“as”“QC”“KD”“JD”]),因为这两张牌都是直牌。你能帮我解决这个问题吗?你好,艾丽卡,你需要改进你的手牌值/比较器功能,以考虑平局破坏者。例如,一对牌的平局破坏者是次高的牌,而直牌的平局破坏者是直牌中的最高值。如果这是针对project euler,你可以离线给我发消息,我有一些示例代码,你可以看看。