是否有人在R中构建了一个quine("一个程序,它生成一个自己的源文本副本作为其完整输出":http://www.nyx.net/~gthompso/quine.htm)?([quine]标签在Python,Java中提取了大量示例......但在R中显然没有.)
f <- function() { body() }
Run Code Online (Sandbox Code Playgroud)
接近:
> f()
{
body()
}
Run Code Online (Sandbox Code Playgroud)
但缺少功能的名称.
最短的可能性怎么样?大多数混淆了吗?
编辑:从下面的各种答案中,似乎有多种方法来定义自我指涉性和必须发生的环境:
->函数(@ bill_080)->程序[或多或少等同于程序->文本] :( @kohske)->文本(@JoshUlrich,@ James,上面定义的问题)笔记:
identical(quine,quine())是一个很好的测试案例,虽然它的棘手,因为环境相处携带:identical(quine,quine(),ignore.environment=TRUE)可能会更容易.找到这个quine的例子:
s='s=%r;print(s%%s)';print(s%s)
Run Code Online (Sandbox Code Playgroud)
我得到了,%s并按照此处的指示%r执行str和repr功能,但究竟是什么意思是部分以及如何工作?s%s
根据标题,是否可以在HTML中创建(非平凡的)quine?
我对HTML quine的定义:
在假设HTML文件中的某些字符串由浏览器呈现为纯文本的情况下,非平凡的HTML quine是非空的并且至少使用一个HTML标记.定义HTML quine
q.html,使得标准浏览器呈现的as的输出是其q.html自身的内容.
(我对这个定义的任何评论持开放态度,我现在就把它搞砸了)
HTML不是图灵完备的,因此定点定理不能用来证明它确实是可能的.
但是,这并不一定意味着HTML quine是不可能的.或者它实际上可以证明HTML quine是不可能的?
此代码来自Hacker's Delight.它说这是C中最短的程序,长度为64个字符,但我不明白:
main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34);}",34);}
Run Code Online (Sandbox Code Playgroud)
我试着编译它.它编译3个警告,没有错误.
我遇到了这个没有主要方法的小quine程序:
enum f {
f;
System z;
String s="enum f{f;System z;String s=%c%s%1$c;{z.out.printf(s,34,s);z.exit(0);}}";
{z.out.printf(s,34,s);
z.exit(0);}
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释这是如何工作的?谢谢.
维基百科称它被称为quine,有人给出了以下代码:
char*s="char*s=%c%s%c;main(){printf(s,34,s,34);}";main(){printf(s,34,s,34);}
Run Code Online (Sandbox Code Playgroud)
但是,显然你必须添加
#include <stdio.h> //corrected from #include <stdlib.h>
Run Code Online (Sandbox Code Playgroud)
这样printf()才有用.
从字面上看,由于上面的程序没有打印#include <stdio.h>,所以它不是解决方案(?)
我对"打印自己的源代码"的字面要求以及此类问题的任何目的感到困惑,尤其是在访谈时.
在互联网上闲逛后,我找不到任何在R中编写过quine的人(编辑:自写这篇文章以来,已经在SO上找到了几个,但我仍然对这个问题感兴趣).所以我想我会试着亲自拿出一个.我的结果是(令人惊讶的短)代码:
function(){}
Run Code Online (Sandbox Code Playgroud)
function(){}运行时会输出.这利用了这样一个事实:在没有parens或参数之后的函数名称将返回函数的源代码.
然而,一个"看自己"的程序通常不被认为是真正的quine.在试图决定我是否写了一个"真正的"因素的过程中,我意识到有两件事我不明白:(1)什么构成了一个"看着自己"的程序(从一个角度来看)超出使用范围文件i/o和(2)function(){}(或类似命令logical(0))在打印时自我引用的程度.前者似乎对SO来说过于主观,但我希望对后者进行一些澄清.所以...
当我跑步时function(){},究竟发生了什么导致它打印出自己的"源代码"?例如,R是否将空函数加载到本地环境中,评估该函数,然后回顾定义它以进行打印的代码?或者,它只是看着function(){}并立即回应其定义?这和它之间有根本的区别吗?
f<-function(){cat("f<-");print(f);cat("f()")}
f()
Run Code Online (Sandbox Code Playgroud)
在运行时如何打印自己?
main(a){printf(a="main(a){printf(a=%c%s%c,34,a,34);}",34,a,34);}
Run Code Online (Sandbox Code Playgroud)
编译后它是如何复制的?在printf函数中编写34的作用是什么?
是否有可能编写一个程序,利用"序列生成函数"打印自己的源代码?
我所谓的序列生成函数只是一个从特定区间返回值的函数(即可打印的ascii-charecters(32-126)).现在的观点是,这个生成的序列应该是程序自己的源代码.如你所见,实现一个返回任意序列的函数实际上是微不足道的,但由于返回的序列必须包含函数本身的实现,因此这是一项非常重要的任务.
这是这样一个程序(如何与它对应的输出)可能看起来像
#include <stdio.h>
int fun(int x) {
ins1;
ins2;
ins3;
.
.
.
return y;
}
int main(void) {
int i;
for ( i=0; i<size of the program; i++ ) {
printf("%c", fun(i));
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我个人认为这是不可能的,但由于我不太了解潜在的问题,我在这里发表了我的想法.我真的很期待听到一些意见!
我越想了解这个困惑的谜,我就越想放弃.
char *s = "char *s = %c%s%c; main(){printf(s,34,s,34);}"; main(){printf(s,34,s,34);}
Run Code Online (Sandbox Code Playgroud)
这个单行源代码如何在程序执行时生成完全相同的输出,这种程序有什么共同的概念吗?