Advertisement
Guest User

Untitled

a guest
Dec 7th, 2018
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (ns clojure-solution.core
  2.   (:require [loom.graph :as loom])
  3.   (:gen-class))
  4.  
  5. (defn make-graph [graph line]
  6.   (let [[_ x y] (re-find #"Step (.) must be finished before step (.) can begin\." line)]
  7.     (assoc graph x (conj (get graph x #{}) y))))
  8.  
  9. (defn read-file [path]
  10.   (with-open [rdr (clojure.java.io/reader path)]
  11.     (reduce make-graph {} (line-seq rdr))))
  12.  
  13. (defn get-min [dg]
  14.   (->>
  15.     (for [node (loom/nodes dg) :when (= (loom/in-degree dg node) 0)] node)
  16.     (apply min-key #(int (char (first %))))))
  17.  
  18. (defn solve [graph]
  19.   (loop [order [] dg graph]
  20.     (if (empty? (loom/nodes dg))
  21.       order
  22.       (let [m (get-min dg)]
  23.         (recur (conj order m) (loom/remove-nodes dg m))))))
  24.  
  25.  
  26. (defn part1 [graph]
  27.   (let [dg (loom/digraph graph)]
  28.     (solve dg)))
  29.  
  30. (defn -main
  31.   [& args]
  32.   (time (println (part1 (read-file "resources/input.txt")))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement