The FizzBuzz Problem!

[This article was first published on Blogs on Adejumo R.S, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

“It’s easy to lie with statistics. It’s hard to tell the truth without statistics.”
— Andrejs Dunkels

Introduction

The FizzBuzz problem is a very popular problem given by interviewers to programmers. The problem is to print numbers 1 to N, return “Fizz” for every number that is a multiple of 3, “Buzz” for every number that is a multiple of 5 and “FizzBuzz” for every number that is a multiple of 3 and 5. The problem might look easy but it is used to test a programmers coding habit. In this post, I am going to create a function that performs the above task using the for loop and functional approach.

Using For Loop

FizzBuzz <- function(n){
x <- vector("double", n)
for(i in 1:n){
  x[i] <- i
  if(i%%3 == 0 & i%%5 == 0 ){
    x[i] = "FizzBuzz"
  }
  else if(i%%3 == 0){
    x[i] = "Fizz"
  }
  else if(i%%5 == 0)
    x[i] = "Buzz"
 }
print(x)
}

The function contains three conditions inside a for loop, the first condition takes a number and see if it is divisible by 3 and 5 to return “FizzBuzz” if this condition is not met, it goes to the second condition and see if the number is divisible by 3 and return “Fizz” also if this is not me, the third condition returns “Buzz” if the number is divisible by 5. If all these functions are not met, the function prints the number. Modular division %% is used to see if the remainder is equal to zero or not.

FizzBuzz(20)
##  [1] "1"        "2"        "Fizz"     "4"        "Buzz"     "Fizz"    
##  [7] "7"        "8"        "Fizz"     "Buzz"     "11"       "Fizz"    
## [13] "13"       "14"       "FizzBuzz" "16"       "17"       "Fizz"    
## [19] "19"       "Buzz"

Using functionals

FizzBuzz_2 <- function(n){
x <- seq(from = 1, to = n, by = 1)
fizz_buzz <- function(x){
  if(x%%3 == 0 & x%%5 == 0){
    print("FizzBuzz")
  }
  else if(x%%3 == 0){
    print("Fizz")
  }
  else if(x%%5 == 0){
    print("Buzz")
  }
  else(print(x))
}
fizzbuzz_return <- sapply(x, fizz_buzz)[0]
print(fizzbuzz_return)
}

In the function, a sequence of vector-matrix x is created from 1 to n using seq(). Then a function with similar conditions as to the function in the for loop is created taking the vector of values x as input. sapply() is used to return the result of the function on the vector x.

FizzBuzz_2(20)
## [1] 1
## [1] 2
## [1] "Fizz"
## [1] 4
## [1] "Buzz"
## [1] "Fizz"
## [1] 7
## [1] 8
## [1] "Fizz"
## [1] "Buzz"
## [1] 11
## [1] "Fizz"
## [1] 13
## [1] 14
## [1] "FizzBuzz"
## [1] 16
## [1] 17
## [1] "Fizz"
## [1] 19
## [1] "Buzz"
## character(0)

Conclusion

Unlike other programming languages, most problems can be solved in R without using loops. This is known as vectorization and is the basis on which most R functions are built. This makes code look elegant, fast and easy to debug. That is all for this post, thanks for reading.

To leave a comment for the author, please follow the link and comment on their blog: Blogs on Adejumo R.S.

R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)