據我了解:
這是一個視覺效果:
........... ........... ...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中文網其他相關文章!