Rumah > hujung hadapan web > tutorial js > Kolineariti Resonan

Kolineariti Resonan

Barbara Streisand
Lepaskan: 2024-12-29 14:02:18
asal
988 orang telah melayarinya

Resonant Collinearity

Kedatangan Kod 2024 Hari 8

Bahagian 1

Saya rasa saya faham. Bolehkah saya melakukannya?

Seperti yang saya fahami:

  • Untuk setiap pasangan ligatur yang sama
  • Cari titik X di mana satu ligatur ialah 1N dan satu lagi ialah 2N - dengan N adalah agak jauh dari X
  • Selagi ia berada dalam sempadan grid, kirakannya ke arah jawapan

Berikut ialah visual:

...........
...........
...X.......
...........
.....Y.....   <---1N from top X, 2N from bottom X
...........
.......Y...   <---2N from top X, 1N from bottom X
...........
.........X.
...........
Salin selepas log masuk
Salin selepas log masuk

Ia jelas secara visual.

Bagaimanakah saya boleh menentukannya secara algoritma?

Mengira 1N dan 2N secara algoritma

Berikut ialah contoh grid:

............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............
Salin selepas log masuk
Salin selepas log masuk

Saya akan fokus pada 0s:

  • Terdapat empat
  • Koordinat ialah: 1,8, 2,5, 3,7, 4,4

Membandingkan dua yang pertama:

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 = ....
Salin selepas log masuk
Salin selepas log masuk

Saya sedar semasa menulis bahawa saya benar-benar perlu mengetahui cerun garisan yang menghubungkan pasangan mata.

Dengan cara itu saya boleh tahu sama ada hendak menambah atau menolak daripada setiap paksi untuk menentukan di mana antinod itu.

Menyegarkan ingatan saya tentang cerun

Formulanya ialah:

(y2 - y1) / (x2 - x1)
Salin selepas log masuk
Salin selepas log masuk

Hasilnya adalah salah satu daripada empat ini:

  • > 0 bermaksud cerun positif: atas dan ke kanan
  • < 0 bermaksud cerun negatif: ke bawah dan ke kanan
  • 0 bermaksud garis mendatar
  • Infiniti bermaksud garis menegak

Berbalik kepada contoh:

1,8 and 2,5

(5 - 8) / (2 - 1) = -3 / 1 = -3
Salin selepas log masuk
Salin selepas log masuk

Apa? Cerun negatif? Tidak, garisan itu mempunyai cerun positif!

Oh...saya faham.

Pengindeksan tatasusunan dikira ke atas, tetapi secara visual bergerak ke bawah.

Saya perlu mengira indeks secara terbalik.

Sebaliknya seperti ini:

0 ............
1 ........0...
2 .....0......
3 .......0....
4 ....0.......
5 ......A.....
6 ............
7 ............
8 ........A...
9 .........A..
  ............
  ............
  0123456789
Salin selepas log masuk
Salin selepas log masuk

Saya perlu mengira seperti ini:

  ............
  ........0...
9 .....0......
8 .......0....
7 ....0.......
6 ......A.....
5 ............
4 ............
3 ........A...
2 .........A..
1 ............
0 ............
  0123456789
Salin selepas log masuk
Salin selepas log masuk

Ia hanya memerlukan sedikit lagi matematik:

array length - current row/col index
Salin selepas log masuk

Saya akan cuba.

Untuk 0 yang paling tinggi:

12 rows
Row index: 1
12 - 1 = 11

Column index: 8

Coordinates: 8,11
Salin selepas log masuk

Untuk 0 dalam baris seterusnya:

Row index: 2
12 - 2 = 10

Column index: 5

Coordinates: 5,10
Salin selepas log masuk

Dan cerun:

(10 - 11) / (5 - 8)
   -1     /    -3
         1/3
Salin selepas log masuk

Cerun yang positif! Betul!

Mula membuat kod

Membina senarai koordinat antena

Objek kosong yang diisi dengan gelung untuk bersarang:

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>Mencipta objek ini untuk input contoh:<br>
</p>

<pre class="brush:php;toolbar:false">{
  '0': [ [ 11, 8 ], [ 10, 5 ], [ 9, 7 ], [ 8, 4 ] ],
  A: [ [ 7, 6 ], [ 4, 8 ], [ 3, 9 ] ]
}
Salin selepas log masuk

Nampak hebat!

Seterusnya, mengira cerun.

Menulis pencari antinod yang terlalu kompleks

Fungsi skop saya mudah:

function getScope(p1,p2) {
  return (p2[0] - p1[0]) / (p2[1] - p1[1])
}
Salin selepas log masuk

Ia menjangkakan dua tatasusunan dan mengembalikan skop menggunakan keempat-empat koordinat.

Saya ingin memanggil fungsi ini apabila membandingkan semua pasangan koordinat frekuensi yang serupa.

Perbandingan itu berlaku dalam gelung bersarang super ini:

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
    }
  }
}
Salin selepas log masuk

Mengesahkan ia berfungsi pada input contoh:

[ 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 ]
Salin selepas log masuk

Sembilan perbandingan. Betul!

Dan skop untuk setiap satu?

Nampak betul juga, syukur.

