限制跑步次数


15

自我限制清单

考虑包含非负整数的非空列表L。运行大号是相等的元素,这是不能进行长的连续子列表。例如,[0,0,1,1,3,3,3,2,1,1]游程[0,0],[1,1],[3,3,3],[2 ],[1,1]。列表大号自限性的,如果对于每个整数Ñ≥1 ,的出现次数Ñ小于或等于的运行数N-1 。上面的列表不是自限性的,因为有4次出现1,但只有一次运行0 s。

这是一个自限制列表的示例:[0,0,3,4,1,0,2,1,1,0,2,1,0,0,0,1,0]。它有

  • 5个的运行0和5所出现的1
  • 4次运行1次和2次出现2次
  • 2个的运行2和1次的出现3
  • 1运行3和1出现4
  • 1次运行4次,未出现5次
  • 没有其他整数的出现。

任务

您的任务是确定列表是否是自限制的。更明确地说,您的输入应为非负整数的非空列表。如果列表是自限性的,则您的输出应为真实;否则,将是虚假的。输入和输出可以采用任何合理的格式。

每种编程语言中最少的字节数是获胜者。适用标准规则。

测试用例

真实实例:

[0]
[1,0]
[0,1,1,0,2]
[3,1,1,0,0,2,0,0]
[5,0,4,1,3,0,2,2,0,1,1,1,0]
[0,0,1,1,0,0,1,1,0,0,2,2,0,0]
[6,0,0,0,2,2,1,0,5,0,3,4,0,1,1,1]
[5,0,1,0,0,0,0,4,0,3,1,1,1,2,2,0,0,0,0,0]
[4,5,1,3,2,0,5,2,0,3,0,1,0,1,0,0,0,1,0,0,1,0,3,4,4,0,2,6,0,2,6]
[0,4,1,3,10,6,0,1,3,7,9,5,5,0,7,4,2,2,5,0,1,3,8,8,11,0,0,6,2,1,1,2,0,4]

虚假实例:

[2]
[1,1,0]
[0,0,1,1,1,0,0,2]
[0,1,0,1,1,2,2,3,0,0,4,6]
[1,1,2,1,2,0,2,0,3,0,0,2,2,1,2,3,2,0,1,1,1,0,0,3,3,0]
[3,4,1,0,0,0,5,5,0,2,2,0,0,0,0,0,2,0,1,1,0,4,3,5,4,3]
[1,0,0,0,2,5,3,1,1,0,3,3,1,3,5,4,0,4,0,0,2,0,2,1,1,5,0,0,2,4,4,0,2,0,1,4,4,2,3,3,5,3,4,0,2,0,5]
[4,3,1,0,0,4,6,6,1,0,1,2,1,3,0,1,0,2,0,3,4,0,2,1,1,3,0,2,2,2,0,5,5,0,5,2,5,5,0,4,3,2,3,1,1,3,5,1,4,1,6,2,6,2,4,0,4,0,4,5,3,3,0,0,6,1,0,0,0,6,2,1,0,1,2,6,2,4]
[5,1,1,1,0,2,0,6,1,0,2,1,2,2,5,3,1,0,0,0,3,2,3,0,1,1,0,1,0,1,1,2,0,6,4,1,2,1,1,6,4,1,2,2,4,0,1,2,2,1,3,0,1,2,0,0,0,2,0,2,2,0,1,0,0,1,3,0,0,0,6,2,0,1,0,1,2,1,1,1,0,4,0,0,5,2,0,0,0,4,1,2,2,2,2,0,5,3,2,4,5,0,5]

不必打扰,但请考虑使用本次元讨论中的一种方法,而不是诚实/虚假,因为诚实不只是这里经常使用的几种语言的特性。
FryAmTheEggman

@LeakyNun是的,否则对于那些不存在N-1的N,条件将失败。
Zgarb

@ Mr.Xcoder也有[2],但是这种情况应该是虚假的,是的。
暴民埃里克(Erik the Outgolfer)

