शतरंज - सभी कानूनी चालों का पता लगाएं (कास्टलिंग और एन पास को छोड़कर)


19

सबसे छोटा कोड लिखें जो किसी दिए गए FEN स्ट्रिंग से वर्तमान खिलाड़ी की सभी संभावित (कानूनी) चालों की गणना करता है। FEN स्ट्रिंग क्या है? (विकिपीडिया)

  • सबसे छोटा कोड जीतता है, भाषा कोई मायने नहीं रखती।
  • आउटपुट मूव्स को पास करने वाले , कासलिंग और प्यादा प्रमोशन को छोड़कर आंदोलन के शतरंज के नियमों का पालन ​​करना चाहिए
  • चेक, चेकमेट और गतिरोध को अनदेखा करें, राजा को स्थितियों पर भी कब्जा नहीं किया जा सकता है।

आप आउटपुट को अलग ढंग से सेट कर सकते हैं आप चाहते हैं (उदाहरण के लिए: A2-A4, A2A4, a2a4, a2->a4...)

परीक्षण के मामलों:

# INPUT 1:

rnbqkbnr / pppppppp / 8/8/8/8 / PPPPPPPP / RNBQKBNR w KQkq - 0 1
# OUTPUT 1

A2-A4, A2-A3, B2-B4, B2-B3, C2-C4, C2-C3, D2-D4, D2-D3, E2-E4, E2-E3,
F2-F4, F2-F3, G2-G4, G2-G3, H2-H4, H2-H3, B1-A3, B1-C3, G1-F3, G1-H3
# INPUT 2

7k / 8/8/8/8/8 / PP6 / Q1q4K w - - 0 1

# OUTPUT 2

A1-B1, A1-C1, A2-A3, A2-A4, B2-B3, B2-B4, H1-H2, H1-G1, H1-G2

यहां यह भी बताया गया है कि टेस्ट केस इनपुट बोर्ड कैसे दिखते हैं: i.stack.imgur.com/qlbH4.png
golffzz


1
@ यूगोरेन, मैंने उस पर विचार किया, लेकिन सभी संभावित कदमों की गणना करने से संभावित रूप से कुछ शॉर्टकट समाप्त हो जाते हैं। मुझे यकीन नहीं है, हालांकि, en passant की आवश्यकता क्यों नहीं है: FEN के बिंदु का हिस्सा यह है कि इसमें en passant को संभव बनाने के लिए पर्याप्त जानकारी शामिल है।
पीटर टेलर

@PeterTaylor मैंने लिखा है कि सिर्फ काम को कम करने के लिए। मुझे आश्चर्य है कि कोई भी इस गोल्फ में दिलचस्पी क्यों नहीं रखता है :)
गोलफेज

1
@golffzz को आपका टेस्ट केस इनपुट 2 नहीं होना चाहिए 7k / 8/8/8/8/8 / PP6 / Q1q4K w - - 0 1 के बजाय 6pk / 6pp / 8/8/8 / p7 / PPPpp / Q2p2pK w - - 0 1 (जो अन्य बातों के अलावा, लगता है कि अंतिम पायदान पर पंजे हैं)?
पेंगुइन

जवाबों:


8

सी - 391 बाइट्स

कमांड लाइन तर्क के रूप में इनपुट लेता है और 0 से 63 तक लेबल वाले वर्गों के साथ प्रिंट करने के लिए प्रिंट करता है।

ठीक है, मेरे पास कुछ मिनट थे इसलिए मैंने जांच का पता लगाने से संबंधित सभी बिट्स को हटाने की कोशिश की। मुझे लगता है कि यह अब बहुत कुशल नहीं है ...

O(x,y){return((x&7)-(y&7))/5;}
B[64],*b=B,J=32,M,L,x,*X,N;
main(int c,char**V){
for(;x=*V[1]++;c=J&2**V[2])
x>56?*b++=x:x>47?b+=x-48:0;
for(;b-->B;)
for(M=-1,N=*b%J^16,*V=strchr("bGInFJOQrAHkAGHIqAGHIpGHIx",*b|J);*b&&*b&J^c&&(M=M<0?*++*V%J:-M,**V<96);)
for(x=b-B,L=N?9^*b&8:1+(x/8==1+c/6);L--*!(O(x,x+M)|O(x>>3,x+M>>3));L=!*X|~*X&J^c&&N|(!*X^M&1&&M<0^!c)?printf("%d-%d ",b-B,x),L*!*X:0)
X=B+(x+=M);}

