शतरंज FEN स्ट्रिंग से आधारित स्कोर का मूल्यांकन


17

चुनौती

Forsyth- एडवर्ड्स संकेतन (FEN) एक शतरंज खेल की किसी विशेष बोर्ड स्थिति का वर्णन करने के लिए एक मानक संकेतन है। आपकी चुनौती FEN स्ट्रिंग का उपयोग करके स्कोर का मूल्यांकन करना है। यह FEN स्ट्रिंग का एक उदाहरण है:

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

इस स्ट्रिंग का उपयोग करके, आप निम्न अंक तालिका के साथ प्रत्येक रंग के लिए सामग्री स्कोर की गणना कर सकते हैं:

  • p / P = प्यादा = 1 अंक
  • n / N = नाइट = 3 अंक
  • b / B = बिशप = 3 अंक
  • r / R = Rook = 5 अंक
  • क्यू / क्यू = रानी = ९ अंक
  • k / K = King, इनका कोई मतलब नहीं है क्योंकि प्रत्येक कानूनी स्थिति में प्रत्येक पक्ष के लिए एक राजा होता है

सफेद टुकड़ों को ऊपरी-केस अक्षरों ("PNBRQK") का उपयोग करके नामित किया जाता है जबकि काले टुकड़े लोअरकेस ("pnbrqk") का उपयोग करते हैं। खाली वर्गों को अंक 8 (खाली वर्गों की संख्या) के माध्यम से 1 का उपयोग करके नोट किया जाता है, और "/" रैंक को अलग करता है।

FEN स्ट्रिंग के उदाहरण से, हम प्रत्येक पक्ष के लिए सामग्री स्कोर की गणना कर सकते हैं:

काले रंग के लिए:

5 k 2 / ppp 5 / 4P3 / 3R3 p / 6P1 / 1K2N r 2 / PP3P2 / 8

सभी काले टुकड़े बचे: p + p + p + p + r, यह कुल 9 है

सफेद के लिए:

5k2 / ppp5 / 4 पी 3/3 आर 3p / 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 / K2QQQQ सफेद के लिए जीत रहा है, काले रंग के साथ स्थानांतरित करने के लिए? : पी
दरवाज़े

@xnor हाँ, मुझे लगता है कि यदि मूल्यांकन भी रणनीतिक रूप से आधारित है, तो यह बहुत जटिल हो जाएगा। आप यह भी मान सकते हैं कि सभी इनपुट कानूनी स्थिति हैं, इसलिए इस बारे में चिंता न करें।
अदनान

@ डॉर्कनोब, हाँ, स्कोर केवल चीजों को आसान बनाने के लिए आधारित सामग्री है
अदनान

जवाबों:


3

सीजेएम, 28 27 26 बाइट्स

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

CJam दुभाषिया में इसे ऑनलाइन आज़माएं ।

यह काम किस प्रकार करता है

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 बाइट्स @ El'endiaStarman के उत्तर से कुछ प्रेरणा के साथ, -3 बाइट्स @randomra के लिए धन्यवाद)

व्याख्या

प्रोग्राम कोडबॉक्स का उपयोग लुकअप टेबल के रूप में करता है। आउट-ऑफ-रेंज ऑनलाइन इंटरप्रेटर के साथ काम नहीं करता / करती है, इसलिए यह केवल आधिकारिक पायथन इंटरप्रेटर के साथ काम करता है।

पहली पंक्ति टुकड़ों को धकेलती है, उसके बाद टुकड़ा मान। यह तीसरी लाइन के लिए कुल किक करने के लिए शुरुआती 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 बाइट्स

मैं CJam और Pyth के उत्तर आने से पहले लीड में अपना संक्षिप्त मोड़ लूंगा ...

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

कमांड लाइन तर्क के रूप में FEN स्ट्रिंग लेता है। यहाँ एक थोड़ा ungolfed संस्करण के लिए एक स्पष्टीकरण है:

