Мы должны разработать покерную игру. Я разработал все необходимые функции, но я застрял в одном. Он идет: (более высокий кикер? Kicker1 kicker2) сравнивает соответствующие значения в двух кикерах и возвращает true, если первый кикер имеет большее значение первого разности, false, если второй кикер делает или если списки попарно равны , Пример: (высший кикер? '(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? %)))
то, что делать после этого?
Он должен очень похож на ваш метод 'tie-break: high-card': используйте' map', чтобы объединить два списка вместе, сравнив их и взяв первое ненулевое значение. С чем вы сталкиваетесь, когда применяете эту технику для поиска кикера? – amalloy
Как сравнить список, преобразованный в zip-список? Например, когда я zipmap '(8 5 9)' (8 7 3), я получаю {8 8, 5 7,9 3}. Теперь, как сравнить 8 с 8, 5 с 7 и так далее; а затем верны true или false соответственно? –
Как я делаю: (defn выше-kicker? [Card-ranks-1 card-ranks-2] (- >> (карта сравнить карты-ряды-1 карточные ряды-2) (фильтр # (не (ноль?%))) то что делать после этого? –