编写一个程序,将其源代码的反向输出为字符串。如果源是
abcd
efg
(即 C 字符串"abcd\nefg"
)
那么输出应该是
gfe
dcba
(即 C 字符串"gfe\ndcba"
)
使用诸如 Brainf*ck 等深奥语言的奖励积分。
*编辑:** 删除了不必要的 \0 字符。+
编写一个程序,将其源代码的反向输出为字符串。如果源是
abcd
efg
(即 C 字符串"abcd\nefg"
)
那么输出应该是
gfe
dcba
(即 C 字符串"gfe\ndcba"
)
使用诸如 Brainf*ck 等深奥语言的奖励积分。
*编辑:** 删除了不必要的 \0 字符。+
Powershell FTW(1 个字符):
1
将其直接放在命令行上或脚本内。
这是一个两行代码,改编自NeatQuine.py:
me = 'me = %(me)r\nprint (me %% locals())[::-1]'
print (me % locals())[::-1]
int sprintf(char*,char*,...);char*d=
"int sprintf(char*,char*,...);char*d=%c%c%s%c%c,b[999],*p=b+251;main(){for(sprintf(b+1,d,10,34,d,34,10,10,10);*p;)putchar(*p--);}%c"
,b[999],*p=b+251;main(){for(sprintf(b+1,d,10,34,d,34,10,10,10);*p;)putchar(*p--);}
(10 Charecters)
cat $0|rev
This must be saved as a script file to work and executed on the same directory.
Another solution would be in python (or any other scripting languages) a zero byte source code file! it will print nothing in return. There's nothing in the rules saying it can't be 0byte file :).
|.(,~,2#{:)'|.(,~,2#{:)'''
产生输出:
'''):{#2,~,(.|'):{#2,~,(.|
我会在高尔夫上输,但它教会了我关于reverse()
. Perl中有太多(142) 个字符:
#!/usr/bin/perl
$_='#!/usr/bin/perlc%$_=c%s%c%;print sprintf~~reverse,10,39,~~reverse,39,10;c%';print sprintf~~reverse,10,39,~~reverse,39,10;
这证明sprintf()
/reverse()
组合不是解决这个问题的方法。更好的 Perl 解决方案无疑会使用eval()
.
巨大改进:45 个字符:
print~~reverse <<''x2
print~~reverse <<''x2
请注意,源文件应以空行结尾。空行被计入字符数 - 你认为我们如何从两行相同的代码中得到奇数字符数?
Python 2(55 个字符):
x='x=%s;print(x%%repr(x))[::-1]';print(x%repr(x))[::-1]
更好的高尔夫球手可能会稍微缩短这一点,因此欢迎任何改进。
编辑(43 个字符):
x='x=%r;print(x%%x)[::-1]';print(x%x)[::-1]
还要感谢 @stephan202 捕捉打印上的空白
在 Python 交互式提示符下:
xatnys dilavni :rorrExatnyS
27 个字符。
在 C 中,217 个字符:
a="};)01(rahctup;)--p*(rahctup);p*;43=p*(rof;)a(ftnirp;))a,b=p(tacrts(nelrts=+p{)p*rahc(niam;}7393422{=]99[b;";b[99]={2243937};main(char*p){p+=strlen(strcat(p=b,a));printf(a);for(*p=34;*p;)putchar(*p--);putchar(10);}
open System;let R(s:String)=new System.String(s|>List.of_seq|>List.rev|>Array.of_list) in let q=char 34 in let Q(s:String)=s.Replace(new String([|q|]),new String([|char 92;q|])) in let Quine s=String.Format("let s={0}{1}{2} in printf {3}%s%s{4} (R(Quine s)) (R s)",[|box q;box(Q s);box q;box q;box q|]) in let s="open System;let R(s:String)=new System.String(s|>List.of_seq|>List.rev|>Array.of_list) in let q=char 34 in let Q(s:String)=s.Replace(new String([|q|]),new String([|char 92;q|])) in let Quine s=String.Format(\"let s={0}{1}{2} in printf {3}%s%s{4} (R(Quine s)) (R s)\",[|box q;box(Q s);box q;box q;box q|]) in " in printf "%s%s" (R(Quine s)) (R s)
插入换行符(中断程序,但在此处使其更具可读性):
open System;
let R(s:String)=new System.String(s|>List.of_seq|>List.rev|>Array.of_list) in
let q=char 34 in
let Q(s:String)=s.Replace(new String([|q|]),new String([|char 92;q|])) in
let Quine s=String.Format("let s={0}{1}{2} in printf {3}%s%s{4} (R(Quine s)) (R s)",
[|box q;box(Q s);box q;box q;box q|]) in
let s="open System;
let R(s:String)=new System.String(s|>List.of_seq|>List.rev|>Array.of_list) in
let q=char 34 in
let Q(s:String)=s.Replace(new String([|q|]),new String([|char 92;q|])) in
let Quine s=String.Format(\"let s={0}{1}{2} in printf {3}%s%s{4} (R(Quine s)) (R s)\",
[|box q;box(Q s);box q;box q;box q|]) in " in
printf "%s%s" (R(Quine s)) (R s)
Javascript - IE/Chrome/FF
(function(){alert(("("+arguments.callee+")()").split("").reverse().join(""))})()
不幸的是,这需要使用高度非标准的功能strrev()
:
main(){char*a="};)43,)b(verrts,43,a(ftnirp;)a(pudrts=b*,%c%s%c=a*rahc{)(niam",*b=strdup(a);printf(a,34,strrev(b),34);}
好吧,当然一个空的 shell 脚本不会输出任何东西,但我能想到的下一个最好的事情是:
a=\;printf\ \"a=%q%s\"\ \"\$a\"\ \"\$a\"\|rev;printf "a=%q%s" "$a" "$a"|rev
同样的把戏。
UNIX 外壳:
z=\' a='z=\\$z a=$z$a$z\;eval echo \$a\|rev';eval echo $a|rev
我倾向于重复我自己:这些程序应该被称为“Goedels”,因为大多数此类事物背后的想法(在现代)首先由 Kurt Goedel 用于证明他的第一不完备性定理(Kurt Goedel's Collected作品 I,第 175 页)。
73 个字符。
#! /opt/perl/bin/perl
seek DATA,0,0;$/=\1;print reverse <DATA>;
__DATA__
__DATA__
在最后打开DATA
文件句柄。$/
为数字的引用,会导致readline()
一次读取那么多字节。seek(DATA,0,0)
需要将指针设置为文件的开头,而不是__DATA__
节的开头。#!
...)__DATA__
后面需要一个换行符,否则它不是有效的 Perl。a=";main=putStr.reverse$\"a=\"++show a++a";main=putStr.reverse$"a="++show a++a
标准把戏。
爪哇:
绝对不是最短的,但到底是什么(一行):
public class R{public static void main(String[] a){StringBuffer s = new StringBuffer("public class R{public static void main(String[] a){StringBuffer s = new StringBuffer();s.reverse();System.out.print(s.substring(0,152));System.out.write(34);System.out.print(s);System.out.write(34);System.out.println(s.substring(152));}}");s.reverse();System.out.print(s.substring(0,152));System.out.write(34);System.out.print(s);System.out.write(34);System.out.println(s.substring(152));}}
PHP 36 字节
<?echo strrev(join(file(__FILE__)));
#define q(k)r(char*s){if(*s)r(s+1);putchar(*s);}main(){r(#k"\nq("#k")\n");}
q(#define q(k)r(char*s){if(*s)r(s+1);putchar(*s);}main(){r(#k"\nq("#k")\n");})
JavaScript:你想要多少个字符?
第二个最简单的有效程序(使用我的方法):240 个字符!(包括空格但不包括新行)
<!DOCTYPE HTML>
<html>
<head>
</head>
<body>
<script>
var string = "<!DOCTYPE HTML>\n<html>\n" + document.documentElement.innerHTML + "\n</html>";
var string2 = string.split("").reverse().join("");
document.write(string2);
</script>
</body>
</html>
#include<stdio.h>
int main() {
char c;
freopen("thisfilename.c","r",stdin); //or thisfilename.cpp
while(scanf("%c",&c)!=-1)
printf("%c",c);
return 0; }
蟒蛇(34个字符):
print(open(__file__).read()[::-1])
剪断 - 删除不正确的答案
现在要赎回自己;
<?php echo strrev(file_get_contents(__FILE__)); ?>