Skip to content

Instantly share code, notes, and snippets.

@secondspass
Created January 18, 2017 09:58
Show Gist options
  • Save secondspass/630dc31812db31e7748fc778c6b8b09a to your computer and use it in GitHub Desktop.
Save secondspass/630dc31812db31e7748fc778c6b8b09a to your computer and use it in GitHub Desktop.
Practice exercise
(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]
(if (re-find #"^left-" (:name part))
#{ {:name (clojure.string/replace (:name part) #"^left-" "right-")
:size (:size part)}
{:name (clojure.string/replace (:name part) #"^left-" "top-")
:size (:size part)}
{:name (clojure.string/replace (:name part) #"^left-" "bottom-")
:size (:size part)}
}))
(defn better-symmetrize-body-parts
"Expects a seq of maps that have a :name and :size"
[asym-body-parts]
(reduce (fn [final-body-parts part]
(into final-body-parts (set (into (into [] (matching-part part)) #{part}))))
[]
asym-body-parts))
(pprint (better-symmetrize-body-parts asym-hobbit-body-parts))
;; Result:
;;[{:name "head", :size 3}
;; {:name "left-eye", :size 1}
;; {:name "right-eye", :size 1}
;; {:name "bottom-eye", :size 1}
;; {:name "top-eye", :size 1}
;; {:name "left-ear", :size 1}
;; {:name "right-ear", :size 1}
;; {:name "bottom-ear", :size 1}
;; {:name "top-ear", :size 1}
;; {:name "mouth", :size 1}
;; {:name "nose", :size 1}
;; {:name "neck", :size 2}
;; {:name "top-shoulder", :size 3}
;; {:name "left-shoulder", :size 3}
;; {:name "right-shoulder", :size 3}
;; {:name "bottom-shoulder", :size 3}
;; {:name "bottom-upper-arm", :size 3}
;; {:name "right-upper-arm", :size 3}
;; {:name "left-upper-arm", :size 3}
;; {:name "top-upper-arm", :size 3}
;; {:name "chest", :size 10}
;; {:name "back", :size 10}
;; {:name "top-forearm", :size 3}
;; {:name "bottom-forearm", :size 3}
;; {:name "left-forearm", :size 3}
;; {:name "right-forearm", :size 3}
;; {:name "abdomen", :size 6}
;; {:name "left-kidney", :size 1}
;; {:name "bottom-kidney", :size 1}
;; {:name "top-kidney", :size 1}
;; {:name "right-kidney", :size 1}
;; {:name "left-hand", :size 2}
;; {:name "top-hand", :size 2}
;; {:name "right-hand", :size 2}
;; {:name "bottom-hand", :size 2}
;; {:name "right-knee", :size 2}
;; {:name "top-knee", :size 2}
;; {:name "bottom-knee", :size 2}
;; {:name "left-knee", :size 2}
;; {:name "top-thigh", :size 4}
;; {:name "right-thigh", :size 4}
;; {:name "bottom-thigh", :size 4}
;; {:name "left-thigh", :size 4}
;; {:name "bottom-lower-leg", :size 3}
;; {:name "right-lower-leg", :size 3}
;; {:name "left-lower-leg", :size 3}
;; {:name "top-lower-leg", :size 3}
;; {:name "right-achilles", :size 1}
;; {:name "top-achilles", :size 1}
;; {:name "left-achilles", :size 1}
;; {:name "bottom-achilles", :size 1}
;; {:name "bottom-foot", :size 2}
;; {:name "top-foot", :size 2}
;; {:name "right-foot", :size 2}
;; {:name "left-foot", :size 2}]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment