Lokale Maxima extrahieren


19

Geben Sie bei einem Array positiver Ganzzahlen ein Array aller Elemente aus, die größer oder gleich den benachbarten sind. Die meisten Elemente haben zwei benachbarte Elemente. Das erste und das letzte Element sind Sonderfälle, da sie nur ein benachbartes Element haben.

Sie können davon ausgehen, dass das Array mindestens zwei Elemente enthält.

Testfälle:

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]

Das ist , der kürzeste Code gewinnt!


1
@ Peter Taylor Ich denke, was gemeint ist "Für das erste oder letzte Element in der Ausgabe enthalten sein, ..."
XNOR

@ PeterTaylor xnor ist richtig.
Pavel


Also related: Auf der Suche nach lokalen Extremen
Wrzlprmft

Kann ich [4,3,3,4]als Testfall vorschlagen . Meine Lösung hat das leider nicht so gut gelöst.
JAD

Antworten:


5

Jelly ,  13 12  11 Bytes

0;;0»3\f"⁸Ẏ

Ein monadischer Link, der eine Liste positiver Ganzzahlen erstellt und die gefilterte Liste zurückgibt, die nur diejenigen enthält, die größer oder gleich allen Nachbarn sind.

Probieren Sie es online!


Vorherige 12 Byter :

0;INżI>0ḄNMị

Vorherige 13 Byter :

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

Wie?

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

Nun, ich denke, es gibt eine Möglichkeit, die dreifache Reduzierung zu verwenden, aber ich habe es nicht herausgefunden.
Jonathan Allan

Ich hatte recht - eine 3-fache Reduzierung mit der maximalen Dyade, »- aber wie wäre es mit 10 ..?
Jonathan Allan



6

Haskell, 50 49 42 Bytes

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

Probieren Sie es online!

scanr(:)[0]stellt eine Liste von den Schwänzen (0:l), die jeweils mit einem letzten 0, beispielsweise für 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]]die agains Muster abgestimmt ist , i:j:k:_alle Listen zu extrahieren , mit mindestens 3 Elementen , die genannt werden i, jund k. Behalten Sie, jwenn sein> = iund j.

Edit: Ørjan Johansen hat 7 Bytes gespeichert. Vielen Dank!


2
i:j:k:_<-scanr(:)[0]$0:list kürzer. (Den "Standard" tails=scanr(:)[]-Trick leicht anpassen .)
Ørjan Johansen

@ ØrjanJohansen: oh, ich habe diesen Trick vor mir benutzt, aber irgendwie habe ich ihn hier verpasst. Vielen Dank!
nimi

4

Dyalog APL, 31 30 28 22 21 Byte

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

Probieren Sie es online!

Erklärung (Ich kann Dinge nicht gut erklären):

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

JavaScript (ES6), 40 Byte

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



2

05AB1E , 15  14  13 Bytes

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

Probieren Sie es online!

Erläuterung

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

Vorherige 15-Byte-Lösung

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

Probieren Sie es online!

Erläuterung

¬                # 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 Bytes

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

was zur Funktion auswertet:

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

Verglichen xmit c(0,x), also mit xeiner Position nach rechts verschoben. Auch im Vergleich xzu x[-1], also eine Position nach links verschoben. Dies sind beide, TRUEwenn es dort ein Maximum gibt. &das UND dieser Booleschen zu nehmen. Wegen der Umhüllungsnatur der Vektoren von R, wenn sie nicht die gleiche Länge haben, müssen wir das Ergebnis um die Länge von kürzen x, die durch take ermittelt wird sum(x|1). Dann fügen wir den Booleschen Vektor ein, nehmen nur die wahren Indizes von xund geben diese zurück.

Da diese logischen Operationen mit Vektoren ungleicher Länge durchgeführt werden, wird sich R beschweren. Viel. Die korrekte Ausgabe wird jedoch inmitten der Warnungen angezeigt:

> 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 Bytes

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

Probieren Sie es online!


pryr::f(expression)ist eine kürzere Möglichkeit, eine Funktion zu deklarieren als function(a)expression.
JAD

Auch sum(a|1)ist eine Abkürzung für length(a).
JAD

Sehen Sie meine Lösung für einen kürzeren Ansatz.
JAD




1

Stax , 10 Bytes

úâH◄(☼bM•Å

Führen Sie es aus und debuggen Sie es

Die Ausgabe erfolgt als durch Zeilenumbrüche getrennte Werte in der Standardausgabe.

Ausgepackt, ungolfed und kommentiert sieht es so aus.

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?

Führen Sie dieses aus

Aktualisiert: Ich habe gerade eine 9-Byte-Lösung gefunden. Wird die Erklärung später aktualisieren:

Stax , 9 Bytes

▀▓ûa¥╓╧↨⌐

Führen Sie es aus und debuggen Sie es


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.