দাবা এফএন স্ট্রিংয়ের ভিত্তিতে স্কোর মূল্যায়ন করা


17

চ্যালেঞ্জ

ফোরসিথ position এডওয়ার্ডস নোটেশন (এফএন) একটি দাবা গেমের নির্দিষ্ট বোর্ডের অবস্থান বর্ণনা করার জন্য একটি প্রমিত স্বরলিপি। আপনার চ্যালেঞ্জটি হল FEN স্ট্রিংটি ব্যবহার করে স্কোরটি মূল্যায়ন করা। এটি একটি FEN স্ট্রিংয়ের একটি উদাহরণ:

5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8

এই স্ট্রিংটি ব্যবহার করে, আপনি নিম্নলিখিত স্কোর টেবিলের সাহায্যে প্রতিটি রঙের জন্য উপাদান স্কোর গণনা করতে পারেন:

  • পি / পি = বন্ধন = 1 পয়েন্ট
  • n / N = নাইট = 3 পয়েন্ট
  • বি / বি = বিশপ = 3 পয়েন্ট
  • আর / আর = রুক = 5 পয়েন্ট
  • q / Q = রানী = 9 পয়েন্ট
  • কে / কে = কিং, এগুলির কোনও পয়েন্ট নেই কারণ প্রতিটি আইনী পজিশনে প্রতিটি পক্ষের জন্য একজন রাজা থাকে

সাদা টুকরা বড় হাতের অক্ষর ("পিএনবিআরকিউ") ব্যবহার করে মনোনীত করা হয় তবে কালো টুকরা লোয়ারকেস ("পিএনবিআরকিউ") ব্যবহার করে। খালি স্কোয়ারগুলি 1 থেকে 8 পর্যন্ত অঙ্কগুলি (খালি স্কোয়ারের সংখ্যা) ব্যবহার করে এবং "/" স্থান পৃথক করে চিহ্নিত হয়।

FEN স্ট্রিংয়ের উদাহরণ থেকে আমরা প্রতিটি পক্ষের জন্য উপাদান স্কোর গণনা করতে পারি:

কালো জন্য:

5 কে 2 / পিপিপি 5/4 পি 3/3 আর 3 পি / 6 পি 1/1 কে 2 এন আর 2 / পিপি 3 পি 2/8

সমস্ত কালো টুকরা অবশিষ্ট রয়েছে: p + p + p + p + r, এটি মোট 9 টি

সাদা জন্য:

5 কে 2 / পিপিপি 5/4 পি 3/3 আর 3 পি / 6 পি 1/1 কে 2 এন আর 2 / পিপি 3 পি 2/8

সমস্ত সাদা টুকরা বাকী: P + R + P + N + P + P + P, এটি মোট 13 টি

চূড়ান্ত স্কোরটি নিম্নলিখিত সূত্রের সাহায্যে নির্ধারিত হয়: হোয়াইট স্কোর - কালো স্কোর = ফাইনাল স্কোর , উদাহরণস্বরূপ চূড়ান্ত স্কোরটি হবে: 13 - 9 = 4

উদাহরণ :

ইনপুট:

5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8

আউটপুট:

4

সমস্ত বিধি এখানে প্রয়োগ হয়, কমপক্ষে বাইট জয়ের পরিমাণ সহ সমাধান।


কিভাবে পোস্ট করবেন

# Language Name, N bytes

 [code]

 [explaination, etc.]

3
তাহলে আসল অবস্থান নিয়ে কিছু যায় আসে না? আপনি শুধু স্ট্রিং মধ্যে অক্ষর গণনা?
xnor

4
নিতপিক: এটি একটি সম্পূর্ণ FEN স্ট্রিং নয়। এছাড়াও, Kr1NQQQQ / 2rNQQQQ / 3NQQQQ / 3NQQQQ / 3NQQQQ / 3NQQQQ / 3NQQQQ / K2NQQQQ হোয়াইট জন্য জিতছে , কালো সরানো সঙ্গে? : পি
ডুরকনব

@ এক্সনর হ্যাঁ, আমি মনে করি যদি মূল্যায়নটিও কৌশলগত ভিত্তিতে হয় তবে এটি আরও জটিল হয়ে উঠবে। আপনি ধরে নিতে পারেন যে সমস্ত ইনপুটগুলি আইনী পজিশন, সুতরাং এটি সম্পর্কে চিন্তা করবেন না।
আদনান

@ ডুরকনব, হ্যাঁ, জিনিসগুলি সরল করার জন্য স্কোরটি কেবলমাত্র উপাদান হিসাবে তৈরি হয়েছে
আদনান

উত্তর:


3

সিজেম, 28 27 26 বাইট

0l{i32mdD%[5ZZX9]=\3%(*+}/

সিজেএম ইন্টারপ্রেটারে এটি অনলাইনে চেষ্টা করুন ।

কিভাবে এটা কাজ করে

0l         e# Push a 0 (accumulator) and a line from STDIN.
{          e# For each character of that line:
  i32md    e#   Divide its code point by 32; push quotient and residue.
           e#   This serves two purposes:
           e#     1. The quotient will let us distinguish between uppercase
           e#        letters, lowercase letters and non-letters.
           e#     2. The residue will be the same for uppercase and lowercase
           e#        variants of the same letter.
  D%       e#   Take the residue modulo 13.
           e#   This maps R,N,B,P,Q -> 5,1,2,3,4
  [5ZZX9]= e#   Select the element at that index (5 ≡ 0) from [5 3 3 1 9].
  \        e#   Swap the quotient on top of the stack.
           e#   1 is digit or slash, 1 is uppercase, 2 is lowercase.
  3%(      e#   Take the quotient modulo 3 and subtract 1 from the result.
           e#   This maps 1,2,3 -> 0,1,-1.
  *+       e#   Multiply the generated integers.
  +        e#   Add the product to the accumulator.
}/         e#

5

> <> , 64 57 56 53 বাইট

"QRBNP"013359v
$0p4}:{:v?=1l<p4+' '{-
g4v?(0:i<+
n~<;

(-7 এল এলেন্ডিয়াস্টারম্যানের উত্তর থেকে কিছু অনুপ্রেরণা নিয়ে বাইটস, -৩ বাইট @ র্যান্ডোমরাকে ধন্যবাদ)

ব্যাখ্যা

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

প্রথম লাইনটি টুকরোগুলি ধাক্কা দেয় এবং তারপরে টুকরো মানগুলি অনুসরণ করে। এটি তৃতীয় লাইনের জন্য মোটটিকে সরিয়ে দিতে প্রাথমিক 0 টি চাপায়।

দ্বিতীয় লাইনটি তখন যথাযথ ধনাত্মক বা নেতিবাচক মানটিকে সংশ্লিষ্ট পিস সেলটিতে রাখে, যেমন -1স্থাপন করা হয় ('p', 4)এবং 1স্থাপন করা হয় ('P', 4)। লুপটি 5 বার চালিত হয় তা নিশ্চিত করার জন্য স্ট্যাকের দৈর্ঘ্য পরীক্ষা করা হয়।

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

শেষ লাইনটি কেবল ফলাফল মুদ্রণ করে।


4

রুবি, 88 টি চর

->s{s.chars.map{|c|({P:1,N:3,B:3,R:5,Q:9}[:"#{c.upcase}"]||0)*(c.ord<90?1:-1)}.inject:+}

এটি বিশ্রী এবং কুরুচিপূর্ণ এবং সম্ভবত আরও ভাল উপায় আছে তবে ওহ ভাল।

রুবির {foo: 'bar'}সিনট্যাক্স আসলে {:foo => 'bar'}গল্ফের জন্য বিরক্তিকর এটির জন্য চিনির কারণ এটির অর্থ হ্যাশ উপাদানকে অ্যাক্সেস করার জন্য এটির চাবিটি একটি প্রতীক হিসাবে রূপান্তর করতে হবে (এটির :"#{x}"চেয়ে কম একটি চরিত্র x.to_sym)।


4

পিপ, 39 বাইট

সিজেএম এবং পাইথের উত্তরগুলি আসার আগে আমি আমার সংক্ষিপ্ত মোড় নেব ...

$+Y(95<=>A_)*013359@{"KPNBRQ"@?UCa|0}Ma

কমান্ড-লাইন আর্গুমেন্ট হিসাবে FEN স্ট্রিং নেয়। কিছুটা দালালি সংস্করণের জন্য এখানে একটি ব্যাখ্যা:

$+({(95<=>Aa)*013359@("KPNBRQ"@?UCa|0)}Ma)

   {                                  }Ma   Map this function to each character in input:
                                UCa          Uppercase version of character
                      "KPNBRQ"@?             Its index in this string, nil if not present
                                   |0        Logical or with 0 (to turn nil into 0)
              013359@(               )       Index into this number to get piece's score
          Aa                                 ASCII value of character
     95<=>                                   1 if less than 95, -1 if greater than 95
    (       )*                               Multiply by the score
$+(                                      )  Sum all scores and autoprint result

4

পার্ল, 44 বাইট

#!perl -p
$\+=lc=~y/pnbrq/13359/r*(a cmp$_)for/\D/g}{

শেবাংকে এক হিসাবে গণনা করা, স্টিডিনের কাছ থেকে ইনপুট নেওয়া হয়।


নমুনা ব্যবহার

$ echo 5k2/ppp5/4P3/3R3p/6P1/1K2Nr2/PP3P2/8 | perl fen-score.pl
4

ব্যাখ্যা

টুকরোগুলি তাদের নিজ নিজ মান দিয়ে প্রতিলিপি করা হয়। যদি টুকরোটি মূলধনযুক্ত হয় (অর্থাত্ কম a) তবে এর মান যোগফলকে যোগ করা হয়, যদি তা বিয়োগ হয় না।


3

জাভাস্ক্রিপ্ট ES7, 79 বাইট 124 131

s=>(i=0,[for(q of s)i+={P:1,N:3,B:3,R:5,Q:9,p:-1,n:-3,b:-3,r:-5,q:-9}[q]||0],i)

আমি যতটা সংক্ষিপ্ত পেতে পারি স্ট্রিংটি লুপ করতে অভিনব অ্যারে বোঝাপড়া ব্যবহার করে।

ব্যাখ্যা

s=>(     // Define function with an argument

    i=0, // this var will store the score

    [for(q of s)   // Loops through input
      i+=          // Adds to score by...

         {P:1,...,   // Defines value of each letter
          p:-1,...}  // Negative value instead, which will subtract
         || 0        // Otherwise add 0

    ], i           // Return score

3

মিনকোল্যাং 0.9 , 72 65 64 60 44 42 41 বাইট

13359"QRBNP"m5[d3~c~$r48*+0p0p]$I[o0q+]N.

এখানে চেষ্টা করুন।

এটি করার জন্য আরও কার্যকর উপায় নির্দেশ করার জন্য Sp3000 কে অনেক ধন্যবাদ!

ব্যাখ্যা

13359"QRBNP"mpush কর্মের স্কোর এবং তাদের সংশ্লিষ্ট অক্ষর, তারপর interleaves তাদের, তাই এই মত স্ট্যাকের দেখায়: [1,80,3,78,3,66,5,82,9,81]। তারপরে 5[d3~c~$r48*+0p0p]প্রতিটি অক্ষরের স্কোরকে ছোট জায়গার এবং বড় হাতের অক্ষর কোডের জায়গাতে রেখে দেয়। অবশেষে, $I[o0q+]N.ইনপুটটি খালি হওয়া অবধি লুপ করে, স্কোরগুলি পাশাপাশি চলে যায় adding



2

আওোবোরস , 82

আওোবোরাস হ'ল আমি এই সপ্তাহে ডিজাইন করেছি e স্পিনের জন্য সময় নিতে!

i.1+!57*(\m1(M\1).96>.@32*-.80=\.78=3*\.66=3*\.82=5*\81=9*++++\2*1\-*+
)L!4*(4Sn1(

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

1 একটি ব্যতিক্রম, যা অনেক 2D ভাষার ভাষা থেকে আওোবরোসকে পৃথক করে: বহু অঙ্কের সংখ্যাগুলি গণিত না করে বা প্রথমে 0 টি ধাক্কা না দিয়ে সোজাভাবে লেখা যেতে পারে।

সাপ ঘ

প্রথম সাপ একটি অক্ষর ( i) পড়ে এবং এটি -1 / ইওএফ ( .1+!) কিনা তা পরীক্ষা করে । যদি তা হয় তবে এটি তার বেশিরভাগ লেজ খায়, M(এবং 57*() সমেত ।

সাপ তারপরে স্ট্যাক ( \) এর উপরে থাকা ট্যালি দিয়ে অক্ষর কোডটি অদলবদল করে , ভাগটিকে ভাগ করা স্ট্যাক ( m) এ নিয়ে যায় এবং অন্য একটি অক্ষর ( 1() গিলে ফেলে । যদি এটি ইতিমধ্যে একটি গুচ্ছ গ্রাস করে ফেলেছিল, এর অর্থ এটি (বর্তমানে আইপি চালু আছে এবং মারা যায় sw অন্যথায়, মৃত্যুদন্ডটি সাপ 1 এর স্ট্যাকের দিকে ট্যালিটি ফিরিয়ে নিয়ে যায়, এটিকে চর কোডের সাথে অদলবদল করে এবং পূর্বে গিলে ফেলেছিল এমন চরিত্রটিকে পুনর্গঠন করে M\1)

এরপরে আমরা অঙ্কের জন্য উপযুক্ত স্কোর তৈরি করতে গণিত এবং স্ট্যাক অপারেশনগুলি ব্যবহার করি। .96>এটি ছোট হাতের নাগরিক কিনা তা পরীক্ষা করে; পরবর্তীকালে 32*-বড়হাতে রূপান্তরিত হয়। তারপর থেকে দীর্ঘ প্রসারিত .80=করতে 81=9*++++মানচিত্রগুলি P-> 1, N-> 3, ইত্যাদি অবশেষে, \2*1\-*স্কোর যদি অক্ষর ছোটহাতের অক্ষরে ছিল negates, এবং +পুঙ্খানুপুঙ্খ হিসাব থেকে এটি যোগ করা হয়েছে। সাপটি তখন লুপ করে অন্য একটি চরিত্র পড়ে।

সাপ ঘ

দ্বিতীয় সাপটি একটি রেজিগ্রেট অপারেশন ( )) দিয়ে শুরু হয় , যা প্রথমবারের মতো কিছুই করে না (যেহেতু কিছুই এখনও গ্রাস করা হয়নি, এবং খালি স্ট্যাকটি পপিংয়ের পরেও 0)। এরপরে, এটি ভাগ করা স্ট্যাকের দৈর্ঘ্যটিকে নিজের স্ট্যাকের দিকে ঠেলে দেয় এবং যৌক্তিকভাবে ( L!) উপেক্ষা করে । 1স্ট্যাকটি খালি থাকলে এটি দেয় 0otherwise সাপটি 4 দ্বারা বহুগুণ হয় এবং এটি অনেকগুলি অক্ষর ( 4*() খায় ।

যদি ভাগ করা স্ট্যাকটি খালি থাকে তবে এর অর্থ সাপটি এখন শেষ হওয়ার আগেই শেষ হয় S। এটি ধাক্কা দেয় 4এবং ফিরে ফিরে আসে ), যেখানে এটি কেবল গিলে ফেলা অক্ষরগুলিকে পুনর্গঠন করে এবং আবার শুরু হয়।

যদি ভাগ করা স্ট্যাকের কোনও মান থাকে তবে কোনও অক্ষর গ্রাস করা হয় না এবং কার্যকর হয় না। সাপ ভাগ করা স্ট্যাকের দিকে স্যুইচ করে এবং সেখানে নম্বরটি আউটপুট করে Sn; তারপরে এটি তার শেষ চরিত্রটি গ্রাস করে এবং মারা যায় ( 1()।

সিংক্রোনাইজ

দুটি সাপকে অবশ্যই সাবধানে সিঙ্ক্রোনাইজ করতে হবে যাতে ইনপুটটির শেষ না হওয়া অবধি সাপ 2 পরীক্ষা করে নিলে ভাগ করা স্ট্যাকের কোনও মূল্য কখনও না থাকে। সাপ 1 ভাগের স্ট্যাকের জন্য প্রতিটি লুপের মধ্য দিয়ে পাসের জন্য সংক্ষেপে একটি মান রাখে। সুতরাং, সাপ 2 এর Lকমান্ড কখনই সাপ 1 mএবং Mকমান্ডের মধ্যে কার্যকর করা উচিত নয় Fort ভাগ্যক্রমে, সাপগুলি খুব ভালভাবে লাইন করে। গুরুতরভাবে, সর্প 1 এর লুপের দৈর্ঘ্য (70 টি নির্দেশ) সাপের 2 এর লুপের একাধিক (7 টি নির্দেশ), সুতরাং দু'টি কখনই সমন্বয় থেকে বেরিয়ে আসবে না:

i.1+!57*(\m1(M\1).96>.@32*-.80=\.78=3*\.66=3*\.82=5*\81=9*++++\2*1\-*+
)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5)L!5*(5
          |__|
       Danger zone

যদি সংখ্যাগুলি এতটা নিখুঁতভাবে কাজ করে না, তবে আমি প্রয়োজন অনুযায়ী সারিবদ্ধ করার জন্য আমি একটি বা উভয় সাপকে স্পেস দিয়ে প্যাড করব।

এই সমস্ত খুব ভাল, কিন্তু আমি এটি কর্মে দেখতে চাই!

স্ট্যাক স্নিপেটের মাধ্যমে উপরের প্রোগ্রামটি এখানে। এমনকি প্রতি সেকেন্ডে 1000 ক্রিয়াকলাপে, নমুনা ইনপুটটির উত্তরটি ছুঁতে 10 সেকেন্ড সময় লাগে - তবে এটি সেখানে যায়!


2

জাভাস্ক্রিপ্ট ES6, 71

বেনামে ফাংশন হিসাবে

n=>[...n].map(x=>t+=~(y='q   rnb p PBN R   Q'.search(x))?y-9|1:0,t=0)|t

2

পার্ল 5, 71 63 বাইট

%a=(P,1,N,3,B,3,R,5,Q,9);$\+=$a{$_}||-$a{uc$_}for<>=~/./g;print

এটি শুরুতে সংজ্ঞায়িত হ্যাশের মূল যা স্ট্রিংয়ের প্রতিটি বর্ণমালার জন্য পরিবর্তিত হয় $\(এর জন্য লাইন বিভাজক print, যা মিথ্যা শুরু করে) %a$\চিঠিটি যদি কী হিসাবে থাকে তবে এটি হ্যাশটির মান দ্বারা বৃদ্ধি পায়; অন্যথায়, হ্যাশটির মানটি নেতিবাচকভাবে বৃদ্ধি পায় যদি বড় হাতের অক্ষর একটি কী থাকে; অন্যথায় এটি কিছুই যোগ করে না।

আমাকে আটটি বাইট সংরক্ষণ করার জন্য প্রিমোকে অনেক ধন্যবাদ (এই উত্তরের মন্তব্যে)।


প্রিমো (ধন্যবাদ!) এর অন্য একটি পরামর্শ দিয়ে আমি আরেকটি বাইট সংরক্ষণ করতে পারি: এতে পরিবর্তন $a{$_}||-$a{uc$_}করুন $a{$_}-$a{$"^$_}। তবে এটি আমার চেয়ে একটি পৃথক উত্তর, আমি মনে করি, সুতরাং আমি এটির জন্য "ক্রেডিট" (−1 বাইটের) নেব না।


1

ক্লোজার / ক্লোজার স্ক্রিপ্ট, 63 টি অক্ষর

#(apply +(map{"P"1"N"3"B"3"R"5"Q"9"p"-1"n"-3"b"-3"r"-5"q"-9}%))

ClojureScript REPL ব্যবহার করে লিখিত, এটিও বৈধ Clojure হওয়া উচিত। এখানে চেষ্টা করুন । এটি প্রবেশ করুন, তারপরে এটি কল করুন(*1 "FEN_string_here")

অনেকটাই অকপট. {"P"1..."q"-9}"পি" থেকে 1, "এন" থেকে 3, ইত্যাদির মানচিত্রের জন্য একটি ডেটা স্ট্রাকচার আক্ষরিক mapহয় দ্বিতীয়টি হিসাবে প্রক্রিয়াকরণে প্রথম আর্গুমেন্ট এবং ডেটা স্ট্রাকচার হিসাবে ফাংশনটি গ্রহণ করে - এই ক্ষেত্রে এটি বৈশিষ্ট্যটি ব্যবহার করে যা একটি ডেটা স্ট্রাকচার (মানচিত্রের আক্ষরিক) এর নিজস্ব অ্যাকসেসর ফাংশন হিসাবে কাজ করতে পারে। স্ট্রিং প্যারামিটার ( %ফাংশন ম্যাক্রো থেকে) পৃথক চরিত্রের স্ট্রিংগুলির তালিকা হিসাবে বিবেচনা করা যেতে পারে। মানচিত্রে নেই এমন কোনও অক্ষর nilফলাফলের তালিকার মতো শেষ হবে , যা +আনন্দের সাথে উপেক্ষা করে।


1

পাইথ, 25 বাইট

-Fmsmhy/4@S5%Ck12@Gd_rBz2

প্রদর্শন

এই চিঠি জন্য নিম্নলিখিত ম্যাপিং সূত্র ব্যবহার pbnrq, যদি kচিঠি হল:

(4 / (((chr(k) % 12) % 5) + 1) * 2 + 1

এটি পাইথের প্রতিনিধিত্ব করে:

hy/4@S5%Ck12

প্রথমত, প্রোগ্রামটি ইনপুটটির কেস-অদলিত সংস্করণ তৈরি করে, তারপরে ছোট হাতের অক্ষরের জন্য দুটি স্ট্রিং ফিল্টার করে, তারপরে উপরের সূত্রটি প্রয়োগ করে, তারপর সাদা মানগুলি থেকে কালো মানগুলি যোগ করে এবং বিয়োগ করে।


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