Запуск второго максимума списка

20

Учитывая список целых чисел, ваша задача состоит в том, чтобы вывести второе по величине значение в первых k элементах, для каждого k от 2 до длины входного списка.

Другими словами, выведите второе по величине значение для каждого префикса ввода.

Вы можете вывести произвольное значение для первого элемента (где k = 1) или просто пропустить это значение, так как для списка из 1 элемента не существует второго максимума. Вы можете предположить, что на входе есть как минимум 2 элемента.

Самый короткий код выигрывает.

Примеры

Input:
1 5 2 3 5 9 5 8
Output:
  1 2 3 5 5 5 8
Input:
1 1 2 2 3 3 4
Output:
  1 1 2 2 3 3
Input:
2 1 0 -1 0 1 2
Output:
  1 1 1 1 1 2
jimmy23013
источник
Мой английский не самый лучший, как kопределяется?
LiefdeWen
@LiefdeWen Вывести список, содержащий ответ для каждого k.
jimmy23013
2
1не является, строго говоря, второе по величине значение из 1,1(2 примера) это второе значение , когда отсортированный по убыванию.
Джонатан Аллан
Может быть, я просто глуп (хотя я подозреваю, что у меня действительно могут начаться выходные ...), но я все еще не уверен, как это работает. Может ли кто-нибудь ELI5 последний контрольный пример для меня? Первые два тестовых примера, которые я могу решить, просто зацикливая список, определяя текущий минимум списка, а затем удаляя этот элемент (или проще: сортируйте список и удаляйте последний элемент). Это дает правильные результаты для первых двух тестовых случаев, но, очевидно, неправильно (и даст -1, 0, 0, 1, 1, 2для последнего тестового случая.)
Кевин Круйссен
1
@KevinCruijssen Помните два самых больших числа, которые вы видели. В последнем случае вы начинаете с 2, являющегося самым большим, и ничего не выводите / что бы то ни было, так как на данный момент это не имеет смысла. Затем вы изменяете на 1 и 2 на следующей итерации, так что вы выводите 1. Это остается тем же самым, пока вы не достигнете 2 в конце, а затем у вас есть 2 и 2 как самый большой и второй по величине
FryAmTheEggman

Ответы:

6

05AB1E , 5 байтов

ηεà\à

Попробуйте онлайн!

Возвращает [](произвольное значение) для первого.

Эрик Outgolfer
источник
η¦ε{¨θдолжно работать на 6 байтов
Аднан
@Adnan Конечно> _ <все равно нашел лучший путь ...
Эрик Outgolfer
Интересно ... это Z©KZ®‚¹sÃбыло то, о чем я думал, даже не знал, что это àбыла вещь!
Волшебная Урна Осьминога
Нашел другую 5-байтовую альтернативу . Я использовал Áθвместо этого.
Мистер Xcoder
5

Шелуха , 9 7 байт

Сохранено один или два байта благодаря @Zgarb

mȯ→hOtḣ

Возвращает 0для первого «второго максимума»

Explaination

         -- implicit input, e.g          [1,5,3,6]
      ḣ  -- prefixes                     [[],[1],[1,5],[1,5,3],[1,5,3,6]]
     t   -- remove the first element     [[1],[1,5],[1,5,3],[1,5,3,6]]
mȯ       -- map the composition of 3 functions
    O    --   sort                       [[1],[1,5],[1,3,5],[1,3,5,6]]
   h     --   drop the last element      [[],[1],[1,3],[1,3,5]
  →      --   return the last element    [0,1,3,5]
         -- implicit output

Попробуйте онлайн!

H.PWiz
источник
1
Вы можете сопоставить →hOвместо этого и сохранить байт.
Згарб
3

JavaScript (ES6), 58 51 50 байт

Сохранено 1 байт благодаря @Neil

Добавляется undefinedдля k = 1 .

a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[])

Контрольные примеры

NB. Этот фрагмент JSON.stringify()кода используется для удобства чтения, которое, в качестве побочного эффекта, преобразуется undefinedв null.

Arnauld
источник
1
Я думаю, что a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[])только 50.
Нил
@ Нил Хорошо. :-)
Arnauld
2

Pyth , 8 байт

m@Sd_2._

Попробуйте онлайн! или попробуйте тестовый набор!


Как?

Это выводит первый элемент списка в качестве первого значения в списке, согласно спецификации. Вы можете вывести произвольное значение для первого элемента .

m@Sd_2._ - Полная программа с неявным вводом.

m ._Q - отобразить префиксы ввода с помощью переменной d.
  Sd - сортирует текущий префикс.
 @ - получает элемент ...
    _2 - По индексу - 2 (второй по величине).
           - Печать безоговорочно.
Мистер Xcoder
источник
2

Желе , 8 байт

ḣJṢ€Ṗ€Ṫ€

Попробуйте онлайн!

Первое значение будет всегда 0, а следующие числа будут вторыми максимумами каждого префикса.

объяснение

ḣJṢ€Ṗ€Ṫ€  Input: array A
 J        Enumerate indices, [1, 2, ..., len(A)]
ḣ         Head, get that many values from the start for each, forms the prefixes
  Ṣ€      Sort each
    Ṗ€    Pop each, removes the maximum
      Ṫ€  Tail each
миль
источник
@ Challenger5 Я не верю , что работы
мили
@ Challenger5 Это не работает ...
Эрик Outgolfer
@EriktheOutgolfer О, хорошо.
Esolanging Fruit
2

Java (OpenJDK 8) , 87 86 байт

a->{int x,y=x=1<<-1;for(int c:a){if((c>x?x=c:c)>y){x=y;y=c;}System.out.print(x+" ");}}

Попробуйте онлайн!

Nevay
источник
+1 за int x,y=x= . Я не знал, что отдельное объявление и назначение могут быть сделаны в том же заявлении.
Якоб
2

Python 2 , 45 байт

f=lambda l:l[1:]and f(l[:-1])+[sorted(l)[-2]]

Попробуйте онлайн!

Правая часть кода не требует пояснений. Тем не менее, что мы ставим слева от and? Поскольку мы рекурсивно объединяем части списка, нам нужно, чтобы левая сторона была правдивой, если в ней lесть 2 или более элементов, и пустой список в противном случае. l[1:]удовлетворяет этому критерию приятно.

Сизиф
источник
1

Пакетный, 123 байта

@set/af=s=%1
@for %%n in (%*)do @call:c %%n
@exit/b
:c
@if %1 gtr %s% set s=%1
@if %1 gtr %f% set/as=f,f=%1
@echo %s%
Нил
источник
1

05AB1E , 5 байтов

Нашел еще 5-байтовый, сильно отличающийся от решения Эрика . Произвольное значение является первым элементом списка.

