История
Давным-давно Бобби создал биткойн-кошелек с 1 сатоши (1e-8 BTC, самая маленькая единица валюты) и забыл об этом. Как и многие другие, он позже, хотя: «Черт, если бы я вложил больше тогда ...».
Не останавливаясь на мечтах, он посвящает все свое время и деньги на создание машины времени. Он проводит большую часть своего времени в своем гараже, не подозревая о мирских делах и слухах, циркулирующих вокруг него. Он завершает создание прототипа за день до того, как его электричество вот-вот отключится из-за пропущенных платежей. Поднявшись со своего рабочего места, он видит полицейский фургон, подъезжающий к его дому, похоже, что любопытные соседи подумали, что он работает в своей лаборатории, и вызвали полицию.
Не имея времени для проведения тестов, он берет USB-флешку с данными обменного курса за последние годы, подключает конденсатор Flux к квантовому дискомбобулятору и обнаруживает, что его транспортируют обратно в тот день, когда он создал свой кошелек.
Задача
С учетом данных о валютном курсе выяснить, сколько денег может заработать Бобби. Он следует очень простому правилу: «покупай дешево - продавай дорого», и, поскольку он начинает с бесконечно малого капитала, мы предполагаем, что его действия не окажут влияния на обменные курсы в будущем.
Входные данные
Список с плавающей точкой> 0, либо в виде строки, разделенной одним символом (новая строка, табуляция, пробел, точка с запятой, что вы предпочитаете), переданной программе в качестве аргумента командной строки, считанной из текстового файла или STDIN или переданной в качестве параметра к функции. Вы можете использовать числовые типы данных или массивы вместо строки, потому что в основном это просто строка в скобках.
Выходные данные
Коэффициент, на который капитал Bobbys умножается на конец торгов.
пример
Input: 0.48 0.4 0.24 0.39 0.74 1.31 1.71 2.1 2.24 2.07 2.41
Обменный курс: 0,48 $ / BTC, так как он вот-вот упадет, мы продаем все биткойны за 4,8 нанодоллара. Коэффициент = 1 Обменный курс: 0,4, ничего не делать
Обменный курс: 0,24 $ / BTC и повышение: конвертируйте все $ в 2 сатоши. Коэффициент = 1 (стоимость в долларах все еще не изменилась).
Курс обмена: 0,39 - 2,1 долл. США / BTC: ничего не делать
Курс обмена: 2,24 долл. США / BTC: продавать все до падения. 44,8 нанодоллара, коэффициент = 9,33
Обменный курс: 2,07 $ / BTC: купить 2,164 сатоши, коэффициент = 9,33
Обменный курс: 2,41 $ / BTC: купить 52,15 нанодоллара, коэффициент = 10,86
Output: 10.86
Дополнительная информация
Вы можете игнорировать странные граничные случаи, такие как постоянный ввод, нулевые или отрицательные значения, только одно входное число и т. Д. Не
стесняйтесь создавать свои собственные случайные числа для тестирования или использования реальных графиков акций. Вот более длинный ввод для тестирования (ожидаемый вывод прибл. 321903884.638).
Кратко объясните, что делает ваш код.
Графики ценятся, но не нужны
источник
Ответы:
APL, 16 символов
Эта версия использует @Frxstrem «S простой алгоритм и @xnor » сек
max(r,1)
идею.Также предполагается, что ряд в целом растет, то есть первое значение биткойна меньше, чем последнее. Это согласуется с описанием проблемы. Чтобы получить более общую формулу, нужно отбросить первую пару ставок, добавив 2 символа:
{×/1⌈÷/⊃1↓⍵,¨¯1⌽⍵}
Пример:
Объяснение:
Начнем с данных обменного курса:
Соедините каждое число с предыдущим (первое будет связано с последним) и поместите их в матрицу:
Сократите каждую строку делением, оставьте те, у которых отношение> 1, и объедините отношения умножением. Это исключит любые повторяющиеся факторы в ряду последовательных повышающихся ставок, а также ложное соотношение между первым и последним обменными курсами:
источник
Python, 47
Пример запуска на тестовом примере .
Взять список поплавков. Рекурсивно умножает на коэффициент прибыли от первых двух элементов до тех пор, пока не останется меньше двух элементов. Для базового случая дает,
True
который равен1
.Использование
pop
дает одинаковое количество символов.То же самое происходит с конца списка.
Для сравнения, мой итерационный код в Python 2 составляет 49 символов, на 2 символа длиннее
Начнем с того, что
c=-1
мы пытаемся заставить воображаемый первый «ход» никогда не показывать прибыль. Начиная продукт,-1
а не1
позволяет нам назначить оба элемента вместе, и мы отрицательно отменили его обратно перед печатью.источник
([n:(n+1)*500 + 1] for n in range(N_elem/500) )
и умножить частичные коэффициентыsys.setrecursionlimit
(в CPython)Python,
79817677 байтx
является входом, закодированным в виде списка. Функция возвращает коэффициент.источник
1.
вместо1
в конце функции, в противном случае я получаю TypeError: дескриптор ' mul ' требует объекта 'float', но получил 'int'f=
часть.CJam, 33 байта
Это может быть в гольфе дальше.
Принимает участие от STDIN, как
и выводит коэффициент на STDOUT, как
Попробуйте онлайн здесь
источник
Пиф , 18
Объяснение:
max(H[1]/H[0],1)
идея благодаря @xnorисточник
C #,
333, 313Моя первая попытка Может быть, это может оптимизировать больше, но, как я уже сказал, первая попытка, так что поймете это!
вход
Выход
Редактировать: Спасибо DenDenDo за предложение не использовать math.floor для округления и использование int вместо bool для вырезания символов. Будем помнить, что для будущих головоломок!
источник
Math.Floor(...)
которыми не требуется. Кроме того, я не знаю, возможно ли это в C #, но обычно вы можете использовать 1 и 0 дляtrue
иfalse
.