Fred es un tipo casi amigable, pero en realidad es malo.
Debido a esto, Fred vive solo en un pequeño apartamento en Los Altos, California. Fred es muy malo porque es muy particular con el agua. Él, por lo tanto, necesita su ayuda para determinar cuál es su factura de agua.
Su trabajo es escribir una función o programa que devuelva su factura de agua dada la cantidad de agua utilizada como entrada (que siempre es un número entero).
El consumo de agua viene en niveles. Esto significa que hay rangos de precios dependiendo de la cantidad de agua.
Estos son los niveles, sus precios y las cantidades de agua a las que corresponden:
Tier I
First 10 Ccf: $3.8476/Ccf
Tier II
Next 17 Ccf: $4.0932/Ccf
Tier III
All subsequent water: $4.9118/Ccf
Para n cientos de pies cúbicos (Ccf), también existen los siguientes cargos adicionales:
CPUC fee: 1.5% of above charges
LIRA quantity surcharge: $0.047*n
PBOP amoritization surcharge: $0.004*n
La suma de las tarifas de Nivel I, Nivel II, Nivel III, CPUC, LIRA y PBOP es la factura total del agua. Esta suma debe devolverla o imprimirla en la consola redondeada a dos decimales.
Aquí hay dos ejemplos:
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
Este es el código de golf, ¡el código más corto en bytes gana!
n
?Respuestas:
Pyth,
5541 bytesEl código contiene caracteres no imprimibles, así que aquí hay un
xxd
hexdump.Explicación
."…"
es una cadena de empaquetado que contiene3.8476,4.0932,4.9118
.v
evalúa eso a la tupla(3.8476, 4.0932, 4.9118)
. Estos son los precios de los niveles multiplicados con CPUC agregado.UQ
genera la gama0
...n-1
.c
...,T27
divide ese rango en los índices 10 y 27, con listas vacías adicionales al final si el rango es demasiado corto.lM
encuentra la longitud de cada parte, dando la cantidad de agua para cada nivel.*V
multiplica eso por la tupla del paso 2 para obtener los precios de los niveles.s
suma los resultados.+
…*Q.051
Agrega la entrada multiplicada por 0.051, es decir, LIRA + PBOP..R
...2
redondea el resultado a 2 decimales.Pruébalo en línea.
fuente
Mathematica
837669 bytesFunción anónima que construye una matriz de los tres niveles en la primera columna más el LIRA y el PBOP representados como un número de precisión arbitraria en la cuarta columna. Todo se multiplica por
1.015
y todos los elementos de la matriz se suman y redondean.01
. Como51/1015*1.015
será el deseado,0.051
la salida es exactamente tan precisa como la especificación en OP.Una solución más corta, en 76 bytes , como he sugerido en mi comentario bajo la solución Perl
donde se
1.015
tiene en cuenta los precios desde el principio y luego se agrega LIRA y PBOP en la parte superior del primer nivel.73 bytes (pero soy reacio a actualizar mi recuento de bytes ya que esto está bastante cerca de la solución directa de Perl):69 bytes - ah, qué diablos, el golf también tomó un poco de esfuerzo.
EDITAR con respecto al error de coma flotante
Las primeras tres iteraciones de mi respuesta son de hecho exactas en su representación decimal, ya que todos los coeficientes involucrados tienen representaciones decimales finales. Sin embargo, dado que los coeficientes son flotantes explícitamente, almacenados en binario y que tienen representaciones binarias sin terminación, las entradas lo suficientemente grandes comenzarán a acumular errores en los dígitos menos significativos de la representación binaria. Supongo que, cuando el flotador es tan grande, que cabe solo 3-4 dígitos a la derecha del punto decimal, podemos esperar errores de alrededor de 1 centavo. Vea a continuación una respuesta exacta .
72 bytes, algo inmune a las imprecisiones de flotación
La multiplicación por el líder
.01
se realiza en el último paso. Hasta ese punto, todos los cálculos se realizan con enteros. Esto significa que si.01
se omite el, habrá un resultado exacto , pero expresado en centavos, en lugar de dólares. Por supuesto, la multiplicación por un flotador convierte todo en un flotador y, como se mencionó, debe ser lo suficientemente pequeño como para caber en 64 bits y aún así ser exacto.01
.fuente
05AB1E,
645851 bytesExplicado
Pruébalo en línea
fuente
Perl 5, 73 bytes
La solución obvia. 72 bytes, más 1 para en
-ne
lugar de-e
.Guardado 5 bytes gracias a LLlAMnYP . ¡Gracias!
fuente
.01
, seguiría siendo precisa siempre que se pueda almacenar el entero.Oracle SQL 11.2, 151 bytes
Sin golf
fuente
SELECT
y((DECODE
para guardar un byte. ¡Ahorre más de 10 bytes usando una tabla con nombre! 7 eliminando los dos puntos y usando un nombre de columna de un carácter más tres utilizando un nombre de tabla de un carácter.JavaScript ES6, 77 bytes
Sin golf
Factoraje en los coeficientes LIRA y PBOP. El 1.5% extra se agrega al final.
Probablemente no sea la solución más eficiente en términos de golf, pero algo diferente de la de Perl.
El error de coma flotante debe ocurrir con números más grandes y puede solucionarse agregando 1 o 2 bytes adicionales a cada coeficiente.
fuente
()
s de todo elx>10?:
,?:
asociados derecha a izquierda. Creo que también puede guardar algunos bytes multiplicando los paréntesis, por ejemplo,(x-10)*4.154598+39.05314
igual ax*4.154598-41.54598+39.05314
igualx*4.154598-2.49284
.R , 52 bytes
Pruébalo en línea!
Genera una función de aproximación lineal, basada en los valores de mi respuesta anterior en 0,10,27 y 10 ^ 6. El problema: el límite superior en la entrada es 10 ^ 6.
approxfun
(conecdf
,stepfun
,splinefun
, etc.) es una de las muchas características interesantes deR
.fuente
VBA, 88 bytes
La tasa base y las tasas diferenciales de uso más altas se han multiplicado por 5, y el multiplicador de tarifas de CPUC dividido por 5 (0,203).
El editor de VB agregará una
End Function
línea, por lo que se incluye el avance de línea de terminal.fuente
Pyth -
5851 bytesTest Suite .
fuente