Uruchamianie drugiego maksimum listy

20

Biorąc pod uwagę listę liczb całkowitych, Twoim zadaniem jest wyprowadzenie drugiej największej wartości w pierwszych k elementach, dla każdego k między 2 a długością listy wejściowej.

Innymi słowy, wypisz drugą co do wielkości wartość dla każdego prefiksu wejścia.

Możesz podać dowolną wartość dla pierwszego elementu (gdzie k = 1) lub po prostu pominąć tę wartość, ponieważ nie ma drugiego maksimum dla listy 1 elementu. Możesz założyć, że na wejściu są co najmniej 2 elementy.

Najkrótszy kod wygrywa.

Przykłady

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
źródło
Mój angielski nie jest najlepszy, jak to się kokreśla?
LiefdeWen,
@LiefdeWen Wypisuje listę zawierającą odpowiedź dla każdego k.
jimmy23013,
2
1nie jest, ściśle rzecz biorąc, drugą największą wartość z 1,1(2nd przykład) to druga wartość, gdy sortowane malejąco.
Jonathan Allan,
Może jestem po prostu głupi (choć podejrzewam, że naprawdę mógłbym zacząć weekend…), ale wciąż nie jestem pewien, jak to działa. Czy ktoś ELI5 mógłby dla mnie ostatnim testem? Dwa pierwsze przypadki testowe, które mogę rozwiązać, po prostu zapętlając listę, określając bieżące minimum listy, a następnie usuwając ten element (lub łatwiej: sortuj listę i usuwaj ostatni element). Daje prawidłowe wyniki dla pierwszych dwóch przypadków testowych, ale jest oczywiście błędne (i da -1, 0, 0, 1, 1, 2dla ostatniego przypadku testowego.)
Kevin Cruijssen
1
@KevinCruijssen Pamiętaj o dwóch największych liczbach, jakie widziałeś. W ostatnim przypadku zaczynasz od 2, które są największe, i nie generujesz nic / cokolwiek, ponieważ w tym momencie nie ma to sensu. Następnie zmieniasz na 1 i 2 przy następnej iteracji, więc generujesz 1. To pozostaje takie samo, dopóki nie osiągniesz 2 na końcu, a następnie masz 2 i 2 jako największe i drugie co do wielkości
FryAmTheEggman

Odpowiedzi:

6

05AB1E , 5 bajtów

ηεà\à

Wypróbuj online!

Zwraca [](dowolna wartość) dla pierwszego.

Erik the Outgolfer
źródło
η¦ε{¨θpowinien działać przez 6 bajtów
Adnan
@Adnan Oczywiście> _ <i tak znalazł lepszy sposób ...
Erik the Outgolfer
Interesujące ... Z©KZ®‚¹sÃbyło to, co myślałem, nie wiedziałem, że àto nawet coś!
Magic Octopus Urn
Znaleziono kolejną 5-bajtową alternatywę . Użyłem Áθzamiast tego.
Pan Xcoder,
5

Łuska , 9 7 bajtów

Zaoszczędź bajt lub dwa dzięki @Zgarb

mȯ→hOtḣ

Zwraca 0za pierwsze „drugie maksimum”

Wyjaśnienie

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

Wypróbuj online!

H.PWiz
źródło
1
Zamiast →hOtego możesz zmapować i zapisać bajt.
Zgarb,
3

JavaScript (ES6), 58 51 50 bajtów

Zapisano 1 bajt dzięki @Neil

Dołącza undefineddla k = 1 .

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

Przypadki testowe

Uwaga: ten fragment JSON.stringify()kodu jest używany do odczytu, który - jako efekt uboczny - przekształca undefinedsię w null.

Arnauld
źródło
1
Myślę, że a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[])jest tylko 50.
Neil
@Neil Nice. :-)
Arnauld
2

Pyth , 8 bajtów

m@Sd_2._

Wypróbuj online! lub Wypróbuj pakiet testowy!


W jaki sposób?

Spowoduje to wyświetlenie pierwszego elementu listy jako pierwszej wartości na liście, zgodnie ze specyfikacją Możesz wygenerować dowolną wartość dla pierwszego elementu .

m@Sd_2._ - Pełny program z niejawnym wejściem.

m ._Q - Odwzoruj prefiksy danych wejściowych zmienną d.
  Sd - Sortuje bieżący prefiks.
 @ - Pobiera element ...
    _2 - Przy indeksie - 2 (drugi najwyższy).
           - Drukuj niejawnie.
Pan Xcoder
źródło
2

