Rumah >pembangunan bahagian belakang >Tutorial Python >AoC - Day Mull it Over (C# dan Python)
Cabaran hari ini menjerit Regex apabila saya mula-mula melihatnya, terutamanya kerana setiap kali saya melihat "ekstrak bahagian rentetan ini", Regex adalah goto saya;
Konsep dan Keperluan Asas
Jadi kita perlu mencari semua mul(nombor1, nombor2) dan darabkan ini bersama-sama, tetapi abaikan semua aksara lain.
Jadi kita perlu mencari mekanisme untuk mencari semua pengisytiharan fungsi mul() yang sah.
Untuk melakukan ini, kita boleh memanfaatkan kuasa Regex, menggunakan corak berikut
mul([0-9]{1,3},[0-9]{1,3})"
Yang akan sepadan pada mul( sebarang nombor antara 0-9 , nombor 1 > 3 kali kurungan penutup.
Setelah kami mendapat padanan mul(), kami boleh menggunakan regex sekali lagi untuk mengeluarkan nombor, menghuraikan ini dan menambah jumlahnya.
Penyelesaian yang agak mudah dan mudah.
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]; }
Ini menambahkan arahan yang lebih rumit, menambah frasa kaveat yang do() dan jangan() akan mendayakan atau melumpuhkan fungsi mil().
Cara terbaik untuk mengendalikan perkara ini, nampaknya mudah, kemas kini corak Regex kepada akaun do() dont() atau mul(nombor, nombor
Regex kini akan mencari mana-mana frasa ini, dengan menggunakan | oprator.
Kami kemudiannya boleh mengulanginya dan menggunakan pernyataan suis untuk memutuskan sama ada kami melihat padanan do, dont atau mil() dan mengemas kini bendera yang didayakan dengan sewajarnya.
Kemudian adalah semakan mudah sama ada ia mul() dan isEnabled adalah Benar, sebelum mendarab dan menambah jumlahnya.
Kod Penuh untuk kedua-dua penyelesaian di bawah
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]; }
Jika anda baru dalam siri saya, saya akan mengulangi semula, saya menggunakan AoC '24 untuk membantu mempelajari dan meningkatkan kemahiran Python sedia ada saya - jadi semua penyelesaian akan termasuk percubaan C# dan Python.
Kami boleh menggunakan konsep yang sama tetapi memanfaatkan bahasa dan fungsi 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()
Seperti biasa anda boleh mengikuti saya di twitter atau melihat keseluruhan repo untuk mendapatkan lebih banyak penyelesaian di Github.
Atas ialah kandungan terperinci AoC - Day Mull it Over (C# dan Python). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!