- (if (empty? (world :k)) 0
- (let [accessible-keys (accessible world)
- successor-world (fn [[kc ds]]
- (let [kp (get-in world [:k kc])
- dc (Character/toUpperCase kc)
- dp (get-in world [:d dc])]
- [ds (-> world
- (assoc :p kp)
- (update :t conj dp)
- (update-in [:k] dissoc kc))]))
- successors (map successor-world accessible-keys)
- combine-levels (fn [[ds wo]] (+ ds (acquire-all-keys wo)))
- ret (reduce min (map combine-levels successors))]
- (clojure.pprint/pprint world)
- (clojure.pprint/pprint ret)
- ret)))
+ (let [successor-world (fn [wo [kc ds]]
+ (let [kp (get-in wo [:k kc])
+ dc (Character/toUpperCase kc)
+ dp (get-in wo [:d dc])]
+ (-> wo
+ (assoc :p kp)
+ (assoc :$ ds)
+ (update :t conj dp)
+ (update-in [:k] dissoc kc)
+ (update-in [:l] conj kc))))
+ succ (fn [wo] (map (partial successor-world wo) (accessible wo)))
+ heur (fn [{:keys [p k]}]
+ (if (empty? k) 0
+ (reduce max (map (partial manhattan-distance p) (vals k)))))
+ cost (fn [cs pt] (+ cs (pt :$)))
+ des? (fn [pt] (empty? (pt :k)))]
+ (second (a-star succ cost heur (assoc world :l []) des?))))