Skip to content

Instantly share code, notes, and snippets.

@tarynsauer
Last active August 29, 2015 13:59
Show Gist options
  • Save tarynsauer/10613735 to your computer and use it in GitHub Desktop.
Save tarynsauer/10613735 to your computer and use it in GitHub Desktop.

Revisions

  1. tarynsauer revised this gist Apr 14, 2014. 1 changed file with 0 additions and 18 deletions.
    18 changes: 0 additions & 18 deletions assigner.clj
    Original file line number Diff line number Diff line change
    @@ -29,24 +29,6 @@
    (conj acc a-map))))
    acc)))

    (defn annotate-av [apprentices apprentice-name]
    (map (fn [apprentice]
    (if (and (= (:name apprentice) apprentice-name)
    (= (:assigned-to apprentice) nil))
    (assoc apprentice :assigned-to "av")
    apprentice
    )) apprentices))

    (defn assign-av [apprentices fn]
    (let [potential-assignees (fn apprentices)]
    (annotate-av apprentices (:name (first (shuffle potential-assignees))))))

    (defn av-experienced [apprentices]
    (filter (fn [apprentice] (>= (:av-count apprentice) 3)) apprentices))

    (defn av-novice [apprentices]
    (filter (fn [apprentice] (< (:av-count apprentice) 3)) apprentices))

    (defn assign-all-required-duties [apprentices duties]
    (let [orig-apprentices apprentices required-duties (required-duties duties)]
    (loop [apprentices apprentices]
  2. tarynsauer revised this gist Apr 14, 2014. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion assigner.clj
    Original file line number Diff line number Diff line change
    @@ -49,7 +49,7 @@

    (defn assign-all-required-duties [apprentices duties]
    (let [orig-apprentices apprentices required-duties (required-duties duties)]
    (loop [apprentices apprentices] ;; this could be cleaner
    (loop [apprentices apprentices]
    (let [apprentices (assign-duty apprentices required-duties)]
    (if (all-duties-assigned? apprentices required-duties)
    apprentices
  3. tarynsauer created this gist Apr 14, 2014.
    64 changes: 64 additions & 0 deletions assigner.clj
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,64 @@
    (defn all-duties-assigned? [apprentices duties-list]
    (loop [apprentices apprentices assigned-duties '()]
    (if (empty? apprentices)
    (= (sort (remove nil? assigned-duties)) (sort (conj duties-list foreman-assignment)))
    (let [apprentice (first apprentices) apprentices (rest apprentices)]
    (recur apprentices
    (if-not (= (:assigned-to apprentice) nil)
    (conj assigned-duties (:assigned-to apprentice))
    assigned-duties))))))

    (defn all-apprentices-have-assignments? [apprentices]
    (loop [apprentices apprentices assigned-duties '()]
    (if (empty? apprentices )
    (every? identity assigned-duties)
    (let [apprentice (first apprentices) apprentices (rest apprentices)]
    (recur apprentices
    (conj assigned-duties (:assigned-to apprentice)))))))

    (defn assign-duty [apprentices assignments]
    (loop [duties-list (shuffle assignments)
    [a-map & more] (shuffle apprentices)
    acc []]
    (if a-map
    (let [duty (first duties-list) duties (rest duties-list)]
    (recur duties more
    (if (and (in? (:duty-options a-map) duty)
    (= (:assigned-to a-map) nil))
    (conj acc (assoc a-map :assigned-to duty))
    (conj acc a-map))))
    acc)))

    (defn annotate-av [apprentices apprentice-name]
    (map (fn [apprentice]
    (if (and (= (:name apprentice) apprentice-name)
    (= (:assigned-to apprentice) nil))
    (assoc apprentice :assigned-to "av")
    apprentice
    )) apprentices))

    (defn assign-av [apprentices fn]
    (let [potential-assignees (fn apprentices)]
    (annotate-av apprentices (:name (first (shuffle potential-assignees))))))

    (defn av-experienced [apprentices]
    (filter (fn [apprentice] (>= (:av-count apprentice) 3)) apprentices))

    (defn av-novice [apprentices]
    (filter (fn [apprentice] (< (:av-count apprentice) 3)) apprentices))

    (defn assign-all-required-duties [apprentices duties]
    (let [orig-apprentices apprentices required-duties (required-duties duties)]
    (loop [apprentices apprentices] ;; this could be cleaner
    (let [apprentices (assign-duty apprentices required-duties)]
    (if (all-duties-assigned? apprentices required-duties)
    apprentices
    (recur orig-apprentices))))))

    (defn assign-all-remaining-apprentices [apprentices duties]
    (let [apprentices apprentices optional-duties (optional-duties duties)]
    (loop [apprentices apprentices]
    (let [apprentices (assign-duty apprentices optional-duties)]
    (if (all-apprentices-have-assignments? apprentices)
    apprentices
    (recur apprentices))))))