フレッドの水道代


9

フレッドは準フレンドリーな男ですが、実際には彼は意地悪です。

このため、フレッドはカリフォルニア州ロスアルトスの小さなアパートに一人で住んでいます。フレッドは水にとてもこだわっているので、とても卑劣です。したがって、彼は彼の水道料金が何であるかを理解するためにあなたの助けを必要としています。

あなたの仕事は、入力として使用された水の量(これは常に整数です)が与えられると、彼の水道料金を返す関数またはプログラムを書くことです。

水の消費には段階があります。これは、水の量に応じて価格の範囲があることを意味します。

これらは、ティア、価格、および対応する水の量です。

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

以下のためのn立方フィート(CCF)の何百、以下の追加料金は同様にあります。

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

Tier I、Tier II、Tier III、CPUC、LIRA、およびPBOP料金の合計が水道料金の合計です。この合計は、小数点以下2桁に四捨五入してコンソールに返すか印刷する必要があります。

次に2つの例を示します。

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

これはコードゴルフなので、バイト単位の最短コードが勝ちます!


私の編集があなたの意図と一致することを確認してください。
msh210 2016年

うん感謝@ msh210、私が持っていたものよりもはるかに明確だ
ダニエル

反対票を投じることで評判を無駄にしたい場合は、少なくとも理由を説明していただけますか?
ダニエル

@Dopapp一部の人々は単に挑戦が好きではないかもしれません。そこでは何もできません。価値のあることとして、反対投票の課題は反対投票者の評判から差し引かれるのではなく、回答のみです。
Mego 2016年

非整数を処理する必要がありnますか?
PurkkaKoodari

回答:


1

Pyth、55 41バイト

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

コードには印刷できない文字が含まれているので、これがxxd16進ダンプです。

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

説明

  1. ."…"はを含むパックされた文字列です3.8476,4.0932,4.9118
  2. vそれをタプルに評価し(3.8476, 4.0932, 4.9118)ます。これらは、ティアの価格にCPUCを追加したものです。
  3. UQ範囲を生成します0n-1
  4. c,T27インデックス10と27でその範囲を分割します。範囲が短すぎる場合は、最後に空のリストが追加されます。
  5. lM 各パーツの長さを求め、各層の水の量を示します。
  6. *V これにステップ2のタプルを乗算して、ティアの価格を取得します。
  7. s 結果を合計します。
  8. +*Q.051入力に0.051を掛けた値、つまりLIRA + PBOPを追加します。
  9. .R2結果を小数第2位に丸めます。

オンラインでお試しください。


2

Mathematica、 83 76 69バイト

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

最初の列の3つの層と、4番目の列の任意精度の数値として表されるLIRAおよびPBOPの配列を構成する無名関数。全体が乗算され1.015、配列のすべての要素が合計されてに丸められ.01ます。以来、51/1015*1.015所望される0.051出力OPで仕様として、正確に正確通りです。

Perlソリューションのコメントで提案したように、76バイトの短いソリューション

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

どこ1.015開始からの価格に織り込まれ、その後、LIRAとPBOPは、最初の層の上に追加されます。

73バイト(ただし、これは単純なPerlソリューションに非常に近いため、バイト数を更新するのは気が進まない):

69バイト -なんといっても、ゴルフにもある程度の努力が必要でした。

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

浮動小数点エラーに関する編集
私の回答の最初の3回の繰り返しは、含まれるすべての係数が終了10進表記であるため、実際には10進表記で正確です。ただし、係数は明示的に浮動小数点であり、バイナリに格納され、非終了のバイナリ表現を持つため、十分に大きい入力は、バイナリ表現の最下位桁にエラーを蓄積し始めます。浮動小数点数が非常に大きく、小数点の右側に3桁から4桁しか収まらない場合、約1セントのエラーが予想されると思います。正確な回答については、以下を参照してください。

72バイト、フロートの不正確さには多少影響を受けない

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

先行による乗算は、.01最後のステップで行われます。その時点まで、すべての計算は整数で行われます。つまり、を.01省略した場合、正確な結果が得られますが、ドルではなくセントで表されます。もちろん、floatによる乗算は、全体をfloatに変換します。前述のように、64ビットに収まるほど小さく、かつに正確である必要があり.01ます。


2

05AB1E、64 58 51バイト

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

説明しました

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

オンラインでお試しください


1

Perl 5、73バイト

明白な解決策。72バイト、およびの-ne代わりに1 -e

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

LLlAMnYPのおかげで5バイト節約されました。ありがとう!


私の以前のコメントについて、この編集は、元の浮動小数点エラーを実際に排除することがわかりました。
LLlAMnYP 2016年

@LLlAMnYP、入力の十分に高い値に対しては、どのような近似でも確かにエラーが発生するはずです。うまくいけば、その境界はOPが気にしないほど十分に高い(1人の住居には不当な量の水であるため)。
msh210 2016年

@ msh210フレッドの話を知らない!!

いいえ、有限の10進表現で数値を乗算およ​​び加算しているためです。もちろん、それらを浮動小数点数として表すと、それほど大きくないバイナリ表現になる可能性があります。float表現で小数点以下3桁から4桁までしか使用できない場合は、エラーが発生する可能性があります。私の投稿の下部にある「ボーナスの答え」はこれを克服し、最後のステップ(セントをドルに変換する)まで整数を使用します。による乗算を省略した場合.01、整数を格納できる限り、精度は維持されます。
LLlAMnYP 2016年

1

Oracle SQL 11.2、151バイト

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;

ゴルフなし

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

SELECTとの間のスペースを削除して、((DECODE1バイトを節約します。名前付きテーブルを使用してさらに10バイト節約します!7コロンを削除し、1文字の列名と3文字の1文字のテーブル名を使用します。
Giacomo Garabello

@Giacomo Garabello:スペースを削除すると、常にヒキガエルではnullが返され、SQLDeveloperではエラーが返されます。テーブル作成スクリプトは、10バイト以上を追加します。
Jeto、2016年

作成スクリプトを追加する必要はありません... こちらをご覧ください
Giacomo Garabello

1

JavaScript ES6、77バイト

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

ゴルフなし

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係数とPBOP係数を考慮に入れました。追加で1.5%が最後に追加されます。

おそらくゴルフの点では最も効率的なソリューションではありませんが、Perlのソリューションとは多少異なります。

浮動小数点エラーは数値が大きいほど発生し、各係数に1バイトまたは2バイトを追加することで修正できます。

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


あなたは必要ありません()周りのをx>10?:?:右から左に関連付けられます。かっこを掛け算することで、バイトを節約することもできると思います(例:(x-10)*4.154598+39.05314equals x*4.154598-41.54598+39.05314equals)x*4.154598-2.49284
Neil

1

R、52バイト

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

オンラインでお試しください!

以前の回答の0、10、27、10 ^ 6の値に基づいて、線形近似関数を生成します。キャッチ:入力の上限は10 ^ 6です。

approxfun(とecdfstepfunsplinefun、など)の多くの素晴らしい特徴の一つですR


0

VBA、88バイト

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

基本レートとそれ以上の使用の差分レートは5で乗算され、CPUC料金乗数は5で除算されます(0.203)。

VBエディターはEnd Function行を追加します。そのため、端末改行が含まれています。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.