Created
January 18, 2017 09:58
-
-
Save secondspass/630dc31812db31e7748fc778c6b8b09a to your computer and use it in GitHub Desktop.
Practice exercise
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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