@plyk

Как можно улучшить это решение задачи FizzBuzz?

Условия задачи:
Если число кратно 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"]
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
@AlexSku
не буду отвечать из-за модератора
использовать show и map
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы