Laufendes zweites Maximum einer Liste

20

Bei einer gegebenen Liste von Ganzzahlen besteht Ihre Aufgabe darin, den zweitgrößten Wert in den ersten k Elementen für jedes k zwischen 2 und der Länge der Eingabeliste auszugeben .

Mit anderen Worten, geben Sie den zweitgrößten Wert für jedes Präfix der Eingabe aus.

Sie können einen beliebigen Wert für das erste Element ausgeben (wobei k = 1 ist) oder diesen Wert einfach weglassen, da es für eine Liste mit 1 Element kein zweites Maximum gibt. Sie können davon ausgehen, dass die Eingabe mindestens zwei Elemente enthält.

Kürzester Code gewinnt.

Beispiele

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
quelle
Mein Englisch ist nicht das Beste, wie wird es kbestimmt?
LiefdeWen
@LiefdeWen Eine Liste mit der Antwort für jedes k ausgeben.
Jimmy23013
2
1ist streng genommen nicht der zweitgrößte Wert von 1,1(2. Beispiel), sondern der zweite Wert bei absteigender Sortierung.
Jonathan Allan
Vielleicht bin ich nur dumm (obwohl ich vermute, dass ich das Wochenende wirklich hätte beginnen können), aber ich bin mir immer noch nicht sicher, wie das funktioniert. Könnte mir jemand ELI5 den letzten Testfall geben? Die ersten beiden Testfälle können gelöst werden, indem man einfach die Liste durchläuft, das aktuelle Minimum der Liste ermittelt und dann das Element entfernt (oder einfacher: Liste sortieren und letztes Element entfernen). Es gibt die richtigen Ergebnisse für die ersten beiden Testfälle, ist aber offensichtlich falsch (und wird es auch geben)-1, 0, 0, 1, 1, 2 für den letzten Testfall geben.)
Kevin Cruijssen
1
@ KevinCruijssen Erinnern Sie sich an die zwei größten Zahlen, die Sie gesehen haben. Im letzten Fall beginnen Sie damit, dass 2 die größte ist, und geben nichts / was auch immer aus, da dies an dieser Stelle keinen Sinn ergibt. Dann wechseln Sie bei der nächsten Iteration zu 1 und 2, sodass Sie 1 ausgeben. Dies bleibt gleich, bis Sie die 2 am Ende erreichen, und dann haben Sie 2 und 2 als die größten und zweitgrößten
FryAmTheEggman

Antworten:

6

05AB1E , 5 Bytes

ηεà\à

Probieren Sie es online!

Gibt als []erstes (beliebiger Wert) zurück.

Erik der Outgolfer
quelle
η¦ε{¨θsollte für 6 Bytes funktionieren
Adnan
@Adnan Natürlich hat> _ <trotzdem einen besseren Weg gefunden ...
Erik the Outgolfer
Interessant ... Z©KZ®‚¹sÃwar, was ich dachte, wusste nicht, àwar auch nur eine Sache!
Magic Octopus Urn
Es wurde eine weitere 5-Byte-Alternative gefunden . Ich habe Áθstattdessen verwendet.
Mr. Xcoder
5

Schale , 9 7 Bytes

Dank @Zgarb ein oder zwei Bytes gespeichert

mȯ→hOtḣ

Rückgabe 0für das erste "zweite Maximum"

Erklärung

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

Probieren Sie es online!

H.PWiz
quelle
1
Sie können →hOstattdessen ein Byte zuordnen und speichern.
Zgarb
3

JavaScript (ES6), 58 51 50 Bytes

1 Byte dank @Neil gespeichert

Fügt undefinedfür k = 1 hinzu .

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

Testfälle

Hinweis: Diese Code - Schnipsel Anwendungen JSON.stringify()zur besseren Lesbarkeit, die - als Nebeneffekt - Konvertiten undefinedzu null.

Arnauld
quelle
1
Ich denke, a=>a.map(e=>(b=[e,...b]).sort((a,b)=>b-a)[1],b=[])ist nur 50.
Neil
@ Neil Nice. :-)
Arnauld
2

Pyth , 8 Bytes

m@Sd_2._

Probieren Sie es online! oder Probieren Sie die Test Suite!


Wie?

Dies gibt das erste Element der Liste als ersten Wert in der Liste gemäß der Spezifikation aus. Sie können einen beliebigen Wert für das erste Element ausgeben .

m@Sd_2._ - Volles Programm mit impliziter Eingabe.

m ._Q - Mappe über die Präfixe der Eingabe mit einer Variablen d.
  Sd - Sortiert das aktuelle Präfix.
 @ - Liefert das Element ...
    _2 - Bei Index - 2 (der zweithöchste).
           - Implizit drucken.
Mr. Xcoder
quelle
2

Gelee , 8 Bytes

ḣJṢ€Ṗ€Ṫ€

Probieren Sie es online!

Der erste Wert ist immer 0, und die folgenden Zahlen sind das zweite Maximum jedes Präfixes.

Erläuterung

ḣ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
Meilen
quelle
@ Challenger5 Ich glaube nicht, dass das funktioniert
Meilen
@ Challenger5 Das funktioniert nicht ...
Erik der Outgolfer
@EriktheOutgolfer Oh, ok.
Esolanging Fruit
2

Java (OpenJDK 8) , 87-86 Byte

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

Probieren Sie es online!

Nevay
quelle
+1 für int x,y=x=. Ich wusste nicht, dass separate Deklaration und Zuweisung in derselben Anweisung erfolgen können.
Jakob,
2

Python 2 , 45 Bytes

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

Probieren Sie es online!

Die rechte Seite des Codes ist selbsterklärend. Was setzen wir aber links von der and? Da wir Teile einer Liste rekursiv verketten, muss die linke Seite wahr sein, wenn lzwei oder mehr Elemente vorhanden sind, und ansonsten eine leere Liste. l[1:]erfüllt dieses Kriterium gut.

Sisyphus
quelle
1

Batch, 123 Bytes

@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
quelle
1

05AB1E , 5 Bytes

Fand ein anderes 5-Byte, ganz anders als Eriks Lösung . Der beliebige Wert ist das erste Element der Liste.

