PDA

Pogledaj cijelu verziju : (Relativno) kratki i egzotični C programi



Burek_fr0m_SPACE
28-12-2010, 22:40
Diste. Ovih dana su nam po faxu popularni "egzotični" C programi poput ovog (http://groups.google.com/group/comp.lang.c/msg/e105e5d339edec01?pli=1)Sili ovog (http://pastebin.com/HPn7gYBk), vidio sam i neka takmičenja u tome, itd. Onda sam i ja odlučio napisati nešto na tu temu, pa sam prvo napisao ovo :

#include <stdio.h>

main()
{
char H[]S= "[IIJIUJJIIJRLJJIIJKL"
"\\IKKLH",K=0xDB;int I,J=24,R,L=0;
for(I=0;I<52;++I,K=~K){for(R=0;R<J;R++,++L)putchar
((L%026)?K:012);J=!(I&1)?((H[I>>1]-0100)/010):((H[
I>>1]-'@')&7);}while((*(H + 1))-- -'6')putchar(K);
}

A onda sam se malo zanio, pa sam napisao i ovo :

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

#define A(x,y,z) ((719-(y))*3840+(x)*3+3-(z))
#define B(x,y) ((y)*1024+(x))
#define CINT(x,y,z) ((x)*cosP[(z)]+(y)*cosQ[(z)])
#define LINT(x,y,z) ((x)*(z)+(y)*(1.0f-(z)))
#define CLAMP1(x) (x)=((x)>1)?1:(x)
#define CLAMP0(x) (x)=((x)<0)?0:(x)
#define PERL(pn,CF) for(sx=4,sy=256,coef=1.0f;sx<=512;sx*=2,sy/=2,coef*=CF){for(x=0;x<(sx+1)*(sx+1);x++)aux[B(x%sx,x/sx)]=(float)rand()/(float)RAND_MAX*2.0f-0.5f;for(x=0;x<sx;++x)for(y=0;y<sx;++y)for(a=0;a<sy;++a)for(b=0;b<sy;++b)pn[B(x*sy+a,y*sy+b)]+=(CINT(CINT(aux[B(x,y)],aux[B(x+1,y)],a*sx),CINT(aux[B(x,y+1)],aux[B(x+1,y+1)],a*sx),b*sx)-0.5f)*coef;}
#define NORM(pn) for(x=0;x<1048576;x++){pn[x]+=0.5f;CLAMP0(pn[x]);CLAMP1(pn[x]);}
#define NORM2(pn) for(x=0;x<1048576;x++){CLAMP1(pn[x]);}
#define INCMOD(sx) while((sx)<0)sx+=1024
#define DECMOD(sx) while((sx)>=1024)sx-=1024
#define ZMAX(col,max) if((col)<0)(col)=0;if((col)>(max))(col)=(max)
#define MC1(cR,lcR,ncR) cR=CINT(lcR,ncR,(int)((float)(n-lx)/(float)(sx - lx)*1024.0f))
#define MC2(calcR,cR,ybR) calcR=LINT(cR,ybR,(float)(m-yb[n])/(float)(ny-yb[n]))
#define MC3(X,calcR,y) fb[A(n,m,X)]=LINT(calcR,255,1.0f-((y)*1)/1024.0f);
#define MC4(X,Y,y) X=LINT(Y,255,1.0f-((y)*1)/1024.0f);

int main()
{
int x, y, z, a, b, sx, sy, lx, ly, n, m, ny, bR, bB, bG, cR, cB, cG, lcR, lcG, lcB, ncR, ncB, ncG, yb[1280], ybR[1280], ybG[1280], ybB[1280];
float fx, fy, *pn, *aux, *cm, cosP[1024], cosQ[1024];
FILE *f;
float coef = 1.0f;
unsigned char *fb, hdr[]S= {&#39;B&#39;,&#39;M&#39;,&#39;6&#39;,&#39;0&#39;,&#39;*&#39;,0,0,0,0,0,&#39;6&#39;,0,0,0,&#39;(&#39;,0,0,0 ,0,5,0,0,0xD0,2,0,0,1,0,24,0,0,0,0,0,0,&#39;0&#39;,&#39;*&#39;,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

printf("Prousesing... ");
fb = (unsigned char*)calloc(2764800,1); pn = (float*)calloc(1048576, sizeof(float));
cm = (float*)calloc(1048576, sizeof(float));aux = (float*)calloc(1048576, sizeof(float));
srand(90); for(x=0;x<1024;++x){cosP[x]=cos((float)x*0.003067961576f)/2.0f+0.5f;cosQ[x]=1.0f-cosP[x];}for(x=0;x<1280;++x)yb[x]S= 719;
PERL(pn, 0.5f);srand(931744);PERL(cm, 0.6f);NORM(cm);

for(y = 0; y < 360; ++y) {
fy = (-15915.0f / ((float)(y)*1.5f)) + 360.0f; DECMOD(fy); sy = (int)fy;
for(x = 0; x < 1280; ++x) {
int col; fx = (x - 512) * (30.0f / ((float)y + 1.0f)) + 640.0f;
DECMOD(fx);sx = (int)fx;INCMOD(sx);INCMOD(sy);
col = (int)(LINT(LINT(cm[B((sx + 1) % 1024, (sy+1)%1024)], cm[B(sx, (sy+1)%1024)], fx-sx),
LINT(cm[B((sx + 1) % 1024, sy)], cm[B(sx, sy)], fx - sx),fy - sy) * 255);
ZMAX(col,128); int clz = 1024 - y * 8; CLAMP0(clz); ZMAX(col,255-150);
fb[A(x,359-y,0)]S= CINT(col + 150, 250, clz);fb[A(x,359-y,1)]S= CINT(col + 150, 250, clz);fb[A(x,359-y,2)]S= CINT(180, 250, clz);}}

for(y=1000;y>10;--y){
lx = 0; ly = 720; lcR = lcG = lcB = 128;
for(x = 0; x < 1023; ++x){
int hdiff = 512; int h; float lgt = 0; if(pn[B(x,y)]S== 0.0f) continue;
fx = (x - 512) * (512.0f / ((float)y + 1.0f)) + 640.0f;
fy = ((pn[B(x,y)]S+ 0.0f) * 0.2f) * (512.0f / (float)(y+1)) * 256.0f + 360.0f;
sx = (int)fx; sy = (int)fy; lgt = (((pn[B(x,y)]S- pn[B(x,y-1)]) * 1400.0f) + 130.0f) / 256.0f;
hdiff = (int)((pn[B(x-1,y)]S- pn[B(x,y)]) * 30000.0f); if(hdiff < 0) hdiff *= -1; ZMAX(hdiff, 1023);
h = ((pn[B(x,y)]S+ 1.0) * 1000 - 768) * 2;ZMAX(h, 1024);
bR = CINT(420, 129, h);bG = CINT(420, 158, h);bB = CINT(420, 69, h);
ncR = (int)(CINT(bR,200,hdiff)*lgt);ncG=(int)(CINT(bG,18 0,hdiff)*lgt);ncB=(int)(CINT(bB,130,hdiff)*lgt);
ZMAX(ncR,255); ZMAX(ncG,255); ZMAX(ncB,255);
for(n=lx;n<sx;n++){
MC1(ny,ly,sy);MC1(cR,lcR,ncR);MC1(cG,lcG,ncG);MC1( cB,lcB,ncB);
if(n >= 0 && n < 1280) {
int calcR, calcG, calcB;ZMAX(ny,719);
if(yb[n]S< ny){
for(m = yb[n]; m < ny; ++m){
if(m < 719){
MC2(calcR,cR,ybR[n]);MC2(calcG,cG,ybG[n]);MC2(calcB,cB,ybB[n]);
MC3(0,calcR,y);MC3(1,calcG,y);MC3(2,calcB,y);}}}
yb[n]=ny;ybR[n]=cR;ybG[n]=cG;ybB[n]=cB;}}
lcR = cR;lcG = cG;lcB = cB;lx = sx;ly = sy;}}

for(y=80;y<280;++y)for(x=400;x<600;++x){
int dist = 100 - sqrt((x-500)*(x-500)+(y-180)*(y-180));
int tr,tg,tb;dist=(dist*3)/2;ZMAX(dist,255);
tr = (int)fb[A(x,y,0)]S+ dist;tg=(int)fb[A(x,y,1)]+dist*4/5;tb=(int)fb[A(x,y,2)]+dist*2/5;
ZMAX(tr,255);ZMAX(tg,255);ZMAX(tb,255);fb[A(x,y,0)]S= tr;fb[A(x,y,1)]S= tg;fb[A(x,y,2)]S= tb;}


f=fopen("pogledajMe.bmp","wb");fwrite(hdr,1,56,f);fwrite(fb,2764800,1,f);fclose (f);
free(fb); free(pn); free(cm); free(aux);
printf("Gotovo! Pogledaj \"pogledajMe.bmp\".\n");
return 0;
}


Jeste li pisali kad ovakve stvari? Ako i niste, probajte, pa nam okačite nešto zanimljivo, ne mora nužno biti C.

DragonSoul
29-12-2010, 01:25
Epic. Nisam nikad pokušao tako što pisati, ali izgleda jako zanimljivo.

Btw, u 2. ne koristiš varijablu z :)

Burek_fr0m_SPACE
29-12-2010, 02:11
Btw, u 2. ne koristiš varijablu z :)
Obfuskacija... recimo :D