簡単 0件解決済み 正答率0%

価格デコレーター

割引、税、送料、クーポンのデコレーターを順に適用して、基準価格を包む。

このチャレンジで学べること

  • 値の周りに振る舞いを層として重ねる
  • パーセントを正しい順番で適用する
  • 値が 0 を下回らないように抑える

問題

原文(英語)を表示

decorator パターンは、オブジェクトを層で包むことで振る舞いを追加します。ここでは各層が、その内側の層の価格を変えます。

base_price から始めて、次の順にデコレーターを適用してください。

  • discount p: 価格を p パーセント下げる。
  • tax p: 価格を p パーセント上げる。
  • shipping a: 固定額 a を加える。
  • coupon a: a を引く。ただし 0 未満にはしない。

price_decorators(base_price, decorators) を実装してください。

Input

base_price: 開始価格。

decorators: 価格を包む順番で与えられる層。金額には小数が含まれることがあります。

Output

最終価格を返してください。1e-6 以内の誤差は स्वीकारされます。

制約

0 ≤ base_price ≤ 1,000,000

0 ≤ デコレーターの数 ≤ 100; 0 ≤ p ≤ 100, 0 ≤ a ≤ 100,000

例

例 1
入力:
base_price = 100
decorators = ["discount 10", "tax 8", "shipping 5"]

期待される出力:
expected = 102.2
入力:
long long base_price = 100;
std::vector<std::string> decorators = {"discount 10", "tax 8", "shipping 5"};

期待される出力:
double expected = 102.2;
入力:
long base_price = 100;
string[] decorators = new string[] {"discount 10", "tax 8", "shipping 5"};

期待される出力:
double expected = 102.2;

解説

100 − 10% = 90、税 8% を加えて 97.2、送料 5 を加えて 102.2。

例 2
入力:
base_price = 20
decorators = ["coupon 25", "shipping 4"]

期待される出力:
expected = 4.0
入力:
long long base_price = 20;
std::vector<std::string> decorators = {"coupon 25", "shipping 4"};

期待される出力:
double expected = 4.0;
入力:
long base_price = 20;
string[] decorators = new string[] {"coupon 25", "shipping 4"};

期待される出力:
double expected = 4.0;

解説

クーポンは価格を 0 未満にしようとしますが、0 で止まります。その後 shipping により 4 になります。

解き方のヒント

まずは自分で考えてから、ヒントを 1 つずつ開いてみましょう。

ヒント 1

与えられた順番どおりに層を適用します。

ヒント 2

パーセントは元の価格ではなく現在の価格に対してかかります。

ヒント 3

クーポンで価格が 0 を下回ることはありません。

目安の計算量

時間 O(デコレーターの数)、追加メモリ O(1)

参考資料

この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。