SHOW:
|
|
- or go back to the newest paste.
| 1 | (ns oops.core | |
| 2 | (:require | |
| 3 | [clojure.math.combinatorics :as combi] | |
| 4 | [instaparse.core :as insta])) | |
| 5 | ||
| 6 | (def deck | |
| 7 | (concat | |
| 8 | [\c] ;; wild cantor | |
| 9 | (repeat 4 \p) ;; summoner's pact | |
| 10 | (repeat 4 \l) ;; lotus petal | |
| 11 | (repeat 4 \x) ;; mox | |
| 12 | (repeat 4 \d) ;; dark ritual | |
| 13 | (repeat 4 \r) ;; cabal ritual | |
| 14 | (repeat 8 \g) ;; spirit guide | |
| 15 | (repeat 4 \m) ;; manamorphose | |
| 16 | (repeat 8 \w) ;; voittokeino | |
| 17 | (repeat 4 \t) ;; tappo | |
| 18 | (repeat 4 \n) ;; narcomoeba | |
| 19 | (repeat 3 \h))) ;; cabal therapy | |
| 20 | ||
| 21 | (def bnf | |
| 22 | "S = (1B 2MORE win (ANY*)) | | |
| 23 | (2B (1MORE | dark) win (ANY*)) | |
| 24 | ||
| 25 | 2MORE = (1MORE 1MORE) | dark | |
| 26 | ||
| 27 | 2B = (petal dark) | | |
| 28 | (BLACKMOX dark) | | |
| 29 | (CANTORBLACK dark) | | |
| 30 | (1B 1MORE) | |
| 31 | ||
| 32 | 1B = (manamorph (pact | guide | (mox (manamorph | cantor))) COLORLESS) | | |
| 33 | (petal COLORLESS) | | |
| 34 | (BLACKMOX COLORLESS) | | |
| 35 | (CANTORBLACK COLORLESS) | |
| 36 | ||
| 37 | CANTORBLACK = (pact | guide | (mox manamorph)) (pact | cantor) | |
| 38 | - | 1MORE = pact | guide | petal | cabal | (mox (narco | cantor | therapy | win)) |
| 38 | + | 1MORE = pact | guide | petal | cabal | BLACKMOX | NONBLACKMOX |
| 39 | - | COLORLESS = pact | guide | cabal | BLACKMOX | NONBLACKMOX |
| 39 | + | COLORLESS = pact | guide | petal | dark | BLACKMOX | NONBLACKMOX |
| 40 | NONBLACKMOX = mox (manamorph | cantor | narco) | |
| 41 | BLACKMOX = mox (dark | cabal | therapy | win) | |
| 42 | ANY = cantor | pact | petal | mox | dark | cabal | guide | manamorph | win | kill | narco | therapy | |
| 43 | cantor = 'c' | |
| 44 | petal = 'l' | |
| 45 | pact = 'p' | |
| 46 | guide = 'g' | |
| 47 | mox = 'x' | |
| 48 | dark = 'd' | |
| 49 | cabal = 'r' | |
| 50 | manamorph = 'm' | |
| 51 | win = 'w' | |
| 52 | kill = 't' | |
| 53 | narco = 'n' | |
| 54 | therapy = 'h'") | |
| 55 | ||
| 56 | (def parser | |
| 57 | (insta/parser bnf)) | |
| 58 | ||
| 59 | ||
| 60 | (defn hands | |
| 61 | [n] | |
| 62 | (->> | |
| 63 | (combi/combinations deck n) | |
| 64 | (map sort) | |
| 65 | frequencies | |
| 66 | seq)) | |
| 67 | ||
| 68 | (defn kill? | |
| 69 | [hand] | |
| 70 | (loop [hands (combi/permutations hand)] | |
| 71 | (if (empty? hands) | |
| 72 | false | |
| 73 | (let [cur (apply str (first hands)) | |
| 74 | rst (rest hands)] | |
| 75 | (if-not (insta/failure? (parser cur)) | |
| 76 | true | |
| 77 | (recur rst)))))) | |
| 78 | ||
| 79 | (defn first-turn-kills | |
| 80 | [hands] | |
| 81 | (->> | |
| 82 | hands | |
| 83 | (filter (fn [[hand _]] (some #{\w} hand)))
| |
| 84 | (filter (fn [[hand _]] (kill? hand))) | |
| 85 | (map (fn [[_ amount]] amount)) | |
| 86 | - | (reduce +))) |
| 86 | + | (reduce +))) |