টিএমপি-তে ফিজ গুঞ্জন [বন্ধ]


10

ফিজ বাজ সমস্যাটি সমাধানের জন্য একটি খুব প্রাথমিক সমস্যা যা কিছু ব্যক্তি ইন্টারভিউ উইড আউট ব্যবহার করে যা প্রোগ্রাম কীভাবে জানেন না used সমস্যা হল:

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

ফিজ বাজ সমস্যার এই পরিবর্তনের উদ্দেশ্যটি হ'ল সি ++ টেমপ্লেটগুলি ব্যবহার করে উপরের অ্যালগরিদম সম্পাদন করা যা চালানো যেতে পারে এমন কয়েকটি রানটাইম অপারেশন প্রয়োজনীয়।

প্রয়োজনে যেখানে টিএমপি অবজেক্টগুলির মধ্যে ফিট করার প্রয়োজন হলে আপনি N কে একটি ছোট পরিসরে হ্রাস করতে পারবেন।

এটি "গল্ফ" হওয়ার আশা করা যায় না।


11
আপনার টিএমপি-র পরিবর্তে "টেম্পলেট মেটাপোগ্র্যামিং" বলা উচিত, কারণ বেশিরভাগ নন-সি ++ লোকদের টিএমপি কী তা কোনও ধারণা নেই
ক্রিস জেস্টার-ইয়ং

6
"কীভাবে প্রোগ্রামিং করতে হয় না এমন ইন্টারভিউ উইড আউট" আমি জানতাম না যে গড় প্রোগ্রামারকে টেমপ্লেট মেটাপোগ্র্যামিং জানা দরকার।
আলেকজান্দ্রু

1
রানটাইম অপারেশনকে আপনি কীভাবে সংজ্ঞায়িত করবেন? এসেমব্লারের নির্দেশনা? যদি তাই হয় তবে এটি একটি সংকলক এবং প্ল্যাটফর্ম নির্দিষ্ট করা ভাল ধারণা হতে পারে যাতে কোনও অস্পষ্টতা নেই।
sepp2k

7
@ আলেকজান্দ্রু: তিনি বলেছিলেন যে ফিজবজ সমস্যাটি "আগাছা ..." ব্যবহার করা হয়, টেমপ্লেট মেটাপ্রোগ্রামিং ব্যবহার করে ফিজবজ সমস্যা সমাধান করা নয়।
sepp2k

উত্তর:


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

স্থানীয় খ = io.read ("* n") স্থানীয় i = 1 যখন (i <= b) আমি% 15 == 0 করেন তবে তারপর ("FizzBuzz") মুদ্রণ করুন অন্যথায় আমি% 3 == 0 মুদ্রণ করুন ("Fizz ") অন্যথায় যদি আমি% 5 == 0 তবে মুদ্রণ করুন (" বাজ ") অন্য মুদ্রণ করুন (i) প্রান্ত i = i + 1 প্রান্ত


সাইটে স্বাগতম! এই কি ভাষা? আপনি আপনার কোডটি হাইলাইট করে এবং সম্পাদকের আইকনটিতে ক্লিক করে কোড বিন্যাস ব্যবহার করতে পারেন।
অ্যাডহক গার্ফ হান্টার

এই প্রশ্নটি বিশেষত ফিজবজ ইন-এর জন্য C++এবং আপনার উত্তরটি লুয়া (?) এ রয়েছে। আপনার কি জেনেরিক ফিজবজ প্রশ্নটিতে পোস্ট করার অর্থ ছিল ?
জো কিং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.