ηε{Áθ

Probieren Sie es online!


Erläuterung

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

Nehmen wir ein Beispiel, um es verständlicher zu machen.

  • Zuerst bekommen wir die implizite Eingabe, sagen wir es ist [1, 5, 2, 3, 5, 9, 5, 8] .

  • Dann pushen wir seine Präfixe mit η-[[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]] .

  • Der Code durchsucht nun die Liste und sortiert jedes Präfix mit {-[[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]] .

  • Wir nehmen dann das allerletzte Element und verschieben es an den Anfang: [[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]] .

  • Natürlich bekommt der Code jetzt das letzte Element jeder Unterliste mit θ- [1, 1, 2, 3, 5, 5, 5, 8](das erste ist der beliebige Wert).

Mr. Xcoder
quelle
1

CJam , 16 Bytes

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

Probieren Sie es online!

Gibt das erste Element für first zurück.

-2 dank Challenger5 .

Erik der Outgolfer
quelle
{_,,:)\f{<$-2=}}ist zwei Bytes kürzer.
Esolanging Fruit
1

R , 54 49 Bytes

Dank an Giuseppe -5 Bytes. Ich kannte dieses Feature von nicht seq().

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

Probieren Sie es online!

Djhurio
quelle
1
seq(x<-scan())ist um einige Bytes kürzer.
Giuseppe
1

Japt , 12 10 Bytes

Das Ausgabearray besteht aus dem ersten Element im Eingabearray, gefolgt von der gewünschten Sequenz.

£¯YÄ n< g1

Probier es aus


Erläuterung

Implizite Eingabe eines Arrays U.

£

Karte über U, wo Yist der aktuelle Index.

¯YÄ

In Scheiben schneiden Uvon 0bis Y+1.

n<

Absteigend sortieren.

g1

Holen Sie sich das zweite Element.

Das resultierende Array implizit ausgeben.

Zottelig
quelle
1

MATL , 19 10 Bytes

Danke an Luis Mendo für das Rasieren von 9 Bytes!

"GX@:)SP2)

Probieren Sie es hier aus .

Erläuterung

"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
quelle
@ LuisMendo Wow! Zeigt, wie viel ich über MATL weiß. Danke für die Hilfe!
DanTheMan
1

J, 13 Bytes

_2&{@/:~ ::#\

Probieren Sie es online! Das erste Element ist immer 1.

Erläuterung

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

Der Raum ist wichtig.

cole
quelle
1

Ohm , 10 8 Bytes

-2 Bytes dank ETHproductions.

∙p»îS2~ª

Probieren Sie es online!

Äh, das ist seltsam, aber ich weiß nicht, wie ich sonst eine negative Zahl drücken soll ... Ich weiß nicht wirklich , Ohm. : P

total menschlich
quelle
1
Okay, 0 2-scheint sehr seltsam ...
Mr. Xcoder
1
Sehen Sie sich nur die Dokumente an (ich weiß nichts über Ohm), können Sie das tun 2~?
ETHproductions
@TEHProductions Oh, viel besser. Vielen Dank!
Totalhuman
0

Mathematica, 45 Bytes

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

Probieren Sie es online!

J42161217
quelle
0

Schnelle 3 , 67 Bytes

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

Test Suite.

Schnelle 3 , 65 Bytes

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

Test Suite.


Wie führe ich diese aus?

Die erste Funktion ist eine vollständige Funktion, die die Eingabe als Funktionsparameter verwendet und das Ergebnis ausgibt. Sie können sie genau wie im Testlink gezeigt verwenden. Ich habe mich jedoch dazu entschlossen, Anweisungen hinzuzufügen, da die zweite Art von Funktion sehr selten verwendet wird und die meisten Leute nicht einmal von ihrer Existenz wissen. Verwendung:

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

Die zweite Funktion ist eine anonyme Funktion wie Lambdas. Sie können es genauso verwenden, wie Sie es tun würden. Python deklariert eine Variable fund ruft sie auf:

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

oder in eckige Klammern setzen und direkt aufrufen ( (...)(ArrayGoesHere)):

print(({l in(1..<l.count).map{l[0...$0].sorted()[$0-1]}}as([Int])->[Int])([1, 1, 2, 2, 3, 3, 4]))
Mr. Xcoder
quelle
0

PHP, 53 Bytes

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

Nimmt Eingaben von Befehlszeilenargumenten entgegen. Ausgabe durch Semikola begrenzt, vor- und nachgeführt.
Laufen Sie mit -nroder versuchen Sie es online .

Gibt eine Warnung in PHP 7.1 aus; ersetzen a&mit ""<zu reparieren.
Oder verwenden Sie for(;++$i<$argc;rsort($a),print$a[1]._)$a[]=$argv[$i];(54 Bytes)

Titus
quelle
0

Mathematica 42 Bytes

Unabhängig kam zu einer Antwort, die @Jenny_mathy sehr ähnlich, aber 3 Bytes kürzer ist

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

Es wurde erkannt, dass das 1. laufende Maximum nur 15 Bytes und zwei Funktionsaufrufe benötigt !:

Max~FoldList~#&

Dies kann so kurz gemacht werden, weil Maxes die Attribute hat Flatund OneIdentitydas gilt nicht fürRankedMax die der logische Ersatz wäre. Leider nimmt das Definieren oder Ändern von Attributen für vorhandene Funktionen viel zu viele Bytes in Anspruch, sodass die Reduzierung auf andere Weise erfolgen muss.

Alle n-ten laufenden Maxes können in 48 Bytes gefunden werden:

PadLeft[Sort/@Flatten/@FoldList[{##}&,{},#&@#]]&
Kelly Lowder
quelle
0

k , 13 Bytes

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

Probieren Sie es 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
quelle
0

Oktave, 51 Bytes

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

- Ein beliebiger Wert, der für das erste Element zurückgegeben wird.

Probieren Sie es online!

rahnema1
quelle
0

JavaScript (ES6), 43 51 Bytes

Bearbeiten: 8 Bytes hinzugefügt, da eine numerische Sortierung gewünscht wird. :(

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

Behalten Sie diese hier, da sie kürzer ist, vorausgesetzt, Sie möchten eine lexikografische Reihenfolge:

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

Beide Ausdrücke erzeugen undefined für das erste Element.

Code testen

Aaron Hill
quelle
Beachten Sie, dass ich es vorgezogen hätte, den vorhandenen JS-Beitrag einfach zu kommentieren, wenn es nicht das Reputationssystem gegeben hätte.
Aaron Hill
Willkommen bei PPCG! Ich mag auch die 50-Wiederholungs-Kommentarschwelle nicht, aber ich denke, sie wird benötigt, um Spammer vom Kommentieren abzuhalten. Ich denke jedenfalls, dass dies fehlschlagen wird, wenn die Eingabe eine zweistellige Zahl enthält 10, wie sie .sort()standardmäßig lexikografisch sortiert ist (dh 1,10,100,11,12,13, ..., 2,20,21, ...). Sie müssten einschließen (a,b)=>a-boder ähnliches, damit es nach Nummer sortiert wird.
ETHproductions
Vielen Dank, @ETHproductions. Ich habe die numerische Sortierung aktualisiert, was bedeutet, dass dies nicht mehr ausreicht. Naja.
Aaron Hill
0

Clojure, 56 Bytes

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

Vielleicht gibt es eine bessere Möglichkeit, diese Präfixe zu generieren.

NikoNyrh
quelle