题解 | #自动售货系统#
自动售货系统
https://www.nowcoder.com/practice/cd82dc8a4727404ca5d32fcb487c50bf
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; /** * 自动售货机中商品为6种商品 * 商品数由 [初始化命令] 设置 */ var items = { "A1":{price: 2, amount: 0}, "A2":{price: 3, amount: 0}, "A3":{price: 4, amount: 0}, "A4":{price: 5, amount: 0}, "A5":{price: 8, amount: 0}, "A6":{price: 6, amount: 0} } /** * 存钱盒内放置1元、2元、5元、10元钱币 * [初始化命令] 设置各种面额钱币张数 */ var moneyBox = new Map(); moneyBox.set(10, 0); moneyBox.set(5, 0); moneyBox.set(2, 0); moneyBox.set(1, 0); var balance = 0; /** * 投币、购买商品、退币、查询库存商品及存钱盒信息 */ void async function () { // Write your code here while(line = await readline()){ // 命令字与第一个参数间使用一个空格分隔,多条命令采用分号隔开 let cmds = line.trim().split(';'); // let cmds = ["aada"] for(let cmd of cmds){ if(cmd === "") continue; let split = cmd.indexOf(' '); let op = "" let data = "" if(split === -1){ op = cmd; data = undefined } else{ op = cmd.substring(0, split); data = cmd.substring(split + 1); } console.log(runCommand(op, data)); // console.log(`${op}|${data}`) } } }() function runCommand(op, data){ switch(op){ case "r": return init(data); case "p": return pay(data); case "b": return buy(data); case "c": return cancel(); case "q": return query(data); default: return "E010:Parameter error"; } } // r 22-18-21-21-7-20 3-23-10-6; function init(data){ let temp = data.split(' '); let itemAmounts = temp[0].split('-'); let moneyAmounts = temp[1].split('-'); itemAmounts.forEach((val, i)=>{itemAmounts[i] = parseInt(val)}); moneyAmounts.forEach((val, i)=>{moneyAmounts[i] = parseInt(val)}); // 物品数量 for(let i = 1; i <= 6; i++){ items[`A${i}`].amount = itemAmounts[i-1]; } // 钱币数量 moneyBox.set(1, moneyAmounts[0]); moneyBox.set(2, moneyAmounts[1]); moneyBox.set(5, moneyAmounts[2]); moneyBox.set(10, moneyAmounts[3]); return "S001:Initialization is successful"; } // 2.2 投币 | p 1; function pay(data){ let amount = parseInt(data); // 投入非1元、2元、5元、10元的钱币面额(钱币面额不考虑负数、字符等非正整数的情况) if(amount !== 1 && amount !== 2 && amount !== 5 && amount !== 10){ return "E002:Denomination error"; } /** * 1元和2元面额钱币总额小于本次投入的钱币面额 * 投入1元和2元面额钱币不受此限制 */ if((amount === 5 || amount === 10) && moneyBox.get(1) + moneyBox.get(2)*2 < amount){ return "E003:Change is not enough, pay fail"; } // 商品全部销售完毕,投币失败 let empty = true; for(let item in items){ if(items[item].amount !== 0){ empty = false; break; } } if(empty) return "E005:All the goods sold out"; // 投币成功 balance += amount; moneyBox.set(amount, moneyBox.get(amount) + 1); return `S002:Pay success,balance=${balance}`; } // 2.3 购买商品 b A1 function buy(data){ // 购买的商品不在商品列表中 let itemInfo = items[data]; if(itemInfo === undefined){ return "E006:Goods does not exist"; } // 购买的商品的数量为0 if(itemInfo.amount === 0){ return "E007:The goods sold out"; } // 投币余额小于待购买商品价格 if(itemInfo.price > balance){ return "E008:Lack of balance"; } /** * 购买成功 * 购买商品成功后,自动售货机中对应商品数量减1,投币余额扣除本次购买商品的价格。 */ items[data].amount--; balance -= itemInfo.price; return `S003:Buy success,balance=${balance}`; } function cancel(){ // 投币余额等于0 if(balance === 0) return "E009:Work failure"; // 投币余额大于0 // 按钱币总张数最少的原则进行退币 let ps = [10, 5, 2, 1]; let res = []; for(let p of ps){ let count = 0; while(moneyBox.get(p) > 0 && balance >= p){ count++; balance-=p; moneyBox.set(p, moneyBox.get(p) - 1); } res.push(`${p} yuan coin number=${count}`); } return res.reverse().join('\n'); } function query(data){ let res = []; if(data === '0'){ for(let i = 1; i <= 6; i++){ let name = `A${i}` res.push(`${name} ${items[name].price} ${items[name].amount}`) } } else if(data === "1"){ res.push(`1 yuan coin number=${moneyBox.get(1)}`); res.push(`2 yuan coin number=${moneyBox.get(2)}`); res.push(`5 yuan coin number=${moneyBox.get(5)}`); res.push(`10 yuan coin number=${moneyBox.get(10)}`); } else{ return "E010:Parameter error"; } return res.join('\n'); }