; reversing digits (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 (timing rev) (time (let ((count 0)) (do ((n 1 (+ n 1))) ((< 50000 n) count) (when (= n (rev n)) (set! count (+ count 1))))))) (define (rev1 n) ; iterative 1731 (let loop ((n n) (z 0)) (if (zero? n) z (loop (quotient n 10) (+ (* z 10) (modulo n 10)))))) (define (rev2 n) ; recursive 1747 (define (rev n r) (if (zero? n) r (rev (quotient n 10) (+ (* r 10) (modulo n 10))))) (rev n 0)) (define (rev3 n) ; numeric split 2918 (undigits (reverse (digits n)))) (define (rev4 n) ; string split 2527 (string->number (list->string (reverse (string->list (number->string n)))))) (display (timing rev1)) (newline) (display (timing rev2)) (newline) (display (timing rev3)) (newline) (display (timing rev4)) (newline)
Standard input is empty
598 598 598 598
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)