# 問題 商品名と支払い金額を入力すると、お釣りの「小銭の枚数」を返す関数またはメソッドを実装せよ。 商品名と価格は以下の通り。 - お茶: 120円 - コーラ: 150円 - エナジードリンク: 280円 入力される通貨は日本円で、最大1000円までとする。 また、有効な貨幣は「1000円」「500円」「100円」「50円」「10円」とする。 たとえば、「1000円でお茶を購入」すると、返却すべき金額は880円だが、釣銭は「500円×1, 100円×3, 50円×1, 10円×3」となる。 返り値は、この関数が他のエンジニアにより使われることを考慮し、使いやすい値とすること。 PHPの擬似コードで書くと以下のようになる。 ```php function calcChange(string $item, int $paid_money): array { // ... } $expected = [500 => 1, 100 => 3, 50 => 1, 10 => 3]; assert($expected === calcChange("お茶", 1000)); ``` --- ```typescript= export type Coins = 500 | 100 | 50 | 10; export type Change = Map<Coins, int>; const _item = {"お茶": 120, "コーラ": 150, "エナジードリンク": 200}; export const Change = { items: _item, calcChange: function(item_name: string, paid_money: number): Change { if(_item[item_name] === undefined) { throw Error("unexpected item"); } let return_cost = paid_money - _item[item_name]; if (return_cost < 0) { throw Error(`cannot buy item ${string}`); } const ret = {}; const coins = [500, 100, 50, 10]; for(coin of coins) { ret[coin] = Math.floor(return_cost / coin); return_cost -= coin * ret[coin]; } return ret; } } ```