C, 259 바이트
주석없이 PPM 파일 을 가져옵니다 .
double*f,r,g,b;x,y,z,i;char*s="%d %d %d";main(a,_){(a-2)?(feof(f)?0:(fscanf(f,s,&x,&y,&z),r+=(x-r)/i,g+=(y-g)/i,b+=(z-b)/i++,main(0,0))):(f=fopen(((char**)_)[1],"r"),fscanf(f,"%*s%*d%*d%*d"),r=g=b=0.,i=1,main(0,0),printf(s,(int)r,(int)g,(int)b),fclose(f));}
방법
초기 코드 :
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE *f = fopen(argv[1],"r");
int w,h,d,x,y,z,i;
double r,g,b;
fscanf(f,"%*s %d %d %d",&w,&h,&d);//get width, height, depth, ignore P6
r = g = b = 0.0; //zero r, g, and b totals
for (i=1; i<=w*h; ++i) {
fscanf(f,"%d %d %d",&x,&y,&z);//get next pixel
r+=(x-r)/i;//update averages
g+=(y-g)/i;
b+=(z-b)/i;
}
printf("%d %d %d",(int)r,(int)g,(int)b);//print result
fclose(f);
return 0;
}
변수를 다듬고 루프를 제거하십시오.
double r,g,b;
FILE *f;
int i;
int main(int argc, char *argv[])
{
if (argc==2) { // {./me} {file.ppm}
f = fopen(argv[1],"r");
fscanf(f,"%*s%*d%*d%*d");//drop info
r = g = b = 0.0;
i = 1;
main(0,0);//begin load loop
printf("%d %d %d",(int)r,(int)g,(int)b);
fclose(f)
} else {
if (feof(f)) return 0;
fscanf(f,"%d%d%d",&x,&y,&z);
r+=(x-r)/i;
g+=(y-g)/i;
b+=(z-b)/i;
i++;
main(0,0);
}
return 0;
}
거기서 나는 다양한 진술을 단일 반환 진술로 결합했습니다. 그것과 다른 불필요한 유형 정보를 제거하고 변수의 이름을 바꾸고 공백을 자릅니다.