Login
7 branches 0 tags
Ben (X13/Arch) Simplified things a little 0643405 9 days ago 1260 Commits
nujel / tests / slow / day7.nuj
#!/usr/bin/env nujel

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

(defn fancy/calc ()
      (def ret (:alloc Array 2000))
      (def acc 0)
      (dotimes (i 2000)
               (set! acc (+ acc i))
	       (set! ret i acc))
      ret)
(def fancy (fancy/calc))

(defn calc/mm (data pred) (reduce data (fn (a b) (if (pred b a) b a)) (ref data 0)))
(defn calc/min (data) (calc/mm data <))
(defn calc/max (data) (calc/mm data >))
(defn calc/fuel/simple (data pos) (reduce data (fn (a b) (+ a (abs (- b pos)))) 0))
(defn calc/fuel/complex (data pos) (reduce data (fn (a b) (+ a (ref fancy (abs (- b pos))))) 0))
(defn 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))
      (def i (+ 1 cmin))
      (while (< i cmax)
	     (def new-fuel (calc/fuel data i))
	     (when (< new-fuel ret-fuel)
		   (do (set! ret-pos i)
		       (set! ret-fuel new-fuel)))
             (set! i (add/int i 1)))
      {:pos ret-pos :fuel ret-fuel})

(def result (calc/optimal real-data calc/fuel/simple))
(when (not= (ref result :fuel) 355989)
      (throw (list :wrong-result "Wrong result" result)))
(def result (calc/optimal real-data calc/fuel/complex))
(when (not= (ref result :fuel) 102245489)
      (throw (list :wrong-result "Wrong result" result)))

(return :success)