@FryAmTheEggman我没看过那个讨论,谢谢你的链接。我将继续保持这种挑战,因为我想在此讨论一段时间。
Zgarb

可以,但是我想在这里保留评论,因为我觉得很多人都错过了它。至少对我来说,在像Retina这样的语言中发布内容非常重要。
FryAmTheEggman

Answers:


5

Perl 6,29个字节

{bag(.grep(?*)X-1)⊆.squish}

在线尝试!

对于Perl 6来说,这是一个非常好的挑战。在Bags(整数加权集)上使用子集运算符。说明:

{
    bag(           # Create bag of
        .grep(?*)  # non-zero elements,
        X- 1       # decremented by one.
    )
                  # Subset test.
    .squish        # "squish" removes repeated elements in each run.
                   # The result is implicitly converted to a bag
                   # counting the number of runs.
}

1
美丽。我看到了“袋+子集”方法,但坚持要进行比较。
Phil H

3

JavaScript(ES6),92 89字节

a=>a.map(n=>g(~n,n!=p&&g(p=n)),c=[j=0],p=g=n=>c[n]=-~c[n])&&!c.some((n,i)=>i-j++|n<c[~j])

在线尝试!

怎么样?

数组c []用于存储运行次数和整数出现次数。将游程存储在非负索引处,将整数出现的位置存储在1'-补码索引中(c [-1] = 0的数目,c [-2] = 1的数目,等等)。

负指数实际上保存为属性底层数组对象和的。有的()不在它们之间迭代。

a =>                        // given the input array a[]
  a.map(n =>                // for each value n in a[]:
    g(                      //   update c[]:
      ~n,                   //     increment c[~n] (# of integer occurrences)
      n != p && g(p = n)    //     if n != p, set p to n and increment c[n] (# of runs)
    ),                      //   end of c[] update
    c = [j = 0],            //   start with c = [0] and j = 0 (used later)
    p =                     //   initialize p to a non-numeric value
    g = n => c[n] = -~c[n]  //   g = helper function to increment c[n]
  )                         // end of map()
  && !c.some((n, i) =>      // for each value n at position i in c[]:
    i - j++ |               //   make sure that i == j++
    n < c[~j]               //   and n is greater than or equal to c[~j]
  )                         // end of some()


3

果冻,10字节

œ-ŒgḢ€‘ƊS¬

在线尝试!

怎么运行的

œ-ŒgḢ€‘ƊS¬  Main link. Argument: A (array)

       Ɗ    Drei; group the three links to the left into a monadic chain.
  Œg          Group consecutive, identical elements of A into subarrays.
    Ḣ€        Head each; pop the first element of each run.
      ‘       Increment the extracted integers.
            The resulting array contains n repeated once for each run of (n-1)'s.
œ-          Perform multiset subtraction, removing one occurrence of n for each
            run of (n-1)'s.
       S    Take the sum. If only 0's remain, the sum will be 0.
        ¬   Take the logical NOT, mapping 0 to 1 and positive integers to 0.





2

Stax13个 9 字节

丹尼斯发现了一种更好的算法。我毫不客气地将其移植到了stax。

ä╨²@┬↕OR♣

在线运行和调试

开箱即用,没有包装,没有评论,这就是它的样子。

c   copy input
:g  get run elements
{^m increment each
|-  multiset-subtract from original input
|M! get maximum from result, and apply logical not

运行这个

旧答案:

║Ä|╤#╫∩▼cëózü

运行并调试

遍历输入并检查条件:

  • 是元素 > 0吗?
  • occurrences(element) >= runs(element - 1)

如果这些条件中的任何一个对于某个元素都成立,则该元素是合规的。如果所有元素均符合要求,则结果为1

这是同一程序的未打包,未注释,已注释的表示形式。

O           push 1 under the input
F           iterate over the input using the rest of program
  |c        skip this iteration of the value is 0
  x#        number of occurrences of this value in input (a)
  x:g _v#   number of runs of (current-1) in input (b)
  >!        not (a > b); this will be truthy iff this element is compliant
  *         multiply with running result

运行这个


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.