체스 FEN 문자열을 기반으로 점수 평가


17

도전

Forsyth–Edwards Notation (FEN)은 체스 게임의 특정 보드 위치를 설명하기위한 표준 표기법입니다. 도전 과제는 FEN 문자열을 사용하여 점수를 평가하는 것입니다. 다음은 FEN 문자열의 예입니다.

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

이 문자열을 사용하여 다음 점수 표를 사용하여 각 색상의 재료 점수를 계산할 수 있습니다.

  • p / P = 폰 = 1 포인트
  • n / N = 기사 = 3 점
  • b / B = 비숍 = 3 점
  • r / R = 루크 = 5 점
  • q / Q = 여왕 = 9 점
  • k / K = King, 모든 법적 입장에는 각 측면에 대한 왕이 포함되어 있기 때문에 점수가 없습니다.

흰색 부분은 대문자 ( "PNBRQK")를 사용하여 지정하고 검은 부분은 소문자 ( "pnbrqk")를 사용합니다. 빈 사각형은 1에서 8까지의 숫자 (빈 사각형 수)를 사용하여 기록되며 "/"는 순위를 구분합니다.

예제 FEN 문자열에서 각면의 재료 점수를 계산할 수 있습니다.

검은 색의 경우 :

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

남은 모든 검은 조각 : p + p + p + p + r, 이것은 총 9입니다

흰색의 경우 :

5k2 / ppp5 / 4 P 3/3 R 3p / 6 P 1/1 K 2 N r2 / PP 3 P 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
Nitpick : 완전한 FEN 문자열이 아닙니다. 또한 kr1NQQQQ / 2rNQQQQ / 3NQQQQ / 3NQQQQNNQQQ / 3NQQQQ / 3NQQQQ / K2NQQQQ 는 흰색으로 바뀌고 검은 색으로 이동합니까? : P
Doorknob

@xnor 그렇습니다. 평가가 전략적으로 이루어지면 너무 복잡해집니다. 또한 모든 입력이 합법적 인 위치라고 가정 할 수 있으므로 걱정하지 마십시오.
Adnan

@Doorknob, 예, 점수는 사물을 단순화하기위한 자료 일뿐입니다
Adnan

답변:


3

CJam, 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~<;

