Đếm pixel 8-bit


20

Mục tiêu

Bạn đang chơi một ván cờ vi tính. Màn hình chỉ có màu đen và trắng và các pixel bị chunky. Các pixel trắng sử dụng rất nhiều năng lượng so với các pixel đen và bạn lo ngại về lượng khí thải carbon của mình.

Cho một hình vuông và một mảnh trong ký hiệu cờ vua, trả về số pixel màu trắng hiển thị trong hình vuông.

Giải pháp có thể ở dạng hàm hoặc chương trình hoàn chỉnh.

Đầu vào

Chuỗi 4 ký tự xác định:

  1. Một trong những wbcho một mảnh màu trắng hoặc đen. (Không phải là một phần của ký hiệu Tướng thông thường, nhưng bắt buộc cho câu đố này.)
  2. Một trong những KQBNRPcho một vị vua, nữ hoàng, giám mục, kNight, Rook hoặc cầm đồ.
  3. Một trong abcdefghnhững tập tin của mảnh (cột).
  4. Một trong 12345678những thứ hạng của hàng (hàng).

Đầu ra

Số lượng pixel trắng được sử dụng để vẽ quân cờ và hình vuông bên dưới.

Yêu cầu

  • Hình vuông cờ vua là 8 x 8 pixel và đều có màu trắng hoặc đen.
  • a1 là một hình vuông màu đen.
  • Các quân cờ trắng được vẽ như màu trắng với đường viền màu đen. Các mảnh màu đen là màu đen với một phác thảo màu trắng. Tất cả các mảnh có pixel trong suốt hiển thị hình vuông bên dưới.
  • Đầu vào là trường hợp nhạy cảm.
  • Giả sử đầu vào là hợp lệ.

Các quân cờ có sprite như sau.
.là màu của mảnh.
#là nghịch đảo của màu sắc của mảnh.
/là màu của hình vuông bên dưới.

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

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

Số lượng pixel trong màu của mảnh, đường viền của mảnh và hình vuông bên dưới cho mỗi mảnh là:

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

Các trường hợp thử nghiệm

Input  Output
wRa1   23
bRa1   18
wPc2   54
bKg8   51

Chấm điểm

Mã ngắn nhất tính theo byte vào ngày Giáng sinh sẽ có thêm một chút gì đó trong kho của họ.

Câu trả lời:


2

Bình thường, 54 53 byte

Mã này chứa các ký tự không thể in được, vì vậy đây là một xxdhexdump có thể đảo ngược :

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

Ngoài ra, đây là phiên bản thân thiện với bản sao, bạn cũng có thể thử trực tuyến hoặc sử dụng bộ kiểm tra :

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

6

C # 6, 107 byte

Đây là câu trả lời của riêng tôi. Tôi không mong đợi bất kỳ điểm nào là người đặt ra thách thức.

Tôi đã lấy một số cảm hứng từ câu trả lời của user81655 .

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

Số lượng pixel được mã hóa trong các khối 6 bit. Các phác thảo hoặc điền được thêm vào hình vuông (nếu nó màu trắng). Cuối cùng, khối 6 bit cho đoạn thích hợp được trích xuất.

Rất may, ưu tiên hoạt động đã làm việc rất nhiều trong lợi của tôi.


5

JavaScript (ES6), 106

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

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))

Đến bây giờ, tôi đang làm theo cách đơn giản nhất để tìm câu trả lời bằng một phép tính - đây có thể không phải là cách tốt nhất.

Trên một hình vuông màu đen, câu trả lời là kích thước lấp đầy cho các mảnh màu trắng và kích thước đường viền cho các mảnh màu đen. Trên một hình vuông màu trắng, bạn cần thêm không gian trống. Xem bảng bên dưới (bên trong đoạn trích)

Tôi giữ kích thước điền và phác thảo cho mỗi phần, có thể tìm thấy không gian trống bên trong hình vuông trừ 64. Để tiết kiệm không gian, phác thảo được lưu trữ dưới dạng một chữ số hỗ trợ trừ 9. Phần điền sẽ phức tạp hơn khi phạm vi rộng hơn , kiểm tra mã (đó là cách các mảnh được sắp xếp theo không gian bị chiếm dụng)

Đoạn kiểm tra:

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 byte

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))

Mỗi \u00xx nên là một ký tự một byte. Chúng được biểu diễn ở đây dưới dạng mã vì Stack Exchange tự động xóa các ký tự không thể đọc được khỏi các bài đăng.

Giải trình

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

Kiểm tra


1

Lua, 158 155 byte

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

Có lẽ có thể giảm số byte bằng cách mã hóa dữ liệu, nhưng tôi giống như phương thức bảng hiện tại.

Màu cơ bản của hình vuông trên giá trị ASCII của 'w' hoặc 'b' lợi dụng thực tế là một số chẵn và một là số lẻ. Gán giá trị nguyên của mảnh dựa trên vị trí ký hiệu của mảnh trong mbiến chuỗi. Dù hình vuông có tối hay sáng đều được xử lý bằng (l+n)%2cách tận dụng lại giá trị ASCII.

Ung dung

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 Byte bằng cách loại bỏ c=c%2trước printvà sử dụng d[c%2][p]thay vì d[c][p].

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.