在C中将中缀表达式转换为后缀(RPN)的最短方法

这里给出了原始配方(你可以尝试你的程序的正确性)。

附加规则:
1.程序应从标准输入读取并写入标准输出。
2.程序应该向调用系统/程序返回零。
3.程序应该使用gcc -O2 -lm -s -fomit-frame-pointer编译和运行。

挑战有一些历史:2009年9月在波兰编程竞赛博客上宣布了短期实施的要求。 比赛结束后,最短的代码是81个字符长。 后来第二次调用甚至更短的代码,并在年后matix2267以78字节发布了他的解决方案 :

main(c){read(0,&c,1)?c-41&&main(c-40&&(c%96<27||main(c),putchar(c))):exit(0);} 

有人让它更短或certificate这是不可能的吗?

这是一种将代码减少到76个字符的方法:

 main(c){read(0,&c,1)?c-41&&main(c-40&&putchar(c,c%96>26&&main(c))):exit(0);} 

为清晰起见,更长的评论版本:

 int main(int c) { if (read(0,&c,1)) { /* read char */ if (c-41) { /* if not ')' */ if (c-40) { /* then if not '(' */ if (c%96>26) { /* then if operator (not alphabet or ) */ main(c); /* recurse */ } putchar(c); /* print */ } main(c); /* recurse */ } } else exit(0); /* end program */ } 

好吧,真正的赢家是那个写了你提供的这个小代码的人,但是你可以稍微修改它以删除退出:

 main(c){read(0,&c,1)?c-41&&main(c-40&&(c%96<27||main(c),putchar(c))):0;} 

我试过,它的工作原理。

我不打算打破任何记录,但无论如何我都会发布:

 #define x(z) while(p>##zs)putchar(*p--); main(c){ int s[9],*p=s-1; for(;read(0,&c,1);){ isalpha(c)?putchar(c):c=='('?(c=0):c==')'?(c=1):isdigit(c)?:(*++p=c); if(c==0){x()main(0);} if(c==1) break;} x(=)return 0;} 

编辑:修正kuszi评论指出的正确性问题。