478 बाइट चेक-डिटेक्शन संस्करण

O(x,y){return((x&7)-(y&7))/5;}
B[64],*b=B,c,I,J=32;
main(int C,char**V){
int*D,M,L,t,x,*X,N;
for(;b-B<64;C=c=J&2**V[2])
(t=*V[1]++)>56?*b++=t:t>47?b+=t-48:0;
for(D=b;D-->B;)
for(M=-1,N=*D%J^16,*V=strchr("bGInFJOQrAHkAGHIqAGHIpGHIx",*D|J);*D&&*D&J^C&&(M=M<0?*++*V%J:-M,**V<96);)
for(x=D-B,L=N?9^*D&8:1+(x/8==1+C/6);L--*!(O(x,x+M)|O(x>>3,x+M>>3));L=!*X|~*X&J^C&&N|(!*X^M&1&&M<0^!C)?c^C?I|=*X%J==11:(*X=*D,*D=I=0,main(C^J,V+1),*D=*X,I||printf("%d-%d ",D-B,x)),L*!(*X=t):0)
X=B+(x+=M),t=*X;}

यह आश्चर्यजनक है, लेकिन इस सवाल के अनुरूप नहीं है: "चेक, चेकमेट और गतिरोध को अनदेखा करें, राजा स्थितियों को भी पकड़ नहीं सकता है।"
edc65

@ edc65 मैं इन दुर्भाग्यपूर्ण निर्देशों की आपकी व्याख्या से सहमत नहीं हूँ। इसमें कहा गया है कि "आउटपुट मूव्स को एन पासेंट, कास्टलिंग और पॉन प्रमोशन को छोड़कर आंदोलन के शतरंज के नियमों का पालन करना चाहिए।" चेक में ले जाना नियमों की अनदेखी सूची में नजरअंदाज नहीं करता है। मैं तीसरी बुलेट बिंदु को एक नोट के रूप में लेता हूं जिसे आपको इन स्थितियों का पता लगाने और उन्हें आउटपुट में किसी भी तरह से प्रतिबिंबित करने की आवश्यकता नहीं है (उदाहरण के लिए एक चेक के बाद '+' लिखने का सम्मेलन)। इसके अलावा, दूसरा परीक्षण केस 2 सही था जैसा कि मूल रूप से लिखा गया था, एक निर्दिष्ट के रूप में मोहरे को बढ़ावा देता है (लेकिन चेक पर कोई अंतर्दृष्टि नहीं देता है)।
feersum

दूसरा परीक्षण मामला (इनपुट) रैंक 8 पर एक काला मोहरा था, और ओपी ( also here is how test case input boards look like) द्वारा टिप्पणी के रूप में पोस्ट की गई छवि से अलग था । छवि में स्थिति को देखते हुए, मूल परीक्षण केस आउटपुट नियमों के अनुसार सही था।
edc65

2
ओह महान, असली कल्पना टिप्पणियों में है? ऊ, क्या घटिया सवाल है।
feersum

1
स्पष्ट विजेता
edc65

2

जावा 1455

