Advertisement
Guest User

Untitled

a guest
Oct 25th, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (ns test.core)
  2.  
  3. (def asym-hobbit-body-parts
  4.   [{:name "head" :size 3}
  5.    {:name "left-eye" :size 1}
  6.    {:name "left-ear" :size 1}
  7.    {:name "mouth" :size 1}
  8.    {:name "nose" :size 1}
  9.    {:name "neck" :size 2}
  10.    {:name "left-shoulder" :size 3}
  11.    {:name "left-upper-arm" :size 3}
  12.    {:name "chest" :size 10}
  13.    {:name "back" :size 10}
  14.    {:name "left-forearm" :size 3}
  15.    {:name "abdomen" :size 6}
  16.    {:name "left-kidney" :size 1}
  17.    {:name "left-hand" :size 2}
  18.    {:name "left-knee" :size 2}
  19.    {:name "left-thigh" :size 4}
  20.    {:name "left-lower-leg" :size 3}
  21.    {:name "left-achilles" :size 1}
  22.    {:name "left-foot" :size 2}])
  23.  
  24. (defn matching-part
  25.   [part]
  26.   {:name (clojure.string/replace (:name part) #"^left-" "right-")
  27.    :size (:size part)})
  28.  
  29. (defn expand-body-parts
  30.   [expand-fn asym-body-parts]
  31.   (reduce expand-fn [] asym-body-parts))
  32.  
  33. (defn expand-fn
  34.   [final-body-parts part]
  35.   (into final-body-parts (set [part (matching-part part)])))
  36.  
  37. (defn hit
  38.   [hobbit]
  39.   (let [total-size (reduce + (map :size hobbit))
  40.         target-size (rand total-size)]
  41.     (loop [[part & remaining] hobbit
  42.            accumulated-size (:size part)]
  43.       (if (nil? part)
  44.         nil
  45.         (if (> accumulated-size target-size)
  46.           part
  47.           (recur remaining (+ accumulated-size (:size (first remaining)))))))))
  48.  
  49. (defn main
  50.   []
  51.   (let [hobbit (expand-body-parts expand-fn asym-hobbit-body-parts)]
  52.     (println (hit hobbit))))
  53.  
  54. (main)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement