এই স্ট্রিং কি বৈধ FEN?


12

চ্যালেঞ্জ

একটি প্রোগ্রাম বা ফাংশন লিখুন যা কোনও ফাংশন প্যারামিটার হিসাবে বা স্টিডিনের থেকে স্ট্রিং ইনপুট নেয় এবং নির্ধারণ করে যে এটি কোনও বৈধ FEN স্ট্রিং কিনা ।

ইনপুট

আপনি ধরে নিতে পারেন ইনপুটটি কেবল কখনই নিম্নলিখিত অক্ষরগুলিকে অন্তর্ভুক্ত করবে (সংবেদনশীল কেস)
pkqrbnPKQRBN12345678/
ইনপুটটির দৈর্ঘ্য সর্বদা সর্বনিম্ন 1 টি অক্ষর এবং সর্বাধিক 100 টি অক্ষরের হবে

আউটপুট

আউটপুট একটি সত্যবাদী / মিথ্যা মান হওয়া উচিত। এগুলি আপনার ইচ্ছা মত মান্য হতে পারে যতক্ষণ না তারা সুসংগত হয় (সমস্ত সত্য ফলাফলের একই আউটপুট থাকে, সমস্ত মিথ্যা ফলাফলের একই আউটপুট থাকে)। আপনার ঠিক দুটি স্বতন্ত্র সম্ভাব্য আউটপুট থাকা উচিত।

বৈধ হিসাবে গণনা করা হয় কি

ছোট হাতের অক্ষর কালো টুকরা উপস্থাপন করে, বড় হাতের অক্ষর সাদা টুকরা উপস্থাপন করে।
আপনার নিশ্চিত হওয়া উচিত যে বর্তমান অবস্থানে থাকা টুকরোগুলির জন্য দাবা খেলায় এটি সম্ভব।
প্রতিটি খেলোয়াড়ের সর্বদা ঠিক 1 কিং (কে / কে) থাকবে
প্রতিটি খেলোয়াড়ের কাছে 8 টিরও বেশি পাউন্ডের (পি / পি)
প্রতিটি খেলোয়াড়ের সাধারণত 1 * রানি (কিউ / কিউ)
বেশি থাকতে পারে না প্রতিটি খেলোয়াড়ের সাধারণত আর কিছু থাকে না 2 * রুকস (আর / আর) এর চেয়ে
প্রতিটি প্লেয়ারের সাধারণত 2 * নাইটের বেশি (এন / এন)
প্রতিটি খেলোয়াড়ের সাধারণত 2 * বিশপ (বি / বি) বেশি থাকে না
* একজন খেলোয়াড়ের পক্ষে এটি বৈধ ' এই চার টুকরো যে কোনও একটি গিরি প্রচার করুন।
প্রতিটি খেলোয়াড়ের জন্য মোট प्याদা, রানী, রুকস, নাইট এবং বিশপ মোট 15 বছরের বেশি হবে না

খণ্ড স্কোয়ার সহ মোট টুকরো সংখ্যা (সংখ্যা দ্বারা চিহ্নিত) সর্বদা প্রতিটি র‌্যাঙ্কের জন্য ঠিক 8 পর্যন্ত যোগ করা উচিত। এবং সর্বদা 8 টি র‌্যাঙ্ক থাকা উচিত, একটি ফরোয়ার্ড স্ল্যাশ দ্বারা পৃথক।

আপনি যে বিষয়গুলিকে উপেক্ষা করতে পারেন

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

এটি কোড গল্ফ। বাইটস মধ্যে সংক্ষিপ্ততম প্রোগ্রাম। সাধারণ লফোলস এবং বিধি প্রযোজ্য।

পরীক্ষার কেস

ইনপুট rnbqkbnr / pppppppp / 8/8/8/8 / পিপিপিপিপিপিপিপি / আরএনবিকিউবিএনআর
আউটপুট সত্য

ইনপুট 2br2k1 / 1p2n1q1 / p2p2p1 / P1bP1pNp / 1BP2PnP / 1Q1B2P1 / 8 / 3NR2K
আউটপুট সত্য

