C “最短打印方式”;“成功”;

C “最短打印方式”;“成功”;,c,C,我在spoj一直在尝试这个问题,但我无法得到这个问题的最佳解决方案 我试过了 int main(){return !puts("Success");} 但它需要45个字符。有其他解决问题的建议吗?人们也用24个字符解决了这个问题 main(){puts("Success");} 24个字符 在C语言中,如果省略返回类型,它将隐式地int 如果main()不包含return语句,则main的返回值为0 更新: 好的,在每个版本的C中都可以省略main的返回,但是如果省略,只有C99将返回值

我在spoj一直在尝试这个问题,但我无法得到这个问题的最佳解决方案

我试过了

int main(){return !puts("Success");}
但它需要45个字符。有其他解决问题的建议吗?人们也用24个字符解决了这个问题

main(){puts("Success");}
24个字符

  • 在C语言中,如果省略返回类型,它将隐式地
    int
  • 如果main()不包含return语句,则main的返回值为0
更新: 好的,在每个版本的C中都可以省略main的返回,但是如果省略,只有C99将返回值定义为0。C99也不允许隐式声明

更新:
我隐约记得有人因为一个类似的问题做了这个:他/她以某种方式将大部分程序编码到文件名中,这样就可以在程序代码中使用_file__;宏来注入代码。我不知道这是否在OP的比赛规则范围内,但无论如何,这应该是一个有趣的练习。

这里有一个简单的24字符游戏

main(){puts("Success");}

无论是
main()
int
返回类型还是
return
语句都不是严格必需的…

问题语句非常模糊,它看起来需要使用
gcc-ansi
编译,运行时返回0。我能想到的最好的办法是:

main(){exit(!puts("Success"));}
计算最后换行符的32个字符(可以省略吗?)。将
int
添加到
main()
将其设置为36个字符

编辑 这可能是不允许的:

/* Filename: Success */
main(){exit(!puts(__FILE__));}
使用
gcc-xc-ansi Success
编译,它将为您保存另一个字符

那么这一个字符的解决方案呢:

C

只需使用
gcc-ansi-DC='int main(void){puts(“Success”);return 0;}'

进行编译,使其更小依赖于执行不可移植或严格有效的操作C。在规则执行不严的POSIX环境中,您可以执行(18个字符):

但除非
int
和指针的大小相同,否则这将中断。添加1个额外字符,并利用实际POSIX系统具有相同大小的
long
和指针类型这一事实:

main(){perror(0L);}
我想你不能再把它缩小了。

30个字符:

main(){perror(0);}
int main(){perror(0);}
main(){exit(!printf("%m\n"));}
main(){exit(!printf("%m
"));}
 cat src.c

 (empty)
29个字符:

main(){perror(0);}
main(){exit(!printf("%m\n"));}
main(){exit(!printf("%m
"));}
 cat src.c

 (empty)
我用0(零)个字符制作:

main(){perror(0);}
main(){exit(!printf("%m\n"));}
main(){exit(!printf("%m
"));}
 cat src.c

 (empty)
生成的可执行文件:

rbo@deneb ~
$ ./src
SUCCESS
和命令行:

rbo@deneb ~
$ echo x>>src.c && gcc -Dx="int main(){return puts(\"SUCCESS\");}" -o src src.c
但这当然仍然会创建一个带有on字符的源文件,正如下面所指出的。如果没有任何源文件,该命令将是(在Unix环境中):

比上面的还要短。在最初的描述中,没有说明如何解决它的限制,但是OP在后面的注释中添加了他不能更改命令行的内容。如果这是真的,那么这不是真正的代码

问候

rbo

26个字符

main(){j0(!printf("%m"));}


这会导致NZEC错误,因为我们需要返回0并使用int main,请自己尝试。WTF是NZEC吗?网站上的问题声明没有说明任何有关
返回0
int main()
的内容。这是完全有效的C。@Luther竞赛似乎使用了ANSI C,其中main()中的返回值不能省略。在当前版本的C中,允许省略
main
正文中的任何
return
语句,不允许省略返回类型(
int
)在函数声明中。@Chinmay:我相信它代表非零错误代码,是所有问题的要求之一。这在1999年以前可能是正确的,但现在C要求返回类型显式int。使用-ansi one run时,返回值为8。。。因此,无论如何,对于ansi来说,return不能被认为是隐式的,尽管缺少int也可以,但编译器标志的规则是什么?除了-ansi和gcc 4.3的建议之外,没有明确的规则。2@Kenny:这不是一场竞赛,就像其他一些[代码高尔夫]问题一样,我不明白为什么它应该是CW。(但无论如何,现在它是不可逆转的。)我不知道那里的人是如何只用24个字符就解决了这个问题的,还是他们作弊了:P?DC选项做了什么?但是我不允许更改编译器标志,-D从命令行给预处理器一个
#define
语句-因此他将
C
定义为
int main…
,然后文件本身就是一个
C
,由命令行中的程序替换。@Samuel:
-DC
定义一个预处理器常量,就像
#define
一样。因此,上面的解决方案就是将整个程序移动到命令行中。:)代码得分通常需要计算针对解决方案的命令行参数的多余字符数。好样的,伙计。考虑到在/lib和/usr/lib中获得巨大成功的结果,可能还有另一种方法。spoj希望在标准输出上使用它,并且他们希望GNU系统上的退出代码为0:
main(){return printf(“%m\n”),0;}
。这里使用的是
brk
?这只是一种随机伪造的方式,将0放入
%eax
?我在法官中保留了这个问题的当前记录(24),这与我的解决方案非常接近,只是我没有使用任何brk()。@Quixotic我从过去6个月开始解决这个问题,但我仍然无法用24个字符来解决它,应该用什么来代替brk())??@Avinasse:只要printf()就可以了!:-)@阿维纳什:你说得对。实际上,在
printf()
中使用时有一个参数可以保证(至少在SPOJ系统中)正确的退出状态。我花了一些时间才弄明白。我相信你也会的。不要放弃。:)整洁的它编译时没有-lm吗?没有。正数的贝塞尔函数不是零。所以斯波吉不会接受的。结束。24长解决方案的提示:这并不是真正的零,因为您在编译之前将“x”写入源文件。此外,在这个问题上,我认为