回收计数算法


14

学习如何进行计数的孩子通常知道数列,但似乎无法正确地将它们组合在一起。

例如,他们可能会说:

1,2,3,4,7,8,9,10

有时孩子会意识到他们跳过了一些数字,然后回去:

1,2,3,4,7,8,5,6,7,8,9,10

显然,这是上乘的模式。我们需要识别它们。

要识别这些列表:

  1. 我们确定列表的最小M和最大N

  2. 我们逐一列出。如果当前数字大于或等于列表右侧的任何成员,那么我们将删除当前数字。

  3. 如果剩余列表包含从M到的所有数字N,则我们返回真实值。

您可以假设您的输入列表将至少包含1个元素。您可以假设所有整数都是非负数。

测试用例:

真相:

0
10
0 0 0 
1 0 1
0 1 2 3 4 5 6 7 8 9 10
0 1 2 3 0 1 2 3
0 1 2 3 4 5 5
0 1 1 2 2 3
0 3 6 1 4 7 2 5 8 3 4 5 6 7 8
1 3 5 7 2 3 4 5 6 7
5 6 0 1 2 3 6 7 4 5 6 7
5 6 7 8
5 5 6 7 8
4 6 7 8 3 4 5 6 7 8

虚假:

1 0
4 3 2 1
1 2 3 7 8 9
0 1 2 3 1 3
0 1 2 3 1 3 4
0 1 2 3 1 3 2 4
0 1 2 3 1 3 2 4 3
1 3 5 7 2 4 6 8
0 1 2 1 3 4 5 6
4 5 6 3 4 5

这是,因此请尽可能短地回答!


不太清楚:应该将[0,1,2,3,4,5,4,3,2,1]视为真还是假?
GB

1
@GB错误。当您在第二个元素上时,您将在步骤2中将其删除(因为1该行之后还有另一个)。您还将删除所有其他元素(最后一个元素除外),因此最终将得到0 1,而不是0 1 2 3 4 5
Nathan Merrill

Answers:


6

05AB1E,5个字节

我不是100%确信这可行,但是它可以通过所有测试用例,并且我找不到任何失败的情况。

Ú¥1QP

在线尝试!

Ú¥1QP   Main link. Argument a
Ú       Reverse uniquify a, keeps only last occurence of each element
 ¥      Get all deltas - all 1 if ascending list
  1Q    Compare all deltas to 1
    P   Product of all results

7个字节,其实
VAL恢复莫妮卡说:

2
@val否05AB1E使用自定义编码05AB1E。
大公埃里克

2

果冻10 9字节

ṀrṂɓṚ«\Q⁼

在线尝试!

怎么运行的

ṀrṂɓṚ«\Q⁼  Main link. Argument: A (array)

Ṁ          Yield the maximum of A.
  Ṃ        Yield the minimum of A.
 r         Yield R := [max(A), ... min(A).
   ɓ       Begin a new chain. Left argument: A. Right argument: R
    Ṛ      Reverse A.
     «\    Take the cumulative minimum.
       Q   Unique; deduplicate the results.
        ⁼  Compare the result with R.

有趣,是ɓ一个相对较新的功能吗?
ETHproductions's

是的,这是乔纳森·艾伦的要求。
丹尼斯

啊哈,13天前。但是还没有看到它使用过(也许您或Jonathan拥有了,我只是想念了它)。
ETHproductions's

«\我认为,这里真正有趣的部分是。
暴民埃里克(Erik the Outgolfer)'17年



1

PHP148字节

-18个字节,谢谢@Christoph

$a=explode(' ',$argn);$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);

在线尝试!


好的,在这里可以做很多评论:$argn总是字符串foreach不起作用。您可以使用$argv获取数组作为输入,但是要注意,它始终包含文件名作为第一个元素。您可以使用$m,并$n只有一次,所以你可以节省大量创建字节的$b前面:$b=range(min($a),max($a));(bool)完全不需要演员表。if($k>=$a[$s])$a[$i]=null;$k<$a[$s]?:$a[$i]=-1;。使用参考,我们可以这样做:foreach($a as$i=>&$k)(+1个字节),并$a[$i]$k(-4字节)。而且,这让我们放手,$s=$i因为我们$i现在可以直接迭代。
克里斯多夫(Christoph)

结果看起来像这样$a=$argn;$b=range(min($a),max($a));foreach($a as$i=>&$k)for(;++$i<count($a);)$k<$a[$i]?:$k=-1;echo!array_diff($b,$a);(117个字节)。但是它仍然以$argn错误的方式使用。$a=explode(' ',$argn);可以解决此问题再增加13个字节。
克里斯多夫(Christoph)

1
没问题 !总是很高兴找到一个新的PHP高尔夫球手,希望能与更多的人见面:) Titus,Jörg或我总是在这里为您提供帮助!
克里斯多夫(Christoph)

