8-bit Satranç Piksel Sayımı


20

Hedef

Bilgisayarlı bir satranç oyunu oynuyorsunuz. Ekran yalnızca siyah beyaz ve pikseller tıknaz. Beyaz pikseller, siyah piksellere kıyasla çok fazla güç kullanır ve karbon ayak izinizden endişe duyarsınız.

Bir kare ve satranç notasyonunda bir parça verildiğinde, karede görüntülenen beyaz piksel sayısını döndürün.

Çözüm, bir işlev veya tam bir program şeklinde olabilir.

Giriş

4 karakterli bir dize:

  1. Biri wbbeyaz veya siyah parça için. (Normal Satranç gösteriminin bir parçası değildir, ancak bu bulmaca için gereklidir.)
  2. Bir KQBNRPKral, Kraliçe, Piskopos, kNight, Rook veya Piyon'dan biri.
  3. Bir abcdefghparçanın dosyası (sütun) için.
  4. Bir 12345678parçanın rütbesi (satır) için.

Çıktı

Satranç taşını ve alttaki kareyi çizmek için kullanılan beyaz piksel sayısı.

Gereksinimler

  • Satranç kareleri 8x8 pikseldir ve hepsi beyaz veya tamamen siyahtır.
  • a1 siyah bir karedir.
  • Beyaz satranç taşları siyah anahatlı beyaz olarak çizilir. Siyah parçalar beyaz anahatlı siyahtır. Tüm parçalar alttaki kareyi gösteren saydam piksellere sahiptir.
  • Giriş büyük / küçük harfe duyarlıdır.
  • Girişin geçerli olduğunu varsayın.

Satranç taşlarının spriteları aşağıdaki gibidir.
.parçanın rengidir.
#parçanın renginin tersidir.
/alttaki karenin rengidir.

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

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

Parçanın rengindeki piksel sayısı, parçanın anahattı ve her bir parça için alttaki kare:

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

Test Durumları

Input  Output
wRa1   23
bRa1   18
wPc2   54
bKg8   51

puanlama

Noel Günü tarafından bayt cinsinden en kısa kod, çoraplarında biraz ekstra bir şey alır.

Yanıtlar:


2

Pyth, 54 53 bayt

Kod yazdırılamaz karakterler içeriyor, bu yüzden burada tersinir bir xxdhexdump var:

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

Alternatif olarak, çevrimiçi olarak da deneyebileceğiniz veya test paketini kullanabileceğiniz kopyala yapıştır dostu bir sürüm :

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

6

C # 6, 107 bayt

İşte kendi cevabım. Ben meydan okuma olan herhangi bir puan beklemiyorum.

User81655'in cevabından biraz ilham aldım .

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

Piksel sayıları 6 bitlik bloklar halinde kodlanmıştır. Anahat veya dolgu kareye eklenir (beyazsa). Son olarak, uygun parça için 6 bitlik blok çıkarılır.

Neyse ki, operasyon önceliği benim lehime çok çalıştı.


5

JavaScript (ES6), 106

Anonim bir işlev olarak.

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

Şimdiye kadar, bir hesaplamayla cevabı bulmanın en basit yolunu takip ediyorum - bu en iyi yol olmayabilir.

Siyah bir kare üzerinde, cevap beyaz parçalar için dolgu boyutu ve siyah parçalar için anahat boyutudur. Beyaz bir karenin üzerine boş alan eklemeniz gerekir. Aşağıdaki tabloya bakın (snippet'in içinde)

Her parça için dolgu ve anahat boyutunu saklıyorum, kare içindeki boş alan 64'ten çıkarılıyor. , kodu kontrol edin (bu şekilde parçalar dolu alana göre sıralanır)

Test snippet'i:

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 bayt

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

Her \u00xxbiri tek baytlık bir karakter olmalıdır. Bunlar burada kod olarak temsil edilir, çünkü Stack Exchange okunamayan karakterleri gönderilerden otomatik olarak kaldırır.

açıklama

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

Ölçek


1

Lua, 158155 Bayt

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

Muhtemelen verileri kodlayarak bayt sayısını azaltabilir, ama biraz geçerli tablo yöntemi gibi.

Karenin rengini ASCII değeri olan 'w' veya 'b' ye dayandırmak, birinin eşit ve tek olması gerçeğinden yararlanır. Parçanın sembolünün mdize değişkenindeki konumuna göre parçanın tamsayı değerini atar . Bir karenin karanlık veya aydınlık olup olmadığı (l+n)%2, ASCII değerinden tekrar yararlanarak işlenir .

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
     )

Kaldırarak -3 bayt c=c%2önce printkullanılarak d[c%2][p]yerine d[c][p].

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.