在TMP中发出嘶嘶声[关闭]


10

Fizz Buzz问题是一个非常基本的问题,需要解决的问题被一些人用来清除不知道如何编程的受访者。问题是:

Set N = [0,100]
Set F = x in N where x % 3 == 0
Set B = x in N where x % 5 == 0
Set FB = F intersect B

For all N:
  if x in F: print fizz
  if x in B: print buzz
  if x in FB: print fizzbuzz
  if x not in F|B|FB print x

对此Fizz Buzz问题进行修改的目的是使用C ++模板执行上述算法,以使尽可能少的运行时操作成为可能。

如果需要,可以将N减小到较小的范围,以便在必要时适合TMP对象。

预计这不是“高尔夫”。


11
您应该说“模板元编程”而不是TMP,因为大多数非C ++人都不知道TMP是什么。
克里斯·杰斯特·杨

6
“淘汰不知道如何编程的受访者”我不知道普通程序员需要了解模板元编程。
亚历山德鲁

1
您如何定义运行时操作?汇编指令?如果是这样,最好指定一个编译器和平台,这样就不会产生歧义。
sepp2k 2011年

7
@Alexandru:他说,fizzbuzz问题用于“清除...”,而不是使用Template Metaprogramming解决fizzbuzz问题。
sepp2k 2011年

Answers:


3

这是我的尝试(已经摆放了一天左右,因为我不确定它是否适合作为解决方案)。出人意料的是,我从@Chris合并的唯一内容是更改template<int N, int m3, int m5>template<int N, int m3=N%3, int m5=N%5>

#include <iostream>

using namespace std;

template<int N, int m3=N%3, int m5=N%5>
struct fizzbuzz_print {
  static void print() {
    cout << N << '\n';
  }
};

template<int N, int m5>
struct fizzbuzz_print<N, 0, m5> {
  static void print() {
    cout << "fizz\n";
  }
};

template<int N, int m3>
struct fizzbuzz_print<N, m3, 0> {
  static void print() {
    cout << "buzz\n";
  }
};

template<int N>
struct fizzbuzz_print<N, 0, 0> {
  static void print() {
    cout << "fizzbuzz\n";
  }
};

template<int N>
struct fizzbuzz:public fizzbuzz<N-1> {
  fizzbuzz<N>() {
    fizzbuzz_print<N>::print();
  }
};

template<>
struct fizzbuzz<1> {
  fizzbuzz<1>() {
    fizzbuzz_print<1>::print();
  }
};

int main() {
  fizzbuzz<100> t;
}

另外,由于这是我第一次尝试TMP,因此对改进我的代码的任何建议将不胜感激。


2

完全非高尔夫解决方案:

template <int n, int m3 = n % 3, int m5 = n % 5>
struct FizzBuzz {
    static int value() {return n;}
};

template <int n, int m5>
struct FizzBuzz<n, 0, m5> {
    static char const* value() {return "Fizz";}
};

template <int n, int m3>
struct FizzBuzz<n, m3, 0> {
    static char const* value() {return "Buzz";}
};

template <int n>
struct FizzBuzz<n, 0, 0> {
    static char const* value() {return "FizzBuzz";}
};

测试代码示例:

#include <iostream>

int
main()
{
    std::cout << FizzBuzz<1>::value() << '\n'
              << FizzBuzz<2>::value() << '\n'
              << FizzBuzz<3>::value() << '\n'
              << FizzBuzz<4>::value() << '\n'
              << FizzBuzz<5>::value() << '\n'
              << FizzBuzz<13>::value() << '\n'
              << FizzBuzz<14>::value() << '\n'
              << FizzBuzz<15>::value() << '\n'
              << FizzBuzz<16>::value() << '\n';
}

1

好吧,我终于可以尝试一下了。不同于以往的解决方案,我的解决方案建立在编译时整个输出字符串和唯一的运行时调用的是一个单一的通话cout<<运营商。我boost::mpl用来使代码易于管理。

#include <boost/mpl/string.hpp>
#include <boost/mpl/bool.hpp>
#include <boost/mpl/char.hpp>
#include <boost/mpl/if.hpp>

using namespace boost::mpl;
using std::cout;

template<int n> struct IntToString {
    typedef typename push_back<typename IntToString<n/10>::str, char_<'0'+n%10> >::type str;
};


template<> struct IntToString<0> {
    typedef string<> str;
};


template<int n> struct FizzBuzzHelper {
    typedef typename push_back<typename IntToString<n>::str, char_<'\n'> >::type intstring;
    typedef typename if_< bool_<n%15==0>, string<'fizz','buzz','\n'>,
                          typename if_< bool_<n%5==0>, string<'buzz','\n'>,
                                        typename if_< bool_<n%3==0>, string<'fizz','\n'>,
                                                      intstring>::type >::type >::type str;
};

template<int n> struct FizzBuzz {
    typedef typename insert_range<typename FizzBuzz<n-1>::str,
                                  typename end<typename FizzBuzz<n-1>::str>::type,
                                  typename FizzBuzzHelper<n>::str>::type str;
};

template<> struct FizzBuzz<0> {
    typedef string<> str;
};


#include <iostream>

int main() {
    cout << c_str<FizzBuzz<9>::str>::value;
    return 0;
}

可悲的是,boost::mpl::string如果使用n大于9的字符串,则代码会因为抱怨字符串太大而崩溃。


0

362个字符。

#include <iostream>
#include <string>

using namespace std;

template<int N>
struct S {
    static string s, f, l;
};

template<int N>
string S<N>::s =
    N > 9
      ? S<N / 10>::s + S<N % 10>::s
      : string(1, '0' + N);

template<int N>
string S<N>::f =
    N % 15
      ? N % 5
          ? N % 3
              ? s
              : "fizz"
          : "buzz"
      : "fizzbuzz";

template<>
string S<0>::l = f;
template<int N>
string S<N>::l = S<N - 1>::l + "\n" + f;

int main() {
    cout << S<100>::l << endl;
    return 0;
}

除非我缺少某些操作,否则所有操作都将在此处的运行时发生。
sepp2k 2011年

@ sepp2k:你的意思是?:?我认为可以在编译时进行评估。当然,在此,我确实在运行时发生了巨大的字符串连接。
迅速2011年

我主要是指字符串的构造和连接,但是?:也不必在编译时发生(尽管可能会发生)。
sepp2k 2011年

-2

本地b = io.read(“ * n”)本地i = 1而(i <= b)如果i%15 == 0,则执行print(“ FizzBu​​zz”)否则,如果i%3 == 0,则执行print(“ Fizz “)elseif i%5 == 0则print(” Buzz“)else print(i)end i = i + 1 end


欢迎光临本站!这是什么语言?您可以通过突出显示代码并单击编辑器中的图标来使用代码格式。
Ad Hoc Garf Hunter

这个问题专门针对中的FizzBu​​zz C++,而您的答案是在Lua(?)中。您是要发布通用的FizzBu​​zz问题吗?
乔·金
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.