В моем первом проекте Clojure все получилось хорошо, за исключением этой части в конце:
(let [broken-signs (->> (:symbols field)
(map make-sign)
(filter broken?))
broken-count (count broken-signs)
unfixable-count (-> (filter (complement fixable?) broken-signs)
(count))]
(println
(if (> unfixable-count 0)
-1
(- broken-count unfixable-count))))
Отступы выглядят отключенными и не чувствуют себя функциональными, так как я повторно использую состояние в блоке let.Я в основном считаю количество сломанных знаков, а затем количество исправляемых знаков.Если какой-либо знак является нефиксированным, я печатаю -1, в противном случае я печатаю количество знаков, которые нужно исправить.
Если бы я отобразил / отфильтровал дважды, у меня был бы дублирующий код, но больше всего он работал быпомедленнее.Тем не менее, есть ли способ улучшить этот код?
РЕДАКТИРОВАТЬ: Это то, что я остановился на
(defn count-broken-yet-fixable []
(let [broken (->> (:symbols field)
(map make-sign)
(filter broken?))
unfixable (remove fixable? broken)]
(when (empty? unfixable)
(count broken))))
(defn solve-task []
(if-let [result (count-broken-yet-fixable)]
result
-1))
(println (solve-task))
Вычитание действительно не было необходимым, и подсчет не должен был произойти вблок.Вывод -1 при неправильном вводе также не является задачей функции и является лишь частью задачи.