suchen
HeimBackend-EntwicklungGolangEinführung des Code Day n Golang: Suche nach XMAS und X-MAS

Einführung

An Tag 4 haben wir ein Rasterproblem vor uns. Wir erhalten einige Zahlen in Form eines Rasters, d. h. einige Zeilen und Spalten mit einigen Großbuchstaben. Was wir tun müssen, ist, das Wort XMAS in einer beliebigen Richtung (oben, links, unten, rechts, diagonal) zu finden, und im zweiten Teil müssen wir das Wort MAS finden, das ein X bildet.

Also, mal sehen, wie wir das angehen und in Golang lösen können.

Sie können meine Lösungen hier auf GitHub ansehen.

Advent of Code Day n Golang: Searching XMAS and X-MAS Herr-Destruktiv / Advent_of_code

Aufkommen des Codes

Aufbau des Rasters

Der grundlegendste Teil des Problems besteht darin, den Text tatsächlich in eine Raster- oder Matrixform umzuwandeln. Wir können die Zeilen in einzelne Zeilen aufteilen und jedes Zeichen als Element in einer Liste anhängen. Auf diese Weise können wir eine Liste mit Zeichenfolgen erstellen, die eine Matrix- oder gitterartige (zweidimensionale) Struktur darstellt.

Also, unten ist die Eingabe für das Rätsel.

MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX

Wir müssen es in so etwas umwandeln

[
    [M M M S X X M A S M]
    [M S A M X M S M S A]
    [A M X S X M A A M M]
    [M S A M A S M S M X]
    [X M A S A M X A M M]
    [X X A M M X X A M A]
    [S M S M S A S X S S]
    [S A X A M A S A A A]
    [M A M M M X M M M M]
    [M X M X A X M A S X]
]

Das ist also eine Liste von Strings, wir können in Golang sagen, dass es sich um einen [][]string handelt. Wir können das tun, indem wir eine Funktion wie diese erstellen:

func ConstructGrid(lines []string) [][]string {
    grid := [][]string{}
    for _, line := range lines {
        row := []string{}
        for _, char := range strings.Split(line, "") {
            row = append(row, char)
        }
        grid = append(grid, row)
    }
    return grid
}

Die obige Funktion nimmt eine Liste von Zeichenfolgen auf und gibt eine Liste von Zeichenfolgen zurück, bei denen es sich um einzelne Buchstaben im Raster handelt.

Wir können die Dateibytes lesen und die Bytes in Zeilenumbruchzeichen aufteilen, und dann wird dies als Eingabe für diese Funktion verwendet.

Sobald die Eingabe also in ein Raster geparst ist, können wir anfangen, über die eigentliche Logik nachzudenken, mit der das Wort XMAS darin gefunden werden soll.

Teil 1

Also müssen wir im ersten Teil das Wort XMAS in der Matrix finden, das erscheinen könnte:

  • vorwärts (als XMAS)

  • rückwärts (als SAMX)

  • nach oben

            S
            A
            M
            X
  • nach unten
            X
            M
            A
            S    
  • Diagonal nach oben (rechts oder oben links)
            S
              A
                M
                  X

            OR
                  S
                A
              M 
            X
  • Diagonalen nach unten (rechts oder links)
                     X
                   M
                 A
               S

            OR

            X
              M
                A
                  S

Es gibt also 8 Richtungen, in denen XMAS im Raster erscheinen könnte, es könnte n Anzahl dieser XMAS geben. Wir müssen die Anzahl davon im Raster ermitteln.

Advent of Code Day n Golang: Searching XMAS and X-MAS

Um dies zu erreichen, können wir entweder das erste Zeichen im Wort XMAS finden und dann nacheinander in alle Richtungen suchen und prüfen, ob wir M finden. Wenn wir M in einer der Richtungen gefunden haben, gehen wir weiter in diese Richtung und prüfen Sie, ob in dieser Richtung A und S vorhanden sind.

Der Ansatz sieht so aus:

  • Zähler auf 0 initialisieren

  • Jede Zeile durchlaufen

    • Jedes Zeichen in der Zeile durchlaufen

      • Überprüfen Sie, ob das Zeichen gleich X ist
      • Wenn das Zeichen X ist→

        • Iterieren Sie alle Richtungen (oben, unten, rechts, links, oben-links, oben-rechts, unten-links, unten-rechts)

          • Für diese Richtung, wenn wir feststellen, dass es sich bei dem Charakter um M handelt
          • Bewegen Sie sich weiter in die gleiche Richtung, um A und S auf ähnliche Weise zu finden. Wenn wir dann alle Zeichen XMAS gefunden haben, erhöhen Sie den Zähler
          • Andernfalls wählen Sie eine andere Richtung in der Schleife

Das sieht komplex und umfangreich aus, ist aber einfach. Konzentrieren Sie sich auf eine Sache nach der anderen und Sie können das Problem leicht lösen.

Für die Umsetzung müssen wir also zunächst ein paar Dinge definieren:

MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX

Also haben wir die Liste der ganzen Zahlen in den Richtungen definiert, die die x- und y-Koordinaten sind, die wir addieren oder subtrahieren müssen, um an die gewünschte Position zu gelangen. Es ist im Grunde wie ein Einheitsvektor, es hat einen Abstand von 1 und eine durch oder angegebene Richtung – was bedeutet, dass man sich für x-Koordinaten nach links oder rechts und für y-Koordinaten nach oben und unten bewegt.

Lassen Sie mich das genauer erklären. Nehmen wir an, ich befinde mich bei (1,2) im Raster, das die Dimension 4x4 hat.

[
    [M M M S X X M A S M]
    [M S A M X M S M S A]
    [A M X S X M A A M M]
    [M S A M A S M S M X]
    [X M A S A M X A M M]
    [X X A M M X X A M A]
    [S M S M S A S X S S]
    [S A X A M A S A A A]
    [M A M M M X M M M M]
    [M X M X A X M A S X]
]

Bei 2,1 haben wir also G , also prüfen wir einige Anweisungen dafür

aufwärts → 0,-1 → 2 0, 1-1 → 2,0, wir sind zu C übergegangen

rechts → 1,0 → 2 1, 1 0 → 3,1 , wir sind zu H übergegangen

unten, links → -1,1 → 2-1, 1 1 → 1, 2, wir sind zu J übergegangen

Sie verstehen also, dass wir uns anhand dieser Koordinaten in einige Richtungen bewegen.

Wir können diese verwenden, um den nächsten Richtungssprung zu ermitteln, den wir machen möchten, um herauszufinden, ob dieses Element das nächste Zeichen in dem Wort hat, das wir suchen.

Wir werden zuerst eine Funktion schreiben, die dies tut, und die Funktion abstrahieren, die prüft, ob wir das Wort im Raster gefunden haben.

func ConstructGrid(lines []string) [][]string {
    grid := [][]string{}
    for _, line := range lines {
        row := []string{}
        for _, char := range strings.Split(line, "") {
            row = append(row, char)
        }
        grid = append(grid, row)
    }
    return grid
}

Die obige Funktion nimmt ein Raster auf und gibt eine Ganzzahl zurück, die die Punktzahl darstellt, d. h. die Anzahl der im Raster/in der Matrix gefundenen Wörter XMAS.

Zuerst müssen wir jede Zeile im Raster durchlaufen. Für jede Zeile iterieren wir über das Zeichen, sodass wir x- und y-Koordinaten als Index des Rasters haben. Wir müssen dann prüfen, ob das aktuelle Zeichen X oder wordList[0] ist. Wenn das der Fall ist, durchlaufen wir alle Richtungen und prüfen, ob wir XMAS, d. h. MAS, in dieser Richtung finden können. Wenn ja, erhöhen wir den Zähler. Was ist die FindXMAS-Funktion? Abstrahieren wir das und übergeben x, y, die Koordinaten des aktuellen Wortes, 1, die Wortposition von XMAS, und in diesem Fall haben wir bereits X gefunden, das wir brauchen MAS in dieser Richtung zu finden. Wir übergeben das Gitter und die Richtung, sodass diese Funktion wahr oder falsch zurückgibt, wenn diese Richtung MAS enthält.

Um es zu wiederholen:

  • Wir iterieren über das Raster und erhalten Zeile und x als Liste der Zeichenfolgen und Index der aktuellen Zeile.

  • Für jede Zeile, d. h. eine Liste von Zeichenfolgen, durchlaufen wir die Liste der Zeichenfolgen, um char und y als Zeichen (Zeichenfolge) und den Index dieses Zeichens in der Liste der Zeichenfolge zu erhalten.

  • Wenn wir feststellen, dass das aktuelle Zeichen gleich X ist, was der 0. Index der Wortliste ist, dann

    • Wir durchlaufen alle Richtungen und rufen die Funktion FindXMAS auf, um zu prüfen, ob das verbleibende Wort MAS in dieser Richtung ist
    • Wenn wir alle Wörter finden, erhöhen wir den Zähler.
  • Also geben wir den Zähler zurück, während wir die Anzahl der Wörter XMAS im Raster/in der Matrix zählen.

Jetzt können wir die FindXMAS-Funktion implementieren, die x- und y-Koordinaten, die Wortposition, die Richtung und das Raster aufnimmt und zurückgibt, wenn das Wort gefunden wird.

  • Zuerst nehmen wir die aktuellen x-Koordinaten und fügen die x-Komponente der Richtung hinzu (0. Index oder erstes Element)

  • aktuelle Y-Koordinaten zur Y-Komponente der Richtung hinzufügen (1. Index oder zweites Element)

  • Wenn die Wortposition, d. h. der Wortindex oder das Wort selbst in der aktuellen Funktion, mit der Wortliste übereinstimmt, bedeutet dies, dass das gesuchte Wort vollständig gefunden wurde

  • Wir müssen durch Hinzufügen der Richtung zu den x- und y-Koordinaten überprüfen, ob wir die Breite und Höhe des Gitters nicht überschreiten. Wenn wir das tun, geben wir ein falsches Ergebnis zurück

  • Das letzte If dient der Überprüfung, ob das aktuelle Zeichen mit dem gesuchten Wort übereinstimmt. Es könnte M, A oder S sein. Wenn ja, rufen wir rekursiv die FindXMAS-Funktion auf, indem wir die aktualisierten x- und y-Koordinaten und das nächste Wort in der Wortliste übergeben. Wir behalten die Richtung bei und übergeben das gesamte Raster.

MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX

Also haben wir die FindXMAS-Funktion implementiert. Diese gibt nur dann zurück, wenn wir das MAS-Wort gefunden haben, indem wir in eine bestimmte Richtung gegangen sind, indem wir die Koordinaten aktualisiert und überprüft haben, ob das Wort an dieser Position im Raster das nächste Wort in MAS ist Liste.

So sieht also der gesamte erste Teil aus:

[
    [M M M S X X M A S M]
    [M S A M X M S M S A]
    [A M X S X M A A M M]
    [M S A M A S M S M X]
    [X M A S A M X A M M]
    [X X A M M X X A M A]
    [S M S M S A S X S S]
    [S A X A M A S A A A]
    [M A M M M X M M M M]
    [M X M X A X M A S X]
]

Wir nehmen die Zeilen als Liste von Zeichenfolgen auf und übergeben diese an ConstructGrid und erhalten das Raster. Schließlich rufen wir TraverseGrid auf, indem wir das Raster übergeben und die Punktzahl als Anzahl der Wörter XMAS im Raster erhalten.

Das war's ab Teil 1.

Teil 2

Für Teil zwei müssen wir MAS in der Kreuzform finden, wie unten:

func ConstructGrid(lines []string) [][]string {
    grid := [][]string{}
    for _, line := range lines {
        row := []string{}
        for _, char := range strings.Split(line, "") {
            row = append(row, char)
        }
        grid = append(grid, row)
    }
    return grid
}

Um dieses Problem zu lösen, können wir einen ähnlichen Ansatz verfolgen, aber viel einfacher: Wir müssen nur A finden, da in der Mitte immer das Wort MAS steht, also prüfen wir einfach, ob wir A und oben links haben , oben rechts oder unten rechts, unten links hat M oder S .

