Đánh giá điểm số dựa trên chuỗi FEN cờ vua


17

Thử thách

Forsyth Kiếm Edwards Notation (FEN) là một ký hiệu chuẩn để mô tả một vị trí bàn cờ cụ thể của một ván cờ. Thử thách của bạn là đánh giá điểm số bằng chuỗi FEN. Đây là một ví dụ về chuỗi FEN:

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

Sử dụng chuỗi này, bạn có thể tính điểm vật liệu cho từng màu với bảng điểm sau:

  • p / P = Cầm đồ = 1 điểm
  • n / N = Hiệp sĩ = 3 điểm
  • b / B = Giám mục = 3 điểm
  • r / R = Rook = 5 điểm
  • q / Q = Nữ hoàng = 9 điểm
  • k / K = King, những vị trí này không có bất kỳ điểm nào vì mọi vị trí pháp lý đều có một vị vua cho mỗi bên

Các mảnh màu trắng được chỉ định bằng chữ in hoa ("PNBRQK") trong khi các mảnh màu đen sử dụng chữ thường ("pnbrqk"). Hình vuông trống được ghi chú bằng cách sử dụng các chữ số từ 1 đến 8 (số lượng hình vuông trống) và "/" phân tách các cấp bậc.

Từ chuỗi FEN mẫu, chúng ta có thể tính điểm vật liệu cho mỗi bên:

Đối với màu đen:

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

Tất cả các mảnh màu đen còn lại: p + p + p + p + r, đây là tổng cộng 9

Đối với màu trắng:

5k2 / ppp5 / 4 P 3/3 R 3p / 6 P 1/1 K 2 N r2 / PP 3 P 2/8

Tất cả các mảnh màu trắng còn lại: P + R + P + N + P + P + P, đây là tổng cộng 13

Điểm cuối cùng được xác định theo công thức sau: Điểm trắng - Điểm đen = Điểm cuối cùng , vì vậy, ví dụ, điểm cuối cùng sẽ là: 13 - 9 = 4

Ví dụ :

Đầu vào:

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

Đầu ra:

4

Tất cả các quy tắc áp dụng ở đây, giải pháp có số byte ít nhất sẽ thắng.


Cách đăng bài

# Language Name, N bytes

 [code]

 [explaination, etc.]

3
Vì vậy, vị trí thực tế không quan trọng? Bạn chỉ cần đếm các chữ cái trong chuỗi?
xnor

4
Nitpick: Đó không phải là một chuỗi FEN hoàn chỉnh. Ngoài ra, kr1NQQQQ / 2rNQQQQ / 3NQQQQ / 3NQQQQ / 3NQQQQQ / 3NQQQQ / 3NQQQQ / K2NQQQQ có chiến thắng cho màu trắng, với màu đen để di chuyển? : P
Doorknob

@xnor Vâng, tôi nghĩ rằng nếu đánh giá cũng dựa trên chiến lược, nó sẽ trở nên quá phức tạp. Bạn cũng có thể cho rằng tất cả các yếu tố đầu vào là vị trí hợp pháp, vì vậy đừng lo lắng về điều đó.
Ad Nam

@Doorknob, vâng, điểm số chỉ là vật chất để đơn giản hóa mọi thứ
Adnan

Câu trả lời:


3

CJam, 28 27 26 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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 byte

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

(-7 byte với một số nguồn cảm hứng từ câu trả lời của @ El'endiaStarman, -3 byte nhờ @randomra)

Giải trình

Chương trình sử dụng codebox như một bảng tra cứu. Các lệnh đặt / phạm vi ngoài phạm vi không hoạt động với trình thông dịch trực tuyến, do đó, điều này chỉ hoạt động với trình thông dịch Python chính thức.

Dòng đầu tiên đẩy các mảnh, tiếp theo là các giá trị mảnh. Nó cũng đẩy 0 ban đầu để khởi động tổng số cho dòng thứ ba.

Dòng thứ hai sau đó đặt giá trị dương hoặc âm thích hợp tại ô mảnh tương ứng, ví dụ: -1được đặt tại ('p', 4)1được đặt ('P', 4). Độ dài của ngăn xếp được kiểm tra để đảm bảo vòng lặp chạy 5 lần.

Sau khi vòng lặp kết thúc, ngăn xếp bao gồm số 0 duy nhất của chúng ta từ dòng đầu tiên. Đối với mỗi char, chúng tôi thực hiện tra cứu tại ô tương ứng trong bảng và thêm nó vào tổng số của chúng tôi. Theo mặc định, các giá trị ô chưa được khởi tạo là 0, hoàn hảo cho mục đích của chúng tôi.

Dòng cuối cùng chỉ in kết quả.


4

Ruby, 88 ký tự

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

Điều này thật khó xử và xấu xí, và có lẽ có một cách tốt hơn, nhưng ồ.

{foo: 'bar'}Cú pháp của Ruby thực sự chỉ là đường đối với tinh thần đối {:foo => 'bar'}với môn gôn vì điều đó có nghĩa là tôi phải chuyển đổi khóa thành biểu tượng trước khi sử dụng nó để truy cập phần tử băm ( :"#{x}"ngắn hơn một ký tự x.to_sym).


4

Pip, 39 byte

Tôi sẽ lần lượt dẫn đầu trước khi câu trả lời của CJam và Pyth xuất hiện ...

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

Lấy chuỗi FEN làm đối số dòng lệnh. Đây là một lời giải thích cho một phiên bản hơi vô căn cứ:

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

Perl, 44 byte

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

Đếm shebang là một, đầu vào được lấy từ stdin.


Sử dụng mẫu

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

Giải trình

Các mảnh được phiên âm với các giá trị tương ứng của họ. Nếu mảnh được viết hoa (tức là nhỏ hơn a), giá trị của nó được thêm vào tổng, nếu không nó bị trừ đi.


3

JavaScript ES7, 79 byte 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)

