From b493325dd7b620958f48a353908fb731e20c7b33 Mon Sep 17 00:00:00 2001 From: barany Date: Wed, 27 May 2020 23:42:28 +0200 Subject: [PATCH] Initial commit --- src/p_p_p_pokerface.clj | 121 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 110 insertions(+), 11 deletions(-) diff --git a/src/p_p_p_pokerface.clj b/src/p_p_p_pokerface.clj index 5ea80094..71ed09db 100644 --- a/src/p_p_p_pokerface.clj +++ b/src/p_p_p_pokerface.clj @@ -1,34 +1,133 @@ (ns p-p-p-pokerface) (defn rank [card] - nil) + (let [[ rank _] card + rank-map {\2 2 + \3 3 + \4 4 + \5 5 + \6 6 + \7 7 + \8 8 + \9 9 + \T 10 + \J 11 + \Q 12 + \K 13 + \A 14}] + (get rank-map rank)) +) (defn suit [card] - nil) + (let [[ _ suit] card] + (str suit) + ) +) (defn pair? [hand] - nil) + (let [ranks (map rank hand) + freqs (frequencies ranks) + values (vals freqs) + ] + (> (apply max values) 1) + ) +) (defn three-of-a-kind? [hand] - nil) + (let [ranks (map rank hand) + freqs (frequencies ranks) + values (vals freqs) + ] + (> (apply max values) 2) + ) +) (defn four-of-a-kind? [hand] - nil) + (let [ranks (map rank hand) + freqs (frequencies ranks) + values (vals freqs) + ] + (> (apply max values) 3) + ) +) (defn flush? [hand] - nil) + (let [suits (map suit hand) + freqs (frequencies suits)] + (= (count freqs) 1) + ) +) (defn full-house? [hand] - nil) + (let [ranks (map rank hand) + freqs (frequencies ranks) + values (vals freqs) + ] + (and (= (apply max values) 3) + (= (apply min values) 2)) + ) +) (defn two-pairs? [hand] - nil) + (let [ranks (map rank hand) + freqs (frequencies ranks) + values (vals freqs) + val-freqs (frequencies values) + val-vals (vals val-freqs) + sorted (sort val-vals)] + (and (< (apply max values) 3) + (= 2(count val-freqs)) + (= 1 (first sorted)) + (= 2 (last sorted))) + ) +) (defn straight? [hand] - nil) + (let [ + ranks (map rank hand) + + replace-if-needed (fn [ranks] (let [ + max-rank (apply max ranks) + min-rank (apply min ranks) + ] + (if (and (= max-rank 14) (= min-rank 2)) + (replace {14 1} ranks) + ranks) + ) + ) + + check-straight (fn [ranks] (let [ + max-rank (apply max ranks) + min-rank (apply min ranks) + freqs (frequencies ranks) + values (vals freqs) + val-freqs (frequencies values) + val-vals (vals val-freqs) + ] + (and (= 4 (- max-rank min-rank)) + (= (first val-vals) 5)) + )) + + ] + + (check-straight (replace-if-needed ranks)) + ) +) (defn straight-flush? [hand] - nil) + (and (straight? hand) (flush? hand)) +) (defn value [hand] - nil) + (cond + (straight-flush? hand) 8 + (four-of-a-kind? hand) 7 + (full-house? hand) 6 + (flush? hand) 5 + (straight? hand) 4 + (three-of-a-kind? hand) 3 + (two-pairs? hand) 2 + (pair? hand) 1 + :else 0 + ) +)