Write a program that prints the numbers 1 to 100. However, for multiples of 3 print "Fizz" and for multiples of 5 print "Buzz". For multiples of both 3 and 5, print "FizzBuzz".
Write a program that prints the numbers 1 to 100. However, for multiples of 3 print "Fizz" and for multiples of 5 print "Buzz". For multiples of both 3 and 5, print "FizzBuzz".
No point to this, I guess, other than that even something as simplistic as this is open to interpretation.
show' :: Int -> String show' x
|((rem x 3 == 0) && (rem x 5 == 0)) = "FizzBuzz"
|rem x 3 == 0 = "Fizz"
|rem x 5 == 0 = "Buzz"
|otherwise = show x
main :: IO ()
main = putStrLn $ foldl (\acc x -> acc ++"\n" ++ show' x) "" [1..100]
x `rem` 3
this means the same thing but is more readable (I think).Instead of folding, just map putStrLn over the list:
mapM_ (putStrLn . show') [1..100]
mapM_ is just a version of map for monads that ignores its result (it returns m () instead of m a). You can also use forM_ which is mapM_ with its arguments reversed.Finally, I think this site lets you format code by putting four spaces in front of each line. I hope :)
Edit: One other thing. You don't need all those parentheses in the first line.
rem x 3 == 0 && rem x 5 == 0 = "FizzBuzz"
x `rem` 3 == 0 && x `rem` 5 == 0 = "FizzBuzz"
Both versions should work and I think they are easier to read. I could see (rem x 3 == 0) also being clear, but the outermost parentheses do not help at all. fizzbuzz x | x `mod` 3 == 0 && x `mod` 5 == 0 = "FizzBuzz"
| x `mod` 3 == 0 = "Fizz"
| x `mod` 5 == 0 = "Buzz"
| otherwise = show x
main = putStr $ unlines $ map fizzbuzz [1..100] int main(int argc, char ** argv)
{
int i;
for (i=0; i< 100; i++)
{
if( (i%3==0)&&(i%5==0)) printf("FizzBuzz");
else if(i%3==0) printf ("Fizz");
else if(i%5==0) printf ("Buzz");
else printf("%d",i);
printf("\n");
}
}