首頁 > 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 表示負斜率:向下和向右
  • 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
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板