[ create a new paste ] login | about

Link: http://codepad.org/e98fow2u    [ raw code | output | fork ]

programmingpraxis - Scheme, pasted on Jul 3:
; primes n -- list of primes not greater than n in ascending order
(define (primes n) ; assumes n is an integer greater than one
  (let* ((len (quotient (- n 1) 2)) (bits (make-vector len #t)))
    (let loop ((i 0) (p 3) (ps (list 2))) ; sieve of eratosthenes
      (cond ((< n (* p p))
              (do ((i i (+ i 1)) (p p (+ p 2))
                   (ps ps (if (vector-ref bits i) (cons p ps) ps)))
                  ((= i len) (reverse ps))))
            ((vector-ref bits i)
              (do ((j (+ (* 2 i i) (* 6 i) 3) (+ j p)))
                  ((<= len j) (loop (+ i 1) (+ p 2) (cons p ps)))
                (vector-set! bits j #f)))
            (else (loop (+ i 1) (+ p 2) ps))))))

; digits n [b] -- list of digits of n base b, most significant first
(define (digits n . args)
  (let ((b (if (null? args) 10 (car args))))
    (let loop ((n n) (d '()))
      (if (zero? n) d
        (loop (quotient n b) (cons (modulo n b) d))))))

; filter pred? xs -- elements x of xs that satisfy (pred? x)
(define (filter pred? xs)
  (let loop ((xs xs) (ys '()))
    (cond ((null? xs) (reverse ys))
          ((pred? (car xs))
            (loop (cdr xs) (cons (car xs) ys)))
          (else (loop (cdr xs) ys)))))

(display
  (filter
    (lambda (n)
      (= (length
           (filter
             (lambda (d) (= d 3))
             (digits n)))
         4))
    (primes 100000)))


Output:
1
(23333 31333 33331 33343 33353 33533 38333)


Create a new paste based on this one


Comments: