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

在C语言中将中缀表达式转换为后缀(RPN)的最短方法,c,C,给出了原始公式(您也可以尝试您的程序以确保正确性) 其他规则: 1.程序应从标准输入读取,并写入标准输出。 2.程序应向呼叫系统/程序返回零。 3.程序应该使用gcc-O2-lm-s-fomit帧指针编译和运行 这一挑战有一定的历史渊源:2009年9月的会议上宣布了对短期实施的呼吁。比赛结束后,最短的代码是81个字符长。后来,第二次调用的代码更短,在78字节的matix2267年之后: main(c){read(0,&c,1)?c-41&&main(c-40&&a

给出了原始公式(您也可以尝试您的程序以确保正确性)

其他规则:
1.程序应从标准输入读取,并写入标准输出。
2.程序应向呼叫系统/程序返回零。
3.程序应该使用gcc-O2-lm-s-fomit帧指针编译和运行

这一挑战有一定的历史渊源:2009年9月的会议上宣布了对短期实施的呼吁。比赛结束后,最短的代码是81个字符长。后来,第二次调用的代码更短,在78字节的matix2267年之后:

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

main(c){read(0,&c,1)?c-41&&main(c-40&&c%96我不想打破任何记录,但无论如何我会发布以下内容:

#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评论中指出的正确性问题。

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

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

main(c){read(0,&c,1)&c-41&&main(c-40&&c%96以下是一种将代码减少到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 */
}
intmain(intc)
{
如果(读(0,&c,1)){/*读字符*/
如果(c-41){/*if not''*/
如果(c-40){/*那么如果不是'('*/
如果(c%96>26){/*那么如果运算符(不是字母或)*/
main(c);/*递归*/
}
putchar(c);/*打印*/
}
main(c);/*递归*/
}        
}否则退出(0);/*结束程序*/
}

@fuzzyTew,短路对于c来说并不是未定义的,它实际上定义得很好。| |和&&应该是短路对删除表示歉意。我确实体验到,启用优化的visual studio 6会颠倒顺序。一定是它的许多错误之一。我不投票关闭。我投票删除标记[code golf]@Lamber请看一看mizo对其代码的解释(可能有助于理解此代码)。相关:如果您喜欢此类谜题,您可以查看更多(允许使用多种编程语言)。您的程序不应输出测试用例的数量,并且在测试用例后缺少新行字符。See会同意,但我尝试了一下,结果几乎相同,但不完全相同。使用您的示例输入得到一个额外的尾随“3”。我没有这个额外的“3”使用gcc 3.4.4。您使用哪一个?gcc版本3.4.6 20060404(Red Hat 3.4.6-11)。也就是说,我在gcc 4.1.2上试用过,效果很好。好吧,这似乎取决于gcc的版本。不确定是否值得否决,但这意味着这不是一个好的解决方案。顺便说一句,我很惊讶gcc的不同版本提供了不同的结果。@mizo,你是对的,它不应该在任何gcc版本上工作。我不知道为什么3没有与gcc 3.4.4一起显示,重试时,根据提供的输入,它有时出现,有时不出现。奇怪…@Chris Dodd有任何示例/解释吗?