1
@Christoph为什么不用$_GET作输入数组?在这种情况下,没有必要使用explode产生额外-6字节使用不$b变量
约尔格Hülsermann

1
@Christoph好的在这种情况下,我们需要7.1以下的版本,我们使用´a&`而不是~ 在线尝试!
约尔格Hülsermann

1

爪哇8,264个 262字节

import java.util.*;l->{int m=Collections.max(l),n=Collections.min(l),i=0,q;for(;i<(q=l.size());i++)if(l.subList(i+1,q).size()>0&&l.get(i)>=Collections.min(l.subList(i+1,q)))l.remove(i--);for(i=0;n<=m;)if(i<l.size()&&l.get(i++)==n)n++;else return 0>1;return 1>0;}

说明:

在这里尝试。

import java.util.*;                 // Import for Collections

l->{                                // Method with integer-ArrayList parameter and boolean return-type
  int m=Collections.max(l),         //  Max of the list
      n=Collections.min(l),         //  Min of the list
      i=0,q;                        //  Two temp integers
  for(;i<(q=l.size());i++)          //  Loop (1) over the list
    if(l.subList(i+1,q).size()>0    //   If the sublist right of the current item is not empty
    &&l.get(i)>=Collections.min(l.subList(i+1,q))) 
                                    //   and if the current item is larger or equal to the lowest value of this sublist
      l.remove(i--);                //    Remove the current item from the main list
                                    //  End of loop (1) (implicit / single-line body)
  for(i=0;n<=m;)                    //  Loop (2) from min to max
    if(i<l.size()                   //   If the current item doesn't exceed the list's size
    &&l.get(i++)==n)                //   and the items are in order so far
      n++;                          //    Go to the next item
    else                            //   Else:
      return 0>1;//false            //    Return false
                                    //  End of loop (2) (implicit / single-line body)
  return 1>0;//true                 //  Return true
}                                   // End of method

1

R,88 85字节

y=NULL;for(i in x<-scan())if(all(i<x[-(1:(F<-F+1))]))y=c(y,i);all(min(x):max(x)%in%y)

这可能可以进一步打下去。循环x检查的元素,检查所有即将到来的值是否都更大,然后才保留该元素。循环之后,它将创建一个从min(x)到的序列max(x),并检查%in%所有值是否都包含在的修剪版本中x


通过移植丹尼斯的答案,我们可以减少到53个字节。function(n)all(unique(cummin(rev(n)))==max(n):min(n))
朱塞佩

1

JavaScript(ES6),60个字节

s=>(o={},s.reverse().every((n,i)=>!i|o[n+1]|o[n]&&(o[n]=1)))

取消高尔夫:

s=>(
  o={},
  s.reverse().every((n,i)=>
    !i|o[n+1]|o[n]&&(o[n]=1)
  )
)

这是一个更简单的算法:

反向迭代数组,并确保每个数字(第一个数字除外)均小于或等于已经看到的数字。

片段:


1

Haskell,62个字节

g(a:b)=[a|all(a<)b]++g b
g a=a
f x=g x==[minimum x..maximum x]

在线尝试!

该定义的直接实现是在g元素比其右边的元素> =时删除元素。


1

C#,69个字节

s=>s.Where((e,i)=>s.Skip(i+1).All(r=>e<r)).Count()==s.Max()-s.Min()+1

简而言之:
s =输入(s)序列
取自s元素,该元素之后的所有项目(跳过(I)ndex + 1项),当前值较高
,请计算这些,并查看剩余量是否等于预期量((最大值)减去(min))数量

在线尝试!


@MDXF你想欢迎他吗?
Stan Strum,

@StanStrum我是否误解了规则?我的英语太乱了吗?我第一次张贴
Barodus

不,不!很荣幸地欢迎初来乍到PPCG,我问他,如果他想要打个招呼你
斯坦乱弹

似乎特权对你们俩都有。谢谢,人们^^
Barodus

这是一个很好的第一答案,希望您在PPCG的未来玩得开心!
Stan Strum

0

JavaScript(ES6),82 73 72 70字节

返回一个布尔值。

a=>a.filter((x,i)=>k-=a.every(y=>~i--<0|y>x,m=x>m?x:m),m=k=0)[0]+~m==k

怎么样?

我们迭代输入数组的每个元素x a的,跟踪遇到的最大值 m和数字 -k不大于或等于其右侧任何成员的值。根据定义,有效值严格按升序显示。

我们使用filter()而不是map(),以便滤除所有元素,直到k变为负数。这使我们能够隔离第一个有效元素,这也保证是数组的最小值。

最后,我们测试是否minimum - (maximum + 1) == -number_of_valid_elements

a.filter(...)[0] + ~m == k

测试用例

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.