2016-11-14 1 views
0

Java Dev 위치의 취업 인터뷰에서 1 백만 값 배열에서 가장 큰 값 10 개를 찾기위한 알고리즘을 설계하라는 요청을 받았습니다. 내 인터뷰어를 만족시키는 것 이상의 단순한 무력 알고리즘을 생각해 냈습니다. 나는 두 번째 라운드 인터뷰를 위해 내일 들어간다.인쇄를 한 번만 호출하면 Clojure가 두 번 인쇄됩니다.

나는 스스로에게 도전하고 싶기 때문에 "Clojure for the Brave and True"를 읽고 인터뷰 직후에 Lazy Sequences와 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 사용 여부에 따라 println을 사용하면 행이 표시됩니다.

첫 번째 출력은 함수를 호출하고 결과를 처리하는 방식의 결과물이지만, 어디서 잘못되었는지 확신 할 수 없습니다.

+1

이 스크립트를 어떻게 실행합니까? 그냥이 스크립트를 복사하여 붙여 넣고 달아서 출력의 한 버전 만보고 이중이 아닙니다. 사실, 나는 이것을 실행하기 위해 [lein exec] (https://github.com/kumarshantanu/lein-exec)를 사용했다 :'cat yourscript.clj | lein exec' –

+0

IntelliJ에서 실행 버튼/명령을 클릭하여 실행했습니다 .... 방법을 시도 할 것입니다. – cptully

+1

@AlexMiller는 (-main) 행을 삭제하면 IntelliJ의 문제를 해결할 수 있다고 주석을 달았습니다. @ MatiasElgart가'lien exec'를 사용하기를 제안한다. – cptully

답변

4

하단의 -main은 네임 스페이스를로드 할 때 실행됩니다. 그런 다음 -main을 호출하고 다시 실행합니다. 따라서 최종본 인 (-main)을 제거하면 완료됩니다.

+0

알렉스 밀러 - 설명해 주셔서 감사합니다! 그게 효과가 있었어. – cptully

관련 문제