fork download
  1. ; reversing digits
  2.  
  3. (define (digits n . args)
  4. (let ((b (if (null? args) 10 (car args))))
  5. (let loop ((n n) (d '()))
  6. (if (zero? n) d
  7. (loop (quotient n b)
  8. (cons (modulo n b) d))))))
  9.  
  10. (define (undigits ds . args)
  11. (let ((b (if (null? args) 10 (car args))))
  12. (let loop ((ds ds) (n 0))
  13. (if (null? ds) n
  14. (loop (cdr ds) (+ (* n b) (car ds)))))))
  15.  
  16. (define (timing rev)
  17. (time
  18. (let ((count 0))
  19. (do ((n 1 (+ n 1)))
  20. ((< 50000 n) count)
  21. (when (= n (rev n))
  22. (set! count (+ count 1)))))))
  23.  
  24. (define (rev1 n) ; iterative 1731
  25. (let loop ((n n) (z 0))
  26. (if (zero? n) z
  27. (loop (quotient n 10)
  28. (+ (* z 10) (modulo n 10))))))
  29.  
  30. (define (rev2 n) ; recursive 1747
  31. (define (rev n r)
  32. (if (zero? n) r
  33. (rev (quotient n 10)
  34. (+ (* r 10) (modulo n 10)))))
  35. (rev n 0))
  36.  
  37. (define (rev3 n) ; numeric split 2918
  38. (undigits (reverse (digits n))))
  39.  
  40. (define (rev4 n) ; string split 2527
  41. (string->number
  42. (list->string
  43. (reverse
  44. (string->list
  45. (number->string n))))))
  46.  
  47. (display (timing rev1)) (newline)
  48. (display (timing rev2)) (newline)
  49. (display (timing rev3)) (newline)
  50. (display (timing rev4)) (newline)
Success #stdin #stdout #stderr 2.7s 7380KB
stdin
Standard input is empty
stdout
598
598
598
598

stderr
0.669s CPU time, 0.103s GC time (major), 300016 mutations, 63/5602 GCs (major/minor)
0.672s CPU time, 0.1s GC time (major), 300016 mutations, 60/5534 GCs (major/minor)
1.209s CPU time, 0.17s GC time (major), 600016 mutations, 143/10053 GCs (major/minor)
0.138s CPU time, 0.005s GC time (major), 16 mutations, 3/1193 GCs (major/minor)