সি শার্প
আপনার কাজটি হ'ল স্যাট-এর জন্য এমন একটি প্রোগ্রাম লিখুন যা বহুপদী সময়ে কার্যকর হয় appears
"উপস্থিত" অপ্রয়োজনীয়। আমি এমন একটি প্রোগ্রাম লিখতে পারি যা স্যাট সমস্যা সমাধানের জন্য বহুত্ববাদী সময়ে বাস্তবায়িত হয়। এটি বাস্তবে বেশ সরল।
মেগা বোনাস: আপনি যদি এমন একটি স্যাট-সলভার লিখেন যা প্রকৃতপক্ষে বহুবর্ষের সময় কার্যকর হয় তবে আপনি মিলিয়ন ডলার পাবেন! তবে দয়া করে কোনও স্পোলার ট্যাগ ব্যবহার করুন, যাতে অন্যরা এটি সম্পর্কে অবাক হয়ে যায়।
অসাধারণ. দয়া করে আমাকে মিলিয়ন টাকা প্রেরণ করুন সিরিয়াসলি, আমার এখনই একটি প্রোগ্রাম রয়েছে যা বহুপদী রানটাইমের সাহায্যে স্যাট সমাধান করবে।
আমাকে উল্লেখ করে শুরু করুন যে আমি স্যাট সমস্যার উপর একটি প্রকরণটি সমাধান করতে যাচ্ছি। আমি কীভাবে একটি প্রোগ্রাম লিখতে যাচ্ছি যা কোনও 3-SAT সমস্যার অনন্য সমাধান প্রদর্শন করে । আমার বোলারটি কাজ করার জন্য প্রতিটি বুলিয়ান ভেরিয়েবলের মূল্যায়ন অনন্য হতে হবে ।
আমরা কয়েকটি সহজ সহায়ক পদ্ধতি এবং প্রকারগুলি ঘোষণা করে শুরু করি:
class MainClass
{
class T { }
class F { }
delegate void DT(T t);
delegate void DF(F f);
static void M(string name, DT dt)
{
System.Console.WriteLine(name + ": true");
dt(new T());
}
static void M(string name, DF df)
{
System.Console.WriteLine(name + ": false");
df(new F());
}
static T Or(T a1, T a2, T a3) { return new T(); }
static T Or(T a1, T a2, F a3) { return new T(); }
static T Or(T a1, F a2, T a3) { return new T(); }
static T Or(T a1, F a2, F a3) { return new T(); }
static T Or(F a1, T a2, T a3) { return new T(); }
static T Or(F a1, T a2, F a3) { return new T(); }
static T Or(F a1, F a2, T a3) { return new T(); }
static F Or(F a1, F a2, F a3) { return new F(); }
static T And(T a1, T a2) { return new T(); }
static F And(T a1, F a2) { return new F(); }
static F And(F a1, T a2) { return new F(); }
static F And(F a1, F a2) { return new F(); }
static F Not(T a) { return new F(); }
static T Not(F a) { return new T(); }
static void MustBeT(T t) { }
এখন আসুন 3-SAT সমস্যা সমাধানের জন্য বেছে নেওয়া যাক। চল বলি
(!x3) &
(!x1) &
(x1 | x2 | x1) &
(x2 | x3 | x2)
এর আরও কিছুটা বন্ধুত্বপূর্ণ করা যাক।
(!x3) & (
(!x1) & (
(x1 | x2 | x1) &
(x2 | x3 | x2)))
আমরা এটিকে এনকোড করি:
static void Main()
{
M("x1", x1 => M("x2", x2 => M("x3", x3 => MustBeT(
And(
Not(x3),
And(
Not(x1),
And(
Or(x1, x2, x1),
Or(x2, x3, x2))))))));
}
এবং প্রোগ্রামটি চালানোর সময় যথেষ্ট নিশ্চিত হয়ে আমরা বহু-কালীন সময়ে 3-স্যাট-এর একটি সমাধান পাই। আসলে রানটাইম সমস্যার আকারে লিনিয়ার !
x1: false
x2: true
x3: false
আপনি বলেছেন বহুপদী রানটাইম । আপনি বহুবর্ষীয় সংকলনের সময় সম্পর্কে কিছুই বলেননি । এই প্রোগ্রামটি সি # সংকলককে x1, x2 এবং x3 এর জন্য সম্ভাব্য সমস্ত ধরণের সংমিশ্রণগুলি চেষ্টা করতে বাধ্য করে এবং কোনও অনন্য ত্রুটি প্রদর্শন না করে এমন একটি অনন্য চয়ন করতে পারে। সংকলক সমস্ত কাজ করে, তাই রানটাইমের দরকার নেই। আমি 2007 সালে আমার ব্লগে এই আকর্ষণীয় টেকনিকটি প্রথম প্রদর্শিত হয়েছিল: http://blogs.msdn.com/b/ericlippert/archive/2007/03/28/lambda-expressions-vs-anonymous-methods-part-five.aspx নোট অবশ্যই এই উদাহরণটি দেখায় যে সি # তে ওভারলোড রেজোলিউশনটি কমপক্ষে এনপি-হার্ড। তা এনপি-হার্ড বা প্রকৃতপক্ষে অনির্বচনীয় Whether জেনেরিক বৈপরীত্যের উপস্থিতিতে ধরণের রূপান্তরযোগ্যতা কীভাবে কাজ করে তার নির্দিষ্ট সূক্ষ্ম বিশদের উপর নির্ভর করে, তবে এটি অন্য দিনের বিষয়।