View difference between Paste ID: 7N7ds5sd and hjk52GaC
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 +)))