循环Levenquine


45

背景

正如大多数PPCG常规人员所知道的,是一个程序,在运行时会输出自己的源代码。而两个字符串之间的Levenshtein距离是将一个字符串转换为另一个字符串所需的最小插入,删除和编辑次数。在这个挑战中,我们将两个概念组合成一个“ levenquine”:一个程序输出自己的源代码,但插入,删除或替换一个不同字符的一个字符的一个实例。(换句话说,程序与其输出之间的Levenshtein距离为1。)

任务

编写一个levenquine,使其输出为levenquine,该程序的输出也为levenquine,依此类推。此外,在某些时候,重复运行程序,运行其输出,运行其输出的输出等的顺序最终必须返回到原始程序。

还有一个额外的限制使事情变得更加困难:在此循环内某个地方必须有两个不同的程序,它们没有共同的字符(换句话说,一个程序中没有字符,另一个程序中也没有字符)。因此,您的程序将不得不逐渐将自己转换为其他字符集,然后再次返回。

如果您使用的编程语言在任何产生输出的程序中都具有不可避免的样板(例如,它只有一种编写print语句的方式,而没有其他有用的输出形式),则可以出于该目的将该样板视为不存在确定两个程序有哪些共同点。但是,为了确定代码的Levenquine属性,您仍然必须计算该样板。

澄清说明

  • 循环中的每个“程序”都可以是完整程序或功能。它们不必全部相同,例如,有些可能是完整程序,有些可能是函数。
  • 并非周期中的所有程序都需要使用相同形式的输出。例如,有些可以通过标准输出输出,而有些可以通过标准错误输出。
  • 您的程序将在没有输入的情况下运行(或以需要输入才能执行任何操作的语言,即最简单的输入)运行。
  • 适当的奎规则。尽管Levenquine不是真正的奎因,但是在编写适当的奎因时,您可能不会做任何非法的事情。特别是,空程序永远不会是来自正确的Levenquine的有效输出(因此不能成为您循环的一部分)。
  • Levenquine限制是根据字符而不是字节来衡量的(例如,ê即使源是用UTF-8编码的,也是一个字符)。不常见字符限制也以字符进行度量。但是,胜利条件以字节为单位。

胜利条件

请从周期中至少提交以下三个程序:最短的程序(以字节为单位);循环中的两个程序没有相同的字符。这些中的两个可能是相同的,并且三个都可能是不同的。分数基于最短程序的字节长度,越短越好,因此成为一种竞争。


对于可以看到已删除帖子的人:沙盒帖子在此处

我认为答案也应该包括周期的长度。
mbomb007'4

如果该语言具有执行输出的几种功能,但它们全部成对共享字符,该怎么办?
与Orjan约翰森

2
@ØrjanJohansen:我想我不会太反对只选择其中一个并在这种情况下坚持下去。但是,可以说这是没有竞争的。我希望该规则具有客观性,因为否则,人们倾向于尝试戳破其中的漏洞,并且如果您尝试使规则过于复杂,则往往会争论其含义。

可以按位服用levenquine吗?如在距原始源代码的距离是1个字节吗?
魔术章鱼缸

Answers:


34

Gol> <>252167字节

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_

在线尝试!

和互不相同的(Verification)程序:

0<CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

在线尝试!

这主要是受到我对“ 互斥的五重奏”挑战的回答的启发,并且对Bubbler的Gol> <>回答也表示敬意

这是您可以运行的验证程序。不幸的是,它超时了,但是您可以观察代码的一个部分如何构建另一部分,然后可以复制最后打印的版本并将其粘贴到输入中以继续。最终,您将进入所输入的第一个程序。

说明

代码的两个部分都由两个部分组成,即实际执行部分和包含另一部分代码的数据。它们的功能几乎相同:

它们取决于标志(代码的第一个字符,1或者0)。如果设置了该标志,则他们将通过删除第252个字符,对其进行添加/减去28并将其附加到代码中来开始构建代码的另一部分。

例如,这是上面第一个程序之后的前两个代码迭代:

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_C

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽ

最终,当它到达当前部的端部,它翻转的代码(的第二个字符<>,然后再返回),以点到另一部分。

这两个部分在一起,即将从执行第一部分切换到执行第二部分。

1>'r&ff9++r}}r&f*bc++1z.r}r6=z?Hzznr6rHr}r:ee+6+=z9*5c*+1z . }&z+5c*&H}rebe*b+ke++rHS6PWSb`S6P$$1W5/11b6W6EE/W6EE`S6P$$W61`S6P5W6$5_61P1WW_b_CŽB‚‚UGGŽ™™ŽB‚F~GGM–JŽ™ŽRY–[d––ŠŽRŽdŽ™ŽVGRGY–UFQFGM–<J<™B–GQFBd™Ž~F~G‡GGŽd;oRl-7-7so~|;oRl@@-Ms7QKMM3-3-3~R-4sRaaK-3sRaa|;oRl@@sR43M|;oRlQ-sR43@Q{RMlMss3{~{"

在线尝试!

每个部分的标志是相反的,因此新执行的部分将开始删除另一部分代码,直到到达自己的代码为止。此时,它翻转标志,并且循环再次重复。

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.