स्टड पर एक बोर्ड दिया, एक वैध शतरंज चाल खेलें


11

कार्यक्रम सफेद निभाता है।

उदाहरण स्टड:

8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … … … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h

उदाहरण स्टडआउट:

8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… … … … ♟ … … …
4 ║… … … … ♙ … … …
3 ║… … ♘ … … … … …
2 ║♙ ♙ ♙ ♙ … ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h

कोई भी वैध कदम ठीक है। "एन पासेंट" और कास्टिंग को नजरअंदाज किया जाता है। यदि कोई वैध कदम नहीं है तो त्रुटि संदेश दिखाना या कुछ भी प्रिंट करना ठीक है।

सबसे ज्यादा वोटों के साथ जवाब मिला।


मेरा मतलब है भाषा के कुछ अंतर्निहित फ़ंक्शन की विफलता के कारण एक मानक त्रुटि संदेश। तो यह ठीक है? - क्या यह अनिवार्य है कि कार्यक्रम कोई कानूनी कदम उठा सकता है? शायद कास्टिंग और प्यादा विशेष चाल को कुछ बोनस के साथ वैकल्पिक बनाया जाना चाहिए?
को बंद करना

2
@leftaroundabout: जब भी आप महल में जा सकते हैं, तो आप इसके बजाय केवल बदमाश को स्थानांतरित कर सकते हैं, इसलिए आप कम से कम उसके लिए तर्क छोड़ सकते हैं।
हमार

2
... और इसके बारे में कुछ और सोचते हुए, "एन पासेंट" कदम के बारे में जानकारी की आवश्यकता है कि पिछली चालों को क्या बनाया गया है, जो कि टुकड़ों के सिर्फ पदों से अनुमान नहीं लगाया जा सकता है, इसलिए मुझे लगता है कि इसे गिराना सुरक्षित हो सकता है। हालाँकि, चाहे डबल पहला कदम उपलब्ध हो, मोहरे के रैंक से अनुमान लगाया जा सकता है, इसलिए आप इसे शामिल करना चाह सकते हैं।
हमार

@ हमार: आप सही कह रहे हैं, मैंने इस बारे में नहीं सोचा था। एक मामले को छोड़कर , डबल चाल भी महत्वपूर्ण नहीं है : जब आप दो कदम जा सकते हैं तो आप एक भी जा सकते हैं, इसलिए यह केवल तब महत्वपूर्ण हो जाता है जब आप जांच में हों और डबल-मूव एकमात्र ऐसा कदम है जो राजा को कवर करता है। इसके अलावा, यहां तक ​​कि जब आपको हर कदम का उपयोग करने में सक्षम होने की आवश्यकता नहीं होती है , तब भी आपको यह विचार करने की आवश्यकता है कि काला किसी भी संभावना के साथ जवाब दे सकता है।

9
क्या इस्तीफा एक कानूनी कदम के रूप में गिना जाता है? :)
gnibbler

जवाबों:


16

मैं upvotes के बारे में शिकायत नहीं कर रहा हूं, लेकिन निष्पक्ष होने के लिए ... मेरा समाधान यहां वास्तव में महान नहीं है। यूगोरेन बेहतर है, इसके अलावा यूनिकोड समर्थन की कमी है। मतदान से पहले सभी उत्तरों को देखना सुनिश्चित करें, यदि आप इस प्रश्न पर अभी आए हैं!
वैसे भी।

हास्केल, 893 888 904 952 (कास्टेलिंग के बिना)

862 (बिना मोहरे के दोहरे चाल)

(आपने निर्दिष्ट नहीं किया है कि क्या यह कोड गोल्फ माना जाता है, लेकिन यह मुझे ऐसा लगता है)

χ=w⋈b;w="♙♢♤♔♕♖♗♘";b="♟♦♠♚♛♜♝♞"
μ=t⤀ζ++((\(x,y)->(x,-y))⤀)⤀μ;q c|((_,m):_)<-((==c).fst)☂(χ⋎μ)=m
t(x:y:l)=(d x,d y):t l;t _=[];d c=fromEnum c-78
ζ=["NM","NL","MMOM","MMMNMONMNOOMONOO",σ⋈δ,σ,δ,"MLOLPMPOOPMPLOLM"]
σ=l>>=(\c->'N':c:c:"N");δ=[l⋎l,reverse l⋎l]>>=(>>=(\(l,r)->[l,r]))
l="GHIJKLMOPQRSTU"
α c|c∊"♢♤"='♙'|c∊"♦♠"='♟'|c∊χ=c;π('♙':_)=6;π _=1
(⋎)=zip;(⤀)=map;(∊)=elem;(✄)=splitAt;(☂)=filter;(⋈)=(++)
φ r@(x,y)p a
 |x>7=φ(0,y+1)p a
 |y>7=[]
 |c<-a✠r=(c⌥r)p a y⋈φ(x+1,y)p a
(c⌥r)p a y
 |c==p!!0=(a☈r)c χ++const(y==π p)☂(a☈r)(p!!1)χ++(a☈r)(p!!2)('…':w)
 |c∊p=(a☈r)c χ
 |True=[]
a✠(x,y)=a!!y!!(x*2);o(x,y)=x>=0&&x<8&&y>=0&&y<8
(n➴a)(x,y)|(u,m:d)<-y✄a,(l,_:r)<-(x*2)✄m=u⋈(l⋈(n:r):d)
(a☈r@(x,y))c b=(α c➴('…'➴a)r)⤀((\r->o r&&not((a✠r)∊b))☂((\(ξ,υ)->(x+ξ,y+υ))⤀q c))
main=interact$unlines.uncurry((⋈).zipWith((⋈).(:" ║"))['8','7'..]
 .head.((all(any('♔'∊)).φ(0,0)b)☂).φ(0,0)w.(drop 3⤀)).(8✄).lines

जब आपके पास GHC स्थापित होता है (उदाहरण के लिए हास्केल प्लेटफ़ॉर्म के भाग के रूप में ) तो आप बस कर सकते हैं

$ runhaskell def0.hs < examplechessboard.txt
8 ║♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
7 ║♟ ♟ ♟ ♟ … ♟ ♟ ♟
6 ║… … … … … … … …
5 ║… ♘ … … ♟ … … …
4 ║… … … … … … … …
3 ║… … … … … … … …
2 ║♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
1 ║♖ … ♗ ♕ ♔ ♗ ♘ ♖
——╚═══════════════
—— a b c d e f g h

अब यह पागल है :) मैं इसे बाहर की जाँच करूंगा :)
हिस्त्रो हिस्ट्रोव

किसी भी विचार कैसे इस अजीबता का परीक्षण करने के लिए? Ideone.com इसे संभाल नहीं सकता है ...
हिस्टो हिस्ट्रोव

@ हिरोइस्त्रोव: अजीब यह आइडोन पर काम नहीं करता है। संभवतः गैर-एएससीआईआई पात्रों के साथ करना है।
को बंद करना

हाँ, इस ideone के साथ समस्या यह है
Hristo Hristov

14
बधाई हो, आप हास्केल को एपीएल की तरह बनाने में कामयाब रहे। :-)
इल्मरी करोनें

11

सी, 734 672 640 वर्ण

हटाने योग्य व्हाट्सएप के बिना गिने जाने वाले वर्ण।
मेरे द्वारा उपयोग किया गया फ़ाइल प्रारूप अनुरोध के अनुसार नहीं है, लेकिन ASCII का सरलीकरण है।
मुझे यूनिकोड के चरित्र समर्थन को जोड़ने की आवश्यकता है, यह कुछ चैरेट्स को खर्च करेगा।

