Tagihan air Fred

9

Fred adalah pria yang sangat ramah, tetapi kenyataannya dia jahat.

Karena itu, Fred tinggal sendirian di sebuah apartemen kecil di Los Altos, CA. Fred sangat kejam karena dia sangat khusus tentang air. Karena itu, ia membutuhkan bantuan Anda untuk mencari tahu berapa tagihan airnya.

Tugas Anda adalah menulis fungsi atau program yang mengembalikan tagihan airnya mengingat jumlah air yang digunakan sebagai input (yang selalu berupa bilangan bulat).

Konsumsi air datang dalam tingkatan. Ini berarti ada kisaran harga tergantung pada jumlah air.

Ini adalah tingkatan, harganya, dan jumlah air yang sesuai dengan:

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

Untuk n ratusan kaki kubik (Ccf), ada juga biaya tambahan berikut:

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

Jumlah biaya Tier I, Tier II, Tier III, CPUC, LIRA, dan PBOP adalah total tagihan air. Jumlah ini Anda harus mengembalikan atau mencetak ke konsol dibulatkan ke dua tempat desimal.

Berikut ini dua contoh:

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

Ini adalah kode golf sehingga kode terpendek dalam byte menang!

Daniel
sumber
Harap periksa bahwa edit saya cocok dengan maksud Anda.
msh210
Ya terima kasih @ msh210, itu jauh lebih jelas dari apa yang saya miliki
Daniel
Jika Anda ingin menyia-nyiakan reputasi pada down-voting, bisakah Anda setidaknya menjelaskan mengapa?
Daniel
@Dappapp Beberapa orang mungkin tidak suka tantangannya. Tidak ada yang bisa Anda lakukan di sana. Untuk apa nilainya, tantangan downvoting tidak mengurangi dari reputasi downvoter's - hanya jawaban.
Mego
Apakah kita harus menangani non-integer n?
PurkkaKoodari

Jawaban:

1

Pyth, 55 41 byte

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

Kode berisi karakter yang tidak patut xxddicetak , jadi ini hexdump.

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

Penjelasan

  1. ."…"adalah string yang berisi 3.8476,4.0932,4.9118.
  2. vmengevaluasi itu ke tuple (3.8476, 4.0932, 4.9118). Ini adalah harga tingkatan yang dikalikan dengan CPUC yang ditambahkan.
  3. UQmenghasilkan kisaran 0... n-1.
  4. c... ,T27pisahkan kisaran itu pada indeks 10 dan 27, dengan daftar kosong tambahan pada akhirnya jika kisarannya terlalu pendek.
  5. lM menemukan panjang setiap bagian, memberikan jumlah air untuk setiap tingkatan.
  6. *V mengalikan bahwa dengan tuple dari langkah 2 untuk mendapatkan harga untuk tingkatan.
  7. s jumlah hasilnya.
  8. +*Q.051Menambahkan input yang dikalikan dengan 0,051, yaitu LIRA + PBOP.
  9. .R... 2bulatkan hasilnya menjadi 2 desimal.

Cobalah online.

PurkkaKoodari
sumber
2

Mathematica, 83 76 69 byte

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

Fungsi anonim yang membangun array dari tiga tingkatan di kolom pertama ditambah LIRA dan PBOP direpresentasikan sebagai angka presisi sewenang-wenang di kolom keempat. Seluruhnya dikalikan dengan 1.015dan semua elemen array dijumlahkan dan dibulatkan menjadi .01. Karena 51/1015*1.015akan menjadi yang diinginkan 0.051, outputnya sama persis dengan spesifikasi dalam OP.

Solusi yang lebih pendek, dalam 76 byte , seperti yang saya sarankan dalam komentar saya di bawah solusi Perl

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

di mana 1.015diperhitungkan dalam harga dari awal dan kemudian LIRA dan PBOP ditambahkan di atas tingkat pertama.

73 byte (tapi saya enggan untuk memperbarui byte-count saya karena ini cukup dekat dengan solusi Perl langsung):

69 byte - ah apa-apaan, golf butuh usaha juga.

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

EDIT tentang kesalahan floating point
Tiga iterasi pertama dari jawaban saya memang tepat dalam representasi desimal mereka, karena semua koefisien yang terlibat telah mengakhiri representasi desimal. Namun, karena koefisien secara eksplisit mengapung, disimpan dalam biner dan memiliki representasi biner non-terminasi, input yang cukup besar akan mulai mengakumulasi kesalahan dalam digit paling tidak signifikan dari representasi biner. Saya kira, ketika float itu begitu besar, yang hanya muat 3-4 digit di sebelah kanan titik desimal, kita bisa mengharapkan kesalahan sekitar 1 sen. Lihat di bawah untuk jawaban yang tepat .

