Maison >développement back-end >Tutoriel Python >AoC - Day Mull it Over (C# et Python)
Le défi d'aujourd'hui criait Regex quand je l'ai vu pour la première fois, principalement parce que chaque fois que je vois "extraire des parties de cette chaîne", Regex est mon choix ;
Concept de base et exigences
Nous devons donc trouver tous les mul(number1, number2) et les multiplier ensemble, mais ignorer tous les autres caractères.
Nous devons donc trouver un mécanisme pour trouver toutes les déclarations de fonction mul() valides.
Pour ce faire, nous pouvons exploiter la puissance de Regex, en utilisant le modèle suivant
mul([0-9]{1,3},[0-9]{1,3})"
Qui correspondra sur mul (n'importe quel nombre compris entre 0 et 9, un nombre de 1 > 3 fois la parenthèse fermante.
Une fois que nous avons les correspondances mul(), nous pouvons à nouveau utiliser l'expression régulière pour extraire les nombres, les analyser et les ajouter au total.
Une solution assez simple et directe.
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]; }
Cela a ajouté des instructions légèrement plus compliquées, en ajoutant la mise en garde selon laquelle les phrases do() et don't() activeront ou désactiveront les fonctions mil().
La meilleure façon de gérer cela, semble simple, mettez à jour le modèle Regex pour tenir compte de do() dont() ou mul(number, number
La Regex recherchera désormais l'une de ces expressions, en utilisant le | opérateur.
Nous pouvons ensuite les parcourir et, à l'aide d'une instruction switch, décider si nous envisageons une correspondance do, don ou mil(), et mettre à jour l'indicateur activé en conséquence.
Il s'agit ensuite d'une simple vérification pour savoir si c'est un mul() et si isEnabled est True, avant de multiplier et d'ajouter au total.
Code complet pour les deux solutions ci-dessous
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]; }
Si vous êtes nouveau dans ma série, je vais le répéter, j'utilise AoC '24 pour m'aider à apprendre et à améliorer mes compétences Python existantes - donc toutes les solutions incluront à la fois des tentatives C# et Python.
Nous pouvons utiliser des concepts similaires mais en tirant parti du langage et des fonctions Python :
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()
Comme toujours, vous pouvez me suivre sur Twitter ou consulter l'intégralité du dépôt pour plus de solutions sur Github.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!