$+({(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

जावास्क्रिप्ट ईएस 7, 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"mस्कोर और उनके संगत पात्रों को धक्का देता है, फिर उन्हें इंटरलेव करता है, इसलिए स्टैक इस तरह दिखता है [1,80,3,78,3,66,5,82,9,81]:। फिर 5[d3~c~$r48*+0p0p]प्रत्येक चरित्र का स्कोर, लोअरकेस और अपरकेस दोनों को कोड स्थान में उसके स्थान पर रखता है। अंत में, $I[o0q+]N.इनपुट के माध्यम से लूप्स खाली होने तक, स्कोर को जोड़ते हुए जैसे कि यह साथ जाता है।



2

ऑरोबोरोस , 82

ऑरोबोरोस एक एसोलैंग है जिसे मैंने इस सप्ताह डिज़ाइन किया है। स्पिन के लिए इसे लेने का समय!

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

सिंगल-चार कमांड्स 1 की प्रत्येक पंक्ति एक ऑउबोरोस सांप का प्रतिनिधित्व करती है, जिसमें निष्पादन सिर (शुरू) से पूंछ (अंत) तक होता है और वापस सिर पर छोरों। (और )आदेशों आप पूंछ का हिस्सा खाने या यह वमन करते हैं, इस प्रकार बदल रहा है क्या आदेशों निष्पादित हो। यदि निर्देश सूचक को कभी भी निगल लिया जाता है, तो सांप मर जाता है (निष्पादित करना बंद कर देता है)। एक ऑरोबोरोस कार्यक्रम में एक या अधिक सांप होते हैं जो समानांतर में निष्पादित होते हैं। प्रत्येक सांप का अपना एक ढेर होता है, और एक साझा ढेर भी होता है।

1 एक अपवाद, जो कई 2 डी भाषाओं से ऑरोबोरोस को अलग करता है: बहु अंकों को सीधे गणित लिखे बिना या 0 को धक्का दिए बिना लिखा जा सकता है।

साँप १

पहला साँप एक चरित्र पढ़ता है ( i) और जाँचता है कि क्या यह -1 / EOF ( .1+!) है। यदि हां, तो यह M( 57*() और ( सहित ) अपनी अधिकांश पूंछ खाती है ।

साँप तब टैली के साथ वर्ण कोड को स्वैप करता है जो स्टैक पर उसके ऊपर होता है ( \), टैली को साझा स्टैक ( m) में ले जाता है, और दूसरे वर्ण ( 1() को निगलता है । यदि यह पहले से ही एक गुच्छा निगल गया था, तो इसका मतलब है कि यह निगलता है (कि आईपी वर्तमान में चालू है और मर जाता है। अन्यथा, निष्पादन 1 के ढेर पर वापस जाने के लिए टैली को आगे बढ़ाता है, इसे चार कोड के साथ स्वैप करता है, और उस चरित्र को पुन: उत्पन्न करता है जिसे पहले निगल लिया गया था ( M\1))।

फिर हम चरित्र के लिए उचित स्कोर उत्पन्न करने के लिए गणित और स्टैक ऑपरेशन का उपयोग करते हैं। .96>परीक्षण है कि यह लोअरकेस है या नहीं; बाद 32*-में अपरकेस में परिवर्तित हो जाता है। तब से लंबा खिंचाव .80=के 81=9*++++नक्शे P-> 1, N-> 3, आदि अंत में, \2*1\-*स्कोर अगर पत्र लोअरकेस था नकारता है, और +चल रहा है मिलान करने के लिए यह कहते हैं। सांप फिर लूप करता है और दूसरे किरदार को पढ़ता है।

साँप २

दूसरा सांप एक regurgitation ऑपरेशन ( )) के साथ शुरू होता है , जो पहली बार कुछ भी नहीं करता है (क्योंकि कुछ भी नहीं निगल लिया गया है, और तब से जब एक खाली स्टैक देता है 0)। इसके बाद, यह साझा स्टैक की लंबाई को अपने स्वयं के स्टैक पर धकेलता है और तार्किक रूप से नकारात्मक करता है ( L!)। यह देता है 1अगर स्टैक खाली है, 0अन्यथा। सांप 4 से गुणा करता है और कई पात्रों ( 4*() को खाता है ।

यदि साझा स्टैक खाली था, तो इसका मतलब है कि सांप अब से पहले समाप्त हो गया है S। यह 4पीछे की ओर धकेलता और ढलता है ), जहाँ यह पात्रों को पुन: निगल लेता है और फिर से निगल जाता है।

यदि साझा स्टैक पर एक मूल्य था, हालांकि, कोई वर्ण निगल नहीं है और निष्पादन जारी है। सांप साझा ढेर पर स्विच करता है और वहां संख्या को आउटपुट करता है ( Sn); तब यह अपने अंतिम चरित्र को निगल जाता है और मर जाता है ( 1()।

तादात्म्य

दो सांपों को सावधानी से सिंक्रनाइज़ किया जाना चाहिए ताकि सांप के अंत तक पहुंचने पर सांप 2 अपनी जांच करता है, जब साझा स्टैक पर कोई मूल्य नहीं होता है। स्नेक 1 साझा लूप पर प्रत्येक लूप के माध्यम से प्रत्येक पास पर एक मूल्य रखता है। इस प्रकार, साँप 2 के Lआदेश कभी नहीं के बीच निष्पादित किया जाना चाहिए mऔर Mसाँप 1. सौभाग्य में आदेश, सांप बहुत अच्छी तरह से लाइन अप। महत्वपूर्ण रूप से, सांप 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

जावास्क्रिप्ट ईएस 6, 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शुरुआत में परिभाषित हैश की कुंजी है । यह $\हैश के मान से वृद्धि करता है यदि पत्र एक कुंजी है; अन्यथा, यह हैश के मूल्य को नकारात्मक से बढ़ाता है यदि अपरकेस अक्षर एक कुंजी है; अन्यथा यह कुछ नहीं जोड़ता है।

मुझे आठ बाइट्स (इस जवाब पर एक टिप्पणी में) बचाने के लिए प्राइमो के लिए बहुत धन्यवाद ।


मैं Primo से एक और सुझाव के साथ एक और बाइट बचा सकता है (धन्यवाद!): परिवर्तन $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

सबसे पहले, प्रोग्राम इनपुट के केस-स्वैप किए गए संस्करण को बनाता है, फिर लोअरकेस अक्षरों के लिए दोनों स्ट्रिंग्स को फ़िल्टर करता है, फिर उपरोक्त सूत्र को लागू करता है, फिर श्वेत मूल्यों से काले मूल्यों को घटाता और घटाता है।


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