首页 > web前端 > js教程 > 共振共线性

共振共线性

Barbara Streisand
发布: 2024-12-29 14:02:18
原创
988 人浏览过

Resonant Collinearity

代码来临 2024 年第 8 天

第 1 部分

我想我明白了。我可以做吗?

据我了解:

  • 对于每对相同的连字
  • 找到一个点 X,其中一个连字是 1N,另一个是 2N - 其中 N 距离 X 有一定距离
  • 只要在网格范围内,就算作答案

这是一个视觉效果:

...........
...........
...X.......
...........
.....Y.....   <---1N from top X, 2N from bottom X
...........
.......Y...   <---2N from top X, 1N from bottom X
...........
.........X.
...........
登录后复制
登录后复制

肉眼可见。

我如何通过算法确定它?

通过算法计算 1N 和 2N

这是示例网格:

............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............
登录后复制
登录后复制

我将重点关注 0:

  • 有四个
  • 坐标为:1,8,2,5,3,7,4,4

比较前两个:

1,8 vs. 2,5

1 row apart
3 col apart

2 possible antinodes:
0,11: 0 = min(1,2) - 1
3,2

For 0,11
0 = min(1,2) - 1
11 = ....
登录后复制
登录后复制

在写作时我意识到我真的需要知道连接这对点的直线的斜率。

这样我就可以知道是否对每个轴进行加法或减法以确定波腹在哪里。

刷新我对斜坡的记忆

公式为:

(y2 - y1) / (x2 - x1)
登录后复制
登录后复制

结果将是以下四种之一:

  • > 0 表示正斜率:向上和向右
  • 0表示水平线
  • 无限意味着垂直线
  • 回到例子:

    1,8 and 2,5
    
    (5 - 8) / (2 - 1) = -3 / 1 = -3
    
    登录后复制
    登录后复制

    什么?负斜率?不,那条线有正斜率!

    哦...我明白了。

    数组索引向上计数,但视觉上正在向下移动。

    我需要反向计算索引。

    而不是这样:

    0 ............
    1 ........0...
    2 .....0......
    3 .......0....
    4 ....0.......
    5 ......A.....
    6 ............
    7 ............
    8 ........A...
    9 .........A..
      ............
      ............
      0123456789
    
    登录后复制
    登录后复制

    我需要这样数:

      ............
      ........0...
    9 .....0......
    8 .......0....
    7 ....0.......
    6 ......A.....
    5 ............
    4 ............
    3 ........A...
    2 .........A..
    1 ............
    0 ............
      0123456789
    
    登录后复制
    登录后复制

    它应该只需要更多的数学知识:

    array length - current row/col index
    
    登录后复制

    我会努力

    对于最上面的 0:

    12 rows
    Row index: 1
    12 - 1 = 11
    
    Column index: 8
    
    Coordinates: 8,11
    
    登录后复制

    对于下一行的 0:

    Row index: 2
    12 - 2 = 10
    
    Column index: 5
    
    Coordinates: 5,10
    
    登录后复制

    还有坡度:

    (10 - 11) / (5 - 8)
       -1     /    -3
             1/3
    
    登录后复制

    正斜率!没错!

    开始编码

    构建天线坐标列表

    一个空对象,填充了嵌套的 for 循环:

    let graph = input.split('\n').map(el => el.split(''))
    let antennas = {}
    for (let y = 0; y < graph.length; y++) {
      for (let x = 0; x < graph[0].length; x++) {
        if (graph[y][x] !== '.') {
          if (!(graph[y][x] in antennas)) {
            antennas[graph[y][x]] = []
          }
          antennas[graph[y][x]].push([graph.length - y,x])
        }
      }
    }
    
    登录后复制

    为示例输入创建此对象:

    {
      '0': [ [ 11, 8 ], [ 10, 5 ], [ 9, 7 ], [ 8, 4 ] ],
      A: [ [ 7, 6 ], [ 4, 8 ], [ 3, 9 ] ]
    }
    
    登录后复制

    看起来棒极了!

    接下来,计算坡度。

    编写一个过于复杂的波腹查找器

    我的作用域函数很简单:

    function getScope(p1,p2) {
      return (p2[0] - p1[0]) / (p2[1] - p1[1])
    }
    
    登录后复制

    它需要两个数组并使用所有四个坐标返回范围。

    在比较所有相似频率坐标对时,我想调用此函数。

    比较发生在这个超级嵌套 for 循环中:

    for (let freq in antennas) {
      let f = antennas[freq]
      for (let i = 0; i < f.length; i++) {
        for (let j = i + 1; j < f.length; j++) {
          // Comparing two antennas of the same frequency
        }
      }
    }
    
    登录后复制

    确认它适用于示例输入:

    [ 11, 8 ] [ 10, 5 ]
    [ 11, 8 ] [ 9, 7 ]
    [ 11, 8 ] [ 8, 4 ]
    [ 10, 5 ] [ 9, 7 ]
    [ 10, 5 ] [ 8, 4 ]
    [ 9, 7 ] [ 8, 4 ]
    [ 7, 6 ] [ 4, 8 ]
    [ 7, 6 ] [ 3, 9 ]
    [ 4, 8 ] [ 3, 9 ]
    
    登录后复制

    九个比较。没错!

    每个的范围?

    谢天谢地,这些看起来也不错。

    现在我认为过于复杂的部分。

    处理所有四种坡度类型

    他们是:

    ...........
    ...........
    ...X.......
    ...........
    .....Y.....   <---1N from top X, 2N from bottom X
    ...........
    .......Y...   <---2N from top X, 1N from bottom X
    ...........
    .........X.
    ...........
    
    登录后复制
    登录后复制

    我们来解决这个问题。

    很多,但每个条款中的微妙之处都很重要:

    ............
    ........0...
    .....0......
    .......0....
    ....0.......
    ......A.....
    ............
    ............
    ........A...
    .........A..
    ............
    ............
    
    登录后复制
    登录后复制

    值得庆幸的是,所有已识别的波腹似乎都放置正确。

    接下来,排除出界的

    排除越界的波腹

    输入...更多条件!

    1,8 vs. 2,5
    
    1 row apart
    3 col apart
    
    2 possible antinodes:
    0,11: 0 = min(1,2) - 1
    3,2
    
    For 0,11
    0 = min(1,2) - 1
    11 = ....
    
    登录后复制
    登录后复制

    我正在检查每个坐标是否在 0 和行或列的长度之间。

    然后,在我的反节点查找器中每个子句的底部,我在两个可能的节点上调用该函数:

    (y2 - y1) / (x2 - x1)
    
    登录后复制
    登录后复制

    我的答案将是我的有效集合的大小。

    这真的有效吗?

    运行它会生成 12。而不是 14。

    为什么不呢?

    ...

    经过一些调试,我发现了错误:

    1,8 and 2,5
    
    (5 - 8) / (2 - 1) = -3 / 1 = -3
    
    登录后复制
    登录后复制

    我在该行的分配中落后了一位。我需要一个减一的值:

    0 ............
    1 ........0...
    2 .....0......
    3 .......0....
    4 ....0.......
    5 ......A.....
    6 ............
    7 ............
    8 ........A...
    9 .........A..
      ............
      ............
      0123456789
    
    登录后复制
    登录后复制

    这解决了问题。

    我现在看到14。

    是时候在我的拼图输入上运行它了。

    ...

    正确答案!!!

    这比我预期的要长得多,但我做到了!

    我只能想象第二部分需要什么。

    咕噜咕噜。

    第2部分

    是的。还有更多的波腹需要识别。

    这感觉比较困难,尽管这可能是一个相对简单的调整。

    是时候考虑一​​下了。

    ...

    对生成正确答案的信心很低

    主要是因为这个陷阱:

    与至少两个相同频率的天线完全一致

    认为我理解这个标准。

    我的预感是,只要任意给定频率存在三个,所有三个天线也是波腹。

    如果我错了,那么这很可能就是我的答案会失败的原因:将天线误认为是波腹。

    但我认为我有一个识别所有新波腹的策略。

    输入:更多 while 循环来走线

    我当前的算法找到两个天线两端的波腹。

    我想沿着线路向两个方向行走,直到我即将出界。

    这需要一些重构。

    我准备好了。

    这是我更新的正斜率线的条件:

      ............
      ........0...
    9 .....0......
    8 .......0....
    7 ....0.......
    6 ......A.....
    5 ............
    4 ............
    3 ........A...
    2 .........A..
    1 ............
    0 ............
      0123456789
    
    登录后复制
    登录后复制

    发生了什么变化:

    • 我预先做一次数学
    • 在 while 循环内添加坐标,然后我只需按相应的 diff 递增或递减每个坐标
    • 条件使用我更新的函数,该函数返回布尔值而不是自动添加坐标

    我必须为每个子句执行此操作。

    我稍微弄乱了一个,这导致我使用示例输入得到了相差 1 的答案,并看到了一个非常奇怪的网格,这帮助我诊断了哪个子句发生了故障。

    最终,我让它在示例输入上工作。

    然后我在我的拼图输入上运行它。

    还有...

    我生成了正确答案!!!

    我为自己感到骄傲!

    我非常感激我的谜题输入中没有出现任何偷偷摸摸的边缘情况!

    哇,这需要几天的被动思考才能解决。

    又一个拥有两颗来之不易的金星的日子。

    以上是共振共线性的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板