Magazyn czasu
Masz dostęp do zestawu danych, tomorrowStocks
który zawiera ceny akcji z Twojej ulubionej firmy na NASDAQ. Ten zestaw danych to kontener indeksowany minutami po otwarciu. Każdy indeks zawiera cenę akcji w tym czasie.
// 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
Wydajność
Twoim zadaniem jest, aby ustalić najlepszy możliwy wynik 1 purchase
i 1 sale
się 1 stock
z danego zbioru danych.
Gotchas
- Musisz kupić i sprzedać dokładnie 1 akcję.
- Nie możesz kupować i sprzedawać w tym samym przedziale czasowym.
- Musisz kupić przed sprzedażą.
Dane testowe
[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
To jest golf golfowy ; prześlij najkrótszą odpowiedź w swoim ulubionym języku!
[5,4,3,1]
możesz albo5
sprzedać4
lub sprzedać lub kupić4
i sprzedać,3
aby uzyskać optymalny wynik-1
.Odpowiedzi:
05AB1E , 4 bajty
Korzystanie z podejścia FryAmTheEggman . Kod:
Wyjaśnienie:
Wykorzystuje kodowanie CP-1252 . Wypróbuj online! .
źródło
Python 2, 46 bajtów
Przetestuj na Ideone .
Jak to działa
Jest to podejście rekurencyjne, które wykorzystuje pięknie perwersyjne porównania Pythona 2 typu mieszanego.
Najlepszy możliwy wynik to albo różnica maksimum listy z usuniętym pierwszym elementem i tym pierwszym elementem, albo inna różnica, która nie obejmuje pierwszego elementu.
Po wyodrębnieniu pierwszego elementu za pomocą
x.pop(0)
(który trwale usuwa go z x ), obliczamyx.pop(0)-max(x)
. Zauważ, że ta różnica ma „zły” znak.Jeśli zaktualizowana lista x nadal zawiera co najmniej dwa elementy,
x[1:]
zwraca niepustą listę iand
zastępuje ją negatywem wywołania rekurencyjnego, obliczonego jako-f(x)
. Gdy jest już za mało elementów, aby kontynuować, przechodzix[1:]and-f(x)
do pustej listy.Aby wybrać maksymalny wynik, bierzemy minimalną różnicę i minus wywołania rekurencyjnego (lub
[]
). Ponieważ wszystkie liczby całkowite są ściśle mniejsze niż[]
,min
po prostu zwróci lewy argument, jeśli prawy[]
.Wreszcie, jednostkowy minus
-
koryguje znak obliczonego wyniku.źródło
MATL , 7 bajtów
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
źródło
Galaretka , 5 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
źródło
IŒṡS€Ṁ
Prawie tej samej długości, szkoda, że używasz,Ṁ
zanim od czasu do czasu daje złą odpowiedź ...Pyth, 9
Wypróbuj tutaj lub uruchom pakiet testowy .
Znajduje kolejne różnice między poszczególnymi elementami, a następnie wyszukuje każdy podciąg tej tablicy. Na koniec zsumuj elementy i zwróć maksymalny.
Wyjaśnienie:
Wspomniano mi, że ten algorytm działa, nie jest całkowicie intuicyjny. Mam nadzieję, że ten przykład ilustruje, dlaczego ten algorytm działa:
źródło
Pyth, 9
Tak pfns!
źródło
_hS-M.cQ2
jest równoważny.-
kolejność argumentów ... ponieważ muszę używać_hS
i nie mogę używaćeS
PowerShell v2 +, 58 bajtów
Pobiera dane wejściowe
$n
, potokuje każdy element w pętli|%{...}
. Każdą iterację kroimy$n
na podstawie wstępnie zwiększonej++$i
do końca tablicy wejściowej,|sort
która i bierze maksimum[-1]
, a następnie odejmuje bieżący element$_
. Następnie|sort
wszystkie te różnice i ponownie przyjmujemy maksimum[-1]
.Usuwa pełny błąd indeksu tablic, ponieważ próbujemy przeciąć koniec tablicy. Ale ponieważ STDERR jest domyślnie ignorowany , nie obchodzi nas to.
źródło
JavaScript (ES6),
5754 bajtówW JavaScript łatwiej jest wziąć maksimum reszty tablicy i odjąć bieżący element. (W przypadku ostatniego elementu wynikiem będzie nadal -Infinity.) Edycja: Zapisano 3 bajty dzięki @CharlieWynn.
źródło
with
(co nie pomaga w tym przypadku).J, 21 bajtów
Bierze tablicę wartości jako argument i zwraca wynik.
Wyjaśnienie
źródło
Java, 141 bajtów
Lambda akceptuje ArrayList i zwraca liczbę całkowitą.
Nieskluczony kod z przypadkami testowymi:
O ile mi wiadomo, Java nie ma sposobu patrzenia w przyszłość w strumieniu, a manipulowanie metodą, z której generowany jest strumień, daje dziwne wyniki. Tak więc robienie
a.remove(0)
wewnątrz mapy strasznie przerywa strumień.źródło
VBA, 154
Pobiera dane wejściowe w kolumnie A, zaczynając od A1, dane wyjściowe w C1. Musi być uruchamiany z wybraną ostatnią komórką w A. Należy pamiętać, że program Excel automatycznie dodaje spacje między terminami w języku VBA, w przeciwnym razie można by dalej zagrać w golfa.
źródło
Java, 116
Inne rozwiązanie Java, wykorzystałem to, aby udowodnić, że strumienie mogą wyglądać ładnie, ale nie zawsze są przydatne w golfie.
w tym rozwiązaniu jest dużo miejsca na ulepszenia
źródło
Clojure, 99 bajtów
Dzieli listę wejściową na pierwszej pozycji, a następnie na drugiej itd., Więc otrzymujemy listę, która wygląda następująco:
[[[n1][n2 ... nk]][[n1 n2][n3 ... nk]]...[[n1...n(k-1)][nk]]]
następnie dla każdej pary odejmuje minimum pierwszych pierwiastków od maksimum drugiego elementu, a następnie znajduje maksimum od nich. Byłoby to krótsze, gdyby Clojuremin
max
brał sekwencje zamiast jakiejkolwiek liczby argumentów.Zobacz online: https://ideone.com/b2nllT
źródło
rubin, 52 bajty
wyskakuje możliwe ceny sprzedaży i spójrz na wszystkie poprzednie, aby znaleźć zysk. Wtedy dostaje maksymalny zysk.
źródło
C,
10199 bajtówDane wejściowe: tablica zakończona zerem. Np. {1,2,3,4,5,0}
Wyjście: zwraca najlepszy wynik
Możesz zaoszczędzić 8 bajtów (
9391 ogółem), jeśli nigdy nie chcesz stracić pieniędzy:źródło
R,
5844 bajtówbez golfa
EDYCJA: zmieniona funkcja. oryginał poniżej.
lub, jeśli chcesz znieść kilka ostrzeżeń, pozbądź się -2 po długości, na 56 bajtów.
A jeśli masz ochotę nie handlować i tracić pieniędzy, gdy jest to jedyna możliwość, możesz zejść do 52
źródło
f=
nie jest potrzebne.