(@ El'endiaStarman의 답변에서 영감을 얻은 7 바이트, @randomra 덕분에 -3 바이트)

설명

프로그램은 코드 상자를 찾아보기 테이블로 사용합니다. 범위를 벗어난 풋 / 겟은 온라인 인터프리터에서 작동하지 않으므로 공식 파이썬 인터프리터에서만 작동합니다.

첫 번째 줄은 조각을 누른 다음 조각 값을 밀어 넣습니다. 또한 초기 0을 밀어 세 번째 줄의 합계를 시작합니다.

두번째 라인은 예를 들면, 해당 부재 셀에 적절한 양 또는 음의 값을두고 -1배치되고 ('p', 4)그리고 1배치된다 ('P', 4). 스택의 길이는 루프가 5 번 실행되는지 확인합니다.

루프가 끝나면 스택은 첫 번째 줄의 단일 0으로 구성됩니다. 각 문자마다 테이블의 해당 셀을 조회하여 총계에 추가합니다. 기본적으로 초기화되지 않은 셀 값은 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}{

shebang을 하나로 계산하여 입력을 stdin에서 가져옵니다.


샘플 사용법

$ 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

Minkolang 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 의 각 줄은 우로 보로스 스네이크를 나타내며, 실행은 헤드 (시작)에서 테일 (끝)까지 진행하고 헤드로 다시 루프됩니다. ()명령에 따라서 명령이 실행 얻을 무엇을 변경, 당신은 꼬리의 일부를 먹거나을 역류 할 수 있습니다. 명령 포인터를 삼킨 경우 뱀이 죽습니다 (실행 중지). Ouroboros 프로그램은 동시에 실행되는 하나 이상의 뱀으로 구성됩니다. 각 뱀에는 자체 스택이 있으며 공유 스택도 있습니다.

1 Ouroboros를 여러 2D 언어와 구별하는 한 가지 예외 : 수학을하거나 0을 먼저 누르지 않고도 여러 자리 숫자를 간단하게 작성할 수 있습니다.

뱀 1

첫 번째 뱀은 문자 ( i)를 읽고 -1 / EOF ( .1+!) 인지 확인합니다 . 그렇다면 꼬리의 대부분을 M( 57*() 까지 포함하여 먹습니다 .

그런 다음 뱀은 문자 코드를 스택 위에있는 탈리와 바꾸고 ( \), 탈리를 공유 스택으로 옮기고 ( m) 다른 캐릭터를 삼킨다 ( 1(). 이미 묶음을 삼킨 경우 (IP가 현재 켜져 있고 죽었다는 것을 삼킨다는 의미 입니다. 그렇지 않으면, 탈리를 뱀 1의 스택으로 다시 옮기고, 그것을 문자 코드와 교체하고, 이전에 삼킨 캐릭터를 역류시킴으로써 실행이 진행됩니다 ( M\1)).

그런 다음 수학 및 스택 연산을 사용하여 캐릭터에 적절한 점수를 생성합니다. .96>소문자인지 테스트합니다. 후속 32*-은 대문자로 변환됩니다. 그런 다음에서 먼 장래 .80=81=9*++++지도 P-> 1, N-> 3, 등 마지막으로, \2*1\-*문자가 소문자로 된 경우 점수를 부정하고, +실행 집계에 추가합니다. 그런 다음 뱀은 반복해서 다른 문자를 읽습니다.

뱀 2

두 번째 뱀은 역류 작업 ( ))으로 시작합니다.이 작업 은 처음으로 아무것도 수행하지 않습니다 (아무것도 삼키지 않았고 빈 스택을 터뜨리기 때문에 0). 그런 다음 공유 스택의 길이를 자체 스택으로 푸시하고 논리적으로 무효화합니다 ( L!). 1스택이 비어 있으면 제공 합니다 0. 뱀은 4를 곱하고 많은 문자를 먹는다 ( 4*().

공유 스택이 비어 있으면 뱀이 이제 S. 그것은 방금 삼킨 캐릭터들을 역류시키고 다시 시작하는 곳으로 밀고 4되돌아 간다 ).

그러나 공유 스택에 값이 있으면 문자가 삼키지 않고 실행이 계속됩니다. 뱀은 공유 스택으로 전환하여 숫자를 출력합니다 ( Sn). 그런 다음 마지막 특성을 삼키고 죽습니다 ( 1().

동기화

두 뱀은 입력이 끝날 때까지 뱀 2가 점검 할 때 공유 스택에 값이 없도록주의해서 동기화해야합니다. 스네이크 1은 루프를 통과 할 때마다 공유 스택에 값을 간단히 넣습니다. 따라서 뱀 2의 L명령은 뱀 1의 명령 mM명령 사이에서 실행되어서는 안됩니다 . 다행히도 뱀은 아주 잘 정렬되어 있습니다. 결정적으로 뱀 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

숫자가 그렇게 완벽하게 해결되지 않았다면, 필요에 따라 정렬하기 위해 하나 또는 두 개의 뱀을 공백으로 채웠을 것입니다.

이 모든 것이 매우 좋지만 실제로 작동하고 싶습니다!

다음은 Stack Snippet을 통한 위의 프로그램입니다. 초당 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,를 시작하여 false)를 수정합니다 %a. $\문자가 그대로 키이면 해시 값만큼 증가 합니다. 그렇지 않으면 대문자가 키인 경우 해시 값을 음수로 증가시킵니다 . 그렇지 않으면 아무것도 추가하지 않습니다.

8 바이트를 절약 해 준 primo 에게 감사 의 말을 전합니다 (이 답변에 대한 의견).


나는 프리모에서 다른 제안에 다른 바이트를 저장할 수 있습니다 (감사합니다!) : 변화 $a{$_}||-$a{uc$_}에를 $a{$_}-$a{$"^$_}. 그러나 그것은 내 것과는 다른 대답이라고 생각합니다. 그래서 나는 "-1 바이트의"신용을 취하지 않을 것입니다.


1

Clojure / ClojureScript, 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}"P"-1, "N"-3 등의 맵에 대한 데이터 구조 리터럴 map은 함수를 첫 번째 인수로 사용하고 데이터 구조를 두 번째로 처리합니다.이 경우에는 다음과 같은 기능을 사용합니다. 데이터 구조 (맵 리터럴)는 자체 접근 자 기능으로 작동 할 수 있습니다. %함수 매크로 의 문자열 매개 변수 는 개별 문자열 목록으로 취급 될 수 있습니다. 맵에없는 문자 nil는 결과 목록 과 같이 끝나게 되어 +행복하게 무시합니다.


1

Pyth, 25 바이트

-Fmsmhy/4@S5%Ck12@Gd_rBz2

데모

문자 pbnrq인 경우의 문자에 대해 다음 맵핑 공식을 사용합니다 k.

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

이것은 Pyth에서 다음과 같이 표현됩니다 :

hy/4@S5%Ck12

먼저, 프로그램은 대소 문자를 바꾼 입력 버전을 만든 다음 두 문자열에서 모두 소문자를 필터링 한 다음 위의 수식을 적용한 다음 검정 값을 합산하여 흰색 값에서 뺍니다.


1

파이썬 3, 93

v=dict(zip('pbnrqPBNRQ',[1,3,3,5,9]*2))
print(sum(v.get(c,0)*(-1)**(c>'Z')for c in input()))
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.