এটা কি চেকমেট?


14

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

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

চ্যালেঞ্জ

এই চ্যালেঞ্জের জন্য, আপনার ইনপুটটি আপনার পছন্দসই স্বীকৃতিতে দাবা বোর্ডের অবস্থান হবে। স্পষ্ট করার জন্য, আপনার ইনপুটটি দাবা বোর্ডের টুকরোগুলি, তাদের রঙ এবং অবস্থানগুলি সহ সম্ভাব্য এন পাসেন্ট ক্যাপচার স্কয়ার সহ, যদি কোনও বর্ণনা করে will (ক্যাসেল করার ক্ষমতা অপ্রাসঙ্গিক কারণ আপনি চেকের বাইরে কাসল করতে পারবেন না)) আপনি FEN স্বরলিপিটি দরকারী খুঁজে পেতে পারেন তবে কোনও সুবিধাজনক বিন্যাস ভাল। সরলতার জন্য, আপনি এটি খেলতে কালো বলে ধরে নিতে পারেন - এর অর্থ কালো সবসময় চেকমাটেড প্লেয়ার হবে। হোয়াইট চেক, চেকমেট বা অচলাবস্থায় থাকা এমন একটি অবস্থান এই চ্যালেঞ্জের জন্য অবৈধ বলে বিবেচিত হবে।

অবস্থানটি যদি চেকমেট হয় তবে আপনাকে অবশ্যই সত্যবাদী মান এবং যদি এটি না হয় তবে একটি মিথ্যা মান output লক্ষ করুন যে অচলাবস্থা চেকমেট নয় - রাজা আক্রমণ করা আবশ্যক!

সত্যবাদী পরীক্ষার কেস

1 কে 5 আর / 6 আর 1/8/8/8/8/8/6 কে 1 বি - -

rn2r1k1 / pp1p1pQp / 3p4 / 1b1n4 / 1P2P3 / 2B5 / P5PP / R3K2R বি - -

কেআর 5 আর / আরবি 6/8/8/8/5 কি 2/6 কে 1 / আর 7 বি - -

2 কে 5/1 বি 6/8/8/8/7 এন / আর 7 / আর 3 আর 2 কে বি - - 0 1

8 / 4Q1R1 / আর 7/5 কে 2/3 পিপি 3/5 কে 2/8/8 বি - -

2 কে 5/1 বি 6/8/8/8/4 বি 2 এন / আর 7/4 আর 2 কে বি - -

ভুয়া পরীক্ষার মামলা

rnbqkbnr / pppppppp / 8/8 / 4P3 / 8 / পিপিপিপি 1 পিপিপি / আরএনবিকিউবিএনআর বি কে কিউকিউ -

8/8/8/8/8/1 কেকিউ 5/4 এন 3/1 কে 6 বি - -

2 কে 5/1 বি 6/8/8/8/7 এন / আর 7/4 আর 2 কে বি - -

8/8/2 কি 5/3 কে 4/3 কি 5/8/8/7 কে বি - -

8 / 4Q1R1 / আর 7/5 কে 2/3 পিপি 3/5 কে 2/8/8 বি - ই 3 (দেখুন যে পাসের পাশ !)

কোড গল্ফ - বাইট জেতে সংক্ষিপ্ততম কোড। শুভকামনা!


2
এটি দুর্দান্ত প্রশ্নের মতো দেখায় :)
আনুশ ২

1
স্বাবলম্বী হওয়ার স্বার্থে - যা এখানে সমস্ত চ্যালেঞ্জ হওয়া উচিত - এটি বাহ্যিক লিঙ্কগুলির উপর নির্ভর করে এবং / অথবা বিধি সম্পর্কিত বিস্তৃত জ্ঞান এবং দাবা চিহ্নিতকরণের চেয়ে আরও ভাল চুক্তি থেকে বেরিয়ে আসা দরকার। কাজ করার সময় আমি এটিকে স্যান্ডবক্সে ফিরিয়ে আনার পরামর্শ দেব।
শেগি

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

1
আমরা কি ধরে নিতে পারি যে কোনও বৈধ গেমের মাধ্যমে বোর্ডটি পৌঁছেছে?
অ্যাডহক গার্ফ হান্টার

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

উত্তর:


10

জাভাস্ক্রিপ্ট (নোড.জেএস) ,  499 ... 374  370 বাইট

ইনপুট হিসাবে গ্রহণ করে (b)(X), যেখানে স্কোয়ারগুলি বর্ণনা করে ( টি পূর্ণসংখ্যার একটি অ্যারে) (বাম থেকে ডানে এবং উপরে থেকে নীচে) এবং এন-পাসেন্ট টার্গেট স্কোয়ারের 0-ভিত্তিক সূচক, বাbX1 না থাকলে।

প্রতিটি বর্গক্ষেত্রের জন্য প্রত্যাশিত মানগুলি নীচে রয়েছে:

 0: empty square

 5: white pawn      6: black pawn
 9: white king     10: black king
17: white bishop   18: black bishop
33: white rook     34: black rook
49: white queen    50: black queen
65: white knight   66: black knight

চেকমেটের জন্য বা নট-চেকমেটের জন্য প্রদান করে।640

b=>e=>(g=(c,k)=>b.map((v,p,h,s=p+(p&~7),M=t=>v&-~c?c?(B=[...b],K&=g(b[t?b[T]=b[p]:b[b[e-8]=0,e]=6,p]=0),b=B):k|=V&8:0,m=([a],[x,t,...d]=Buffer(a))=>d.map(c=>(h=n=>(V=(a+=c-66)&136?3:b[T=a+a%8>>1])&v&3||t>>!V&v>>x&n>31&&h(n-4/!V,M``))(t,a=s)))=>(v=b[p],m`##123ACQRS`,m`$?13QS`,m`%?2ACR`,m`&#!#04PTac`,c?(p-e+8.5&~1||M(),m`"!QS`,p<16?m`"&R`:m`""R`):m`"!13`))|k)(1,K=g())*K

এটি অনলাইন চেষ্টা করুন!

কিভাবে?

বোর্ড প্রতিনিধিত্ব

আমরা ক্লাসিক 0x88 বোর্ডের প্রতিনিধিত্ব ব্যবহার করি , যাতে সীমার বাইরে লক্ষ্যবস্তুগুলি সহজে সনাক্ত করা যায়।

   |  a    b    c    d    e    f    g    h
---+----------------------------------------
 8 | 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 
 7 | 0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 
 6 | 0x20 0x21 0x22 0x23 0x24 0x25 0x26 0x27 
 5 | 0x30 0x31 0x32 0x33 0x34 0x35 0x36 0x37 
 4 | 0x40 0x41 0x42 0x43 0x44 0x45 0x46 0x47 
 3 | 0x50 0x51 0x52 0x53 0x54 0x55 0x56 0x57 
 2 | 0x60 0x61 0x62 0x63 0x64 0x65 0x66 0x67 
 1 | 0x70 0x71 0x72 0x73 0x74 0x75 0x76 0x77

এনকোডিং সরান

প্রতিটি চলার সেট 5 টি প্যারামিটার সহ এনকোড করা হয়েছে:

  • টুকরো টাইপ
  • স্কোয়ারের সর্বাধিক সংখ্যার যা প্রতিটি দিক থেকে পরিদর্শন করা যেতে পারে
  • একটি পতাকা বলছে ক্যাপচারগুলি অনুমোদিত কিনা
  • একটি পতাকা বলছে যে ক্যাপচারগুলি মঞ্জুরিপ্রাপ্ত নয়
  • দিকনির্দেশের একটি তালিকা

এই সমস্ত পরামিতি একটি একক স্ট্রিং মধ্যে প্যাক করা হয়। উদাহরণস্বরূপ, নাইট চালগুলি নীচে নীচে এনকোড করা রয়েছে:

`&#!#04PTac`
 ||\______/
 ||    |                            +------> 0 + 1 = 1 square in each direction
 ||    |                            | +----> standard moves allowed
 ||    +---> 8 directions           | |+---> captures allowed
 ||                                / \||
 |+--------> ASCII code = 35 = 0b0100011
 |
 +---------> 1 << (ASCII code MOD 32) = 1 << 6 = 64

দিকনির্দেশনা ডিকোড করতে, আমরা এর ASCII কোড থেকে বিয়োগ করি :66

 char. | ASCII code | -66
-------+------------+-----
  '!'  |     33     | -33
  '#'  |     35     | -31
  '0'  |     48     | -18
  '4'  |     52     | -14
  'P'  |     80     | +14
  'T'  |     84     | +18
  'a'  |     97     | +31
  'c'  |     99     | +33

যা দেয়:

 [ - ] [-33] [ - ] [-31] [ - ]
 [-18] [ - ] [ - ] [ - ] [-14]
 [ - ] [ - ] [ N ] [ - ] [ - ]
 [+14] [ - ] [ - ] [ - ] [+18]
 [ - ] [+31] [ - ] [+33] [ - ]