ইনপুট r2r2k1 / p3q2p / ppR3pr / rP4bp / 3p4 / 5B1P / P4PP1 / 3Q1RK1
আউটপুট মিথ্যা
(কালোতে 7 টি পদ্ম এবং 4 রুক রয়েছে - অসম্ভব)

ইনপুট 6 কে 1 / পিপি 3 পিপি / 4 এমপি / 2 পি 3 বি 1 / বিপিপি 3 পি 1/3 কে 4 / পি 3 কি 1 কি 1
আউটপুট মিথ্যা (মাত্র 7 টি পদ)

ইনপুট 3r1rk1 / 1pp1bpp1 / 6p1 / pP1npqPn / 8 / 4N2P / P2PP3 / 1B2BP2 / আর 2 কিউ 2 আর
আউটপুট মিথ্যা (9 পদ)

ইনপুট 5n1k / 1p3r1qp / p3p3 / 2p1N2Q / 2P1R3 / 2P5 / P2r1PP1 / 4R1K1
আউটপুট মিথ্যা (দ্বিতীয় স্তরের 9 স্কোয়ার / টুকরা রয়েছে)

ইনপুট rnbqkbnr / pppppppp / 8/35/8/8 / পিপিপিপিপিপিপিপি / আরএনবিকিউবিএনআর
আউটপুট
এই মামলাটি স্পষ্ট করার জন্য ফেয়ারসাম এবং আর্নল্ডকে সত্য ধন্যবাদ (3 + 5 = 8)

FEN কি?

দাবা বোর্ডে টুকরোগুলির অবস্থান রেকর্ড করার জন্য FEN একটি মানক স্বরলিপি। চিত্র ক্রেডিট http://www.chessgames.comএখানে চিত্র বর্ণনা লিখুন


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

@ অ্যান্ডারস ক্যাসরগ * It is legal for a player to 'promote' a pawn to any of these four pieces.প্লেয়ারের ক্ষতিপূরণে কমতি কমার কারণে প্লেয়ারের 9 টি রানী থাকতে পারে। এই টুকরোগুলির অবস্থান বৈধ বা অবৈধ, কেবল টুকরোগুলির সংখ্যা সম্পর্কে আপনার চিন্তা করার দরকার নেই।
ড্যারেন এইচ

1
আপনার তৃতীয় পরীক্ষার ক্ষেত্রে,
কালোটির

1
@ ড্যারেনএইচ ফেয়ারসাম দ্বারা প্রস্তাবিত FEN অবস্থানটি আপনার বর্তমান বিধি অনুসারে বৈধ। 358 টি ফাঁকা স্কোয়ার বর্ণনা করার জন্য এটি একটি অস্বাভাবিক উপায়।
আর্নল্ড

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

উত্তর:


5

রেটিনা , 105 বাইট

[1-8]
$*
^
/
iG`^(/[1KQRBNP]{8}){8}$
G`K
G`k
A`K.*K|k.*k
{2`N

2`B

2`R

1`Q

K

T`L`P
8`P

A`P
}T`l`L
^.

এটি অনলাইন চেষ্টা করুন! লিঙ্কে পরীক্ষার কেস অন্তর্ভুক্ত রয়েছে। ব্যাখ্যা:

[1-8]
$*

অঙ্কগুলি খালি স্কোয়ারে প্রসারিত করুন, যা আমরা 1গুলি ব্যবহার করে বোঝাচ্ছি।

^
/
iG`^(/[1KQRBNP]{8}){8}$

ইনপুটটি এটির সাথে যোগ হয়ে 8 টি বৈধ স্কোয়ারের 8 টির সাথে মেলে না তা মুছুন /। ( /চেকটি সহজ করার জন্য অতিরিক্ত অতিরিক্ত উপসর্গযুক্ত))

G`K
G`k
A`K.*K|k.*k

যদি কোনও সাদা বা কোনও কালো রাজা না থাকে বা এটির দুটি হয় তবে ইনপুটটি মুছুন।

