La mayoría de las aplicaciones de calculadora de propinas simplemente toman un porcentaje fijo del precio de la comida. Entonces, por ejemplo, si su comida es de $ 23.45, puede dejar una propina del 15% = $ 3.52, o una propina más generosa del 20% = $ 4.69.
Lo suficientemente conveniente para los usuarios de tarjetas de crédito. Pero no es así si prefiere dejar propinas en efectivo, en cuyo caso estas cantidades de centavos extraños se interponen en el camino. Entonces modifiquemos la idea para que sea más conveniente para los usuarios de efectivo.
Su tarea
Escriba, en la menor cantidad de bytes posible, un programa o función que tome como entrada:
- Precio de la comida
- Porcentaje mínimo de propina
- Porcentaje máximo de propina
Y envíe cualquier cantidad de propina dentro del rango [price * min_percentage / 100, price * max_percentage / 100] que minimiza el número de billetes / billetes y monedas requeridos.
Suponga las denominaciones monetarias estadounidenses de 1 ¢, 5 ¢, 10 ¢, 25 ¢, $ 1, $ 5, $ 10, $ 20, $ 50 y $ 100.
Ejemplo
Aquí hay un programa de ejemplo sin golf en 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)))
Algunas entradas y salidas de muestra:
~$ 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)
¿Se pretende anular nuestros valores predeterminados para entradas y salidas? Es decir, ¿se permitiría, por ejemplo, una función que toma tres números y devuelve el resultado?3.51
y3.75
también son salidas válidas para el caso de prueba23.45 15 17
? Usan la misma cantidad de monedas y también están dentro del rango.Respuestas:
Carbón , 60 bytes
Pruébalo en línea! Toma datos como decimales. El enlace es a la versión detallada del código. Explicación:
Ingrese la factura.
Ingrese las fracciones decimales de punta y calcule la punta mínima y máxima.
Comience con punta cero.
La cadena SEXY se expande y
10050.20.10.5.01.0.250.1.05.01
se divide en grupos de tres caracteres y se lanza para flotar.Agregue tantas de la denominación actual como sea necesario para alcanzar la punta mínima.
Elimine una denominación si se ha excedido la propina máxima.
Formatee la punta para su visualización.
fuente
I
lugar de﹪%.2f
.JavaScript (ES6), 93 bytes
Pruébalo en línea!
¿Cómo?
Calculamos recursivamente una suma de valores de billetes / monedas hasta que se encuentre dentro del rango aceptable, siempre intentando primero el valor más alto.
fuente
Python 3.x:
266185bytesUna modificación directa a mi programa de ejemplo en la pregunta. Tenga en cuenta que la salida ya no está formateada para requerir 2 lugares decimales.
Editar: Gracias a Jo King por hacerlo más pequeño.
fuente
Java 10,
186185bytesToma los porcentajes mínimo y máximo como
/100
decimales (es decir,15%
como0.15
).-1 byte para solucionar el problema
3.51
como salida potencial y jugando al golf para corregir los errores de redondeo en 1 byte al mismo tiempo.Pruébalo en línea.
Explicación:
fuente
Limpio ,
207156bytesCambiar a una función ahorró 51 bytes, como era de esperar.
Pruébalo en línea!
fuente
Python (
264222 bytes)Un poco más golfizado.
Pruébalo en línea!
fuente
Perl 6 ,
93 9289 bytesPruébalo en línea!
Bloque de código anónimo que toma tres argumentos (precio, porcentaje mínimo y porcentaje máximo) y devuelve la propina.
fuente
Wolfram Language (Mathematica) , 105 bytes
Esto le dará todas las soluciones con un recuento mínimo de monedas.
Pruébalo en línea!
fuente
Kotlin , 215 bytes
Pruébalo en línea!
fuente
Jalea ,
3332 bytesUn enlace monádico que acepta una lista
[cost in cents, [minimum ratio, maximum ratio]]
que produce una cantidad de propina en centavos.Pruébalo en línea!
¿Cómo?
La primera línea es un enlace auxiliar que produce la cantidad dada menos la nota / moneda de mayor denominación:
El número de llamadas requeridas para llegar a cero se usa para ordenar el rango de cantidades de propinas, y luego se obtiene el extremo izquierdo:
fuente