(ns daily-programmer.20161121_easy.core
  (:use [clojure.string :only [split-lines]]))

(def wire-rules-m {"white" {:allowed #{} :disallowed #{"white" "black"}}
                   "red" {:allowed #{"green"} :disallowed #{}}
                   "black" {:allowed #{} :disallowed #{"white" "green" "orange"}}
                   "orange" {:allowed #{"red" "black"} :disallowed #{}}
                   "green" {:allowed #{"orange" "white"} :disallowed #{}}
                   "purple" {:allowed #{} :disallowed #{"purple" "green" "orange" "white"}}})

(defn check [wire allowed disallowed]
  (and
   (or (empty? allowed) (contains? allowed wire))
   (or (empty? disallowed) (not (contains? disallowed wire)))))

(defn try-defuse [wires]
  (loop [[wire & other] wires
         allowed #{}
         disallowed #{}
         prev-cut true]
    (if (nil? wire)
      prev-cut
      (if-let [cut (check wire allowed disallowed)]
        (let [{:keys [allowed disallowed]} (get wire-rules-m wire)]
          (recur other allowed disallowed cut))
        false))))

(println (if (try-defuse (split-lines (slurp *in*))) "Bomb defused" "Boom"))