{2`N

2`B

2`R

1`Q

K

সাদা রঙের প্রারম্ভিক টুকরা মুছুন, যদি তারা এখনও সেখানে থাকে।

T`L`P

বাকী সাদা টুকরোগুলি পদ্মায় রাখুন।

8`P

বৈধ সাদা pawns মুছুন।

A`P

যদি কোনও সাদা পদ্মা বাকি থাকে তবে ইনপুটটি মুছুন।

}T`l`L

আবার পরীক্ষা করুন তবে কালো টুকরা দিয়ে।

^.

লাইনটি মোছা না করা পর্যন্ত সত্যবাদী মান আউটপুট করুন।


6

জাভাস্ক্রিপ্ট (ES6), 168 174 ... 155

এই উত্তরটি বিব্রতকর সংখ্যক বার সম্পাদিত হয়েছে। আশা করি, বর্তমান সংস্করণটি নির্ভরযোগ্য এবং শালীনভাবে উভয়ই গল্ফ করেছে।


একটি বুলিয়ান ফেরত দেয়।

s=>[...s].map(c=>++n%9?+c?n+=--c:a[i='pP/KkQqRrBbNn'.search(c),i&=i>4&a[i]>(i>6)||i]=-~a[i]:x+=c=='/',a=[x=n=0])&&!([p,P,s,k,K]=a,n-71|x-7|s|k*K-1|p>8|P>8)

ফর্ম্যাট এবং মন্তব্য

s => [...s].map(c =>                  // for each character 'c' in the FEN string 's':
  ++n % 9 ?                           //   if we haven't reached the end of a rank:
    +c ?                              //     if the character is a digit:
      n += --c                        //       advance the board pointer by c - 1 squares
    :                                 //     else:
      a[                              //       update the piece counter array:
        i =                           //         i = piece identifier (0 to 12)
          'pP/KkQqRrBbNn'.search(c),  //             with special case: '/' --> 2
        i &=                          //         we count it as a promoted pawn instead if:
          i > 4 &                     //           it's a Q, R, B or N and we already have
          a[i] > (i > 6) ||           //           2 of them for R, B, N or just 1 for Q
          i                           //           else, we keep the identifier unchanged
      ] = -~a[i]                      //         '-~' allows to increment 'undefined'
  :                                   //   else:
    x += c == '/',                    //     check that the expected '/' is there
  a = [                               //   initialize the piece counter array 'a'
    x =                               //   initialize the '/' counter 'x',
    n = 0 ]                           //   initialize the board pointer 'n'
) &&                                  // end of map()
!(                                    // now it's time to perform all sanity checks:
  [p, P, s, K, k] = a,                //   copy the 5 first entries of 'a' to new variables
  n - 71 |                            //   have we reached exactly the end of the board?
  x - 7 |                             //   have we identified exactly 7 ends of rank?
  s |                                 //   have we encountered any unexpected '/' character?
  k * K - 1 |                         //   do we have exactly one king on each side?
  p > 8 |                             //   no more than 8 black pawns, including promotions?
  P > 8)                              //   no more than 8 white pawns, including promotions?

পরীক্ষার মামলা


3

পাইথন 3, 284 259 236 225 247 234 বাইট

import re
s=input()
t,c=s.split("/"),s.count;P=p=9;o=0
for x in"pqrnb":p-=max(0,c(x)-o);P-=max(0,c(x.upper())-o);o+=o<2
v=8==len(t)and all(8==sum(int(x)for x in re.sub("[A-z]","1",p))for p in t)and p>0<P and c('k')==c('K')==1
print(v)

অনলাইনে চেষ্টা করে দেখুন!

অনলাইনে পরীক্ষার সব ক্ষেত্রেই এটি ব্যবহার করে দেখুন!

-11 বাইটস মিঃ এক্সকোডারকে ধন্যবাদ

-13 বাইট জনাথন অ্যালেন ধন্যবাদ

+22 আমি ভুলে গেছি রাজাদের অস্তিত্ব ছিল।

কিছু ব্যাখ্যা সহ আধা-অবরুদ্ধ:

