最高のプログラム難読化
xxxxxxxxxx
#include <ctype.h>
#include <stdio.h>
#define _ define
#_ A putchar
#_ B return
#_ C index
char*r,c[300001],*d=">=<=!===||&&->++-->><<",*i,*l,*j,*m,*k,*n,*h,*y;e,u=1,v,w,
f=1,p,s,x;main(a,b)char**b;{p=a>1?atoi(b[1]):79;r=c+read(0,j=l=i=c,300000);v=g(
j,&m);for(k=m;v!=2;j=k,m=n,v=w,k=m){w=g(k,&n);if(v==1&&m-j==1&&*j==35)e&&A(10),
e=f=0;if(!f&&v==3&&(char*)C(j,10)<m)A(10),e=0,f=1;else if(v>2&&(u||w)&&(f||u)&&
(l-i>1||*i!=61||n-k>1||!C("-*&",*k)))continue;else if(v==3)if(f&&e+1+n-k>p&&e)A
(10),e=0;else A(32),e++;else{if(f&&e+m-j>p&&e)A(10),e=0;e+=m-j;k=j;while(k<m)A(
*k++);}i=j;l=m;u=v;}e&&A(10);}g(j,m)char*j,**m;{if(j>=r)B*m=j,2;s=isdigit(*j)||
*j==46&&isdigit(j[1]);for(h=j;h<r;h++)if(!isalnum(*h)&&*h!=95&&(!s||*h!=46)&&(!
s||h[-1]!=101&&h[-1]!=69||!C("+-",*h)))break;if(h>j)B*m=h,0;x=1;for(h=j;h<r&&C(
" \t\n",*h);h++);if(h>j)h--,x=3;if(*j==34||*j==39)for(h=j+1;h<r&&*h!=*j;h++)if(
*h==92)h++;for(y=d;*y&&strncmp(y,j,2);y+=2);if(*y)h=j+1;if(!strncmp("/*",j,2)){
h=j+2;while(*++h!=42||*++h!=47);x=4;}*m=h+1;B x;}
引用元:https://www.ioccc.org/1987/heckbert/heckbert.c
審査員・作者による説明:https://www.ioccc.org/1987/heckbert/hint.html
テキストを指定幅で折り畳めるプログラム。
一行最大10文字で区切る例。
$ gcc -o heckbert heckbert.c
$ echo "a bb ccc dddd eeeee ffffff ggggggg" | ./heckbert 10
a bb ccc
dddd eeeee
ffffff
ggggggg
15文字で区切る例。
$ echo "a bb ccc dddd eeeee ffffff ggggggg" | ./heckbert 15
a bb ccc dddd
eeeee ffffff
ggggggg
20文字。
$ echo "a bb ccc dddd eeeee ffffff ggggggg" | ./heckbert 20
a bb ccc dddd eeeee
ffffff ggggggg
識別子や文字列リテラルのようなところで区切らないような工夫もあるらしい。
$ echo 'a bb "ccc dddd eeeee" ffffff ggggggg' | ./heckbert 15
a bb
"ccc dddd eeeee"
ffffff ggggggg
そのため、自分自身を折りたたんだ上でビルドすることもできる。
$ ./heckbert 40 < heckbert.c > tmp.c
$ gcc tmp.c
このプログラムの背景には、当時の通信環境や慣習がある。 ネットニュースや当時のメールなどのプロトコルでは、テキストの横幅を最大70~80文字程度で区切る必要があった。 そういうときにこのプログラムは便利。 ただ、区切るだけならfoldコマンドがすでにあった。 このプログラムは、C言語テキストに特化して文字列リテラルなどを分割しないように配慮するところがfoldより賢いのだと思う。
実際、[[1986/stein]]はワンライナーであるにも関わらず行分割がされている。 行分割したままビルドできるようにするためには、識別子や文字列リテラルの途中に改行を入れないよう、注意する必要があった。 hint.textには審査員コメントとして「このプログラムはコンテストの道具箱にいれておきました」と書かれている。 つまりこのプログラムはIOCCCの審査員にとって特に便利だったと思われる。 IOCCCでは、審査員に(大げさに)媚びる芸風の作品がしばしば採択されるが、そのきっかけの作品かもしれない。
#define _ define
のテクニックが使われているので、修正が必要。
xxxxxxxxxx
--- heckbert.c
+++ heckbert.c
#include <ctype.h>
#include <stdio.h>
#define _ define
-#_ A putchar
-#_ B return
-#_ C index
+#define A putchar
+#define B return
+#define C index
char*r,c[300001],*d=">=<=!===||&&->++-->><<",*i,*l,*j,*m,*k,*n,*h,*y;e,u=1,v,w,
f=1,p,s,x;main(a,b)char**b;{p=a>1?atoi(b[1]):79;r=c+read(0,j=l=i=c,300000);v=g(
j,&m);for(k=m;v!=2;j=k,m=n,v=w,k=m){w=g(k,&n);if(v==1&&m-j==1&&*j==35)e&&A(10),