Quine…但又移位了一个


15

以十进制表示可打印的ASCII字符代码,我们知道从32到126,我们有可打印的字符,其中32为(空格)。您面临的挑战是编写一个仅使用32到125(不包括126)个字符的程序,该程序在执行时会打印自己的源代码,只是源代码中的每个字符的ASCII码都增加了一个。

例如,如果源代码是

main(){printf("Hello World");}

它的输出将是

nbjo)*|qsjoug)#Ifmmp!Xpsme#*<~

以下是禁止的:

  • 读/写/使用任何外部文件或存储(包括互联网)
  • 阅读/回显自己的源代码
  • 少于2个字符的源代码(它们很有趣)。必须大于或等于2。

这是一场人气比赛,在等待至少两周后,无论哪种语言,回答最高的答案都将赢得胜利,而较少的字符数将成为平局。


为什么不允许126,但必须达到32?(我不知道为什么/有人会这样做。)
贾斯汀

这些类型的问题还应禁止将错误消息视为“输出”(对不起,@ GariBN)。“输出”是代码有意打印在标准输出上的内容,而不是由语言可执行文件确定的任意副作用。
l0b0 2014年

3
无法使用~确实使GolfScript糟透了。赌你是故意这么做的。:-)
Ilmari Karonen 2014年

1
定义“读取自己的源代码”。是允许我们对函数进行字符串化,还是必须评估字符串?
约翰·德沃夏克

1
这个问题似乎不适合作为人气竞赛。
l4m2 '18

Answers:


46

Python(27个字符)

在Python Shell中,以下脚本将输出所需的结果:

TzoubyFssps;!jowbmje!tzouby

是! 它输出:

SyntaxError: invalid syntax

6
哦,伙计,没有看到这种情况。:-D
定点

9
实际上,结果是错误地转移了:P
Erbureth说,恢复莫妮卡(Monica)2014年

@Erbureth这也与许多其他答案有关……=)
Gari BN

明智的举动,尽管它不是最短的。xD
cjfaure

2
我正在打电话给Trollololololol。
PyRulez 2014年

14

?? ,5个字符

Ntbg 

请注意,第5个字符是后面的空格Ntbg。这和我以前的答案之一是一样的。Ntbg是无效的路径,因此解释器将输出Ouch!您应该像这样运行它:

huh.exe Ntbg 

我可以想像很多用““?现在。反向Quine:!hcuO Quine:哦!
MilkyWay90

8

PHP(351)

我确信有更好的方法来做到这一点,因为我是代码高尔夫的新手,但这是我的PHP解决方案:

function q(){$q=chr(39);$a=array('function q(){$q=chr(39);$a=array(',');@$r.=$a[0];foreach($a as$b)$r.=$q.$b.$q.",";$r=substr($r,0,-1);$r.=$a[1];for($i=0;$i<strlen($r);$i++)$r{$i}=chr(ord($r{$i})+1);return $r;}');@$r.=$a[0];foreach($a as$b)$r.=$q.$b.$q.",";$r=substr($r,0,-1);$r.=$a[1];for($i=0;$i<strlen($r);$i++)$r{$i}=chr(ord($r{$i})+1);return $r;}

输出:

