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
xxdhexdump.Explicación
."…"es una cadena de empaquetado que contiene3.8476,4.0932,4.9118.vevalúa eso a la tupla(3.8476, 4.0932, 4.9118). Estos son los precios de los niveles multiplicados con CPUC agregado.UQgenera la gama0...n-1.c...,T27divide ese rango en los índices 10 y 27, con listas vacías adicionales al final si el rango es demasiado corto.lMencuentra la longitud de cada parte, dando la cantidad de agua para cada nivel.*Vmultiplica eso por la tupla del paso 2 para obtener los precios de los niveles.ssuma los resultados.+…*Q.051Agrega la entrada multiplicada por 0.051, es decir, LIRA + PBOP..R...2redondea 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.015y todos los elementos de la matriz se suman y redondean.01. Como51/1015*1.015será el deseado,0.051la 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.015tiene 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
.01se realiza en el último paso. Hasta ese punto, todos los cálculos se realizan con enteros. Esto significa que si.01se 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
-nelugar 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
SELECTy((DECODEpara 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.05314igual ax*4.154598-41.54598+39.05314igualx*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 Functionlínea, por lo que se incluye el avance de línea de terminal.fuente
Pyth -
5851 bytesTest Suite .
fuente