Wir erhalten die Koordinaten der Positionen oben rechts, oben links, unten rechts und unten links, indem wir 1 davon addieren und davon subtrahieren. Wir führen eine grundlegende Prüfung durch, um sicherzustellen, dass wir nicht über die Grenzen des Gitters hinausschießen. Wenn wir über die Grenzen hinausschießen, werden wir das MAS nicht finden

Aber wenn wir uns innerhalb des Rasters befinden, erhalten wir nun das Zeichen an diesen 4 Positionen, wir prüfen, ob oben links und unten rechts M und S oder S oder M haben, ähnlich für oben rechts und unten links hat M und S bzw. S oder M. Dies ist die diagonale Suche nach M und S über und unter dem Zeichen A.

Wenn also beide Diagonalen übereinstimmen, geben wir true zurück.

            S
            A
            M
            X

Das ist also die einfache Implementierung zum Ermitteln des MAS der Diagonale.

Jetzt müssen wir das TraverseGrid ein wenig ändern, da wir einfach über das Raster iterieren und prüfen, ob das Zeichen in der Zeile ein A enthält, d. h. wordList[2]. Wenn wir nun A haben, müssen wir die FindMAS-Funktion mit den aktuellen Koordinaten und dem Gitter aufrufen. Wenn diese Funktion „true“ zurückgibt, erhöhen wir den Zähler.

MMMSXXMASM
MSAMXMSMSA
AMXSXMAAMM
MSAMASMSMX
XMASAMXAMM
XXAMMXXAMA
SMSMSASXSS
SAXAMASAAA
MAMMMXMMMM
MXMXAXMASX

Das ist also die endgültige Implementierung von Teil 2, wir erhalten die Anzahl der MAS in Querrichtung.

Sie können meine Lösungen hier auf GitHub ansehen.

Abschluss

Das war's ab Tag 4 von Advent of Code in Golang. Lassen Sie mich wissen, ob Sie Vorschläge haben und wie Sie daran vorgegangen sind. Gibt es bessere Lösungen?

Viel Spaß beim Programmieren :)

Das obige ist der detaillierte Inhalt vonEinführung des Code Day n Golang: Suche nach XMAS und X-MAS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
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
Mastering Go Saiten: Ein tiefes Eintauchen in das 'Saiten' -PaketMastering Go Saiten: Ein tiefes Eintauchen in das 'Saiten' -PaketMay 12, 2025 am 12:05 AM

Sie sollten sich um das "Zeichenfolgen" -Paket in Go kümmern, da es Tools zum Umgang mit Textdaten und dem Spleißen von grundlegenden Zeichenfolgen bis hin zu erweiterten regulären Ausdrucksanpassungen bietet. 1) Das "Zeichenfolgen" -Paket bietet effiziente String -Operationen, z. B. Join -Funktionen, die zum Spleißen von Zeichenfolgen verwendet werden, um Leistungsprobleme zu vermeiden. 2) Es enthält erweiterte Funktionen, wie z. B. die entsprechende Funktion, um zu überprüfen, ob eine Zeichenfolge einen bestimmten Zeichensatz enthält. 3) Die Ersatzfunktion wird verwendet, um Substrings in einer Zeichenfolge zu ersetzen, und die Aufmerksamkeit sollte auf die Ersatzauftrag und die Fallempfindlichkeit geschenkt werden. 4) Die Split -Funktion kann Zeichenfolgen entsprechend dem Trennzeichen teilen und wird häufig für die regelmäßige Expressionsverarbeitung verwendet. 5) Die Leistung muss bei der Verwendung berücksichtigt werden, wie z.

'Codierung/Binär' -Paket in Go: Ihre Anlaufstelle für binäre Operationen'Codierung/Binär' -Paket in Go: Ihre Anlaufstelle für binäre OperationenMay 12, 2025 am 12:03 AM

Das "Coding/Binary" PackageingoSential ForHandlingBinaryData, das die Bills-Forreading und WritingBinaryDataEffictionly anbietet

Go Byte Slice Manipulation Tutorial: Beherrschen des 'Bytes' -PaketsGo Byte Slice Manipulation Tutorial: Beherrschen des 'Bytes' -PaketsMay 12, 2025 am 12:02 AM

