8-бітовий підрахунок шахових пікселів


20

Мета

Ви граєте в комп'ютерну шахову гру. Дисплей лише в чорно-білому кольорі, а пікселі - чіткі. Білі пікселі використовують багато енергії в порівнянні з чорними пікселями, і ви стурбовані своїм вуглецевим слідом.

Враховуючи квадрат і шматок у шахових позначеннях, поверніть кількість білих пікселів, що відображаються у квадраті.

Рішення може бути у вигляді функції або повноцінної програми.

Вхідні дані

4-символьний рядок, що визначає:

  1. Один wbдля білого чи чорного шматка. (Не є частиною звичайних шахових позначень, але необхідна для цієї головоломки.)
  2. Один з KQBNRPдля короля, королеви, єпископа, kNight, ладья або пішака.
  3. Один із abcdefghфайлів (стовпців).
  4. Один 12345678за ранг твору (ряд).

Вихідні дані

Кількість білих пікселів, які використовуються для малювання шахової фігури та нижнього квадрата.

Вимоги

  • Шахові квадрати мають розмір 8х8 пікселів, або всі білі, або всі чорні.
  • a1 - чорний квадрат.
  • Білі шахові фігури намальовані як білі з чорним контуром. Чорні шматки чорні з білим контуром. Усі фрагменти мають прозорі пікселі, на яких зображений нижній квадрат.
  • Вхідні дані залежать від регістру.
  • Припустимо, введення є дійсним.

Шахові фігури мають спрайти наступним чином.
.- колір шматка.
#- зворотний колір шматка.
/- колір нижнього квадрата.

King        Queen       Bishop  
////////    ////////    ////////
///#.#//    /#.#.#.#    ///#.#//
//#...#/    //#...#/    //##..#/
///#.#//    ///###//    //#.#.#/
///###//    //#...#/    ///###//
//#...#/    //#...#/    //#...#/
//#...#/    //#...#/    //#...#/
//#.#.#/    //#.#.#/    //#.#.#/

kNight      Rook        Pawn    
////////    ////////    ////////
////////    /#.#.#.#    ////////
//#..#//    /#.....#    ////////
/#....#/    /##...##    ///#.#//
///#..#/    //#...#/    //#...#/
//#..#//    //#...#/    ///#.#//
//#...#/    //#...#/    //#...#/
//#...#/    //#...#/    //#...#/

Кількість пікселів у кольорі шматка, обриси шматка та нижній квадрат для кожного твору:

Piece    Fill  Outline  Square
==============================
King     13    16       35
Queen    17    18       29
Bishop   13    18       33
Knight   16    12       36
Rook     23    18       23
Pawn     11    10       43

Випробування

Input  Output
wRa1   23
bRa1   18
wPc2   54
bKg8   51

Оцінка балів

Найкоротший код у байтах до Різдва Христового отримує дещо зайве у їхньому складі.

Відповіді:


2

Піта, 54 53 байти

Код містить недруковані символи, тому ось оборотний xxdшістнадцятковий набір:

0000000: 732a 562b 5f57 2543 687a 322c 3031 2573  s*V+_W%Chz2,01%s
0000010: 434d 7474 7a32 4063 434d 2e22 0a2b 011e  CMttz2@cCM.".+..
0000020: d699 71d0 c6dc 3db8 eeae 2233 252a 4368  ..q...=..."3%*Ch
0000030: 747a 5433 31                             tzT31

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

s*V+_W%Chz2,01%sCMttz2@cCM."\n+\x01\x1e\xd6\x99q\xd0\xc6\xdc=\xb8\xee\xae"3%*ChtzT31

6

C # 6, 107 байт

Ось моя власна відповідь. Я не сподіваюсь, що будь-який момент буде тим, хто поставив виклик.

Я взяв деяке натхнення з відповіді користувача81655 .

long P(string a)=>(a[0]>99?12201284685:11042628752)+(a[2]+a[3])%2*46566348643>>"KQBNRP".IndexOf(a[1])*6&63;

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

На щастя, прецедент операції сильно працював на мою користь.


5

JavaScript (ES6), 106

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

x=>(o=+'137999'[p='PNKBQR'.search(x[1])],f=+'262149'[p]+p,(parseInt(x[2]+x[3],19)%2?9:55-f-o)+(x>'w'?f:o))

На сьогодні я дотримуюся найпростішого способу пошуку відповіді з розрахунком - це може бути не найкращий спосіб.

Над чорним квадратом відповідь - це розмір заливки для білих шматочків та розмір контуру для чорних шматочків. Поверх білого квадрата потрібно додати вільного місця. Дивіться таблицю нижче (всередині фрагмента)

