Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Interesting Chess Program Source Code [SPOILER]

Author: Dann Corbit

Date: 20:24:37 01/23/01

Go up one level in this thread


On January 23, 2001 at 01:24:55, Sam Slutzky wrote:

>Go to: http://www.ioccc.org/years.html  Then select 1992 and look at the Vern
>entry; It's the horribly obfuscated C source code for an extremely simple
>chess-playing program.  I know people out there are always digging up old and
>unusual programs so I thought I'd throw this one out.  A lot of these programs
>don't compile very easily these days, but I know I compiled this once several
>years ago and it worked for me back then.

It has a few non-standard features (like io.h UNIX-type I/O) but most compilers
will probably support it.  I just compiled and ran my 'clarified' version and it
runs just fine.  I also fixed some non-ANSI stuff.

Slightly demystified by me:

#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

extern double UC(void );
extern double VR(void );
extern int bb(void );
extern int C(void );
extern int e(void );
extern int I(int ur,int n,int x);
extern int k(void );
extern int l(void );
extern int main(int ac,char **av );
extern int PX(void );
extern int QL(int W,int J,int (*D)(void ));
extern int s(void );
extern int tj(void );
extern int TT(int W);
extern int z(void );
extern void O(int W,int J);
extern void RZ(void );
extern void uv(void );
extern void y(void );

int             v,
                w,
                Y = -1,
                W,
                J,
                p,
                F,
                o = 9999,
                M,
                N,
                K,
                X,
                YY,
                _,
                P[9999];
typedef int     (*L) (void);

L               q[9999];

int tj(void)
{
    int             S = (v < 0 ? -1 : !!v) + ((w < 0 ? -1 : !!w) << K);
    if (!S)
        return J;
    for (v = W + S; v != J && !q[v]; v += S);
    return v;
}

int k(void)
{
    _ = K;
    return
        v ? (v < 0 ? -v : v) > 1 || w - Y || !q[J] : (w - Y && (w - Y * 2 || q[W
+ Y * (N + 1)] || (J >> K) - K + (Y - 1) / 2)) || q[J];
}

int z(void)
{
    _ = 5;
    return v * w || tj() - J;
}

e(void)
{
    _ = -2;
    return (v * v * v - v || w * w * w - w) && (J - W - 2 || (W & N) - 4 || (W
>> K != (Y - 1 ? N : 0)) ||
                 q[W + 1] || q[W + 2] || q[W + K] != z || P[W + K] * Y < 0);
}

double          VR(void)
{
    int             PZ = 0x7fff;
    return (double) (rand() & PZ) / (double) PZ;
}

int l(void)
{
    _ = K + 1;
    return (v * w && (v < 0 ? -v : v) - (w < 0 ? -w : w)) || tj() - J;
}

double          UC(void)
{
    double          i = 0,
                    d;
    while ((i += d = VR()) < 1.0);
    return d;
}

int c(void)
{
    _ = -11;
    return (v < 0 ? -v : v) - (w < 0 ? -w : w) || tj() - J;
}

int I(int ur, int n, int x)
{
    W = ur;
    J = n;
    if (P[W] != Y || P[J] == Y)
        return J + 1;
    v = (J & N) - (W & N);
    w = (J >> K) - (W >> K);
    return
        q[W] () || (x && QL(W, J, s));
}

int TT(int W)
{
    v = w = 0;
    return q[W] () + K;
}

int s(void)
{
    int             j = -1,
                    i;
    Y = -Y;
    for (i = 0; i < M; ++i) {
        if (j < 0 && P[i] == -Y && TT(i) && _ == -2) {
            j = i;
            i = -1;
        } else if (j >= 0 && !I(i, j, 0))
            return Y = -Y;
    }
    return !(Y = -Y);
}

int bb(void)
{
    _ = 1;
    return (v * w < 0 ? -v * w : v * w) - 2;
}

void uv(void)
{
    for (v = 0; v < 9999; ++v) {
        if (((v >> K) <= K ? v >> K : N - (v >> K)) == 0) {
            int             S = ((v & N) <= K ? v & N : N - (v & N));
            q[v] = !S ? z : (S == 1 ? bb : (S == 2 ? c : (v & N > K ? l : e)));
        } else if (((v >> K) <= K ? v >> K : N - (v >> K)) == 1)
            q[v] = k;
        else
            q[v] = 0;
        P[v] = !!q[v] * (28 - v);
    }
}

