Большинство приложений калькулятор чаевых просто взять фиксированный процент от цены еды. Так, например, если ваша еда стоит 23,45 долларов, вы можете оставить чаевые в размере 15% = 3,52 доллара или более щедрые чаевые в размере 20% = 4,69 доллара.
Достаточно удобно для пользователей кредитных карт. Но не так, если вы предпочитаете оставлять денежные чаевые, и в этом случае эти чудовищные суммы будут мешать. Итак, давайте изменим идею, чтобы она была более удобной для пользователей наличными.
Ваше назначение
Напишите, как можно меньше байт, программу или функцию, которая принимает в качестве входных данных:
- Стоимость еды
- Минимальный процент чаевых
- Максимальный процент чаевых
И выведите любую сумму чаевых в диапазоне [цена * min_percentage / 100, цена * max_percentage / 100], которая минимизирует количество требуемых купюр / банкнот и монет.
Предположим, что денежные номиналы в США составляют 1, 5, 10, 25, 1, 5, 10, 20, 50 и 100 долларов.
пример
Вот пример не-игры в гольф на Python:
import math
import sys
# Do the math in cents so we can use integer arithmetic
DENOMINATIONS = [10000, 5000, 2000, 1000, 500, 100, 25, 10, 5, 1]
def count_bills_and_coins(amount_cents):
# Use the Greedy method, which works on this set of denominations.
result = 0
for denomination in DENOMINATIONS:
num_coins, amount_cents = divmod(amount_cents, denomination)
result += num_coins
return result
def optimize_tip(meal_price, min_tip_percent, max_tip_percent):
min_tip_cents = int(math.ceil(meal_price * min_tip_percent))
max_tip_cents = int(math.floor(meal_price * max_tip_percent))
best_tip_cents = None
best_coins = float('inf')
for tip_cents in range(min_tip_cents, max_tip_cents + 1):
num_coins = count_bills_and_coins(tip_cents)
if num_coins < best_coins:
best_tip_cents = tip_cents
best_coins = num_coins
return best_tip_cents / 100.0
# Get inputs from command-line
meal_price = float(sys.argv[1])
min_tip_percent = float(sys.argv[2])
max_tip_percent = float(sys.argv[3])
print('{:.2f}'.format(optimize_tip(meal_price, min_tip_percent, max_tip_percent)))
Некоторые примеры ввода и вывода:
~$ python tipcalc.py 23.45 15 20
4.00
~$ python tipcalc.py 23.45 15 17
3.55
~$ python tipcalc.py 59.99 15 25
10.00
~$ python tipcalc.py 8.00 13 20
1.05
a program that takes as input (stdin, command-line arguments, or GUI input box, whichever is most convenient in your language)
Это предназначено, чтобы переопределить наши значения по умолчанию для входов и выходов? То есть, например, будет ли разрешена функция, которая принимает три числа и возвращает результат?3.51
и3.75
также действительные выходы для теста23.45 15 17
? Они используют одинаковое количество монет и также находятся внутри диапазона.Ответы:
Древесный уголь , 60 байт
Попробуйте онлайн!Принимает ввод в виде десятичных дробей. Ссылка на подробную версию кода. Объяснение:
Введите счет.
Введите десятичные дроби наконечника и вычислите минимальный и максимальный наконечник.
Начните с нулевого наконечника.
Строка SEXy раскрывается, в
10050.20.10.5.01.0.250.1.05.01
которой разбивается на группы из трех символов и приводится к плавающей точке .Добавьте столько номиналов, сколько необходимо для достижения минимального чаевого.
Удалите один номинал, если максимальный наконечник был превышен.
Отформатируйте подсказку для отображения.
источник
I
вместо﹪%.2f
.JavaScript (ES6), 93 байта
Попробуйте онлайн!
Как?
Мы рекурсивно вычисляем сумму значений купюры / монеты до тех пор, пока она не попадет в допустимый диапазон, всегда сначала пробуя самое высокое значение.
источник
Python 3.x:
266185 байтПростая модификация моего примера программы в вопросе. Обратите внимание, что вывод больше не отформатирован и требует 2 десятичных знака.
Редактировать: Спасибо Джо Кинг за уменьшение.
источник
Java 10,
186185 байтПринимает минимальный и максимальный проценты в виде
/100
десятичных дробей (то есть15%
как0.15
).-1 байт, чтобы исправить проблему с
3.51
потенциальным выходным сигналом, а также способ исправить ошибки округления на 1 байт одновременно.Попробуйте онлайн.
Объяснение:
источник
Чисто ,
207156 байтЗамена на функцию сэкономила 51 байт, что неудивительно.
Попробуйте онлайн!
источник
Питон (
264222 байта)Чуть больше в гольф.
Попробуйте онлайн!
источник
Perl 6 ,
93 9289 байтПопробуйте онлайн!
Блок анонимного кода, который принимает три аргумента (цена, минимальный процент и максимальный процент) и возвращает подсказку.
источник
Wolfram Language (Mathematica) , 105 байт
Это даст все решения с минимальным количеством монет.
Попробуйте онлайн!
источник
Котлин , 215 байт
Попробуйте онлайн!
источник
Желе ,
3332 байтаМонадическая ссылка, принимающая список,
[cost in cents, [minimum ratio, maximum ratio]]
который дает сумму чаевых в центах.Попробуйте онлайн!
Как?
Первая строка - это вспомогательная ссылка, которая выдает сумму, указанную за вычетом купюры / монеты самого большого номинала:
Количество вызовов, необходимое для достижения нуля, используется для сортировки диапазона сумм чаевых, а затем получается крайний левый:
источник