Форум программистов, компьютерный форум, киберфорум
Max Dark
Войти
Регистрация
Восстановить пароль
Оценить эту запись

FizzBuzz без использования "if"

Запись от Max Dark размещена 16.01.2020 в 18:56
Метки fizzbuzz

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// task: https://en.wikipedia.org/wiki/Fizz_buzz
// compile: g++ -Wall -Wpedantic -Werror fizz_buzz.cxx -o fizz_buzz
 
#include <iostream>
#include <string>
namespace
{
std::string solve(int num);
}
int main()
{
    for(int num = 1; num <= 100; ++num)
    {
        std::cout << solve(num) << std::endl;
    }
    return 0;
}
 
namespace
{
 
using functor = std::string(*)(int);
 
std::string number(int num)
{
    return std::to_string(num);
}
 
std::string fizz(int)
{
    return "Fizz";
}
 
std::string buzz(int)
{
    return "Buzz";
}
std::string fizz_buzz(int)
{
    return "FizzBuzz";
}
 
functor solvers[2][2] = {
    { &number, &buzz      },
    { &fizz  , &fizz_buzz }
};
 
std::string solve(int num)
{
    return (solvers[0 == num % 3][0 == num % 5])(num);
}
}
Всего комментариев 5
Комментарии
  1. Старый комментарий
    Аватар для XLAT
    я знаю два полезных случая применения функторов:
    (потому что юзал их в своих прожектах)
    1. колбэки
    2. убрать жирный свич.

    Max Dark,
    ваш пример похоже демонстрирует второй случай.
    Запись от XLAT размещена 16.01.2020 в 21:27 XLAT вне форума
  2. Старый комментарий
    Аватар для Avazart
    При чем тут switсh ?
    Запись от Avazart размещена 16.01.2020 в 23:09 Avazart вне форума
    Обновил(-а) Avazart 16.01.2020 в 23:11
  3. Старый комментарий
    Аватар для Avazart
    При чем тут switch ?
    Запись от Avazart размещена 16.01.2020 в 23:10 Avazart вне форума
  4. Старый комментарий
    Добавили бы комментарии и пояснения
    Запись от ТабуретY размещена 18.01.2020 в 00:23 ТабуретY вне форума
  5. Старый комментарий
    Аватар для Max Dark
    Цитата:
    Сообщение от XLAT Просмотреть комментарий
    я знаю два полезных случая применения функторов:
    (потому что юзал их в своих прожектах)
    1. колбэки
    2. убрать жирный свич.

    Max Dark,
    ваш пример похоже демонстрирует второй случай.
    Это просто одно из решений измусоленной задачки "FizzBuzz", к которой добавили дополнительное условие "не использовать if".
    Цитата:
    Сообщение от ТабуретY Просмотреть комментарий
    Добавили бы комментарии и пояснения
    Тип functor - это указатель на функцию, принимающую число и возвращающую строку.
    Массив solvers можно считать таблицей истинности 2х переменных:
    div3 - делится ли число на 3
    div5 - делится ли число на 5
    solvers div5 = false div5 = true
    div3 = false [0, 0][0, 1]
    div3 = true [1, 0][1, 1]

    В C++ определено неявное(implicit) преобразование bool к числу: int(false) == 0, int(true) == 1
    Тем самым результат логических операций можно использовать как индексы.
    Запись от Max Dark размещена 18.01.2020 в 05:37 Max Dark вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.