কিং + রুক বনাম রাজা


16

এটি আরেকটি ভাল খেলে যাওয়া দাবা খেলার সমাপ্তি। আপনি হোয়াইট প্লেয়ার, এবং আপনার কাছে এখনও একটি দম্পতি এবং আপনার রাজা রয়েছে। আপনার প্রতিপক্ষ কেবল তাঁর রাজা বাকি আছে has

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

এটি বেশ সুস্পষ্ট বলে মনে হচ্ছে, তবে আমি এটি স্পষ্টভাবে জানিয়ে দেব: আপনাকে গেমটি জিততে হবে (সীমাবদ্ধ স্থানে)। এই অবস্থান থেকে জয় পাওয়া সর্বদা সম্ভব possible এই বইটি হারাবেন না। স্থির করবেন না।

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

স্কোর

আপনার স্কোরটি আপনার কোড + বোনাসের বাইটে দৈর্ঘ্য হবে। যে কোনও ভাষা অনুমোদিত, সর্বনিম্ন স্কোর জেতে।

বোনাস

-50 যদি আপনার প্রোগ্রামটি কোনও মানুষের সংজ্ঞায়িত শুরুর অবস্থান এবং এলোমেলো উভয়কেই অনুমতি দেয়। মানুষ স্টিডিন, ফাইল, জিইউআই এর মাধ্যমে এটি প্রবেশ করতে পারে ...

-100 যদি আপনার প্রোগ্রামটি একজন মানব এবং একটি এলোমেলো খেলোয়াড় উভয়কেই কালো রাজা সরাতে দেয়

আপনি যদি কোনও বাহ্যিক দাবা সলভার বা অন্তর্নির্মিত দাবা লাইব্রেরির উপর নির্ভর করেন তবে +12345

শুভকামনা!

হালনাগাদ!

অতিরিক্ত নিয়ম: চেকমেট অবধি ম্যাচটি খেলতে হবে। কালো পদত্যাগ করে না, দাবাবোর্ডের বাইরে লাফ দেয় না এবং এলিয়েনদের দ্বারা অপহরণ করে না।

ইঙ্গিত

আপনি সম্ভবত থেকে সাহায্য পেতে পারেন এই প্রশ্নের উপর chess.se


2
50 টি মুভের নিয়মটি কি প্রযোজ্য?
কমিন্টার্ন

1
@ ভিক্টর আমার বেশ কয়েকবার গেছে, তবে এটি এখনও কার্যকর হয়নি। নিষ্ঠুর শক্তি স্পষ্টতই খুব ধীর, আলফা-বিটাও খুব বেশি কারণ অবস্থানের রেটিংয়ের আড়াআড়িটি বেশ সমতল; এবং একটি লুপ আটকে ঝোঁক। প্রতিবিম্ব বিশ্লেষণ কাজ করবে তবে সামনের দিকে খুব ধীরে ধীরে। আমার পরবর্তী প্রচেষ্টাটি কেআরকে-র জন্য ব্রাটকোর অ্যালগরিদম ব্যবহার করবে, যা আমি এড়িয়ে গেছি কারণ এটি বিশেষ ক্ষেত্রে একটি গাদা, গল্ফের জন্য দুর্দান্ত নয়।
বাজরাঘ

1
@ ভিক্টর আমি এটিও দেখছি। এটি স্পষ্টভাবে আকর্ষণীয় কারণ এটি নির্ধারণ করা সহজ এবং করণীয় সহজ। পরিবর্তে প্রোগ্রামটি সংক্ষিপ্ত হবে না, তাই কোড-গল্ফ ট্যাগটিকে দ্বিগুণ শক্ত মনে হয়েছে। যদি আমার প্রোগ্রামটি কাজ করে তবে আপনি তা শীঘ্রই দেখতে পাবেন।
স্তরের নদী সেন্ট

1
@ উইক্টর সমস্যাটি সর্বোত্তম হওয়ার চেষ্টা করার বিষয়ে নয়, গেমের ইতিহাস বিবেচনা না করে 'সেরা' পদক্ষেপ গ্রহণের কোনও প্রচেষ্টা লুপের দিকে পরিচালিত করে। প্রতিটি অবস্থান থেকে খেলা সমাপ্তি পরীক্ষা করা দরকার। ব্রাটকো + বৈকল্পিক অনুকূল নয় তবে সম্ভাব্যরূপে সমাপ্ত হতে পারে। এইমাত্র (অর্থাত বিল্ড যুদ্ধের টেবিল) পশ্চাত্গামী বিশ্লেষণ চেষ্টা, সৌন্দর্য প্রতিশ্রুতি এবং আসলে হয় অনুকূল, যা চমৎকার। এছাড়াও যুক্তিসঙ্গত সংক্ষিপ্ত পরিণত।
বাজরাঘ

2
যে কেউ অনুপ্রেরণা দরকার (বা শুধু জানতে আগ্রহী হয়), তাহলে আপনি একটি 1433 অক্ষর জানতে পারেন সম্পূর্ণ দাবা ইঞ্জিনhome.hccnet.nl/hgmuller/umax1_6.c
Comintern

উত্তর:


11

হাস্কেল 1463-100 = 1363

কেবলমাত্র একটি উত্তর পেয়েছি This এটি সমাধানটি প্রত্যাবর্তনের পথটি আবিষ্কার করে, চেকমেট থেকে আমরা যে অবস্থানে চলেছি সেখানে ফিরে কাজ করে It এটি দাবাগ্রোগের উপর বিপরীতমুখী বিশ্লেষণের বিবরণ থেকে পৃথক - প্রাথমিক সেটটি শুরু না করে এবং পিছনের দিকে চালানো দিয়ে এটি প্রসারিত করার পরিবর্তে কোনও স্কোয়ার সরে না যাওয়া পর্যন্ত দেখা যায়নি, এটি সমস্ত অব্যবহৃত স্কোয়ার দিয়ে শুরু হয় এবং এগিয়ে যাওয়ার চেষ্টা করে সেটটিকে হ্রাস করে। এটি traditionalতিহ্যবাহী পদ্ধতির চেয়ে কম সময় সাশ্রয়ী হতে চলেছে, তবে আমি চেষ্টা করার পরে স্মৃতি ব্যবহারটি আমার জন্য বিস্ফোরিত হয়েছিল।

সঙ্গে কম্পাইল ghc -O2যুদ্ধের টেবিল গণনা জন্য গ্রহণযোগ্য পারফরম্যান্সের জন্য; খেলা প্রথম পদক্ষেপের পরে তাত্ক্ষণিক হয়। আর্গুমেন্ট হিসাবে সাদা রাজা, রোক, কালো কিং স্কোয়ার সরবরাহ করুন। চলাফেরার জন্য, এটি কেবল একটি বর্গক্ষেত্র চায় এবং আপনি রিটার্ন চাপলে আপনার জন্য একটি বেছে নেবে। উদাহরণ সেশন:

$ time  printf "\n\n\n\n\n\n\n\n"|./rook8 e1 a1 e8
("e1","a7","e8")[d8]?
("d2","a7","d8")[c8]?
("d2","h7","c8")[b8]?
("c3","h7","b8")[a8]?
("b4","h7","a8")[b8]?
("c5","h7","b8")[a8]?
("b6","h7","a8")[b8]?
("b6","h8","b8") mate

real    0m8.885s
user    0m8.817s
sys 0m0.067s

কোড:

