LINUX.ORG.RU

Восстановление исходника Си


0

1

Вот здесь есть исходник шахматной программы: http://prboom-plus.sourceforge.net/chess.txt

Но совсем нечитаемый. С помощью gcc -E удалось избавиться от макроопределений:

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

int v,w,Y= -1,W,J,p,F,o=9999,M,N,K,X,YY,_,P[9999],s(); typedef int(*L)(); L q[9999]; tj(){
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; } k(){ _=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];
} z(){ _=5; return v*w||tj()-J; } e(){ _= -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(){ int PZ=0x7fff;
return(double)(rand()&PZ)/(double)PZ; } l(){ _=K+1; return(v*w&&(v<0?-v:v)-(w<0?-w:w))||tj()-J; } double UC(){ double i=0,d;
while((i+=d=VR())<1.0); return d; } c(){ _= -11; return (v<0?-v:v)-(w<0?-w:w)||tj()-J; } I(ur,n,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)); } TT(W){ v=w=0; return q[W]()+K; } s(){ 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); } bb(){ _=1; return (v*w<0?-v*w:v*w)-2; } uv(){
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); } } y(){ 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"); } O(W,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; } QL(W,J,D)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; } C(){ 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; } PX(){ 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; } RZ(){ 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"); } } main(ac,av)char**av; { long time(),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(); }

Тем не менее, все равно еще невозможно прочесть. Можно ли как-нибудь отформатировать этот текст в стиле K&R, GNU etc?

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

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

tj() {
    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;
}

k() {
    _ = 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];

}

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

e() {
    _ = -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() {
    int PZ = 0x7fff;

    return (double) (rand() & PZ) / (double) PZ;
}

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

double UC() {
    double i = 0, d;

    while ((i += d = VR()) < 1.0);
    return d;
}

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

I(ur, n, 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));
}

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

s() {
    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);
}

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

uv() {
    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);
    }
}

y() {
    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");
}

O(W, 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;
}

QL(W, J, D)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;
}

C() {
    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;
}

PX() {
    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;
}

RZ() {
    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");
    }
}

main(ac, av)char**av;
{
    long time(), 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();
}

// дефолтное форматирование в нетбинсе

aho
()

Ну как, помогло?

anonymous
()

ВНЕЗАПНО утилитка astyle в репозиториях вашего дистрибутива.

metar ★★★
()
Ответ на: комментарий от pathfinder

> Дай угадаю. Ты книгу пишешь - «Brainfucking. Прямые и обратные задачи.»

Нет, всего лишь шахматы для мобильника.

Den_Zurin
() автор топика

indent -kr -l120 chess.c

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

int v, w, Y = -1, W, J, p, F, o = 9999, M, N, K, X, YY, _, P[9999], s();
typedef int (*L) ();
L q[9999];
tj()
{
    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;
}

k()
{
    _ = 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];
}

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

e()
{
    _ = -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()
{
    int PZ = 0x7fff;
    return (double) (rand() & PZ) / (double) PZ;
} l()
{
    _ = K + 1;
    return (v * w && (v < 0 ? -v : v) - (w < 0 ? -w : w)) || tj() - J;
}

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

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

I(ur, n, 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));
}

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

s()
{
    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);
}

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

uv()
{
    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);
    }
}

y()
{
    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");
}

O(W, 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;
}

QL(W, J, D)
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;
}

C()
{
    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;
}

PX()
{
    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;
}

RZ()
{
    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");
    }
}

main(ac, av)
char **av;
{
    long time(), 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();
}

Правда вряд ли это тебе поможет.

vladimir-vg ★★
()

Этому коду больше соответствует заголовок «восстание исходника Си».

ugoday ★★★★★
()
Ответ на: комментарий от Den_Zurin

>Нет, всего лишь шахматы для мобильника.

Ты неудачно выбрал исходник, который можно взять за основу.

//Ваш К. О.

pathfinder ★★★★
()
Ответ на: комментарий от Den_Zurin

>Нет, всего лишь шахматы для мобильника.

Если на основе этого кода, то проще написать эмулятор i386 и запустить скомпилированную версию.

proud_anon ★★★★★
()
Ответ на: комментарий от Den_Zurin

> Нет, всего лишь шахматы для мобильника.

Эм. Ну ты и нашел, что взять за основу. Чем не устроил GNU Chess?

pevzi ★★★★★
()

мне одному кажется что кто-то прошелся обфускатором по этому исходнику? об этом как бэ намекает даже не каша, в виде которой был представлен исходник, а скорее, имена функций и переменных... да уж, явно не удачный пример ТС взял для изучения :)))

Cy6erBr4in ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.