Skip to content

Commit 050b6de

Browse files
committed
Some more renaming for clarity
- `taxi' is now `dist', because it doesn't calculate a taxicab distance but a Chebyshev distance - Rename wK, wP, bK to wKing, wPawn, bKing to make it all slightly less cryptic without making it too bulky. Keep the 'w' and 'b' prefixes. - Rename king64 to allKing, which is the better name - Considered to rename allN, allE etc. to all0, all90, with the intent that such removes the suggestion that these correspond to N, E, etc. But reverted the change before commit: it doesn't get better and the comment does its job
1 parent 940a74b commit 050b6de

File tree

3 files changed

+52
-52
lines changed

3 files changed

+52
-52
lines changed

kpk.c

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@
5050
enum { N = a2-a1, S = -N, E = b1-a1, W = -E }; // Derived geometry
5151

5252
#define inPawnZone(square) (rank(square)!=rank1 && rank(square)!=rank8)
53-
#define conflict(wK,wP,bK) (wK==wP || wP==bK || wK==bK)
53+
#define conflict(wKing,wPawn,bKing) (wKing==wPawn || wPawn==bKing || wKing==bKing)
5454

55-
#define taxi(a,b) (abs(file(a)-file(b)) | abs(rank(a)-rank(b))) // logical-or as max()
56-
#define wInCheck(wK,wP,bK) (taxi(wK,bK)==1)
57-
#define bInCheck(wK,wP,bK) (taxi(wK,bK)==1 \
58-
|| (file(wP)!=fileA && wP+N+W==bK) \
59-
|| (file(wP)!=fileH && wP+N+E==bK))
55+
#define dist(a,b) (abs(file(a)-file(b)) | abs(rank(a)-rank(b))) // logical-or as max()
56+
#define wInCheck(wKing,wPawn,bKing) (dist(wKing,bKing)==1)
57+
#define bInCheck(wKing,wPawn,bKing) (dist(wKing,bKing)==1 \
58+
|| (file(wPawn)!=fileA && wPawn+N+W==bKing) \
59+
|| (file(wPawn)!=fileH && wPawn+N+E==bKing))
6060

6161
// Square set macros (no need to adopt these to the specific geometry)
6262
#define bit(i) (1ULL << (i))
@@ -65,14 +65,14 @@ enum { N = a2-a1, S = -N, E = b1-a1, W = -E }; // Derived geometry
6565
#define allE(set) ((set) << 8)
6666
#define allS(set) (((set) & ~mask) >> 1)
6767
#define allN(set) (((set) << 1) & ~mask)
68-
#define king64(set) (allW(allN(set)) | allN(set) | allE(allN(set)) \
69-
| allW(set) | allE(set) \
70-
| allW(allS(set)) | allS(set) | allE(allS(set)))
68+
#define allKing(set) (allW(allN(set)) | allN(set) | allE(allN(set)) \
69+
| allW(set) | allE(set) \
70+
| allW(allS(set)) | allS(set) | allE(allS(set)))
7171

7272
#define arrayLen(a) (sizeof(a) / sizeof((a)[0]))
7373
enum { white, black };
74-
#define wKsquare(ix) ((ix)>>5)
75-
#define wPsquare(ix) square(((ix)>>3)&3, (ix)&7)
74+
#define wKingSquare(ix) ((ix)>>5)
75+
#define wPawnSquare(ix) square(((ix)>>3)&3, (ix)&7)
7676

7777
/*----------------------------------------------------------------------+
7878
| Data |
@@ -85,75 +85,75 @@ static const int kingSteps[] = { N+W, N, N+E, W, E, S+W, S, S+E };
8585
| Functions |
8686
+----------------------------------------------------------------------*/
8787

