; updated for Clojure SVN 1309 (defn parse-grid [s] (vec (map (fn [line] (vec (map #(Integer. %) (.split line ",")))) (.split s "\\s+")))) (defn main [gridstr] (let [costs (parse-grid gridstr) size (count costs)] (loop [min-sums (vec (replicate size (vec (replicate size nil)))) work-queue (conj clojure.lang.PersistentQueue/EMPTY [0 0])] (if (seq work-queue) (let [yx (peek work-queue) nbs (filter (fn [nyx] (every? #(< -1 % size) nyx)) (map #(map + yx %) [[-1 0] [1 0] [0 -1] [0 1]])) nbs-costs (seq (filter identity (map #(get-in min-sums %) nbs))) newsum (+ (get-in costs yx) (if nbs-costs (apply min nbs-costs) 0)) oldsum (get-in min-sums yx)] (if (or (nil? oldsum) (< newsum oldsum)) (recur (assoc-in min-sums yx newsum) (apply conj (pop work-queue) nbs)) (recur min-sums (pop work-queue)))) (peek (peek min-sums)))))) (def testgrid "131,673,234,103,18 201,96,342,965,150 630,803,746,422,111 537,699,497,121,956 805,732,524,37,331 ") ;(prn (time (main testgrid))) (prn (time (main (slurp "matrix.txt"))))