Càng ngắn càng tốt. Sử dụng sự hiểu biết mảng ưa thích, để lặp qua chuỗi.

Giải trình

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

Chồn 0,9 , 72 65 64 60 44 42 41 byte

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

Hãy thử nó ở đây.

Rất cám ơn Sp3000 đã chỉ ra một cách hiệu quả hơn nhiều để làm điều này!

Giải trình

13359"QRBNP"mđẩy điểm số và các ký tự tương ứng của chúng, sau đó xen kẽ chúng, vì vậy ngăn xếp trông như thế này : [1,80,3,78,3,66,5,82,9,81]. Sau đó 5[d3~c~$r48*+0p0p]đặt điểm của từng ký tự, cả chữ thường và chữ hoa, tại vị trí của nó trong không gian mã. Cuối cùng, $I[o0q+]N.vòng lặp thông qua đầu vào cho đến khi nó trống, cộng điểm số khi nó đi cùng.



2

Ouroboros , 82

Ouroboros là một esolang tôi thiết kế trong tuần này. Thời gian để đưa nó cho một spin!

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

Mỗi dòng lệnh đơn char 1 đại diện cho một con rắn ouroboros, trong đó việc thực hiện tiến hành từ đầu (bắt đầu) đến đuôi (kết thúc) và vòng lặp trở lại đầu. Các lệnh ()lệnh cho phép bạn ăn một phần đuôi hoặc lấy lại nó, do đó thay đổi những lệnh nào được thực thi. Nếu con trỏ lệnh bị nuốt, rắn sẽ chết (dừng thực thi). Một chương trình Ouroboros bao gồm một hoặc nhiều con rắn thực thi song song. Mỗi con rắn có một chồng riêng, và cũng có một ngăn xếp chung.

1 Một ngoại lệ, phân biệt Ouroboros với nhiều ngôn ngữ 2D: số nhiều chữ số có thể được viết đơn giản, không cần phải làm toán hoặc đẩy số 0 trước.

Rắn 1

