Fred é um cara quase amigável, mas na realidade ele é mau.
Por isso, Fred mora sozinho em um pequeno apartamento em Los Altos, CA. Fred é tão cruel, porque ele é muito especial sobre a água. Ele, portanto, precisa de sua ajuda para descobrir qual é a conta de água.
Seu trabalho é escrever uma função ou programa que retorne sua conta de água, dada a quantidade de água usada como entrada (que é sempre um número inteiro).
O consumo de água é dividido em camadas. Isso significa que existem faixas de preços, dependendo da quantidade de água.
Estes são os níveis, seus preços e as quantidades de água a que correspondem:
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 centenas de pés cúbicos (Ccf), também existem as seguintes taxas adicionais:
CPUC fee: 1.5% of above charges
LIRA quantity surcharge: $0.047*n
PBOP amoritization surcharge: $0.004*n
A soma das taxas de Nível I, Nível II, Nível III, CPUC, LIRA e PBOP é a conta total da água. Nesta soma, você deve retornar ou imprimir no console arredondado para duas casas decimais.
Aqui estão dois exemplos:
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 é o código de golfe, então o código mais curto em bytes ganha!
n
?Respostas:
Pitão,
5541 bytesO código contém caracteres não imprimíveis, então aqui está um
xxd
hexdump.Explicação
."…"
é uma sequência compactada que contém3.8476,4.0932,4.9118
.v
avalia isso para a tupla(3.8476, 4.0932, 4.9118)
. Estes são os preços dos níveis multiplicados pelo CPUC adicionado.UQ
gera a gama0
...n-1
.c
…,T27
Divide esse intervalo nos índices 10 e 27, com listas vazias extras no final, se o intervalo for muito curto.lM
encontra o comprimento de cada parte, fornecendo a quantidade de água para cada camada.*V
multiplica isso pela tupla da etapa 2 para obter os preços das camadas.s
soma os resultados.+
…*Q.051
Adiciona a entrada multiplicada por 0,051, ou seja, LIRA + PBOP..R
…2
Arredonda o resultado para 2 casas decimais.Experimente online.
fonte
Mathematica,
837669 bytesFunção anônima que constrói uma matriz das três camadas na primeira coluna mais o LIRA e o PBOP representados como um número de precisão arbitrária na quarta coluna. A coisa toda é multiplicada
1.015
e todos os elementos da matriz são somados e arredondados para.01
. Como51/1015*1.015
será o desejado,0.051
a saída é exatamente tão precisa quanto a especificação em OP.Uma solução mais curta, em 76 bytes , como sugeri no meu comentário na solução Perl
onde
1.015
é levado em consideração os preços desde o início e, em seguida, o LIRA e o PBOP são adicionados no topo da primeira camada.73 bytes (mas estou relutante em atualizar minha contagem de bytes, pois isso é bastante próximo da solução Perl direta):69 bytes - ah, que diabos, o golfe também levou algum esforço.
EDIT referente ao erro de ponto flutuante
As três primeiras iterações da minha resposta são de fato exatas em sua representação decimal, uma vez que todos os coeficientes envolvidos têm representações decimais finais. No entanto, como os coeficientes são explicitamente flutuantes, armazenados em binários e com representações binárias sem terminação, entradas grandes o suficiente começarão a acumular erros nos dígitos menos significativos da representação binária. Eu acho que, quando o flutuador é tão grande, que cabe apenas 3-4 dígitos à direita do ponto decimal, podemos esperar erros de cerca de 1 centavo. Veja abaixo uma resposta exata .
72 bytes, um pouco imune a imprecisões de flutuação
A multiplicação pelo líder
.01
é feita no último passo. Até esse ponto, todo o cálculo é feito com números inteiros. Isso significa que, se o.01
omitido, haverá um resultado exato , mas expresso em centavos, em vez de dólares. Obviamente, a multiplicação por um float converte tudo em um float e, como mencionado, ele precisa ser pequeno o suficiente para caber em 64 bits e ainda ser preciso.01
.fonte
05AB1E,
645851 bytesExplicado
Experimente online
fonte
Perl 5, 73 bytes
A solução óbvia. 72 bytes, mais 1 para em
-ne
vez de-e
.Economizou 5 bytes graças ao LLlAMnYP . Obrigado!
fonte
.01
, ela permaneceria precisa enquanto o número inteiro pudesse ser armazenado.Oracle SQL 11.2, 151 bytes
Sem golfe
fonte
SELECT
e((DECODE
salve um byte. Economize mais 10 bytes usando uma tabela nomeada! 7 removendo os dois pontos e usando um nome de coluna de um caractere mais três usando o nome de uma tabela de um caractere.JavaScript ES6, 77 bytes
Sem golfe
Eu considerei os coeficientes LIRA e PBOP. Os 1,5% extras são adicionados no final.
Provavelmente não é a solução mais eficiente em termos de golfe, mas um pouco diferente da solução Perl.
O erro de ponto flutuante deve ocorrer com números maiores e pode ser corrigido adicionando 1 ou 2 bytes extras a cada coeficiente.
fonte
()
s em todo ox>10?:
,?:
associados para a esquerda para a direita. Eu acho que você também pode salvar alguns bytes multiplicando os parênteses, por exemplo,(x-10)*4.154598+39.05314
igual ax*4.154598-41.54598+39.05314
igualx*4.154598-2.49284
.R , 52 bytes
Experimente online!
Gera uma função de aproximação linear, com base nos valores da minha resposta anterior em 0,10,27 e 10 ^ 6. O problema: o limite superior da entrada é 10 ^ 6.
approxfun
(comecdf
,stepfun
,splinefun
, etc.) é uma das muitas características agradáveis deR
.fonte
VBA, 88 bytes
A taxa básica e as taxas diferenciais de uso mais altas foram multiplicadas por 5 e o multiplicador de taxas da CPUC dividido por 5 (0,203).
O editor VB adicionará uma
End Function
linha, e é por isso que o feed da linha do terminal está incluído.fonte
Pitão -
5851 bytesConjunto de Teste .
fonte