Trích xuất Maxima cục bộ


19

Cho một mảng các số nguyên dương, xuất ra một mảng gồm tất cả các phần tử lớn hơn hoặc bằng các phần tử lân cận. Hầu hết các yếu tố sẽ có hai yếu tố liền kề; phần tử đầu tiên và cuối cùng là trường hợp đặc biệt, vì chúng chỉ có một phần tử liền kề.

Bạn có thể giả sử rằng mảng chứa ít nhất hai phần tử.

Các trường hợp thử nghiệm:

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]

Đây là , mã thắng ngắn nhất!


1
@PeterTaylor Tôi nghĩ ý nghĩa của nó là "Để phần tử đầu tiên hoặc cuối cùng được đưa vào đầu ra, ..."
xnor

@PeterTaylor xnor là chính xác.
Pavel



Tôi có thể đề xuất [4,3,3,4]như một testcase. Giải pháp của tôi đã không xử lý điều đó rất đáng buồn.
JAD

Câu trả lời:


5

Thạch ,  13 12  11 byte

0;;0»3\f"⁸Ẏ

Một liên kết đơn âm lấy danh sách các số nguyên dương và trả về danh sách đã lọc chỉ chứa những số lớn hơn hoặc bằng tất cả các lân cận của chúng.

Hãy thử trực tuyến!


12 giờ trước :

0;INżI>0ḄNMị

Trước 13 byter :

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

Làm sao?

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

Vâng, tôi nghĩ rằng có thể có một cách để sử dụng giảm 3-khôn nhưng tôi đã không làm việc đó.
Jonathan Allan

Tôi đã đúng - giảm 3 khôn ngoan với mức tối đa, »- còn khoảng 10 thì sao ..?
Jonathan Allan


7

Toán học 22 byte

Pick[#,MaxDetect@#,1]&

1
Ngẫu nhiên, điều này cũng sẽ làm việc trên các mảng kích thước cao hơn.
Kelly Lowder

6

Haskell, 50 49 42 byte

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

Hãy thử trực tuyến!

scanr(:)[0]tạo ra một danh sách các đuôi của (0:l), mỗi một thức 0, ví dụ như cho 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]]đó là mô hình phù hợp agains i:j:k:_để trích xuất tất cả danh sách với ít nhất 3 yếu tố đó được đặt tên i, jk. Giữ jnếu nó> = ij.

Chỉnh sửa: Ørjan Johansen đã lưu 7 byte. Cảm ơn!


2
i:j:k:_<-scanr(:)[0]$0:lngắn hơn (Hơi điều chỉnh tails=scanr(:)[]thủ thuật "tiêu chuẩn" .)
Ørjan Johansen

@ RjanJohansen: oh, tôi đã sử dụng mánh khóe đó trước đây, nhưng bằng cách nào đó đã bỏ lỡ nó ở đây. Cảm ơn rất nhiều!
nimi

4

Thuốc nhuộm APL, 31 30 28 22 21byte

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

Hãy thử trực tuyến!

Giải thích (Tôi không giỏi giải thích mọi thứ):

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 byte

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

Hãy thử trực tuyến!

Giải trình

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

Giải pháp 15 byte trước đó

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

Hãy thử trực tuyến!

Giải trình

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

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

đánh giá chức năng:

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

So sánh xvới c(0,x), vì vậy với xmột vị trí thay đổi bên phải. Cũng so sánh xvới x[-1], vì vậy một vị trí chuyển sang trái. Cả hai đều là TRUEnếu có tối đa ở đó. &để lấy AND của các booleans này. Do tính chất bao bọc của các vectơ R khi chúng không cùng độ dài, chúng ta phải cắt bớt kết quả ở độ dài x, được tìm thấy bằng cách lấy sum(x|1). Sau đó chúng tôi cắm vào vectơ boolean, chỉ lấy các chỉ số thực sự xvà trả về đó.

Lưu ý, vì các thao tác logic này được thực hiện với các vectơ có độ dài không bằng nhau, R sẽ khiếu nại. Rất nhiều. Nhưng đầu ra chính xác sẽ ở đó giữa các cảnh báo:

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

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

Hãy thử trực tuyến!


pryr::f(expression)là một cách ngắn hơn để khai báo một hàm hơn function(a)expression.
JAD

Ngoài ra, sum(a|1)là một phím tắt cho length(a).
JAD

Xem giải pháp của tôi cho một cách tiếp cận ngắn hơn.
JAD



1

q, 39 byte

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

Tôi chưa bao giờ nghe về ngôn ngữ này trước đây. Bạn có biết bất cứ nơi nào tôi có thể thử hoặc tải nó?
Pavel

Chắc chắn, kx.com , docs: code.kx.com
ngày

1

Stax , 10 byte

úâH◄(☼bM•Å

Chạy và gỡ lỗi nó

Nó tạo ra đầu ra dưới dạng các giá trị phân tách dòng mới trên đầu ra tiêu chuẩn.

Giải nén, không được chỉnh sửa và nhận xét, nó trông như thế này.

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?

Chạy cái này

Cập nhật: Chỉ cần tìm một giải pháp 9 byte. Sẽ cập nhật giải thích sau:

Stax , 9 byte

▀▓ûa¥╓╧↨⌐

Chạy và gỡ lỗi nó


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.