## Fizzbuzz

### March 23, 2021

Let’s begin with the basic problem of enumerating the numbers from 1 to *N* (excluding *N*) in the most basic way possible:

(define (fb1 n) ; straight forward method (define (fb n) (cond ((zero? (modulo n 15)) 'FizzBuzz) ((zero? (modulo n 5)) 'Buzz) ((zero? (modulo n 3)) 'Fizz) (else n))) (map fb (range 1 n)))

A second method uses a little bit of number theory to characterize the divisibility of a number without using a string of conditional statements; I’ll leave to you the pleasure of figuring out why it works:

(define (fb2 n) ; number theory method (define (fb n) (cdr (assoc (modulo (* n n n n) 15) `((1 . ,n) (6 . Fizz) (10 . Buzz) (0 . FizzBuzz))))) (map fb (range 1 n)))

A third method, which will be the fastest for large *N*, uses sieving:

(define (fb3 n) ; sieving method (let ((xs (list->vector (range n)))) (do ((i 3 (+ i 3))) ((<= n i)) (vector-set! xs i 'Fizz)) (do ((i 5 (+ i 5))) ((<= n i)) (vector-set! xs i 'Buzz)) (do ((i 15 (+ i 15))) ((<= n i)) (vector-set! xs i 'FizzBuzz)) (cdr (vector->list xs))))

We turn now to the Project Euler version of FizzBuzz. Here is a simple method that tests divisibility of each number from 1 to *N*:

(define (fb4 n) ; simple euler method (let loop ((i 1) (s 0)) (cond ((= n i) s) ((or (zero? (modulo i 3)) (zero? (modulo i 5))) (loop (+ i 1) (+ s i))) (else (loop (+ i 1) s)))))

And here is a method that runs in O(1) time using a formula developed by Gauss to calculate the sum of the first *N* integers:

(define (fb5 n) ; gauss summation method (define (g n) (* n (+ n 1) 1/2)) (+ (* 3 (g (quotient (- n 1) 3))) (* 5 (g (quotient (- n 1) 5))) (* -15 (g (quotient (- n 1) 15)))))

You can run the program at https://ideone.com/rI6hCX.

There’s no reason to be clever, otherwise, you end up with something like: https://github.com/EnterpriseQualityCoding/FizzBuzzEnterpriseEdition ;-)

Here’s a solution in Python.

Output:

Here’s my attempt at a clever solution.

A solution in Racket:

Another solution in Racket:

(The first post was for 1 – 100, as requested by Project Euler; this post is for 1 to N.)

Example:

For the Sum from 1 to N in C#:

(3

(N/3)(N/3 + 1) + 5(N/5)(N/5 + 1) – 15(N/15)(N/15 + 1))/2my answer in c++

`#include`

using namespace std;

int main()

{

int setc = 0;

int N = 100;

for (int i = 1; i < N; i++)

{

setc = 0;

if (i % 3 == 0)

{

setc = 1;

cout << "Fizz";

}

if (i % 5 == 0)

cout << "Buzz";

`}`