Stock Zeitmaschine
Sie haben Zugriff auf einen Datensatz, tomorrowStocks
der die Aktienkurse Ihres Lieblingsgeschäfts an der NASDAQ enthält. Dieser Datensatz ist ein Container, der nach Minuten nach dem Öffnen indiziert wird. Jeder Index enthält den Preis der Aktie zu diesem Zeitpunkt.
// Assume the stock market opens at 9:30AM EDT
// tomorrowStocks[] contains the prices of your target stock.
// If the stock is $22 @ 10:30AM EDT
tomorrowStocks[60] == 22
Ausgabe
Ihre Aufgabe ist es, das bestmögliche Ergebnis zu bestimmen , 1 purchase
und 1 sale
der 1 stock
aus dem gegebenen Datensatz.
Fallstricke
- Sie müssen genau 1 Aktie kaufen und verkaufen.
- Sie können möglicherweise nicht im selben Zeitfenster kaufen und verkaufen.
- Sie müssen kaufen, bevor Sie verkaufen.
Testdaten
[1,2,3,4,5] # 4
[1,99,2,105] # 104
[99,1,99,100] # 99
[99,1,1,2,1,3] # 2
[5,4,3,3,1] # 0
[5,4,3,1] # -1
[5,2,1] # -1
[5,4,1] # -1
[55,45,20,1] # -10
[5,1] # -4
[10,7,5,1] # -2
[7] # Invalid input -- assume size >= 2
Dies ist ein Code-Golf ; Senden Sie die kürzeste Antwort in Ihrer Lieblingssprache!
[5,4,3,1]
Sie entweder dafür5
und dafür verkaufen4
oder dafür kaufen4
und verkaufen3
, um das optimale Ergebnis zu erzielen-1
.Antworten:
05AB1E , 4 Bytes
Verwendung des FryAmTheEggman-Ansatzes . Code:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online! .
quelle
Python 2, 46 Bytes
Teste es auf Ideone .
Wie es funktioniert
Hierbei handelt es sich um einen rekursiven Ansatz, bei dem die wunderbar perversen gemischten Vergleiche von Python 2 ausgenutzt werden.
Das bestmögliche Ergebnis ist entweder die Differenz des Maximums der Liste, bei der das erste Element entfernt wurde, und des ersten Elements, oder eine andere Differenz, bei der das erste Element nicht betroffen ist.
Nach dem Extrahieren des ersten Elements mit
x.pop(0)
(das es endgültig aus x entfernt ) berechnen wirx.pop(0)-max(x)
. Beachten Sie, dass dieser Unterschied das "falsche" Vorzeichen hat.Wenn die aktualisierte Liste x noch mindestens zwei Elemente enthält, wird
x[1:]
eine nicht leere Liste erstellt undand
durch das Negativ eines rekursiven Aufrufs ersetzt, der wie folgt berechnet wird-f(x)
. Wenn zu wenige Elemente vorhanden sind, um fortzufahren, wirdx[1:]and-f(x)
eine leere Liste ausgewertet.Um das maximale Ergebnis auszuwählen, nehmen wir das Minimum der Differenz und das Negativ des rekursiven Aufrufs (oder
[]
). Da alle ganzen Zahlen streng kleiner als sind[]
,min
wird einfach das linke Argument zurückgegeben, wenn das rechte ist[]
.Schließlich
-
korrigiert das unäre Minus das Vorzeichen des berechneten Ergebnisses.quelle
MATL , 7 Bytes
Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
quelle
Gelee , 5 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
IŒṡS€Ṁ
Fast die gleiche Länge, es ist schade,Ṁ
vor der Summierung zu tun gibt gelegentlich die falsche Antwort ...Pyth, 9
Probieren Sie es hier aus oder führen Sie eine Test Suite aus .
Findet die aufeinanderfolgenden Unterschiede zwischen den einzelnen Elementen und findet dann jede Teilzeichenfolge dieses Arrays. Zum Schluss summieren Sie die Elemente und geben das Maximum zurück.
Erläuterung:
Mir wurde gesagt, dass dieser Algorithmus nicht ganz intuitiv funktioniert. Hoffentlich zeigt dieses Beispiel, warum dieser Algorithmus funktioniert:
quelle
Pyth, 9
Yay pfns!
quelle
_hS-M.cQ2
ist gleichwertig.-
Argumentationsreihenfolge umkehren könnte ... da ich verwenden muss_hS
und nicht verwenden kanneS
PowerShell v2 +, 58 Byte
Übernimmt die Eingabe
$n
und leitet jedes Element in eine Schleife|%{...}
. Bei jeder Iteration schneiden wir$n
basierend auf dem++$i
bis zum Ende des Eingabearrays vorinkrementierten Wert,|sort
nehmen das Maximum[-1]
und subtrahieren dann das aktuelle Element$_
. Wir nehmen dann|sort
alle diese Unterschiede und wieder das Maximum[-1]
.Wirft einen ausführlichen Array-Index-Fehler aus, da versucht wird, das Ende des Arrays zu überschreiten. Da STDERR jedoch standardmäßig ignoriert wird , ist es uns egal.
quelle
JavaScript (ES6),
5754 BytesIn JavaScript ist es einfacher, das Maximum des restlichen Arrays zu nehmen und das aktuelle Element zu subtrahieren. (Beim letzten Element ist das Ergebnis weiterhin -Infinity.) Bearbeiten: 3 Byte dank @CharlieWynn gespeichert.
quelle
with
(was in diesem Fall nicht hilft).J, 21 Bytes
Nimmt ein Array von Werten als Argument und gibt das Ergebnis zurück.
Erläuterung
quelle
Java, 141 Bytes
Das Lambda akzeptiert eine ArrayList und gibt eine Ganzzahl zurück.
Ungolfed Code mit Testfällen:
Soweit ich weiß, hat Java keine Möglichkeit, in einem Stream nach vorne zu schauen, und die Methode, mit der der Stream generiert wird, zu manipulieren, führt zu merkwürdigen Ergebnissen. Wenn Sie also
a.remove(0)
in einer Karte arbeiten, wird der Stream fürchterlich unterbrochen.quelle
VBA, 154
Übernimmt die Eingabe in Spalte A ab A1, gibt in C1 aus. Muss mit der zuletzt ausgewählten Zelle in A ausgeführt werden. Beachten Sie, dass Excel die Leerzeichen zwischen den Begriffen in VBA automatisch hinzufügt, andernfalls könnte dies weiter verbessert werden.
quelle
Java, 116
Eine andere Java-Lösung, ich habe diese verwendet, um zu beweisen, dass Streams zwar gut aussehen, aber nicht immer zum Golfen nützlich sind.
Diese Lösung bietet viel Raum für Verbesserungen
quelle
Clojure, 99 Bytes
Teilt die Eingabeliste an erster Stelle, dann an zweiter Stelle und so weiter, sodass wir eine Liste erhalten, die so aussieht:
[[[n1][n2 ... nk]][[n1 n2][n3 ... nk]]...[[n1...n(k-1)][nk]]]
dann subtrahiert man für jedes Paar das Minimum der ersten Elemente von dem Maximum des zweiten Elements und findet dann das Maximum von ihnen. Wäre kürzer, wenn Clojuresmin
max
Sequenzen anstelle einer beliebigen Anzahl von Argumenten verwenden würden.Sehen Sie es online: https://ideone.com/b2nllT
quelle
Rubin, 52 Bytes
Knallt mögliche Verkaufspreise und schaut euch alle vorherigen an, um Gewinn zu erzielen. Dann bekommt man maximalen Gewinn.
quelle
C
10199 BytesEingabe: nullterminiertes Array. ZB {1,2,3,4,5,0}
Ausgabe: Gibt das beste Ergebnis zurück
Sie können 8 Bytes einsparen (
9391 insgesamt), wenn Sie niemals Geld verlieren möchten:quelle
R,
5844 Bytesungolfed
EDIT: Funktion geändert. Original unten.
oder, wenn Sie bereit sind, eine Reihe von Warnmeldungen zu ertragen, entfernen Sie die Angabe -2 after length für 56 Byte.
Und wenn Sie das Gefühl haben, nicht zu handeln und Geld zu verlieren, wenn dies die einzige Möglichkeit ist, können Sie bis zu 52 Punkte erreichen
quelle
f=
wird nicht benötigt.