Login
7 branches 0 tags
Ben (X13/Arch) Simplified things a little 0643405 9 days ago 1260 Commits
nujel / tests / slow / day12.nuj
#!/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)