8位国际象棋像素计数


20

目标

您正在玩电脑象棋游戏。显示屏仅以黑白显示,并且像素块状。与黑色像素相比,白色像素耗电量大,您担心碳足迹。

给定一个正方形和一个国际象棋符号,返回在正方形中显示的白色像素数。

解决方案可以是功能或完整程序的形式。

输入值

4个字符的字符串,定义:

  1. 一的wb用于白色或黑色片。(这不是正常的国际象棋符号的一部分,但此难题是必需的。)
  2. 其中的KQBNRP一个国王,王后,主教,骑士,鲁克或典当。
  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

计分

到圣诞节为止,最短的字节代码会增加一些库存。

Answers:


2

Pyth,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个字节

这是我自己的答案。我不希望提出任何挑战。

我从user81655的答案中得到了一些启发。

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

Lua中,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
     )

通过c=c%2在之前删除print并使用d[c%2][p]代替-3字节d[c][p]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.