Con rắn đầu tiên đọc một ký tự ( i) và kiểm tra xem đó là -1 / EOF ( .1+!). Nếu vậy, nó ăn phần lớn đuôi của nó, lên đến và bao gồm cả M(57*( ).

Con rắn sau đó hoán đổi mã ký tự với số liệu nằm trên nó trên ngăn xếp (\ ), di chuyển kiểm đếm sang ngăn xếp chung ( m) và nuốt một ký tự khác ( 1(). Nếu nó đã nuốt một bó, điều này có nghĩa là nó nuốt (phải IP hiện đang bật và chết. Mặt khác, việc thực hiện được tiến hành bằng cách di chuyển kiểm đếm trở lại ngăn xếp của rắn 1, hoán đổi nó bằng mã char và hồi sinh nhân vật đã bị nuốt trước đó ( M\1)).

Sau đó chúng tôi sử dụng các phép toán và ngăn xếp toán học để tạo ra số điểm thích hợp cho nhân vật. .96>kiểm tra xem nó có chữ thường hay không; các 32*-chuyển đổi tiếp theo thành chữ hoa. Sau đó kéo dài từ .80=đến 81=9*++++bản đồ P-> 1,N -> 3, v.v ... Cuối cùng, \2*1\-*phủ nhận điểm nếu chữ cái là chữ thường và +thêm nó vào kiểm đếm đang chạy. Con rắn sau đó lặp lại và đọc một ký tự khác.

Rắn 2

Con rắn thứ hai bắt đầu với một hoạt động hồi quy ( )), lần đầu tiên không có gì xảy ra (vì chưa có gì được nuốt, và kể từ khi bật ra một ngăn xếp trống rỗng 0). Tiếp theo, nó đẩy chiều dài của ngăn xếp được chia sẻ lên ngăn xếp của chính nó và phủ định logic ( L!). Điều này cho 1nếu ngăn xếp trống,0 nếu không. Con rắn nhân 4 và ăn nhiều ký tự ( 4*().

Nếu ngăn xếp được chia sẻ trống, điều này có nghĩa là con rắn bây giờ kết thúc trước S. Nó đẩy 4và vòng trở lại) , nơi nó hồi sinh các nhân vật mà nó vừa nuốt và bắt đầu lại từ đầu.

Tuy nhiên, nếu có một giá trị trên ngăn xếp được chia sẻ, không có ký tự nào bị nuốt và tiếp tục thực thi. Con rắn chuyển sang ngăn xếp chung và xuất số ở đó (Sn ); sau đó nó nuốt nhân vật cuối cùng của nó và chết ( 1().

Đồng bộ hóa

Hai con rắn phải được đồng bộ hóa cẩn thận để không bao giờ có giá trị trên ngăn xếp chung khi rắn 2 thực hiện kiểm tra, cho đến khi kết thúc đầu vào. Snake 1 đặt một giá trị trên ngăn xếp được chia sẻ nhanh chóng trên mỗi lần đi qua vòng lặp của nó. Do đó, Llệnh của rắn 2 không bao giờ được thực hiện giữa lệnh mMlệnh trong rắn 1. May mắn thay, rắn xếp hàng rất tốt. Điều quan trọng, độ dài của vòng lặp của rắn 1 (70 hướng dẫn) là bội số của vòng lặp của rắn 2 (7 hướng dẫn), vì vậy cả hai sẽ không bao giờ thoát khỏi sự đồng bộ:

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

Nếu các con số không hoạt động hoàn hảo, tôi sẽ đệm một hoặc cả hai con rắn có khoảng trống để làm cho chúng thẳng hàng khi cần.

Tất cả điều này là rất tốt, nhưng tôi muốn thấy nó trong hành động!

Đây là chương trình trên thông qua Stack Snippet. Ngay cả trên 1000 thao tác mỗi giây, sẽ mất khoảng 10 giây để đưa ra câu trả lời cho đầu vào mẫu - nhưng nó đã đạt được điều đó!


2

JavaScript ES6, 71

Là một chức năng ẩn danh

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

2

Perl 5, 71 63 byte

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

Điều này sửa đổi $\(dấu phân cách dòng print, bắt đầu sai) cho mỗi chữ số trong chuỗi đó là khóa của hàm băm %ađược xác định ở đầu. Nó tăng $\theo giá trị của hàm băm nếu chữ cái là một khóa; mặt khác, nó tăng theo âm giá trị của giá trị băm nếu chữ cái viết hoa là một khóa; nếu không thì nó chẳng thêm gì.

Rất cám ơn primo đã tiết kiệm cho tôi tám byte (trong một bình luận về câu trả lời này).


Tôi có thể lưu một byte khác với một đề nghị khác từ primo (cảm ơn!): Thay đổi $a{$_}||-$a{uc$_}thành $a{$_}-$a{$"^$_}. Nhưng đó là một câu trả lời khá khác so với tôi, tôi nghĩ vậy, vì vậy tôi sẽ không lấy "tín dụng" (của byte1 byte) cho nó.


1

Clojure / ClojureScript, 63 ký tự

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

Được viết bằng ClojureScript REPL, cũng phải là Clojure hợp lệ. Hãy thử nó ở đây . Nhập nó, sau đó gọi nó bằng cách sử dụng(*1 "FEN_string_here")

Khá đơn giản. {"P"1..."q"-9}là cấu trúc dữ liệu theo nghĩa đen của bản đồ "P" đến 1, "N" đến 3, v.v., maplấy chức năng làm đối số đầu tiên và cấu trúc dữ liệu để xử lý như thứ hai - trong trường hợp này, nó sử dụng tính năng đó một cấu trúc dữ liệu (bản đồ bằng chữ) có thể hoạt động như chức năng truy cập của chính nó. Tham số chuỗi ( %từ macro chức năng) có thể được coi là danh sách các chuỗi ký tự riêng lẻ. Bất kỳ nhân vật nào không có trong bản đồ sẽ kết thúc như niltrong danh sách kết quả, mà +vui vẻ bỏ qua.


1

Bình thường, 25 byte

-Fmsmhy/4@S5%Ck12@Gd_rBz2

Trình diễn

Cái này sử dụng công thức ánh xạ sau cho các chữ cái trong pbnrq, nếu klà chữ cái:

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

Điều này được thể hiện trong Pyth như:

hy/4@S5%Ck12

Đầu tiên, chương trình tạo phiên bản hoán đổi trường hợp của đầu vào, sau đó trên cả hai bộ lọc chuỗi cho các chữ cái viết thường, sau đó áp dụng công thức trên, sau đó tính tổng và trừ các giá trị đen từ các giá trị trắng.


1

Con trăn 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()))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.