การนับจำนวนพิกเซลหมากรุก 8 บิต


20

เป้าหมาย

คุณกำลังเล่นเกมหมากรุกด้วยคอมพิวเตอร์ จอแสดงผลเป็นขาวดำเท่านั้นและพิกเซลมีความหนา พิกเซลสีขาวใช้พลังงานมากเมื่อเทียบกับพิกเซลสีดำและคุณกังวลเกี่ยวกับการปล่อยคาร์บอน

รับสี่เหลี่ยมจัตุรัสและชิ้นส่วนในรูปแบบหมากรุกคืนจำนวนพิกเซลสีขาวที่แสดงในตาราง

การแก้ปัญหาอาจอยู่ในรูปแบบของฟังก์ชั่นหรือโปรแกรมที่สมบูรณ์

อินพุต

สตริง 4 อักขระที่กำหนด:

  1. หนึ่งในwbชิ้นส่วนสีขาวหรือสีดำ (ไม่ใช่ส่วนหนึ่งของสัญลักษณ์หมากรุกปกติ แต่จำเป็นสำหรับปริศนานี้)
  2. หนึ่งในนั้นKQBNRPคือราชา, ราชินี, บาทหลวง, kNight, Rook หรือ Pawn
  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

เกณฑ์การให้คะแนน

รหัสที่สั้นที่สุดในหน่วยไบต์โดยวันคริสต์มาสจะได้รับของเล็ก ๆ น้อย ๆ เพิ่มเติมในการเก็บของ

คำตอบ:


2

Pyth, 54 53 ไบต์

รหัสมีอักขระที่ไม่สามารถพิมพ์ได้ดังนั้นนี่คือxxdhexdump ที่ย้อนกลับได้:

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. เพื่อประหยัดเนื้อที่โครงร่างที่เก็บไว้เป็นตัวเลข afer ลบหนึ่งหลัก 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 Bytes

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]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.