18 lines
1,021 B
Clojure
18 lines
1,021 B
Clojure
(defn solves-for? [sailors initial-coconut-count]
|
|
(with-local-vars [coconuts initial-coconut-count, hidings 0]
|
|
(while (and (> @coconuts sailors) (= (mod @coconuts sailors) 1)
|
|
(var-set coconuts (/ (* (dec @coconuts) (dec sailors)) sailors))
|
|
(var-set hidings (inc @hidings)))
|
|
(and (zero? (mod @coconuts sailors)) (= @hidings sailors))))
|
|
|
|
(doseq [sailors (range 5 7)]
|
|
(let [start (first (filter (partial solves-for? sailors) (range)))]
|
|
(println (str sailors " sailors start with " start " coconuts:"))
|
|
(with-local-vars [coconuts start]
|
|
(doseq [sailor (range sailors)]
|
|
(let [hidden (/ (dec @coconuts) sailors)]
|
|
(var-set coconuts (/ (* (dec @coconuts) (dec sailors)) sailors))
|
|
(println (str "\tSailor " (inc sailor) " hides " hidden " coconuts and gives 1 to the monkey, leaving " @coconuts "."))))
|
|
(println
|
|
(str "\tIn the morning, each sailor gets another " (/ @coconuts sailors) " coconuts."))
|
|
(println "\tThe monkey gets no more.\n"))))
|