Fred'in su faturası


9

Fred çok samimi bir adam ama gerçekte kötü.

Bu nedenle Fred, Los Altos, CA'daki küçük bir dairede yalnız yaşıyor. Fred çok acımasız çünkü su konusunda çok titiz. Bu nedenle, su faturasının ne olduğunu bulmak için yardımınıza ihtiyacı var.

İşiniz, girdi olarak kullanılan su miktarı (her zaman bir tamsayıdır) göz önüne alındığında, su faturasını döndüren bir işlev veya program yazmaktır.

Su tüketimi katmanlar halinde gelir. Bu, su miktarına bağlı olarak fiyat aralıkları olduğu anlamına gelir.

Bunlar katmanlar, fiyatları ve karşılık geldikleri su miktarlarıdır:

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

For n kübik feet yüzlerce (Ccf), orada aşağıdaki ek ücretleri de:

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

Seviye I, Seviye II, Seviye III, CPUC, LIRA ve PBOP ücretlerinin toplamı toplam su faturasıdır. Bu toplam, iki ondalık basamağa yuvarlanmış konsola geri dönmeli veya yazdırmalısınız.

İşte iki örnek:

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

Bu kod golf bayt kazanır çok kısa kod kazanır!


Lütfen düzenlememin amacınıza uygun olup olmadığını kontrol edin.
msh210

Evet, teşekkürler @ msh210, sahip olduğumdan çok daha net
Daniel

Aşağı oylamada itibarını boşa harcamak istiyorsanız, en azından nedenini açıklar mısınız?
Daniel

@Dopapp Bazı insanlar meydan okumayı sevmeyebilir. Orada yapabileceğin hiçbir şey yok. Değeri ne olursa olsun, aşağıya vurma zorlukları, aşağı oycunun itibarından uzaklaşmaz - sadece cevaplar.
Mego

Tamsayı olmayanlarla başa çıkmak zorunda mıyız n?
PurkkaKoodari

Yanıtlar:


1

Pyth, 55 41 bayt

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

Kod yazdırılamayan karakterler içeriyor, bu yüzden bir 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

açıklama

  1. ."…"içeren paketlenmiş bir dizedir 3.8476,4.0932,4.9118.
  2. vbunu tuple için değerlendirir (3.8476, 4.0932, 4.9118). Bunlar, seviyelerin CPUC katma değeri ile çarpımıdır.
  3. UQaralığı oluşturur 0n-1.
  4. c,T2710 ve 27 no'lu endekslerde bu aralığı böler, aralık çok kısasa sonunda ekstra boş listeler bulunur.
  5. lM her bir katmanın uzunluğunu bulur ve her kat için su miktarını verir.
  6. *V katmanların fiyatlarını almak için bunu 2. adımdaki demet ile çarpar.
  7. s sonuçları toplar.
  8. +*Q.051Girdinin 0,051 ile çarpımı ekler, yani LIRA + PBOP.
  9. .R2Sonucu 2 ondalığa yuvarlar.

Çevrimiçi deneyin.


2

Mathematica, 83 76 69 bayt

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

İlk sütundaki üç katmanın yanı sıra dördüncü sütunda rastgele kesinlikli bir sayı olarak temsil edilen LIRA ve PBOP'u oluşturan anonim işlev. Her şey ile çarpılır 1.015ve dizinin tüm öğeleri toplanır ve yuvarlanır .01. Yana 51/1015*1.015olacak istenen 0.051çıkış OP tarifnamede olarak, tam olarak kesin gibidir.

Perl çözümü altında yorumumda önerdiğim gibi 76 baytta daha kısa bir çözüm

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

nerede 1.015o zaman baştan fiyatlarının içinde ve LİRASI ve PBOP ilk kademe üstünde eklenir.

73 bayt (ancak basit Perl çözümüne oldukça yakın olduğu için bayt sayımı güncelleme konusunda isteksizim):

69 bayt - ah ne halt, golf de biraz çaba aldı.

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

Kayan nokta hatası ile ilgili EDIT
Cevabımın ilk üç yinelemesi ondalık gösterimlerinde gerçekten doğrudur, çünkü ilgili tüm katsayılar ondalık gösterimleri sonlandırır. Bununla birlikte, katsayılar açık bir şekilde yüzer, ikili olarak depolanır ve sonlanmayan ikili gösterimlere sahip olduğundan, yeterince büyük girdiler ikili gösterimin en az anlamlı basamaklarında hatalar biriktirmeye başlar. Şamandıra çok büyük olduğunda, ondalık noktasının sağına sadece 3-4 basamak sığacak şekilde, yaklaşık 1 cent'lik hatalar bekleyebiliriz. Kesin bir cevap için aşağıya bakın .

