[ create a new paste ] login | about

Project: programmingpraxis
Link: http://programmingpraxis.codepad.org/VYkXm2GM    [ raw code | output | fork ]

programmingpraxis - Scheme, pasted on May 25:
; upside up

(define (range . args)
  (case (length args)
    ((1) (range 0 (car args) (if (negative? (car args)) -1 1)))
    ((2) (range (car args) (cadr args) (if (< (car args) (cadr args)) 1 -1)))
    ((3) (let ((le? (if (negative? (caddr args)) >= <=)))
           (let loop ((x(car args)) (xs '()))
             (if (le? (cadr args) x)
                 (reverse xs)
                 (loop (+ x (caddr args)) (cons x xs))))))
    (else (error 'range "unrecognized arguments"))))

(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)))))

(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))))))

(define (undigits ds . args)
  (let ((b (if (null? args) 10 (car args))))
    (let loop ((ds ds) (n 0))
      (if (null? ds) n
          (loop (cdr ds) (+ (* n b) (car ds)))))))

(define (upside-up d)
  (case d ((0) 0) ((1) 1) ((6) 9) ((8) 8) ((9) 6) (else #f)))

(define (upside-up? n)
  (let ((ds (map upside-up (digits n))))
    (if (member #f ds) #f
      (= (undigits (reverse ds)) n))))

(display
  (let loop ((n 1962))
    (if (upside-up? n) n
      (loop (+ n 1)))))
(newline)

(display (length (filter upside-up? (range 10000))))
(newline)


Output:
1
2
6009
39


Create a new paste based on this one


Comments: