fork(1) download
  1. ; casting out nines
  2.  
  3. (define-syntax assert
  4. (syntax-rules ()
  5. ((assert expr result)
  6. (if (not (equal? expr result))
  7. (for-each display `(
  8. #\newline "failed assertion:" #\newline
  9. expr #\newline "expected: " ,result
  10. #\newline "returned: " ,expr #\newline))))))
  11.  
  12. (define (nines n)
  13. (let loop ((n n) (s 0))
  14. (if (< 0 n)
  15. (let ((q (quotient n 10))
  16. (r (remainder n 10)))
  17. (loop q (+ r s)))
  18. (if (< 9 s) (nines s)
  19. (if (= 9 s) 0 s)))))
  20.  
  21. (display (do ((n 0 (+ n 1))) ((= n 1000) 'done)
  22. (assert (nines n) (modulo n 9))))
  23. (newline)
  24.  
  25. (display
  26. (= (nines (+ (nines 3074)
  27. (nines 6017)
  28. (nines 13814)
  29. (nines 1810)
  30. (nines 27)
  31. (nines 3611)))
  32. (nines 28353)))
Success #stdin #stdout 0.06s 43488KB
stdin
Standard input is empty
stdout
done
#t