Skip to content

Instantly share code, notes, and snippets.

@bbqbaron
Created June 5, 2019 14:59
Show Gist options
  • Save bbqbaron/d2cb49a1334567a3e98be1eaab3006aa to your computer and use it in GitHub Desktop.
Save bbqbaron/d2cb49a1334567a3e98be1eaab3006aa to your computer and use it in GitHub Desktop.
(defn pick [doors]
(assoc-in doors
[(rand-int 3) :picked] true))
(defn monty [doors]
(let [first-goat (first (filter
(comp (every-pred
(comp #(= :goat %) :contents)
(comp not :picked))
#(nth doors %))
(range 3)))]
(assoc-in doors
[first-goat :open]
true)))
(defn should-switch [doors]
(some
(every-pred (complement :open)
(complement :picked)
(comp #(= % :car) :contents))
doors))
(defn play [doors]
(-> doors pick monty should-switch))
(defn gen-case []
(let [car-idx (rand-int 3)]
(-> (vec (repeat 3 {:open false :contents :goat :picked false}))
(assoc-in [car-idx :contents] :car))))
(defn brute-force [n]
(let [results (->> (repeatedly gen-case)
(take n)
(map play)
(filter identity)
count)]
(float (/ results n))))
(brute-force 1000)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment