Hóa đơn nước của Fred


9

Fred là một anh chàng gần như thân thiện, nhưng thực tế anh ta có ý.

Vì điều này, Fred sống một mình trong một căn hộ nhỏ ở Los Altos, CA. Fred rất có ý nghĩa vì anh ấy rất đặc biệt về nước. Do đó, anh ta cần sự giúp đỡ của bạn để tìm ra hóa đơn tiền nước của anh ta.

Công việc của bạn là viết một hàm hoặc chương trình trả về hóa đơn tiền nước của mình với lượng nước được sử dụng làm đầu vào (luôn luôn là một số nguyên).

Tiêu thụ nước đến trong tầng. Điều này có nghĩa là có nhiều mức giá tùy thuộc vào lượng nước.

Đây là các bậc, giá của chúng và lượng nước tương ứng với:

Tier I
   First 10 Ccf: $3.8476/Ccf
Tier II
   Next 17 Ccf: $4.0932/Ccf
Tier III
   All subsequent water: $4.9118/Ccf

Đối với n hàng trăm feet khối (Ccf), cũng có các khoản phí bổ sung sau:

CPUC fee: 1.5% of above charges
LIRA quantity surcharge: $0.047*n
PBOP amoritization surcharge: $0.004*n

Tổng của các khoản phí Cấp I, Cấp II, Cấp III, CPUC, LIRA và PBOP là tổng hóa đơn nước. Tổng này bạn nên trả lại hoặc in ra bàn điều khiển được làm tròn đến hai chữ số thập phân.

Đây là hai ví dụ:

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

Đây là mã golf để mã ngắn nhất trong byte thắng!


Vui lòng kiểm tra xem chỉnh sửa của tôi phù hợp với ý định của bạn.
msh210

Vâng cảm ơn @ msh210, điều đó rõ ràng hơn nhiều so với những gì tôi đã có
Daniel

Nếu bạn sẵn sàng lãng phí danh tiếng khi bỏ phiếu xuống, ít nhất bạn có thể vui lòng giải thích tại sao không?
Daniel

@Dopapp Một số người có thể không thích thử thách. Không có gì bạn có thể làm ở đó. Đối với những gì nó có giá trị, những thách thức hạ thấp không trừ đi danh tiếng của người hạ cấp - chỉ có câu trả lời.
Mego

Chúng ta có phải xử lý không nguyên n?
PurkkaKoodari

Câu trả lời:


1

Bình thường, 55 41 byte

.R+s*Vv.",9t¬®Ï0NwÝ"lMcUQ,T27*.051Q2

Mã này chứa các ký tự không thể in được, vì vậy đây là một xxdhexdump.

00000000: 2e52 2b73 2a56 762e 222c 3904 1874 c2ac  .R+s*Vv.",9..t..
00000010: c2ae c280 c293 c38f 301c 4e77 c39d 226c  ........0.Nw.."l
00000020: 4d63 5551 2c54 3237 2a2e 3035 3151 32    McUQ,T27*.051Q2

Giải trình

  1. ."…"là một chuỗi đóng gói có chứa 3.8476,4.0932,4.9118.
  2. vđánh giá điều đó đến tuple (3.8476, 4.0932, 4.9118). Đây là giá của các cấp nhân với CPUC được thêm vào.
  3. UQtạo ra phạm vi 0... n-1.
  4. cSự ,T27chia tách phạm vi đó ở các chỉ số 10 và 27, cuối cùng có thêm danh sách trống nếu phạm vi quá ngắn.
  5. lM tìm chiều dài của mỗi phần, đưa ra lượng nước cho mỗi tầng.
  6. *V nhân số đó bằng tuple từ bước 2 để lấy giá cho các tầng.
  7. s tổng hợp kết quả.
  8. +Thêm *Q.051vào đầu vào nhân với 0,051, tức là LIRA + PBOP.
  9. .R... 2viên đạn kết quả đến 2 số thập phân.

Hãy thử trực tuyến.


2

Toán học, 83 76 69 byte