String q(String f){int[][]b=new int[8][8];int i=0,j=0,k,l,m,n,c;HashSet<String>h=new HashSet<String>();while((c=f.charAt(i))>32){if(c>48&c<57)j+=c-49;if(c==47)j--;if(c>56)b[j%8][j/8]=c;i++;j++;}boolean w=f.charAt(++i)>99;for(i=0;i<8;i++)for(j=0;j<8;j++)if((c=b[i][j])<91?w&c>0:!w){switch(c%32){case 14:for(k=0;k<8;k++){l=(k/4+1)*(k%2*2-1)+i;m=(2-k/4)*(k%4/2*2-1)+j;if(b(l,m)&&(w&b[l][m]%91<40|!w&b[l][m]<91))h.add(h(i,j,l,m));}break;case 11:for(k=0;k<8;k++){l=i+(k==4?1:k/3-1);m=j+(k==4?1:k%3-1);if(b(l,m)&&(w&b[l][m]%91<40|!w&b[l][m]<91))h.add(h(i,j,l,m));}break;case 17:for(k=0;k<8;k++){for(n=1;n<9;n++){l=i+n*(k==4?1:k/3-1);m=j+n*(k==4?1:k%3-1);if(b(l,m)){c=b[l][m];if(w&c%91<40|!w&c<91)h.add(h(i,j,l,m));if(c>0)break;}else break;}}break;case 2:for(k=0;k<4;k++){for(n=1;n<9;n++){l=i+n*(k/2*2-1);m=j+n*(k%2*2-1);if(b(l,m)){c=b[l][m];if(w&c%91<40|!w&c<91)h.add(h(i,j,l,m));if(c>0)break;}else break;}}break;case 18:for(k=0;k<4;k++){for(n=1;n<9;n++){l=i+n*(k/2*(k%2*2-1));m=j+n*((1-k/2)*(k%2*-2+1));if(b(l,m)){c=b[l][m];if(w&c%91<40|!w&c<91)h.add(h(i,j,l,m));if(c>0)break;}else break;}}break;default:m=w?-1:1;if(b[i][j+m]<1){h.add(h(i,j,i,j+m));if(b[i][j+2*m]<1&j==(w?6:1))h.add(h(i,j,i,j+2*m));}for(l=-1;i+l<8&i+l>=0&l<2;l+=2){c=b[i+l][j+m];if(c>0&(c<91?!w:w))h.add(h(i,j,i+l,j+m));}}}return h.toString();}boolean b(int l,int m){return m>=0&m<8&l>=0&l<8;}String h(int i,int j,int l,int m){return""+g(i)+(8-j)+g(l)+(8-m);}char g(int i){return(char)(i+65);}

2

अजगर 553 649 678

b,Q=raw_input(),range;R=Q(8);D="w"in b
for i in Q(9):b=b.replace(`i`,"_"*i)
if D:b=b.swapcase()
def X(h,v,c):
 h+=x;v+=y
 if c and h|v in R and"a">b[v*9+h]:print chr(65+x)+`8-y`+chr(65+h)+`8-v`;return"_"==b[v*9+h]
for y in R:
 for x in R:
  z=y*9+x;p=b[z];N=p=="n";j=[p in"qrk"]*4+[p in"qbk"]*4
  if"p"==p:j[D]=k=(1,-1)[D];X(1,k,b[z+10*k]<"_");X(-1,k,b[z+8*k]<"_")
  for i in Q(1,(2,(y==(1,6)[D])+2,8)["kp".find(p)]):
   for k in R:j[k]=X((0,0,-i,i,-i,i,-i,i)[k],(i,-i,0,0,-i,-i,i,i)[k],j[k])
  for v,h in((2,1),(1,2)):X(v,h,N);X(-v,-h,N);X(-v,h,N);X(v,-h,N)

दो-अंतरिक्ष इंडेंट टैब चार है, जो 5 बाइट्स बचाता है।

यह मेरे साथ होता है कि आप इसे एक अच्छे प्लाई के लिए उचित चालों का मूल्यांकन करने की संभावना बना सकते हैं और इसे 1024 बाइट्स के नीचे रख सकते हैं :) मैंने अन्य प्रश्नों को देखना शुरू कर दिया है , लेकिन कोडगोल्फ शतरंज इंजन प्रश्न नहीं लगता है ...


2
अच्छी तरह से इस सवाल को फिर से जीवित करने के लिए किया गया! (मुझे लगता है कि मैं ऐसा करने के लिए सिर्फ एक बाउंटी लगा सकता हूं कि क्या होता है।) आपका उत्तर अच्छा लग रहा है, लेकिन यह याद आता है B1C3और H2H3पहले उदाहरण में प्रश्न में दिखाया गया है।
स्क्विश ओस्सिफ्रेज

क्षमा करें, नहीं H2H3, मेरा मतलब था G1H3- दूसरे शब्दों में, आपके सफेद नाइट केवल बाएं मुड़ रहे हैं।
स्क्विश ओस्सिफ्रेज

जब तक मैं पीसी पर हूं, तब तक इंतजार करना होगा, लेकिन यह एक आसान बग है और मैं इसे छोटा करने के कई तरीके भी देख सकता हूं। आशा है कि अन्य प्रविष्टियाँ भी होंगी।
विल

@squeamishossifrage फिक्स्ड :)
होगा

1

पायथन 638 637 (482?) बाइट्स