72 byte, agak kebal terhadap ketidakakuratan apung

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

Penggandaan oleh pimpinan .01dilakukan pada langkah terakhir. Sampai saat itu, semua perhitungan dilakukan dengan bilangan bulat. Ini berarti, bahwa jika .01dihilangkan, akan ada hasil yang tepat , tetapi dinyatakan dalam sen, bukan dalam dolar. Tentu saja, perkalian dengan float mengubah seluruh hal menjadi float, dan, seperti yang disebutkan, itu harus cukup kecil untuk masuk ke 64 bit dan masih akurat .01.

LLlAMnYP
sumber
2

05AB1E, 64 58 51 byte

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

Dijelaskan

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

Cobalah online

Emigna
sumber
1

Perl 5, 73 byte

Solusi yang jelas. 72 byte, ditambah 1 untuk -nebukannya -e.

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

Disimpan 5 byte berkat LLlAMnYP . Terima kasih!

msh210
sumber
Kembali komentar saya sebelumnya, hasil edit ini ternyata benar-benar menghilangkan kesalahan floating point yang Anda miliki di aslinya.
LLlAMnYP
@ LLlAMnYP, pasti setiap pendekatan harus memiliki kesalahan untuk nilai input yang cukup tinggi. Mudah-mudahan ikatan itu cukup tinggi sehingga OP tidak peduli (karena jumlah air yang tidak masuk akal untuk tempat tinggal satu orang).
msh210
@ msh210 Anda tidak tahu cerita Fred !!
kucing
Tidak, karena Anda mengalikan dan menambahkan angka dengan representasi desimal terbatas. Tentu saja, ketika Anda mewakili mereka sebagai pelampung, mereka mungkin memiliki representasi biner yang tidak begitu besar. Anda kemudian dapat mengharapkan kesalahan ketika representasi float memungkinkan hanya 3-4 digit di sebelah kanan desimal. "Bonus-jawaban" saya di bagian bawah posting saya mengatasi ini, menggunakan bilangan bulat sampai langkah terakhir (yang mengubah sen menjadi dolar). Jika saya menghilangkan perkalian dengan .01, itu akan tetap akurat selama integer dapat disimpan.
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;

Tidak bermain golf

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
Jeto
sumber
Singkirkan ruang di antara SELECTdan ((DECODEuntuk menghemat satu byte. Hemat lebih 10 byte menggunakan tabel bernama! 7 dengan menghapus titik dua dan menggunakan nama kolom satu char ditambah tiga menggunakan nama tabel satu char.
Giacomo Garabello
@Giacomo Garabello: menghapus ruang selalu mengembalikan null dengan kodok dan mengembalikan kesalahan dengan SQLDeveloper. Script buat tabel menambahkan lebih dari 10 byte.
Jeto
Anda tidak perlu menambahkan skrip penciptaan ... lihat di sini
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

Tidak bermain golf

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
}

Saya memperhitungkan faktor koefisien LIRA dan PBOP. 1,5% ekstra akan ditambahkan di akhir.

Mungkin bukan solusi yang paling efisien dalam hal bermain golf tetapi agak berbeda dari yang Perl.

Kesalahan floating point harus terjadi dengan angka yang lebih besar dan dapat diperbaiki dengan menambahkan 1 atau 2 byte tambahan untuk setiap koefisien.

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))

Hugo
sumber
Anda tidak perlu ()di sekitar x>10?:, ?:rekan kanan-ke-kiri. Saya pikir Anda juga dapat menyimpan beberapa byte dengan mengalikan tanda kurung misalnya (x-10)*4.154598+39.05314sama x*4.154598-41.54598+39.05314dengan sama x*4.154598-2.49284.
Neil
1

R , 52 byte

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

Cobalah online!

Menghasilkan fungsi perkiraan linier, berdasarkan nilai jawaban saya sebelumnya di 0,10,27 dan 10 ^ 6. Tangkapan: batas atas pada input adalah 10 ^ 6.

approxfun(dengan ecdf, stepfun, splinefun, dll) adalah salah satu dari banyak fitur bagus dari R.

JayCe
sumber
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)
 

Tingkat dasar dan tingkat diferensial penggunaan yang lebih tinggi telah dikalikan dengan 5, dan pengali biaya CPUC dibagi dengan 5 (0,203).

Editor VB akan menambahkan End Functionbaris, itulah sebabnya umpan baris terminal disertakan.

Joffan
sumber
0

Pyth - 58 51 byte

.Rs+*Bs*V++m3.8476Tm4.0932 17m4.9118Qm1Q.015*.051Q2

Test Suite .

Maltysen
sumber