Node.js算法揭秘:如何在二维网格中操控小人?

时间:2025-01-31 23:53 分类: js教程

前言

在数字化时代,编程不仅是一种技能,更是一种艺术。今天,我们将一起探索如何用Node.js编写一个简单的算法,让一个小人在一个二维网格上移动。这个小人只能读取并执行上下左右移动的指令,最终输出它的最终坐标。准备好了吗?让我们开始吧!

一、初始化与指令解析

首先,我们需要定义一个无限大的二维网格,并将小人的初始位置设定为(0,0)点。接下来,我们要解析输入的指令序列。每个指令由三至四个符号组成:方向("A/D/W/S")和距离(1-99的数字),最后以分号(;)结尾。

const readline = require("readline").createInterface({
  input: process.stdin
});

const parseInstruction = (line) => {
  const parts = line.split(";").map(part => part.trim());
  if (parts.length < 3 || !["A", "D", "W", "S"].includes(parts[0]) || isNaN(parts[1])) {
    return false;
  }
  return { direction: parts[0], distance: parseInt(parts[1]) };
};

二、指令验证与执行

在解析指令后,我们需要验证指令的合法性。如果指令不合法,我们直接忽略它。合法的指令包括一个方向和一个距离。

const isValidInstruction = (instruction) => {
  return (
    ["A", "D", "W", "S"].includes(instruction.direction) &&
    instruction.distance >= 1 &&
    instruction.distance <= 99
  );
};

接下来,我们根据指令的方向更新小人的坐标。向左移动减坐标,向上移动加坐标,向下移动减坐标,向右移动加坐标。

const movePerson = (x, y, direction, distance) => {
  switch (direction) {
    case "A":
      x -= distance;
      break;
    case "D":
      x += distance;
      break;
    case "W":
      y -= distance;
      break;
    case "S":
      y += distance;
      break;
  }
  return { x, y };
};

三、计算最终坐标并输出结果

最后,我们将所有合法指令的执行结果累加起来,得到小人的最终坐标,并输出。

const calculateFinalPosition = (instructions) => {
  let x = 0, y = 0;
  for (const instruction of instructions) {
    if (isValidInstruction(instruction)) {
      const { direction, distance } = parseInstruction(instruction);
      x = movePerson(x, y, direction, distance).x;
      y = movePerson(x, y, direction, distance).y;
    }
  }
  return `${x},${y}`;
};

四、完整代码示例

将上述所有步骤整合在一起,我们得到以下完整的Node.js代码:

const readline = require("readline").createInterface({
  input: process.stdin
});

const parseInstruction = (line) => {
  const parts = line.split(";").map(part => part.trim());
  if (parts.length < 3 || !["A", "D", "W", "S"].includes(parts[0]) || isNaN(parts[1])) {
    return false;
  }
  return { direction: parts[0], distance: parseInt(parts[1]) };
};

const isValidInstruction = (instruction) => {
  return (
    ["A", "D", "W", "S"].includes(instruction.direction) &&
    instruction.distance >= 1 &&
    instruction.distance <= 99
  );
};

const movePerson = (x, y, direction, distance) => {
  switch (direction) {
    case "A":
      x -= distance;
      break;
    case "D":
      x += distance;
      break;
    case "W":
      y -= distance;
      break;
    case "S":
      y += distance;
      break;
  }
  return { x, y };
};

const calculateFinalPosition = (instructions) => {
  let x = 0, y = 0;
  for (const instruction of instructions) {
    if (isValidInstruction(instruction)) {
      const { direction, distance } = parseInstruction(instruction);
      x = movePerson(x, y, direction, distance).x;
      y = movePerson(x, y, direction, distance).y;
    }
  }
  return `${x},${y}`;
};

const rl = readline.createInterface({
  input: process.stdin
});

const readLine = async () => (await rl.next()).value;

(async function main() {
  const instructions = await readLine();
  const finalPosition = calculateFinalPosition(instructions);
  console.log(finalPosition);
})();

结语

通过这个简单的Node.js算法,我们不仅学会了如何在二维网格中操控一个小人,还深入理解了算法的基本结构和逻辑。希望这篇文章能为你带来启发,让你在编程的道路上更进一步!

声明:

1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。

2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。

3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。

4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。

本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 0人参与,0条评论
查看更多

Copyright 2005-2024 yuanmayuan.com 源码园 版权所有 备案信息

声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告