exec"""p=raw_input()
for x in"12345678":p=p.replace(x,"~"*int(x))
b=map(ord,"#"*21+p[:71].replace("/","##")+"#"*21)
d,e=-10,126
if not"w"in p:b,d=[x^32*(64<x<e)for x in b],10
B=[-9,9,-11,11]
R=[-1,1,-d,d]
Q=B+R
c=Zx:chr(96+x%10)+chr(58-x/10)
for x,p in enumerate(b):
 def O(y):
    if 111<b[y]:print c(x)+c(y)
 s=ZL:[O(x+X)for X in L];m=ZL,z=x:L&(O(z+L[0]),m(L,z+L[0])if e==b[z+L[0]]else m(L[1:]))
 if p==80:e==b[x+d]&(O(x+d)or e==b[x+d*2]&35==b[x-d*2]&O(x+d*2)),111<b[x+d-1]<e&O(x+d-1),111<b[x+d+1]<e&O(x+d+1)
 p==75&s(Q),p==78&s([-12,12,-8,8,-21,21,-19,19]),p==82&m(R),p==66&m(B),p==81&m(Q)""".replace("Z","lambda ").replace("&"," and ")

नोट: इसके बाद def O(y):एक नई लाइन और पहले एक टैब चार हैif

ध्यान दें: zlib मॉड्यूल का उपयोग करके केवल 483 बाइट्स का एक वैध पायथन स्रोत कोड प्राप्त करना संभव है, जो वास्तविक रूप से संपीड़ित करता है:

