Витяг місцевих максимумів


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 є правильним.
Павло



Чи можу я запропонувати [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-мудре скорочення, але я цього не розробив.
Джонатан Аллан

Я мав рацію - 3-кратне зменшення з максимальним діадом, »- як приблизно 10 хоча ..?
Джонатан Аллан



6

Haskell, 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]]що шаблон відповідає Agains 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: о, я раніше використовував цей трюк, але тут якось пропустив його. Дуже дякую!
німі

4

Діялог 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





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з c(0,x)таким, так що xзсунуте одне положення праворуч. Також порівнюється xз x[-1], тому одна позиція зміщена вліво. Це обидва, TRUEякщо там максимум. &взяти І з цих булів. Через природу обгортки векторів R, коли вони не однакової довжини, ми повинні усікати результат на довжину x, яка виявляється шляхом взяттяsum(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

Стакс , 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-байтове рішення. Буде оновлено пояснення пізніше:

Стакс , 9 байт

▀▓ûa¥╓╧↨⌐

Запустіть і налагоджуйте його


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.