8ビットチェスピクセルカウント


20

ゴール

コンピューター化されたチェスゲームをプレイしています。ディスプレイは白黒のみで、ピクセルは分厚い。白いピクセルは黒いピクセルに比べて多くの電力を消費するため、二酸化炭素排出量を心配しています。

正方形とチェス表記のピースを指定すると、正方形に表示される白いピクセルの数を返します。

解決策は、関数または完全なプログラムの形式である場合があります。

入力

以下を定義する4文字の文字列:

  1. 一つwb白または黒の部分のため。(通常のチェス表記法の一部ではありませんが、このパズルには必須です。)
  2. 一つのKQBNRP王、王妃、ビショップ、ナイト、ルークやポーンのために。
  3. abcdefgh作品のファイルの1つ(列)。
  4. 12345678作品のランク(行)の1つ。

出力

チェスの駒とその下にある正方形の描画に使用される白いピクセルの数。

必要条件

  • チェスの正方形は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から差し引いて見つけることができます。スペースを節約するため、アウトラインは1桁として格納されます。 、コードを確認します(占有スペースでピースがソートされる方法です)

テストスニペット:

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が単一の1バイト文字でなければなりません。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]))

データをエンコードすることでおそらくバイト数を減らすことができますが、私はちょっと現在のテーブルメソッドが好きです。

1つが偶数で1つが奇数であるという事実を利用して、「w」または「b」のASCII値に基づいて正方形の色を設定します。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
     )

-3バイトのc=c%2前に削除し、の代わりにprint使用しd[c%2][p]ますd[c][p]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.