#encoding=koi8-r
import zlib
exec zlib.decompress("x°MRKkЦ0>╞~┘Pы Eё╜Е4▌Ц█.9Br*1зБ┤B╠#°■╙=Лoъ╠M⌡│╬г0█\\pcл⌡╝x9╣ЧМф9^:Х╘e:·=м⌠Eй2oЭ╞нЫsQ9─ЩeсS{ЦAR ╕ПЭруюь4жрГыBшОhЖхпy`B▌╬ 58ёt:NхИHшк█╫ЁSK}VBmРПgOyР╢\n+'╬Z║╔▒╣иу√═╢╜-ы#G╙├з▓²Yк=╘л!dуkг≈┴?u$dOФ╘\n▐HфАюВ9]Шж╦╝╦9^┼▄пзИ√ Э│mi╜WeЧa3ъА╗╢бae┘.║WsьdЫ√Ы<ТВэГзьъ
ЙПiB╤≥П-Ъ■⌡<╡▌Б┬1╚3╕лGjщЫЙ(з╧н,>$Eш⌠FыdmШ<x,Р╔Mc;≥м╒2DLc!`Л≥рvЕFCИЪtyв%Н║╞╤≤O╝|'═┤)B|н*┘T╛▐рKпK;╔Я╓АШ&  бУ╗j└;│И╬Ж╝Щ\\4e]P&НРeZ╢5┼ДГt╚У")

1

जावास्क्रिप्ट (E6) 481 492 550

नाइट मूविंग में एक नॉटी बग को एडिट करें । बाइट को समान रखने के लिए बहुत सारे काम।

(पठनीयता के लिए नहीं रखे गए प्रमुख स्थान और नए समाचारों की गिनती)

B=f=>
  [for(c of(o=b='',f=f.split(w=' '))[0])b+=-c?w.repeat(c):c<'0'?z=10:c]+
  [...b].map((c,p)=>
    (K=d=>(d=b[p+d])==w?0:d>'a'?m:d>'A'?-m:9)(0)-1||(
      t='pPkKnNrRQqBb'.search(c),
      O=d=>K(d)<1?o+=w+P(p)+P(p+d):0,
      S=(d,s=0)=>O(d*++s)&&!K(d*s)&&S(d,s),
      //o+='\n'+P(p)+' '+c, // Uncomment to display pieces list
      t<2?[for(i of[~(s=t<1?z:-z),1-s])~K(i)||O(i)]+!K(s)&&O(s)&&(p/z|0)==t*5+1&!K(s+=s)&&O(s)
      :t<6?[for(i of t<4?[1,9,z,11]:[12,8,21,19])O(i)+O(-i)]
      :[for(i of[t>7&&9,t>7&&11,t<z,t<z&&z])S(i)+S(-i)]
    )
  ,m=f[1]<'w'?1:-1,
  //console.log(','+([...b]+',').replace(/1,0/g,'\n')), // Uncomment to display chessboard
  P=p=>'ABCDEFGH'[p%z]+(9+~p/z|0))&&o

कम गोल्फ वाला

B=f=>(
  o=b='',[for(c of f)b+=-c?'.'.repeat(c):c],
  m=(w=b[72]=='w')?1:2,n=3-m,
  t=0,
  P=p=>'ABCDEFGH'[p%9]+(9+~p/9|0),
  b=b.slice(0,71),
  // console.log(b.replace(/\//g,'\n')), // Uncomment to display chessboard

  [...b].map((c,p)=>{
    r=p/9|0
    K=k=>(k=b[k])=='.'?0:k>'a'?m:k>'A'?n:9
    J=d=>K(p+d)<2,
    O=d=>J(d)?o+=' '+P(p)+P(p+d):0,
    S=(s,d)=>O(d*++s)&&!K(p+d*s)?S(s,d):0;

    if(K(p)==2){
      // o+='\n'+P(p)+ ' '+c; // Uncomment to display pieces list
      if (c=='P')
      {
        (f=!K(p-9))&&O(-9),
        f&r==6&&!K(p-18)&&O(-18),
        [for(i of[10,8])K(p-i)==1&&O(-i)]
      }
      else if (c=='p')
      {
        (f=!K(p+9))&&O(+9),
        f&r==1&&!K(p+18)&&O(+18),
        [for(i of[10,8])K(p+i)==1&&O(+i)]
      }
      else if (c=='K' |c=='k')
        [for(i of[1,8,9,10])O(i)+O(-i)]
      else if (c=='N' | c=='n')
        [for(i of[11,7,19,17])O(i)+O(-i)]
      else 
      {
        if (c!='r' & c!='R')
          [for(i of[10,8])S(0,i)+S(0,-i)]
        if (c!='b' & c!='B')
          [for(i of[9,1])S(0,i)+S(0,-i)]
      }
    }     
  }),
  o
)

FireFox / FireBug कंसोल में टेस्ट करें

B("7k/8/8/8/8/1P6/P7/Q1q4K w - - 0 1")

उत्पादन

B3B4 A2A3 A2A4 A1B2 A1C3 A1D4 A1E5 A1F6 A1G7 A1H8 A1B1 A1C1 H1G1 H1H2 H1G2

1

जावा 631 599 594

599-बाइट्स संस्करण में एक बग को ठीक किया गया (इसे इंगित करने के लिए जैक को धन्यवाद!) और कोड को 594-बाइट्स तक छोटा कर दिया।

class F{
public static void main(String[]A){int p=0,i=8,u,v,d,z[]={0,1,-1,2,1,0,1};String f=A[0],S[]="p,n,rqk,bqk,aA,PNBRQK,aAPNBRQK".split(",");
for(;i>0;)f=f.replace(""+i,"a"+(--i==0?"":i));
for(;p<448;p++)
for(int k=p%7,w=A[1].equals("w")?32:0,c=f.charAt(p/7%8+p/56*9),a=z[k],b=k==4?2:1,q=0;S[(k/2-1|k-1)/2].indexOf(c+w)>=0&&q++<(k<3?1:4);i=a,a=b,b=-i){
for(i=1,d=97;d==97&&((u=p/7%8+i*a)|(v=p/56+i*b*(1-w/16)))>=0&&(u|v)<8&&i<(k>4?(c=='K'||c=='k')?2:9:(k<1&&p/56==w/6+1?3:2))&&S[61/(61^(k*k-2))+5].indexOf((d=f.charAt(u+9*v))-w)>=0;i++)System.out.printf("%c%d%c%d ",65+p/7%8,8-p/56,65+u,8-v);}}}

संकलन: javac F.java
रन: java F 6pk/6pp/8/8/8/p7/PP4pp/Q2p2pK w - - 0 1
आउटपुट:B2B3 B2B4 B2A3 A1B1 A1C1 A1D1 H1H2 H1G1 H1G2


क्योंकि 3Q4/p4r1k/P4pp1/4P3/5n2/3P4/4BbbP/RN3KN1 w - - 0 0मैं चाल नहीं देख रहा हूं F1F2या F1G2राजा कब्जा करने में सक्षम है?
जैक

इस बारे में बताने के लिए शुक्रिया। तुम सही हो। यह प्रकाशित संस्करण खत्म हो गया है :(
बॉब जेनोम

इसलिए मुझे अपने 631 बाइट के लंबे समाधान पर वापस आना होगा।
बॉब जीनोम

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.