doall holds on to the head of the seq, "causing the entire seq to reside in memory at one time." (https://clojuredocs.org/clojure.core/doall)
Instead, just find the first solution: (->> (permutations (range 10)) (filter check?) (first) (print-solution)) On Friday, April 8, 2016 at 9:28:55 AM UTC-4, Olivier Scalbert wrote: > > Hello everybody ! > > I just start learning Clojure and I am a complete newbie ! > > I have tried to solve this classical small puzzle with Clojure. > Assign one digit from {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} to each letter {o n e > t h r l v w y} so that > one + one + one + three + three + eleven = twenty > > Here is the code: > > (defn permutations [s] > (lazy-seq > (if (seq (rest s)) > (apply concat (for [x s] > (map #(cons x %) (permutations (remove #{x} s))))) > [s]))) > > (defn tomap [proposal] > (zipmap [:o :n :e :t :h :r :l :v :w :y] proposal)) > > (defn one-value [m] > (+ (* 100 (:o m)) > (* 10 (:n m)) > (:e m))) > > (defn three-value [m] > (+ (* 10000 (:t m)) > (* 1000 (:h m)) > (* 100 (:r m)) > (* 10 (:e m)) > (:e m))) > > (defn eleven-value [m] > (+ (* 100000 (:e m)) > (* 10000 (:l m)) > (* 1000 (:e m)) > (* 100 (:v m)) > (* 10 (:e m)) > (:n m))) > > (defn twenty-value [m] > (+ (* 100000 (:t m)) > (* 10000 (:w m)) > (* 1000 (:e m)) > (* 100 (:n m)) > (* 10 (:t m)) > (:y m))) > > (defn check? [proposal] > (let [m (tomap proposal) > one (one-value m) > three (three-value m) > eleven (eleven-value m) > twenty (twenty-value m)] > > (= (+ one one one three three eleven) > twenty))) > > (defn print-solution [solution] > (println (tomap solution))) > > (doall (map print-solution (filter check? (permutations (range 10))))) > > This program prints the correct solution, but I have some questions ! > It seems to consume lot of memory (around 6GB). Do I miss something with > the lazy evaluation ? > How can I change the code into a more idiomatic one ? > > Thanks for your help and time ! > > Olivier > > > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.