写出最长周期为500字节的迭代奎因


16

您的工作是创建最长周期的迭代quine,其中序列中每个程序的长度以500字节为界。

也就是说,如果重复以下步骤:

  1. 从您的初始程序开始
  2. 运行当前程序
  3. 返回步骤2

您最终将回到原始程序。循环中的程序数量就是您的分数,您正尝试将其最大化。

这些程序都不会引发任何错误。每个程序也必须以相同的方式运行(例如,没有不同的版本,实现,编译器选项,平台等)(编辑:是的,最后一个包括任何外部状态,例如伪随机数生成器的外部状态)语句。每次运行后都必须“重置”外部状态。如果您使用的是真正的随机数,则以最坏的情况为准。)

将此挑战与最长周期的迭代方法(除了100与500)不同的是,循环中的每个程序也必须等于或小于500字节。这意味着最长的周期为(256 ^ 501-1)/ 255或更小。当然,这是一个很大的数字,但是就计算所需的代码量而言,并不是那么大。因此,挑战是要尽可能多地使用(256 ^ 501-1)/ 255个可能性,而不是忙碌的海狸挑战。

程序不得访问其自己的源代码。但是,如果需要,可以允许使用空程序(只要遵循其他规则)。

由于手动检查程序很困难,因此您可以使用理论方法计算出分数。您必须在程序中包含分数和正确性的说明。如果您无法计算出分数,则可以使用循环中程序数量的下限作为实际分数。当您找到更好的下限时,或者如果您找到确切的实际分数,则可以更新此内容。

这是,因此得分最高!

编辑:建议您用科学计数法写下您的分数,以使答案更容易比较。也可以使用其他形式的乐谱,这尤其好,尤其是如果它们更清楚地与您的程序相关联时。此外,鼓励读者编辑以前的答案以符合此要求。


2
“最长的可能周期是(256 ^ 501-1)/ 255或更小” ---不一定是正确的,如果程序操作外部对象,则程序可能会多次经历相同的状态,然后返回原始状态( (例如RNG状态或种子)
JDL,

2
@JDL应该违反规则,恕我直言-如果它在源代码中以外的地方存储状态,则它不是适当的迭代方法。
纳撒尼尔(Nathaniel)

1
@Nathaniel我不会将其归类为在其他地方存储状态,它只是使用入口点,这些入口点是其实现的编程语言的有效部分。它自己的源代码。
JDL

1
@JDL不,那是不同的东西。任何语言的任何程序显然都必须依赖在源代码之外实现的事物,但是将状态存储在源代码之外是不同的。这将意味着程序的输出不是其源代码的确定性功能,而是取决于先前运行已更改的某些其他外部上下文。在quine挑战IMHO中不应允许这样做,并且OP关于最大循环长度的声明表明此处不希望这样做。
纳撒尼尔(Nathaniel)

3
就像您确定的那样,@ JDL是确定性语言,指令指针仅在程序执行期间存储状态,而不在程序调用之间存储状态。如果程序的输出是其源代码的确定性函数,则不可能使用5状态示例。
纳撒尼尔(Nathaniel)

Answers:


12

Perl 6的1263988.86×10835次迭代

$!=Q~~;<say "\$!=Q~{chrs(my@a=[R,] polymod :126[$!.ords]+1: 126 xx*)x?(@a-399)}~;<$_>~~.EVAL">~~.EVAL

在线尝试!

这将遍历长度398及以下的前126个字节的所有可能组合(不包括前导NUL字节的字符串)。如果你想看到它实际上返回到第一次迭代中,你可以通过改变极限长度减少到1 ,像这样

说明:

每次迭代都会递增以基数126形式存储的字符串,然后将其转换回基数126。这样做直到到达长度为399的字符串为止,然后再次将该字符串重置为空。如果您在概念化数字时遇到麻烦,请想象以十个字节为单位。从开始0,最多递增4位数字,1000然后重设。这是104-1个迭代(0在我的程序中为或包含空字符串)。

$!=Q~~;         # Start with an empty string
< ... >~~.EVAL  # Set a string to $_ and EVAL it
  say "\$!=Q~{...}~;<$_>~~.EVAL"   # Print the program with the string replaced by
                       :126[$!.ords]   # The string converted from base 126
                                    +1 # Incremented
          [R,] polymod                : 126 xx*  # Back to base 126
chrs(                                )  # Back to a string
     my@a=                            x?(@a-399)  # Only if it isn't 399 characters

1
哇,您做得真的很快,我几乎完成了我的工作,但明天可能会完成(我的工作将在Gol> <>中进行)
KrystosTheOverlord

此计算表明您高估了您的分数。分子是使用126个符号的多少个长度为397的字符串。(由于
Wolfram

@PyRulez我觉得我的号码是正确的,因为它基本上迭代基地126号达399个数字......我想,我的解释是关
乔金

@JoKing啊,是的,我认为是问题所在。您将397更改为398,这使您的得分不再高估。您可能会低估它(因为您只在分数中包含长​​度恰好为398的字符串),但这很好。
PyRulez '19

2

符文附魔64654 106 ; 122 387 -1≈2.638×10 807次迭代

"3X4+kSq'ƃZ,r{1?{1[:1Z%1+:a=+:d=+:3X4+=+:6X2+=+:'€(c*?~1-1kq}͍f1+0Bl1=6*?S1-Skql͗2=4*?{͍]}B͍l1=6*?kS1-Sq]}@

在线尝试!

警报:错误显示,应为``(0x80)。

不要使用堆栈,而要使用字符串,而用͍修改的堆栈运算符可以修改字符串,而不是堆栈(请参阅先前的修订)。这样,每个字符限制为1个字节(0-127范围,减去有问题的字符),但它们的数量是后者的3倍以上(由于无需跳过Unicode组合字符,因此处理模板较少)以及其他一些节省字节的方法),它可以实现更高的迭代次数。

如果编码作为一个真正的大端被允许(即,具有127以上的字节值而不插嘴0x00字节)这可以实现251 387 -1≈4.717×10 928次迭代。但是,正如Outgolfer的Erik在他的Python 2答案中指出的那样,TIO的拉丁编码阻止了这种情况。在索取此分数之前,我需要检查它是否在本地有效。

应该可以替换f1+0B'0B(有一个不可打印的0x16),但是它正在我(事情并不想正确地跳转/跳过/返回),所以我独自一人。这将把大端结构从387提高到388。


1

DOS COM,49字节,周期2 ^ 3608

00000000  be 31 01 89 f7 b9 f4 02  f9 ac 14 00 aa 39 ce 72  |.1...........9.r|
00000010  f8 31 c9 b4 3c ba 2b 01  cd 21 89 c3 b4 40 b9 f4  |.1..<.+..!...@..|
00000020  01 ba 00 01 cd 21 b4 3e  cd 21 c3 71 2e 63 6f 6d  |.....!.>.!.q.com|
00000030  00                                                |.|

原始装配创建:

 BITS 16
 ORG 0100h
   mov si, l
   mov di, si
   mov cx, 500 + 0100h
   stc
n: lodsb
   adc al, 0
   stosb
   cmp si, cx
   jb n
   xor cx, cx
   mov ah, 3ch
   mov dx, f
   int 21h
   mov bx, ax
   mov ah, 40h
   mov cx, 500
   mov dx, 0100h
   int 21h
   mov ah, 3eh
   int 21h
   ret
f: db "q.com", 0
l: db 0

由于终端无法处理的空值和其他内容,此小工具将下一阶段写入q.com而不是标准输出。根奎因技术是等同于字符串化,有效负载空间用作3608位计数器。由于DOS的工作方式,计数器的初始状态包含来自第一次执行之前内存中的碎片。

原始的49个字节的输入不可访问,因此,如果要对500个字节进行评分,请继续输入。


1

C#(Visual C#交互式编译器),标志:/u:System.Numerics.BigInteger/r:System.Numerics

得分:10332

感谢JoKing将我的得分从10 255 * 2-1提高到现在!

var i=Parse("0");var s="var i=Parse({0}{2}{0});var s={0}{1}{0};Write(s,(char)34,s,(++i).ToString().Length<333?i:0);";Write(s,(char)34,s,(++i).ToString().Length<333?i:0);

在线尝试!

说明

每次迭代增加一个BigInteger,直到它的长度变得太大为止,在这种情况下,我们立即恢复为原始的五线组。

//The BigInteger that will be incremented
var i=Parse("0");
//The string that encodes the quine
var s="var i=Parse({0}{2}{0});var s={0}{1}{0};Write(s,(char)34,s,(++i).ToString().Length<333?i:0);";
//Print out the string, with every {0} replaced with quotes and the {1} replaced with the original string
Write(s,(char)34,s,
//And the {2} is replaced to the BigInteger+1 if the BigInteger wouldn't be too long, else 0
(++i).ToString().Length<333?i:0);

1

252219

#coding=L1
s=""""""
for i in range(220-len(s.lstrip("ÿ")))[:219]:s=s[:i]+chr(ord(s[i])%255-~(s[i]in"!$&"))+s[i+1:]
S='#coding=L1\ns="""%s"""\nfor i in range(220-len(s.lstrip("\xff")))[:219]:s=s[:i]+chr(ord(s[i])%%%%255-~(s[i]in"!$&"))+s[i+1:]\nS=%%r;print S%%%%s%%%%S';print S%s%S

请注意,后面有换行符。如果语法高亮显示强制插入,则可能会在上面将其删除。

不幸的是,您无法在TIO中执行此程序,因为它是使用Latin-1编码的。

上面s包含219个0x01字节。程序运行后,将打印其源,但有一个区别:s已像base-252 big-endian数字一样递增,因此其最左边的字符已“递增”为0x02。避免使用字节0x00、0x22、0x25和0x5C,因此,如果字符串中的任何字符在递增后变为其中之一,则字符本身将再次递增。

  • 0x00(空):Python源文件不能包含空字符。
  • 0x22("):存在连续形成三个0x22字节的危险,即""",或者字符串的最后一个字符变为",因此该字符串将过早关闭。
  • 0x25( %):类printf串格式化的喹骨架完成之前使用,所以一个%不相邻的另一个%s会造成麻烦。不幸的是,无法对格式进行重新排序以避免这种警告。
  • 0x5C(\):可能\会将用作字符串中的转义符,而不是逐字记录,因此可以避免。

因此,可以使用256个字节中的252个。如果s包含219 0xFF(ÿ)字节,则将其简单地还原为219 0x01字节,从而完成循环。

252219

252219=8067118401622543607173815381864126969021321378412714150085501148172081568355283332551767558738710128769977220628694979838777041634307806013053042518663967641130129748108465109552157004184441957823830340121790768004370530578658229253323149648902557120331892465175873053680188287802536817909195292338112618632542000472094347226540339409672851252596442228662174845397731175044304251123874046626291460659909127172435776359148724655575878680270692451120531744950544969860952702932354413767504109600742385916705785109741289800204288


1

2512262.1×10542

  • 251 39删除了对Text
  • 251 122 golfed递增函数
  • 251个128组合前缀和后缀源串
  • 251 188移除依赖于Gast.GenLibTest

由于不可打印/无效的UTF-8,以xxd格式显示:

00000000: 6d6f 6475 6c65 2071 3b69 6d70 6f72 7420  module q;import 
00000010: 5374 6445 6e76 3b53 7461 7274 3d28 7325  StdEnv;Start=(s%
00000020: 2830 2c34 3129 2c3f 5b27 0101 0101 0101  (0,41),?['......
00000030: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000040: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000050: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000060: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000070: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000080: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000090: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000a0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000b0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000c0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000d0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000e0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
000000f0: 0101 0101 0101 0101 0101 0101 0101 0101  ................
00000100: 0101 0101 0101 0101 0101 0101 275d 2c73  ............'],s
00000110: 2528 3432 2c39 3939 292c 712c 732c 7129  %(42,999),q,s,q)
00000120: 3b71 3d69 6e63 2721 273b 3f5b 683a 745d  ;q=inc'!';?[h:t]
00000130: 2363 3d68 2b69 6628 616e 7928 283d 3d29  #c=h+if(any((==)
00000140: 6829 5b27 ff09 0c26 5b27 5d29 2702 2727  h)['...&['])'.''
00000150: 0127 3d5b 633a 6966 2863 3e68 2969 643f  .'=[c:if(c>h)id?
00000160: 745d 3b3f 653d 653b 733d 226d 6f64 756c  t];?e=e;s="modul
00000170: 6520 713b 696d 706f 7274 2053 7464 456e  e q;import StdEn
00000180: 763b 5374 6172 743d 2873 2528 302c 3431  v;Start=(s%(0,41
00000190: 292c 3f5b 2727 5d2c 7325 2834 322c 3939  ),?[''],s%(42,99
000001a0: 3929 2c71 2c73 2c71 293b 713d 696e 6327  9),q,s,q);q=inc'
000001b0: 2127 3b3f 5b68 3a74 5d23 633d 682b 6966  !';?[h:t]#c=h+if
000001c0: 2861 6e79 2828 3d3d 2968 295b 27ff 090c  (any((==)h)['...
000001d0: 265b 275d 2927 0227 2701 273d 5b63 3a69  &['])'.''.'=[c:i
000001e0: 6628 633e 6829 6964 3f74 5d3b 3f65 3d65  f(c>h)id?t];?e=e
000001f0: 3b73 3d22                                ;s="

在线尝试!

通过递增所有字节值不包括226字节的字符串\0\n\r'\

我们避免使用这些字符的原因是:

  • \0 使编译器生气
  • \n并且\r不能出现在字符列表中
  • ' 将终止字符列表
  • \ 如果在转义字符之前出现可能会引起问题

字符串全部为\377s后,它将环绕为所有\001s,从而得到原始程序。


输出(至少在TIO上)是字符,其序数值为128,但由两个字节组成C2 80。这与本地计算机上的行为相同吗?
乔·金

1
@JoKing哦,不,我的机器上只有一个字节。TIO在无效的UTF-8(以及输入文件)无效时会破坏输出。
Οurous

1
@JoKing我将答案更改为一种新格式,这使得可以在TIO上看到正确的行为。
20:31

0

Gol> <>,70个字节,39039000次迭代

":1=l8:*6+=S&Q~:'~'=Q~~'H#'||lPaa*5*=?1:1=Q$~$~|:1)lPaa*5*(Q?:|r2ssH##

哇,这比我想象的要低得多...下一步!使其具有更多迭代!!!

在线尝试!


它似乎并没有删除任何东西一旦达到500,只是附加了一个NULL字节
乔金

这根本行不通吗?我无法使“递增最后一个字符”起作用
仅使用ASCII码

@only ASCII现在,此方法有效,对不起,我在解决整个问题时弄乱了一部分。现在可以正常使用,不便之处,敬请谅解!!!
KrystosTheOverlord

@JoKing NUL字节是删除过程,现在程序应该删除直到它几乎消失,然后删除NUL并递增最后一个字符,如果它是〜,则它将转换为'#',然后返回正常!!!
KrystosTheOverlord'2
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.