Die heutige Herausforderung schrie nach Regex, als ich sie zum ersten Mal sah, vor allem, weil jedes Mal, wenn ich „Teile dieser Zeichenfolge extrahieren“ sehe, Regex mein Ziel ist;
Grundkonzept und Anforderungen
Wir müssen also alle mul(Zahl1, Zahl2) finden und diese miteinander multiplizieren, aber alle anderen Zeichen ignorieren.
Wir müssen also einen Mechanismus finden, um alle gültigen mul()-Funktionsdeklarationen zu finden.
Dazu können wir die Leistungsfähigkeit von Regex nutzen, indem wir das folgende Muster verwenden
mul([0-9]{1,3},[0-9]{1,3})"
Das passt auf mul( jede Zahl zwischen 0-9, eine Zahl von 1 > 3 mal schließende Klammer.
Sobald wir die mul()-Übereinstimmungen haben, können wir Regex erneut verwenden, um die Zahlen abzurufen, diese zu analysieren und zur Gesamtsumme zu addieren.
Eine ziemlich einfache und unkomplizierte Lösung.
void Part1() { const string regex = @"mul\([0-9]{1,3},[0-9]{1,3}\)"; var matches = Regex.Matches(input, regex); var total = 0; foreach (Match match in matches) { var numbers = GetNumbers(match); total += numbers[0] * numbers[1]; } } int[] GetNumbers(Match match) { var numbers = Regex.Matches(match.Value, "\d{1,3}"); var a = int.Parse(numbers[0].Value); var b = int.Parse(numbers[1].Value); return [a, b]; }
Dies fügte etwas kompliziertere Anweisungen hinzu und fügte den Vorbehalt hinzu, dass do()- und don't()-Phrasen die mil()-Funktionen aktivieren oder deaktivieren.
Der beste Weg, damit umzugehen, schien einfach zu sein: Aktualisieren Sie das Regex-Muster, um do() dont() oder mul(number, number
zu berücksichtigenDer Regex sucht nun nach einer dieser Phrasen, indem er das | verwendet Betreiber.
Wir können diese dann durchlaufen und mithilfe einer Switch-Anweisung entscheiden, ob es sich um eine Do-, Dont- oder mil()-Übereinstimmung handelt, und das aktivierte Flag entsprechend aktualisieren.
Es ist dann eine einfache Prüfung, ob es ein mul() ist und isEnabled True ist, bevor es multipliziert und zur Gesamtsumme addiert wird.
Vollständiger Code für beide Lösungen unten
using System.Text.RegularExpressions; var input = File.ReadAllText("./input1.txt"); // var input = @"xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))"; Part1(); Part2(); return; void Part1() { const string regex = @"mul\([0-9]{1,3},[0-9]{1,3}\)"; var matches = Regex.Matches(input, regex); var total = 0; foreach (Match match in matches) { var numbers = GetNumbers(match); total += numbers[0] * numbers[1]; } Console.WriteLine("Total: " + total); } void Part2() { const string regex = @"do\(\)|don't\(\)|mul\([0-9]{1,3},[0-9]{1,3}\)"; var matches = Regex.Matches(input, regex); // At the start, mul instructions are enabled var isEnabled = true; var total = 0; // loop over the matches (e.g do(), dont() or mul(x, y) foreach (Match match in matches) { switch (match.Value) { case "do()": isEnabled = true; break; case "don't()": isEnabled = false; break; default: { if (match.Value.StartsWith("mul") && isEnabled) { var numbers = GetNumbers(match); total += numbers[0] * numbers[1]; } break; } } } Console.WriteLine("Total: " + total); } int[] GetNumbers(Match match) { var numbers = Regex.Matches(match.Value, "\d{1,3}"); var a = int.Parse(numbers[0].Value); var b = int.Parse(numbers[1].Value); return [a, b]; }
Wenn Sie neu in meiner Serie sind, wiederhole ich es noch einmal: Ich verwende AoC '24, um meine vorhandenen Python-Kenntnisse zu erlernen und zu verbessern – daher umfassen alle Lösungen sowohl C#- als auch Python-Versuche.
Wir können ähnliche Konzepte verwenden, aber die Sprache und Funktionen von Python nutzen:
import re # Read input from file with open("./input1.txt", "r") as file: input_text = file.read() # Part 1 def part1(): regex = r"mul\(\d{1,3},\d{1,3}\)" matches = re.findall(regex, input_text) total = 0 for match in matches: a, b = get_numbers(match) total += a * b print(f"Total: {total}") # Part 2 def part2(): regex = r"do\(\)|don't\(\)|mul\(\d{1,3},\d{1,3}\)" matches = re.findall(regex, input_text) is_enabled = True # At the start, mul instructions are enabled total = 0 for match in matches: if match == "do()": is_enabled = True elif match == "don't()": is_enabled = False elif match.startswith("mul") and is_enabled: a, b = get_numbers(match) total += a * b print(f"Total: {total}") # Helper function to extract numbers from a match def get_numbers(match): numbers = re.findall(r"\d{1,3}", match) return int(numbers[0]), int(numbers[1]) # Execute parts part1() part2()
Wie immer können Sie mir auf Twitter folgen oder sich das gesamte Repo für weitere Lösungen auf Github ansehen.
Das obige ist der detaillierte Inhalt vonAoC – Day Mull it Over (C# und Python). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!