Login
7 branches 0 tags
Ben (X220/Parabola) Moved testing framework into a module 79aa2b0 3 years ago 730 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 "-"] string->symbol]]
  [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 [symbol->string [car parts]] 0] #\a]]
    [tree/set! big-caves [cadr parts] [< [char-at [symbol->string [cadr parts]] 0] #\a]]]]
[defn add-connections [line]
  [def parts [map [split line "-"] string->symbol]]
  [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 [symbol->string [car parts]] 0]] #\a]]
    [tree/set! big-caves [cadr parts] [< [try [fn [] 0] [char-at [symbol->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 [tree/dup 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]