Blog coding and discussion of coding about JavaScript, PHP, CGI, general web building etc.

Friday, August 26, 2016

FizzBuzz cleanup

FizzBuzz cleanup


I'm still learning Haskell, and I was wondering if there is a less verbose way to express the below statement using 1 line of code:

map (\x -> (x, (if mod x 3 == 0 then "fizz" else "") ++    if mod x 5 == 0 then "buzz" else "")) [1..100]  

Produces: [(1,""),(2,""),(3,"fizz"),(4,""),(5,"buzz"),(6,"fizz"),(7,""),(8,""),(9,"fizz"),(10,"buzz"),(11,""),(12,"fizz"),(13,""),(14,""),(15,"fizzbuzz"),(16,""),(17,""),(18,"fizz"),(19,""),(20,"buzz"),(21,"fizz"),(22,""),(23,""),(24,"fizz"),(25,"buzz"),(26,""),(27,"fizz"),(28,""),(29,""),(30,"fizzbuzz"), etc

It just feels like I'm fighting the syntax more than I should. I've seen other questions for this in Haskell, but I'm looking for the most optimal way to express this in a single statement (trying to understand how to work the syntax better).

Answer by Fred Foo for FizzBuzz cleanup


How's about...

fizzBuzz  =  [(x, fizz x ++ buzz x) | x <- [1..100]]    where fizz n | n `mod` 3 == 0  =  "fizz"                 | otherwise       =  ""          buzz n | n `mod` 5 == 0  =  "buzz"                 | otherwise       =  ""  

Answer by dave4420 for FizzBuzz cleanup


Along the same lines as larsmans' answer:

fizzBuzz = [(x, f 3 "fizz" x ++ f 5 "buzz" x) | x <- [1..100]]    where f k s n | n `mod` k == 0 = s                  | otherwise      = ""  

Answer by hammar for FizzBuzz cleanup


If you insist on a one-liner:

[(x, concat $ ["fizz" | mod x 3 == 0] ++ ["buzz" | mod x 5 == 0]) | x <- [1..100]]  

Answer by pat for FizzBuzz cleanup


Couldn't resist going in the other direction and making it more complicated. Look, no mod...

merge as@(a@(ia,sa):as') bs@(b@(ib,sb):bs') =    case compare ia ib of      LT -> a : merge as' bs      GT -> b : merge as  bs'      EQ -> (ia, sa++sb) : merge as' bs'  merge as bs = as ++ bs    zz (n,s) = [(i, s) | i <- [n,2*n..]]  fizzBuzz = foldr merge [] $ map zz [(1,""), (3,"fizz"), (5,"buzz")]  

Answer by elviejo for FizzBuzz cleanup


I think the reason why you feel like you are fighting the syntax is because you are mixing too many types.

Instead of trying to print:

[(1, ""), (2,""), (3,"Fizz")...]  

Just think of printing strings:

["1","2","Fizz"...]  

My attempt:

Prelude> let fizzBuzz x | x `mod` 15 == 0 = "FizzBuzz" | x `mod` 5 == 0 = "Buzz" | x `mod` 3 == 0 = "Fizz" | otherwise = show x  Prelude> [fizzBuzz x | x <-[1..100]]    ["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz"...]  

In order to convert an Int to String you use the:

show x  

Answer by Landei for FizzBuzz cleanup


We need no stinkin' mod...

zip [1..100] $ zipWith (++) (cycle ["","","fizz"]) (cycle ["","","","","buzz"])  

or slightly shorter

import Data.Function(on)    zip [1..100] $ (zipWith (++) `on` cycle) ["","","fizz"] ["","","","","buzz"]  

Or the brute force way:

zip [1..100] $ cycle ["","","fizz","","buzz","fizz","","","fizz","buzz","","fizz","","","fizzbuzz"]  

Answer by Rotsor for FizzBuzz cleanup


Writer monad may look nice (if you don't like concat):

fizzBuzz = [(x, execWriter $ when (x `mod` 3 == 0) (tell "fizz") >> when (x `mod` 5 == 0)  (tell "buzz")) | x <- [1..100]]  

It's not particularly succinct though.

Answer by Sergey N. Yashin for FizzBuzz cleanup


Just for studying

zipWith (\a b -> b a) (map show [1..100]) $ cycle [id,id,const "fizz",id,const "buzz",const "fizz",id,id,const "fizz",const "buzz",id,const "fizz",id,id,const "fizzbuzz"]  

produces

["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","26","fizz","28","29","fizzbuzz","31","32","fizz","34","buzz","fizz","37","38","fizz","buzz","41","fizz","43","44","fizzbuzz","46","47","fizz","49","buzz","fizz","52","53","fizz","buzz","56","fizz","58","59","fizzbuzz","61","62","fizz","64","buzz","fizz","67","68","fizz","buzz","71","fizz","73","74","fizzbuzz","76","77","fizz","79","buzz","fizz","82","83","fizz","buzz","86","fizz","88","89","fizzbuzz","91","92","fizz","94","buzz","fizz","97","98","fizz","buzz"]  


Fatal error: Call to a member function getElementsByTagName() on a non-object in D:\XAMPP INSTALLASTION\xampp\htdocs\endunpratama9i\www-stackoverflow-info-proses.php on line 72

Related Posts:

0 comments:

Post a Comment

Popular Posts

Fun Page

Powered by Blogger.