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 即可
全部评论

相关推荐

头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务