challenge 変形Fizz-Buzz問題

どもraynstardです。
どちらにしようか迷いましたが発想の元ネタがUIさんの投稿からなので
こちらに投稿してみます。
--------------
以下の仕様を満たす文字列を
20行出力するプログラムを作成してください。

1. 1行の出力は「<行番号> ':' <メッセージ>」であること。
2. 行番号が 3の倍数であるとき、メッセージは「Fizz」であること
3. 行番号が 5の倍数であるとき、メッセージは「Buzz」であること
4. 行番号が 3の倍数かつ5の倍数であるとき、メッセージは「FizzBuzz」であること
5. 上記に記した条件以外のメッセージについては「hoge」であること
6. 条件分岐する場合、if文のみが使用でき、
   かつ、論理式が成立した場合の処理のみが記述できます。
#アセンブリなどifがなければif以外でもかまわないです。(意味が同じならば)

というわけでこの問題はFizz-Buzz問題をelseなしならどう書く?という問題です。

出力例:
 1:hoge
 2:hoge
 3:Fizz
 4:hoge
 5:Buzz
 6:Fizz
 7:hoge
 8:hoge
 9:Fizz
10:Buzz
11:hoge
12:Fizz
13:hoge
14:hoge
15:FizzBuzz
16:hoge
17:hoge
18:Fizz
19:hoge
20:Buzz

Posted feedbacks - C++

C++ なら else どころか条件分岐もループも消せる。
 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
#include <cstdio>

template<bool mod3, bool mod5>
const char* message()
{
    return "hoge";
}

template<>
const char* message<true, false>()
{
    return "Fizz";
}

template<>
const char* message<false, true>()
{
    return "Buzz";
}

template<>
const char* message<true, true>()
{
    return "FizzBuzz";
}

template<int n>
void fizzbuzz()
{
    fizzbuzz<n - 1>();
    printf("%2d:%s\n", n, message<n % 3 == 0, n % 5 == 0>());
}

template<>
void fizzbuzz<0>()
{
}

int main()
{
    fizzbuzz<20>();
}


	
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
int main(int, char* [])
{
    static const char* const ss[] = { "Hoge", "Fizz", "Buzz", "FizzBuzz" };

    for(int i = 1; i <= 20; ++i)
    {
        std::cout << std::setw(2) << i << ':' << ss[(i%5==0?2:0)+(i%3==0?1:0)] << std::endl;
    }

    return 0;
}

Index

Feed

Other

Link

Pathtraq

loading...