[ create a new paste ] login | about

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

programmingpraxis - Scheme, pasted on Jul 20:
; happy numbers

(define (sum xs) (apply + xs))

(define (square x) (* x x))

(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 (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 (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 (happy? n)
  (let loop ((n n) (ns '()))
    (cond ((= n 1) #t)
          ((member n ns) #f)
          (else (loop (sum (map square (digits n)))
                      (cons n ns))))))

(define (happy n) (filter happy? (range n)))

(display (happy 50))


Output:
1
(1 7 10 13 19 23 28 31 32 44 49)


Create a new paste based on this one


Comments: