application/octet-stream
•
1.33 KB
•
36 lines
#!/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 [fn [a b] [if [pred b a] b a]] [array/ref data 0]]]
[defun calc/min [data] [calc/mm data <]]
[defun calc/max [data] [calc/mm data >]]
[defun calc/fuel/simple [data pos] [reduce data [fn [a b] [+ a [abs [- b pos]]]] 0]]
[defun calc/fuel/complex [data pos] [reduce data [fn [a b] [+ a [array/ref 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 [!= [ref result :fuel] 355989]
[throw [list :wrong-result "Wrong result" result]]]
[def result [calc/optimal real-data calc/fuel/complex]]
[when [!= [ref result :fuel] 102245489]
[throw [list :wrong-result "Wrong result" result]]]