void y(void)
{
    int             G = Y,
                    i;
    J = 0;
    for (i = 0; i < M; ++i) {
        i % 8 || printf("\n%4o ", i);
        if ((Y = P[i] = (P[i] < 0 ? -1 : !!P[i])) && TT(i))
            printf("%c ", _ + 93 + Y * 16);
        else
            printf("- ");
    }
    printf("\n    ");
    do
        printf("%2d", i++ & N);
    while (i & N);
    Y = G;
    printf("\n");
}

void O(int W, int J)
{
    if ((q[J] = q[W]) == k && ((J >> K) <= K ? J >> K : N - (J >> K)) == 0)
        q[J] = l;
    if (q[W] == e)
        if (J - W == 2)
            O(J + 1, J - 1);
        else if (W - J == 2)
            O(W - 1, W + 1);
    P[J] = P[W];
    q[W] = 0;
    P[W] = 0;
}

int QL(int W, int J, L D)
{
    int
                    HQ = P[J],
                    YX;
    L               AJ = q[J],
                    XY = q[W];
    O(W, J);
    YX = D();
    O(J, W);
    q[J] = AJ;
    q[W] = XY;
    P[J] = HQ;
    return YX;
}

int C(void)
{
    int             i,
                    j,
                    BZ = 0;
    for (i = 0; i < M; ++i) {
        L               Z = q[i];
        if (Z) {
            int
                            r = ((i >> K) <= K ? i >> K : N - (i >> K)) + ((i &
N) <= K ? i & N : N - (i & N)),
                            G = Y,
                            S = Z == z ? 88 : (Z == k ? 11 + r + (P[i] < 0 ? N -
(i >> K) : (i >> K)) :
                                               (Z == l ? 124 - ((YY < 8 && ((i &
N) != K || (i >> K) != (P[i] > 0 ? 0 : N))) ? M : 0) :
                 (Z == c ? 41 + r : (Z == e ? 9999 - r - r : 36 + r + r))));
            Y = P[i];
            for (j = 0; j < M;
                 ++j)
                if (!I(i, j, 0))
                    S += (P[j] ? 5 : 1);
            BZ += G == Y ? S : -S;
            Y = G;
        }
    }
    if (!(++X & M - 1))
        write(1, ".", 1);
    return BZ;
}

int PX(void)
{
    int             i,
                    Q = 0,
                    XP = 0,
                    JZ = M * M,
                    E = -9999,
                    t,
                    S = o;
    if (!F--)
        return ++F + C();
    for (i = 0; i < JZ; ++i)
        if (!I(i >> K + K, i & M - 1, 1)) {
            Y = -Y;
            o = -E;
            t =
                -QL(i >> K + K, i & M - 1, PX);
            Y = -Y;
            if (t > E) {
                ++XP;
                Q = i;
                E = t;
                if (E >= S)
                    return ++F, E;
            }
        }
    if (!XP)
        E = s() ? -9999 + 1 : 0;
    p = Q;
    return ++F, E;
}

void            RZ(void)
{
    int             i,
                    j,
                    T = 0;
    for (;;) {
        y();
        o = 9999;
        do {
            printf("\n%d %d %d %s ", X, T, C(), s() ? "!" : ">");
            fflush(stdout);
        }
        while (scanf("%o%o", &i, &j) != 2 || I(i, j, 1));
        O(i, j);
        y();
        X = 0;
        ++YY;
        Y = -Y;
        T = PX();
        i = p >> (K << 1);
        j = p & (M - 1);
        if (I(i, j, 1)) {
            printf("Rats!\n");
            return;
        }
        O(i, j);
        Y = -Y;
        if (T > M * M)
            printf("\nHar har.\n");
    }
}

int main(int ac, char **av)
{
    long
                    j = time(&j);
    double          i = 0;
    srand((int) j);
    for (M = 0; M <= 9999; ++M)
        i += UC();
    M = i / 100;
    if (M & 3)
        ++M;
    if (M & 1)
        --M;
    for (N = 1; N * N < M; ++N);
    K = --N / 2;
    F = ac > 1 ? atoi(av[1]) : 2;
    uv();
    RZ();
    return 0;
}



This page took 0 seconds to execute

Last modified: Thu, 15 Apr 21 08:11:13 -0700

Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.