import System.Environment
import qualified Data.Set as S
sp=S.partition
sf=S.fromList
fl=['a'..'h']
rk=[0..7]
lf=filter
m=map
ln=notElem
lh=head
pl=putStrLn
pa[a,b]=(lh[i|(i,x)<-zip[0..]fl,a==x],read[b]-1)
pr(r,c)=fl!!r:show(c+1)
t f(w,r,b)=(f w,f r,f b)
km(a,b)=[(c,d)|c<-[a-1..a+1],d<-[b-1..b+1],0<=c,c<=7,0<=d,d<=7]
vd (w,r,b)=b`ln`km w&&w/=r&&b/=w&&b/=r
vw p@(_,r,b)=vd p&&r`ln`km b&&(ck p||[]/=bm p)
vb p=vd p&&(not.ck)p
rm (w@(c,d),(j,k),b@(u,x))=[(w,(j,z),b)|z<-rk,z/=k,j/=c||(k<d&&z<d)||(d<k&&d<z),j/=u||(k<x&&z<x)||(x<k&&x<z)]
kw(w,r,b)=m(\q->(q,r,b))$km w
xb(w,r,_)b=(w,r,b)
wm p=lf(\q->q/=p&&vw q)$rm p++(m(t f)$rm$t f p)++kw p
bm p@(_,_,b)=lf(\q->q/=p&&vb q)$m(xb p)$km b
c1((c,d),(j,k),(u,x))=j==u&&(c/=j||(k<x&&d<k)||(k>x&&d>k))
ck p=c1 p||(c1$t f p)
mt p=ck p&&[]==bm p
h(x,y)=(7-x,y)
v=f.h.f
f(x,y)=(y,x)
n p@((c,d),_,_)|c>3=n$t h p|d>3=n$t v p|c>d=n$t f p|True=p
ap=[((c,d),(j,k),(u,x))|c<-[0..3],d<-[c..3],j<-rk,k<-rk,u<-rk,x<-rk]
fr s p=S.member(n p)s
eg p=ef(sp mt$sf$lf vw ap)(sf$lf vb ap)
ps w mv b0=sp(\r->any(fr b0)$mv r)w
ef(b0,b1)w=let(w1,w2)=ps w wm b0 in(w1,b0):(if S.null w2 then[]else ef(f$ps b1 bm w2)w2)
lu((w1,b0):xs)p=if fr w1 p then lh$lf(fr b0)$wm p else lu xs p
th(_,_,b)=b
cd tb q=do{let{p=lu tb q};putStr$show$t pr p;if mt p then do{pl" mate";return()}else do{let{b1=pr$th$lh$bm p};pl("["++b1++"]?");mv<-getLine;cd tb$xb p (pa$if""==mv then b1 else mv)}}
main=do{p1<-getArgs;let{p2=m pa p1;p=(p2!!0,p2!!1,p2!!2)};cd(eg p)p}

সম্পাদিত: এন্ডগেম টেবিলটি মনে রাখতে এবং যুক্তিগুলি ব্যবহারের জন্য স্থির কোড, বারবার পরীক্ষার জন্য এত কম বেদনাদায়ক।


2
পার্শ্ব প্রতিক্রিয়া সহ haskell কোড? কীভাবে তুমি পারো! : পি
আইনাসিও

অবশেষে মারাত্মক!
ইজাবেরের

সেই ধাঁধাটি খারাপ ছিল @ আইজাবের!
বাজরঘ

নিস! আমি যে প্রচেষ্টাটিতে কাজ করেছিলাম তার চেয়ে অনেক বেশি ভাল। আমি 50 টি সহচর সঙ্গীকে নিশ্চিত করার জন্য যথেষ্ট মাত্র এল আজেদ্রেস্তিষ্টাকে উন্নত করার চেষ্টা করছিলাম, তবে যতদূর পর্যন্ত একটি অ্যালগরিদম যায় এটি সত্যিই খারাপ।
কমিন্টার্ন

বেশিরভাগ স্তন্যপায়ী পারফরম্যান্স আমার কাছ থেকে আসে এন্ডগেম টেবিলটি স্মরণ না করে ( y)। এটি ইতিমধ্যে স্পষ্ট যে দ্বিতীয় পদক্ষেপটি দ্রুত নয় যখন আমরা ইতিমধ্যে পুরো শেষটি বিবেচনা করেছি। আমি এই সন্ধ্যায় পাব থেকে বেরিয়ে আছি তবে কাল যদি আমি সুযোগ পাই তবে আমি এটিকে কম ভয়ঙ্কর করব।
বাজরঘ

7

সি, বর্তমানে 2552 ননকমেন্ট অবিস্মরণীয় স্থানের অক্ষর

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

এখানে কোনও গেম ট্রি নেই, কেবল হার্ডকোডযুক্ত অ্যালগরিদম, তাই এটি তাত্ক্ষণিকভাবে সরানো হয়।

প্রারম্ভিক অবস্থানগুলি উপরের ডানদিক থেকে সারি (1-8) কলাম (1-8) হিসাবে সন্নিবেশ করা হয় এবং প্রোগ্রামটি একই স্কিমে কাজ করে। সুতরাং আপনি যদি আপনার স্ক্রিনটি 90 ডিগ্রি অ্যান্টিক্লোকের দিকে ঘুরিয়ে দেন তবে এটি স্ট্যান্ডার্ড করেসপন্ডেন্স দাবা সংখ্যাযুক্ত বর্গাকার স্বরলিপি অনুসরণ করবে। কালো রাজা ইতিমধ্যে তদন্ত করা অবস্থানগুলি অবৈধ হিসাবে প্রত্যাখ্যান করা হয়।

