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
Zuerst erstelle ich eine Liste mit Listen mit zwei Elementen, wobei jedes Element eine Zahl ist:
input.split('\n').split(' ').map(Number)
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) ]
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(...);
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));
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]), ];
Leider generiert mein Algorithmus jetzt zwei Zahlenlisten!
Puh, ich bin etwas eingerostet, nachdem ich das zehn Monate lang nicht gemacht habe.
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), ];
Hat bei der Beispieleingabe wunderbar funktioniert:
[ 1, 2, 3, 3, 3, 4 ] [ 3, 3, 3, 4, 5, 9 ]
let answer = 0; for (let i = 0; i < list1.length; i++) { answer += Math.abs(list1[i] - list2[i]); }
Es funktioniert im Beispiel: 11
Funktioniert es jedoch mit meiner Puzzle-Eingabe?
Das tut es!
Woohoo! Ein goldener Stern!
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
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!
Die Beispielliste sieht so aus:
4, 3, 5, 3, 9, 3
Ich möchte also ein Objekt, das wie folgt aussieht:
{ 4: 1, 3: 3, 5: 1, 9: 1 }
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 }, {})
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 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
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)
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!