পৃথকভাবে প্রক্রিয়া করা হয় এমন এন-প্যাস্যান্ট ক্যাপচার ব্যতীত সমস্ত চলনের সেটগুলি নীচের টেবিলে সংক্ষিপ্তসারিত হয়।

  string    | description             | N | S | C | directions
------------+-------------------------+---+---+---+----------------------------------------
 &#!#04PTac | knight                  | 1 | Y | Y | -33, -31, -18, -14, +14, +18, +31, +33
 ##123ACQRS | king                    | 1 | Y | Y | -17, -16, -15, -1, +1, +15, +16, +17
 "!13       | white pawn / captures   | 1 | N | Y | -17, -15
 "!QS       | black pawn / captures   | 1 | N | Y | +15, +17
 "&R        | black pawn / advance x2 | 2 | Y | N | +16
 ""R        | black pawn / advance x1 | 1 | Y | N | +16
 $?13QS     | bishop or queen         | 8 | Y | Y | -17, -15, +15, +17
 %?2ACR     | rook or queen           | 8 | Y | Y | -16, -1, +1, +16

মন্তব্য

b => e => (
  // generate all moves for a given side
  g = (c, k) =>
    b.map((
      v, p, h,
      // s = square index in 0x88 format
      s = p + (p & ~7),
      // process a move
      M = t =>
        // make sure that the current piece is of the expected color
        v & -~c ?
          c ?
            // Black's turn: play the move
            ( // board backup
              B = [...b],
              // generate all White moves ...
              K &= g(
                // ... after the board has been updated
                b[
                  t ?
                    // standard move
                    b[T] = b[p]
                  :
                    // en-passant capture
                    b[b[e - 8] = 0, e] = 6,
                  p
                ] = 0
              ),
              // restore the board
              b = B
            )
          :
            // White's turn: just update the king's capture flag
            k |= V & 8
        :
          0,
      // generate all moves of a given type for a given piece
      m = ([a], [x, t, ...d] = Buffer(a)) =>
        d.map(c =>
          ( h = n =>
            ( // advance to the next target square
              V = (a += c - 66) & 136 ? 3 : b[T = a + a % 8 >> 1]
            )
            // abort if it's a border or a friendly piece
            & v & 3 ||
            // otherwise: if this kind of move is allowed
            t >> !V &
            // and the current piece is of the expected type
            v >> x &
            // and we haven't reached the maximum number of squares,
            n > 31 &&
            // process this move (if it's a capture, force n to
            // -Infinity so that the recursion stops)
            h(n - 4 / !V, M``)
          )(t, a = s)
        )
    ) =>
      (
        v = b[p],
        // king
        m`##123ACQRS`,
        // bishop or queen
        m`$?13QS`,
        // rook or queen
        m`%?2ACR`,
        // knight
        m`&#!#04PTac`,
        c ?
          // black pawn
          ( // en-passant capture
            p - e + 8.5 & ~1 || M(),
            // standard captures
            m`"!QS`,
            // standard moves
            p < 16 ? m`"&R` : m`""R`
          )
        :
          // white pawn (standard captures only)
          m`"!13`
      )
    ) | k
// is the black king in check if the Black don't move?
// is it still in check after each possible move?
)(1, K = g()) * K

8/1ppp4/1pkp4/8/2Q5/8/8/7K b - -
tsh

@tsh আরও অনেক গুরুতর বাগ g আপাতত 6 বাইট ব্যয়ে স্থির
আর্নল্ড

কীভাবে একজন উপস্থাপনা ছাড়াই কাজ করে যা আপনাকে জানায় যে এন পাসেন্ট সম্ভব?
আনুশ

X

আহা। অনেক ধন্যবাদ.
আনুশ

6

হাস্কেল , 1165 1065 1053 বাইট

বাইটস লিও টেনেনবামকে ধন্যবাদ রক্ষা করেছে