Das Beherrschen des Bytes -Pakets in Go kann dazu beitragen, die Effizienz und Eleganz Ihres Codes zu verbessern. 1) Das Bytes -Paket ist entscheidend für die Analyse binärer Daten, Verarbeitungsnetzwerkprotokolle und Speicherverwaltung. 2) Bytes verwenden. 3) Das Bytes -Paket bietet die Funktionen des Suchens, Ersetzens und Segmentierens von Bytescheiben. 4) Der Typ Bytes.reader eignet sich zum Lesen von Daten aus Bytescheiben, insbesondere in E/A -Operationen. 5) Das Bytes -Paket arbeitet in Zusammenarbeit mit Go's Müllsammler zusammen und verbessert die Effizienz der Big -Data -Verarbeitung.

Wie verwenden Sie das 'Saiten' -Paket, um Saiten in Go zu manipulieren?Wie verwenden Sie das 'Saiten' -Paket, um Saiten in Go zu manipulieren?May 12, 2025 am 12:01 AM

Sie können das "Saiten" -Paket verwenden, um Saiten zu manipulieren. 1) Verwenden Sie Strings.trimspace, um Whitespace -Zeichen an beiden Enden der Zeichenfolge zu entfernen. 2) Verwenden Sie Strings. 3) Fucken Sie die Stringschnitte in eine Zeichenfolge durch Strings.join. 4) Verwenden Sie Strings.Contains, um zu überprüfen, ob die Zeichenfolge ein bestimmtes Substring enthält. 5) Verwenden Sie Strings.replaceall, um den globalen Ersatz durchzuführen. Achten Sie bei der Verwendung auf Leistung und potenzielle Fallstricke.

So verwenden Sie das 'Bytes' -Paket, um Bytescheiben in Go zu manipulieren (Schritt für Schritt)So verwenden Sie das 'Bytes' -Paket, um Bytescheiben in Go zu manipulieren (Schritt für Schritt)May 12, 2025 am 12:01 AM

ThytespackageingoishighryeffectiveforByteslicemanipulation, AngebotsfunktionenForssearching, Spalten, Beiträge und Buffern.1) useBytes.ContainSearchForByTeSequences.2) Bytes.SsplithelpreakdownByTeslicesuseusedelimiter.3) durchtes

Go Codierung/Binärpaket: Praktische BeispieleGo Codierung/Binärpaket: Praktische BeispieleMay 10, 2025 am 12:16 AM

TheCoding/BinaryPackagesingoSential ForHandlingBinaryData, OfferingFunctionStoreAdand und Writedatainbothbig-Endianandlittle-EndianFormats.1) ITSIdeAlfornetworkProtocols, EnablingSerialization und DeserializationOfTructuredDataLepaPaTetHepaTetheSpayPayPayPaySpayerialization

Go Bytes -Paket: Wesentliche Funktionen, die Sie für Byte -Scheiben wissen müssenGo Bytes -Paket: Wesentliche Funktionen, die Sie für Byte -Scheiben wissen müssenMay 10, 2025 am 12:11 AM

TheSessentialFunctionsingo'sByTeSpackAgethatyouneedToKnoware: 1) bytes.IndexForsearchingwithinByTeslices, 2) bytes.splitforParsing Daten, 3) bytes.joinforcatenatingslices, 4) Bytes.ContainsforChingSubSlicePresence und 5) Bytes.ReplaceallfordatRansformatio

Was sind die Alternativen des 'Strings' -Pakets in Go?Was sind die Alternativen des 'Strings' -Pakets in Go?May 10, 2025 am 12:09 AM

GoofferSalternativestothestrierenspackageForStringManipulation: 1) TherexPackageForComplexPatternMatching, 2) thestconvpackageFornumericConversions und 3) externallibrarySlikestrutten -spezifische Operationen

See all articles

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ßer Artikel

Nordhold: Fusionssystem, erklärt
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

EditPlus chinesische Crack-Version

EditPlus chinesische Crack-Version

Geringe Größe, Syntaxhervorhebung, unterstützt keine Code-Eingabeaufforderungsfunktion

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Leistungsstarke integrierte PHP-Entwicklungsumgebung