类Kolakoski自参考序列


19

这是如何定义Kolakoski序列(OEIS A000002)的方法:

所述Kolakoski序列是包含序列12,并且n该序列的第i个元素是长度n个组相等的元素(运行)的序列本身中的。序列的前20个术语以及相应的长度为:

1 2 2 1 1 2 1 2 2 1 2 2 1 1 2 1 1 2 2 1
- --- --- - - --- - --- --- - --- --- -
1  2   2  1 1  2  1  2   2  1  2   2  1

本质上,科拉科斯基序列的相等元素的组的长度是科拉科斯基序列本身。

到目前为止,一切都很好,但是为什么我们要限制于12?我们不会去!给定两个输入,一个正整数数组A和一个整数N,返回N循环通过定义的类似Kolakoski序列的第一项A。为了更好地理解它,下面是一个有效的示例,括号中包含新添加的组的长度:

A = [2, 3, 1]
N = 25

2: [[2], 2 ]
3: [ 2 ,[2], 3 , 3 ]
1: [ 2 , 2 ,[3], 3 , 1 , 1 , 1 ]
2: [ 2 , 2 , 3 ,[3], 1 , 1 , 1 , 2 , 2 , 2 ]
3: [ 2 , 2 , 3 , 3 ,[1], 1 , 1 , 2 , 2 , 2 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 ,[1], 1 , 2 , 2 , 2 , 3 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 ,[1], 2 , 2 , 2 , 3 , 1 , 2 ]
3: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 ,[2], 2 , 2 , 3 , 1 , 2 , 3 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 ,[2], 2 , 3 , 1 , 2 , 3 , 3 , 1 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 ,[2], 3 , 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 ]
3: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 ,[3], 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 ]
1: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 ,[1], 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 ]
2: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 1 ,[2], 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 , 2 , 2 ]
C: [ 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 , 2 , 3 , 1 , 2 , 3 , 3 , 1 , 1 , 2 , 2 , 3 , 3 , 3 , 1 , 2 , 2 ]

这是另一个带有领导的有效示例1

A = [1, 2, 3]
N = 10

1: [[1]]
2: [ 1 ,[2], 2 ]
3: [ 1 , 2 ,[2], 3 , 3 ]
1: [ 1 , 2 , 2 ,[3], 3 , 1 , 1 , 1 ]
2: [ 1 , 2 , 2 , 3 ,[3], 1 , 1 , 1 , 2 , 2 , 2 ]
C: [ 1 , 2 , 2 , 3 , 3 , 1 , 1 , 1 , 2 , 2 ]

如您在上面看到的,最终结果被剪切为N = 10元素。的n第i个元素应该是多久n个相等元件组是,即使元件本身它指的是该组中的所属。与上述情况一样,第一个1指的是第一个这样的组,该组恰好是that 1,而第一个2指的是第二个这样的组,以它开头。

规则

  • 您可能会假设A永远不会有两个或多个连续的相等元素。A可含有的整数一次以上,但第一和最后的元件将不相等,并且A将含有至少2个元件(例如[1, 2, 2, 3][2, 4, 3, 1, 2][3]不打算被给予)。这是因为如果存在连续的相等元素,则最终结果将是该序列的无效前缀。
  • 您可以假设A仅包含正整数(否则将无法定义此类序列)。
  • 您可以假定N是一个非负整数(N >= 0)。
  • 您返回的条款不能超过要求的数量。
  • 严格禁止使用任何标准漏洞
  • 您可以使用任何合理的I / O方法
  • 您的答案不必超出自然语言范围,但从理论上讲,您的算法应适用于任意大的输入和整数
  • 这是,因此最短的答案将获胜。

测试用例

[5, 1, 2], 0 -> []
[2, 3, 1], 25 -> [2, 2, 3, 3, 1, 1, 1, 2, 2, 2, 3, 1, 2, 3, 3, 1, 1, 2, 2, 3, 3, 3, 1, 2, 2]
[1, 2, 3], 10 -> [1, 2, 2, 3, 3, 1, 1, 1, 2, 2]
[1, 2], 20 -> [1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 1]
[1, 3], 20 -> [1, 3, 3, 3, 1, 1, 1, 3, 3, 3, 1, 3, 1, 3, 3, 3, 1, 1, 1, 3]
[2, 3], 50 -> [2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3]
[7, 4], 99 -> [7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4]
[1, 2, 3], 5 -> [1, 2, 2, 3, 3]
[2, 1, 3, 1], 2 -> [2, 2]
[1, 3, 5], 2 -> [1, 3]
[2, 3, 2, 4], 10 -> [2, 2, 3, 3, 2, 2, 2, 4, 4, 4]

沙盒
超过


@MartinEnder认为我已经链接了
Outgolfer的Erik

Answers:


9

外壳,8字节

Ṡωȯ↑⁰`Ṙ¢

首先获取长度,然后获取列表。 在线尝试!

说明

Ṡωȯ↑⁰`Ṙ¢  Inputs: n=9 and x=[2,1,3]
Ṡωȯ       Apply the following function to x until a fixed point is reached:
           Argument is a list, say y=[2,2,1,3,3,3]
       ¢   Cycle x: [2,1,3,2,1,3..
     `Ṙ    Replicate to lengths in y: [2,2,1,1,3,2,2,2,1,1,1,3,3,3]
   ↑⁰      Take first n elements: [2,2,1,1,3,2,2,2,1]
          Final result is [2,2,1,1,3,2,1,1,1], print implicitly.

8

Pyth,14个字节

u<s*V]M*QlGGvz

在线尝试:演示测试套件

说明:

u                 start with G = input array
       *QlG       repeat input array
     ]M           put every element into its own list
   *V      G      repeat every list vectorized by the counts in G
  s               flatten
 <          vz    take the first (second input line) numbers
                  and assign them to G until you reach fixed point

有趣的选择:u&VSvzs*V]M*Ql
Jakube

1
这是一个很好的方法。
Erik the Outgolfer

5

爪哇8,151 + 19个 119 115字节

a->n->{int c=0,l[]=new int[n],i=0,j;for(;i<n;i++)for(j=0;j<(c==i?a[i]:l[i])&c<n;j++)l[c++]=a[i%a.length];return l;}

在线尝试!


1
您可以通过删除两个括号,更改&&&并删除逗号来减少四个字节:a->n->{int c=0,l[]=new int[n],i=0,j;for(;i<n;i++)for(j=0;j<(c==i?a[i]:l[i])&c<n;j++)l[c++]=a[i%a.length];return l;}115 bytes
Kevin Cruijssen

建议(c==i?a:l)[i]而不是c==i?a[i]:l[i]
ceilingcat

5

[R 120 114 108个字节

-6个字节归功于plannapus

function(A,N){i=inverse.rle
w=length
a=rle(A)
while(w(a$l)<N){a[[1]]=i(a)
a[[2]]=rep(A,l=w(a$l))}
i(a)[0:N]}

在线尝试!

匿名函数;依次反转RLE,取代的长度a[[1]]与倒置RLE,并且这些值a[[2]]A复制到一个长度等于的a$l


@plannapus啊,对!我确实尝试过并且使R崩溃,因为在赋值时,它将创建a$l并且a$v如果它们不存在,但是它们不会影响对的调用inverse.rle,从而导致无限循环。我想我只能a$lwhile条件和rep条件中使用。
朱塞佩

5

Haskell,68个字节

非常感谢Laikoni和furr在PPCG Haskell聊天室Of Monads and Men中调试和打高尔夫球时所提供的帮助。欢迎打高尔夫球!在线尝试!

(.f).take
f a@(z:_)=(z<$[1..z])++do i<-[1..];cycle a!!i<$[1..f a!!i]

第一行是匿名函数。第二行是产生我们的Kolakoski式序列的无穷列表理解。

说明

首先,我们将其定义zawith 的头a@(z:_)。然后,使用初始化序列(z<$[1..z])

然后,从1开始,do i<-[1..]我们将以下内容附加到序列:cycle a!!i<$[1..f a!!i],它是(无限期地)附加时间的i-th个成员。af a!!i

最后,匿名函数仅采用n类似Kolaskoski序列的第一项。


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.