Seperti yang saya fahami:
Berikut ialah visual:
........... ........... ...X....... ........... .....Y..... <---1N from top X, 2N from bottom X ........... .......Y... <---2N from top X, 1N from bottom X ........... .........X. ...........
Ia jelas secara visual.
Bagaimanakah saya boleh menentukannya secara algoritma?
Berikut ialah contoh grid:
............ ........0... .....0...... .......0.... ....0....... ......A..... ............ ............ ........A... .........A.. ............ ............
Saya akan fokus pada 0s:
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 = ....
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.
Formulanya ialah:
(y2 - y1) / (x2 - x1)
Hasilnya adalah salah satu daripada empat ini:
Berbalik kepada contoh:
1,8 and 2,5 (5 - 8) / (2 - 1) = -3 / 1 = -3
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
Saya perlu mengira seperti ini:
............ ........0... 9 .....0...... 8 .......0.... 7 ....0....... 6 ......A..... 5 ............ 4 ............ 3 ........A... 2 .........A.. 1 ............ 0 ............ 0123456789
Ia hanya memerlukan sedikit lagi matematik:
array length - current row/col index
Saya akan cuba.
Untuk 0 yang paling tinggi:
12 rows Row index: 1 12 - 1 = 11 Column index: 8 Coordinates: 8,11
Untuk 0 dalam baris seterusnya:
Row index: 2 12 - 2 = 10 Column index: 5 Coordinates: 5,10
Dan cerun:
(10 - 11) / (5 - 8) -1 / -3 1/3
Cerun yang positif! Betul!
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 ] ] }
Nampak hebat!
Seterusnya, mengira cerun.
Fungsi skop saya mudah:
function getScope(p1,p2) { return (p2[0] - p1[0]) / (p2[1] - p1[1]) }
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 } } }
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 ]
Sembilan perbandingan. Betul!
Dan skop untuk setiap satu?
Nampak betul juga, syukur.
Sekarang untuk bahagian yang terlalu rumit, saya rasa.
Mereka ialah:
........... ........... ...X....... ........... .....Y..... <---1N from top X, 2N from bottom X ........... .......Y... <---2N from top X, 1N from bottom X ........... .........X. ...........
Mari kita uruskan ini.
Memang banyak, tetapi kehalusannya penting dalam setiap klausa:
............ ........0... .....0...... .......0.... ....0....... ......A..... ............ ............ ........A... .........A.. ............ ............
Syukurlah, semua antinod yang dikenal pasti kelihatan diletakkan dengan betul.
Seterusnya, tidak termasuk yang di 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 = ....
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)
Dan jawapan saya ialah saiz set saya yang sah.
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
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
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.
Ini terasa lebih sukar, walaupun ia mungkin pelarasan yang agak mudah.
Masa untuk memikirkannya.
...
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.
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
Apa yang berubah:
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!