JavaScript实现机器人模拟器:如何在指令遍历中添加x,y坐标计算
机器人模拟器坐标同步计算实现
现有代码的核心问题
- 指令遍历循环中完全没有处理
A(前进)指令的分支,x、y虽然初始化为0,但全程没有被修改过 - 连续写了两个
return语句,第一个return d执行后,后面的坐标返回逻辑永远不会触发 - 仅通过计数器算出了朝向,没有建立「当前朝向」和「坐标位移」的对应关系,就算补了前进逻辑也不知道该对x还是y做加减
- 换行校验的位置错误,把判断首字符是否为换行的逻辑放在循环内反复执行,属于无效冗余
具体改造步骤
- 将入参校验逻辑挪到函数最开头,进入循环前先判断入参合法性,不符合要求直接返回null
- 预先定义四个基础方向和对应位移的映射关系,避免写大量重复的if判断:
- 朝向
North前进:y坐标+1 - 朝向
East前进:x坐标+1 - 朝向
South前进:y坐标-1 - 朝向
West前进:x坐标-1
- 朝向
- 优化转向计数逻辑,原来分正负计数器写两套判断的写法太冗余,直接在计算时通过模4归一将计数器值锁定在0-3范围,同时规避JS原生负数取模的坑:左转时计数器减1,计算时补4再取模;右转时计数器加1再取模
- 在循环中补全
A指令的处理分支:遇到前进指令时,根据当前计数器对应的方向,把对应位移叠加到x、y坐标上即可,不需要额外二次遍历指令 - 删掉冗余的重复return,最后按照要求的格式拼接结果字符串返回
修正后的可运行代码
function robotSimulator(param){ // 入参校验 if(!param || param[0] === "\n") return null; let counter = 0; // 方向索引:0=North、1=East、2=South、3=West let x = 0; let y = 0; // 预定义每个方向对应的位移偏移 const directionMap = [ { name: "North", dx: 0, dy: 1 }, { name: "East", dx: 1, dy: 0 }, { name: "South", dx: 0, dy: -1 }, { name: "West", dx: -1, dy: 0 } ]; for(let i = 0; i < param.length; i++){ const cmd = param[i]; if(cmd === 'L'){ // 补4是为了避免负数取模异常,把值固定在0-3区间 counter = (counter - 1 + 4) % 4; } else if(cmd === 'R'){ counter = (counter + 1) % 4; } else if(cmd === 'A'){ // 前进指令触发时同步更新坐标 const currentDir = directionMap[counter]; x += currentDir.dx; y += currentDir.dy; } } const finalBearing = directionMap[counter].name; return `x: ${x} y:${y} bearing:${finalBearing}`; } // 测试指令"LLRAA",预期输出x: -2 y:0 bearing:West console.log(robotSimulator("LLRAA")); console.log(robotSimulator("RRLLL"));
实现效果
整个流程顺着指令遍历同步计算坐标,没有额外性能损耗;连续转向、多轮绕圈的场景也不会因为计数器越界算错方向,完全匹配题目给出的规则示例输出。
内容的提问来源于stack exchange,提问作者Asante Michael
相关产品推荐
相关产品推荐

