2016-11-14 21 views
0

Java Devの求人インタビューでは、100万の値の配列から10個の最大値を見つけるアルゴリズムを設計するように求められました。私は面接官を満足させる以上の単純なブルートフォースアルゴリズムを思いついた。明日第2ラウンドのインタビューに行く。印刷を一度だけコールするとClojureの印刷リストが2回表示される

私は自分自身に挑戦したいと思うので、「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) 

そして、それはTWICE期待される出力を生成します。

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

Alex Miller - 説明をありがとう!それはうまくいった。 – cptully

関連する問題