কুইন-ইশ টিক-ট্যাক-টো


19

আপনার নির্বাচিত ভাষায় এমন একটি প্রোগ্রাম লিখুন যা কোনও মানব খেলোয়াড়ের বিপরীতে 3 * 3 বোর্ডে টিক-ট্যাক-টোয়ের নিখুঁত খেলা খেলবে। যাইহোক, প্রতিটি পদক্ষেপ একটি পৃথক প্রোগ্রাম হতে হবে , পূর্ববর্তী পুনরাবৃত্তি থেকে উত্পন্ন।

আপনি কীভাবে এবং কী আকারে মানব ইনপুটকে মূল্যায়ন করেন তা আপনার উপর নির্ভর করে তবে এটি স্ট্যান্ডার্ড ইনপুট থেকে পড়তে হবে। একইভাবে, আপনি কোন পদ্ধতি বেছে নিতে পারেন যে কীভাবে আপনি কোন প্লেয়ারটি শুরু হয় তা নির্ধারণ করবেন (উদাহরণস্বরূপ, আপনি প্রথমে জিজ্ঞাসা করেন, বা আপনি কম্পিউটারটি শুরু হয় বা অন্য ধারণাগুলি সিগন্যাল করার জন্য একটি মানবকে একটি অবৈধ পদক্ষেপে প্রবেশ করার অনুমতি দেন)।

চলনগুলিকে বৈধকরণের প্রয়োজন হয় না, আপনি মোটামুটি খেলোয়াড় মানব প্রতিপক্ষকে ধরে নিতে পারেন।

মূলত, আপনার কাছে এমন একটি প্রোগ্রাম রয়েছে যা বোর্ডের একটি রাজ্যের সাথে সম্পর্কিত। রাজ্যটি কোনও স্বীকৃত উপায়ে মুদ্রিত, তবে কমপক্ষে নিম্নলিখিত স্তরের বিশদ বিবরণ আশা করা হচ্ছে:

X..
00X
x..

মানব প্লেয়ার তার পদক্ষেপে প্রবেশের পরে, আপনার প্রোগ্রামটিকে একই ভাষাতে উত্স ফাইল হিসাবে (পরবর্তীকালে স্ট্যান্ডার্ড আউটপুট বা কোনও ফাইলে) তৈরি করতে হবে এবং সমাপ্ত হতে হবে। আপনাকে সেই উত্স ফাইলের বাইরে অন্য কোথাও তথ্য সংরক্ষণ করার অনুমতি নেই। (উত্পন্ন প্রোগ্রামটি তৈরি এবং পরিচালনা করা আপনার প্রোগ্রামটির পক্ষে প্রয়োজন হয় না, এটি ব্যবহারকারীর দ্বারা করা সম্ভব - তবে এটি নিষিদ্ধ নয়)। যখন উত্পন্ন প্রোগ্রামটি নির্মিত হয় এবং চালিত হয়, তখন এটি একইভাবে আচরণ করবে, রাজ্যটি প্রদর্শন করবে, ব্যবহারকারীর ইনপুটের জন্য অপেক্ষা করবে ইত্যাদি etc.

গেমের শেষে, আপনাকে ফলাফলটি মুদ্রণ করতে হবে (আপনি জয়ী হয়েছিলেন বা এটি একটি টাই) যে কোনও নির্বিঘ্নে সনাক্তযোগ্য উপায়ে।

নিখুঁত নাটকটির দ্বারা আমি বোঝাতে চাইছি প্রোগ্রামটি অবশ্যই হারাবে না এবং যদি জয়ের চাপ দেওয়ার কোনও সম্ভাবনা থাকে তবে তা জিততে হবে।

সংক্ষিপ্ততম কোড জয় , বিজয়ী প্রথম বৈধ প্রবেশের কমপক্ষে 10 দিন পরে নির্বাচিত হয়।

আপনার প্রোগ্রামটি যদি এর পরবর্তী পুনরাবৃত্তির বিল্ডিং এবং প্রবর্তন পরিচালনা করতে পারে তবে আপনি স্কোরটিতে 10% হ্রাস পাবেন। (আমি জানি, এটি সম্ভবত এটির পক্ষে মূল্যহীন নয়) অবশ্যই, পরবর্তী পুনরাবৃত্তিটি ব্যবহারকারীর কাছ থেকে পদক্ষেপ গ্রহণ করার পরে প্রোগ্রামটি নিজেই সমাপ্ত করা উচিত।

আপনি যদি কিছু অদ্ভুত অস্বাভাবিক কৌশল ব্যবহার করেন তবে দয়া করে আপনার কোড সহ একটি সংক্ষিপ্ত বিবরণ পোস্ট করুন।


2
দুর্দান্ত চ্যালেঞ্জ, তবে আমি মনে করি আমি অপ্ট আউট করতে যাচ্ছি।
জন ডিভোরাক

"প্রতিটি পদক্ষেপ একটি আলাদা প্রোগ্রাম হতে হবে"। আপনার অর্থ কি, "প্রতিটি গেমটি মূল প্রোগ্রামটির একটি নতুন, স্বতন্ত্র উদাহরণ দ্বারা শুরু করা এবং পরিচালনা করতে হবে"?
ডেভিডসি

