首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >最长周期迭代奎因

最长周期迭代奎因
EN

Code Golf用户
提问于 2016-08-27 09:45:10
回答 6查看 1.1K关注 0票数 12

众所周知,quine是一个输出自己的源代码的程序。然而,也有可能编写一个程序,输出另一个不同的程序,再次输出第一个程序。例如,Python 2程序

代码语言:javascript
复制
x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3

将在运行时输出以下文本:

代码语言:javascript
复制
print """x = '''x = {}
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3'''
print 'print '+'"'*3+x.format("'"*3+x+"'"*3)+'"'*3"""

当作为Python程序运行时,这将再次输出原始代码。这叫做迭代奎因。因为你必须运行两次才能得到原来的代码,我们说它有句点2,但是当然,更高的周期是可能的。

您的挑战是用您所选择的语言,以100字节或更少的长度,用尽可能长的时间来编写一个迭代quine。(请注意,上面的示例不符合这个规范,因为它是119个字节,包括后面的换行符。)

请注意以下规则和澄清:

  • 通常的quine规则适用,即您的程序不能使用允许它直接访问自己的源代码的语言特性。
  • 迭代后的输出必须最终循环回原来的代码,并且必须包括一个演示或证明。
  • 你还必须包括一个解释为什么周期是那么长,你说是。这不一定是在数学证明的水平,但它应该是令人信服的人熟悉你的语言。(这条规则之所以存在,是因为我希望一些答案涉及到非常、非常大的数字。)
  • 可以这样说,“至少1,000,000次迭代”,而不是给出确切的数字,只要您能够证明它至少有那么长。在这种情况下,你的分数是1,000,000。否则,你的分数就是你的奎因时期。
  • 100字节限制只适用于您的初始程序--它输出的程序可能会更长,当然,它们最终必须返回到100个字节才能输出原始代码。
  • 您可以假设您的机器具有无限的RAM和无限的运行时,但如果您的语言没有无限的精确数据类型(例如整数),则不能假设它们是无限的。您可以假设解析器可以处理的输入长度没有限制。
  • 得分最高者获胜。

请注意:存在一个名为停止发牢骚;开始抱怨的现有挑战,它还涉及迭代quine。然而,除了基于相同的概念之外,这些都是完全不同类型的挑战。另一个是直接代码高尔夫,而这个是(故意!)真是个伪装的忙碌的海狸问题。为这个问题提供一个好答案所需的技术很可能与回答另一个问题所需的技术有很大的不同,这在很大程度上取决于设计。

EN

回答 6

Code Golf用户

发布于 2016-09-02 12:08:19

R,期望为2^19936~0.5

的随机周期

代码语言:javascript
复制
f=function(){
    options(scipen=50)
    body(f)[[4]]<<-sum(runif(623))
    0
    cat("f=")
    print(f)
}

R的默认随机数发生器的周期为2^19937-1,并在623个连续维数中等量分布。因此,在它的周期中某个地方(但只有一次)将是一个623长的零向量.当我们到达那里(并与序列开始对齐),下一个623个随机U0,1数的和将为零,我们返回到我们原来的程序。

请注意,在返回到零之前,程序将以非常高的概率通过相同的非零状态几次。例如,sum 311.5是最有可能发生的,有很多方法可以发生,但是RNG允许0的时间比311.5的时间长。

票数 5
EN

Code Golf用户

发布于 2020-01-28 16:42:40

Python 2

期间:9\uparrow((99\uparrow\uparrow(9\uparrow((99\uparrow\uparrow(9\uparrow((99\uparrow\uparrow(9\uparrow\uparrow5-1))\uparrow9)-1))\uparrow9)-1))\uparrow9)+1

感谢@Bubbler从9\uparrow9\uparrow(99\uparrow\uparrow12)+1到现在的增长周期

代码语言:javascript
复制
b=0;s="print'b=%d;s=%r;exec s'%(-~b%eval('9**9'*eval('9**9'*eval('9**9'*9**9**9**9**9))),s)";exec s

在网上试试!

在代码中,b=0更改为b=1,然后是b=2,等等,直到它到达b=decimal expansion of the period,然后重新设置为b=0

票数 2
EN

Code Golf用户

发布于 2016-09-07 01:26:25

JavaScript,9,007,199,254,700,000

不会赢,但在这个挑战上与JavaScript合作是很有趣的:

代码语言:javascript
复制
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)

遵循以下周期:

代码语言:javascript
复制
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254700000-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254699999-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254699998-1||90071992547e5)
// etc...
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),3-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),2-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),1-1||90071992547e5)
a="a=%s;console.log(a,uneval(a),%.0f-1||90071992547e5)";console.log(a,uneval(a),9007199254700000-1||90071992547e5)
// and so on

注意:您可以使它缩短18个字节,而只删除分数的0.08%,如下所示:

代码语言:javascript
复制
a="a=%s;console.log(a,uneval(a),%.0f-1||9e15)";console.log(a,uneval(a),1-1||9e15)
票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/91332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档