Skip to content

Instantly share code, notes, and snippets.

@yurkazaytsev
Last active August 14, 2024 15:34
Show Gist options
  • Save yurkazaytsev/15e0617b4a621eb502acad170205a858 to your computer and use it in GitHub Desktop.
Save yurkazaytsev/15e0617b4a621eb502acad170205a858 to your computer and use it in GitHub Desktop.
Solution for 100 prisoner task from Rosseta code in clojure
(ns prisoners
"Solution for this task https://rosettacode.org/wiki/100_prisoners")
(defn prisoner-found? [prisoner opened-drawers]
(->> opened-drawers
(drop-while (partial not= prisoner))
seq
some?))
(defmulti check-drawers (fn [strategy _drawers _prisoner] strategy))
(defmethod check-drawers :random
[_strategy numbers _prisoner]
(random-sample (/ 1 2) numbers))
(defmethod check-drawers :sequential [_strategy numbers prisoner]
(let [numbers-map (zipmap (range) numbers)]
(->> prisoner
(iterate numbers-map)
rest)))
(defn pass-prisoner
[strategy numbers prisoner]
(->> (check-drawers strategy numbers prisoner)
(take 50)
(prisoner-found? prisoner)))
(defn pass-prisoners [strategy numbers]
(every? true? (map (partial pass-prisoner strategy numbers) (range 100))))
(defn check-strategy [strategy n]
(/ (count (filter true? (for [_ (range n)]
(pass-prisoners strategy (shuffle (range 100))))))
(float n)))
(println "Estimated probability for sequential strategy: " (check-strategy :sequential 1000))
(println "Estimated probability for random strategy: " (check-strategy :random 1000))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment