프로그래밍/Clojure

[Brave Clojure #3] 챕터 3 연습문제

김재택 2023. 12. 18. 19:00

Exercise 3.1

(str "a" "b" "c")
;; => "abc"
(vector 1 2 3)
;; => [1 2 3]
(list 1 2 3)
;; => (1 2 3)
(hash-map 1 2 3 1)
;; => {1 2, 3 1}
(hash-set  1 2 3 1)
;; => #{1 3 2}

Exercise 3.2

(defn ex2 [number]
  (+  number 100))

Exercise 3.3

(defn dec-maker [d]
  (fn [x] (- x d)))

(def dec9 (dec-maker 9))
(dec9 10)
;; => 1

Exercise 3.4

(defn mapset
  [f col]
  (reduce (fn [rst x]
            (conj rst (f x)))
          #{}
          col))

(mapset inc [1 1 2 2])
;; => #{3 2}

Exercise 3.5

(def asym-alien-body-parts [{:name "head" :size 3}
                            {:name "1st-eye" :size 1}
                            {:name "1st-ear" :size 1}
                            {:name "mouth" :size 1}
                            {:name "nose" :size 1}
                            {:name "neck" :size 2}
                            {:name "1st-shoulder" :size 3}
                            {:name "1st-upper-arm" :size 3}
                            {:name "chest" :size 10}
                            {:name "back" :size 10}
                            {:name "1st-forearm" :size 3}
                            {:name "abdomen" :size 6}
                            {:name "1st-kidney" :size 1}
                            {:name "1st-hand" :size 2}
                            {:name "1st-knee" :size 2}
                            {:name "1st-thigh" :size 4}
                            {:name "1st-lower-leg" :size 3}
                            {:name "1st-achilles" :size 1}
                            {:name "1st-foot" :size 2}])

(defn nth-matching-part [part nth]
  {:name (clojure.string/replace (:name part) #"^1st-" (str nth "-"))
   :size (:size part)})

(defn alien-all-parts
  [part]
  (conj (mapset (fn [nth] (nth-matching-part part nth))
                ["2nd" "3rd" "4th" "5th"])
        part))

(defn alien-symmetrize-body-parts
  "reduce version"
  [asym-body-parts]
  (reduce (fn [rst part]
            (into rst (alien-all-parts part)))
          []
          asym-body-parts))

Exercise 3.6

(def asym-general-body-parts [{:name "head" :size 3}
                              {:name "1-eye" :size 1}
                              {:name "1-ear" :size 1}
                              {:name "mouth" :size 1}
                              {:name "nose" :size 1}
                              {:name "neck" :size 2}
                              {:name "1-shoulder" :size 3}
                              {:name "1-upper-arm" :size 3}
                              {:name "chest" :size 10}
                              {:name "back" :size 10}
                              {:name "1-forearm" :size 3}
                              {:name "abdomen" :size 6}
                              {:name "1-kidney" :size 1}
                              {:name "1-hand" :size 2}
                              {:name "1-knee" :size 2}
                              {:name "1-thigh" :size 4}
                              {:name "1-lower-leg" :size 3}
                              {:name "1-achilles" :size 1}
                              {:name "1-foot" :size 2}])

(defn all-parts
  [part n-to-add]
  (conj (mapset (fn [n] {:name (clojure.string/replace
                                (:name part)
                                #"^1-"
                                (str n "-"))
                         :size (:size part)})
                (range 2 (+ 2 n-to-add)))
        part))

(defn general-symmetrize-body-parts
  [asym-body-parts n-to-add]
  (reduce (fn [rst part]
            (into rst (all-parts part n-to-add)))
          []
          asym-body-parts))