AoC - Day Mull it Over (C# et Python)
Dec 10, 2024 am 11:42 AMRéfléchissez-y
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.
Partie 1
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]; }
Partie 2
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]; }
Tentative de solution Python
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!

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Comment utiliser la belle soupe pour analyser HTML?

Comment télécharger des fichiers dans Python

Comment utiliser Python pour trouver la distribution ZIPF d'un fichier texte

Comment travailler avec des documents PDF à l'aide de Python

Comment se cacher en utilisant Redis dans les applications Django

Comment effectuer l'apprentissage en profondeur avec TensorFlow ou Pytorch?

Comment implémenter votre propre structure de données dans Python
