application/octet-stream
•
1.95 KB
•
50 lines
#!/usr/bin/env nujel
(def cave-map {})
(def big-caves {})
(defn big-cave? (α) (ref big-caves α))
(defn add-connections (line)
(def parts (map (split line "-") :symbol))
(when (cadr parts)
(set! cave-map (car parts) (cons (cadr parts) (ref cave-map (car parts))))
(set! cave-map (cadr parts) (cons (car parts) (ref cave-map (cadr parts))))
(set! big-caves (car parts) (< (ref (:string (car parts)) 0) #\a))
(set! big-caves (cadr parts) (< (ref (:string (cadr parts)) 0) #\a))))
(defn add-connections (line)
(def parts (map (split line "-") :symbol))
(when (cadr parts)
(set! cave-map (car parts) (cons (cadr parts) (ref cave-map (car parts))))
(set! cave-map (cadr parts) (cons (car parts) (ref cave-map (cadr parts))))
(set! big-caves (car parts) (< (try (fn () 0) (ref (:string (car parts)) 0)) #\a))
(set! big-caves (cadr parts) (< (try (fn () 0) (ref (:string (cadr parts)) 0)) #\a))))
(def connections (for-each (split (file/read "tests/slow/day12.input") "\n") add-connections))
(def valid-routes 0)
(defn calc-routes (position s twice)
(if (= position 'start)
(inc! valid-routes)
(when-not (and (= position 'end)
(> (ref s 'end) 0))
(def routes (ref cave-map position))
(when-not (big-cave? position)
(when (> (ref s position) 0)
(if twice
(return)
(set! twice #t)))
(set! s (:clone s))
(tree/++ s position))
(while routes
(calc-routes (car routes) s twice)
(cdr! routes)))))
(calc-routes 'end {} #t)
(when (not= valid-routes 4411)
(throw (list :wrong-result "Wrong result" valid-routes)))
(set! valid-routes 0)
(calc-routes 'end {} #f)
(when (not= valid-routes 136767)
(throw (list :wrong-result "Wrong result" valid-routes)))
(return :success)