Я зберігаю розмір заливки та контуру для кожного фрагмента, вільний простір всередині квадрата можна знайти віднімаючи від 64. Для економії місця контур зберігається як одноцифрова афера віднімання 9. Заповнення складніше, чим діапазон ширший , перевірте код (таким чином шматки сортуються за зайнятим простором)

Фрагмент тесту:

F=x=>(
  o=+'137999'[p='PNKBQR'.search(x[1])], // get outline - 9
  f=+'262149'[p]+p, // get fill -9
  (
    parseInt(x[2]+x[3],19) // parse with an odd base the differentiate between odd and even rows
    %2?9:55-f-o // black square if odd,, white if even so calc free space
  ) +(x>'w'?f:o) // add fill or outline based on piece color
)

// Test suite

console.log=x=>O.innerHTML+=x+'\n'

for(i=0; z='PNKBQR'[i]; i++)
{
  o = '';
  t = 'w'+z+'c2'; // white piece, white square
  o += t+' '+F(t)+', '
  t = 'b'+z+'c2'; // black piece, white square
  o += t+' '+F(t)+', '
  t = 'w'+z+'a1'; // white piece, black square
  o += t+' '+F(t)+', '
  t = 'b'+z+'a1'; // black piece, black square
  o += t+' '+F(t)
  console.log(o);
}
<pre>
Piece    Fill  Outline  Free  w/w b/w w/b b/b
=============================================
Pawn     11    10       43     54  53  11  10
Knight   16    12       36     52  48  16  12
King     13    16       35     48  51  13  16
Bishop   13    18       33     46  51  13  18
Queen    17    18       29     46  47  17  18
Rook     23    18       23     46  41  23  18
</pre>    
<pre id=O></pre>


3

JavaScript (ES6), 135 112 байт

s=>(c={K:`\u000a\u0010\u0023`,Q:`\u0011\u0012\u001d`,B:`\u000a\u0012\u0021`,N:`\u0010\u000c\u0024`,R:`\u0017\u0012\u0017`,P:`\u000b\u000a\u002b`}[s[1]])[f="charCodeAt"](s<"w")+((s[f](2)-s[3])%2&&c[f](2))

Кожен \u00xx має бути однобайтовим символом. Вони представлені тут як коди, оскільки Stack Exchange автоматично видаляє нечитабельні символи з публікацій.

Пояснення

s=>

  // c = string of three (mostly unreadable) characters, the ASCII code of each character
  //     represents the number of pixels in the fill, outline and square respectively
  (c={
    K:`\u000a\u0010\u0023`,
    Q:`\u0011\u0012\u001d`,
    B:`\u000a\u0012\u0021`,
    N:`\u0010\u000c\u0024`,
    R:`\u0017\u0012\u0017`,
    P:`\u000b\u000a\u002b`
  }[s[1]])

  [f="charCodeAt"](s<"w") // if piece is black add outline pixels, else add fill pixels
  +((s[f](2)-s[3])%2      // this returns 1 if the square is white or 0 if black
    &&c[f](2))            // if the square is white add the square's pixels

Тест


1

Луа, 158 155 байт

c,p,l,n=(...):byte(1,4)m="KQBNRP"d={}d[1]={13,17,13,16,23,11}d[0]={16,18,18,12,18,10}p=m:find(string.char(p))print(d[c%2][p]+(l+n)%2*(64-d[0][p]-d[1][p]))

Можливо, можливо, зменшиться кількість байтів, кодуючи дані, але мені якось подобається метод поточної таблиці.

Колір квадрата базується на значенні ASCII 'w' або 'b', використовуючи той факт, що один парний, а один непарний. Призначає ціле значення фрагмента на основі положення символу шматка в mрядковій змінній. Будь темний або світлий квадрат обробляється(l+n)%2 використовуючи значення ASCII знову.

Безумовно

c,p,l,n=(...):byte(1,4)   --stores input of all characters into variables
m="KQBNRP"                --piece encoded string
d={}                      --data table
d[1]={13,17,13,16,23,11}  --fill
d[0]={16,18,18,12,18,10}  --outline
p=m:find(string.char(p))  --position in string for position in tables
print(d[c%2][p] +         --takes data element from corresponding table according to color of piece and type of piece
     (l+n)%2  *           --is square black or white? 0 if back, 1 if white
     (64-d[0][p]-d[1][p]) --if white, pixels not used by piece would be area (64) minus pixels used by piece, or corresponding data in the tables
     )

-3 байти, видаляючи c=c%2перед printі використовуючи d[c%2][p]замість цього d[c][p].

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