char*r=" kpnbrq  KPNBRQ $ ,&)$wxy()879()8(6:GI(",B[256],*b=B,i;
e(x,d,m,V,c,r,n,p){
    for(r=0,p=b[x];m/++r;){
        n=x+d*r;
        if(p==2+8*(d<0)||n&136||!(b[n]?r=8,8^p^b[n]^8&&c&65^64:c&65^65)
            ? r=m,0
            : V?v(n,x):b[n]==1)
            return b[x]=0,b[n]=p%8-2||n/16%7?p:p+4;
    }
    return d>0&&e(x,-d,m,V,c);
}
d(x,v,m,i)char*m;{
    return(i=*m-40)?e(x,i%64,b[x]%8-2?b[x]&4?7:1:(x/16-1)%5|i%2?1:2,v,i)||d(x,v,m+1):0;
}
v(t,f){
    bcopy(B,b+=128,128);
    b[t]=b[f];b[f]=0;
    i=a(1,63);
    b=B;
    return!i;
}
a(c,n){
    return b[i=n*2-n%8]&&b[i]/8==c&&d(i,!c,r+r[b[i]%8+15]-10)||n--&&a(c,n);
}
main(){
    for(;gets(b);b+=8)for(;*b;b++)*b=strchr(r,*b)-r;b=B;
    for(i=64*!a(0,63);i<64;i++%8-7||puts(""))putchar(r[b[i*2-i%8]]);
}

इनपुट / आउटपुट फ़ाइल प्रारूप:
बिल्कुल 8 वर्णों की 8 पंक्तियाँ होनी चाहिए। pnbrqkसफेद टुकड़ों के लिए, PNBRQKकाले टुकड़ों के लिए, रिक्त स्थान के लिए रिक्त स्थान के लिए उपयोग किया जाता है :

RNBQKBNR
PPPP PPP

 n  P


pppppppp
r bqkbnr

तर्क काफी सरल है:
प्रत्येक सफेद टुकड़े के प्रत्येक संभव कदम के लिए, प्रत्येक काले टुकड़े के प्रत्येक संभव कदम का प्रयास करें।
यदि कोई काली चाल सफेद राजा को पकड़ती है, तो सफेद चाल वैध है।

बोर्ड को char[256]16x16 मैट्रिक्स के रूप में माना जाता है, जहां केवल शीर्ष-बाएं 8x8 का उपयोग किया जाता है। पदों और आंदोलन वैक्टर 8-बिट पूर्णांक ( x:4,y:4) में रखे गए हैं । अतिरिक्त बिट सरल अंकगणित ( new_pos = old_pos + steps*direction) का उपयोग करने की अनुमति देता है , बोर्ड किनारे ( &0x88जादू करता है) का आसान पता लगाने के साथ । r[]तीन चीजों को एनकोड करता है:

  1. पहले 15 बाइट्स आंतरिक टुकड़े कोड (K = 1, P = 2, N = 3, B = 4, R = 5, Q = 6) से लेकर अक्षरों तक का नक्शा बनाते हैं।
  2. अगले 6 बाइट्स पिछले भाग में ऑफ़सेट पर आंतरिक टुकड़ा कोड मैप करते हैं (K और Q समान हैं, B उनकी पूंछ है)।
  3. अंतिम 16 बाइट्स सभी टुकड़ों की गति को सांकेतिक शब्दों में बदलना, जैसे '('+vector

