Условия задачи:
Если число кратно 3 то вывести Fizz, если 5 то Buzz, если обоим то FizzBuzz. В противном случае вывести само число.
Код я старался писать максимально без использования встроенных функций вроде show и map. На вход подаю список чисел.
Код:
num_to_list :: Int -> [Int]
num_to_list 0 = []
num_to_list x = num_to_list (div x 10) ++ [mod x 10]
num_list_to_str :: [Int] -> String
num_list_to_str [] = []
num_list_to_str (x:xs) = int_char_to_str x ++ num_list_to_str xs
int_char_to_str :: Int -> String
int_char_to_str x =
case x of
1 -> "1"
2 -> "2"
3 -> "3"
4 -> "4"
5 -> "5"
6 -> "6"
7 -> "7"
8 -> "8"
9 -> "9"
0 -> "0"
_ -> "Error"
num_to_str :: Int -> String
num_to_str = num_list_to_str . num_to_list
fizzbuzz :: [Int] -> [String]
fizzbuzz [] = []
fizzbuzz (x:xs)
| (mod x 3 == 0) && (mod x 5 == 0) = "FizzBuzz" : fizzbuzz xs
| mod x 3 == 0 = "Fizz" : fizzbuzz xs
| mod x 5 == 0 = "Buzz" : fizzbuzz xs
| otherwise = num_to_str x : fizzbuzz xs
Вывод при fizzbuzz [1..100]:
["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"]