टीएमपी में फिजिक गुलजार [बंद]


10

फ़िज़ बज़ समस्या एक बहुत ही मूल समस्या है जिसे हल करने के लिए कुछ द्वारा उपयोग किए जाने वाले साक्षात्कारकर्ताओं द्वारा उपयोग किया जाता है जो प्रोग्राम को नहीं जानते हैं। यह समस्या है:

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

फ़िज़ बज़ समस्या के इस संशोधन का उद्देश्य उपरोक्त एल्गोरिथ्म को C ++ टेम्प्लेट का उपयोग करके निष्पादित करना है जैसे कि कुछ रनटाइम ऑपरेशन आवश्यक हैं जैसा कि किया जा सकता है।

यदि आवश्यक हो तो टीएमपी वस्तुओं के भीतर फिट करने के लिए आप एन को एक छोटी सीमा तक कम कर सकते हैं।

यह एक "गोल्फ" होने की उम्मीद नहीं है।


11
आपको TMP के बजाय "टेम्पलेट मेटाप्रोग्रामिंग" कहना चाहिए, क्योंकि अधिकांश गैर-C ++ लोगों को पता नहीं होगा कि TMP क्या है।
क्रिस जस्टर-यंग

6
"खरपतवार के साक्षात्कारकर्ताओं को पता नहीं है कि कैसे प्रोग्राम करना है" मुझे नहीं पता था कि औसत प्रोग्रामर को टेम्प्लेट मेटाप्रोग्रामिंग को जानने की आवश्यकता है।
अलेक्जेंड्रू

1
आप रनटाइम ऑपरेशन को कैसे परिभाषित करते हैं? कोडर निर्देश? यदि ऐसा है तो एक संकलक और मंच को निर्दिष्ट करना एक अच्छा विचार हो सकता है ताकि कोई अस्पष्टता न हो।
21

7
@ अलेक्सांद्रु: उन्होंने कहा कि फ़िज़बज़्ज़ समस्या का उपयोग "खरपतवार ..." करने के लिए किया जाता है, न कि टेम्पलेट मेटाप्रोग्रामिंग का उपयोग करके फ़िज़बज़ की समस्या को हल करना है।
23

जवाबों:


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

इसके अतिरिक्त, चूंकि यह टीएमपी पर मेरा पहला प्रयास है, इसलिए मेरे कोड में सुधार के किसी भी सुझाव की सराहना की जाएगी।


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

अफसोस की बात है कि कोड 9 से अधिक boost::mpl::stringका उपयोग करते समय बहुत बड़े तार के बारे में शिकायत करने के साथ उड़ा देगा n


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

@ sepp2k: क्या आपका मतलब है ?:? मैंने सोचा कि संकलन समय पर मूल्यांकन किया जा सकता है। बेशक, मेरे पास यहां रनवे पर एक विशालकाय स्ट्रिंग कॉन्सेप्टन है।

मुख्य रूप से मेरा मतलब था कि स्ट्रिंग निर्माण और संघनन, लेकिन !: भी संकलन समय पर नहीं होता है (हालांकि यह शायद होगा)।
sepp2k

-2

लोकल b = io.read ("* n") लोकल i = 1 जबकि (i <= b) अगर मैं% 15 == 0 करता हूं तो प्रिंट करें ("FizzBuzz") ifif i% 3 == 0 तो प्रिंट करें ("Fizz ") इस्तिफ i% 5 == 0 फिर प्रिंट करें (" बज़ ") और प्रिंट करें (i) अंत i = i + i अंत


साइट पर आपका स्वागत है! यह कौनसी भाषा है? आप अपने कोड को हाइलाइट करके और संपादक में आइकन पर क्लिक करके कोड स्वरूपण का उपयोग कर सकते हैं।
तदर्थ गार्फ हंटर

यह प्रश्न विशेष रूप से FizzBuzz के लिए है C++, और आपका उत्तर Lua (?) में है। क्या आप सामान्य FizzBuzz सवाल पोस्ट करने का मतलब है ?
जो राजा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.