कार्य:

  1. mainबोर्ड पढ़ता है, अक्षरों को आंतरिक कोड में परिवर्तित करता है, aसफेद चाल को खोजने के लिए कॉल करता है, बोर्ड को प्रिंट करता है।
  2. a64 वर्गों पर पुनरावर्ती लूप। सही रंग (पैरामीटर c) के प्रत्येक टुकड़े के लिए , यह टुकड़ा और कॉल के लिए आंदोलन नियम पाता है d
  3. dपुनरावर्ती एन्कोडिंग आंदोलन नियम पर लूप करता है, जो वैक्टर की एक सूची है, eप्रत्येक के लिए बुला रहा है । यह eमूल स्थिति, वेक्टर और सीमा सीमा (बी के ऊपर के टुकड़े के लिए 7, दूसरी रैंक के पंजे के लिए 2, 1 अन्यथा) देता है।
  4. eएक वेक्टर के साथ सभी आंदोलनों का परीक्षण करता है। यदि यह कदम संभव है (यानी प्यादे आगे बढ़ते हैं, तो बोर्ड के भीतर, अवरुद्ध नहीं, तिरछे तरीके से कब्जा करते हैं), एक दो चीजों की जांच करता है। सफेद चाल के लिए, चाल vको मान्य करने के लिए चलाता है। काली चाल के लिए, जाँच करें कि क्या सफेद राजा को पकड़ लिया गया है। यदि यह सच है, तो इस कदम को बोर्ड पर खेला जाता है।
  5. vएक सफेद चाल को मान्य करता है। यह बोर्ड को एक तरफ कॉपी करता है, परीक्षण करने के लिए कदम को कार्यान्वित करता है, और aफिर से कॉल करता है , काली चाल को देखने के लिए।

अंत में, संभव चाल के उचित संपीड़ित एन्कोडिंग के साथ एक समाधान ! और यह अच्छी तरह से तेज है। क्या आपको नहीं लगता कि आप एक यूनिकोड आवरण जोड़ सकते हैं और अभी भी मेरे कोड से कम हो सकते हैं?
को बंद करना

@leftractionabout, मुझे लगता है कि मैं कर सकता हूँ। मुख्य समस्या यह है कि मैं लिनक्स कमांड लाइन में काम कर रहा हूं, जहां आप यूनिकोड नहीं देख सकते हैं, इसलिए डिबगिंग यह कष्टप्रद होगा। मेरे पास एक संस्करण भी है जो लगभग 40 और बाइट्स बचाता है (मैं जल्द ही अपडेट करूंगा), इसलिए मेरे पास काम करने के लिए बहुत सारे आकर्षण हैं।
बदसूरत

@ यूगोरेन: निश्चित रूप से कोई भी अर्ध-आधुनिक आधुनिक लिनक्स वितरण UTF-8 को बॉक्स से बाहर का समर्थन करता है?
हन

@han, मैं विंडोज पर काम कर रहा हूं और SSH द्वारा लिनक्स से कनेक्ट करता हूं, और यूनिकोड काम नहीं करता है। मैं एक फाइल में लिख सकता हूं और विंडोज में खोल सकता हूं, लेकिन यह अभी और दिलचस्प नहीं है।
बदसूरत

