Ceres-Suche

Dec 08, 2024 am 09:14 AM

Ceres Search

Advent of Code 2024 Tag 4

Teil 1

X markiert die (Hunderte?) Punkte

Ich bin überrascht, dass es bisher noch kein wörtliches Wortsuchrätsel wie dieses gab.

Es scheint entmutigend, aber meine Strategie wird sein:

Find the index of each X in the grid
For each X
  Check the next three letters in a straight path in each of the eight directions
  If the path ends up spelling XMAS
    Add one to a running total
Nach dem Login kopieren
Nach dem Login kopieren

Wenn ich diese Strategie anhand des Beispiels betrachte, glaube ich, dass es sich um einen erfolgreichen Ansatz handelt.

Jetzt kommt der spannende Teil: das Ganze von Grund auf programmieren!

Finden Sie den Index jedes X in einem Raster ... schließlich

Zuerst muss ich die Eingabe in ein 2D-Array von Zeichen analysieren:

let grid = input.split('\n').map(line => line.split(''))
Nach dem Login kopieren

Ein Hindernis, auf das ich bei Rasterrätseln oft stoße, ist die Berücksichtigung von Out-of-Bounds-Indizes.

Wenn ich von einer Grenzzelle – oder einer Zelle nahe der Grenze – beginne und so weit in Richtung Rand gehe, werde ich irgendwann auf eine Zeile oder Spalte stoßen, die außerhalb der Grenzen liegt.

Ich habe zwei Strategien, um damit umzugehen:

  1. Fügen Sie Prüfungen zu meinen Bedingungen für nicht vorhandene Zeilen oder Spalten hinzu
  2. Füllen Sie das Raster mit genügend Zeilen und Spalten auf, damit keine Gefahr besteht, dass Sie außerhalb der Grenzen geraten

Für diese Herausforderung entscheide ich mich für #2.

Das Auffüllen meines Rasters mit einem 3 Zellen dicken Rand sieht so aus:

grid = grid.map(line => ['.','.','.',...line,'.','.','.'])
grid = [
  new Array(grid[0].length).fill('.'),
  new Array(grid[0].length).fill('.'),
  new Array(grid[0].length).fill('.'),
  ...grid,
  new Array(grid[0].length).fill('.'),
  new Array(grid[0].length).fill('.'),
  new Array(grid[0].length).fill('.')
]
Nach dem Login kopieren

Das Beispielraster sieht jetzt so aus:

................
................
................
...MMMSXXMASM...
...MSAMXMSMSA...
...AMXSXMAAMM...
...MSAMASMSMX...
...XMASAMXAMM...
...XXAMMXXAMA...
...SMSMSASXSS...
...SAXAMASAAA...
...MAMMMXMMMM...
...MXMXAXMASX...
................
................
................
Nach dem Login kopieren

Jetzt bin ich bereit, die Koordinaten jedes X im gepolsterten Raster zu katalogisieren:

let Xs = []
for (let row = 0; row < grid.length; row++) {
  for (let col = 0; col < grid[0].length; col++) {
    if (grid[row][col] == "X") {
      Xs.push([row, col])
    }
  }
}
Nach dem Login kopieren

Erfolg: Es wurden alle 19 X im Beispielraster gefunden!

Von jedem X aus drei Schritte in acht Richtungen gehen

Alle acht relativen Koordinaten werden als 8-Elemente-Array codiert:

let dirs = [
  [-1,-1],
  [-1,0],
  [-1,1],
  [0,-1],
  [0,1],
  [1,-1],
  [1,0],
  [1,1]
]
Nach dem Login kopieren

Jetzt zum Hauptalgorithmus:

For each X
  For each direction
    Create an array that starts with X
    Do 3 times
      Move one cell in this direction
      Add the value of that cell to the array
    Check whether the concatenation of all four values is "XMAS"
      If it is, increment a tally
Nach dem Login kopieren

Und in JavaScript:

Xs.reduce((total, coord) => {
  dirs.forEach((dir) => {
    let [row, col] = coord;
    let [y, x] = dir;
    let word = ["X"];
    for (let i = 0; i < 3; i++) {
      row += y;
      col += x;
      word.push(grid[row][col]);
    }
    if (word.join("") == "XMAS") {
      total++;
    }
  });
  return total;
}, 0);
Nach dem Login kopieren

Es generiert die richtige Antwort für die Beispieleingabe!

Was passiert, wenn ich es auf meiner Puzzle-Eingabe ausführe??!!

Ich bekomme eine Zahl: ein paar tausend „WEIHNACHTEN“

Ist es die richtige Antwort?

ES IST!!!

Woohooo!!!

Ich kann es kaum erwarten zu sehen, was Teil 2 zu bieten hat...

Teil 2

Ohhh mein Gott. Das wurde etwas komplizierter. Aber machbar!

In Teil 1 habe ich nach Xs gesucht.

Jetzt suche ich Frau

In Teil 1 habe ich Buchstaben in einer geraden Linie aufgezeichnet, um ein Wort zu bilden.

Jetzt suche ich nach vier Konfigurationen einer 5-Zellen-Phrase:

M S   M M   S M   S S
 A     A     A     A
M S   S S   S M   M M
Nach dem Login kopieren

Ein einzelnes M könnte Teil mehrerer X-MASs sein.

Wenn ich jedes M überprüfe, werde ich wahrscheinlich auf mehrere Male stoßen.

Ich muss für jede Übereinstimmung ein Set() mit stringifizierten Koordinaten erstellen. Auf diese Weise berücksichtige ich eine X-MAS-Instanz nur einmal.

Plötzlich – genial! - Idee

Ich werde nicht jedes M. überprüfen

Ich überprüfe jedes A.

Und ich überprüfe die vier diagonal benachbarten Zellen im Uhrzeigersinn.

X-MAS-Matches passen zu einem dieser vier Muster:

Find the index of each X in the grid
For each X
  Check the next three letters in a straight path in each of the eight directions
  If the path ends up spelling XMAS
    Add one to a running total
Nach dem Login kopieren
Nach dem Login kopieren


