fork download
  1. ; fizzbuzz
  2.  
  3. (define range
  4. (case-lambda
  5. ((stop) (range 0 stop (if (negative? stop) -1 1)))
  6. ((start stop) (range start stop (if (< start stop) 1 -1)))
  7. ((start stop step)
  8. (let ((le? (if (negative? step) >= <=)))
  9. (let loop ((x start) (xs (list)))
  10. (if (le? stop x) (reverse xs)
  11. (loop (+ x step) (cons x xs))))))
  12. (else (error 'range "too many arguments"))))
  13.  
  14. (define (fb1 n) ; straight forward method
  15. (define (fb n)
  16. (cond ((zero? (modulo n 15)) 'FizzBuzz)
  17. ((zero? (modulo n 5)) 'Buzz)
  18. ((zero? (modulo n 3)) 'Fizz)
  19. (else n)))
  20. (map fb (range 1 n)))
  21.  
  22. (display (fb1 26)) (newline)
  23.  
  24. (define (fb2 n) ; number theory method
  25. (define (fb n)
  26. (cdr (assoc (modulo (* n n n n) 15)
  27. `((1 . ,n) (6 . Fizz) (10 . Buzz) (0 . FizzBuzz)))))
  28. (map fb (range 1 n)))
  29.  
  30. (display (fb2 26)) (newline)
  31.  
  32. (define (fb3 n) ; sieving method
  33. (let ((xs (list->vector (range n))))
  34. (do ((i 3 (+ i 3))) ((<= n i))
  35. (vector-set! xs i 'Fizz))
  36. (do ((i 5 (+ i 5))) ((<= n i))
  37. (vector-set! xs i 'Buzz))
  38. (do ((i 15 (+ i 15))) ((<= n i))
  39. (vector-set! xs i 'FizzBuzz))
  40. (cdr (vector->list xs))))
  41.  
  42. (display (fb3 26)) (newline)
  43.  
  44. (define (fb4 n) ; simple euler method
  45. (let loop ((i 1) (s 0))
  46. (cond ((= n i) s)
  47. ((or (zero? (modulo i 3))
  48. (zero? (modulo i 5)))
  49. (loop (+ i 1) (+ s i)))
  50. (else (loop (+ i 1) s)))))
  51.  
  52. (display (fb4 1000)) (newline)
  53.  
  54. (define (fb5 n) ; gauss summation method
  55. (define (g n) (* n (+ n 1) 1/2))
  56. (+ (* 3 (g (quotient (- n 1) 3)))
  57. (* 5 (g (quotient (- n 1) 5)))
  58. (* -15 (g (quotient (- n 1) 15)))))
  59.  
  60. (display (fb5 1000)) (newline)
Success #stdin #stdout 0.01s 8328KB
stdin
Standard input is empty
stdout
(1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz)
(1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz)
(1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz)
233168
233168.0