Оцінка результатів на основі шахового рядка FEN


17

Виклик

Нота Форсайта-Едвардса (FEN) - це стандартне позначення для опису певної позиції на дошці в шаховій грі. Ваше завдання полягає в оцінці балів за допомогою рядка FEN. Це приклад рядка FEN:

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

Використовуючи цей рядок, ви можете обчислити матеріальну оцінку для кожного кольору за допомогою наступної таблиці результатів:

  • p / P = пішак = 1 бал
  • п / п = лицар = 3 бали
  • б / В = Бішоп = 3 бали
  • r / R = Грак = 5 балів
  • q / Q = Королева = 9 балів
  • k / K = Кінг, вони не мають жодних балів, оскільки кожна юридична позиція містить короля для кожної сторони

Білі шматки позначаються великими літерами ("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
Нітпік: Це не повний рядок FEN. Також, kr1NQQQQ / 2rNQQQQ / 3NQQQQ / 3NQQQQ / 3NQQQQ / 3NQQQQ / 3NQQQQ / K2NQQQQ виграє білий, з чорним рухається? : P
Дверна ручка

@xnor Так, я думаю, якщо оцінка також буде стратегічно заснована, це стане занадто складним. Ви також можете припустити, що всі матеріали є юридичними позиціями, тому не хвилюйтеся з цього приводу.
Аднан

@Doorknob, так, оцінка є лише матеріалом, заснованим на спрощенні речей
Аднан

Відповіді:


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

(-7 байт з деяким натхненням з відповіді @ El'endiaStarman, -3 байти завдяки @randomra)

Пояснення

Програма використовує кодове поле як таблицю пошуку. Поза межами діапазону "ставить / отримує" не працює з онлайн-перекладачем, тому це працює лише з офіційним інтерпретатором Python.

Перший рядок проштовхує шматки, а потім - значення шматка. Це також штовхає початковий 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 як аргумент командного рядка. Ось пояснення щодо злегка не зосередженої версії:

$+({(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 байти

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

Підрахувавши шебанг як один, вхід береться з stdin.


Використання зразків

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

Пояснення

Шматки транслітеруються з відповідними значеннями. Якщо шматок складається з великої літери (тобто менше a), його вартість додається до суми, якщо ні - віднімається.


3

JavaScript 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"mвиштовхують бали і відповідні їм символи, а потім чергують їх, так що стек виглядає наступним чином : [1,80,3,78,3,66,5,82,9,81]. Потім 5[d3~c~$r48*+0p0p]ставить бал кожного символу, як малого, так і великого, у його місце в кодовому просторі. Нарешті, $I[o0q+]N.проведіть цикл через вхід, поки він не порожній, додаючи бали під час проходження.



2

Уроборос , 82

Ouroboros - це езоланг, який я розробив цього тижня. Час взяти це за спину!

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 Один виняток, який відрізняє Уробороса від багатьох двовимірних мов: багатоцифрові числа можна писати прямо, без того, щоб робити математику чи натискати 0 спочатку.

Змія 1

Перша змія зчитує символ ( i) і перевіряє, чи -1 / EOF ( .1+!). Якщо так, він з'їдає більшу частину хвоста, аж до M( 57*().

Потім змія поміняє код символу на підрахунок, який знаходиться над ним на стеці ( \), перемістить таблицю на спільний стек ( m) і проковтує інший символ ( 1(). Якщо він уже проковтнув купу, це означає, що він проковтне той (факт, що IP зараз увімкнено, і гине. В іншому випадку виконання відбувається шляхом переміщення талію назад до стека змії 1, замінивши його char-кодом та повторно регулюючи характер, який раніше був проковтнутий ( 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 робить свою перевірку, до кінця введення. Snake 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

Якби цифри не спрацювали так ідеально, я б проклав одну або обидві змії пробілами, щоб вони вирівнялися за потребою.

Все це дуже добре, але я хочу бачити це в дії!

Ось наведена вище програма через Stack Snippet. Навіть на 1000 операцій в секунду потрібно 10 хвилин, щоб виплюнути відповідь на зразок введення - але він дійсно туди потрапляє!


2

JavaScript ES6, 71

Як анонімна функція

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 байт

%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

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

Спочатку програма створює регістр вводу, що змінюється регістром, потім на обох рядках фільтрує малі літери, потім застосовує вищевказану формулу, потім підсумовує і віднімає чорні значення з білих значень.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.