Login
7 branches 0 tags
Ben (X13/Arch) Safer arrays 70a3961 3 years ago 611 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 "-"] str->sym]]
      [when [cadr parts]
            [tree/set! cave-map   [car parts] [cons [cadr parts] [ref cave-map [car parts]]]]
            [tree/set! cave-map  [cadr parts] [cons [car parts] [ref cave-map [cadr parts]]]]
            [tree/set! big-caves  [car parts] [< [char-at [sym->str [car parts]] 0] #\a]]
            [tree/set! big-caves [cadr parts] [< [char-at [sym->str [cadr parts]] 0] #\a]]]]
[defn add-connections [line]
      [def parts [map [split line "-"] str->sym]]
      [when [cadr parts]
            [tree/set! cave-map   [car parts] [cons [cadr parts] [ref cave-map [car parts]]]]
            [tree/set! cave-map  [cadr parts] [cons [car parts] [ref cave-map [cadr parts]]]]
            [tree/set! big-caves  [car parts] [< [try [fn [] 0] [char-at [sym->str [car parts]] 0]] #\a]]
            [tree/set! big-caves [cadr parts] [< [try [fn [] 0] [char-at [sym->str [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]
           [++ 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
                                   [throw [list :return]]
                                   [set! twice #t]]]
                               [set! s [tree/dup s]]
                               [tree/++ s position]]
                     [while routes
                            [try [fn [ε] [when [!= [car ε] :return] [throw ε]]]
                            [calc-routes [car routes] s twice]]
                            [cdr! routes]]]]]

[calc-routes 'end @[] #t]
[when [!= valid-routes 4411]
      [throw [list :wrong-result "Wrong result" valid-routes]]]

[set! valid-routes 0]
[calc-routes 'end @[] #f]
[when [!= valid-routes 136767]
      [throw [list :wrong-result "Wrong result" valid-routes]]]