画像処理2
もうちょっと縮んだヤツ。
結局前から30バイトぐらい縮んでる。そして恐らくこのへんが限界。
律儀にエラー処理しなければもっと縮むけど。
#include<stdio.h> FILE*i,*o;int x,y=0,W,H,s,t,m[9999][9999]={0};M(j){return 1023<<j*10;}S(j,f){re\ turn j*10+(j-1?f:0);}P(p){fputc(((m[y][x]&M(s))>>S(s--,1))/p,o);}O(p,q){s=2,P(q/ 4),P(p&1?3:4),P(q&3);}L(s,d){while(s/=4)m[y+(s/d&3)-1][x+(s&3)-1]+=t;}N(j){m[y][ x]+=((t=fgetc(i)<<S(j,0))*4);L(400,4);--j&&L(108800,16);x++;}main(int c,char**v) {char s[99];if((i=fopen(v[1],"rb"))&&(o=fopen(v[2],"wb"))&&!strncmp(fgets(s,99,i ),"P5",2)){while(fgets(s,99,i)&&*s=='#');sscanf(s,"%d %d",&W,&H);if(atoi(fgets(s ,99,i))==255){while(++y<=H)for(x=1;x<=W;)y&1&&N(2),N(1),~y&1&&N(0);fprintf(o,"P" "6\n%d %d\n255\n",W,H);for(y=x=1;x<=W;x++)O(x,9);while(x=1,++y<H){O(y,9);while( ++x<W)O(0,10);O(y,9);}while(x<=W)O(~x,6),x++;}}S(0,0);}
と思ったらさらに30バイト縮みました('ω`)
700バイト下回った(・д・)
#include<stdio.h> FILE*i,*o;int x,y=0,W,H,s,t,m[9999][9999]={0},S[]={1,10,21};P(p){fputc(((m[y][x] &(1023<<s*10))>>S[s--])/p,o);}O(p,q){s=2,P(q/4),P(p&1?3:4),P(q&3);}L(s,d){while( s/=4)m[y+(s/d&3)-1][x+(s&3)-1]+=t;}N(j){m[y][x]+=((t=fgetc(i)<<j*10)*4);L(400,4) ;--j&&L(108800,16);x++;}main(int c,char**v){char s[99];if((i=fopen(v[1],"rb"))&& (o=fopen(v[2],"wb"))&&!strncmp(fgets(s,99,i),"P5",2)){while(fgets(s,99,i)&&*s== '#');sscanf(s,"%d %d",&W,&H);if(atoi(fgets(s,99,i))==255){while(++y<=H)for(x=1;x <=W;)y&1&&N(2),N(1),~y&1&&N(0);fprintf(o,"P6\n%d %d\n255\n",W,H);for(y=x=1;x<=W; x++)O(x,9);while(x=1,++y<H){O(y,9);while(++x<W)O(0,10);O(y,9);}while(x<=W)O(~x,6 ),x++;}}return 0;}