Login
7 branches 0 tags
Ben (X13/Void) Removed :tree convenience function 15ebef1 3 years ago 428 Commits
nujel / tests / slow / day7.nuj
#!/usr/bin/env nujel

[def real-data [apply array/new [map [split [file/read "tests/slow/day7.input"] ","] int]]]

[defun fancy/calc []
       [def ret [array/allocate 2000]]
       [def acc 0]
       [for [i 0 2000]
            [set! acc [+ acc i]]
	    [array/set! ret i acc]]
       ret]
[def fancy [fancy/calc]]

[defun calc/mm [data pred] [reduce data [\ [a b] [if [pred b a] b a]] [data 0]]]
[defun calc/min [data] [calc/mm data <]]
[defun calc/max [data] [calc/mm data >]]
[defun calc/fuel/simple [data pos] [reduce data [\ [a b] [+ a [abs [- b pos]]]] 0]]
[defun calc/fuel/complex [data pos] [reduce data [\ [a b] [+ a [fancy [abs [- b pos]]]]] 0]]
[defun calc/optimal [data calc/fuel]
       [def cmin [calc/min data]]
       [def cmax [calc/max data]]
       [def ret-pos cmin]
       [def ret-fuel [calc/fuel data cmin]]
       [for [i [+ 1 cmin] cmax]
	    [def new-fuel [calc/fuel data i]]
	    [when [< new-fuel ret-fuel]
		  [do [set! ret-pos i]
		      [set! ret-fuel new-fuel]]]]
       @[:pos ret-pos :fuel ret-fuel]]

[def result [calc/optimal real-data calc/fuel/simple]]
[when [!= [tree/get result :fuel] 355989]
      [throw [list :wrong-result "Wrong result" result]]]
[def result [calc/optimal real-data calc/fuel/complex]]
[when [!= [tree/get result :fuel] 102245489]
      [throw [list :wrong-result "Wrong result" result]]]