Last active
August 14, 2024 15:34
-
-
Save yurkazaytsev/15e0617b4a621eb502acad170205a858 to your computer and use it in GitHub Desktop.
Solution for 100 prisoner task from Rosseta code in clojure
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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