Codegolf:Quine和Antiquine


13

该挑战类似于您可以进行Meta Quine吗?

quine是在STDOUT上产生自身的程序。挑战在于产生程序A,该程序在运行时会在STDOUT上产生程序B。运行时,程序B在STDOUT上生成程序A。程序A和B必须以相同的语言编写(并运行)。链接的问题约束A!=B。这看起来太简单了。因此,对于这个问题,我们坚持使用以下规则,将A和B定义为对数:

  1. 程序A和B不得使用任何相同的字符,但空格和语句分隔符以及标点符号除外。
  2. 程序A和B必须分别包含至少一个既不是空格也不是语句分隔符,也不是标点符号的字符。
  3. 出于规则1和2的目的,术语“空白”不包括任何符号或符号序列,它们本身就是被解释的语句,运算符或符号(与分隔符相对)。因此,在空白语言中,没有空白。
  4. 语句分隔符是该语言中通常用于分隔语句的语法元素。这将包括python中的换行符,或Java,perl或C中的分号。
  5. 标点符号是ASCII字符,它既不是空格也不是POSIX单词字符类(即,下划线不是用于此目的的标点符号),即ispunct()返回true,而不是_
  6. 程序A在运行时必须在其STDOUT上生成程序(程序B),而程序在运行时又会生成程序A。
  7. 程序A和B必须使用相同的编程语言。
  8. 使用的编程语言实际上必须是一种编程语言。除非您没有其他理由,否则我建议它必须是图灵完整的。
  9. A和B中的至少一个必须在该语言中执行至少一个语句。

这是代码高尔夫,所以最短的答案会获胜,得分是程序A的长度(以字节为单位)(即程序B的长度无关紧要)。


您能否在第一条款的例外列表中添加“标点符号”?否则,不可能用多种语言(尤其是那些需要在主函数中使用花括号的语言)解决此任务。
2014年

相关但可能完全不同。
Martin Ender 2014年

@FUZxxl我允许标点符号,但不包括下划线。
2014年

1
对于这里的目的,是Aa考虑不同的“角色”?
HostileFork说不要相信2014年

1
这将是更好,如果你提供的匹配规则5. ASCII字符的完整列表
aditsu退出,因为SE是邪恶的

Answers:


5

GolfScript,13个字节

1{\~\".~"}.~

输出是

-2{\~\".~"}.~

生成初始程序。

字节数包括尾随的LF,因为输出的输出将包含它。

在线尝试。

怎么运行的

1       # Push 1.
{       # Start code block.
  \~\   # Apply logical NOT to the second topmost element of the stack.
  ".~"  # Push that string.
}       # End code block.
.~      # Duplicate the code block and execute the copy.

GolfScript在终止时打印堆栈的内容。


请再次阅读问题说明Programs A and B may not use any of the same characters, save for whitespace and statement separators, and punctuation characters.
isaacg

1
除了12是标点符号。
丹尼斯

好,自从我上次阅读规则以来,这些规则已更改。
isaacg

是的,行得通。我说了一些规则,以防止将空格用作语句,但是忘记了标点符号存在相同的漏洞。因此漏洞被合法利用。
2014年

14

帕斯卡(731个字符)

程序A:

program s;{$h+}uses sysutils;const p='program s;{$h+}uses sysutils;const p=';a='a';aa=''';';aaa='a=''';aaaa='''';aaaaa='begin write(lowercase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),''lower''+''c'',''tm''+''p'',[]),''up''+''c'',''lower''+''c'',[]),''tm''+''p'',''up''+''c'',[])+aa+aaaaa))end.';begin write(upcase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),'lower'+'c','tm'+'p',[]),'up'+'c','lower'+'c',[]),'tm'+'p','up'+'c',[])+aa+aaaaa))end.

输出程序B:

PROGRAM S;{$H+}USES SYSUTILS;CONST P='PROGRAM S;{$H+}USES SYSUTILS;CONST P=';A='A';AA=''';';AAA='A=''';AAAA='''';AAAAA='BEGIN WRITE(UPCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),''LOWER''+''C'',''TM''+''P'',[]),''UP''+''C'',''LOWER''+''C'',[]),''TM''+''P'',''UP''+''C'',[])+AA+AAAAA))END.';BEGIN WRITE(LOWERCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),'LOWER'+'C','TM'+'P',[]),'UP'+'C','LOWER'+'C',[]),'TM'+'P','UP'+'C',[])+AA+AAAAA))END.

输出程序A。


3
我很喜欢案例翻译的(误用)用法。
2014年

11

ROT13规则更新后不再竞争

不知道这是否算作一种语言,但我当然没有弥补这一挑战。通常sed也接受某些实用程序的答案。但是,这是一个判断调用,因此,如果不算在内,我将其删除(是否有关于什么算是一种语言的元讨论?编辑:现在有

A

A和之间的循环N

~>> echo "A" | rot13
N
~>> echo "A" | rot13 | rot13
A

我认为这不起作用,因为rot13只是接受输入STDIN,而不执行程序。如果您认为它是长度为零的程序,则不符合规则2。程序(带有sed)是传入的sed -e。如果这是可以接受的,那么cat将是一个奎纳,然后tac是一个奎纳和一个反奎纳。但是,没有生产源头cattac或为此事rot13
2014年

@abligh如果使用的语言是rot13,为什么我必须打印rot13的源代码?另外,如果我运行Golfscript,Python或其他工具,则可能会通过stdin或文件将源代码传递给它,因此实际上没有任何区别。在这种情况下,rot13 解释器。
IngoBürk2014年

rot13因为一种编程语言似乎无法满足对“编程语言”的任何合理定义,并且它不能解释任何内容。我将修正问题以使其更清楚。
2014年

我都可以。我将不再回答这个问题,并开始进行元讨论。顺便说一句,很好的挑战。迫不及待地想看到“真实的”解决方案!
IngoBürk2014年
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.