로컬 맥시마 추출


19

양의 정수 배열이 주어지면 인접한 요소보다 크거나 같은 모든 요소의 배열을 출력하십시오. 대부분의 요소에는 두 개의 인접한 요소가 있습니다. 첫 번째 요소와 마지막 요소는 인접한 요소가 하나뿐이므로 특별한 경우입니다.

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

테스트 사례 :

Input               | Output
[4,2,6,12,4,5,4,3]  | [4,12,5]
[1,2]               | [2]
[1,2,3,2,1]         | [3]
[3,2,1,2,3]         | [3,3]
[4,4]               | [4,4]
[2,4,4,4,1]         | [4,4,4]
[2,3,3,4]           | [3,4]
[4,3,3,4]           | [4,4]

이것은 , 최단 코드 승리입니다!


1
@PeterTaylor 의미하는 것은 "첫 번째 또는 마지막 요소가 출력에 포함되도록하려면 ..."
xnor

@PeterTaylor xnor이 맞습니다.
Pavel


또한 관련 : 지역 극단 찾기
Wrzlprmft

[4,3,3,4]테스트 케이스로 제안 할 수 있습니까? 내 솔루션은 그것을 슬프게 잘 처리하지 못했습니다.
JAD

답변:


5

젤리 ,  13 12  11 바이트

0;;0»3\f"⁸Ẏ

양의 정수 목록을 가져와 모든 이웃보다 크거나 같은 것들만 포함하는 필터링 된 목록을 반환하는 모나드 링크.

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


이전 12 개월 :

0;INżI>0ḄNMị

이전 13 개월 :

0;;0ṡ3M€ċ€2Tị

어떻게?

0;;0»3\f"⁸Ẏ - Link: list of positive integers, A
0;          - a zero concatenated with A
  ;0        - concatenate a zero
     3\     - 3-wise reduce with:
    »       -   maximum (yields a list of the maximums in each overlapping window of 3)
         ⁸  - chain's left argument, A
        "   - zip with:
       f    -   filter keep (i.e. keep the maximal if it is [in] the [length 1 list 
            -                     of the] respective original element)
          Ẏ - flatten by one level

글쎄, 나는 3 차원 축소를 사용하는 방법이있을 것이라고 생각하지만 그것을 해결하지 못했습니다.
Jonathan Allan

나는 맞다 – 최대 다이아 드로 3-를 줄였다 »– 약 10 ..?
Jonathan Allan



6

하스켈, 50 49 42 바이트

f l=[j|i:j:k:_<-scanr(:)[0]$0:l,k<=j,i<=j]

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

scanr(:)[0]꼬리의 목록하게 (0:l)최종으로, 각각 0에 대한 예 l = [4,3,3,4]: [[0,4,3,3,4,0],[4,3,3,4,0],[3,3,4,0],[3,4,0],[4,0],[0]]패턴 매칭 전년도 인 i:j:k:_명명되는 적어도 3 개 요소의 모든리스트를 추출 i, j등이 k. j> = i및 이면 유지하십시오 j.

편집 : Ørjan Johansen은 7 바이트를 저장했습니다. 감사!


2
i:j:k:_<-scanr(:)[0]$0:l더 짧습니다. ( "표준" tails=scanr(:)[]트릭을 약간 조정합니다 .)
Ørjan Johansen

@ ØrjanJohansen : 오, 나는 그 트릭을 나보다 먼저 사용했지만 어떻게 든 그것을 놓쳤다. 고마워요!
nimi

4

Dyalog APL, 31 30 28 22 21 바이트

{⍵/⍨(⌈/=2⌷⊢)¨3,/∊0⍵0}

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

설명 (나는 설명을 잘 못합니다) :

0⍵0       - [0,input,0]   (it looks like a face!)
∊         - flatten
3,/       - split into overlapping sections of length 3.
(⌈/=2⌷⊢)¨ - Whether the middle element is the maximum (applied to every section)
⍵/⍨       - index


