Машина времени запаса
Вы получили доступ к набору данных, tomorrowStocks
который содержит цены на акции от вашего любимого бизнеса на NASDAQ. Этот набор данных является контейнером, индексированным по минутам после открытия. Каждый индекс содержит цену акции в то время.
// 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
Выход
Ваша задача состоит в том, чтобы определить наилучший возможный исход 1 purchase
и 1 sale
из 1 stock
из данного набора данных.
Gotchas
- Вы должны купить и продать ровно 1 акцию.
- Вы не можете покупать и продавать в одном и том же временном интервале.
- Вы должны купить, прежде чем продать.
Тестовые данные
[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
Это код-гольф ; отправьте кратчайший ответ на вашем любимом языке!
[5,4,3,1]
вы можете , но для5
и продают за4
или покупать4
и продавать для того3
чтобы получить оптимальный результат-1
.Ответы:
05AB1E , 4 байта
Используя подход FryAmTheEggman . Код:
Объяснение:
Использует кодировку CP-1252 . Попробуйте онлайн! ,
источник
Python 2, 46 байт
Проверьте это на Ideone .
Как это работает
Это рекурсивный подход, который использует преимущества прекрасно извращенных сравнений смешанного типа в Python 2.
Наилучший возможный результат - это либо разница максимума списка с удаленным первым элементом и этим первым элементом, либо другое различие, которое не касается первого элемента.
После извлечения первого элемента с помощью
x.pop(0)
(который окончательно удаляет его из x ), мы вычисляемx.pop(0)-max(x)
. Обратите внимание, что эта разница имеет «неправильный» знак.Если обновленный список x по- прежнему содержит как минимум два элемента,
x[1:]
выдает непустой список иand
заменяет его отрицательным значением рекурсивного вызова, вычисляемым как-f(x)
. Если для продолжения слишком мало элементов,x[1:]and-f(x)
получается пустой список.Чтобы выбрать максимальный результат, мы берем минимум разности и минус рекурсивного вызова (или
[]
). Поскольку все целые числа строго меньше[]
,min
просто вернут свой левый аргумент, если правый[]
.Наконец, унарный минус
-
исправляет знак вычисленного результата.источник
MATL , 7 байт
Попробуйте онлайн! Или проверьте все тестовые случаи .
источник
Желе , 5 байт
Попробуйте онлайн!или проверьте все контрольные примеры .
Как это работает
источник
IŒṡS€Ṁ
Почти такой же длины, это очень плохо делать с использованиемṀ
до суммирования иногда дает неправильный ответ ...Пиф, 9
Попробуйте здесь или запустите Test Suite .
Находит последовательные различия между каждым элементом, а затем находит каждую подстроку этого массива. Наконец, суммируйте элементы и верните максимальный.
Объяснение:
Мне было сказано, что этот алгоритм работает не совсем интуитивно. Надеюсь, этот пример проиллюстрирует, почему этот алгоритм работает:
источник
Пиф, 9
Уу пфнс!
источник
_hS-M.cQ2
это эквивалентно.-
порядок аргументов ... так как я должен использовать_hS
и не могу использоватьeS
PowerShell v2 +, 58 байт
Принимает ввод
$n
, передает каждый элемент в цикл|%{...}
. Каждую итерацию мы нарезаем$n
на основе предварительно увеличенного++$i
до конца входного массива,|sort
который, и берём максимум[-1]
, затем вычитаем текущий элемент$_
. Мы тогда|sort
все эти различия и снова возьмем максимум[-1]
.Отбрасывает многословную ошибку индекса массива, потому что мы пытаемся перерезать конец массива. Но, поскольку STDERR по умолчанию игнорируется , нам все равно.
источник
JavaScript (ES6),
5754 байтаВ JavaScript проще взять максимум остатка массива и вычесть текущий элемент. (В случае последнего элемента результат все равно будет -Infinity.) Редактирование: Сохранено 3 байта благодаря @CharlieWynn.
источник
with
(что не помогает в этом случае).J, 21 байт
Принимает массив значений в качестве аргумента и возвращает результат.
объяснение
источник
Java, 141 байт
Лямбда принимает ArrayList и возвращает целое число.
Разобранный код с тестовыми примерами:
Насколько я знаю, у Java нет способа смотреть вперед в потоке, и манипулирование методом, из которого генерируется поток, дает странные результаты. Таким образом, выполнение
a.remove(0)
внутри карты ужасно нарушает поток.источник
VBA, 154
Принимает входные данные в столбце A, начиная с A1, выходные данные в C1. Должен быть запущен с последней выбранной ячейкой в. Обратите внимание, что Excel автоматически добавляет пробелы между терминами в VBA, в противном случае это может быть добавлено.
источник
Ява, 116
Другое решение Java, я использовал это, чтобы доказать, что потоки могут выглядеть красиво, но не всегда полезно для игры в гольф.
в этом решении много места для улучшений
источник
Clojure, 99 байт
Разбивает входной список на первую позицию, затем на вторую и так далее, поэтому мы получаем список, который выглядит следующим образом:
[[[n1][n2 ... nk]][[n1 n2][n3 ... nk]]...[[n1...n(k-1)][nk]]]
затем для каждой пары вычитает минимум первых элементов из max второго элемента и затем находит max из них. Было бы короче, если бы Clojuremin
max
брал последовательности, а не любое количество аргументов.Смотрите это онлайн: https://ideone.com/b2nllT
источник
рубин, 52 байта
Поищите возможные цены продажи и посмотрите на все предыдущие, чтобы найти прибыль. Тогда получает максимальную прибыль.
источник
C
10199 байтВвод: нулевой завершенный массив. Например, {1,2,3,4,5,0}
Вывод: возвращает лучший результат
Вы можете сэкономить 8 байт (всего
9391), если не хотите терять деньги:источник
R,
5844 байтаungolfed
РЕДАКТИРОВАТЬ: изменил функцию. оригинал ниже.
или, если вы готовы мириться с кучей предупреждающих сообщений, избавьтесь от -2 после длины, для 56 байтов.
И если вы чувствуете, что не торгуете и не теряете деньги, когда это единственная возможность, вы можете снизить до 52
источник
f=
не нужен