Fred est un gars presque amical, mais en réalité, il est méchant.
Pour cette raison, Fred vit seul dans un petit appartement à Los Altos, en Californie. Fred est si méchant parce qu'il est très particulier avec l'eau. Il a donc besoin de votre aide pour déterminer quelle est sa facture d'eau.
Votre travail consiste à écrire une fonction ou un programme qui renvoie sa facture d'eau compte tenu de la quantité d'eau utilisée comme entrée (qui est toujours un entier).
La consommation d'eau est échelonnée. Cela signifie qu'il existe des gammes de prix en fonction de la quantité d'eau.
Ce sont les niveaux, leurs prix et les quantités d'eau auxquelles ils correspondent:
Tier I
First 10 Ccf: $3.8476/Ccf
Tier II
Next 17 Ccf: $4.0932/Ccf
Tier III
All subsequent water: $4.9118/Ccf
Pour n centaines de pieds cubes (Ccf), il y a également les frais supplémentaires suivants:
CPUC fee: 1.5% of above charges
LIRA quantity surcharge: $0.047*n
PBOP amoritization surcharge: $0.004*n
La somme des frais de niveau I, de niveau II, de niveau III, CPUC, LIRA et PBOP correspond à la facture totale d'eau. Cette somme doit être retournée ou imprimée sur la console arrondie à deux décimales.
Voici deux exemples:
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
C'est le code golf, donc le code le plus court en octets gagne!
n
?Réponses:
Pyth,
5541 octetsLe code contient des caractères non imprimables, voici donc un
xxd
vidage hexadécimal.Explication
."…"
est une chaîne compressée qui contient3.8476,4.0932,4.9118
.v
évalue cela au tuple(3.8476, 4.0932, 4.9118)
. Ce sont les prix des niveaux multipliés par les CPUC ajoutés.UQ
génère la gamme0
…n-1
.c
…,T27
Divise cette plage aux indices 10 et 27, avec des listes vides supplémentaires à la fin si la plage est trop courte.lM
trouve la longueur de chaque partie, donnant la quantité d'eau pour chaque niveau.*V
multiplie cela par le tuple de l'étape 2 pour obtenir les prix des niveaux.s
résume les résultats.+
…*Q.051
Ajoute l'entrée multipliée par 0,051, c'est-à-dire LIRA + PBOP..R
…2
Arrondit le résultat à 2 décimales.Essayez-le en ligne.
la source
Mathematica,
837669 octetsFonction anonyme qui construit un tableau des trois niveaux dans la première colonne plus le LIRA et le PBOP représentés comme un nombre à précision arbitraire dans la quatrième colonne. Le tout est multiplié par
1.015
et tous les éléments du tableau sont additionnés et arrondis à.01
. Étant donné que ce51/1015*1.015
sera le résultat souhaité,0.051
la sortie est exactement aussi précise que la spécification dans OP.Une solution plus courte, en 76 octets , comme je l'ai suggéré dans mon commentaire sous la solution Perl
où
1.015
est pris en compte dans les prix dès le départ, puis le CRI et le PBOP sont ajoutés au-dessus du premier niveau.73 octets (mais je suis réticent à mettre à jour mon nombre d'octets car c'est assez proche de la solution Perl simple):69 octets - ah quoi diable, le golf a pris un certain effort aussi.
EDIT concernant l'erreur en virgule flottante
Les trois premières itérations de ma réponse sont en effet exactes dans leur représentation décimale, car tous les coefficients impliqués ont des représentations décimales terminales. Cependant, comme les coefficients sont des flottants explicites, stockés en binaire et ayant des représentations binaires sans terminaison, des entrées suffisamment grandes commenceront à accumuler des erreurs dans les chiffres les moins significatifs de la représentation binaire. Je suppose que lorsque le flotteur est si grand qu'il ne tient que de 3 à 4 chiffres à droite de la virgule décimale, nous pouvons nous attendre à des erreurs d'environ 1 cent. Voir ci-dessous pour une réponse exacte .
72 octets, peu à l'abri des inexactitudes de flottement
La multiplication par l'interligne
.01
se fait à la toute dernière étape. Jusqu'à ce point, tous les calculs sont effectués avec des entiers. Cela signifie que si le.01
est omis, il y aura un résultat exact , mais exprimé en cents plutôt qu'en dollars. Bien sûr, la multiplication par un flotteur convertit le tout en un flottant, et, comme mentionné, il doit être suffisamment petit pour tenir sur 64 bits et toujours précis.01
.la source
05AB1E,
645851 octetsExpliqué
Essayez-le en ligne
la source
Perl 5, 73 octets
La solution évidente. 72 octets, plus 1 pour
-ne
au lieu de-e
.5 octets enregistrés grâce à LLlAMnYP . Merci!
la source
.01
, elle resterait précise tant que l'entier peut être stocké.Oracle SQL 11.2, 151 octets
Non golfé
la source
SELECT
et((DECODE
pour enregistrer un octet. Économisez plus de 10 octets en utilisant une table nommée! 7 en supprimant les deux-points et en utilisant un nom de colonne d'un caractère plus trois en utilisant un nom de table d'un caractère.JavaScript ES6, 77 octets
Non golfé
J'ai pris en compte les coefficients LIRA et PBOP. Le 1,5% supplémentaire est ajouté à la fin.
Probablement pas la solution la plus efficace en termes de golf mais quelque peu différente de celle de Perl.
Une erreur en virgule flottante doit se produire avec des nombres plus importants et peut être corrigée en ajoutant 1 ou 2 octets supplémentaires à chaque coefficient.
la source
()
s autour dux>10?:
,?:
associe de droite à gauche. Je pense que vous pouvez également économiser quelques octets en multipliant les parenthèses, par exemple(x-10)*4.154598+39.05314
égal àx*4.154598-41.54598+39.05314
égalx*4.154598-2.49284
.R , 52 octets
Essayez-le en ligne!
Génère une fonction d'approximation linéaire, basée sur les valeurs de ma réponse précédente à 0,10,27 et 10 ^ 6. Le hic: la limite supérieure de l'entrée est 10 ^ 6.
approxfun
(avececdf
,stepfun
,splinefun
, etc.) est l' une des nombreuses caractéristiques de belles deR
.la source
VBA, 88 octets
Le taux de base et les taux différentiels d'utilisation plus élevés ont été multipliés par 5, et le multiplicateur des frais CPUC divisé par 5 (0,203).
L'éditeur VB ajoutera une
End Function
ligne, c'est pourquoi le fil de ligne du terminal est inclus.la source
Pyth -
5851 octetsSuite de tests .
la source