`

Puh! Das wird viel weniger mühsam sein als meine ursprüngliche Idee.

Und ich sollte in der Lage sein, den größten Teil meines Teil-1-Codes wiederzuverwenden!

Kopieren-Einfügen-Optimieren

Alle As im Raster finden:
js
sei As = [];
for (let row = 0; row < grid.length; row ) {
for (let col = 0; col < grid[0].length; col ) {
if (grid[row][col] == "A") {
As.push([row, col]);
}
}
}

Festlegen der Reihenfolge der zu überprüfenden relativen Koordinaten:
js
let Adirs = [
[-1, -1],
[-1, 1],
[1, 1],
[1, -1],
];

Summierung der Übereinstimmungen:
js
let part2 = As.reduce((total, coord) => {
let im Uhrzeigersinn = Adirs.map((dir) => {
let [row, col] = coord;
sei [y, x] = dir;
return grid[row y][col x];
});
if (["MSSM", "MMSS", "SMMS", "SSMM"].includes(im Uhrzeigersinn.join(""))) {
insgesamt ;
}
Gesamtsumme zurückgeben;
}, 0);

Es generiert die richtige Antwort für die Beispieleingabe!

Nun, um meine Rätseleingabe zu überprüfen...

In der Tat!!! Die richtige Antwort!!!

Ich bin so froh, dass mir der Gedanke gekommen ist, das As anstelle des Ms. zu verwenden.

Ich bin mir sicher, dass es mir stundenlange Kopfschmerzen bei der Fehlerbehebung erspart hat.

Das war ein weiteres lustiges und leicht zugängliches Rätsel!

Ich frage mich, was Tag 5 bereithält.

Das obige ist der detaillierte Inhalt vonCeres-Suche. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Was soll ich tun, wenn ich auf den Codendruck auf Kleidungsstücke für Front-End-Thermalpapier-Quittungen stoße? Was soll ich tun, wenn ich auf den Codendruck auf Kleidungsstücke für Front-End-Thermalpapier-Quittungen stoße? Apr 04, 2025 pm 02:42 PM

Häufig gestellte Fragen und Lösungen für das Ticket-Ticket-Ticket-Ticket in Front-End im Front-End-Entwicklungsdruck ist der Ticketdruck eine häufige Voraussetzung. Viele Entwickler implementieren jedoch ...

Entmystifizieren JavaScript: Was es tut und warum es wichtig ist Entmystifizieren JavaScript: Was es tut und warum es wichtig ist Apr 09, 2025 am 12:07 AM

JavaScript ist der Eckpfeiler der modernen Webentwicklung. Zu den Hauptfunktionen gehören eine ereignisorientierte Programmierung, die Erzeugung der dynamischen Inhalte und die asynchrone Programmierung. 1) Ereignisgesteuerte Programmierung ermöglicht es Webseiten, sich dynamisch entsprechend den Benutzeroperationen zu ändern. 2) Die dynamische Inhaltsgenerierung ermöglicht die Anpassung der Seiteninhalte gemäß den Bedingungen. 3) Asynchrone Programmierung stellt sicher, dass die Benutzeroberfläche nicht blockiert ist. JavaScript wird häufig in der Webinteraktion, der einseitigen Anwendung und der serverseitigen Entwicklung verwendet, wodurch die Flexibilität der Benutzererfahrung und die plattformübergreifende Entwicklung erheblich verbessert wird.

Wer bekommt mehr Python oder JavaScript bezahlt? Wer bekommt mehr Python oder JavaScript bezahlt? Apr 04, 2025 am 12:09 AM

Es gibt kein absolutes Gehalt für Python- und JavaScript -Entwickler, je nach Fähigkeiten und Branchenbedürfnissen. 1. Python kann mehr in Datenwissenschaft und maschinellem Lernen bezahlt werden. 2. JavaScript hat eine große Nachfrage in der Entwicklung von Front-End- und Full-Stack-Entwicklung, und sein Gehalt ist auch beträchtlich. 3. Einflussfaktoren umfassen Erfahrung, geografische Standort, Unternehmensgröße und spezifische Fähigkeiten.

Wie kann man Parallax -Scrolling- und Element -Animationseffekte wie die offizielle Website von Shiseido erzielen?
oder:
Wie können wir den Animationseffekt erzielen, der von der Seite mit der Seite mit der offiziellen Website von Shiseido begleitet wird? Wie kann man Parallax -Scrolling- und Element -Animationseffekte wie die offizielle Website von Shiseido erzielen? oder: Wie können wir den Animationseffekt erzielen, der von der Seite mit der Seite mit der offiziellen Website von Shiseido begleitet wird? Apr 04, 2025 pm 05:36 PM

Diskussion über die Realisierung von Parallaxe -Scrolling- und Elementanimationseffekten in diesem Artikel wird untersuchen, wie die offizielle Website der Shiseeido -Website (https://www.shiseeido.co.jp/sb/wonderland/) ähnlich ist ...

Ist JavaScript schwer zu lernen? Ist JavaScript schwer zu lernen? Apr 03, 2025 am 12:20 AM

JavaScript zu lernen ist nicht schwierig, aber es ist schwierig. 1) Verstehen Sie grundlegende Konzepte wie Variablen, Datentypen, Funktionen usw. 2) Beherrschen Sie die asynchrone Programmierung und implementieren Sie sie durch Ereignisschleifen. 3) Verwenden Sie DOM -Operationen und versprechen Sie, asynchrone Anfragen zu bearbeiten. 4) Vermeiden Sie häufige Fehler und verwenden Sie Debugging -Techniken. 5) Die Leistung optimieren und Best Practices befolgen.

Die Entwicklung von JavaScript: Aktuelle Trends und Zukunftsaussichten Die Entwicklung von JavaScript: Aktuelle Trends und Zukunftsaussichten Apr 10, 2025 am 09:33 AM

Zu den neuesten Trends im JavaScript gehören der Aufstieg von Typenkripten, die Popularität moderner Frameworks und Bibliotheken und die Anwendung der WebAssembly. Zukunftsaussichten umfassen leistungsfähigere Typsysteme, die Entwicklung des serverseitigen JavaScript, die Erweiterung der künstlichen Intelligenz und des maschinellen Lernens sowie das Potenzial von IoT und Edge Computing.

Wie fusioniere ich Arrayelemente mit derselben ID mit JavaScript in ein Objekt? Wie fusioniere ich Arrayelemente mit derselben ID mit JavaScript in ein Objekt? Apr 04, 2025 pm 05:09 PM

Wie fusioniere ich Array -Elemente mit derselben ID in ein Objekt in JavaScript? Bei der Verarbeitung von Daten begegnen wir häufig die Notwendigkeit, dieselbe ID zu haben ...

Zustand Asynchron Operation: Wie können Sie den neuesten Zustand von Usestore sicherstellen? Zustand Asynchron Operation: Wie können Sie den neuesten Zustand von Usestore sicherstellen? Apr 04, 2025 pm 02:09 PM

Datenaktualisierungsprobleme in Zustand Asynchronen Operationen. Bei Verwendung der Zustand State Management Library stoßen Sie häufig auf das Problem der Datenaktualisierungen, die dazu führen, dass asynchrone Operationen unzeitgemäß sind. � ...

See all articles