Фред квазидружественный парень, но на самом деле он подлый.
Из-за этого Фред живет один в маленькой квартире в Лос-Альтос, штат Калифорния. Фред такой подлый, потому что он очень требователен к воде. Поэтому он нуждается в вашей помощи, чтобы выяснить, какой у него счет за воду.
Ваша задача - написать функцию или программу, которая возвращает счет за воду, учитывая количество воды, используемой в качестве входных данных (которое всегда является целым числом).
Потребление воды происходит по уровням. Это означает, что существуют диапазоны цен в зависимости от количества воды.
Это уровни, их цены и количество воды, которое они соответствуют:
Tier I
First 10 Ccf: $3.8476/Ccf
Tier II
Next 17 Ccf: $4.0932/Ccf
Tier III
All subsequent water: $4.9118/Ccf
Для n сотен кубических футов (Ccf) также предусмотрены следующие дополнительные расходы:
CPUC fee: 1.5% of above charges
LIRA quantity surcharge: $0.047*n
PBOP amoritization surcharge: $0.004*n
Сумма сборов уровня I, уровня II, уровня III, CPUC, LIRA и PBOP представляет собой общий счет за воду. Эту сумму вы должны либо вернуть, либо распечатать на консоли с округлением до двух знаков после запятой.
Вот два примера:
Input: 15
... Calculations which you do not need to output but here to help explain:
Tier I: 10*3.8476 = 38.476
Tier II: (15-10)*4.0932 = 20.466
Tier III: 0*4.9118 = 0
Tiers sum: 58.942
CPUC: 1.5% of 58.942 = 0.88413
LIRA: 0.047*15 = 0.705
PBOP: 0.004*15 = 0.06
Total sum: 58.942 + 0.88413 + 0.705 + 0.06 = 60.59113
...
Output: 60.59
Input: 100
... Calculations which you do not need to output but here to help explain:
Tier I: 10*3.8476 = 38.476
Tier II: 17*4.0932 = 69.5844
Tier III: (100-10-17)*4.9118 = 358.5614
Tiers sum: 466.6218
CPUC: 1.5% of = 6.999327
LIRA: 0.047*100 = 4.7
PBOP: 0.004*100 = 0.4
Total sum: 478.721127
...
Output: 478.72
Это код гольф, поэтому выигрывает самый короткий код в байтах!
n
?Ответы:
Pyth,
5541 байтКод содержит непечатаемые символы, поэтому вот
xxd
hexdump.объяснение
."…"
это упакованная строка , которая содержит3.8476,4.0932,4.9118
.v
оценивает это кортежу(3.8476, 4.0932, 4.9118)
. Это цены уровней, умноженные на добавленную цену CPUC.UQ
генерирует диапазон0
...n-1
.c
…,T27
Разбивает этот диапазон на индексы 10 и 27, с дополнительными пустыми списками в конце, если диапазон слишком короткий.lM
находит длину каждой части, давая количество воды для каждого уровня.*V
умножает это на кортеж из шага 2, чтобы получить цены для уровней.s
подводит итоги+
…*Q.051
Добавляет вход, умноженный на 0,051, т.е. LIRA + PBOP..R
...2
округляет результат до 2 десятичных знаков.Попробуйте онлайн.
источник
Mathematica,
837669 байтАнонимная функция, которая создает массив из трех уровней в первом столбце плюс LIRA и PBOP, представленные в виде числа с произвольной точностью в четвертом столбце. Все это умножается на,
1.015
и все элементы массива суммируются и округляются до.01
. Поскольку51/1015*1.015
будет желаемым,0.051
результат будет точно таким же, как указано в OP.Более короткое решение, в 76 байтов , как я предложил в своем комментарии к решению Perl
где
1.015
с самого начала учитываются цены, а затем добавляются LIRA и PBOP поверх первого уровня.73 байта (но я не хочу обновлять мой счетчик байтов, поскольку это довольно близко к простому решению Perl):69 байтов - ах, черт возьми, гольф тоже потребовал некоторых усилий.
РЕДАКТИРОВАТЬ относительно ошибки с плавающей запятой
Первые три итерации моего ответа действительно точны в их десятичном представлении, поскольку все задействованные коэффициенты имеют завершающие десятичные представления. Однако, поскольку коэффициенты являются явными числами с плавающей запятой, хранятся в двоичном формате и имеют не заканчивающиеся двоичные представления, достаточно большие входные данные начнут накапливать ошибки в младших разрядах двоичного представления. Я предполагаю, что когда число с плавающей запятой настолько велико, что оно соответствует только 3-4 цифрам справа от десятичной запятой, мы можем ожидать ошибки около 1 цента. Ниже приведен точный ответ.
72 байта, несколько невосприимчивых к неточностям поплавка
Умножение на ведущий
.01
делается на самом последнем шаге. До этого момента все вычисления выполняются с целыми числами. Это означает, что если.01
опущен, будет точный результат, но выраженный в центах, а не в долларах. Конечно, умножение на число с плавающей точкой превращает все это в число с плавающей точкой, и, как уже упоминалось, оно должно быть достаточно маленьким, чтобы вмещаться в 64 бита, и при этом быть точным.01
.источник
05AB1E,
645851 байтРазъяснения
Попробуйте онлайн
источник
Perl 5, 73 байта
Очевидное решение. 72 байта, плюс 1
-ne
вместо-e
.Сохранено 5 байтов благодаря LLlAMnYP . Спасибо!
источник
.01
, оно было бы точным, пока целое число может быть сохранено.Oracle SQL 11.2, 151 байт
Un-golfed
источник
SELECT
и((DECODE
сохраните один байт. Сохраните больше 10 байтов, используя именованную таблицу! 7, удалив двоеточия и используя имя столбца с одним символом плюс три, используя имя таблицы с одним символом.JavaScript ES6, 77 байт
Un-golfed
Я учел коэффициенты LIRA и PBOP. Дополнительные 1,5% добавляются в конце.
Вероятно, не самое эффективное решение с точки зрения игры в гольф, но несколько отличается от Perl.
Ошибка с плавающей запятой должна возникать с большими числами и может быть исправлена добавлением 1 или 2 дополнительных байтов к каждому коэффициенту.
источник
()
s вокругx>10?:
,?:
партнеры справа налево. Я думаю, вы также можете сохранить несколько байтов, умножив скобки, например,(x-10)*4.154598+39.05314
равноx*4.154598-41.54598+39.05314
равноx*4.154598-2.49284
.R , 52 байта
Попробуйте онлайн!
Создает функцию линейного приближения, основанную на значениях моего предыдущего ответа 0,10,27 и 10 ^ 6. Подвох: верхний предел на входе 10 ^ 6.
approxfun
(сecdf
,stepfun
,splinefun
и т.д.) является одним из многих особенностей симпатичных изR
.источник
VBA, 88 байт
Базовая ставка и более высокие дифференциалы использования были умножены на 5, а множитель платы CPUC разделен на 5 (0,203).
Редактор VB добавит
End Function
строку, поэтому и включен перевод строки терминала.источник
Pyth -
5851 байтТестовый пакет .
источник