自包含数字的序列


22

让我们将一个独立的数字定义为一个正整数,其数字出现的长度仅等于它们的长度。换句话说,任何十进制数字d(不包括0)仅在长度为d的游程中出现

任务

您可以选择以下三种方法之一:

  • 给定整数n,输出第n个(包含0或1索引的)自包含数字。
  • 给定整数n,输出前n个自包含数字。
  • 无限期打印序列。

例子

  • 133322是一个自包含的数字,因为3出现在三个3的行中,1是单个,而2出现在两个2的行中。

  • 另一方面,不是35553355,因为尽管53分别出现5次和3次,但它们不会形成相邻数字的行。

  • 44422不是自包含的,因为4仅发生3次。

  • 12222333也不是,因为2以四个2顺序出现,并且不能将其视为两个2的两个单独的行程

毫不奇怪,这是OEIS A140057,它的前几个术语是:

1, 22, 122, 221, 333, 1221, 1333, 3331, 4444, 13331, 14444, 22122, 22333, 33322, 44441, 55555, 122122, 122333, 133322, 144441, 155555

您可以输入和通过任何提供输出的标准方法,在任何编程语言,但同时指出,这些漏洞被默认禁止的。这是代码高尔夫,因此以字节为单位(每种语言)的最短代码获胜。

Answers:


8

Python 2中104个 94 83字节

Xcoder先生感谢-10个
字节Jonathan Allan感谢-11个字节

i=0
while 1:
 if`i`==''.join(d*int(d)for c,d in zip(`-i`,`i`)if d!=c):print i
 i+=1

在线尝试!


...实际上是可以接受的,因为一旦i变长就会掉下来?可能有必要使用str(尽管我永远不确定这些事情)。
乔纳森·艾伦,

1
@JonathanAllan,这是一个有趣的问题。通常,我们可以假定它在标准整数类型之内,而不是long,但是Python并没有非常清楚地区分这一点……
FlipTack

6

Mathematica,66个字节

无限打印序列

Do[##&&Print@t&@@(#==Tr[1^{##}]&@@@Split@IntegerDigits@t),{t,∞}]

在线尝试!

在TIO中,您必须终止执行才能看到结果,但是在Mathematica中,它可以正常工作。

马丁·恩德的-12个字节


6

05AB1E,9个字节

返回序列的第n个项,以1为索引。

µNÔNγ€gJQ

在线尝试!

说明

µ           # loop over increasing N until counter equals input
 NÔ         # push N with consecutive equal elements deduplicated
   Nγ       # push N grouped into runs of consecutive equal elements
     €g     # get the length of each run
       J    # join to a number
        Q   # check for equality
            # if true, implicitly increment counter

我的10个字节的方法可能会激发灵感:µNγD€gs€ÙQ
Xcoder先生17年

6

JavaScript(ES6),76 71 68字节

返回序列的第n个项,索引为0。

f=(n,k)=>+(k+'').replace(/(.)\1*/g,s=>s.length^s[0])||n--?f(n,-~k):k

注意:与递归函数一样,输入范围取决于尾调用优化支持和引擎的堆栈大小。

演示版


Alt。版本,65字节

不接受任何输入,并用alert()一次打印结果。

f=k=>f(-~k,+(k+'').replace(/(.)\1*/g,s=>s.length^s[0])||alert(k))

在线尝试!(超过最大堆栈大小后立即停止。)



2

CJam,20个字节

1{_Abe`::=:*{_p}&)}h

在线尝试!

说明:

1                       push 1
 {                }h    while TOS is truthy (i.e. forever):            example iteration: 14444
  _                       duplicate                                                       14444 14444       
   Ab                     convert to base 10 (get decimal digits)                         14444 [1 4 4 4 4]
     e`                   run-length encode (array of two-element arrays)                 14444 [[1 1] [4 4]]
       :                  map over the array:
        :                   fold between the two array elements with:
         =                    equality                                                    14444 [1 1]
          :               fold between the array elements with:
           *                multiplication (a.k.a. logical AND for 1 or 0)                14444 1
            {  }&         if this yields a result of 1:
             _              duplicate the number and                                      14444 14444
              p             print it                                                      14444 (output 14444)
                 )        increment the number                                            14445


2

Brachylog,10个字节

≜ℕẹḅ⟨l=h⟩ᵐ

在线尝试!

通过其输入变量无限生成序列的元素。(如果它实际上有做印刷本身,追加&ẉ⊥)。这基本上是代码来解决相应的前置穷举最小的解决方案,第一:

        ᵐ    For every
  ḅ          run of
 ẹ           digits in
             the input variable
ℕ            (which is a non-negative integer),
   ⟨l  ⟩     its length
   ⟨  h⟩     and its first element
   ⟨ = ⟩     are equal.

我期望这仅占用9个字节,但似乎需要明确地将数字分开。


1

JavaScript 4,83 80字节

for(i=0;;)+(++i+'').replace(/(.)\1*/g,function(x,y){return y^x.length})||alert(i)

for(i=0;i<1000;)+(++i+'').replace(/(.)\1*/g,function(x,y){return y^x.length})||alert(i)


“ JavaScript 1”?有这样的语言名称吗?
user202729

我的意思是自JavaScript出现以来,它就可以工作,不确定名称是否正确
l4m2

对不起,它似乎无法在js1中使用。我阅读并发现没有替代品
l4m2


1

R,56个字节

function(n)all((r=rle(el(strsplit(c(n,''),''))))$l==r$v)

在线尝试!

在分割编号上使用行程编码。如果所有长度等于值,则返回true。

注意:我已经methods在TIO中加载了库才能el开始工作。





0

Java 10,121个字节

int到的Lambda int。该函数采用索引n并返回第n个(1索引)序列值。

n->{int x=0,m=1;for(;n>0;n-=m,m=1)for(var p:(++x+"").split("(?<=(.))(?!\\1)"))m=p.length()==p.charAt(0)-48?m:0;return x;}

在线试用

不打高尔夫球

n -> {
    int x = 0, m = 1;
    for (; n > 0; n -= m, m = 1)
        for (var p : (++x + "").split("(?<=(.))(?!\\1)"))
            m = p.length() == p.charAt(0) - 48 ? m : 0;
    return x;
}
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.