对一个IOCCC获奖程序的研究

该程序的源代码最初是在matrix67的blog上看到的:

#include <stdio.h> main(t,_,a) char *a; { return!0<t?t<3?main(-79,-13,a+main(-87,1-_,main(-86,0,a+1)+a)): 1,t<_?main(t+1,_,a):3,main(-94,-27+t,a)&&t==2?_<13? main(2,_+1,"%s %d %d/n"):9:16:t<0?t<-72?main(_,t, "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#/ ;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l / q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# / ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' / iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c / ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')#/ }'+}##(!!/") :t<-50?_==*a?putchar(31[a]):main(-65,_,a+1):main((*a=='/')+t,_,a+1) :0<t?main(2,2,"%s"):*a=='/'||main(0,main(-61,*a, "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:/nuwloca-O;m .vpbks,fxntdCeghiry"),a+1); }

(gcc 4.1.2编译通过)

 

 

该代码写出来虽然很有艺术效果,但实在太乱,不便于理解。我整理了一下:

#include <cstdio> #define STR_0 "@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+,/#{l+,/n{n+,/+#n+,/#/ ;#q#n+,/+k#;*+,/'r :'d*'3,}{w+K w'K:'+}e#';dq#'l / q#'+d'K#!/+k#;q#'r}eKK#}w'r}eKK{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d}rw' i;# / ){nl]!/n{n#'; r{#w'r nc{nl]'/#{l,+'K {rw' iK{;[{nl]'/w#q#n'wk nw' / iwk{KK{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c / ;;{nl'-{}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;#'rdq#w! nr'/ ') }+}{rl#'{n' ')#/ }'+}##(!!/" #define STR_1 "!ek;dc i@bK'(q)-[w]*%n+r3#l,{}:/nuwloca-O;m .vpbks,fxntdCeghiry" int work(int t, int m, int n) { if (t > 1) { if (t < 3) work(-79, -13, n + work(-87 ,1 - m, work(-86, 0, n + 1) + n)); if (t < m) work(t + 1, m, n); if (work(-94, -27 + t, n) && t == 2) { if (m < 13) return work(2, m + 1, (int)"%s %d %d/n"); else return 9; } else return 16; } else { if (t < 0) { if (t < -72) return work(m, t, (int)STR_0); if (t < -50) { if (m == *(char*)n) return putchar(*((char*)n + 31)); else return work(-65, m, n + 1); }else return work((*(char*)n == '/') + t, m, n + 1); } if (t > 0) return work(2, 2, (int)"%s"); if (*(char*)n == '/') return 1; return work(0, work(-61, *(char*)n, (int)STR_1), n + 1); } } int main() { work(1, 0, 0); }

 

 

 

尝试在GDB中跟踪,发现这几乎不可行。。。

其工作原理还是没搞懂,初步猜想是一种字符串解压缩算法。

 

 

另外,源程序中 31[a] 这个表达式我一直没搞懂,后来查了C99手册才算明白:

A postfix expression followed by an expression in square brackets [] is a subscripted
designation of an element of an array object. The definition of the subscript operator []
is that E1[E2] is identical to (*((E1)+(E2))). Because of the conversion rules that
apply to the binary + operator, if E1 is an array object (equivalently, a pointer to the
initial element of an array object) and E2 is an integer, E1[E2] designates the E2-th
element of E1 (counting from zero).

你可能感兴趣的:(算法,object,gcc,Blog,Integer,Matrix)