Sekarang untuk bahagian yang terlalu rumit, saya rasa.

Mengendalikan keempat-empat jenis cerun

Mereka ialah:

...........
...........
...X.......
...........
.....Y.....   <---1N from top X, 2N from bottom X
...........
.......Y...   <---2N from top X, 1N from bottom X
...........
.........X.
...........
Salin selepas log masuk
Salin selepas log masuk

Mari kita uruskan ini.

Memang banyak, tetapi kehalusannya penting dalam setiap klausa:

............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............
Salin selepas log masuk
Salin selepas log masuk

Syukurlah, semua antinod yang dikenal pasti kelihatan diletakkan dengan betul.

Seterusnya, tidak termasuk yang di luar sempadan

Tidak termasuk antinod luar sempadan

Masuk...syarat lagi!

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 = ....
Salin selepas log masuk
Salin selepas log masuk

Saya sedang menyemak sama ada setiap koordinat adalah antara 0 dan panjang baris atau lajur.

Kemudian, di bahagian bawah setiap klausa dalam pencari antinod saya, saya memanggil fungsi pada kedua-dua nod yang mungkin:

(y2 - y1) / (x2 - x1)
Salin selepas log masuk
Salin selepas log masuk

Dan jawapan saya ialah saiz set saya yang sah.

Adakah ini benar-benar berkesan?

Menjalankannya menjana 12. Bukan 14.

Kenapa tidak?

...

Selepas beberapa nyahpepijat, saya menemui ralat saya:

1,8 and 2,5

(5 - 8) / (2 - 1) = -3 / 1 = -3
Salin selepas log masuk
Salin selepas log masuk

Saya pergi satu per satu dalam tugasan barisan saya. Saya memerlukan nilai yang kurang satu:

0 ............
1 ........0...
2 .....0......
3 .......0....
4 ....0.......
5 ......A.....
6 ............
7 ............
8 ........A...
9 .........A..
  ............
  ............
  0123456789
Salin selepas log masuk
Salin selepas log masuk

Itu membetulkan keadaan.

Saya nampak 14 sekarang.

Masa untuk menjalankannya pada input teka-teki saya.

...

Jawapan betul!!!

Itu mengambil masa lebih lama daripada yang saya jangkakan, tetapi saya berjaya melakukannya!

Saya hanya boleh bayangkan apa yang Bahagian 2 perlukan.

Telan.

Bahagian 2

Yup. Banyak lagi antinod untuk dikenal pasti.

Ini terasa lebih sukar, walaupun ia mungkin pelarasan yang agak mudah.

Masa untuk memikirkannya.

...

Masuk dengan keyakinan yang rendah untuk menghasilkan jawapan yang betul

Kebanyakannya kerana gotcha ini:

tepat sejajar dengan sekurang-kurangnya dua antena dengan frekuensi yang sama

Saya berfikir Saya faham kriteria ini.

Firasat saya ialah selagi terdapat tiga daripada mana-mana frekuensi tertentu, ketiga-tiga antena juga adalah antinod.

Jika saya salah, kemungkinan besar jawapan saya akan dimatikan: salah sangka antena sebagai antinod.

Tetapi saya rasa saya mempunyai strategi untuk mengenal pasti semua antinod baharu.

Masukkan: lagi sambil gelung untuk berjalan di baris

Algoritma semasa saya mencari antinod pada kedua-dua hujung dua antena.

Saya sebaliknya mahu berjalan di sepanjang barisan di kedua-dua arah sehingga saya akan melangkah keluar dari sempadan.

Ini memerlukan pemfaktoran semula.

Saya sudah bersedia.

Berikut ialah keadaan terkini saya untuk garisan cerun positif:

  ............
  ........0...
9 .....0......
8 .......0....
7 ....0.......
6 ......A.....
5 ............
4 ............
3 ........A...
2 .........A..
1 ............
0 ............
  0123456789
Salin selepas log masuk
Salin selepas log masuk

Apa yang berubah:

  • Saya melakukan Matematik sekali di hadapan
  • Di dalam gelung while saya menambah koordinat, kemudian saya hanya menambah atau mengurangkan setiap koordinat dengan perbezaan yang sepadan
  • Syaratnya menggunakan fungsi saya yang dikemas kini yang mengembalikan boolean dan bukannya menambah koordinat secara automatik

Saya terpaksa melakukan ini untuk setiap klausa.

Saya mengacaukan sedikit, yang menyebabkan saya mendapat jawapan off-by-1 menggunakan input contoh dan melihat grid yang sangat pelik, yang membantu saya mendiagnosis klausa yang tidak berfungsi.

Akhirnya, saya membuatnya berfungsi pada input contoh.

Kemudian saya menjalankannya pada input teka-teki saya.

Dan...

Saya menjana jawapan yang betul!!!

Saya sangat bangga dengan diri saya sendiri!

Dan saya sangat bersyukur kerana tiada sarung tepi licik dalam input teka-teki saya!

Wah, pemikiran pasif mengambil masa beberapa hari untuk diselesaikan.

Di hari yang lain dengan dua bintang emas yang diperolehi dengan susah payah.

Atas ialah kandungan terperinci Kolineariti Resonan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan