自恋数组元素


15

定义

数组的自恋1整数认为它们比其邻居更好,因为它们严格高于其算术平均值。

邻居的定义如下:

  • 如果整数在索引0(第一个)处,则其邻居为列表的最后一个和第二个元素。

  • 如果该整数不是第一个也不是最后一个,则其邻居是两个紧邻的元素。

  • 如果整数在索引-1(最后一个)处,则其邻居为列表的倒数第二个和第一个元素。


任务

给定整数数组,您的任务是丢弃自恋的整数。

  • 整数可以为正,负或零。

  • 您可以假定该数组至少包含三个元素。

  • 所有标准规则均适用。这是,因此以字节为单位的最短代码获胜。

例子

考虑数组[6, 9, 4, 10, 16, 18, 13]。然后我们可以建立下表:

元素| 邻居| 邻居的意思 自恋吗?
-------- + ------------ + ------------------ + --------- --------
6 | 13、9 | 11 | 假。
9 | 6、4 | 5 | 真正。
4 | 9、10 | 9.5 | 假。
10 | 4,16 | 10 | 假。
16 | 10、18 | 14 | 真正。
18 | 16、13 | 14.5 | 真正。
13 | 18、6 | 12 | 真正。

通过过滤掉自恋者,我们剩下了[6, 4, 10]。就是这样!

测试用例

输入->输出

[5,-8,-9]-> [-8,-9]
[8、8、8、8]-> [8、8、8、8]
[11,6,9,10]-> [6,10]
[1、2、0、1、2]-> [1、0、1]
[6,9,4,10,16,18,13]-> [6,4,10]
[6,-5,3,-4,38,29,82,-44,12]-> [-5,-4,29,-44]

1- 自恋并不意味着数学自恋

Answers:


7

果冻,10字节

ṙ2+ṙ-<ḤCx@

在线尝试!

说明:

ṙ2+ṙ-<ḤCx@
ṙ2         Rotate the original list two elements to the left
  +        Add each element to the respective element of the original list
   ṙ-      Rotate the result one element to the right
     <Ḥ    Check if each element is less than the double of its respective element on the original list
       C   Subtract each 1/0 boolean from 1 (logical NOT in this case)
        x@ Repeat each element of the original list as many times as the respective element of the logical NOT (i.e. keep elements of the original list where the respective element from the result is 1)


6

JavaScript(ES6),57 56字节

a=>a.filter((e,i)=>e+e<=a[(i||l)-1]+a[++i%l],l=a.length)

编辑:感谢@ g00glen00b,节省了1个字节。


5

Mathematica,44个字节

Pick[#,#<=0&/@(2#-(r=RotateLeft)@#-#~r~-1)]&

怎么运行的

给定输入,例如{11,6,9,10},计算

2*{11,6,9,10} - {6,9,10,11} - {10,11,6,9}

并在结果最多为0的地方选取原始输入的元素。



4

Haskell,51个字节

f s=[b|(a,b,c)<-zip3(last s:s)s$tail$s++s,b*2<=a+c]

在线尝试!用法示例:f [1,2,3]yields [1,2]

对于s = [1,2,3]last s:s是列表[3,1,2,3]tail$s++s列表[2,3,1,2,3]。从三个给定列表中zip3生成一个三元组(a,b,c)列表,将较长的三元组截断为最短列表的长度。我们得到[(3,1,2),(1,2,3),(2,3,1)],有b被原始列表元素ac它的邻国。该列表理解然后选择所有b地方b*2<=a+c,这是b不是自恋。


4

八度 / MATLAB,48字节

@(x)x(conv([x(end),x,x(1)],[1,-2,1],'valid')>=0)

在线尝试!

说明

首先使用相应位置的last(x(end))和first(x(1))条目扩展输入数组。

自恋的测试是通过conv将扩展数组与[1, -2, 1]保留在一起并保留'valid'一部分来完成的。

将卷积结果中的每个条目与进行比较,可以0得出逻辑索引(掩码),该逻辑索引用于从输入中选择数字。


2

J,16字节

#~+:<:1&|.+_1&|.

在线尝试!

说明

#~+:<:1&|.+_1&|.  Input: array A
           _1&|.  Rotate A right by 1
      1&|.        Rotate A left by 1
          +       Add
  +:              Double each in A
    <:            Less than or equal to
#~                Copy the true values from A

2

Japt17 16 15字节

kÈ>½*[Y°ÉY]x!gU

尝试一下


说明

数组的隐式输入U

kÈ>

删除(k)通过函数返回true的元素(Y作为当前索引),以检查当前元素是否大于...

[Y°ÉY]

数组[Y-1, Y+1]...

x!gU

x每个元素索引到U... 之后,通过加法()减少

½*

乘以.5


备用,15个字节

fÈ+X§UgYÉ +UgYÄ

尝试一下


2

R51 56字节

感谢user2390246纠正我的算法

function(l)l[c(l[-1],l[1])+c(l[s<-sum(l|1)],l[-s])>=2*l]

在线尝试!

指数l在那里c(l[-1],l[1])+c(l[s],l[-s]),的邻居资金l,不低于两次l





1

Java的8,141个 137 127字节

import java.util.*;a->{List r=new Stack();for(int i=0,l=a.length;i<l;)if(2*a[i]<=a[(i-1+l)%l]+a[++i%l])r.add(a[i-1]);return r;}

-10个字节,感谢@Nevay

说明:

在这里尝试。

import java.util.*;    // Required import for List and Stack

a->{                   // Method with integer-array parameter and List return-type
  List r=new Stack();  //  Return-list
  for(int i=0,         //  Index integer, starting at 0
      l=a.length;      //  Length of the input array
      i<l;)            //  Loop over the input array
    if(2*a[i]<=        //   If two times the current item is smaller or equal to:
        a[(i-1+l)%l]   //   The previous integer in the list
        +a[++i%l])     //   + the next integer in the list
      r.add(a[i-1]);   //    Add the current integer to the result-list
                       //  End of loop (implicit / single-line body)
  return r;            //  Return result-List
}                      // End of method


0

JavaScript ES5,59个字节

F=a=>a.filter((x,i)=>2*x<=a[-~i%(l=a.length)]+a[(i-1+l)%l])

console.log(""+F([5, -8, -9])==""+[-8, -9])
console.log(""+F([8, 8, 8, 8])==""+[8, 8, 8, 8])
console.log(""+F([11, 6, 9, 10])==""+[6, 10])
console.log(""+F([1, 2, 0, 1, 2])==""+[1, 0, 1])
console.log(""+F([6, 9, 4, 10, 16, 18, 13])==""+[6, 4, 10])
console.log(""+F([6, -5, 3, -4, 38, 29, 82, -44, 12])==""+[-5, -4, 29, -44])




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.