创建一个通用整数序列


22

定义

如果一个(无限)整数序列包含每个有限整数序列作为连续的子序列,让我们称其为通用。

换句话说,整数序列(a 1,a 2,…)是通用的,当且仅当对于每个有限整数序列(b 1,…,b n有一个偏移k使得(a k + 1,…,a k + n)=(b 1,…,b n

例如,正质数的序列不是通用的,原因如下。

  • 它不包含任何负整数,1或复合数字。

  • 尽管它包含3,但不包含连续的子序列 3,3,3

  • 尽管它包含25,但不包含连续的子序列(2,5)

  • 尽管它包含连续的子序列(7、11、13),但不包含连续的子序列(13、11、7)

任务

选择任何单个通用整数序列(a 1,a 2 …),并按照以下规则以您选择的编程语言实现它。

  • 您可以提交完整的程序或功能。

  • 您有三种I / O选项:

    1. 不输入任何内容并打印或返回整个序列。

    2. 以指数ñ作为输入并打印或返回一个ñ

    3. 以索引n作为输入并打印或返回(a 1,…,a n

  • 对于I / O选项23,可以根据需要使用基于0的索引。

  • 您的提交必须是确定性的:如果使用相同的输入多次运行,则必须产生相同的输出。

此外,除非立即显而易见,否则请证明您选择的顺序是通用的。您的证明可能不取决于未经证实的猜想。

适用标准规则。可能以字节为单位的最短代码获胜!


您的证明可能不取决于未经证实的猜想。我认为这是隐含的:p
外围大佬埃里克(Erik the Outgolfer)'17年

以及如何在数字中保存数字列表?
RosLuP

Answers:


13

外壳,5个字节

这将打印一个无限列表

ΣṖ…ݱ

在线尝试!找到序列的第一个索引。(为大多数序列占用大量内存)

说明:

   ݱ   Infinite list [1,-1,2,-2,3,-3,4,-4,5,-5...]
  …     Rangify       [1,0,-1,0,1,2,1,0,-1,-2,...]
 Ṗ      Powerset
Σ       Concatenate

在Husk中,无限列表的行为很好。你可以在这里看到它的行为


您可能想详细说明其Q工作原理。(我想我明白了,但我不确定。)
丹尼斯

@Dennis证明我想要的不是Q
H.PWiz

9

Python 2中49 46 43个字节

def f(n):d=len(`n`);return n/d**(n%d)%d-d/2

f(n)返回一个ñ只。这使用nin 的最小位数d提取较高的位数之一。

在线尝试!该脚本(由Dennis提供)采用任何有限序列,并为您提供n该序列的开始位置。

说明

n/d**(n%d)%d-d/2
     (n%d)         least significant digit of n
n/d**(   )%d       get n%d-th digit of n
            -d/2   offset to get negative values

例如,对于n在范围31415926503141592659d=10和的最后一个数字n选择的其它数字之一。然后我们相加-d/2得到负值。

n%d:       0  1  2  3  4  5  6  7  8  9
f(n)+d/2:  0  5  6  2  9  5  1  4  1  3
f(n):     -5  0  1 -3  4  0 -4 -1 -4 -2

独立替代方案,也是43个字节:

n=input();d=len(`n`);print n/d**(n%d)%d-d/2

您可以使用len(`n`)代替len(str(n))
丹尼斯

谢谢@丹尼斯。如果有人需要,我可以添加更多解释。
japh

我编写了一个函数,该函数在给定有限序列的情况下可以找到序列中的偏移量。在线尝试!
丹尼斯

这很酷。
历史学家

真好 唯一的事情是它将被打破,n=2**63-1因为该表示形式被L追加了一个附件(str(n)如果需要的话,可以解决三个字节)。
乔纳森·艾伦

5

Brachylog 2,11个字节

≜~×-₂ᵐ~ȧᵐ≜∋

在线尝试!

我还尝试了在列表上使用加法分区的算法,但是它的长度并不短。这是一个生成器,生成无限的整数流作为输出;TIO链接具有标头以打印其中的前一万个。

说明

该程序通过依次尝试所有可能的整数开始(尝试所有剩余的可能性,默认情况下为整数)。那是0、1,-1、2,-2等(尽管负整数没有到达程序的末尾)。这是程序的唯一“无限”步骤。所有其他都是有限的。

然后生成整数的所有可能的因式分解,将不同的阶数视为不同的阶数,并且仅使用2以上的值(因此只有有限的多个);请注意,分解中允许使用复合数字,而不仅是素数。这意味着,在执行函数的某个时候,所有可能的整数≥2序列都将在此步骤中生成(因为该序列必定具有某种乘积,并且该乘积将在某个点处由Initial生成)。

然后,我们需要将这些序列的集合映射到所有整数序列的集合上,这需要分两步完成:-₂从每个元素()中减去2 (),为我们提供所有非负整数序列的集合,然后取正或负(,即「绝对值为的值」)每个元素()。后面的步骤显然是不确定的,因此Brachylog将其视为生成器,生成所有可能的列表,这些列表的元素为输入列表中相应元素的正负。这意味着我们现在为所有可能的整数序列生成了一个生成器,并以一定的顺序生成它们,这意味着它们都是已生成的(具体来说,如果取每个元素的绝对值,则得到的顺序为每个元素加2元素,然后按所得元素的乘积排序)。

不幸的是,这个问题只需要一个序列,而不是序列,因此我们需要两个以上的命令。首先,请求Brachylog 严格显式地生成序列序列(与生成描述通过此方法生成的序列概念的数据结构相反,直到需要时才实际生成序列);在这种情况下,这两者都会使程序更快,并确保以请求的顺序生成输出。最后,使生成器一次输出单个序列的元素(一旦输出了前一个序列的所有元素,便移至下一个序列)。

最终结果:每个可能的整数序列都被生成并输出,一次一个元素,然后全部串联成一个通用序列。


ais523 ...是你!?
致命

如果不是他们,这是一个巧合,因为考虑到他们删除的帐户中的帖子显示了相同的帐号。
完全人类


4

Python 2中100个 99字节

  • 多亏ovs节省了一个字节; 遍历itertools内置无限循环。
from itertools import*
for n in count():
 for P in permutations(range(-n,n)*n):
	for p in P:print p

在线尝试!

不确定地打印所有非负整数n-times重复整数范围的所有排列。 您可以使用此修改版本搜索任何子序列的第一个偏移量。[-n; n)n
k


while~0:。嘿嘿...
Chas Brown

99个字节使用itertools.count
ovs

@ovs谢谢;不知道那个内置的。
乔纳森·弗雷希

2

Perl 6,91个字节

loop (my$i=1;;$i++){my@n=(-$i..$i);my@m=@n;loop (my$k=1;$k <$i;$k++){@m=@m X@n;};print @m;}

在线尝试!

这使用了与其他一些答案类似的方法。它使用笛卡尔乘积来打印的元素(-1,0,1),然后打印元素中的所有有序对,然后打印元素中的(-2,-1,0,1,2)所有有序三联体(-3,-2,-1,0,1,2,3),等等。

我是Perl的新手,所以可能会有更多打高尔夫球的事情。

更具可读性的版本:

loop (my $i = 1; ; $i++) {
  my @n = (-$i..$i);
  my @m = @n;
  loop (my $k=1; $k <$i; $k++) {
    @m = @m X @n;
  }
  print @m;
}
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.