Saturday, September 07, 2019

SICP in Clojure: Chapter 1, Exercise 22

This is my Clojure solution to Chapter 1, Exercise 22:

(ns sicp.ch1.ex22
  (:require [sicp.ch1.ex21 :as sicp-ch1-ex21]))

(defn prime?
  [n]
  (= n (sicp-ch1-ex21/smallest-divisor n)))

(defn report-prime
  [n elapsed-time]
  (println "* " n elapsed-time))

(defn runtime
  []
  (System/nanoTime))

(defn start-prime-test
  [n start-time]
  (let [p (prime? n)]
    (when p
      (report-prime n (- (runtime) start-time)))
    p))

(defn timed-prime-test
  [n]
  (start-prime-test n (runtime)))

(defn search-for-primes
  [start cnt]
  (reduce
   (fn [acc x]
     (if (= cnt (count acc))
       (reduced acc)
       (if (timed-prime-test x)
         (conj acc x)
         acc)))
   []
   (filter #(= 1 (rem % 2))
           (iterate inc start))))

(search-for-primes 1000 3) ; ~5,000ns

(search-for-primes 10000 3) ; ~15,000ns

(search-for-primes 100000 3) ; ~50,000ns

(search-for-primes 1000000 3) ; ~160,000ns

No comments: