Запуск другого максимуму списку


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

Моя англійська мова не найкраща, як це 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 байт

ηεà\à

Спробуйте в Інтернеті!

Повертає [](довільне значення) для першого.


η¦ε{¨θповинен працювати на 6 байт
Аднан

@Adnan Звичайно> _ <все-таки знайшов кращий спосіб ...
Ерік Вигнавець,

Цікаво ... Z©KZ®‚¹sÃщо я думав, я не знав, що àце навіть річ!
Чарівний восьминіг Урна

Знайшла ще одну 5-байтну альтернативу . Я використовував Áθзамість цього.
Містер Xcoder

5

Лушпиння , 9 7 байт

Збережено байт-два завдяки @Zgarb

mȯ→hOtḣ

Повертається 0за перший "другий максимум"

Пояснення

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

Спробуйте в Інтернеті!


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=[])

Тестові кейси

Примітка. Цей фрагмент використовується JSON.stringify()для читабельності, який - як побічний ефект - перетворюється undefinedна null.


1
Я думаю a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[]), що лише 50.
Ніл

@Neil Nice. :-)
Арнольд

2

Pyth , 8 байт

m@Sd_2._

Спробуйте в Інтернеті! або Спробуйте тестовий набір!


Як?

Це виводить перший елемент списку як перше значення у списку, відповідно до специфікації Ви можете вивести довільне значення для першого елемента .

m@Sd_2._ - Повна програма з неявним введенням.

m ._Q - Позначає карту над префіксами на вході зі змінною d.
  Sd - сортування поточного префікса.
 @ - Отримує елемент ...
    _2 - За індексом - 2 (другий за висотою).
           - Друкувати неявно.

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 Це не працює ...
Erik the Outgolfer

@EriktheOutgolfer О, добре.
Esolanging Fruit


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](перший - довільне значення.




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

@LuisMendo Нічого собі! Іде показати, скільки я знаю про MATL. Дякую за допомогу!
DanTheMan


1

Ом , 10 8 байт

-2 байти завдяки ETHproductions.

∙p»îS2~ª

Спробуйте в Інтернеті!

А, це дивно, але я не знаю, як інакше натиснути на від'ємне число ... Я насправді не знаю Ома. : P


1
Гаразд, 0 2-здається дуже дивним ...
Містер Xcoder

1
Просто дивлячись на документи (я нічого не знаю про Ома), ти міг би зробити 2~?
ETHproductions

@TEHProductions О, набагато краще. Спасибі!
повністюлюдський



0

Швидкий 3 , 67 байт

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

Тестовий сюїт.

Швидкий 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]))

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 байти)


0

Математика 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

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

Можливо, є кращий спосіб генерувати ці префікси.

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