据我了解:
这是一个视觉效果:
........... ........... ...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.. ............ ............
我将重点关注 0:
比较前两个:
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)
结果将是以下四种之一:
回到例子:
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。
是时候在我的拼图输入上运行它了。
...
正确答案!!!
这比我预期的要长得多,但我做到了!
我只能想象第二部分需要什么。
咕噜咕噜。
这感觉比较困难,尽管这可能是一个相对简单的调整。
是时候考虑一下了。
...
主要是因为这个陷阱:
与至少两个相同频率的天线完全一致
我认为我理解这个标准。
我的预感是,只要任意给定频率存在三个,所有三个天线也是波腹。
如果我错了,那么这很可能就是我的答案会失败的原因:将天线误认为是波腹。
但我认为我有一个识别所有新波腹的策略。
我当前的算法找到两个天线两端的波腹。
我想沿着线路向两个方向行走,直到我即将出界。
这需要一些重构。
我准备好了。
这是我更新的正斜率线的条件:
............ ........0... 9 .....0...... 8 .......0.... 7 ....0....... 6 ......A..... 5 ............ 4 ............ 3 ........A... 2 .........A.. 1 ............ 0 ............ 0123456789
发生了什么变化:
我必须为每个子句执行此操作。
我稍微弄乱了一个,这导致我使用示例输入得到了相差 1 的答案,并看到了一个非常奇怪的网格,这帮助我诊断了哪个子句发生了故障。
最终,我让它在示例输入上工作。
然后我在我的拼图输入上运行它。
还有...
我生成了正确答案!!!
我为自己感到骄傲!
我非常感激我的谜题输入中没有出现任何偷偷摸摸的边缘情况!
哇,这需要几天的被动思考才能解决。
又一个拥有两颗来之不易的金星的日子。
以上是共振共线性的详细内容。更多信息请关注PHP中文网其他相关文章!