(require '[clojure.string :as str])

(def caves (->> (slurp "./in")
           (str/split-lines)
           (map #(str/split % #"-"))
           (map (partial map str))
           (#(concat % (map reverse %)))
           ))

(defn get-caves-forward [klst]
  (map #(cons (second %) klst)
    (filter
      #(or (< (int (first (second %))) 96)
           (not-any? (partial = (second %)) klst))
      (filter #(= (first %) (first klst)) caves)
      )))

(loop [lst (get-caves-forward ["start"]) ms '()]
  (let [nxt (->> lst
                 (map get-caves-forward)
                 (apply concat))
        mtchs  (concat ms (filter #(= (first %) "end") nxt))
        nxtlst (filter #(not= (first %) "end") nxt)]
    (if (empty? nxtlst)
      (println (count mtchs))
      (recur nxtlst mtchs))))