ηε{Áθ

Попробуйте онлайн!


объяснение

ηε{Áθ  - Full program that reads implicitly from STDIN and outputs to STDOUT.

η      - Push the Prefixes of the list.
 ε     - Apply to each element (each prefix):
  {      - Sort the prefix list.
   Á     - Shift the list to the right by 1, such that the first element goes to the 
           beginning  and the second largest one becomes the last.
    θ    - Get the last element (i.e. the second largest)
         - Print implicitly.

Давайте рассмотрим пример, чтобы было легче понять.

  • Сначала мы получаем неявный ввод, скажем так [1, 5, 2, 3, 5, 9, 5, 8].

  • Затем мы нажимаем его префиксы, используя η- [[1], [1, 5], [1, 5, 2], [1, 5, 2, 3], [1, 5, 2, 3, 5], [1, 5, 2, 3, 5, 9], [1, 5, 2, 3, 5, 9, 5], [1, 5, 2, 3, 5, 9, 5, 8]].

  • Теперь код отображается в списке и сортирует каждый префикс, используя {- [[1], [1, 5], [1, 2, 5], [1, 2, 3, 5], [1, 2, 3, 5, 5], [1, 2, 3, 5, 5, 9], [1, 2, 3, 5, 5, 5, 9], [1, 2, 3, 5, 5, 5, 8, 9]].

  • Затем мы берем самый последний элемент и переместить его в начале: [[1], [5, 1], [5, 1, 2], [5, 1, 2, 3], [5, 1, 2, 3, 5], [9, 1, 2, 3, 5, 5], [9, 1, 2, 3, 5, 5, 5], [9, 1, 2, 3, 5, 5, 5, 8]].

  • Конечно, теперь код получает последний элемент каждого подсписка, используя θ- [1, 1, 2, 3, 5, 5, 5, 8](первым является произвольное значение.

Мистер Xcoder
источник
1

Japt , 12 10 байт

Выходной массив состоит из первого элемента во входном массиве, за которым следует желаемая последовательность.

£¯YÄ n< g1

Проверь это


объяснение

Неявный ввод массива U.

£

Карта U, где Yтекущий индекс.

¯YÄ

Кусочек Uот 0до Y+1.

n<

Сортировать по убыванию.

g1

Получи второй элемент.

Неявно выведите полученный массив.

мохнатый
источник
1

MATL , 19 10 байт

Спасибо Луису Мендо за то, что он сбрил 9 байтов!

"GX@:)SP2)

Попробуй это здесь .

объяснение

"GX@:)SP2)
"                  for all the values in the input
 G                 get input
  X@:)             get values up to the iteration
      SP           sort it in descending order
        2)         get the second value
                   implicit end of loop and output
DanTheMan
источник
@ LuisMendo Ух ты! Идет, чтобы показать, как много я знаю о MATL. Спасибо за помощь!
DanTheMan
1

Ом , 10 8 байт

-2 байта благодаря ETHproductions.

∙p»îS2~ª

Попробуйте онлайн!

Ну, это странно , но я не знаю , как еще подтолкнуть отрицательное число ... Я не очень знаю Ом. :П

totallyhuman
источник
1
Хорошо, 0 2-кажется очень странным ...
Мистер Xcoder
1
Просто глядя на документы (я ничего не знаю о Оме), не могли бы вы сделать 2~?
ETHproductions
@ TEHProductions О, намного лучше. Благодарность!
полностью человек
0

Swift 3 , 67 байт

func g(l:[Int]){print((1..<l.count).map{l[0...$0].sorted()[$0-1]})}

Тестирование.

Swift 3 , 65 байт

{l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int]

Тестирование.


Как запустить это?

Первая - это полная функция, которая принимает входные данные в качестве параметра функции и печатает результат. Вы можете использовать их точно так, как показано в ссылке для тестирования. Я решил добавить инструкции, потому что второй тип функции используется очень редко, и большинство людей даже не знают о его существовании. Использование:

g(l: [1, 1, 2, 2, 3, 3, 4] )

Вторая - анонимная функция, такая как лямбда-выражения. Вы можете использовать его точно так же, как Python, объявив переменную fи вызвав ее:

var f = {l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int]

print(f([1, 1, 2, 2, 3, 3, 4]))

или заключите его в скобки и вызовите его напрямую ( (...)(ArrayGoesHere)):

print(({l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int])([1, 1, 2, 2, 3, 3, 4]))
Мистер Xcoder
источник
0

PHP, 53 байта

for(;a&$n=$argv[++$i];rsort($a),print$a[1]._)$a[]=$n;

принимает входные данные из аргументов командной строки. Выходные данные разграничены, опережают и тянутся через точку с запятой.
Запустите -nrили попробуйте онлайн .

Выдает предупреждение в PHP 7.1; заменить a&с , ""<чтобы исправить.
Или используйте for(;++$i<$argc;rsort($a),print$a[1]._)$a[]=$argv[$i];(54 байта)

Titus
источник
0

Mathematica 42 байта

Независимо получил ответ, очень похожий на @Jenny_mathy, но на 3 байта короче

Sort[#[[;;i]]][[-2]]~Table~{i,2,Length@#}&

Понял, что первый рабочий максимум занимает всего 15 байтов и два вызова функций !:

Max~FoldList~#&

Это может быть сделано так сжато , потому что Maxесть атрибуты Flatи , OneIdentityно это не верно дляRankedMax которой было бы логичная замена. К сожалению, определение атрибутов или их изменение в существующих функциях занимает слишком много байтов, поэтому выравнивание должно выполняться другими способами.

Все n-ые рабочие максимумы могут быть найдены в 48 байтах:

PadLeft[Sort/@Flatten/@FoldList[{##}&,{},#&@#]]&
Келли Лоудер
источник
0

Pyth, 15 байт

FNr2hlQ@_S<QN1

Попробуйте это здесь: https://pyth.herokuapp.com/?code=FNr2hlQ%40_S%3CQN1&input=%5B1%2C+5%2C+2%2C+3%2C+5%2C+9%2C+5% 2C + 8% 5D & отладки = 0

объяснение

FNr2hlQ - Для цикла со счетчиком 2 <= N <= длина списка

@_S<QN1 - 2-й элемент, когда первые N элементов списка отсортированы в порядке возрастания, а затем перевернуты (отсортированы в порядке убывания)

Каран Елангован
источник
0

к , 13 байт

{x(>x)1}'1_,\

Попробуйте онлайн!

           ,\ /sublists of increasing lengths (scan concat)
         1_   /remove the first sublist
{      }'     /for each sublist:
  (>x)        /    indices to permute sublist into largest to smallest
      1       /    get second index
 x            /    get sublist[that index]
zgrep
источник
0

Октава, 51 байт

@(a){[~,I]=cummax(a);a(I(2:end))=-inf;cummax(a)}{3}

- Произвольное значение, возвращаемое для первого элемента.

Попробуйте онлайн!

rahnema1
источник
0

JavaScript (ES6), 43 51 байт

Редактировать: Добавлено 8 байт, поскольку требуется числовая сортировка. :(

a=>a.map((_,b)=>a.slice(0,b+1).sort((a,b)=>b-a)[1])

Хранение этого здесь, тем не менее, так как оно короче, если требуется лексикографический порядок:

a=>a.map((_,b)=>a.slice(0,b+1).sort()[b-1])

Оба выражения производят undefinedдля первого элемента.

Тестовый код

Аарон Хилл
источник
Обратите внимание, что я бы предпочел просто прокомментировать существующий пост JS, если бы не система репутации.
Аарон Хилл
Добро пожаловать в PPCG! Мне также не нравится порог комментариев в 50 повторений, но я думаю, что он нужен им, чтобы спамеры не комментировали. В любом случае, я думаю, что это не удастся, если вход содержит двузначное число, такое как 10, .sort()по умолчанию, лексикографически (т.е. 1,10,100,11,12,13, ..., 2,20,21, ...). Вам нужно будет включить (a,b)=>a-bили подобное, чтобы заставить его сортировать по номеру.
ETHproductions
Спасибо, @ETHproductions. Я обновил числовой порядок, а это значит, что он уже недостаточно хорош. Ну что ж.
Аарон Хилл
0

Clojure, 56 байт

#(for[i(drop 2(reductions conj[]%))](nth(sort-by - i)1))

Может быть, есть лучший способ генерировать эти префиксы.

NikoNyrh
источник