1
@ ডেভিডকারারহর: না। প্রতিটি পদক্ষেপ, প্রতিটি খেলা নয়। বোর্ড উদাহরণের নীচে বর্ণনাটি পরীক্ষা করুন। কম্পিউটারটি যখন কোনও পদক্ষেপ নিতে হয় (সুতরাং বোর্ডের অবস্থা পরিবর্তিত হয়), আপনার প্রোগ্রামটি একটি উত্স ফাইল তৈরি করতে হবে, যা তৈরি এবং চালানোর পরে, পরবর্তী অবস্থানে পরিণত হবে। আসল প্রোগ্রামটি তখন বের হয়। নতুন উত্পন্ন প্রোগ্রামটি, যখন একটি পদক্ষেপ নেওয়ার সময়, একইরকম আচরণ করবে: এটি একটি উত্স ফাইল তৈরি করে, যা তৈরি এবং চালানোর পরে, পরবর্তী অবস্থানে পরিণত হবে, ইত্যাদি। উত্পন্ন উত্স ফাইল ব্যতীত কোনও তথ্য স্টোরেজ অনুমোদিত নয়, এটি পুনরাবৃত্তির মধ্যে পার্থক্য সহ একটি কুইনের মতো।
বনাম

উত্তর:


13

পার্ল, 933 টি অক্ষর

$m=<<'';$_='         ';
sub h{/^(?:...)*(\d)\1\1/|/^.?.?(\d)..\1..\1/|/(\d)...\1...\1/|/^..(\d).\1.\1/&&$1}
sub r{substr($_,$p-1,1)=pop}sub p{my$w=pop;my@b=(0,h==$w||h&&-1);if(!$b[1]&&/ /){$b[1]=-9;
while(/ /g){local($_,$p)=($_,pos);r$w;$r=-(p($w^1))[1];@b=($p,$r)if$r>$b[1]}}@b}
if(($w=h||!/ /)||!@ARGV){$w--&&print+(nobody,X,O)[$w]," wins\n";s/(...)/$1\n/g;
tr/ 23/.XO/;print}else{$w=3;$w^=1for/\d/g;($p=pop)?r($w^1)&&!h&&(($p)=p$w)&&r$w:s/ /2/;
print"\$m=<<'';\$_='$_';\n$m\n$m"}

sub h{/^(?:...)*(\d)\1\1/|/^.?.?(\d)..\1..\1/|/(\d)...\1...\1/|/^..(\d).\1.\1/&&$1}
sub r{substr($_,$p-1,1)=pop}sub p{my$w=pop;my@b=(0,h==$w||h&&-1);if(!$b[1]&&/ /){$b[1]=-9;
while(/ /g){local($_,$p)=($_,pos);r$w;$r=-(p($w^1))[1];@b=($p,$r)if$r>$b[1]}}@b}
if(($w=h||!/ /)||!@ARGV){$w--&&print+(nobody,X,O)[$w]," wins\n";s/(...)/$1\n/g;
tr/ 23/.XO/;print}else{$w=3;$w^=1for/\d/g;($p=pop)?r($w^1)&&!h&&(($p)=p$w)&&r$w:s/ /2/;
print"\$m=<<'';\$_='$_';\n$m\n$m"}

দয়া করে নোট করুন যে স্ক্রিপ্টের মাঝখানে ফাঁকা রেখাটি আসলে সেখানে থাকা দরকার। (সুস্পষ্টতা ব্যতীত দীর্ঘ রেখার শেষে লাইন বিরতি প্রয়োজন হয় না এবং চরিত্রের গণনায় অন্তর্ভুক্ত হয় না))

ব্যবহার: যখন প্রোগ্রামটি তর্ক ছাড়াই চালিত হয়, এটি বর্তমান গেমের অবস্থাটি প্রদর্শন করে। শুরুতে বোর্ড খালি থাকায় আউটপুটটি হবে:

...
...
...

সেই স্কোয়ারটিকে আপনার পদক্ষেপ হিসাবে দাবি করতে 1 এবং 9 এর মধ্যে একটি যুক্তি দিয়ে প্রোগ্রামটি চালান। প্রোগ্রামটি নিজস্ব পদক্ষেপ নেবে এবং তারপরে নতুন রাষ্ট্রের সাথে একটি প্রতিস্থাপন স্ক্রিপ্ট আউটপুট দেবে। সুতরাং, উদাহরণস্বরূপ:

$ perl ./qttt 5 > ./qttt-2
$ perl ./qttt-2
O..
.X.
...

কেবলমাত্র প্রথম টার্নে, আপনি 0কম্পিউটারটিকে প্রথম পদক্ষেপ নেওয়া উচিত তা বোঝাতে একটি পদক্ষেপ দিতে পারেন । মনে রাখবেন যে প্রথম প্লেয়ার সর্বদা থাকবে X

গেমটি শেষ হয়ে গেলে, ডিসপ্লে আউটপুটটিতে সেই প্রভাবের জন্য একটি নোট অন্তর্ভুক্ত করা হয়:

$ perl ./qttt-4 6 > ./qttt-5
$ perl ./qttt-5
O wins
OXX
OOX
X.O

প্রোগ্রামটি গেম ট্রিটির একটি স্ট্যান্ডার্ড মিনিম্যাক্স অনুসন্ধান করে কাজ করে। (টিক-ট্যাক-টো একটি ছোট যথেষ্ট গেম যা প্রতিটি রানে একটি পূর্ণ গেম ট্রি তৈরি করা যায়)) কম্পিউটার ব্যতীত প্রথম স্থানান্তরিত হলে এর ব্যতিক্রম হয় - এই ক্ষেত্রে উপরের বাম কোণে প্রাথমিক স্থানান্তর কঠোর- কোডেড।

নোট করুন যে এই প্রোগ্রামটি সঠিক কুইনের ফ্যাশনে কাজ করে - কোনও আউটপুট উত্পাদন করার জন্য স্ক্রিপ্টটি তার নিজস্ব উত্স ফাইলটিতে অ্যাক্সেস করে না।


1
ঐটা সুন্দর! আমি বুঝতে পারি না যে আমি দীর্ঘকাল ধরে এখানে একটি বিশাল-ডককে দেখছি, তারপরে একটি ডাবল-টিক নিয়েছিল।
জেসি স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.