Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defn make-monkey [[_ items op check pass fail]] {
- "items" (as-> items i
- (clojure.string/split i #":") (second i)
- (clojure.string/split i #",")
- (map #(clojure.string/replace % " " "") i)
- (map #(Integer/parseInt %) i)
- ),
- "op" (as-> op o
- (clojure.string/split o #"=")
- (second o)
- (clojure.string/split o #" ")
- (remove clojure.string/blank? o)
- ((fn [[arg1 op arg2]] (format
- "#(%s %s %s)"
- op
- (if (= "old" arg1) "%" arg1)
- (if (= "old" arg2) "%" arg2)
- )) o)
- (read-string o)
- (eval o)
- )
- "check" (-> check (clojure.string/split #" ") last (Integer/parseInt))
- "pass" (-> pass (clojure.string/split #" ") last (Integer/parseInt))
- "fail" (-> fail (clojure.string/split #" ") last (Integer/parseInt))
- "history" 0
- })
- (defn step [[monkeys monkey] item] (let [
- item ((monkey "op") item)
- tar (if (zero? (mod item (monkey "check"))) "pass" "fail")
- target (monkey tar)
- items (get-in monkeys [target "items"])
- history (inc (monkey "history"))
- ] [
- (assoc-in monkeys [target "items"] (conj items item))
- (assoc monkey "history" history)
- ]))
- (defn turn [monkeys pos]
- (->>
- (reduce step [monkeys (get monkeys pos)] (get-in monkeys [pos "items"]))
- ((fn [[monkeys monkey]] (assoc monkeys pos (assoc monkey "items" []))))
- ))
- (defn round [monkeys]
- (reduce turn monkeys (range (count monkeys)))
- )
- (defn do-task [rounds monkeys]
- (->> monkeys
- vec (iterate round) (take rounds) last (map #(% "history")) sort (take-last 2) (apply *) println)
- )
- (with-open [rdr (clojure.java.io/reader "monkeys.in")] (let [
- monkeys (->> rdr
- line-seq
- (partition-by #(= "" %))
- (remove #(= 1 (count %)))
- (map make-monkey))
- ](->> monkeys
- (map (fn [monkey] (assoc monkey "op" #(quot ((monkey "op") %) 3))))
- (do-task 21)
- )
- (->> monkeys
- (vector (apply * (map #(% "check") monkeys)))
- ((fn [[worry monkeys]] (map (fn [monkey] (assoc monkey "op" #(mod ((monkey "op") %) worry))) monkeys)))
- (do-task 10001)
- )))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement