加里凡特卫兵

加里凡特卫兵

代码来临 2024 年第 6 天

第 1 部分

一种非常熟悉的谜题

二维网格到处都有障碍追踪路径计算访问过的独特图块

让我们开始吧!

一次一步

解析网格:

let grid = input.split('n').map(el => el.split(''))

识别守卫的起始位置并将其替换为空图块:

let guard = null;for (let r = 0; r < grid.length; r++) {  for (let c = 0; c < grid[0].length; c++) {    if (grid[r][c] == "^") {      guard = [r, c];      grid[r][c] = ".";    }  }}

创建一个对象来跟踪守卫当前的旋转:

let facing = [  [-1,0],  [0,1],  [1,0],  [0,-1]]

守卫开始面向北,因此后续移动需要访问较小索引的行遇到每个障碍物,警卫必须右转这将使她面朝东方,因此后续移动需要访问更大指数的列每次下一个单元格成为障碍物时,我的算法都会从列表中拉出第一项并将其移到后面

跟踪访问的单元格:

let visited = new set()

每次移动时,我都会尝试将字符串化坐标添加到此 set() 中。

移动守卫:

while (true) {  visited.add(guard.join(","));  let next = [guard[0] + facing[0][0], guard[1] + facing[0][1]];  if (    next[0] >= 0 &&    next[0] = 0 &&    next[1] < grid[0].length  ) {    if (grid[next[0]][next[1]] == ".") {      guard = next;      console.log(guard);    } else if (grid[next[0]][next[1]] == "#") {      let olddirection = facing.shift();      facing.push(olddirection);    }  } else {    break;  }}

解释:

keep going until manually broken out of  add the current coordinate to the tracked list  record the next location to visit  if it is within the grid    if it is empty cell      move the guard    else if it is an obstacle      rotate the guard  else    break out of the loop

该算法成功为示例输入生成了 41 个已访问单元格列表!

它会为我的拼图输入生成正确的答案吗?

是的!!!

太棒了。

进入第二部分!

第2部分

我有点预见到了这一点,并且很害怕它

老兄,检查每个可能的选项以获得一个有效的谜题。

阅读时我最大的问题是:

如何识别守卫何时进入循环?

但我想我知道:

我会追踪朝向以及坐标如果列表包含下一个添加的副本,则循环即将开始

是时候让事情变得更加复杂了!

循环遍历每个单元格以找到所有循环

首先,我想生成一个包含 . 的所有单元格的列表,不包括守卫的起始单元格:

let empties = [];for (let r = 0; r < grid.length; r++) {  for (let c = 0; c < grid[0].length; c++) {    if (grid[r][c] == ".") {      empties.push([r, c]);    }    if (grid[r][c] == "^") {      guard = [r, c];      grid[r][c] = ".";    }  }}

然后,使用reduce 来迭代每个 .在网格中,复制网格和原始防护位置,在reduce内移动大量原始代码,扩展while循环以包含具有当前状态实例的跟踪坐标和旋转列表的条件:

let part2 = empties.reduce((count, coord) => {    let guardCopy = guard.slice()    let gridCopy = grid.map(row => row.slice())    gridCopy[coord[0]][coord[1]] = "#"    let facing = [        [-1,0],        [0,1],        [1,0],        [0,-1]      ]    let visited = new Set()    while (true) {        let stamp = guardCopy.join(',') + facing[0].join(',')        if (visited.has(stamp)) {            count++            break;        } else {            visited.add(stamp);            let next = [guardCopy[0] + facing[0][0], guardCopy[1] + facing[0][1]]            if (              next[0] >= 0 &&              next[0] = 0 &&              next[1] < gridCopy[0].length            ) {              if (gridCopy[next[0]][next[1]] == ".") {                guardCopy = next;              } else if (gridCopy[next[0]][next[1]] == "#") {                let oldDirection = facing.shift();                facing.push(oldDirection);              }            } else {              break;            }        }    }    return count}, 0)

很多。

但是它有效!至少在示例输入上。

它对我有用吗???

嗯…运行了 30 秒。

但是…它产生了答案!

这是…

正确答案!!!

呜呼!!!

第 1 部分很容易。第 2 部分是一个艰难但受欢迎的规模提升。

袋子里还有两颗金星!

进入第 7 天。

以上就是加里凡特卫兵的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1499395.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 21:45:06
下一篇 2025年12月19日 21:45:18

相关推荐

  • The Evolution of C++: A Journey Through Time

    C++ 是软件开发中最具影响力的编程语言之一,以其高级编程能力和低级系统控制之间的平衡而闻名。经过四十年的发展,它的旅程是在快速发展的技术环境中适应、创新和恢复力的故事。 C++ 的诞生C++ 由 Bjarne Stroustrup 在贝尔实验室于 1983 年创建。它最初被命名为“C with C…

    2025年12月19日
    000
  • 我的软件工程之旅#调试、Docker 和成长

    自从我上一篇文章以来,这是一场旋风,我想分享我一直在做的事情、我学到的东西以及我的前进方向。过去的几个月充满了作为软件工程师成长的机会,虽然充满挑战,但我为自己取得的进步感到自豪。 泄漏测试设备项目进展我们的泄漏测试设备项目即将完成。我一直在努力理解代码库并尽我所能做出贡献。虽然我的贡献主要集中在测…

    2025年12月19日
    000
  • TypeScript 与 JavaScript:哪一个更好?

    随着对现代 Web 应用程序的需求不断增长,开发人员经常发现自己在项目中在 TypeScript 和 JavaScript 之间争论。虽然两者都是前端和后端开发不可或缺的一部分,但它们的用途略有不同。但您如何决定使用哪一个呢?本博客探讨了 TypeScript 和 JavaScript 的主要区别、…

    2025年12月19日
    000
  • Choosing Your Tech Stack: A Developer&#s Journey

    当我第一次踏上编码之旅时,我对可用的编程语言和技术堆栈的数量感到不知所措。感觉就像走进一个广阔的图书馆,每本书都承诺一次不同的冒险,但我不知道从哪里开始。 最初的困惑 作为编码世界的新手,我对不同语言的潜力、各种技术堆栈以及与不同编码相关工作相关的职责知之甚少。我记得我盯着 JavaScript、P…

    2025年12月19日
    000
  • VSCode内置了哪些编程语言插件?

    vscode 内置语言插件一览 VSCode 已内置多款语言插件,免除安装市场插件的步骤。以下是如何查看内建语言插件: 快捷键 Ctrl+Shift+P 唤出命令窗口输入并选择 “Show Built-in Extensions”左侧出现的 “Programmin…

    2025年12月19日
    000
  • VSCode内置了哪些语言插件?如何查看它们?

    VSCode 的内置语言插件大盘点 VSCode 以其扩展性着称,可以通过安装各种插件来增强其功能。然而,大家可能不知道,VSCode 已自带了一些内置语言插件,无需额外下载。 如何查看内置插件? 要查看内置语言插件列表,请执行以下步骤: 1.按住 Ctrl+Shift+P 唤出命令窗口。 2.输入…

    2025年12月19日
    000
  • Node.js 内部结构

    假设你去一家餐厅,有一位厨师承诺“我可以同时为数百人做饭,而你们不会挨饿”,听起来不可能,对吧?您可以将这个单一检查视为 node js,它管理所有这些多个订单,并且仍然为所有顾客提供食物。 每当你问某人“什么是 node js?”时,人们总是得到答案“node js 是一个运行时,用于在浏览器环境…

    2025年12月19日
    000
  • Vue 打包项目在 WebView2 中接收 C# 数据失败:如何排查和解决?

    如何排查和解决 vue 打包项目在 webview2 中接收 c# 数据失败的问题 在 webview2 中集成 vue 打包项目时,常会出现无法接收 c# 发送数据的现象。以下将分析可能的原因和提供相应的解决方法。 问题描述 在您的案例中,当使用 test.html 时,您可以正常接收 c# 发送…

    好文分享 2025年12月19日
    000
  • WebView2 无法接收打包 Vue 项目数据:如何解决 C# 与 Vue 项目通信问题?

    webview2 无法接收打包 vue 项目发送的数据 在使用 webview2 嵌入 vue 项目时,开发者可能会遇到无法接收 c# 传输的数据的问题。要解决此问题,首先需要检查 webview2 控件加载的 html 页面的正确性。 一般来说,如果在加载独立的 html 页面(例如 test.h…

    2025年12月19日
    000
  • WebView2 中 Vue 打包项目接收不到 C# 数据,如何解决?

    如何在 webview2 中解决 vue 打包项目未收到 c# 发送数据的排查和解决 您在 windows c# 项目中使用 vue 打包项目,目标是让 vue 页面在打开时使用 webview2 从 c# 传递的设备列表数据。但是在使用 vue 打包后的 index.html 文件时,无法收到 c…

    2025年12月19日
    000
  • WebView2 中 Vue 项目无法接收 C# 消息:如何解决 Vue 项目加载延迟导致消息接收失败的问题?

    webview2 中 vue 项目无法接收 c# 消息的排查 在 vue 打包项目与 webview2 集成时,你遇到了 vue 项目无法接收来自 c# 发送的数据的问题。让我们深入分析这个问题并提供解决方案。 c# 代码中,你使用的 corewebview2.webmessagereceived …

    2025年12月19日
    000
  • Cypress 与 Selenium:流行测试框架的比较

    Cypress 和 Selenium 是两种最流行的 Web 应用程序测试工具。每个都有其优势和特定的用例,因此根据项目要求、团队技能和测试目标在它们之间进行选择是一个关键决策。本文探讨了 Cypress 与 Selenium 的主要区别、优点和局限性,以帮助您选择适合您的测试需求的工具。 Cypr…

    2025年12月19日
    000
  • 深入探讨 JavaScript 的原型链和函数的基础作用

    javasc++ript 采用独特的继承方法,与 java 或 c++ 等传统的面向对象语言不同。 javascript 使用基于原型的继承模型,而不是依赖基于类的继承。该模型以语言的函数及其原型属性为基础,构成了对象如何继承行为的基础。为了理解为什么 javascript 的继承是这样设计的,以及…

    2025年12月19日
    000
  • JavaScript 方法传参如何避免 undefined 值?

    在 javascript 中指定方法传参 在 javascript 中,无法像其他编程语言(例如 c#)中那样使用默认参数来指定方法的传参。对于没有指定参数值的参数,javascript 会将其赋值为 undefined。 解决此问题的替代方法是使用对象来表示参数,这种方式与使用默认参数类似,但不会…

    2025年12月19日
    000
  • JavaScript如何简洁地获取当天零点的日期?

    如何用简洁的 javascript 代码获取当天零点的日期 获取当天零点的日期是一个在开发中经常遇到的问题。在 c# 中,可以通过 datetime.now.date 简洁地实现。那么,在 javascript 中,我们如何用简洁的代码实现相同的功能呢? 最初,开发者们找到了以下多行代码的解决方案:…

    2025年12月19日
    000
  • js如何调用node.js

    在 JS 中调用 Node.js 可以通过以下方法实现:使用 require() 函数直接调用 Node.js 模块;使用 Node-API 创建 Node.js 模块并使用 import 导入;使用 Worker 线程在单独线程运行 Node.js 代码;使用 Electron 框架在桌面应用程序…

    2025年12月19日
    000
  • typescript使用场景是什么

    TypeScript 适用于以下场景:大型 JavaScript 应用程序开发,提高代码质量和维护性。团队协作,提供类型检查和代码智能提示,减少潜在错误。现有 JavaScript 代码库重构,逐步提升代码质量。开发框架和库,提供可靠、可重用的 TypeScript 代码。移动和 Web 应用程序开…

    2025年12月19日
    000
  • JS 闭包详解:为什么闭包的表达式是两个连续的括号?

    js闭包详解:为什么闭包的表达式是连续两个括号? 作为从c++++/java转来的开发人员,了解js的闭包机制可能不太习惯。js中的闭包表达式使用连续两个括号,似乎让人摸不着头脑。本文将深入解释闭包的原理和这种表达形式的规范。 闭包的定义 闭包是一个函数,当执行完毕后仍然保留着对执行环境的访问。这种…

    2025年12月19日
    000
  • Ubuntu下没有HBuilder怎么办?Vscode 是你的最佳选择吗?

    Ubuntu下的HBuilder替代品 想要寻找一款类比HBuilder的集成开发环境(IDE)?别担心,即使在Ubuntu系统中,也有一些出色的选择。 虽然目前尚未发现与HBuilder完全相似的替代品,但开发者推荐的强大编辑器Vscode是您不错的选择。Vscode拥有丰富的功能,可以满足您的开…

    2025年12月19日
    000
  • JavaScript 中的闭包:连续双括号的奥秘

    JS中的闭包疑问:连续双括号的疑惑 作为一名从C++/Java转向JS的开发者,想必你对JS中的闭包概念感到困惑,尤其是不理解为什么需要连续使用两个括号。 首先,函数后面的圆括号用于调用该函数。因此,在声明函数时在圆括号中编写的是立即调用函数表达式(IIFE)。每个函数都会生成一个新的作用域。 当一…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信