8-битный подсчет шахматных пикселей

20

Цель

Вы играете в компьютерную игру в шахматы. Дисплей только черный и белый, а пиксели короткие. Белые пиксели потребляют больше энергии по сравнению с черными, и вы беспокоитесь о своем углеродном следе.

Учитывая квадрат и фигуру в шахматной записи, верните количество белых пикселей, отображаемых в квадрате.

Решение может быть в форме функции или полной программы.

вход

Строка из 4 символов, определяющая:

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

Выход

Количество белых пикселей, используемых для рисования шахматной фигуры и нижележащего квадрата.

Требования

  • Шахматные квадраты имеют размер 8x8 пикселей и являются либо белыми, либо черными.
  • 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

счет

Самый короткий код в байтах к Рождеству дает немного больше в их запасе.

Hand-E-Food
источник

Ответы:

2

Pyth, 54 53 байта

Код содержит непечатаемые символы, поэтому здесь обратимый xxd hexdump:

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
PurkkaKoodari
источник
6

C # 6, 107 байт

Вот мой собственный ответ. Я не ожидаю, что кто-то бросит вызов.

Я черпал вдохновение из ответа user81655 .

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

Количество пикселей кодируется в 6-битных блоках. Контур или заливка добавляются к квадрату (если он белый). Наконец, 6-битный блок для соответствующей части извлекается.

К счастью, приоритет работы сработал в мою пользу.

Hand-E-Food
источник
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>

edc65
источник
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

Тестовое задание

user81655
источник
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.

Ungolfed

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].

Cyv
источник