buzz fizz trong TMP [đã đóng]


10

Vấn đề Fizz Buzz là một vấn đề rất cơ bản để giải quyết được một số người sử dụng để loại bỏ những người được phỏng vấn không biết cách lập trình. Vấn đề là:

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

Mục tiêu của việc sửa đổi vấn đề Fizz Buzz này là thực hiện thuật toán trên bằng các mẫu C ++ sao cho ít thao tác thời gian chạy là cần thiết như có thể được thực hiện.

Bạn có thể giảm N xuống một phạm vi nhỏ hơn nếu bạn cần để phù hợp với các đối tượng TMP khi cần thiết.

Đây không phải là một "golf".


11
Bạn nên nói "Lập trình siêu mẫu" chứ không phải TMP, bởi vì hầu hết những người không phải C ++ sẽ không biết TMP là gì.
Chris Jester-Young

6
"loại bỏ những người được phỏng vấn không biết cách lập trình" Tôi không biết rằng lập trình viên trung bình cần biết Lập trình siêu mẫu.
Alexandru

1
Làm thế nào để bạn xác định hoạt động thời gian chạy? Hướng dẫn lắp ráp? Nếu vậy, có thể là một ý tưởng tốt để chỉ định một trình biên dịch và nền tảng để không có sự mơ hồ.
sepp2k

7
@Alexandru: Ông nói rằng vấn đề fizzbuzz được sử dụng để "loại bỏ ...", chứ không phải giải quyết vấn đề fizzbuzz bằng cách sử dụng Metaprogramming mẫu.
sepp2k

1
Bản sao có thể có của 1, 2, Fizz, 4, Buzz
pppery

Câu trả lời:


3

Đây là nỗ lực của tôi (đã để nó nằm một ngày hoặc lâu hơn, bởi vì tôi không chắc liệu nó có phù hợp như một giải pháp hay không). Đáng ngạc nhiên là bit duy nhất tôi kết hợp từ @Chris đã thay đổi template<int N, int m3, int m5>thànhtemplate<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;
}

Ngoài ra, vì đây là nỗ lực đầu tiên của tôi tại TMP, mọi đề xuất cải thiện mã của tôi sẽ được đánh giá cao.


2

Giải pháp hoàn toàn không chơi gôn:

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";}
};

Mã kiểm tra mẫu:

#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

Được rồi, cuối cùng tôi đã có được xung quanh để chụp ảnh này. Không giống như các giải pháp trước đó, giải pháp của tôi xây dựng toàn bộ chuỗi đầu ra tại thời gian biên dịch và cuộc gọi trong thời gian chạy duy nhất là một cuộc gọi đến toán tử coutcủa một cuộc gọi <<. Tôi đang sử dụng boost::mplđể giữ cho mã có thể quản lý được phần nào.

#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;
}

Đáng buồn thay, mã sẽ nổ tung với việc boost::mpl::stringphàn nàn về các chuỗi quá lớn khi sử dụng bất kỳ nlớn hơn 9.


0

362 ký tự.

#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;
}

Trừ khi tôi thiếu một cái gì đó tất cả các hoạt động xảy ra trong thời gian chạy ở đây.
sepp2k

@ sepp2k: Ý bạn là ?:sao? Tôi nghĩ rằng có thể được đánh giá tại thời gian biên dịch. Tất nhiên, tôi có một chuỗi nối khổng lồ xảy ra trong thời gian chạy ở đây.
ephemient

Chủ yếu tôi có nghĩa là việc xây dựng và nối chuỗi, nhưng?: Cũng không phải xảy ra vào thời gian biên dịch (mặc dù nó có thể sẽ xảy ra).
sepp2k

-2

local b = io.read ("* n") local i = 1 while (i <= b) do if i% 15 == 0 sau đó in ("FizzBuzz") otherif i% 3 == 0 sau đó in ("Fizz ") otherif i% 5 == 0 sau đó in (" Buzz ") khác in (i) end i = i + 1 end


Chào mừng đến với trang web! Ngôn ngữ này là gì? Bạn có thể sử dụng định dạng mã bằng cách tô sáng mã của bạn và nhấp vào biểu tượng trong trình chỉnh sửa.
Ad Hoc Garf Hunter

Câu hỏi này dành riêng cho FizzBuzz C++và câu trả lời của bạn là Lua (?). Ý của bạn là đăng lên câu hỏi chung của FizzBuzz ?
Jo King
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.