(defn locator [r n] (fn [in] (->> (iterate #(/ % 2) (/ n 2)) (map vector in) (keep (fn [[ch n]] (when (#{r} ch) n))) (apply +)))) (let [get-row (locator \B 128) get-col (locator \R 8)] (defn get-seat [in] (let [[r c] (split-at 7 in)] (+ (* 8 (get-row r)) (get-col c))))) (let [seats (into (sorted-set) (map get-seat data-5)) rng (apply range ((juxt first last) seats))] [(first (remove seats rng)) (last seats)])