gvodujpo!r)*|%r>dis)4:*<%b>bssbz)(gvodujpo!r)*|%r>dis)4:*<%b>bssbz)(-(*<A%s/>%b\1^<gpsfbdi)%b!bt%c*%s/>%r/%c/%r/#-#<%s>tvctus)%s-1-.2*<%s/>%b\2^<gps)%j>1<%j=tusmfo)%s*<%j,,*%s|%j~>dis)pse)%s|%j~*,2*<sfuvso!%s<~(*<A%s/>%b\1^<gpsfbdi)%b!bt%c*%s/>%r/%c/%r/#-#<%s>tvctus)%s-1-.2*<%s/>%b\2^<gps)%j>1<%j=tusmfo)%s*<%j,,*%s|%j~>dis)pse)%s|%j~*,2*<sfuvso!%s<~

6

TI-BASIC,10

对于您的TI-83 / 84计算器!

DQQ9RXMS@W

输出:

ERR:SYNTAX

6

GolfScript,15个字符

{`{)}%"/2+"}.1*

输出:

|a|*~&#03,#~/2+

在线尝试。

一个非常简单的解决方案,基于我用于“旋转奎因”挑战的技术。一个棘手的细节是~挑战规则不允许使用字符(ASCII 126),因此我不能使用它来执行我的代码块。幸运的是,1*可以用作它的同义词。

说明:

该代码块{`{)}%"/2+"}由复制.,而第二个副本由1*(技术上是一个迭代循环)执行,另一个副本留在堆栈中。在代码块内部,对代码块进行`字符串化处理,并{)}%循环其字符(的ASCII码),每个字符加1。最后,"/2+"推送文字字符串/2+(即.1*移一个)推入堆栈。在程序结束时,GolfScript解释器将自动将所有内容打印在堆栈上。

附言 是的,我知道这是一场而不是严格的,但是我还要对GolfScript(ASCII艺术)做些什么?;-)


3

JavaScript,117个字符

我知道这不是打高尔夫球,但我还是打高尔夫球。

function f(){alert((f+';f()').split('').map(function(x){return String.fromCharCode(x.charCodeAt()+1)}).join(''))};f()

(我不是在阅读自己的源代码;我只是在使用Function对象的toString功能。)


2

Java-1331个字节,618个字节和504个字节

它在Java中。很酷的事情是它非常清晰易读。您可以尝试将SHIFT变量更改为0,这将是一个奎因。您可以将其更改为所需的任何值,包括负值,它将相应地移动代码。

public class Quinex {

    private static final int SHIFT = 1;

    private static String next(String now, boolean mangles) {
        String sb = "";
        for (char c : now.toCharArray()) {
            if (!mangles && c == 87) {
                sb += next(String.valueOf(SHIFT), true);
            } else {
                sb += (char) ((mangles ? c : c == 94 ? 10 : c == 64 ? 34 : c) + SHIFT);
            }
        }
        return sb;
    }

    public static void main(String... args) {
        System.out.println(next(TEXT, false) + next(TEXT, true) + new String(new char[] { 34, 59, 10, 125 }));
    }

    private static final String TEXT = "public class Quinex {^^    private static final int SHIFT = W;^^    private static String next(String now, boolean mangles) {^        String sb = @@;^        for (char c : now.toCharArray()) {^            if (!mangles && c == 87) {^                sb += next(String.valueOf(SHIFT), true);^            } else {^                sb += (char) ((mangles ? c : c == 94 ? 10 : c == 64 ? 34 : c) + SHIFT);^            }^        }^        return sb;^    }^^    public static void main(String... args) {^        System.out.println(next(TEXT, false) + next(TEXT, true) + new String(new char[] { 34, 59, 10, 125 }));^    }^^    private static final String TEXT = @";
}

但是,上一类的唯一缺点是换行符,这在问题说明中是不允许的(超出32到125的范围)。因此,我在这里提供了一个高尔夫版本,该版本没有换行符(也没有处理这些问题的怪癖)。您可以编辑S变量的值以更改移位。它具有618个字节:

class Q{static String g(String p,int m){int S=1;String u="";for(char c:p.toCharArray()){if(m==0&&c==87){u+=g(String.valueOf(S),1);}else{u+=(char)((m>0?c:c==64?34:c)+S);}}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T="class Q{static String g(String p,int m){int S=W;String u=@@;for(char c:p.toCharArray()){if(m==0&&c==87){u+=g(String.valueOf(S),1);}else{u+=(char)((m>0?c:c==64?34:c)+S);}}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T=@";}

当然,如果我们放弃对偏移量的微调,并对位移值进行硬编码,那么我们可以制作出一个完整的高尔夫版本,包含504个字节:

class Q{static String g(String p,int m){String u="";for(char c:p.toCharArray()){u+=(char)((m>0?c:c==64?34:c)+1);}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T="class Q{static String g(String p,int m){String u=@@;for(char c:p.toCharArray()){u+=(char)((m>0?c:c==64?34:c)+1);}return u;}public static void main(String[]y){System.out.println(g(T,0)+g(T,1)+new String(new char[]{34,59,125}));}static final String T=@";}

1

Perl 5,换行符包括284个字符

不允许使用〜使其变得更加棘手。

#!/usr/bin/perl
$_=<<X;
#!/usr/bin/perl
Y
\$a=\$_;
s/\\\\/\\\\\\\\/g;
s/\\\$/\\\\\\\$/g;
\$b=\$_;
\$_=\$a;
s/Y/\\\$\\_\\=\\<\\<X\\;\\n\${b}X/;
s/(.)/chr(ord(\$1)+1)/ge;
print;
X
$a=$_;
s/\\/\\\\/g;
s/\$/\\\$/g;
$b=$_;
$_=$a;
s/Y/\$\_\=\<\<X\;\n${b}X/;
s/(.)/chr(ord($1)+1)/ge;
print;

1

Python,99岁

s='import sys;sys.stdout.write("".join(chr(ord(c)+1)for c in a%(s,a)))';a='s=%r;a=%r;exec s';exec s

输出:

t>(jnqpsu!tzt<tzt/tuepvu/xsjuf)##/kpjo)dis)pse)d*,2*gps!d!jo!b&)t-b***(<b>(t>&s<b>&s<fyfd!t(<fyfd!t

可以将其缩短为75个字符,但是它将在输出之后打印一个新的换行符,从技术上讲,这违反了规则:

s='print"".join(chr(ord(c)+1)for c in a%(s,a))';a='s=%r;a=%r;exec s';exec s

1
为什么不将制表符(\x09)放在最后,因为制表符移动了一个是新行(\x0A)。然后,您的简化版本将可以使用76个字节。
mbomb007 '16

1

Stax,16个字节

"{^m'#bL"{^m'#bL

运行并调试

适应的"34bL"34bL奎奴亚藜。由于现在"变成了#不需要转义的字符串,因此我们可以将其包含在字符串中。


0

卢阿-192

很简单

s=[[print((('s=['..'['..s..']'..']'..s):gsub('.',function(x)return string.char(x:byte()+1)end)))]]print((('s=['..'['..s..']'..'];'..s):gsub('.',function(x)return string.char(x:byte()+1)end)))

0

C-156

char*f="char*f=%c%s%c,q[200];i;main(){sprintf(q,f,34,f,34);while(q[i])q[i++]++;puts(q);}",q[200];i;main(){sprintf(q,f,34,f,34);while(q[i])q[i++]++;puts(q);}

只需经过必要修改的经典C quine

PS,显然sprintf(f,...,f,...)是段错误。


0

的JavaScript(276)

不使用.toString()

function q(){x=String.fromCharCode;y=x(39);a=['function q(){x=String.fromCharCode;y=x(39);a=[','];r=a[0]+y+a[0]+y+","+y+a[1]+y+a[1];q="";for(c in r)q+=x(r[c].charCodeAt(0)+1);return q;}'];r=a[0]+y+a[0]+y+","+y+a[1]+y+a[1];q="";for(c in r)q+=x(r[c].charCodeAt(0)+1);return q;}

0

红宝石,63岁

达恩,不能在此上使用Heredoc。

s="s=%p;(s%%s).chars{|c|$><<c.succ}";(s%s).chars{|c|$><<c.succ}

Ruby有一个.succ对字符执行此操作的本机方法,没有换行符的打印要比使用换行符的打印要短,因此可以很好地完成工作。


0

C,153

main(a){char b[999];sprintf(b,a="main(a){char b[999];printf(a=%c%s%c,34,a,34);for(a=0;b[a];)b[a++]++;puts(b);}",34,a,34);for(a=0;b[a];)b[a++]++;puts(b);}

经典quine的另一种改良



0

Tcl,89个字节

puts [join [lmap c [split [read [open $argv0]] ""] {format %c [expr [scan $c %c]+1]}] ""]

在线尝试!


Tcl,89个字节

puts [join [lmap c [split [read [open $argv0]] ""] {scan $c %c s;format %c [incr s]}] ""]

在线尝试!


两种方法;相同的字节长度!




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.