88-
int kpkProbe(int side, int wK, int wP, int bK)
88+
int kpkProbe(int side, int wKing, int wPawn, int bKing)
8989
{
9090
if (!kpkTable[0][1]) kpkGenerate();
9191

92-
if (file(wP) >= 4) {
93-
wK = square(7 - file(wK), rank(wK));
94-
wP = square(7 - file(wP), rank(wP));
95-
bK = square(7 - file(bK), rank(bK));
92+
if (file(wPawn) >= 4) {
93+
wKing = square(7 - file(wKing), rank(wKing));
94+
wPawn = square(7 - file(wPawn), rank(wPawn));
95+
bKing = square(7 - file(bKing), rank(bKing));
9696
}
97-
int ix = (wK << 5) + (file(wP) << 3) + rank(wP);
98-
int bit = (kpkTable[side][ix] >> bK) & 1;
97+
int ix = (wKing << 5) + (file(wPawn) << 3) + rank(wPawn);
98+
int bit = (kpkTable[side][ix] >> bKing) & 1;
9999
return (side == white) ? bit : -bit;
100100
}
101101

102102
int kpkGenerate(void)
103103
{
104-
uint64_t valid[64*32];
104+
uint64_t valid[ arrayLen(kpkTable[0]) ];
105105

106106
for (int ix=0; ix<arrayLen(kpkTable[0]); ix++) {
107-
int wK = wKsquare(ix), wP = wPsquare(ix);
107+
int wKing = wKingSquare(ix), wPawn = wPawnSquare(ix);
108108

109109
// Positions after winning pawn promotion
110-
if (rank(wP) == rank8 && wK != wP) {
111-
uint64_t lost = ~king64(bit(wK)) & ~bit(wK) & ~bit(wP);
112-
if (taxi(wK, wP) > 1)
113-
lost &= ~king64(bit(wP));
110+
if (rank(wPawn) == rank8 && wKing != wPawn) {
111+
uint64_t lost = ~allKing(bit(wKing)) & ~bit(wKing) & ~bit(wPawn);
112+
if (dist(wKing, wPawn) > 1)
113+
lost &= ~allKing(bit(wPawn));
114114
kpkTable[black][ix] = lost;
115115
}
116116

117117
// Valid positions after black move, pawn capture allowed
118-
valid[ix] = ~king64(bit(wK));
119-
if (file(wP) != fileA) valid[ix] &= ~bit(wP+N+W);
120-
if (file(wP) != fileH) valid[ix] &= ~bit(wP+N+E);
118+
valid[ix] = ~allKing(bit(wKing));
119+
if (file(wPawn) != fileA) valid[ix] &= ~bit(wPawn+N+W);
120+
if (file(wPawn) != fileH) valid[ix] &= ~bit(wPawn+N+E);
121121
}
122122

123123
int changed;
124124
do {
125125
for (int ix=0; ix<arrayLen(kpkTable[0]); ix++) {
126-
int wK = wKsquare(ix), wP = wPsquare(ix);
127-
if (!inPawnZone(wP))
126+
int wKing = wKingSquare(ix), wPawn = wPawnSquare(ix);
127+
if (!inPawnZone(wPawn))
128128
continue;
129129

130130
// White king moves
131131
uint64_t won = 0;
132132
for (int i=0; i<arrayLen(kingSteps); i++) {
133-
int to = wK + kingSteps[i];
133+
int to = wKing + kingSteps[i];
134134
int jx = ix + (kingSteps[i] << 5);
135-
if (taxi(wK, to & 63) == 1 && to != wP)
136-
won |= kpkTable[black][jx] & ~king64(bit(to));
135+
if (dist(wKing, to & 63) == 1 && to != wPawn)
136+
won |= kpkTable[black][jx] & ~allKing(bit(to));
137137
}
138138
// White pawn moves
139-
if (wP+N != wK) {
140-
won |= kpkTable[black][ix+rank2-rank1] & ~bit(wP+N);
141-
if (rank(wP) == rank2 && wP+N+N != wK)
139+
if (wPawn+N != wKing) {
140+
won |= kpkTable[black][ix+rank2-rank1] & ~bit(wPawn+N);
141+
if (rank(wPawn) == rank2 && wPawn+N+N != wKing)
142142
won |= kpkTable[black][ix+rank4-rank2]
143-
& ~bit(wP+N) & ~bit(wP+N+N);
143+
& ~bit(wPawn+N) & ~bit(wPawn+N+N);
144144
}
145-
kpkTable[white][ix] = won & ~bit(wP);
145+
kpkTable[white][ix] = won & ~bit(wPawn);
146146
}
147147

148148
changed = 0;
149149
for (int ix=0; ix<arrayLen(kpkTable[0]); ix++) {
150-
if (!inPawnZone(wPsquare(ix)))
150+
if (!inPawnZone(wPawnSquare(ix)))
151151
continue;
152152

153153
// Black king moves
154154
uint64_t isBad = kpkTable[white][ix] | ~valid[ix];
155-
uint64_t canDraw = king64(~isBad);
156-
uint64_t hasMoves = king64(valid[ix]);
155+
uint64_t canDraw = allKing(~isBad);
156+
uint64_t hasMoves = allKing(valid[ix]);
157157
uint64_t lost = hasMoves & ~canDraw;
158158

159159
changed += (kpkTable[black][ix] != lost);
@@ -171,14 +171,14 @@ int kpkSelfCheck(void)
171171
124960 / 2, 97604 / 2 // - Non-draw positions per side
172172
};
173173
for (int ix=0; ix<arrayLen(kpkTable[0]); ix++) {
174-
int wK = wKsquare(ix), wP = wPsquare(ix);
175-
for (int bK=0; bK<boardSize; bK++) {
176-
if (!inPawnZone(wP) || conflict(wK, wP, bK))
174+
int wKing = wKingSquare(ix), wPawn = wPawnSquare(ix);
175+
for (int bKing=0; bKing<boardSize; bKing++) {
176+
if (!inPawnZone(wPawn) || conflict(wKing, wPawn, bKing))
177177
continue;
178-
counts[0] -= !bInCheck(wK, wP, bK);
179-
counts[1] -= !wInCheck(wK, wP, bK);
180-
counts[2] -= !bInCheck(wK, wP, bK) && ((kpkTable[white][ix] >> bK) & 1);
181-
counts[3] -= !wInCheck(wK, wP, bK) && ((kpkTable[black][ix] >> bK) & 1);
178+
counts[0] -= !bInCheck(wKing, wPawn, bKing);
179+
counts[1] -= !wInCheck(wKing, wPawn, bKing);
180+
counts[2] -= !bInCheck(wKing, wPawn, bKing) && ((kpkTable[white][ix] >> bKing) & 1);
181+
counts[3] -= !wInCheck(wKing, wPawn, bKing) && ((kpkTable[black][ix] >> bKing) & 1);
182182
}
183183
}
184184
return !counts[0] && !counts[1] && !counts[2] && !counts[3];

kpk.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
* If the table is not generated yet, this will be done
2828
* automatically at the first invocation.
2929
*/
30-
int kpkProbe(int side, int wK, int wP, int bK);
30+
int kpkProbe(int side, int wKing, int wPawn, int bKing);
3131

3232
/*
3333
* Generate the KPK table.

pfkpk.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#include "kpk.h"
1212

1313
struct {
14-
int side, wK, wP, bK, expected;
14+
int side, wKing, wPawn, bKing, expected;
1515
} tests[] = {
1616
{ 0, a1, a2, a8, 0 },
1717
{ 0, a1, a2, h8, 1 },
@@ -74,9 +74,9 @@ int main(void)
7474
int ix;
7575
for (ix=0; tests[ix].side>=0; ix++) {
7676
int result = kpkProbe(tests[ix].side,
77-
tests[ix].wK,
78-
tests[ix].wP,
79-
tests[ix].bK);
77+
tests[ix].wKing,
78+
tests[ix].wPawn,
79+
tests[ix].bKing);
8080
if (result == tests[ix].expected)
8181
nrPassed++;
8282
}

0 commit comments

Comments
 (0)