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.
(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 assign-all-required-duties [apprentices duties]
(let [orig-apprentices apprentices required-duties (required-duties duties)]
(loop [apprentices apprentices]
(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))))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment