Skip to content

Commit c5669f6

Browse files
committed
Made kpk.c pass all tests and 25% speedup
1 parent 5491a39 commit c5669f6

File tree

2 files changed

+33
-29
lines changed

2 files changed

+33
-29
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ CFLAGS=-std=c99 -pedantic -Wall -O3
33
all: pfkpk test
44

55
pfkpk: pfkpk.c kpk.c kpk.h
6-
$(CC) $(CFLAGS) -o $@ pfkpk.o kpk.o
6+
$(CC) $(CFLAGS) -o $@ pfkpk.c kpk.c
77

88
test:
99
./pfkpk

kpk.c

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ int kpkProbe(int side, int wK, int wP, int bK)
101101

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

106106
// Prepare won
107107
for (int ix=0; ix<arrayLen(kpkTable[0]); ix++) {
@@ -115,45 +115,48 @@ int kpkGenerate(void)
115115
kpkTable[black][ix] = lost;
116116
}
117117

118-
if (inPawnZone(wP) && wK != wP) {
119-
legal[ix] = ~king64(bit(wK));
120-
if (file(wP) != fileA) legal[ix] &= ~bit(wP+N+W);
121-
if (file(wP) != fileH) legal[ix] &= ~bit(wP+N+E);
122-
}
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);
123121
}
124122

125-
uint64_t changed;
123+
int changed;
126124
do {
127-
// White to move
128125
for (int ix=0; ix<arrayLen(kpkTable[0]); ix++) {
129126
int wK = wKsquare(ix), wP = wPsquare(ix);
127+
if (!inPawnZone(wP))
128+
continue;
130129

131-
// King moves
130+
// White king moves
132131
uint64_t won = 0;
133132
for (int i=0; i<arrayLen(kingSteps); i++) {
134133
int to = wK + kingSteps[i];
134+
int jx = ix + (kingSteps[i] << 5);
135135
if (taxi(wK, to & 63) == 1 && to != wP)
136-
won |= kpkTable[black][ix+(kingSteps[i]<<5)] & ~king64(bit(to));
136+
won |= kpkTable[black][jx] & ~king64(bit(to));
137137
}
138-
// Pawn moves
138+
// White pawn moves
139139
if (wP+N != wK) {
140140
won |= kpkTable[black][ix+rank2-rank1] & ~bit(wP+N);
141141
if (rank(wP) == rank2 && wP+N+N != wK)
142-
won |= kpkTable[black][ix+rank4-rank2] & ~bit(wP+N) & ~bit(wP+N+N);
142+
won |= kpkTable[black][ix+rank4-rank2]
143+
& ~bit(wP+N) & ~bit(wP+N+N);
143144
}
144-
kpkTable[white][ix] = won & legal[ix];
145+
kpkTable[white][ix] = won & ~bit(wP);
145146
}
146147

147-
// Black to move
148148
changed = 0;
149149
for (int ix=0; ix<arrayLen(kpkTable[0]); ix++) {
150-
int wK = wKsquare(ix), wP = wPsquare(ix);
150+
if (!inPawnZone(wPsquare(ix)))
151+
continue;
151152

152-
uint64_t canDraw = king64(~kpkTable[white][ix]);
153-
uint64_t hasMoves = king64(legal[ix]);
153+
// Black king moves
154+
uint64_t isBad = kpkTable[white][ix] | ~valid[ix];
155+
uint64_t canDraw = king64(~isBad);
156+
uint64_t hasMoves = king64(valid[ix]);
154157
uint64_t lost = hasMoves & ~canDraw;
155158

156-
changed |= kpkTable[black][ix] ^ lost;
159+
changed += (kpkTable[black][ix] != lost);
157160
kpkTable[black][ix] = lost;
158161
}
159162
} while (changed);
@@ -163,19 +166,20 @@ int kpkGenerate(void)
163166

164167
int kpkSelfCheck(void)
165168
{
166-
int counts[] = { // As given by Steven J. Edwards (1996)
167-
163328/2, 168024/2, // legal positions for each side
168-
124960/2, 97604/2 // nondraw positions for each side
169+
int counts[] = { // As given by Steven J. Edwards (1996):
170+
163328 / 2, 168024 / 2, // - Legal positions per side
171+
124960 / 2, 97604 / 2 // - Non-draw positions per side
169172
};
170173
for (int ix=0; ix<arrayLen(kpkTable[0]); ix++) {
171174
int wK = wKsquare(ix), wP = wPsquare(ix);
172-
for (int bK=0; bK<boardSize; bK++)
173-
if (inPawnZone(wP) && !conflict(wK, wP, bK)) {
174-
counts[0] -= !bInCheck(wK, wP, bK);
175-
counts[1] -= !wInCheck(wK, wP, bK);
176-
counts[2] -= !bInCheck(wK, wP, bK) & (kpkTable[white][ix] >> bK);
177-
counts[3] -= !wInCheck(wK, wP, bK) & (kpkTable[black][ix] >> bK);
178-
}
175+
for (int bK=0; bK<boardSize; bK++) {
176+
if (!inPawnZone(wP) || conflict(wK, wP, bK))
177+
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);
181+
counts[3] -= !wInCheck(wK, wP, bK) & (kpkTable[black][ix] >> bK);
182+
}
179183
}
180184
return !counts[0] && !counts[1] && !counts[2] && !counts[3];
181185
}

0 commit comments

Comments
 (0)