ব্ল্যাক মুভগুলি 0 থেকে 7 পর্যন্ত একটি নম্বর হিসাবে প্রবেশ করা হয়, 0 টি উত্তর এবং 1 টি উত্তর-পূর্ব দিকে এবং এইভাবে একটি ঘড়ির কাঁটা দিক দিয়ে চলে।

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

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

#include "stdafx.h"
#include "stdlib.h"
#include "string.h"

int b[2], w[2], r[2], n[2],s,t,i,nomate;
int v[2][8] = { {-1,-1,0,1,1,1,0,-1}, {0,1,1,1,0,-1,-1,-1} };
int u[5] = { 0, 1, -1, 2, -2 };
char empty[82] = "        \n--------\n--------\n--------\n--------\n--------\n--------\n--------\n--------\n";
char board[82];

int distance(int p[2], int q[2]){
    return __max(abs(p[0]-q[0]),abs(p[1]-q[1]));
}

int sign(int n){
    return (n>0)-(0>n); 
}

// from parameters p for white king and q for rook, determines if rook is/will be safe
int rsafe(int p[2],int q[2]){
    return  distance(p, q)<2 | distance(q,b)>1;
}

void umove(){
    t=0;
    while (t != 100){
        printf("Enter number 0 to 7 \n");
        scanf_s("%d", &t); t %= 8;
        n[0] = b[0] + v[0][t];
        n[1] = b[1] + v[1][t];
        if (distance(w, n) < 2 | (n[0] == r[0] & (n[1]-w[1])*(r[1]-w[1])>0) 
            | ((n[1] == r[1]) & (n[0]-w[0])*(r[0]-w[0])>0) | n[0] % 9 == 0 | n[1] % 9 == 0)
            printf("illegal move");
        else{ b[0] = n[0]; b[1] = n[1]; t = 100; };
    }
}

void imove(){
    t=0;
    // mate if possible
    if (distance(b, w) == 2 & b[0] == w[0] & (b[1] == 1 | b[1] == 8) & r[0]!=w[0]){
        n[0] = r[0]; n[1] = b[1];
        if (rsafe(w, n)){
            r[1] = n[1]; 
            printf("R to %d %d mate!\n", r[0], r[1]);
            nomate=0;
            return;
        }
    }

    //avoid stalemate
    if ((b[0] == 1 | b[0] == 8) & (b[1] == 1 | b[1] == 8) & abs(b[0] - r[0]) < 2 & abs(b[0]-w[0])<2){
        r[0] = b[0]==1? 3:6;
        printf("R to %d %d \n", r[0], r[1]);
        return;
    }

    // dont let the rook be captured. 
    if(!rsafe(w,r)) 
    {
        if (w[0] == r[0]) r[1] = w[1] + sign(r[1]-w[1]);
        else r[1] = r[1]>3? 2:7;
        printf("R to %d %d \n", r[0], r[1]);
        return;
    }

    // if there's a gap between the kings and the rook, move rook towards them. we only want to do this when kings on same side of rook, and not if the black king is already on last row.
    if (abs(w[0]-r[0])>1 & abs(b[0] - r[0]) > 1 & (b[0]-r[0])*(w[0]-r[0])>0 & b[0]!=1 & b[0]!=8){
        n[0] = r[0] + sign(b[0] - r[0]); n[1] = r[1];
        if (rsafe(w, n)) r[0] = n[0]; 
        else r[1] = r[1]>3? 2:7;
        printf("R to %d %d \n", r[0], r[1]);
        return;

    }
    // if kings are far apart, or if they not on the same row (except if b 1 row from r and w 2 rows from r), move king
    if ((w[0]-r[0])!=2*(b[0]-r[0]) | abs(b[0]-w[0])>1 | distance(w,b)>2){
        for (i = 0; i<8; i++) if (v[0][i] == sign(b[0] - w[0]) & v[1][i] == sign(b[1] - w[1])) t = i;
        s = 1 - 2 * (w[0]>3 ^ w[1] > 3);
        for (i = 0; i < 5; i++){
            n[0] = w[0] + v[0][(t + s*u[i] + 8) % 8];
            n[1] = w[1] + v[1][(t + s*u[i] + 8) % 8] *(1-2*(abs(w[0]-b[0])==2));
            if (distance (n,b)>1 & distance(n, r)>0 & rsafe(n,r) & n[0]%9!=0 & n[1]%9!=0
                & !(n[0]==r[0] & (w[0]-r[0])*(b[0]-r[0])>0)) i = 5;
        }
        if (i == 6) {
            w[0] = n[0]; w[1] = n[1]; printf("K to %d %d \n", w[0], w[1]); return;
        }
    }

    //if nothing else to do, perform a waiting move with the rook. Black is forced to move his king.
    t = r[1]>3? -1:1;
    for (i = 1; i < 5; i++){
        n[0] = r[0]; n[1] = r[1] + t*i;
        if (rsafe(w, n)){ r[1] = n[1]; i=5; }
    }
    printf("R to %d %d \n", r[0], r[1]);
}

int _tmain(){

    do{ 
        t=0;
        printf("enter the row and col of the black king ");
        scanf_s("%d%d", &b[0], &b[1]);
        printf("enter the row and col of the white king ");
        scanf_s("%d%d", &w[0], &w[1]);
        printf("enter the row and col of the rook");
        scanf_s("%d%d", &r[0], &r[1]);
        for (i = 0; i < 2; i++) if (b[i]<1 | b[i]>8 | w[i]<1 | w[i]>8 | w[i]<1 | w[i]>8)t=1;
        if (distance(b,w)<2)t+=2;
        if ((b[0] == r[0] & (b[1]-w[1])*(r[1]-w[1])>0) | ((b[1] == r[1]) & (b[0]-w[0])*(r[0]-w[0])>0)) t+=4;
        printf("error code (0 if OK) %d \n",t);
    } while(t);

    nomate=1;
    while (nomate){
        imove();
        strncpy_s(board, empty, 82);
        board[b[0] * 9 + b[1] - 1] = 'B'; board[w[0] * 9 + w[1] - 1] = 'W'; board[r[0] * 9 + r[1] - 1] = 'R'; printf("%s", board);      
        if(nomate)umove();
    }
    getchar(); getchar();

}

এখানে একটি সাধারণ সমাপ্তি (সঙ্গী কখনও কখনও বোর্ডের ডান বা বাম প্রান্তে যে কোনও জায়গায় আসতে পারে))

এখানে চিত্র বর্ণনা লিখুন


6

বাশ, 18 (বা -32?)

ঠিক আছে, এটি একটি রসিক উত্তর। যেহেতু কৃষ্ণ একটি ভাল দাবা খেলোয়াড়, এবং ব্ল্যাক জানেন যে হোয়াইটও একজন ভাল দাবা খেলোয়াড়, তাই তিনি সিদ্ধান্ত নিয়েছিলেন যে একমাত্র বুদ্ধিমানের কাজটি হ'ল:

echo Black resigns

এটি সাদা জয়ের ফলে, যা নির্দিষ্টকরণের সাথে মিলিত হয়।

প্রযুক্তিগতভাবে আপনি বর্তমান পজিশনে আর্গুমেন্ট হিসাবেও প্রবেশ করতে পারেন, প্রোগ্রামটি কেবল তাদের উপেক্ষা করে, সুতরাং যুক্তিযুক্তভাবে এটি -50 বোনাসের জন্য যোগ্যতা অর্জন করতে পারে।


মজার, তবে আমি নিয়ম আপডেট করেছি। চেকমেট হওয়া পর্যন্ত খেলা এখন বাধ্যতামূলক।
ইজাবের

1
মূল প্রশ্নটি বিটিডব্লিউ স্পষ্টভাবে জানিয়েছে যে আপনার প্রোগ্রামটি কোনও কালো বা কালো রঙের খেলোয়াড়কে অনুমতি দিতে পারে এবং আপনার এলোমেলো নয়।
ইজাবেরের

2
মানক স্বরলিপি ব্যবহার করে, আপনি আউটপুট করতে পারেন 1-0যা কিছুটা খাটো।
দানিরো

1
সর্বোপরি হারানোর সময় @Comptern ভাল বাস্তবের অর্থ দীর্ঘকাল স্থায়ী হয়।
পাইরুলেজ

উইকিপিডিয়া অনুসারে @ পাইরুলেজ বলেছেন , "যে কোনও প্লেয়ার যে কোনও সময় পদত্যাগ করতে পারে এবং তাদের প্রতিপক্ষ খেলাটি জিততে পারে।" এছাড়াও, এটি কেবল একটি রসিক উত্তর, এটিকে এত গুরুত্বের সাথে নেবেন না।
ব্যবহারকারী 12205
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.