자기애 배열 요소


15

정의

배열의 자기애 적 정수 1 은 자신의 산술 평균보다 엄격하기 때문에 이웃보다 낫다고 생각합니다.

이웃은 다음과 같이 정의됩니다.

  • 정수가 인덱스 0 (첫 번째) 인 경우, 이웃은 목록의 마지막 요소와 두 번째 요소입니다.

  • 정수가 첫 번째도 아니고 마지막도 아닌 경우, 이웃은 바로 인접한 두 요소입니다.

  • 정수가 인덱스 -1 (마지막)이면 이웃은 목록의 두 번째 및 첫 번째 요소입니다.


직무

정수 배열이 주어지면 당신의 임무는 자기애 적 정수를 버리는 것입니다.

  • 정수는 양수, 음수 또는 0 일 수 있습니다.

  • 배열에 3 개 이상의 요소가 있다고 가정 할 수 있습니다.

  • 모든 표준 규칙이 적용됩니다. 이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.

배열을 고려하십시오 [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- 자기애 주의자수학적으로 자기애를 의미하지는 않습니다 .

답변:


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

자바 스크립트 (ES6), 57 56 바이트

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

편집 : @ g00glen00b 덕분에 1 바이트가 절약되었습니다.


5

매스 매 티카, 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

하스켈 , 51 바이트

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

온라인으로 사용해보십시오! 사용 예 : f [1,2,3]수율 [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+cb


4

옥타브 / MATLAB, 48 바이트

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

온라인으로 사용해보십시오!

설명

입력 배열은 먼저 적절한 측면에서 마지막 ( x(end)) 및 첫 번째 ( 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

Japt , 17 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

R , 51 56 바이트

알고리즘을 수정 한 user2390246에게 감사합니다.

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

온라인으로 사용해보십시오!

인덱스 의 이웃-금액이 적은 두 배 이상 없습니다 .lc(l[-1],l[1])+c(l[s],l[-s])ll


2

Mathematica, 40 바이트

Pick[#,+##>=3#2&@@@Partition[#,3,1,-2]]&

나는 당신이 <=대신 필요하다고 생각합니다 <.
Martin Ender

실제로는 필요합니다 >=.
Martin Ender

@MartinEnder 아, 맞아. 나는에있는 Pick비 자기애 번호.
JungHwan Min



1

자바 (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;}

@Nevay 덕분에 -10 바이트 .

설명:

여기에서 시도하십시오.

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

자바 스크립트 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])



0

PowerShell , 75 바이트

for($i=0;$i-lt$a.Length;$i++){if($a[$i]-le(($a[$i-1]+$a[$i+1])/2)){$a[$i]}}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.