Galaretka , 8 bajtów

ḣJṢ€Ṗ€Ṫ€

Wypróbuj online!

Pierwszą wartością będzie zawsze 0, a kolejne liczby będą drugimi maksimami każdego prefiksu.

Wyjaśnienie

ḣ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
mile
źródło
@ Challenger5 Nie wierzę, że to działa
mile
@ Challenger5 To nie działa ...
Erik the Outgolfer
@EriktheOutgolfer Oh, ok.
Esolanging Fruit
2

Java (OpenJDK 8) , 87 86 bajtów

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+" ");}}

Wypróbuj online!

Nieważne
źródło
+1 dla int x,y=x=. Nie wiedziałem, że w tym samym oświadczeniu można by wykonać oddzielną deklarację i przypisanie.
Jakob,
2

Python 2 , 45 bajtów

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

Wypróbuj online!

Prawa strona kodu jest oczywista. Co jednak umieszczamy po lewej stronie and? Ponieważ rekurencyjnie łączymy części listy, potrzebujemy, aby lewa strona była prawdziwa, jeśli lma 2 lub więcej elementów, a pustą listę w przeciwnym razie. l[1:]ładnie spełnia to kryterium.

Syzyf
źródło
1

Partia, 123 bajty

@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%
Neil
źródło
1

05AB1E , 5 bajtów

Znalazłem kolejny 5-bajtowy, bardzo różny od rozwiązania Erika . Dowolna wartość jest pierwszym elementem listy.

ηε{Áθ

Wypróbuj online!


Wyjaśnienie

ηε{Áθ  - 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.

Weźmy przykład, aby ułatwić zrozumienie.

  • Najpierw otrzymujemy niejawny wkład, powiedzmy, że jest [1, 5, 2, 3, 5, 9, 5, 8].

  • Następnie wypychamy jego prefiksy za pomocą η- [[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]].

  • Teraz kod mapuje listę i sortuje każdy prefiks za pomocą {- [[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]].

  • Następnie podjąć bardzo ostatni element i przenieść go na początku: [[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]].

  • Oczywiście, teraz kod pobiera ostatni element każdej podlisty za pomocą θ- [1, 1, 2, 3, 5, 5, 5, 8](pierwszy jest wartością arbitralną.

Pan Xcoder
źródło
1

CJam , 16 bajtów

{_,,:)\f{<$-2=}}

Wypróbuj online!

Zwraca pierwszy element dla pierwszego.

-2 dzięki Challenger5 .

Erik the Outgolfer
źródło
{_,,:)\f{<$-2=}}jest dwa bajty krótszy.
Esolanging Fruit
1

R , 54 49 bajtów

Dzięki Giuseppe -5 bajtów. Nie znałem tej funkcji seq().

for(i in seq(x<-scan()))cat(sort(x[1:i],T)[2],"")

Wypróbuj online!

djhurio
źródło
1
seq(x<-scan())jest krótszy o kilka bajtów.
Giuseppe,
1

Japt , 12 10 bajtów

Tablica wyjściowa składa się z pierwszego elementu w tablicy wejściowej, po której następuje pożądana sekwencja.

£¯YÄ n< g1

Sprawdź to


Wyjaśnienie

Domniemane wejście tablicy U.

£

Mapuj U, gdzie Yjest bieżący indeks.

¯YÄ

Plasterek Uod 0do Y+1.

n<

Sortuj malejąco.

g1

Zdobądź drugi element.

Niejawnie wypisuje wynikową tablicę.

Kudłaty
źródło
1

MATL , 19 10 bajtów

Podziękowania dla Luisa Mendo za zgolenie 9 bajtów!

"GX@:)SP2)

Spróbuj tutaj .

Wyjaśnienie

"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
źródło
@LuisMendo Wow! Pokazuje, ile wiem o MATL. Dzięki za pomoc!
DanTheMan,
1

J, 13 bajtów

_2&{@/:~ ::#\

Wypróbuj online!Pierwszym elementem jest zawsze 1.

Wyjaśnienie

_2&{@/:~ ::#\
            \  Apply to prefixes
_2&{@/:~        Sort and take second-to-last atom
     /:~         Sort upwards
_2 {             Take second-to-last atom
         ::     If there's an error (i.e only one atom)
           #     Return the length of the list (1)

Przestrzeń ma znaczenie.

kapusta
źródło
1

Ohm , 10 8 bajtów

-2 bajty dzięki produktom ETH.

∙p»îS2~ª

Wypróbuj online!

Uh, to dziwne, ale nie wiem jak inaczej naciskać liczbę ujemną ... Nie bardzo wiem oma. : P

całkowicie ludzki
źródło
1
Ok, 0 2-wydaje się bardzo dziwny ...
Pan Xcoder,
1
Po prostu patrząc na dokumenty (nic nie wiem o Ohm), możesz to zrobić 2~?
ETHproductions
@TEHProductions Och, znacznie lepiej. Dzięki!
całkowicie ludzki,
0

Mathematica, 45 bajtów

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

Wypróbuj online!

J42161217
źródło
0

Swift 3 , 67 bajtów

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

Pakiet testowy.

Swift 3 , 65 bajtów

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

Pakiet testowy.


Jak je uruchomić?

Pierwszy to kompletna funkcja, która przyjmuje dane wejściowe jako parametr funkcji i wypisuje wynik. Możesz ich używać dokładnie tak, jak pokazano w linku testowym. Zdecydowałem się jednak dodać instrukcje, ponieważ drugi typ funkcji jest używany bardzo rzadko i większość ludzi nawet nie wie o jego istnieniu. Stosowanie:

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

Drugi to funkcja anonimowa, jak lambdas. Możesz używać go dokładnie tak, jak robisz Python, deklarując zmienną fi wywołując ją:

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

lub zawiń go w nawiasach i wywołaj bezpośrednio ( (...)(ArrayGoesHere)):

print(({l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int])([1, 1, 2, 2, 3, 3, 4]))
Pan Xcoder
źródło
0

PHP, 53 bajty

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

pobiera dane wejściowe z argumentów wiersza poleceń. Dane wyjściowe są ograniczone, wiodące i ciągnione przez średnik.
Uruchom -nrlub wypróbuj online .

Daje ostrzeżenie w PHP 7.1; zastąpić a&z ""<do naprawienia.
Lub użyj for(;++$i<$argc;rsort($a),print$a[1]._)$a[]=$argv[$i];(54 bajtów)

Tytus
źródło
0

Mathematica 42 bajtów

Niezależnie dotarł do odpowiedzi bardzo podobnej do @Jenny_mathy, ale o 3 bajty krótszy

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

Uświadomiłem sobie, że pierwsze uruchomione maksimum zajmuje tylko 15 bajtów i dwa wywołania funkcji !:

Max~FoldList~#&

Można to zrobić tak zwięźle, ponieważ Maxma atrybuty Flati OneIdentityale nie jest to prawdą dla RankedMaxktórego byłby logiczny zamiennik. Niestety definiowanie atrybutów lub modyfikowanie ich w istniejących funkcjach zajmuje zbyt wiele bajtów, więc spłaszczanie należy wykonać w inny sposób.

Wszystkie n-te działające maksima można znaleźć w 48 bajtach:

PadLeft[Sort/@Flatten/@FoldList[{##}&,{},#&@#]]&
Kelly Lowder
źródło
0

k , 13 bajtów

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

Wypróbuj online!

           ,\ /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
źródło
0

Oktawa, 51 bajtów

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

- Zwrócono dowolną wartość dla pierwszego elementu.

Wypróbuj online!

rahnema1
źródło
0

JavaScript (ES6), 43 51 bajtów

Edycja: Dodano 8 bajtów, ponieważ pożądane jest sortowanie numeryczne. :(

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

Trzymam to tutaj, ponieważ jest krótsze, pod warunkiem, że chce się uporządkować leksykograficznie:

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

Oba wyrażenia tworzą undefinedpierwszy element.

Kod testowy

Aaron Hill
źródło
Zauważ, że wolałbym po prostu komentować istniejący post JS, gdyby nie system reputacji.
Aaron Hill,
Witamy w PPCG! Nie podoba mi się również próg 50 powtórzeń, ale chyba potrzebują go, aby spamerzy nie mogli komentować. W każdym razie, myślę, że to się nie powiedzie, jeśli wejściowy zawiera podwójny cyfrowy numer, takich jak 10, jako .sort()rodzaju leksykograficznie Domyślnie (tj 1,10,100,11,12,13, ..., 2,20,21, ...). Musisz podać (a,b)=>a-blub podobny, aby posortować według numeru.
ETHprodukcje
Dzięki, @ETHproductions. Zaktualizowałem porządek numeryczny, co oznacza, że ​​to już nie wystarczy. No cóż.
Aaron Hill,
0

Clojure, 56 bajtów

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

Być może istnieje lepszy sposób na wygenerowanie tych prefiksów.

NikoNyrh
źródło