Fred jest quasi-przyjaznym facetem, ale w rzeczywistości jest podły.
Z tego powodu Fred mieszka sam w małym mieszkaniu w Los Altos w Kalifornii. Fred jest taki podły, ponieważ bardzo przywiązuje wagę do wody. Dlatego potrzebuje twojej pomocy w ustaleniu, jaki jest jego rachunek za wodę.
Twoim zadaniem jest napisanie funkcji lub programu, który zwraca rachunek za wodę, biorąc pod uwagę ilość wody użytej jako dane wejściowe (która zawsze jest liczbą całkowitą).
Zużycie wody jest podzielone na poziomy. Oznacza to, że istnieją przedziały cen w zależności od ilości wody.
Są to poziomy, ich ceny i odpowiadające im ilości wody:
Tier I
First 10 Ccf: $3.8476/Ccf
Tier II
Next 17 Ccf: $4.0932/Ccf
Tier III
All subsequent water: $4.9118/Ccf
Dla n setek stóp sześciennych (Ccf) obowiązują również następujące dodatkowe opłaty:
CPUC fee: 1.5% of above charges
LIRA quantity surcharge: $0.047*n
PBOP amoritization surcharge: $0.004*n
Suma opłat na poziomie I, poziomie II, poziomie III, CPUC, LIRA i PBOP to całkowity rachunek za wodę. Suma ta powinna zostać zwrócona lub wydrukowana na konsoli w zaokrągleniu do dwóch miejsc po przecinku.
Oto dwa przykłady:
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
To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach!
n
?Odpowiedzi:
Pyth,
5541 bajtówKod zawiera znaki niedrukowalne, więc oto
xxd
zrzut heksowy.Wyjaśnienie
."…"
jest spakowanym ciągiem zawierającym3.8476,4.0932,4.9118
.v
ocenia to do krotki(3.8476, 4.0932, 4.9118)
. Są to ceny poziomów pomnożone przez dodanie CPUC.UQ
generuje szereg0
...n-1
.c
…,T27
Dzieli ten zakres według wskaźników 10 i 27, z dodatkowymi pustymi listami na końcu, jeśli zakres jest zbyt krótki.lM
określa długość każdej części, podając ilość wody dla każdego poziomu.*V
mnoży to przez krotkę z kroku 2, aby uzyskać ceny dla poziomów.s
sumuje wyniki.+
…*Q.051
Dodaje dane wejściowe pomnożone przez 0,051, tj. LIRA + PBOP..R
…2
Zaokrągla wynik do 2 miejsc po przecinku.Wypróbuj online.
źródło
Matematyka,
837669 bajtówAnonimowa funkcja, która konstruuje tablicę trzech warstw w pierwszej kolumnie plus LIRA i PBOP reprezentowane jako liczba o dowolnej dokładności w czwartej kolumnie. Całość mnoży się,
1.015
a wszystkie elementy tablicy są sumowane i zaokrąglane do.01
. Ponieważ51/1015*1.015
będzie pożądany,0.051
wynik jest dokładnie tak dokładny, jak specyfikacja w OP.Krótsze rozwiązanie, w 76 bajtach , jak zasugerowałem w moim komentarzu do rozwiązania Perl
gdzie
1.015
od początku uwzględnia się ceny, a następnie dodaje się LIRA i PBOP na pierwszym poziomie.73 bajty (ale niechętnie aktualizuję moją liczbę bajtów, ponieważ jest to dość zbliżone do prostego rozwiązania Perla):69 bajtów - och, do cholery, gra w golfa również wymagała wysiłku.
EDYCJA dotycząca błędu zmiennoprzecinkowego
Pierwsze trzy iteracje mojej odpowiedzi są rzeczywiście dokładne w ich reprezentacji dziesiętnej, ponieważ wszystkie zaangażowane współczynniki mają końcowe reprezentacje dziesiętne. Ponieważ jednak współczynniki są jawnie zmiennoprzecinkowe, przechowywane w postaci binarnej i mają nie kończące się reprezentacje binarne, wystarczająco duże dane wejściowe zaczną gromadzić błędy w najmniej znaczących cyfrach reprezentacji binarnej. Sądzę, że gdy liczba zmiennoprzecinkowa jest tak duża, że mieści się ona tylko 3-4 cyfry po prawej stronie przecinka dziesiętnego, możemy spodziewać się błędów około 1 centa. Dokładna odpowiedź poniżej .
72 bajty, nieco odporne na niedokładności
Mnożenie przez wiodące
.01
odbywa się na ostatnim etapie. Do tego momentu wszystkie obliczenia są wykonywane za pomocą liczb całkowitych. Oznacza to, że jeśli.01
zostanie pominięty, pojawi się dokładny wynik, ale wyrażony w centach, a nie w dolarach. Oczywiście, pomnożenie przez liczbę zmiennoprzecinkową przekształca całą rzecz w liczbę zmiennoprzecinkową i, jak wspomniano, musi być wystarczająco mała, aby zmieściła się w 64 bitach i nadal była dokładna.01
.źródło
05AB1E,
645851 bajtówWyjaśnione
Wypróbuj online
źródło
Perl 5, 73 bajtów
Oczywiste rozwiązanie. 72 bajty plus 1 za
-ne
zamiast-e
.Zaoszczędzono 5 bajtów dzięki LLlAMnYP . Dzięki!
źródło
.01
, pozostałoby ono dokładne tak długo, jak długo można zapisać liczbę całkowitą.Oracle SQL 11.2, 151 bajtów
Nie grał w golfa
źródło
SELECT
i,((DECODE
aby zaoszczędzić jeden bajt. Zaoszczędź więcej 10 bajtów, używając nazwanej tabeli! 7, usuwając dwukropki i używając nazwy kolumny o jednym znaku plus trzy, używając nazwy tabeli o jednym znaku.JavaScript ES6, 77 bajtów
Nie grał w golfa
Wziąłem pod uwagę współczynniki LIRA i PBOP. Dodatkowe 1,5% zostaje dodane na końcu.
Prawdopodobnie nie jest to najbardziej wydajne rozwiązanie pod względem golfa, ale nieco różni się od Perla.
Błąd zmiennoprzecinkowy powinien wystąpić przy większych liczbach i można go naprawić, dodając 1 lub 2 dodatkowe bajty do każdego współczynnika.
źródło
()
s wokółx>10?:
,?:
kojarzy od prawej do lewej. Myślę, że możesz także zaoszczędzić niektóre bajty, mnożąc nawiasy, np.(x-10)*4.154598+39.05314
Równa sięx*4.154598-41.54598+39.05314
równa sięx*4.154598-2.49284
.R , 52 bajty
Wypróbuj online!
Generuje liniową funkcję aproksymacyjną na podstawie wartości mojej poprzedniej odpowiedzi na 0,10,27 i 10 ^ 6. Haczyk: górna granica na wejściu wynosi 10 ^ 6.
approxfun
(zecdf
,stepfun
,splinefun
, itd.) jest jedną z wielu cech miłe zR
.źródło
VBA, 88 bajtów
Stawka podstawowa i wyższe stawki różnicowe za użytkowanie zostały pomnożone przez 5, a mnożnik opłaty CPUC podzielony przez 5 (0,203).
Edytor VB doda
End Function
linię, dlatego dołączone jest zasilanie linii terminala.źródło
Pyth -
5851 bajtówPakiet testowy .
źródło