原始配方是here(您也可以尝试使用您的程序)。
附加规则:
1.程序应从标准输入读取并写入标准输出
2.程序应该向调用系统/程序返回零
3.程序应该使用gcc -O2 -lm -s -fomit-frame-pointer编译和运行。
挑战有一些历史:2009年9月Polish programming contest blog宣布了短期实施的要求。比赛结束后,最短的代码是81个字符长。后来第二次调用甚至更短的代码,并在年后matix2267 published his solution 78字节:
main(c){read(0,&c,1)?c-41&&main(c-40&&(c%96<27||main(c),putchar(c))):exit(0);}
任何人都要更短或证明这是不可能的?
答案 0 :(得分:15)
以下是将代码缩减为 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 <LF>) */
main(c); /* recurse */
}
putchar(c); /* print */
}
main(c); /* recurse */
}
} else exit(0); /* end program */
}
答案 1 :(得分:6)
我不打算打破任何记录,但无论如何我都会发布:
#define x(z) while(p>##z s)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评论中指出的正确性问题。
答案 2 :(得分:6)
嗯,真正的赢家是那个写了你提供的这个小代码的人,但你可以稍微修改它以删除退出:
main(c){read(0,&c,1)?c-41&&main(c-40&&(c%96<27||main(c),putchar(c))):0;}
我尝试过它。