क्या यह जीसीसी के साथ संकलन होगा? मैं MinGW के साथ विंडोज के लिए Geany का उपयोग कर रहा हूं और यह त्रुटियों और चेतावनियों के एक समूह के साथ संकलित करेगा, लेकिन यह निर्माण / रन नहीं करेगा। । :( पाठ + 0x2d8): करने के लिए `bcopy 'collect2 अपरिभाषित संदर्भ: ld 1 से बाहर निकलें स्थिति लौटा
RPD

5

पायथन 2.6, 886 - 1425 वर्ण

मेरा प्रारंभिक संस्करण (संशोधन में) 886 वर्णों पर आया था, लेकिन पूरी तरह से कल्पना को संतुष्ट नहीं किया (यह चेकमेट से बचने के लिए जाँच नहीं किया; यह भी काले टुकड़ों की संभावित चाल पर विचार नहीं किया)।

अब यह करता है (और मैंने मूल में कई कीड़े तय किए हैं)। काश यह पात्रों में एक लागत के साथ आता है: अब के लिए 1425, लेकिन अभी भी सुधार के लिए बहुत कम जगह होनी चाहिए। यह संस्करण पिछले मामलों में बढ़त के मामलों को संभालने में बहुत अधिक ठोस होना चाहिए।

#-*-coding:utf8-*-
import sys;e=enumerate
B,W=["♟","♜","♞","♝","♛","♚"],["♙","♖","♘","♗","♕","♔"]
R={"♙":[11,42],"♖":[28],"♘":[31],"♗":[8],"♕":[8,28],"♔":[1,21]}
def F(w):return sum([[(i,j)for j,p in e(o)if p==w]for i,o in e(Z)],[])
def G(x,y):
 P=Z[x][y];D=P in W;L=[]
 for o in R[P]if D else R[unichr(ord(P.decode('utf8'))-6).encode('utf8')]:
  r,k="%02d"%o        
  for g,h in[[(-1,-1),(1,1),(-1,1),(1,-1)],[[(1,-1),(1,1)],[(-1,-1),(-1,1)]][D],[(-1,0),(1,0),(0,-1),(0,1)],[(-2,-1),(-2,1),(-1,-2),(-1,2),(1,-2),(1,2),(2,-1),(2,1)],[(-1,0)]][int(r)]:
   J=0
   for i in range(int(k)):
    T=x+(i+1)*g;U=y+(i+1)*h
    if T<0 or T>7 or U<0 or U>7:break
    M=Z[T][U]
    if not J:L.append((T,U,P,M))
    else:break
    if r in"02"and(M in W+B):
     J=1
     if not((D and M in B)or(not D and M in W)):L.pop()
    elif(r=="1"and not((D and M in B)or(not D and M in W)))or(r=="4"and((i==1 and x!=6)or M!="…")):L.pop()
 return L  
Z=[[y for y in l[5:].split()]for l in sys.stdin.readlines()[:-2]]
Q=[]
for p in R:
 for i,j in F(p):
  for M,L,c,_ in G(i,j):
   O=Z[M][L];Z[i][j]="…";Z[M][L]=c;E=[];map(E.extend,map(F,B))
   if not any(any(1 for _,_,_,I in G(v,h)if I==["♔","♚"][c in B])for v,h in E):Q.append((i,j,M,L,c))
   Z[i][j]=c;Z[M][L]=O
(x,y,X,Y,p)=Q[0];Z[x][y]="…";Z[X][Y]=p
for i,h in e(Z):print`8-i`+' ║'+' '.join(h)
print"——╚"+"═"*16+"\n—— a b c d e f g h"

उदाहरण इनपुट और आउटपुट:

# INPUT

8 ♞ ♞ ♝… ♚ ║♜ ♞ ♞
7 ♟ ♟ ♟ ♟… ║♟ ♟ ♟
6……………………
5………… ♟……
4 ♛…………… ║…
3…………… ♙……
2 ♙ ♙ ♙ ♙ ║♙… ♙…
1 ♘ ♘ ♘ ♘ ♘ ♘ ♘ ♘
--╚═══════════════
—आकडेफग
# OUTPUT

8 ♞ ♞ ♝… ♚ ║♜ ♞ ♞
7 ♟ ♟ ♟ ♟… ║♟ ♟ ♟
6……………………
5………… ♟……
4 ♛…………… ║…
3…………… ♙……
2 ♙ ♙ ♙ ♙ ♙………
1 ♘ ♘ ♘ ♘ ♘ ♘ ♘ ♘
--╚════════════════
—आकडेफग

यह 886 बाइट्स है, लेकिन केवल 854 चार्ट है। (मेरा कार्यक्रम 1kB से अधिक है, कई गैर-एएससीआईआई ऑपरेटरों के लिए धन्यवाद!) - क्या आप अभी तक राजा को लेने के लिए चेक जोड़ने जा रहे हैं?
को बंद कर दिया

@leftractionabout: मैंने राजा चेक जोड़े हैं (जो मुझे काले रंग के संभावित कदमों के लिए भी जिम्मेदार ठहराता है, और बहुत सारे अक्षर जोड़ता है ...)। ओह ठीक है, इस संस्करण को किनारे के मामलों (जहां तक ​​मैंने परीक्षण किया है) के आसपास अधिक ठोस होना चाहिए।
क्रिस्टोफ़ेद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.