سلام، امیدوارم حالتون خوب باشه. امروز میخوام اولین سوال AOC2023 رو توضیح بدم و کمی هم درباره حلش بگم. پس بدون این که وقت تلف کنیم بریم سراغش.
بخش اول
خب خلاصه سوال بخش اول اینه که به ما چند خط متن داریم و هرخط شامل تعدادی کراکتر حرفی و عددی است و ما باید اولین و آخرین عدد هر سطر رو استخراج کنیم و با اون یه عدد دو رقمی تشکیل بدیم که دهگانش اولین عدد از سمت چپ و یکانش اولین عدد از سمت راست است (اگر یکی بود اون رقم تکرار میشه تا یه عدد دو رقمی تشکیل بده)، سپس تمام این اعداد دو رقمی هر سطر رو باهم جمع میکنیم و در نهایت مجموع رو به عنوان جواب در نظر میگیریم.
مثال
برای این که مشخص تر بشه مثال زیر رو آماده کردم:
a12k20191mb8
aaaaa9aaaaaa
b2c3ddddddddd
در سطر اول اولین عدد از سمت چپ عدد ۱ است و اولین عدد از سمت راست ۸ پس خروجی این سطر ۱۸ میشه. در سطر دوم اولین عدد از سمت چپ عدد ۹ و عدد دیگری وجود نداره پس خروجی این سطر ۹۹ میشه. در آخرین سطر هم اولین عدد از سمت چپ عدد ۲ و اولین عدد از سمت راست ۳ است پس خروجی این سطر ۲۳ میشه. در پایان هم جواب ۱۸+۹۹+۲۳ = ۱۴۰ میشه. به همین راحتی :)
پیادهسازی
هر مسئله پیچیده از چند مسئله سادهتر درست شده که حل اونها سادهها باعث شکسته شدن مسئله و حل شدن اون میشه ( این جمله رو از جادی گفته. احتمالا با اندکی تغییر ). خب مراحل حل این مسئله به ترتیب زیر است:
- خواندن دیتا
- مرور سطر به سطر دیتا و انجام عملیات زیر
- جدا کردن اعداد از حروف با رجکس
+d
. البته در Rust برای استفاده از regex باید کتابخانه Regex رو نصب کنید. البته میشه روی تمام حروف هر سطر حرکت کرد و بعدش اعداد رو تشخیص داد و اونها رو استخراج کرد که من استفاده نکردم و ترجیح دادم از Regex استفاده کنم - اگر عدد جدا شده یک رقمی باشد اونها رو در ۱۱ ضرب میکنیم که رقم ها تکرار بشن. در صورتی که بیش از یک رقم باشد فقط رقم سمت راست و چپ را ذخیره میکنیم و به بقیه رقمها کاری نداریم
- جدا کردن اعداد از حروف با رجکس
- جمع کردن رقم های ذخیره شده
- پایان برای مشاهده کد این بخش به زبون Rust به این صحفه مراجعه کنید و اگر هم دوست دارید بقیه سوالهای حل شده توسط من رو ببینید این ریپازیتوری جایی هست که باید برید.
مرسی که تا اینجا با من همراه بودید. فردا حل سوال دوم رو میزارم و البته خبرخوش اینه که روز دوم وقت کردم سوالهای هر دو بخش رو حل کنم و مثل امروز ناقص نیست. سلامت و خندون باشید✌️