import re
string = input()
split = string.split("/")
count = string.count # find # of occurences of char in string
pawns = 9 # represents the # of pawns a player has out of the game... plus one, e.g. 1 is all in game, 2 is one out, 0 is invalid
PAWNS = 9 # would be 8, but then I would need >= instead of >
offset = 0 # default for pawns
for char in "pqrnb": # for each pawn, each queen over 1, and each rook/knight/bishop over 2 for each player
    # subtract one from the players 'pawns' var, which must end up 1 or greater to be valid
    # otherwise too many pawns/queens/etc of that player are on the board
    pawns -= max(0,count(char)-offset)
    PAWNS -= max(0,count(char.upper())-offset)
    offset += (offset 0 and PAWNS>0 and \ # make sure each player does not have an invalid number of pawns/q/n/b/r
    count('k')==count('K')==1 # correct # of kings
print(valid)

1
234 বাইট । আমি ,p,P=9,9সঙ্গে প্রতিস্থাপন ;P=p=9
মিঃ এক্সকোডার

1
230 বাইট । আপনার কেন অপ্রয়োজনীয় স্পেস for-loop
রেখেছিল

1
225 বাইট : আপনি 5 বাইটও সংরক্ষণ করার p>0<Pপরিবর্তে ব্যবহার করতে পারেন p>0and P>0। বিকল্পভাবে, আপনি p and P(-3 বাইটের জন্য) ব্যবহার করতে পারতেন , আপনার প্রয়োজন হবে না >0, কারণ পাইথনে অ-শূন্য মানগুলি সত্য
জনাব এক্সকোডার

1
বন্ধনগুলি আপগ্রেড করা যায়, অনুমান অনুসারে lower টি লোয়ারকেস প্যাশন এবং ৪ টি রুক রয়েছে, যেখানে আমার চোখগুলি কেবল lower টি ছোট হাতের অক্ষর দেখায়।
pizzapants 184

1
o=0লুপের আগে শুরু করে এবং o+=o<2লুপের দেহের শেষে বাড়ানো দ্বারা আপনি 13 বাইট সংরক্ষণ করতে পারেন ।
জোনাথন অ্যালান


2

জাভাস্ক্রিপ্ট (ES6), 181 172 174 বাইট

f=([c,...s],n=1,o={p:0,P:0})=>c?c=='/'&&n%9?0:f(s,n+(+c||1),(o[c]=(o[c]||0)+(/[qrbn]/i.test(c)&&o[c]>1-/q/i.test(c)?!o[c>'a'?'p':'P']++:1),o)):o.p<9&o.P<9&n==72&o.k==1&o.K==1

Ungolfed:

f=
  ([c,...s],                 //c is current character
   n=1,                      //n is current square, range [1-72] (board is 9x8 due to slashes)
   o={p:0,P:0}               //o holds piece counts
  )=>
  c?
    c=='/'&&n%9?0:           //ensure 8 squares per row
    f(s,
      n+(+c||1),             //increment n by the correct number of squares
      (o[c]=(o[c]||0)+(/[qrbn]/i.test(c)&&o[c]>1-/q/i.test(c)?!o[c>'a'?'p':'P']++:1),o)
                             //"depromote" extra queens, rooks, bishops, or knights
     ):
  o.p<9&o.P<9&               //no more than 8 pawns per side (accounting for promotions)
  o.k==1&o.K==1&             //each side has one and only one king  
  n==72                      //correct number of squares


1

পাইথন 3 , 263 বাইট

s=input()
n=0
for a in s.split('/'):n+=sum([int(c)if c in"123456789"else 1for c in a])
m=lambda k:{c:s.count(c)for c in s}.get(k,0)
p=[m("p"),m("P")]
for c in"rnbqRNGQ":b=c in"qQ";p[c<"Z"]+=m(c)+b-2if m(c)>2-b else 0
print((n==64)&(p[0]<9>p[1])&(m("K")>0<m("k")))

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

ক্ষুদ্রতম পাইথন জমা দেওয়া নয়, তবে আমি মনে করি এটির এখনও কিছু প্রতিশ্রুতি রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.