72 bayt, yüzer yanlışlıklara karşı biraz bağışıklık

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

Lider tarafından çarpma .01en son adımda yapılır. Bu noktaya kadar, tüm hesaplama tamsayılarla yapılır. Bu .01, atlanırsa, kesin bir sonuç olacağı , ancak dolar yerine sent olarak ifade edildiği anlamına gelir . Tabii ki, bir şamandıra ile çarpma, her şeyi bir şamandıraya dönüştürür ve belirtildiği gibi, 64 bite sığacak ve hala doğru olacak kadar küçük olması gerekir .01.


2

05AB1E, 64 58 51 bayt

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

Açıklaması

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

Çevrimiçi deneyin


1

Perl 5, 73 bayt

Açık çözüm. 72 bayt, artı 1 -neyerine -e.

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

LLlAMnYP sayesinde 5 bayt tasarruf etti . Teşekkürler!


Önceki yorumumda, bu düzenleme aslında orijinalinde kayan nokta hatalarını ortadan kaldırmak için çıkıyor .
LLlAMnYP

@LLlAMnYP, kuşkusuz herhangi bir yaklaşımda girişin yeterince yüksek değeri için bir hata olmalıdır. Umarım bu sınır OP'nin umursamayacağı kadar yüksektir (çünkü tek bir kişinin ikametgahı için makul olmayan bir miktarda sudır).
msh210

@ msh210 Fred'in hikayesini bilmiyorsun !!
kedi

Hayır, çünkü sonlu ondalık gösterimle sayıları çarpıyorsunuz ve ekliyorsunuz. Tabii ki, onları şamandıra olarak temsil ettiğinizde, çok büyük bir ikili temsile sahip olmayabilirler. Bundan sonra, kayan nokta gösterimi ondalığın sağında yalnızca 3-4 hane izin verdiğinde hatalar bekleyebilirsiniz. Yazımın altındaki "bonus cevabım", bunun üstesinden gelene kadar tam sayılar kullanarak (sentleri dolara çevirir) bunun üstesinden gelir. Eğer çarpmayı atlayacak olsaydım .01, tamsayı saklanabildiği sürece doğru kalırdı.
LLlAMnYP

1

Oracle SQL 11.2, 151 bayt

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;

Un-golfed

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

Bir bayt tasarruf etmek SELECTve arasındaki boşluktan kurtulun ((DECODE. Adlandırılmış bir tablo kullanarak daha fazla 10 bayt kaydedin! 7, iki nokta üst üste işaretini kaldırarak ve bir karakter sütun adı artı üç karakter kullanarak bir karakter tablosu adı kullanarak.
Giacomo Garabello

@Giacomo Garabello: alanı kaldırmak her zaman kurbağa ile null değerini ve SQLDeveloper ile bir hata döndürür. Tablo oluşturma komut dosyası 10 bayttan fazla ekler.
Jeto

yaratılış senaryosunu eklemek zorunda değilsiniz ... buraya bakın
Giacomo Garabello

1

JavaScript ES6, 77 bayt

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

Un-golfed

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
}

LIRA ve PBOP katsayılarını hesaba kattım. Ekstra% 1,5 sonunda eklenir.

Muhtemelen golf açısından en etkili çözüm değil, Perl'den biraz farklı.

Kayan nokta hatası daha büyük sayılarla oluşmalıdır ve her katsayıya 1 veya 2 ekstra bayt eklenerek düzeltilebilir.

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


Buna gerek yok ()etrafında s x>10?:, ?:ortakları sağdan sola. Ben de parantez dışarı çarpılarak bazı bayt tasarruf örn düşünüyorum (x-10)*4.154598+39.05314eşittir x*4.154598-41.54598+39.05314eşittir x*4.154598-2.49284.
Neil

1

R , 52 bayt

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

Çevrimiçi deneyin!

Önceki cevabımın 0,10,27 ve 10 ^ 6'daki değerlerine dayanarak doğrusal bir yaklaşım işlevi oluşturur. Yakalama: girişteki üst sınır 10 ^ 6'dır.

approxfun(ile ecdf, stepfun, splinefunvb) çok güzel özelliklerinden biridir R.


0

VBA, 88 bayt

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

Temel oran ve daha yüksek kullanım fark oranları 5 ile, CPUC ücret çarpanı ise 5'e (0.203) bölünmüştür.

VB editörü bir End Functionsatır ekleyecektir , bu yüzden terminal hattı beslemesi dahil edilmiştir.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.