Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (ns test.core)
- (def asym-hobbit-body-parts
- [{:name "head" :size 3}
- {:name "left-eye" :size 1}
- {:name "left-ear" :size 1}
- {:name "mouth" :size 1}
- {:name "nose" :size 1}
- {:name "neck" :size 2}
- {:name "left-shoulder" :size 3}
- {:name "left-upper-arm" :size 3}
- {:name "chest" :size 10}
- {:name "back" :size 10}
- {:name "left-forearm" :size 3}
- {:name "abdomen" :size 6}
- {:name "left-kidney" :size 1}
- {:name "left-hand" :size 2}
- {:name "left-knee" :size 2}
- {:name "left-thigh" :size 4}
- {:name "left-lower-leg" :size 3}
- {:name "left-achilles" :size 1}
- {:name "left-foot" :size 2}])
- (defn matching-part
- [part]
- {:name (clojure.string/replace (:name part) #"^left-" "right-")
- :size (:size part)})
- (defn expand-body-parts
- [expand-fn asym-body-parts]
- (reduce expand-fn [] asym-body-parts))
- (defn expand-fn
- [final-body-parts part]
- (into final-body-parts (set [part (matching-part part)])))
- (defn hit
- [hobbit]
- (let [total-size (reduce + (map :size hobbit))
- target-size (rand total-size)]
- (loop [[part & remaining] hobbit
- accumulated-size (:size part)]
- (if (nil? part)
- nil
- (if (> accumulated-size target-size)
- part
- (recur remaining (+ accumulated-size (:size (first remaining)))))))))
- (defn main
- []
- (let [hobbit (expand-body-parts expand-fn asym-hobbit-body-parts)]
- (println (hit hobbit))))
- (main)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement