desis desis di TMP [ditutup]


10

Masalah Fizz Buzz adalah masalah yang sangat mendasar untuk dipecahkan yang digunakan oleh beberapa orang untuk menyingkirkan orang yang diwawancarai yang tidak tahu cara memprogram. Masalahnya adalah:

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

Objek dari modifikasi masalah Fizz Buzz ini adalah untuk melakukan algoritma di atas menggunakan templat C ++ sehingga beberapa operasi runtime diperlukan sebagaimana dapat dilakukan.

Anda dapat mengurangi N ke kisaran yang lebih kecil jika Anda perlu agar sesuai dengan objek TMP jika diperlukan.

Ini tidak diharapkan menjadi "golf".


11
Anda harus mengatakan "Templat Metaprogramming" daripada TMP, karena kebanyakan orang yang bukan C ++ tidak tahu apa itu TMP.
Chris Jester-Young

6
"singkirkan orang yang diwawancarai yang tidak tahu cara memprogram" Saya tidak tahu bahwa rata-rata programmer perlu mengetahui Metaprogramming Template.
Alexandru

1
Bagaimana Anda mendefinisikan operasi runtime? Instruksi assembler? Jika demikian, mungkin ide yang baik untuk menentukan kompiler dan platform sehingga tidak ada ambiguitas.
sepp2k

7
@Alexandru: Dia mengatakan bahwa masalah fizzbuzz digunakan untuk "menyingkirkan ...", bukan memecahkan masalah fizzbuzz menggunakan Template Metaprogramming.
sepp2k

1
Kemungkinan duplikat 1, 2, Fizz, 4, Buzz
pppery

Jawaban:


3

Inilah usaha saya (memilikinya sekitar satu hari atau lebih, karena saya tidak yakin apakah itu cocok sebagai solusi). Anehnya, satu-satunya bit yang saya masukkan dari @Chris berubah template<int N, int m3, int m5>menjaditemplate<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;
}

Selain itu, karena ini adalah upaya pertama saya di TMP, setiap saran untuk meningkatkan kode saya akan dihargai.


2

Solusi yang benar-benar non-golf:

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

Kode uji sampel:

#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

Oke, saya akhirnya sempat mencoba ini. Berbeda dengan solusi sebelumnya solusi saya membangun seluruh string output pada waktu kompilasi dan satu-satunya run-time panggilan adalah panggilan tunggal untuk cout's <<operator. Saya menggunakan boost::mpluntuk menjaga kode agak mudah dikelola.

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

Sayangnya kode akan meledak dengan boost::mpl::stringmengeluh tentang string terlalu besar ketika menggunakan yang nlebih besar dari 9.


0

362 karakter.

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

Kecuali saya kehilangan sesuatu, semua operasi terjadi pada saat dijalankan di sini.
sepp2k

@ sepp2k: Maksud Anda ?:? Saya pikir itu bisa dievaluasi pada waktu kompilasi. Tentu saja, saya memiliki rangkaian string raksasa yang terjadi saat runtime di sini.
ephemient

Terutama saya maksudkan konstruksi dan penggabungan string, tetapi?: Juga tidak harus terjadi pada waktu kompilasi (meskipun mungkin akan).
sepp2k

-2

local b = io.read ("* n") local i = 1 while (i <= b) lakukan jika i% 15 == 0 lalu cetak ("FizzBuzz") elseif i% 3 == 0 lalu cetak ("Fizz ") elseif i% 5 == 0 lalu cetak (" Buzz ") lain cetak (i) end i = i +1 end


Selamat datang di situs ini! Bahasa apa ini? Anda dapat menggunakan pemformatan kode dengan menyorot kode Anda dan mengklik ikon di editor.
Ad Hoc Garf Hunter

Pertanyaan ini khusus untuk FizzBuzz C++, dan jawaban Anda ada di Lua (?). Apakah Anda bermaksud memposting ke pertanyaan FizzBuzz generik ?
Jo King
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.