(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"))
KG5zIGRhaWx5LXByb2dyYW1tZXIuMjAxNjExMjFfZWFzeS5jb3JlCiAgKDp1c2UgW2Nsb2p1cmUuc3RyaW5nIDpvbmx5IFtzcGxpdC1saW5lc11dKSkKCihkZWYgd2lyZS1ydWxlcy1tIHsid2hpdGUiIHs6YWxsb3dlZCAje30gOmRpc2FsbG93ZWQgI3sid2hpdGUiICJibGFjayJ9fQogICAgICAgICAgICAgICAgICAgInJlZCIgezphbGxvd2VkICN7ImdyZWVuIn0gOmRpc2FsbG93ZWQgI3t9fQogICAgICAgICAgICAgICAgICAgImJsYWNrIiB7OmFsbG93ZWQgI3t9IDpkaXNhbGxvd2VkICN7IndoaXRlIiAiZ3JlZW4iICJvcmFuZ2UifX0KICAgICAgICAgICAgICAgICAgICJvcmFuZ2UiIHs6YWxsb3dlZCAjeyJyZWQiICJibGFjayJ9IDpkaXNhbGxvd2VkICN7fX0KICAgICAgICAgICAgICAgICAgICJncmVlbiIgezphbGxvd2VkICN7Im9yYW5nZSIgIndoaXRlIn0gOmRpc2FsbG93ZWQgI3t9fQogICAgICAgICAgICAgICAgICAgInB1cnBsZSIgezphbGxvd2VkICN7fSA6ZGlzYWxsb3dlZCAjeyJwdXJwbGUiICJncmVlbiIgIm9yYW5nZSIgIndoaXRlIn19fSkKCihkZWZuIGNoZWNrIFt3aXJlIGFsbG93ZWQgZGlzYWxsb3dlZF0KICAoYW5kCiAgIChvciAoZW1wdHk/IGFsbG93ZWQpIChjb250YWlucz8gYWxsb3dlZCB3aXJlKSkKICAgKG9yIChlbXB0eT8gZGlzYWxsb3dlZCkgKG5vdCAoY29udGFpbnM/IGRpc2FsbG93ZWQgd2lyZSkpKSkpCgooZGVmbiB0cnktZGVmdXNlIFt3aXJlc10KICAobG9vcCBbW3dpcmUgJiBvdGhlcl0gd2lyZXMKICAgICAgICAgYWxsb3dlZCAje30KICAgICAgICAgZGlzYWxsb3dlZCAje30KICAgICAgICAgcHJldi1jdXQgdHJ1ZV0KICAgIChpZiAobmlsPyB3aXJlKQogICAgICBwcmV2LWN1dAogICAgICAoaWYtbGV0IFtjdXQgKGNoZWNrIHdpcmUgYWxsb3dlZCBkaXNhbGxvd2VkKV0KICAgICAgICAobGV0IFt7OmtleXMgW2FsbG93ZWQgZGlzYWxsb3dlZF19IChnZXQgd2lyZS1ydWxlcy1tIHdpcmUpXQogICAgICAgICAgKHJlY3VyIG90aGVyIGFsbG93ZWQgZGlzYWxsb3dlZCBjdXQpKQogICAgICAgIGZhbHNlKSkpKQoKKHByaW50bG4gKGlmICh0cnktZGVmdXNlIChzcGxpdC1saW5lcyAoc2x1cnAgKmluKikpKSAiQm9tYiBkZWZ1c2VkIiAiQm9vbSIpKQ==