1.015{3.8476,.2456(b=Boole)[#>10],.8186b[#>27],51/1015}&~Array~#~Total~2~Round~.01&

Hàm ẩn danh xây dựng một mảng gồm ba bậc trong cột đầu tiên cộng với LIRA và PBOP được biểu diễn dưới dạng số chính xác tùy ý trong cột thứ tư. Toàn bộ điều được nhân với 1.015và tất cả các yếu tố của mảng được tính tổng và làm tròn thành .01. Vì 51/1015*1.015sẽ là 0.051đầu ra mong muốn chính xác như chính xác, như thông số kỹ thuật trong OP.

Một giải pháp ngắn hơn, trong 76 byte , như tôi đã đề xuất trong nhận xét của mình dưới giải pháp Perl

{3.956314,.249284(b=Boole)[#>10],.830879b[#>27]}&~Array~#~Total~2~Round~.01&

nơi 1.015được tính vào giá từ đầu và sau đó LIRA và PBOP được thêm vào đầu tầng thứ nhất.

73 byte (nhưng tôi không muốn cập nhật số byte của mình vì nó khá gần với giải pháp Perl đơn giản):

69 byte - ah cái quái gì, chơi golf cũng mất một số nỗ lực.

.01Round[395.6314#+{24.9284,83.0879}.(UnitStep[#-1]#&/@{#-10,#-27})]&

EDIT liên quan đến lỗi dấu phẩy động
Ba lần lặp đầu tiên trong câu trả lời của tôi thực sự chính xác trong biểu diễn thập phân của chúng, vì tất cả các hệ số liên quan đều chấm dứt biểu diễn thập phân. Tuy nhiên, do các hệ số nổi rõ ràng, được lưu trữ trong nhị phân và có các biểu diễn nhị phân không kết thúc, các đầu vào đủ lớn sẽ bắt đầu tích lũy các lỗi trong các chữ số có ý nghĩa nhỏ nhất của biểu diễn nhị phân. Tôi đoán, khi số float quá lớn, nó chỉ khớp 3-4 chữ số ở bên phải dấu thập phân, chúng ta có thể mong đợi các lỗi khoảng 1 cent. Xem bên dưới để có câu trả lời chính xác .

72 byte, phần nào miễn nhiễm với sự thiếu chính xác của float

.01Round[{3956314,249284,830879}.(UnitStep[#-1]#&)/@(#-{0,10,27})/10^4]&

Phép nhân bằng cách dẫn đầu .01được thực hiện ở bước cuối cùng. Cho đến thời điểm đó, tất cả các tính toán được thực hiện với số nguyên. Điều này có nghĩa là, nếu .01bỏ qua, sẽ có một kết quả chính xác , nhưng được biểu thị bằng xu, thay vì đô la. Tất nhiên, phép nhân bằng phao chuyển đổi toàn bộ vật thể thành phao và, như đã đề cập, nó cần đủ nhỏ để vừa với 64 bit mà vẫn chính xác .01.


2

05AB1E, 64 58 51 byte

0T27¹)vy¹‚ï{0è})¥•_ÄÄ™wu24@•2'.:7ô)ø€PO¹"5.1"*+ïTn/

Giải thích

0T27¹)                                               # list of price brackets
      vy¹‚ï{0è})                                     # min of each with input
                ¥                                    # calculate deltas to get amounts within each bracket
                 •_ÄÄ™wu24@•2'.:7ô                   # list of price rates with CPUC included
                                  )ø                 # zip with amounts for each rate
                                    €PO              # multiply amounts by their rates and sum
                                       ¹"5.1"*+      # add LIRA/PBOP
                                               ïTn/  # round to 2 decimals

Dùng thử trực tuyến


1

Perl 5, 73 byte

Các giải pháp rõ ràng. 72 byte, cộng 1 cho -nethay vì -e.

printf'%.2f',$_*3.956314+($_-10)*($_>10)*.249284+($_-27)*($_>27)*.830879

Đã lưu 5 byte nhờ LLlAMnYP . Cảm ơn!


Nhận xét trước đây của tôi, chỉnh sửa này hóa ra thực sự loại bỏ các lỗi dấu phẩy động mà bạn có trong bản gốc.
LLlAMnYP

@LLlAMnYP, chắc chắn bất kỳ phép tính gần đúng nào cũng phải có lỗi cho giá trị đầu vào đủ cao. Hy vọng rằng ràng buộc đó đủ cao để OP không quan tâm (vì đó là lượng nước không hợp lý cho nơi cư trú của một người).
msh210

@ msh210 Bạn không biết câu chuyện của Fred !!
mèo

Không, bởi vì bạn đang nhân và thêm số với biểu diễn thập phân hữu hạn. Tất nhiên, khi bạn đại diện cho chúng như những chiếc phao, chúng có thể có một đại diện nhị phân không quá lớn. Sau đó, bạn có thể mong đợi các lỗi khi biểu diễn float chỉ cho phép 3-4 chữ số ở bên phải của số thập phân. "Câu trả lời thưởng" của tôi ở cuối bài đăng của tôi khắc phục điều này, sử dụng số nguyên cho đến bước cuối cùng (chuyển đổi xu thành đô la). Nếu tôi bỏ qua phép nhân .01, nó sẽ vẫn chính xác miễn là số nguyên có thể được lưu trữ.
LLlAMnYP

1

Oracle SQL 11.2, 151 byte

SELECT ((DECODE(SIGN(:1-10),1,10,:1)*3.8476)+(DECODE(SIGN(:1-27),1,17,:1-10)*4.0932)+(DECODE(SIGN(:1-27),-1,0,:1-27)*4.9118))*1.015+:1*0.051 FROM DUAL;

Không chơi gôn

SELECT ((DECODE(SIGN(:1-10),1,10,:1)*3.8476)+
       (DECODE(SIGN(:1-27),1,17,:1-10)*4.0932)+
       (DECODE(SIGN(:1-27),-1,0,:1-27)*4.9118))*1.015+
       :1*0.051
FROM DUAL

Loại bỏ khoảng trống giữa SELECT((DECODEđể lưu một byte. Tiết kiệm hơn 10 byte bằng cách sử dụng bảng có tên! 7 bằng cách xóa các dấu hai chấm và sử dụng một tên cột char cộng với ba bằng cách sử dụng một tên bảng char.
Giacomo Garabello

@Giacomo Garabello: xóa không gian luôn trả về null bằng cóc và trả về lỗi với SQLDeveloper. Tập lệnh tạo bảng thêm hơn 10 byte.
Jeto

bạn không cần phải thêm tập lệnh tạo ... nhìn vào đây
Giacomo Garabello

1

JavaScript ES6, 77 byte

x=>(x>27?(x-27)*4.985477+109.681:(x>10?(x-10)*4.1546+39.053:x*3.9053))+.051*x

Không chơi gôn

f = x => {
  if (x > 27) {
    res = (x - 27) * 4.985477 + 109.681306
  } else if (x > 10) {
    res = (x - 10) * 4.154598 + 39.05314
  } else {
    res = x * 3.905314
  }
  return res + 0.051 * x
}

Tôi đã tính đến các hệ số LIRA và PBOP. Thêm 1,5% được thêm vào cuối.

Có lẽ không phải là giải pháp hiệu quả nhất về mặt golf nhưng hơi khác so với Perl.

Lỗi dấu phẩy động nên xảy ra với số lượng lớn hơn và có thể được sửa bằng cách thêm 1 hoặc 2 byte thêm vào mỗi hệ số.

f=x=>(x>27?(x-27)*4.985477+109.681:(x>10?(x-10)*4.1546+39.053:x*3.9053))+.051*x

console.log(f(15))
console.log(f(100))
console.log(f(200000))


Bạn không cần những người ()xung quanh x>10?:, ?:liên kết từ phải sang trái. Tôi nghĩ bạn cũng có thể tiết kiệm một số byte bằng cách nhân ra ngoặc ví dụ như (x-10)*4.154598+39.05314bằng x*4.154598-41.54598+39.05314bình đẳng x*4.154598-2.49284.
Neil

1

R , 52 byte

approxfun(c(0,10,27,10^6),c(0,39.56,111.06,5036475))

Hãy thử trực tuyến!

Tạo hàm xấp xỉ tuyến tính, dựa trên các giá trị câu trả lời trước của tôi tại 0,10,27 và 10 ^ 6. Bắt: giới hạn trên của đầu vào là 10 ^ 6.

approxfun(với ecdf, stepfun, splinefun, vv) là một trong nhiều tính năng tốt đẹp của R.


0

VBA, 88 byte

Function W(V):W=Round(.051*V+.203*(V*19.238-(V-10)*(V>10)*1.228-(V-27)*(V>27)*4.093),2)
 

Tỷ lệ cơ sở và tỷ lệ chênh lệch sử dụng cao hơn đã được nhân với 5 và hệ số nhân phí CPUC chia cho 5 (0,203).

Trình soạn thảo VB sẽ thêm một End Functiondòng, đó là lý do tại sao nguồn cấp dữ liệu đầu cuối được bao gồm.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.