3

자바 스크립트 (ES6), 40 바이트

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



2

05AB1E , 15  14  13 바이트

ü‹0¸«sĆÁü›+_Ï

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

설명

ü‹             # pairwise comparison for less than
  0¸«          # append 0
     s         # swap input to top of stack
      Ć        # enclose, append the head of the list
       Á       # rotate right
        ü›     # pairwise comparison for greater than
          +    # add the two boolean lists
           _   # logical negate
            Ï  # keep only elements of input that are true in the resulting list

이전 15 바이트 솔루션

¬s¤)˜Œ3ùεZQ1è}Ï

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

설명

¬                # get head of input
 s¤              # get tail of input
   )˜            # wrap stack in flattened list
                 # produces the input list with the first and last element duplicated
     Œ3ù         # push sublists of length 3
        ε        # apply transformation on each triple
         ZQ      # ... check each element for equality to the max
          1è     # ... get the middle element
            }    # end transform
             Ï   # keep only elements of input that are true in the resulting list

2

R, 44 바이트

pryr::f(x[(x>=c(0,x)&x>=x[-1])[1:sum(x|1)]])

함수로 평가됩니다.

function (x) 
x[(x >= c(0, x) & x >= x[-1])[1:sum(x | 1)]]

한 위치를 오른쪽 으로 이동 하면과 비교 x됩니다 . 또한 비교 에 이렇게 하나 개의 위치가 좌측으로 시프트. 이 둘은 최대 값이있는 경우입니다. 이 부울의 AND를 가져옵니다. R의 벡터의 포장 특성은 동일한 길이 아닌 경우 때문에, 우리는의 길이에 결과를 절단해야 복용에 의해 발견된다 . 그런 다음 부울 벡터를 연결하고 실제 인덱스 만 가져 와서 반환합니다.c(0,x)xxx[-1]TRUE&xsum(x|1)x

이러한 논리 연산은 길이가 다른 벡터로 수행되므로 R이 불평합니다. 많이. 그러나 경고 중에 올바른 출력이 나타납니다.

> pryr::f(x[(x>=c(0,x)&x>=x[-1])[1:sum(x|1)]])(c(4,2,6,12,4,5,4,3))
[1]  4 12  5
Warning messages:
1: In x >= c(0, x) :
  longer object length is not a multiple of shorter object length
2: In x >= x[-1] :
  longer object length is not a multiple of shorter object length
3: In x >= c(0, x) & x >= x[-1] :
  longer object length is not a multiple of shorter object length



1

R , 68 바이트

function(a)a[a==sapply(1:length(a),function(i)max(c(0,a,0)[i+0:2]))]

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


pryr::f(expression)보다 함수를 선언하는 더 짧은 방법 function(a)expression입니다.
JAD

또한 sum(a|1)바로 가기입니다 length(a).
JAD

더 짧은 접근 방법은 내 솔루션을 참조하십시오.
JAD



1

q, 39 바이트

{x where x = -1 _ next 3 mmax x,last x}

나는이 언어에 대해 들어 본 적이 없다. 내가 시도하거나 다운로드 할 수있는 곳을 알고 있습니까?
파벨

물론 kx.com , 문서 : code.kx.com
skeevey

1

Stax , 10 바이트

úâH◄(☼bM•Å

실행 및 디버깅

표준 출력에서 ​​줄 바꾸기로 구분 된 값으로 출력을 생성합니다.

포장을 풀고 포장을 풀고 주석을 달았습니다.

f       filter each value in input using the rest of the program; implicitly printing kept values
  x0|S  input pre- and post-pended with zero
  3B    split into batches of 3
  i@    get the i-th batch, where i is the iteration index
  |M=   is the current value equal to the max from the batch?

이것을 실행

업데이트 : 9 바이트 솔루션을 찾았습니다. 나중에 설명을 업데이트합니다.

Stax , 9 바이트

▀▓ûa¥╓╧↨⌐

실행 및 디버깅


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