自动循环奎


11

做一个奎因,但要稍加扭曲。

声明

quine打印其代码,但将其第一个字符放在末尾。
(您可以反向执行,但在答案中包括该注释)
然后,输出必须是一个程序,这也是一个解决方案。

示例:假设您的代码为foobar,运行它将返回oobarf,它将是另一个有效程序。

foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar

规则

  • 您的代码一定不能是其他人明显偷窃的某代代码的输出
  • 您的代码长度必须超过2个字符(因此,短代码没什么意思)
  • 您的代码必须至少包含两个不同的字符(例如:+++无效)

计分

作为挑战,最短的代码获胜。



3
@DomHastings您已经发布了几个月。
mbomb007 '18

2
@ IQuick143我认为> 2个字符是您要求的一个很好的要求
dylnan '18

5
请问算不算一个“旋转奎因”?; p
Kevin Cruijssen

3
@ mbomb007寻找一种可能的语言是挑战的一部分
IQuick 143

Answers:


19

Befunge-98(PyFunge),2600字节

ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

在线尝试!

这使这真是一场大麻烦。

工作原理:
该程序是一堆put语句,这些语句将一个程序B自身组装在一起,然后打印两次移位的源字节的一半。
该程序实际上是一个1300字节程序的2个副本,因此可以确保整个1300字节程序始终作为整体运行。

更好的解释:
每Befunge-98喹需要包含符号,一个@q,
问题:这些符号都不是一个很好的起点,因为特别是具有@q立即终止程序。
解决方案:摆脱源代码中的那些字符

问题:如何?
解决方案:使用p(放置)命令将源代码修改为包括所需的字符,这些字符将打印源代码的内容,并偏移一个字节,而不使用g作弊的命令。

问题:(请问这些结束什么时候结束)
put命令会弹出3个n x y确定字符,x坐标,y坐标的值,但是当将这些值的初始化分为两部分时,它可能会在开始的源代码中写入不良字符,从而使其无效奎因
解决方案:(我保证的最后一个)
使用源代码的2个副本,后者是“正确的”副本,这不小心解决了另一个问题,即将put语句(p命令+常量初始化程序)分成两半会不会执行,这是通过每个语句具有2个副本来解决的。这需要工作的最后一件事是如何使整个源代码减半?


他们说一幅图像价值1000字。 然后他们做了Piet。

这是为什么一个字符串的两个副本字节移位==的一个字节移位的字符串两个副本的视觉证明。这意味着我们可以拿一半的代码,对它进行字节移位,然后打印两次(或者拿一半的代码,对它进行字节移位,打印,重复[这就是实际发生的事情])

如何实现:假设源为0123456789abcdef

Befunge伪代码:

0123456789abcv;;"123456789abcdef" < go this way <--
             >PS'0,   repeat 2x   ^

PS表示打印堆栈(不是真实的指令)。我们使用反向将一半的源代码压入""堆栈,然后打印堆栈,然后获取('命令)0移到前面的第一个字符'并最后打印导致字节移位的字符,然后重复循环再次打印第二份。处理源代码中的符号是一种技术,如果我们在执行源代码时编写它,可能会造成麻烦。我通过添加更多外部处理它的put语句来避免这种情况。

这使代码看起来像这样: 码

说明
绿色突出显示:负责将字符添加到源代码中的代码
灰色字母(抱歉,可见性较差):绿色代码添加了代码
红色突出显示:将源代码后半部分的第一个字符移到蓝色区域的代码。
蓝色突出显示:请参见红色突出显示
橙色来突出显示:该代码可确保在写入2字节移位副本后通过将@(终止)命令放入黄色区域来终止我们的代码。

希望箭头应该使代码流向更清晰。

这里谈到的最后艰难的部分:
在哪里婴儿来自源代码?

简短的答案:C#Magic
长的答案:100多个由C#代码手工编写的Befunge代码片段。我手动手工编写了大约100个常量初始化程序(一段将某些数字压入堆栈的befunge代码),然后使用一个自定义C#程序将其编译为1300字节的Befunge输出,然后我将其复制粘贴两次并进行最终程序。

你还在吗?非常感谢您的阅读!(或者至少滚动到结尾),
我希望我的坏笑话很有趣,而且不要烦人。

注意:此代码中的put语句不会创建会作弊的g命令。

编辑:我已经使用开发人员工具在TIO中使用以下Javascript代码验证了代码

setInterval(()=>{document.getElementById("code").value = 
document.getElementById("output").value; 
document.getElementById("run").click();}, 2000);

我真的很期待完整的解释,但这似乎是一项成就,当然值得赏赐!
纳撒尼尔(Nathaniel)'18年

1
@Nathaniel有完整的解释,希望您喜欢!:D
IQuick 143 '18

1
关于处理p不正确参数的部分是天才。
leo3065

@ leo3065谢谢:)
IQuick 143

@lQuick确实可以!
纳撒尼尔(Nathaniel)'18年
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.