형이 밥벌이에 바뻐서 까맣게 잊고 있다가 지금 제일 탑레벨 함수만 구현해 봄. 나머진 니가 해라


힌트: 니 생각을 코드로 그래도 표현해봐라


실행은 커녕 컴파일도 안해본거라 무슨 에러가 있을지 모르는게 함정




;; H            -> even or odd = 1, 2

 

;; HH           -> even number = 2

;; HT           -> odd number  = 1

;;              -> No answer


;; HHH          -> even or odd = 2 or 3

;; HHT          -> even or odd = 1 or 2

;;              -> 2


;; HHHH         -> even = 2

;; HHHT         -> odd = 1

;; HHTT         -> even = 2

;;              -> No answer


;; HHHHH        -> even or odd = 2 or 5

;; HHHHT        -> even or odd = 1 or 4

;; HHTTT        -> even or odd = 2 or 3

;;              -> 3


;; HHHHHH       -> e = 2

;; HHHTTT       -> o = 3

;; HHHHTT       -> e = 2

;; HHHHHT       -> o = 1

;;              -> No answer


;; HHHHHHH      -> e = 2

;; HHHHHHT      -> e or o = 6 or 1

;; HHHHHTT      -> e or o = 2 or 5

;; HHHHTTT      -> e or o = 4 or 3

;;              -> 6


(defn find-snoopy-number [n-coins]

  (let [middle-point (/ n-coins 2)]

    (loop [num-head n-coins num-tail 0 possible-answers #{} even-odd-set #{}]

      (if (< head middle-point)

        (pick-smaller-gcm possible-answers)

        (let [partial-answers (get-partial-answers num-head num-tail)]

          (if (conflict-even-odd-set? partial-answers even-odd-set)

            :no-answer!

            (recur (dec head)

                       (inc tail)

                      (clojure.set/union possible-answers partial-answers)

                      (->> possible-answers

                              (map #(if (even? %) :even :odd))

                              (clojure.set/union even-odd-set)))))))))