Heim > Web-Frontend > js-Tutorial > Historiker-Hysterie

Historiker-Hysterie

Mary-Kate Olsen
Freigeben: 2024-12-08 10:38:13
Original
712 Leute haben es durchsucht

Historian Hysteria

Advent of Code 2024 Tag 1

Teil 1

Ein Softball, um das Jahr mit einem Lächeln zu beginnen

Die Lösung dieses Problems scheint einfach zu sein:

Parse the input into two equal lists of numbers
Sort each list in ascending order
Compare both values at each index
Determine the absolute value after calculating the difference
Increment a tally by the absolute value
Nach dem Login kopieren
Nach dem Login kopieren

Schritt 1: Erstellen Sie zwei Zahlenlisten

Zuerst erstelle ich eine Liste mit Listen mit zwei Elementen, wobei jedes Element eine Zahl ist:

input.split('\n').split(' ').map(Number)
Nach dem Login kopieren
Nach dem Login kopieren

Dann extrahiere ich die Elemente basierend auf ihrem Index in separate Listen:

let [list1, list2] = [
  input.map((_,i) => i == 0),
  input.map((_,i) => i == 1)
]
Nach dem Login kopieren
Führen Sie es aus und beheben Sie meine Fehler

Erster Fehler: Kettentrennung.
Ich kann Split für ein Array nicht aufrufen.
Ich muss innerhalb einer iterierenden Methode aufteilen, z. B. „map:
“.

input.split("\n").map(...);
Nach dem Login kopieren

Zweiter Fehler: nicht genügend Leerzeichen.
Die Eingabe enthält mehrere Leerzeichen zwischen jeder Zahl, nicht eins:

input.split("\n").map((el) => el.split("   ").map(Number));
Nach dem Login kopieren

Dritter Fehler: Überdenken des Listenzugriffs.

Mein Code verhielt sich so, als ob jede verschachtelte Liste ein Element wäre, und gab boolesche Werte zurück, je nachdem, ob das Element an erster oder zweiter Stelle in der Liste stand.

Was???!!!

Dieser Code erkennt jede Liste und behält das erste oder zweite Element:

let [list1, list2] = [
  input.map(list => list[0]),
  input.map(list => list[1]),
];
Nach dem Login kopieren

Leider generiert mein Algorithmus jetzt zwei Zahlenlisten!

Puh, ich bin etwas eingerostet, nachdem ich das zehn Monate lang nicht gemacht habe.

Sortieren Sie jede Liste in aufsteigender Reihenfolge

Das sollte kurz und bündig sein.

Tatsächlich hänge ich einfach an den Code direkt oben an:

let [list1, list2] = [
  input.map(list => list[0]).sort((a,b) => a - b),
  input.map(list => list[1]).sort((a,b) => a - b),
];
Nach dem Login kopieren

Hat bei der Beispieleingabe wunderbar funktioniert:

[ 1, 2, 3, 3, 3, 4 ]
[ 3, 3, 3, 4, 5, 9 ]
Nach dem Login kopieren

Die anderen drei Schritte auf einmal!

let answer = 0;
for (let i = 0; i < list1.length; i++) {
  answer += Math.abs(list1[i] - list2[i]);
}
Nach dem Login kopieren

Es funktioniert im Beispiel: 11

Funktioniert es jedoch mit meiner Puzzle-Eingabe?

Das tut es!

Woohoo! Ein goldener Stern!

Teil 2

Eine lustige Variante, um die Laufzeit zu testen

Die Anleitung lässt mich glauben:

For each number in list 1
  For each number in list 2
    If there's a match
      Increment a tally by 1
Nach dem Login kopieren

Das heißt, Liste 2 wird überprüft. Liste 2 Länge mal Liste 1 Länge ... Mal.

jeweils 1000 Artikel: 1 Million Schecks

Das ist nicht schlecht. Aber das scheint unnötig.

Alles, was mich interessiert, ist die Anzahl der einzelnen Zahlen in Liste 2.

So kann ich alle 1000 Zahlen einmal überprüfen und eine Karte der Zahlen zu ihren Zählungen erstellen. Dann überprüfen Sie diese Liste 1000 Mal.

2000 < 1 Million

Dieser Ansatz gefällt mir besser. Zum Code!

Erstellen der Karte der Zahlen und Zählungen

Die Beispielliste sieht so aus:

4, 3, 5, 3, 9, 3
Nach dem Login kopieren

Ich möchte also ein Objekt, das wie folgt aussieht:

{
  4: 1,
  3: 3,
  5: 1,
  9: 1
}
Nach dem Login kopieren

Mit meiner Liste2 aus meinem Teil-1-Algorithmus muss ich eine Reduzierung durchführen, um dieses Objekt zu erstellen:

let counts = list2.reduce((obj, num) => {
  if (!(num in obj)) {
    obj[num] = 1
  } else {
    obj[num] += 1
  }
  return obj
}, {})
Nach dem Login kopieren

Zu meiner Überraschung funktioniert dieses Snippet genau wie erwartet!

Ich dachte, ich hätte die richtige Syntax für num in obj vergessen, aber das war's!

Eine einfache Suche für jedes Listenelement

Eine weitere Reduzierung mit einer Bedingung, die die Existenz und den Wert einer Zahl prüft:

Parse the input into two equal lists of numbers
Sort each list in ascending order
Compare both values at each index
Determine the absolute value after calculating the difference
Increment a tally by the absolute value
Nach dem Login kopieren
Nach dem Login kopieren

Ewiges Debuggen, weil ich es einfach nicht glauben kann

Ich habe ständig die falsche Punktzahl gesehen.

Ich habe mich immer wieder gefragt, warum.

Ich habe immer wieder console.log()-Anweisungen mit immer mehr auszudruckenden Werten hinzugefügt.

Ich sah immer wieder Werte, die ich nicht erwartet hatte.

Dann habe ich es gesehen.

Ich habe mit Liste2 verglichen und nicht mit meinem benutzerdefinierten Zählobjekt!

Riesiger Schlag fürs Ego. Aber genau das, was ich am ersten Tag brauchte.

Hier ist der Arbeitscode:

input.split('\n').split(' ').map(Number)
Nach dem Login kopieren
Nach dem Login kopieren

Das generiert die richtige Antwort für die Beispieleingabe.

Hoffen wir, dass dies auch bei meinem Rätsel-Input der Fall ist.

Und hoffentlich läuft es blitzschnell!

Das tut es!

Yeeeehawwww!!!

Zwei goldene Sterne zum Auftakt.

Zusammen mit ein paar Anfängerfehlern, die mich auf dem Boden halten.

Das ist alles der Grund, warum ich diese Rätsel liebe.

Auch weiter, Tag 2!

Das obige ist der detaillierte Inhalt vonHistoriker-Hysterie. 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