Ir para conteúdo

Jogo da velha (pela rede) do IOCCC


fredericopissarra

Posts Recomendados

Outra obra de arte do IOCCC (Jon Thingvold, em 1996)

Não faço a MENOR ideia de como esse troço funciona:

#define O B F U S C A T E D
#define I 8;}t(p){r(p?W:o);XClearWindow(V,m);}main(i,f)char**f;{M((T(h=f),
#define K Y(o,XMapRaised(V,e);)x=3;x--;)for(y=3;y--;r(G))XMapRaised(V,R[D]
#define N z(x+i,(z(H-x-i,x),x)))x<i||z(x-i,x)|z(H-x+i,x)Y(W,)l=k;l>20&&l>x
#define XIMOfIC Z;XID(*w)()=XCreateWindow,m,e,o[2],W[2],G[2],R[2][O]);}GC*g
#define E (++D)));}r(XID*z){XSetWindowBackgroundPixmap(V=d[D],m=R[D][x][y],z[
#define L ;XStoreName(V,e=w(V,RootWindow(V,s),0,0,152,152,2,0,1,0,0,0),"II"+D
#define B 3][3];Display*V,*d[2];char**h,k=25,b[2500],H=50,D,s,x,y,i;T(){float
#define S +k),z(k-P=w(V,e,H*x,H*y,H,H,1,0,1,0,2048,&c));}XEvent J;M(){XFlush(
#define Y(z,y) ;for(z[D]=XCreatePixmapFromBitmapData(Q,x=0,H*H);x<H;x++)y for(
#define A x][y]&&!b[x+k*y]++?t(D),t(!(D^=1)):D);M();}z(x,y){b[x/8+y*7]|=1<<x%I
#define P x,y)-z(y,x+k)+z(y,k-x)*z(x+k,y=H-y),z(k-x,y),z(y,k-x),z(y,k+x)K[x][y]
#define Q V,e,b,H,H,BlackPixel(V,s),WhitePixel(V,s),DefaultDepth(V,s)),memset(b
#define C d[!D]);x=3;for(XNextEvent(V,&J);x--;)for(y=3;y--;J.xany.window==R[D][
#define F l;XSetWindowAttributes c;s=XDefaultScreen(V=d[D]=XOpenDisplay(*(h+=!!
#define U *h)))L)Y(G,)i=c.event_mask=4;i--;x+i>H||N;l-=.5)z(x+k,y=sqrt(l*l-x*x)
#include <math.h>
#include <string.h>
#include <X11/Xlib.h>

Só funciona nos "unixes" (por causa do X11)... Para compilar:

$ gcc -O2 -ansi -o jonth jonth.c -lX11 -lm

Para compilar no Solaris é necessário acrescentar -lsocket.

Note que o código inteiro só tem definições lexicas (#define)... cadê a porcaria do main() como função (está lá na definição de I)? ?

Esse programinha abrirá 2 janelas no X11 (sem argumentos ambas abrirão no DISPLAY default)... elas podem ser direcionadas para hosts diferentes... por exemplo:

$ ./jonth host1:0 host2:0

Onde 'host1' e 'host2' podem ser IPs ou nomes de hosts...

Link para o comentário
Compartilhar em outros sites

$ gcc jonth.c -o test.c -E

Eu usei -E do GCC para ver o conteúdo expandido. Depois procurei pelo texto "main(" no arquivo de saída e encontrei.
Aproveitando das diretivas de linha que o GCC insere, eu vi que o conteúdo estava expandindo no arquivo /usr/include/X11/Xlib.c na linha 3889. Nesta linha contém a seguinte declaração:

extern XIM XIMOfIC(
  XIC  /* ic */
);

O `#define` da linha 5 seta o macro de nome XIMOfIC. Perto do final desse macro nós temos um macro "O" ali. Veja em negrito:

Citar

#define XIMOfIC Z;XID(*w)()=XCreateWindow,m,e,o[2],W[2],G[2],R[2][O]);}GC*g

 

Acontece que aonde tem esse "O" é expandido o conteúdo do macro B. Pelo visto um macro que expande para o nome de outro macro dentro de um header file, é expandido mais uma vez. Parece que há uma repetição do pré-processamento.
Para testar isso eu fiz o seguinte:

// Arquivo tst.c

#define B X Y
#define X 5
#define Y , c = 3

#include <stdio.h>
#include "h.h"

int main(void)
{
  printf("%d, %d\n", b, c);
  return 0;
}
// Arquivo h.h

int b = B;

 

E funcionou. No arquivo "h.h", B expandiu para o conteúdo de X e Y em sequência. Formando:

int b = 5, c = 3;

 

E se a gente voltar para o primeiro `#define`, a gente nota que a declaração do macro "O" é feita como uma sequência de letras, onde a primeira é B.
Seguindo essa "corrente" os macros vão expandindo um atrás do outro. Isso é brilhante hahaha.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...