Wyodrębnij lokalne maksima

19

Biorąc pod uwagę tablicę dodatnich liczb całkowitych, wypisz tablicę wszystkich elementów, które są większe lub równe sąsiednim. Większość elementów będzie miała dwa sąsiednie elementy; pierwszy i ostatni element to przypadki szczególne, ponieważ mają one tylko jeden sąsiadujący element.

Możesz założyć, że tablica zawiera co najmniej dwa elementy.

Przypadki testowe:

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]

To jest , wygrywa najkrótszy kod!

Pavel
źródło
1
@PeterTaylor myślę, co oznaczało to „Na pierwszym lub ostatnim elementem, które należy uwzględnić w produkcji, ...”
XNOR
@PeterTaylor xnor jest poprawny.
Pavel
Powiązane
Peter Taylor
Powiązane również: Znalezienie ekstremów lokalnych
Wrzlprmft
Czy mogę zaproponować [4,3,3,4]jako próbę. Niestety moje rozwiązanie nie poradziło sobie z tym zbyt dobrze.
JAD

Odpowiedzi:

5

Galaretka ,  13 12  11 bajtów

0;;0»3\f"⁸Ẏ

Monadyczny link pobierający listę dodatnich liczb całkowitych i zwracający filtrowaną listę zawierającą tylko te, które są większe lub równe wszystkim ich sąsiadom.

Wypróbuj online!


Poprzednie 12 bajtów :

0;INżI>0ḄNMị

Poprzednie 13 bajtów :

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

W jaki sposób?

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
Jonathan Allan
źródło
Cóż, myślę, że może istnieć sposób na zastosowanie 3-mądrej redukcji, ale jeszcze tego nie wypracowałem.
Jonathan Allan
Miałem rację - 3-mądre zmniejszenie z maksymalną diadą, »- a może około 10 ..?
Jonathan Allan
8

Python , 54 bajty

f=lambda l,*p:l and l[:p<=l[:1]>=l[1:2]]+f(l[1:],l[0])

Wypróbuj online!

I / O ma krotki zamiast list.


Python , 57 bajtów

f=lambda l,p=0:l and l[:[p]<=l[:1]>=l[1:2]]+f(l[1:],l[0])

Wypróbuj online!

Alt 57:

f=lambda l,p=0:l and l[l<[max(p,*l[:2])]:1]+f(l[1:],l[0])
xnor
źródło
7

Mathematica 22 bajtów

Pick[#,MaxDetect@#,1]&
Kelly Lowder
źródło
1
Nawiasem mówiąc, działałoby to również w macierzach o wyższych wymiarach.
Kelly Lowder
6

Haskell, 50 49 42 bajtów

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

Wypróbuj online!

scanr(:)[0]tworzy listę ogonów (0:l), każdy z końcowy 0, np 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]]co jest wzór dopasowany agains i:j:k:_wyodrębnić wszystkie listy z co najmniej 3 elementów, które są nazwane i, ji k. Zachowaj, jjeśli jego> = iij .

Edycja: Ørjan Johansen zapisał 7 bajtów. Dzięki!

nimi
źródło
2
i:j:k:_<-scanr(:)[0]$0:ljest krótszy. (Nieznacznie dostosowując „standardową” tails=scanr(:)[]lewę).
Ørjan Johansen
@ ØrjanJohansen: och, już wcześniej skorzystałem z tej sztuczki, ale jakoś jej nie zauważyłem. Wielkie dzięki!
nimi
4

Dyalog APL, 31 30 28 22 21 bajtów

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

Wypróbuj online!

Objaśnienie (Nie jestem dobry w wyjaśnianiu rzeczy):

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
Zacharý
źródło
3

JavaScript (ES6), 40 bajtów

a=>a.filter((e,i)=>!(e<a[i-1]|e<a[i+1]))
Neil
źródło
3

Python 3 , 84 75 * 71 bajtów

lambda l,k=[0]:[j for x,j in enumerate(l)if(k+l+k)[x+2]<=j>=(k+l+k)[x]]

Wypróbuj online!


* @ LeakyNun zapisał 9 bajtów za pomocą sprytnej sztuczki operatora.

Pan Xcoder
źródło
lambda l,k=[0]:[l[i]for i in range(len(l))if(k+l+k)[i+2]<=l[i]>=(k+l+k)[i]]
Leaky Nun
2

05AB1E , 15  14  13 bajtów

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

Wypróbuj online!

Wyjaśnienie

ü‹             # 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

Poprzednie 15 bajtowe rozwiązanie

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

Wypróbuj online!

Wyjaśnienie

¬                # 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
Emigna
źródło
2

R, 44 bajty

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

która ocenia na funkcję:

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

Porównuje xdo c(0,x), więc z xprzesuniętą o jedną pozycję w prawo. Porównuje również xdo x[-1], więc o jedną pozycję przesunął się w lewo. Oba są, TRUEjeśli jest tam maksimum. &wziąć ORAZ tych booleanów. Z uwagi na zawijający się charakter wektorów R, gdy nie są one tej samej długości, musimy obciąć wynik na długości x, która jest ustalana przez wzięcie sum(x|1). Następnie podłączamy wektor boolowski, biorąc tylko prawdziwe wskaźniki xi zwracamy to.

Uwaga: ponieważ te operacje logiczne są wykonywane przy użyciu wektorów o nierównej długości, R będzie narzekać. Dużo. Ale wśród ostrzeżeń będzie prawidłowy wynik:

> 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
JAD
źródło
2

R , 42 bajty

function(x)x[c(d<-diff(x),0)<=0&c(0,d)>=0]

Wypróbuj online!

2 bajty krótsze niż rozwiązanie JAD . diffoblicza kolejne różnice; wtedy zachowaj tylko wpisy większe niż oba sąsiedzi.

Robin Ryder
źródło
1

R , 68 bajtów

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

Wypróbuj online!

Leaky Nun
źródło
pryr::f(expression)jest krótszym sposobem zadeklarowania funkcji niż function(a)expression.
JAD
Ponadto, sum(a|1)jest to skrót length(a).
JAD
Zobacz moje rozwiązanie dla krótszego podejścia.
JAD
1

q, 39 bajtów

{x where x = -1 _ next 3 mmax x,last x}
skeevey
źródło
Nigdy wcześniej nie słyszałem o tym języku. Czy wiesz, gdzie mogę go wypróbować?
Pavel
Jasne, kx.com , docs: code.kx.com
skeevey
1

Stax , 10 bajtów

úâH◄(☼bM•Å

Uruchom i debuguj

Generuje dane wyjściowe jako wartości oddzielone znakiem nowej linii na wyjściu standardowym.

Rozpakowane, niepolowane i skomentowane, wygląda to tak.

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?

Uruchom ten

Zaktualizowano: Właśnie znalazłem rozwiązanie 9-bajtowe. Zaktualizuje wyjaśnienie później:

Stax , 9 bajtów

▀▓ûa¥╓╧↨⌐

Uruchom i debuguj

rekurencyjny
źródło