생성일: 2019년 12월 10일
수정일: 2023년 08월 06일

4clojure - Black Box Testing (65)

  1. 문제
  2. 풀이
    1. 풀이 과정

문제

(= :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 %)))
Tags: 4clojure Today I Learn