如何比较两个输入列表的元素?

约瑟夫·黄(Joseph Wong)

我们必须开发一个扑克游戏。我已经开发了所有必需的功能,但我坚持使用其中的一个。结果为:(higher-kicker?kicker1 kicker2)比较两个踢球中的对应值,如果第一个踢球的第一个差值较大,则返回true,如果第二个踢球的第一个差值较大,则返回false,或者列表成对相等。示例:(higher-kicker?'(8 5 9)'(8 7 3))应该返回false,因为8 == 8但7> 5。假设两个踢脚列表的长度相等。

我能够做的是比较两只手,例如:

(defn compare-cards [[v1 s1] [v2 s2]]
  (if (= v1 v2)
    (compare (suit-value s1) (suit-value s2))
    (compare v1 v2)))

(defn sort-cards [cards]
  (sort compare-cards cards))

(defn parse-hand [s]
  (sort-cards (mapv parse-card (.split s " "))))

(def foo [[:straight straight?] [:high-card high-card?]])

(defn categorize-hand [hand]
  (some #(% (parse-hand hand)) (map second foo)))

(defmulti tie-break (fn [h _] (categorize-hand h)))

(defmethod tie-break :high-card [h1 h2]
  (drop-while zero? (map compare-cards (reverse h1) (reverse h2))))

(defmethod tie-break :straight [[f1 & _] [f2 & _]]
  (compare-cards f1 f2))

(defn compare-hands [hand1 hand2]
  (let [category1-value (.indexOf (map first foo) (categorize-hand hand1))
        category2-value (.indexOf (map first foo) (categorize-hand hand2))]
    (if (= category1-value category2-value)
      (tie-break (parse-hand hand1) (parse-hand hand2))
      (compare category1-value category2-value))))

但是,在逐个比较人脸值以查看第一个值是否更大时,Im卡住了。谁能帮我?

就像我在做的那样:

(defn higher-kicker? [
card-ranks-1 card-ranks-2] 
(->> (map compare card-ranks-1 card-ranks-2) 
(filter #(not (zero? %)))

那之后该怎么办?

塞思·保尔森(Seth Paulson)

奇怪的是,我找不到从两个列表创建成对列表的函数,所以我自己滚动了。请注意zipmap,因为它不保留顺序。话虽如此,这一切都非常简单。获取第一个不相等的对。如果没有任何列表相等,则返回false,否则将它们进行比较,如果第一个大于第二个则返回。

(defn make-pairs [list1 list2] (partition 2 (interleave list1 list2)))

(defn pair-not= [[item1 item2]] (not (= item1 item2)))

(defn unequal-pairs [list1 list2] (filter pair-not= (make-pairs list1 list2)))

(defn higher-kicker? [kicker1 kicker2]
  (let [unequal-pair (first (unequal-pairs kicker1 kicker2))]
  (if unequal-pair
    (> (first unequal-pair) (second unequal-pair))
    false)))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章