생성일: 2019년 12월 10일
수정일: 2023년 08월 06일
수정일: 2023년 08월 06일
4clojure - Black Box Testing (65)
문제
(= :map (__ {:a 1, :b 2}))
(= :list (__ (range (rand-int 20))))
(= :vector (__ [1 2 3 4 5 6]))
(= :set (__ #{10 (rand-int 5)}))
(= [:map :set :vector :list] (map __ [{} #{} [] ()]))
제한 : class, type, Class, vector?, sequential?, list?, seq?, map?, set?instance?, getClass
풀이
(fn [coll]
(let [base (empty coll)]
(cond
(= base {}) :map
(= base #{}) :set
(= base '()) (if (reversible? coll) :vector :list))))
풀이 과정
검증하는 함수 없이 어떻게 자료형을 알 수가 있는거지? 라는 생각이 먼저 든다. 어떻게 풀어야할지 감이 잡히지 않는다....
값이 들어있는 상태에서 empty로 만드는 함수가 있다는 것을 처음 알게 되었다. 그리고 collection 자체를 검증 할 수 있다는 것도 알게 되었다.
보통의 언어 같으면 저런식으로 collection을 비교하지 못해서 저런 방법이 있는지 조차 모르고 산다.
reversible? 이라는 함수는 확실하게는 잘 모르겠지만 Reversible 을 구현한 collection을 검증하는 함수인데 이게 무엇을 뜻하는지는 아직 잘 모르겠다.
찾아보니 reverse 가능한 seq를 reversible이라고 한다. 그래서 vector, sorted-map, sorted-set 이 true 값이 되는 것 같다.
그래서 이번에는 정말로 감이 잡히질 않아서 인터넷에서 찾아보고 공부한다는 마음 가짐으로 기록으로 남긴다.
다른 사람이 남긴 해답을 분석을 하고 싶어 졌다.
#(cond
(= (conj % nil) %) :map
(= (conj % 0) (conj % 0 0)) :set
(= (conj % 0 1) (cons 1 (cons 0 %))) :list
:else :vector)
#((zipmap (map str [{} #{} () []]) [:map :set :list :vector]) (str (empty %)))