問題
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
例
入力:
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。
入力:
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用に調整されています。上記の説明と制約に従ってください。