n=Nothing
x?y=Just(x,y)
o(x,y)=x<0||y<0||x>7||y>7
m#k@(x,y)|o k=n|1>0=m!!x!!y
z(x,y)m p(a,b)|o(x+a,y+b)=1<0|Just g<-m#(x+a,y+b)=elem g[(p,0),(5,0)]|1>0=z(x+a,y+b)m p(a,b)
t(x,y)p(a,b)m|o(x+a,y+b)=[]|g<-(x+a,y+b)=(g%p)m++do[0|m#g==n];t g p(a,b)m
c m|(x,y):_<-[(a,b)|a<-u,b<-u,m#(a,b)==6?1],k<-z(x,y)m=or$[m#(x+a,y+b)==6?0|a<-0:s,b<-0:s]++do a<-s;[k 3(a,b)|b<-s]++(k 2<$>[(a,0),(0,a)])++[m#l==4?0|b<-[2,-2],l<-[(x+a,y+b),(x+b,y+a)]]++[m#(x-1,y+a)==p?0|p<-[0,1]]
c m=1>0
(k%p)m=[[[([p|a==k]++[m#a])!!0|a<-(,)b<$>u]|b<-u]|not$o k]
w(Just(_,1))=1<0
w x=1>0
m!u@(x,y)|g<-m#u,Just(q,1)<-g,v<-((u%n)m>>=),r<-v.t u g,k<-(do[0|n==m#(x+1,y)];(u%n)m>>=(x+1,y)%g)++(do a<-s;[0|n<m#(x+1,y+a)];v$(x+1,y+a)%g)++(do[0|(x,n,n)==(1,m#(x+1,y),m#(x+2,y))];v$(x+2,y)%g)++(do a<-s;[0|1?0==m#(x,y+a)];v((x,y+a)%n)>>=(x+1,y+a)%g)=[k,k,do a<-s;[(a,0),(0,a)]>>=r,do a<-s;b<-s;r(a,b),do a<-s;b<-[2,-2];l<-[(x+a,y+b),(x+b,y+a)];v$l%g,do a<-0:s;b<-[0|a/=0]++s;r(a,b),do a<-[x-1..x+1];b<-[y-1..y+1];[0|w$m#(a,b)];v$(a,b)%g]!!q
m!u=[]
u=[0..7]
s=[1,-1]
q m=all c$m:do a<-u;b<-u;m!(a,b)

এটি অনলাইন চেষ্টা করুন!

এটি এখনকার মতো ঠিক গল্ফ হয় না, তবে এটি একটি শুরু। কিছুটা সহায়তার সাথে আমি এখন একে একে আক্রমণাত্মকভাবে গল্ফ করে ফেলেছি (এবং পথে একটি ত্রুটি স্থির করেছি)।

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

এই অনুমান বৈধ কারণ এই ধরনের পদক্ষেপ

  1. রাজা আক্রমণ করছে এমন টুকরোটি ক্যাপচার করতে পারে না, যেহেতু তারা যে টুকরো ধরেছিল সেটি কালো।

  2. যে টুকরোটি রাজাকে আক্রমণ করছে তার পথ আটকাতে পারে না, যেহেতু ধরা পড়া কালো টুকরা ইতিমধ্যে এটি করছিল।

আমরা অতিরিক্ত শর্তও যুক্ত করছি যে আপনার যদি রাজা না থাকে তবে আপনি চেক করছেন।

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

রেফারেন্সের জন্য এখানে আমার "অলগল্ডড" সংস্করণটি রয়েছে:

import Control.Monad
out(x,y)=x<0||y<0||x>7||y>7
at b (x,y)
  |out(x,y)=Nothing
  |otherwise=(b!!x)!!y
inLine (x,y) ps m (a,b) 
  | out (x+a,y+b) = False
  | elem (m `at` (x+a,y+b)) $ Just <$> ps = True
  | m `at` (x+a,y+b) == Nothing = inLine (x+a,y+b) ps m (a,b) 
  | otherwise = False
goLine (x,y) p (a,b)m
  | out (x+a,y+b) = []
  | otherwise = case m `at` (x+a,y+b) of
--    Just (n,1) -> []
    Just (n,_) -> set(x+a,y+b)p m
    Nothing    -> set(x+a,y+b)p m ++ goLine(x+a,y+b)p(a,b)m
checkBishop (x,y) m=or[inLine(x,y)[(3,0),(5,0)]m(a,b)|a<-[1,-1],b<-[1,-1]]
checkRook   (x,y) m=or$do
  a<-[1,-1]
  inLine(x,y)[(2,0),(5,0)]m<$>[(a,0),(0,a)]
checkKnight (x,y) m=any((==Just(4,0)).(at m))$do
  a<-[1,-1]
  b<-[2,-2]
  [(x+a,y+b),(x+b,y+a)]
checkPawn (x,y) m=or[at m a==Just(p,0)|a<-[(x-1,y+1),(x-1,y-1)],p<-[0,1]]
checkKing (x,y) m=or[at m(a,b)==Just(6,0)|a<-[x-1..x+1],b<-[y-1..y+1]]
check m
  | u:_<-[(a,b)|a<-[0..7],b<-[0..7],(m!!a)!!b==Just(6,1)] =
    checkBishop u m ||
    checkRook   u m ||
    checkKnight u m ||
    checkPawn   u m ||
    checkKing   u m
  | otherwise = True
set (x,y) p m=[[[head$[p|(a,b)==(y,x)]++[(m!!b)!!a]|a<-[0..7]]|b<-[0..7]]|not$out(x,y)]
white(Just(n,0))=True
white x=False
moves m (x,y)
 |g<-m `at` (x,y)=case g of
  Just(2,1) -> do
    a<-[1,-1]
    b<-[(a,0),(0,a)]
    set(x,y)Nothing m>>=goLine (x,y) g b
  Just(3,1) -> do
    a<-[1,-1]
    b<-[1,-1]
    set(x,y)Nothing m>>=goLine (x,y) g(a,b)
  Just(4,1) -> do
    n<-set(x,y)Nothing m
    a<-[1,-1]
    b<-[2,-2]
    l<-[(x+a,y+b),(x+b,y+a)]
    -- guard$white$n `at` l
    set l g n
  Just(5,1) -> do
    a<-[1,-1]
    c<-[(a,0),(0,a),(a,1),(a,-1)]
    set(x,y)Nothing m>>=goLine (x,y) g c
  Just(6,1) -> do
    a<-[x-1..y+1]
    b<-[x-1..y+1]
    guard$white(m `at`(a,b))||Nothing==m`at`(a,b)
    set(x,y)Nothing m>>=set(a,b)g
  Just(n,1) -> (do
    guard$Nothing==m `at` (x+1,y)
    set(x,y)Nothing m>>=set(x+1,y)g) ++ (do
      a<-[1,-1]
      guard$white$m`at`(x+1,y+a)
      set(x,y)Nothing m>>=set(x+1,y+a)g) ++ (do
        guard$(x,Nothing,Nothing)==(1,m`at`(x+1,y),m`at`(x+1,y))
        set(x,y)Nothing m>>=set(x+2,y)g) ++ (do
          a<-[1,-1]
          guard$Just(1,0)==m`at`(x,y+a)
          set(x,y)Nothing m>>=set(x,y+a)Nothing>>=set(x+1,y+a)g)
  _ -> []
checkmate m=all check$m:do
  a<-[0..7]
  b<-[0..7]
  moves m(a,b)

এটি অনলাইন চেষ্টা করুন!


কিছুটা গল্ফিং সহ 1252 বাইট (টিআইও লিঙ্কটি এই মন্তব্যে ফিট করার পক্ষে খুব দীর্ঘ ছিল ...)
লিও টেনেনবাম

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

@ হ্যাঁ, আমি যেখানে যাচ্ছিলাম সেখানে রাজাদের অবস্থান যুক্ত করতে ভুলে গেছি। এখনই ঠিক করা হয়েছে
অ্যাডহক গার্ফ হান্টার

তালিকাগুলির জন্য guard x = [0|x], এবং আপনি x?y=Just(x,y)আরও কয়েকটি বাইট সংরক্ষণ করতে ব্যবহার করতে পারেন : 1129 বাইট
লিও টেনেনবাম

1

পাইথন 3 (পাইপাই) , 729 বাইট

F=lambda a,b:a<'^'<=b or a>'^'>=b
def m(b,P,A=0):
 yield b
 for(r,f),p in b.items(): 
  if F(P,p):continue
  *d,n,k={'R':[(0,1),8,4],'N':[(1,2),(2,1),2,4],'B':[(1,1),8,4],'Q':[(0,1),(1,1),8,4],'K':[(0,1),(1,1),2,4],'P':[(2,0),(1,0),(1,1),(1,-1),2,1],'p':[(-2,0),(-1,0),(-1,1),(-1,-1),2,1]}[p if p=='p'else p.upper()]
  if p in'pP':d=d[d!=[2,7][p=='p']+A:]
  for u,v in d:
   for j in range(k):
    for i in range(1,n):
     U=r+u*i;V=f+v*i;t=b.get((U,V),'^')
     if U<1or U>8or V<1 or V>8:break
     if F(p,t):
      B=dict(b);B[(U,V)]=B.pop((r,f))
      if t in'eE':B.pop(([U+1,U-1][t=='e'],V))
      yield B
     if t not in'^eE':break
    u,v=v,-u
M=lambda b:all(any('k'not in C.values()for C in m(B,'W',1))for B in m(b,'b'))

এটি অনলাইন চেষ্টা করুন!


এটি বর্তমানে 8/2p5/Q7/Q2k4/Q7/8/8/7K b - -(চেকমেট নয়) জন্য ব্যর্থ ।
আর্নৌল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.