Итак, на собеседовании для позиции Java Dev мне было предложено разработать алгоритм, чтобы найти десять самых больших значений из массива в 1 миллион значений. Я придумал простой алгоритм грубой силы, который более чем удовлетворил моего интервьюера. Завтра я поеду на второй тур.Clojure print list дважды, когда я вызываю только один раз print
Поскольку я люблю бросать вызов себе, я читал «Clojure for the Brave and True» и попал в раздел о Lazy Sequences and Collections вскоре после интервью и начал задаваться вопросом, не могу ли я реализовать функцию Clojure, чтобы сделать та же задача.
Я правильно обработал функцию фильтрации, но не могу понять, что вижу, когда запускаю приложение. Вот мой код:
(defn random-numbers
([] (random-numbers 0))
([n] (cons n (lazy-seq (random-numbers (rand 10000))))))
(def big-array (take 1000000 (random-numbers)))
(defn top-ten [[big0 big1 big2 big3 big4 big5 big6 big7 big8 big9 :as acc] x]
(cond
(> x big0) [x big1 big2 big3 big4 big5 big6 big7 big8 big9]
(> x big1) [big0 x big2 big3 big4 big5 big6 big7 big8 big9]
(> x big2) [big0 big1 x big3 big4 big5 big6 big7 big8 big9]
(> x big3) [big0 big1 big2 x big4 big5 big6 big7 big8 big9]
(> x big4) [big0 big1 big2 big3 x big5 big6 big7 big8 big9]
(> x big5) [big0 big1 big2 big3 big4 x big6 big7 big8 big9]
(> x big6) [big0 big1 big2 big3 big4 big5 x big7 big8 big9]
(> x big7) [big0 big1 big2 big3 big4 big5 big6 x big8 big9]
(> x big8) [big0 big1 big2 big3 big4 big5 big6 big7 x big9]
(> x big9) [big0 big1 big2 big3 big4 big5 big6 big7 big8 x]
:else acc))
(defn top-ten-list [coll]
(reduce top-ten [0 0 0 0 0 0 0 0 0 0] coll))
(defn unlines [coll]
(clojure.string/join \newline coll))
(defn -main []
(print (unlines (top-ten-list big-array))))
(-main)
И это дает ожидаемый результат ДВАЖДЫ:
9999.978584142405
9999.966008266641
9999.954608202788
9999.925928099525
9999.779899149064
9999.755392364965
9999.75279348399
9999.640257438374
9999.615213138313
9999.447171545269999.978584142405
9999.966008266641
9999.954608202788
9999.925928099525
9999.779899149064
9999.755392364965
9999.75279348399
9999.640257438374
9999.615213138313
9999.44717154526
изменения выходных незначительно отличаться в зависимости от того, используется ли я печатать или Println, в том, что второй начинает набор выхода на новый line, если я использую println.
Я уверен, что первый результат является артефактом того, как я вызываю функции и обрабатываю их результаты, но я не уверен, где я ошибся!
как вы выполняете этот скрипт? просто скопируйте-n-вставьте этот скрипт, запустите его, и я вижу только одну версию вывода, а не double. Фактически, я использовал [lein exec] (https://github.com/kumarshantanu/lein-exec), чтобы запустить его следующим образом: 'cat yourscript.clj | lein exec' –
Я запускал его, нажав кнопку запуска/команду в IntelliJ .... Я попробую вы метод. – cptully
@AlexMiller прокомментировал ниже, что падение (-main) линии устранит проблему в IntelliJ, и это произошло. @ Предложение MatiasElgart использовать 'lien exec' также работает. – cptully