দাবা সমাপ্তি: হোয়াইট টু মেট ইন ওয়ান


19

দাবা খেলার গেমের বর্তমান অবস্থার প্রতিনিধিত্ব করে এমন একটি 8x8 গ্রিড দেওয়া, আপনার প্রোগ্রামটির কাজ হ'ল সাদা রঙের জন্য পরবর্তী পদক্ষেপ সন্ধান করা যা চেকমেটে ফলাফল দেয় (উত্তরটি সর্বদা এক চলাফেরায় সঙ্গী হবে)।

ইনপুট

ইনপুট STDIN- এ থাকবে 8 টির 8 টি অক্ষরের প্রতিটি lines প্রতিটি চরিত্রের অর্থ নিম্নরূপ:

K/k - king
Q/q - queen
B/b - bishop
N/n - knight
R/r - rook
P/p - pawn
- - empty square

বড় হাতের অক্ষরগুলি সাদা টুকরোকে উপস্থাপন করে এবং লোয়ার কেস কালোকে উপস্থাপন করে। বোর্ডটি ওরিয়েন্টেড হবে যাতে নীচে থেকে সাদা খেলছে এবং উপর থেকে কালো নীচে খেলছে।

আউটপুট

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

নমুনা ইনপুট

উদাহরণ 1

ইনপুট:

------R-
--p-kp-p
-----n--
--PPK---
p----P-r
B-------
--------
--------

আউটপুট:

c6

উদাহরণ 2

ইনপুট:

--b-r--r
ppq-kp-p
-np-pn-B
--------
---N----
--P----P
PP---PP-
R--QRBK-

আউটপুট:

Nf5

উদাহরণ 3

ইনপুট:

---r-nr-
-pqb-p-k
pn--p-p-
R-------
--------
-P-B-N-P
-BP--PP-
---QR-K-

আউটপুট:

Rh5

আপনি ধরে নিতে পারেন যে সমাধানটিতে কাস্টিং বা এন-পাসেন্ট জড়িত হবে না।

এটি কোড-গল্ফ - সংক্ষিপ্ততম সমাধানের জয়।

( Mateinone.com থেকে নেওয়া উদাহরণ - ধাঁধা 81, 82 এবং 83)


না। আমি মনে করি এই প্রশ্নের উদ্দেশ্যগুলির জন্য আপনি ধরে নিতে পারেন যে উত্তরটি কাস্টিং বা এন-পাসেন্টকে জড়িত করবে না। আমি প্রশ্ন আপডেট করব।
গ্যারেথ

কীভাবে আমরা একাধিক সাথ-ইন-এক সঙ্গে অবস্থানগুলি পরিচালনা করব?
রব

@ রব কেবল একটি সমাধানের প্রয়োজন, সুতরাং আপনি যে কোনও সমাধানটি প্রথমে খুঁজে পান output
গ্যারেথ

এটিকে ধরে নেওয়া কী নিরাপদ যে সমাধানটি প্রচারের সাথে জড়িত নয়?
পিটার টেলর

@ পিটার হ্যাঁ, আমি সমস্যাটিকে অতিরিক্ত জটিল করতে চাই না।
গ্যারেথ

উত্তর:


7

রুবি, 589 512 510 499 493 টি অক্ষর

R=0..7
a=->b{o=[];R.map{|r|R.map{|c|v=Hash[?K,[6,7,8,11,13,16,17,18],?R,s=[157,161,163,167],?B,t=[156,158,166,168],?Q,s+t,?N,[1,3,5,9,15,19,21,23],?P,[32,181,183]][z=b[r][c]];v&&v.map{|s|k=2!=l=s/25+1;u=r;v=c;l.times{u+=s/5%5-2;v+=s%5-2;R===u&&R===v||break;t=b[u][v];j=t<?.&&l<8;(j||t=~/[a-z]/&&k)&&o<<=(h=b.map &:swapcase;h[u][v]=h[r][c];h[r][c]=?-;[z+"%c%d"%[97+v,8-u],h.reverse]);j&&(k||r==6)||break}}}};o}
a[$<.map{|l|l}].map{|m,b|a[b].any?{|f,x|a[x].all?{|g,y|y*""=~/K/}}||$><<m[/[^P]+/]}

স্টিডিনের মাধ্যমে ইনপুট দেওয়া হয়, যেমন:

> ruby mateinone.rb
--------
--------
--------
-k------
b-------
-N-P----
--------
-----K-Q
^Z
Qb7

আউটপুট কেবলমাত্র একটি পদক্ষেপ নয় যা একটি সাথিকে একটিতে বাধ্য করে তবে তা করে এমন প্রতিটি পদক্ষেপ।

সম্পাদনা 1: ফাংশনটি eএকবার ব্যবহার করা হয়েছিল তাই আমি এটিকে linedুকেছি। দ্বিতীয়ত, এখন এনকোডিংটি 10 ​​এর পরিবর্তে 5 নম্বরের উপর ভিত্তি করে তৈরি করা হয়েছে এবং বোর্ডের ক্লোনিংয়ের পুনরুদ্ধার করা বেশ কয়েকটি অক্ষর সংরক্ষণ করেছে।

সম্পাদনা 2: তবুও আমি যতটা উন্নতি চেয়েছিলাম তেমন হয়নি। থেকে হ্যাশ পরিবর্তন {a=>b,c=>d}করতে Hash[a,b,c,d]। এটির জন্য 4 টি অক্ষর ব্যয় হয় তবে প্রতি-মান-জুটির জন্য একটি সংরক্ষণ করে।

3 সম্পাদনা করুন: কেবল ছোটখাট হ্রাস: এম (4 অক্ষর) ইনলাইন করা, t==?--> t<?.(2), বন্ধকে বীজগণিত স্বরলিপিতে শেষে (2) সরানো, প্রতিস্থাপন পুটস (3)। প্রোগ্রামটি এখন 500 টিরও কম অক্ষরের চেয়ে কম।

সম্পাদনা 4: এটি আকর্ষণীয় যে এই জাতীয় প্রোগ্রামে এখনও কেউ কতটা খুঁজে পেতে পারে। লুপের বাইরে একটি আক্রমণকারী সরিয়ে নিয়েছে এবং অন্য একটি সদৃশ গণনা খুঁজে পেয়েছে।


"একজন নয়, তবে কোনও" দ্বারা আপনি কী বোঝাতে চান "অগত্যা এক নয়, তবে প্রত্যেকটি"?
ম্যাথু

@ ম্যাথহে আপনি ঠিক বলেছেন আমি "প্রতি" বোঝানো হয়েছিল।
হাওয়ার্ড

আপনি [*$<]পরিবর্তে ব্যবহার করতে পারেন $<.map{|l|l}
লোজ্যাকার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.