Code: Select all
#include <stdio.h>
#include <time.h>
#include <ctype.h>
char *l = "ustvrtsuqqqqqqqqyyyyyyyy}{|~z|{}"
" 76Lsabcddcba .pknbrq PKNBRQ ?A6J57IKJT576,+-48HLSU";
int B, i, y, u, b, I[411], *G = I, x = 10, z = 15, M = 1e4, D;
int X(int f, int w, int c, int h, int e, int S, int s)
{
int t,
o,
L,
E,
d,
O = f,
N = -M * M,
K = 78 - h << x,
p,
*g,
n,
*m,
A,
q,
r,
C,
J,
a = y ? -x : x;
D++;
y ^= 8;
d = w || s && X(21, 0, 0, 0, 0, 1, 0) > M;
G[h + 1] = *G;
do {;
if (o = I[p = O]) {
q = o & z ^ y;
if (q < 7) {
A = q-- & 2 ? 8 : 4;
C = o - 9 & z ? q["& .$ "] : 42;
do {
r = I[p += C[l] - 64];
if (!w | p == w && q | A > 2 | !r) {
g = q | p + a - e ? 0 : I + e;
if (!r & (q | A < 3 || g) || (r + 1 & z ^ y) > 9) {
m = 0;
if (!(r - 2 & 7))
return y ^= 8, G[h] = O, K;
n = o & z;
J = I[p - a] & z;
t = q | J - 7 ? n : (n += 2, 6 ^ y);
while (n <= t) {
p[I] = n, E = O[I] = m ? *g = *m, *m = 0 : g ? *g = 0 : 0;
L = (1 - q ? l[p / x + 5] - l[O / x + 5] + l[p % x + 6] - l[O % x + 6]
+ o / 16 * 8 : !!m * 9) + (q ? 0 : l[p % x + 6] - 98 + !(I[p - 1] ^ n)
+ !(I[p + 1] ^ n) + l[n & 7] * 9 - 288 + !!g * 99 + (A < 2 && (E = p)))
+ (r ? l[r & 7] * 9 - 189 - h - q : 0) + !(J ^ y ^ 9);
if (s > h || s == h & (L > z & 1 < s | d))
L -= X(G[h + 1], s > h | d ? 0 : p, L, h + 1, E, N, s);
if (!(h || S | B - O | i - n | p - b | L < -M))
return u = E;
J = q - 1 | A < 7 || m || !s | d | r | o < z || X(21, 0, 0, 0, 0, 1, 0) > M;
O[I] = o;
p[I] = r;
m ? *m = *g, *g = 0 : g ? *g = 9 ^ y : 0;
if (L > N) {
N = L;
G[h] = O;
if (!h & s > 1)
i = n, B = O, b = p;
if (h && c - L < S)
return y ^= 8, L;
}
n += J || (g = I + p, m = p < O ? g - 3 : g + 2, *m < z | I[p += p - O] | m[p < O ? 1 : -1]);
}
}
}
} while (!r & q > 2 || (p = O, q | A > 2 | o > z & !r && ++C && --A));
}
}
} while (++O > 98 ? O = 20 : f - O);
return y ^= 8, N + M * M && N > -K + 1924 | d ? N : 0;
}
void m1(void)
{
if (*l - 'u')
l -= 32, G = I;
B = y = u = 0;
while (++B < 121)
*G++ = B / x % x < 2 | B % x < 2 ? 7 : B / x & 4 ? 0 : *l++ & 31;
}
int main(void)
{
char g[80],
*a,
*c;
int f = 0,
j = 0,
m;
clock_t k;
setbuf(stdout, NULL);
setbuf(stdin, NULL);
while (fflush(stdout), fgets(g, 79, stdin)) {
a = c = g;
while (isspace(*a))
a++;
while (*a && *a - 10 && !isspace(*a))
*c++ = *a++;
*c = 0;
;
if (!strcmp(g, "quit"))
break;
if (!strcmp(g, "post"))
j = 1;
if (!strcmp(g, "nopost"))
j = 0;
if (!strcmp(g, "new"))
f = 0, m1();
if (!strcmp(g, "force"))
f = 1;
if (!strcmp(g, "go"))
f = 0;
if (!strcmp(g, "protover"))
puts("feature myname="Toledo Nanochess Mar/25/2009" done=1");
if (isalpha(g[0]) && isdigit(g[1]) && isalpha(g[2]) && isdigit(g[3])) {
a = g;
B = *a++ & z;
B += 100 - (*a++ & z) * x;
b = *a++ & z;
b += 100 - (*a++ & z) * x;
i = *a - 'q' ? *a - 'r' ? *a - 'b' ? *a - 'n' ? I[B] & z : 11 ^ y : 12 ^ y : 13 ^ y : 14 ^ y;
X(21, 0, 0, 0, u, 0, 1);
if (!f)
strcpy(g, "go");
};
if (!strcmp(g, "go")) {
k = clock();
D = 0;
m = X(21, 0, 0, 0, u, 1, 5);
k = (clock() - k) * 1e2 / 1000;
a = g;
*a++ = B % x + 96;
*a++ = 58 - B / x;
*a++ = b % x + 96;
*a++ = 58 - b / x;
if ((I[B] & z) - i)
*a++ = "nbrq"[i - 3 & 7];
*a = 0;
;
if (j)
printf("6 %d %d %d %s\n", m, k, D, g);
X(21, 0, 0, 0, u, 0, 1);
printf("move %s\n", g);
}
}
return 0;
}
I have to admit, that is one tiny Winboard interface module.