JavaScript题解 | #坐标移动#
坐标移动
https://www.nowcoder.com/practice/119bcca3befb405fbe58abe9c532eb29
const rl = require("readline").createInterface({ input: process.stdin, output: process.stdout, }); rl.on("line", (line) => { // 1. 得到有效指令 const directives = handleInput(line); // 2. exec执行指令,返回最终坐标 const initPost = { x: 0, y: 0 }; const res = exec(directives, initPost); // 3. 输出 const { x, y } = res; console.log(`${x},${y}`); }); // 2. 执行指令 function exec(directives, currentPos) { let pos = currentPos; for (let i = 0; i < directives.length; i++) { const _directive = directives[i]; // 方向 const dir = _directive[0]; // 步数 const step = parseInt(_directive.slice(1)); pos = walk(dir, step, pos); } return pos; } function walk(dir, step, pos) { // 要留意,保存位置的另一个坐标信息 let targetPos = { x: pos.x, y: pos.y }; if(dir === 'A') { targetPos.x = pos.x - step; } else if(dir === 'S') { targetPos.y = pos.y - step; } else if(dir === 'D') { targetPos.x = pos.x + step; } else { targetPos.y = pos.y + step; } return targetPos; } // 1. 处理输入数据 简单的正则匹配 // 注意:要清除是否添加g带来的影响 function handleInput(input) { const directives = input.split(";"); const reg = /^[AWSD]\d{1,2}$/; const validate = directives.filter((i) => reg.test(i)); return validate; }
难度:⭐⭐
这道题是个过程行为模拟题,综合难度中下。
只需要弄清几个步骤
- 过滤输出,得到有效的指令
- 执行指令,wasd 对坐标的 x,y 进行对应的加减
- 指令包含两部分 WASD 控制方向,后边两位数以内代表步长
- 明白/^[AWSD]\d{1,2}$/g 和 /^[AWSD]\d{1,2}/ 的区别,这道题的正则匹配就没问题了。
- 计算步长的时候,要留意不要将另外一个坐标值弄丢了。因为写代码的时候你可能只顾着一个方向的值,对另一个坐标值忽略了,引起了致命的错误。
- 按题目要求输出最终的坐标 x,y 即可