七行プログラミング

このエントリーをはてなブックマークに追加
153*nix厨
やっと7行になったよ
#include <stdio.h>
int e=31,f=1023,g=0,h,i,j,k,l=0,m,n=127,o,(*p)()=&putchar,s;char *d=0;main(){
while((s=getchar())-EOF){d=realloc(d,l+9);d[l++]=s;}memset(d+l,0,8);printf(
"%x\n",l);l+=8;for(s=0;s<(l-3);s++){j=(s>e)?e:s;for(m=1,j=(l-s-2>j)?j:(l-s);j>2
;j--){for(i=(s<f)?0:s-f;i<s;i++){if(!(m=memcmp(d+i,d+s,j))||i+j>l)break;}if(!m)
break;}if(!m){if(s-g){for(k=s-g;k>n;k-=n)r(o=n);r(o=k);}(*p)(128+(j<<2)+(s-i)/
256);(*p)((s-i)%256);s=(g=s+j)-1;}}}r(){(*p)(o);for(h=0;h<o;h++)(*p)(d[g++]);}

出力フォーマットは>>146と同じだが、先頭行に圧縮前サイズを出力するようになった。
これは終了時の処理が7行にまとまらなかったためで、オーバーランして圧縮し、
復号時に圧縮前サイズまで展開をする。この外道な仕様で勘弁して(w
154*nix厨:2001/03/14(水) 19:45
復号できたよ。

#include <stdio.h>
#include <stdlib.h>
int c,h,i,j,l,s=0;char *d=0;main(){if(scanf("%x\n",&l)-1)return 1;if(!(d=(char*
)malloc(l+8)))return 2;while((c=getchar())-EOF){if(c<127){for(i=0;i<c;i++){if((
h=getchar())-EOF){d[s++]=h;}else return 1;}}else{if((h=getchar())-EOF){h+=(c-
128)<<8;for(i=0,j=s-(h&1023);i<h>>10;i++){d[s++]=d[j++];if(s>l)break;}}else
return 1;}if(s>l)break;}fwrite(d,1,l,stdout);return 0;}

フォーマット異常時の処理まで手が回っていないので、>>153の出力結果だけ
放りこむようにしてください。