Heim > Web-Frontend > js-Tutorial > Resonante Kollinearität

Resonante Kollinearität

Barbara Streisand
Freigeben: 2024-12-29 14:02:18
Original
988 Leute haben es durchsucht

Resonant Collinearity

Advent of Code 2024 Tag 8

Teil 1

Ich glaube, ich verstehe. Kann ich es tun?

So wie ich es verstehe:

  • Für jedes Paar identischer Ligaturen
  • Finden Sie den Punkt X, an dem eine Ligatur 1N und die andere 2N ist – wobei N in einiger Entfernung von X liegt
  • Solange es innerhalb der Grenzen des Rasters liegt, zählen Sie es zur Antwort

Hier ist ein Bild:

...........
...........
...X.......
...........
.....Y.....   <---1N from top X, 2N from bottom X
...........
.......Y...   <---2N from top X, 1N from bottom X
...........
.........X.
...........
Nach dem Login kopieren
Nach dem Login kopieren

Es ist optisch klar.

Wie könnte ich es algorithmisch ermitteln?

1N und 2N algorithmisch berechnen

Hier ist das Beispielraster:

............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............
Nach dem Login kopieren
Nach dem Login kopieren

Ich werde mich auf die Nullen konzentrieren:

  • Es gibt vier
  • Koordinaten sind: 1,8, 2,5, 3,7, 4,4

Vergleich der ersten beiden:

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 = ....
Nach dem Login kopieren
Nach dem Login kopieren

Mir wurde beim Schreiben klar, dass ich wirklich die Steigung der Linie kennen muss, die das Punktepaar verbindet.

Auf diese Weise kann ich wissen, ob ich von jeder Achse addieren oder subtrahieren muss, um zu bestimmen, wo sich der Gegenknoten befindet.

Frischt meine Erinnerung an die Steigung auf

Die Formel lautet:

(y2 - y1) / (x2 - x1)
Nach dem Login kopieren
Nach dem Login kopieren

Das Ergebnis wird eines dieser vier sein:

  • > 0 bedeutet positive Steigung: nach oben und nach rechts
  • < 0 bedeutet negative Steigung: nach unten und nach rechts
  • 0 bedeutet horizontale Linie
  • Unendlich bedeutet vertikale Linie

Zurück zum Beispiel:

1,8 and 2,5

(5 - 8) / (2 - 1) = -3 / 1 = -3
Nach dem Login kopieren
Nach dem Login kopieren

Was? Eine negative Steigung? Nein, diese Linie hat eine positive Steigung!

Oh...ich verstehe.

Array-Indizierung zählt hoch, bewegt sich aber optisch nach unten.

Ich muss Indizes umgekehrt zählen.

Statt so:

0 ............
1 ........0...
2 .....0......
3 .......0....
4 ....0.......
5 ......A.....
6 ............
7 ............
8 ........A...
9 .........A..
  ............
  ............
  0123456789
Nach dem Login kopieren
Nach dem Login kopieren

Ich muss so zählen:

  ............
  ........0...
9 .....0......
8 .......0....
7 ....0.......
6 ......A.....
5 ............
4 ............
3 ........A...
2 .........A..
1 ............
0 ............
  0123456789
Nach dem Login kopieren
Nach dem Login kopieren

Es sollte nur etwas mehr Mathematik erfordern:

array length - current row/col index
Nach dem Login kopieren

Ich werde es versuchen.

Für die oberste 0:

12 rows
Row index: 1
12 - 1 = 11

Column index: 8

Coordinates: 8,11
Nach dem Login kopieren

Für die 0 in der nächsten Zeile:

Row index: 2
12 - 2 = 10

Column index: 5

Coordinates: 5,10
Nach dem Login kopieren

Und die Steigung:

(10 - 11) / (5 - 8)
   -1     /    -3
         1/3
Nach dem Login kopieren

Eine positive Steigung! Das ist richtig!

Ich fange an zu programmieren

Erstellen der Liste der Antennenkoordinaten

Ein leeres Objekt, das mit einer verschachtelten for-Schleife gefüllt ist:

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>Erstellt dieses Objekt für die Beispieleingabe:<br>
</p>

<pre class="brush:php;toolbar:false">{
  '0': [ [ 11, 8 ], [ 10, 5 ], [ 9, 7 ], [ 8, 4 ] ],
  A: [ [ 7, 6 ], [ 4, 8 ], [ 3, 9 ] ]
}
Nach dem Login kopieren

Sieht toll aus!

Als nächstes berechnen wir die Steigung.

Schreiben eines übermäßig komplexen Antinode-Finders

Meine Scope-Funktion ist einfach:

function getScope(p1,p2) {
  return (p2[0] - p1[0]) / (p2[1] - p1[1])
}
Nach dem Login kopieren

Es erwartet zwei Arrays und gibt den Bereich unter Verwendung aller vier Koordinaten zurück.

Ich möchte diese Funktion aufrufen, wenn ich alle Paare von Koordinaten ähnlicher Häufigkeit vergleiche.

Dieser Vergleich erfolgt in dieser superverschachtelten for-Schleife:

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
    }
  }
}
Nach dem Login kopieren

Bestätigen, dass es mit der Beispieleingabe funktioniert:

[ 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 ]
Nach dem Login kopieren

Neun Vergleiche. Das stimmt!

Und die Bereiche für jeden?

Die sehen zum Glück auch richtig aus.

Jetzt zum übermäßig komplizierten Teil, denke ich.

Bewältigung aller vier Pistenarten

Sie sind:

...........
...........
...X.......
...........
.....Y.....   <---1N from top X, 2N from bottom X
...........
.......Y...   <---2N from top X, 1N from bottom X
...........
.........X.
...........
Nach dem Login kopieren
Nach dem Login kopieren

Lass uns das in den Griff bekommen.

Es ist viel, aber die Feinheiten in jedem Abschnitt sind wichtig:

............
........0...
.....0......
.......0....
....0.......
......A.....
............
............
........A...
.........A..
............
............
Nach dem Login kopieren
Nach dem Login kopieren

Zum Glück scheinen alle identifizierten Bäuche korrekt platziert zu sein.

Als nächstes werden diejenigen ausgeschlossen, die außerhalb der Grenzen liegen

Mit Ausnahme der außerhalb der Grenzen liegenden Schwingungsbäuche

Geben Sie...weitere Bedingungen ein!

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 = ....
Nach dem Login kopieren
Nach dem Login kopieren

Ich überprüfe, ob jede Koordinate zwischen 0 und der Länge der Zeilen oder Spalten liegt.

Dann rufe ich am Ende jeder Klausel in meinem Antinode-Finder die Funktion auf beiden möglichen Knoten auf:

(y2 - y1) / (x2 - x1)
Nach dem Login kopieren
Nach dem Login kopieren

Und meine Antwort wird die Größe meines gültigen Satzes sein.

Funktioniert das tatsächlich?

Beim Ausführen werden 12 generiert. Nicht 14.

Warum nicht?

...

Nach einigem Debuggen habe ich meinen Fehler gefunden:

1,8 and 2,5

(5 - 8) / (2 - 1) = -3 / 1 = -3
Nach dem Login kopieren
Nach dem Login kopieren

Ich liege in meiner Reihenaufgabe um eins daneben. Ich brauche einen Wert, der eins weniger ist:

0 ............
1 ........0...
2 .....0......
3 .......0....
4 ....0.......
5 ......A.....
6 ............
7 ............
8 ........A...
9 .........A..
  ............
  ............
  0123456789
Nach dem Login kopieren
Nach dem Login kopieren

Das behebt die Dinge.

Ich sehe jetzt 14.

Zeit, es auf meiner Puzzle-Eingabe auszuführen.

...

Richtige Antwort!!!

Das hat viel länger gedauert, als ich erwartet hatte, aber ich habe es geschafft!

Ich kann mir nur vorstellen, was Teil 2 erfordern wird.

Schluck.

Teil 2

Jawohl. Es sind noch viele weitere Schwingungsbäuche zu identifizieren.

Das fühlt sich schwieriger an, obwohl es möglicherweise eine relativ einfache Anpassung ist.

Zeit, darüber nachzudenken.

...

Mit geringem Vertrauen in die Generierung der richtigen Antwort hineingehen

Hauptsächlich wegen diesem Problem:

genau auf einer Linie mit mindestens zwei Antennen der gleichen Frequenz

Ich glaubeich verstehe diese Kriterien.

Meine Vermutung ist, dass alle drei Antennen auch Schwingungsbäuche sind, solange es drei einer bestimmten Frequenz gibt.

Wenn ich falsch liege, ist das wahrscheinlich der Grund, warum meine Antwort falsch lautet: Eine Antenne mit einem Gegenknoten verwechseln.

Aber ich glaube, ich habe eine Strategie, um alle neuen Bäuche zu identifizieren.

Geben Sie Folgendes ein: Weitere while-Schleifen, um die Zeilen abzulaufen

Mein aktueller Algorithmus findet die Bäuche an beiden Enden von zwei Antennen.

Stattdessen möchte ich die Linie in beide Richtungen entlanggehen, bis ich kurz davor bin, das Spielfeld zu verlassen.

Dies erfordert einige Umgestaltungen.

Ich bin bereit.

Hier ist meine aktualisierte Bedingung für positive Neigungslinien:

  ............
  ........0...
9 .....0......
8 .......0....
7 ....0.......
6 ......A.....
5 ............
4 ............
3 ........A...
2 .........A..
1 ............
0 ............
  0123456789
Nach dem Login kopieren
Nach dem Login kopieren

Was hat sich geändert:

  • Ich führe Mathe einmal im Vorfeld durch
  • Innerhalb der while-Schleife füge ich die Koordinate hinzu und erhöhe oder dekrementiere dann einfach jede Koordinate um den entsprechenden Diff
  • Die Bedingung verwendet meine aktualisierte Funktion, die einen booleschen Wert zurückgibt, anstatt die Koordinate automatisch hinzuzufügen

Ich musste dies für jede Klausel tun.

Ich habe einen leicht durcheinander gebracht, was dazu führte, dass ich anhand der Beispieleingabe eine um eins versetzte Antwort erhielt und ein wirklich seltsames Raster sah, das mir bei der Diagnose half, welche Klausel nicht richtig funktionierte.

Irgendwann gelang es mir, mit der Beispieleingabe zu arbeiten.

Dann habe ich es auf meiner Puzzle-Eingabe ausgeführt.

Und...

Ich habe die richtige Antwort generiert!!!

Ich bin so stolz auf mich!

Und ich bin so dankbar, dass es in meinem Rätsel-Input keinen Sneaky-Edge-Fall gab!

Wow, das hat mehrere Tage passiven Denkens gekostet, um es durchzuarbeiten.

Auf zu einem weiteren Tag mit zwei hart verdienten goldenen Sternen.

Das obige ist der detaillierte Inhalt vonResonante Kollinearität. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage