创建无限的反串


11

一个counterstring是某种形式是在软件测试中使用自描述的测试数据。不知道它实际上是James Bach发明的,但我从那里知道。

想法如下:测试数据包含许多星号(*)。星号前面的数字告诉您此时的测试数据有多长时间。如果您需要知道测试数据中不是星号的位置,请找到最后一个星号,查看前面的数字,然后加上后面的数字。

序列开始如下:

2*4*6*8*11*14*17*20*23*
             ^

如您所见,标记的星号位于位置14。

如果文件碰巧被截断,如下所示

[...]2045*20

那么你就可以得到,有2047个字符的地方(2045其中星号是加2的限制20)。

创建最短的程序(这是)是您的任务,该程序输出(std :: out或file或其他文件)该格式的任意长测试字符串。以字符为单位的长度作为参数给出。该程序最多应支持2 GB的测试数据(输入值2147483647字符)。

2 GB文件中的“危险”位置:

8*11*
98*102*
998*1003*
9998*10004*
99998*100005*
999995*1000003*
9999995*10000004*
99999995*100000005*
999999995*1000000006*

如果决定在995 * 999 *和995 * 1000 *或类似范围内做出决定,这应该回答@Leaky Nun的问题:否。

输入值为2147483647的2 GB文件的末尾是:

2147483640*2147483

如果它没有停止,那么您如何测试呢?
Leaky Nun

2
那是字符长度吗?
TheBikingViking

4
您能证明我们永远不必在995*999*和之间选择995*1000*吗?
Leaky Nun

1
将来,在发布挑战之前,请使用沙盒解决问题。
Mego

1
@ThomasWeller如果我们可以创建更长的输出,我们可以不输入任何内容而仅产生2GB的字符串吗?
xnor

Answers:


4

Haskell,60 58字节

作为函数,我们得到:

f=length.show
iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show

完整程序,72 70字节

这将向STDOUT输出一个无限的计数器字符串:

f=length.show
main=putStr$iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show

输入长度需要额外的20个字节:

main=interact(\j->take(read j)$iterate(\n->1+n+(f$n+1+f n))2>>=(++"*").show)

因为Haskell将数字整数类型默认为,所以这大约适合您的RAM大小Integer



2

Python 2,74 72 66 64 61字节

f=lambda n,i=2:"%d*"%i+f(n,len(`i+2`)-~i)[:n-2]if i<n*2else""

取整数n并输出长度为n的计数器字符串。

程序版本,69字节:

s,n,i="",input(),2
while i<2*n:s+="%d*"%i;i+=len(`i+2`)+1
print s[:n]

从标准输入取整数n并输出长度为n的计数器字符串。

较短但仅几乎有效的替代版本:

n,i=input(),2
while i<2*n:print("%d*"%i)[:n-i],;i+=len(str(i+2))+1

1

PowerShell v5,97个字节

param($n)$l=1;for($i=0;$i-lt$n){$i+="$i*".length;if("$i".Length-gt$l){$i++;$l++};ac .\o "$i*" -n}

将输入作为命令行参数$n,设置$l用于跟踪整数长度的帮助器。然后,我们从循环0$n。每次迭代,我们都$i将由和.length组成的字符串$i的星号加1。然后,如果.length$i改变(例如,从我们2位数字移动到3位),我们增加辅助既$length变量和$i(以考虑附加的数字)。然后,使用oNewLine 使用add-content命令将其追加"$i*".\o当前目录中的文件-n

NB

  • 需要v5,因为该-noNewLine参数最终在该版本中添加。
  • PowerShell会自动从转换[int][double](不,我不知道为什么不转换为[long]),因此这将正确处理输入到或大于的输入2147483648,而不会出现问题。从理论上讲,它会在抱怨之前处理输入1.79769313486232E+308(大约为的最大值[double]),但是我希望磁盘在此之前可以填满。;-)
  • 由于循环条件检查,这会将最小输入长度输出到文件。例如,对于输入,10它将输出2*4*6*8*11*,因为它11$i大于输入的第一个值。

PowerShell v2 +,也为97字节(非竞争)

param($n)$l=1;-join(&{for($i=0;$i-lt$n){$i+="$i*".length;if("$i".Length-gt$l){$i++;$l++};"$i*"}})

它没有发送到文件,而是封装了循环迭代,然后将-join它们组合在一起成为一个字符串。这使它可以用于v5之前的版本。然而,由于.NET定义了一个[string]与像一个构造函数String(char c,Int32 length),这个版本并不能满足最大输入要求,因为输出字符串将溢出和BARF。

另外,您可能不希望管道中有〜2GB的字符串。只是在说'。


1.79769313486232E + 308当然不能工作,因为向浮点数添加小数不会再更改该值。参见stackoverflow.com/questions/12596695/…因此,我猜想它一旦“升级”为两倍就停止工作
Thomas Weller

@ThomasWeller PowerShell [double]是64位的。例如,run for($i=2147483645;$i-lt2147483655;$i++){"$i - " + $i.GetType()}将显示的稳步进行,$i但to 的Type变化。我确定它会在某些时候停止工作,可能会达到约15位数的精度,或者在开始使用时会起作用。将更多的是暴殄天物笑话不是一个严重的上界。2147483648double.ToStringe[double]::MaxValue
AdmBorkBork

1

Python 3中,126个 114 99字节

def f(x,s=''):
 i=t=2
 while len(s)<x:i+=len(str(t+i))-len(str(t));s+=str(t)+'*';t+=i
 print(s[:x])

该函数通过截断字符串的字符计数的参数获取输入,并输出到STDOUT。

这个怎么运作

字符串中数字之间的差最初为2。每经过一个数量级,此差将增加1;否则,该差将增加1。这可以通过采用当前数字的位数与添加到该差异的当前数字的位数之间的差来实现,只有在需要时才为1。该函数仅在字符串的长度小于输入的长度时循环,然后追加到字符串并根据需要更新差值和数字,然后在打印之前将其截断。

在Ideone上尝试

无限输出版本,69字节

s=i=2
while 1:i+=len(str(s+i))-len(str(s));print(end=str(s)+'*');s+=i

1

R,92个字节

    N=nchar;f=function(n){z=0;y="";while(z<n){z=z+N(z+N(z)+1)+1;y=paste0(y,z,"*")};strtrim(y,n)}

输出示例:

f(103)[1]“ 2 * 4 * 6 * 8 * 11 * 14 * 17 * 20 * 23 * 26 * 29 * 32 * 35 * 38 * 41 * 44 * 47 * 50 * 53 * 56 * 59 * 62 * 65 * 68 * 71 * 74 * 77 * 80 * 83 * 86 * 89 * 92 * 95 * 98 * 102 * 1“


0

果冻22 19 18字节

2µṾL+®‘¹©=¡=µ³#j”*

在线尝试!

n在字符串中找到第一个数字,然后在列表中添加星号。这将始终比nOP在注释中允许的时间长。

程序使用#循环中的顺序有选择地用当前编号更新寄存器¹©=¡。我希望通过将©第二个放到第二个位置来缩短它的时间,µ但不幸的是这是行不通的,而且我无法找出任何更短的东西。

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.