> 웹 프론트엔드 > JS 튜토리얼 > 공명 공선성

공명 공선성

Barbara Streisand
풀어 주다: 2024-12-29 14:02:18
원래의
988명이 탐색했습니다.

Resonant Collinearity

2024 코드의 출현 8일차

1부

알 것 같아요. 내가 할 수 있을까?

내가 이해한 바:

  • 동일한 합자의 각 쌍에 대해
  • 하나의 합자가 1N이고 다른 하나가 2N인 점 X를 찾습니다. 여기서 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])
    }
  }
}




<p>예제 입력을 위해 다음 개체를 생성합니다.<br>
</p>

<pre class="brush:php;toolbar:false">{
  '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])
}
로그인 후 복사

2개의 배열을 예상하고 4개의 좌표를 모두 사용하여 범위를 반환합니다.

모든 유사 주파수 좌표 쌍을 비교할 때 이 함수를 호출하고 싶습니다.

이 비교는 슈퍼 중첩 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 ]
로그인 후 복사

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부터 행이나 열의 길이 사이인지 확인 중입니다.

그런 다음 antinode-finder의 각 절 하단에서 가능한 두 노드 모두에 대해 함수를 호출합니다.

(y2 - y1) / (x2 - x1)
로그인 후 복사
로그인 후 복사

그리고 내 대답은 내 유효한 세트의 크기가 될 것입니다.

이것이 실제로 작동합니까?

실행하면 14가 아닌 12가 생성됩니다.

왜 안 되나요?

...

몇 가지 디버깅 후에 오류를 발견했습니다.

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에 무엇이 필요할지 상상만 되네요.

꿀꺽.

2부

예. 식별할 안티노드가 훨씬 더 많습니다.

비교적 간단한 조정일 수도 있지만 이것이 더 어렵게 느껴집니다.

생각해볼 시간입니다.

...

정답 생성에 대한 낮은 자신감을 갖고 임함

주로 이 문제 때문에:

동일한 주파수의 안테나 2개 이상과 정확하게 일치

저는 생각합니다 이 기준을 이해합니다.

내 직감으로는 특정 주파수에 3개의 안테나가 있는 한 세 개의 안테나도 모두 배점이라는 것입니다.

내가 틀렸다면 안테나를 안티노드로 착각하는 대답이 나오지 않을 것입니다.

하지만 새로운 안티노드를 모두 식별할 수 있는 전략은 있는 것 같아요.

Enter: 라인을 따라가기 위해 더 많은 while 루프를 사용합니다.

현재 알고리즘은 두 안테나의 양쪽 끝에서 안티노드를 찾습니다.

대신 경계를 벗어나기 직전까지 양방향으로 선을 따라 걷고 싶습니다.

일부 리팩토링이 필요합니다.

준비됐어요

양의 경사선에 대한 업데이트된 조건은 다음과 같습니다.

  ............
  ........0...
9 .....0......
8 .......0....
7 ....0.......
6 ......A.....
5 ............
4 ............
3 ........A...
2 .........A..
1 ............
0 ............
  0123456789
로그인 후 복사
로그인 후 복사

변경된 사항:

  • 앞으로 수학을 한 번 수행합니다
  • while 루프 내에서 좌표를 추가한 다음 해당 diff만큼 각 좌표를 늘리거나 줄입니다.
  • 조건은 좌표를 자동으로 추가하는 대신 부울을 반환하는 업데이트된 함수를 사용합니다

각 절마다 이렇게 해야 했어요.

하나를 약간 어지럽혀서 예제 입력을 사용하여 off-by-1 답변을 얻었고, 정말 이상한 그리드를 보고 어떤 절이 제대로 작동하지 않는지 진단하는 데 도움이 되었습니다.

결국 예제 입력 작업에 성공했습니다.

그런 다음 퍼즐 입력으로 실행했습니다.

그리고...

정답을 생성했습니다!!!

제 자신이 너무 자랑스럽습니다!

그리고 제 퍼즐 입력에 은밀한 엣지 케이스가 없어서 너무 감사해요!

와우, 이 문제를 해결하는 데 며칠이 걸렸습니다.

어려운 금별 2개를 획득한 또 다른 날.

위 내용은 공명 공선성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