Ekstrak Maxima Lokal

19

Diberikan array bilangan bulat positif, output array semua elemen yang lebih besar atau sama dengan yang berdekatan. Sebagian besar elemen akan memiliki dua elemen yang berdekatan; elemen pertama dan terakhir adalah kasus khusus, karena mereka hanya memiliki satu elemen yang berdekatan.

Anda dapat mengasumsikan bahwa array mengandung setidaknya dua elemen.

Kasus uji:

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]

Ini , kode terpendek menang!

Pavel
sumber
1
@PeterTaylor Saya pikir apa yang dimaksud adalah "Untuk elemen pertama atau terakhir yang dimasukkan dalam output, ..."
xnor
@PeterTaylor xnor benar.
Pavel
Terkait
Peter Taylor
Juga terkait: Finding Local Extremes
Wrzlprmft
Bisakah saya mengusulkan [4,3,3,4]sebagai testcase. Solusi saya tidak menanganinya dengan sangat baik.
JAD

Jawaban:

5

Jelly ,  13 12  11 byte

0;;0»3\f"⁸Ẏ

Tautan monadik mengambil daftar bilangan bulat positif dan mengembalikan daftar yang difilter yang hanya berisi yang lebih besar atau sama dengan semua tetangga mereka.

Cobalah online!


Sebelumnya 12 byter :

0;INżI>0ḄNMị

Sebelumnya 13 byter :

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

Bagaimana?

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
sumber
Yah saya pikir mungkin ada cara untuk menggunakan pengurangan 3-bijaksana tapi saya belum berhasil.
Jonathan Allan
Saya benar - pengurangan 3-bijaksana dengan angka dua maksimum, »- bagaimana kalau 10 ..?
Jonathan Allan
8

Python , 54 byte

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

Cobalah online!

I / O adalah dengan tupel dan bukan daftar.


Python , 57 byte

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

Cobalah online!

Alt 57:

f=lambda l,p=0:l and l[l<[max(p,*l[:2])]:1]+f(l[1:],l[0])
Tidak
sumber
7

Mathematica 22 Bytes

Pick[#,MaxDetect@#,1]&
Kelly Lowder
sumber
1
Kebetulan, ini juga akan bekerja pada array dimensi yang lebih tinggi.
Kelly Lowder
6

Haskell, 50 49 42 byte

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

Cobalah online!

scanr(:)[0]membuat daftar ekor (0:l), masing-masing dengan akhir 0, misalnya untuk 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]]yang pola cocok agains i:j:k:_untuk mengekstrak semua daftar dengan setidaknya 3 unsur yang diberi nama i, jdan k. Simpan jjika> = idan j.

Sunting: Ørjan Johansen menyimpan 7 byte. Terima kasih!

nimi
sumber
2
i:j:k:_<-scanr(:)[0]$0:llebih pendek. (Sedikit menyesuaikan tails=scanr(:)[]trik "standar" .)
Ørjan Johansen
@ ØrjanJohansen: oh, saya sudah menggunakan trik itu sebelumnya, tetapi entah bagaimana melewatkannya di sini. Terima kasih banyak!
nimi
4

Dyalog APL, 31 30 28 22 21bytes

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

Cobalah online!

Penjelasan (Saya tidak pandai menjelaskan hal-hal):

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ý
sumber
4

Haskell , 40 byte

p%(h:t)=[h|h>=p,[h+1]>t]++h%t
_%e=e
(0%)

Cobalah online!

Tidak
sumber
3

JavaScript (ES6), 40 byte

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

Python 3 , 84 75 * 71 byte

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

Cobalah online!


* @ LeakyNun menyimpan 9 byte menggunakan trik operator yang pintar.

Tuan Xcoder
sumber
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 byte

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

Cobalah online!

Penjelasan

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

Solusi 15 byte sebelumnya

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

Cobalah online!

Penjelasan

¬                # 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
sumber
2

R, 44 byte

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

yang mengevaluasi fungsi:

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

Dibandingkan xdengan c(0,x), jadi dengan xmenggeser satu posisi ke kanan. Juga sebanding xdengan x[-1], jadi satu posisi bergeser ke kiri. Keduanya adalah TRUEjika ada maksimum di sana. &untuk mengambil DAN boolean ini. Karena sifat pembungkus vektor R ketika mereka tidak memiliki panjang yang sama, kita harus memotong hasilnya pada panjang x, yang ditemukan dengan mengambil sum(x|1). Kami kemudian pasang di vektor boolean, hanya mengambil indeks sebenarnya xdan mengembalikannya.

Catatan, karena operasi logis ini dilakukan dengan vektor panjang yang tidak sama, R akan mengeluh. Banyak. Tetapi output yang benar akan ada di tengah-tengah peringatan:

> 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
sumber
2

R , 42 byte

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

Cobalah online!

2 byte lebih pendek dari solusi JAD . diffmenghitung perbedaan berturut-turut; kemudian hanya menyimpan entri yang lebih besar dari kedua tetangga.

Robin Ryder
sumber
1

R , 68 byte

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

Cobalah online!

Biarawati Bocor
sumber
pryr::f(expression)adalah cara yang lebih singkat untuk mendeklarasikan suatu fungsi daripada function(a)expression.
JAD
Juga, sum(a|1)adalah jalan pintas untuk length(a).
JAD
Lihat solusi saya untuk pendekatan yang lebih pendek.
JAD
1

PHP , 67 byte

for(;$g=$argv[+$i];$l=$g)$g<$l|$g<$argv[++$i]?:$r[]=$g;print_r($r);

Cobalah online!

Jörg Hülsermann
sumber
1

Retina , 51 byte

\d+
$*
^

M!`(?<=(^|1+) )(\1\d*)\b(?! 1\2)
^¶

%`1

Cobalah online

mbomb007
sumber
1

q, 39 byte

{x where x = -1 _ next 3 mmax x,last x}
skeevey
sumber
Saya belum pernah mendengar bahasa ini sebelumnya. Apakah Anda tahu di mana saya dapat mencoba atau mengunduhnya?
Pavel
Tentu, kx.com , docs: code.kx.com
skeevey
1

Stax , 10 byte

úâH◄(☼bM•Å

Jalankan dan debug itu

Ini menghasilkan output sebagai nilai yang dipisahkan baris baru pada output standar.

Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.

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?

Jalankan yang ini

Diperbarui: Baru saja menemukan solusi 9-byte. Akan memperbarui penjelasan nanti:

Stax , 9 byte

▀▓ûa¥╓╧↨⌐

Jalankan dan debug itu

rekursif
sumber