Skip to content

دومین روز Advent of code 2023

Posted on:December 3, 2023 at 04:26 PM

سلام سلام. امروز میخوام سوال روز دوم AOC2023 رو حل کنم. همانطور که گفته بودم هر دو سوال امروز رو حل کردم. پس بریم سراغ سوال های امروز

بخش اول

سوال این بخش اینه که ما سه دسته گوی داریم با رنگ قرمز و آبی و سبز. از هر رنگ هم تعداد معدودی داریم. ۱۲ قرمز، ۱۳ سبز، ۱۴ آبی. بعد میگه چند دور بازی میکنیم و هر دور بازی از سه دست درست شده و یه آی‌دی هم داره. حالا بازی چیه؟ هر دست تعداد از گوی ها رو برمیداره و رنگ اونها رو اعلام میکنه. مثلا قرمز ۹، آبی ۸.

اینجا احتمالا از خودتون میپرسید خب حالا کار ما چیه؟ با بگم هیچی فقط باید هر دست چک کنید آیا اعداد گفته شده از تعداد گوی‌هایی که داریم بیشتر است یا نه، اگر تمام دست ها درست بودند اون دور از بازی یه بازی صحیح است در غیر این صورت اون دست یه دست غیرممکن است. در پایان هم باید آی‌دی تمام دستهای که درست بودند رو باهم جمع کنیم و در خروجی وارد کنیم.

مثال

Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
Game 2: 1 blue, 2 green; 3 green, 15 blue, 1 red; 1 green, 1 blue
Game 3: 8 green, 6 blue, 2 red; 5 blue, 4 red, 13 green; 5 green, 1 red

در دور اول هر سه دست صحیح است. اما در دور دوم ۱۵ آبی گفته شده در حالی که فقط ۱۴ گوی آبی است و در نتیجه این دور درست نیست. در دور پایانی هم تمام اعداد کمتر از محدودیت اعلام شده است. نتیجه نهایی هم ۱+۳ = ۴ میشه

کد

بالاخره به مرحله کد رسیدیم. برای حل ابتدا باید دیتا را سطر به سطر مرور کنیم. هر سطر را به صورت کلی میتوان شامل دو بخش دانست. اولی اطلاعات شماره بازی و دومی اطلاعات دور بازی. این مرحله با یک تابع split(”:”) امکان پذیر میشه. برای دستیابی به شماره بازی باید اطلاعات بازی را split(” ”) کنیم و بخش دوم این مقدار جدا شده شماره بازی است. هر دور شامل سه دست میشه که با split(”;”) اطلاعات هر دست را به دست آورد. حالا ما تعداد N green, N blue, N red که ترتیب خاصی ندارند و ممکنه تو بعضی از دست‌‌ها هر رنگی نباشه. تو این مرحله ما باز یه بار دیگه split(”,”) انجام میدیم و حالا آرایه ای برای هر دور داریم که به صورت که اگه یه بار دیگه split(” ”) کنیم ترکیبی از رنگ گوی و تعداد اون رو داریم که میتونیم چک کنیم و اگر همه این دوتایی رنگ و عدد صحیح بود عدد این دور رو ذخیره و در پایان این اعداد ذخیره شده رو جمع میکنیم.

[[Game,1],[[[3,blue],[4,red]],[[1,red],[2,green],[6,blue]],[[2,green]]]]

در بالا آرایه های ساخته شده در هر مرحله نمایش داده شده و ب همانطور دیدید و خواندید، این مرحله پیچیدگی خاصی نداره و با یه تابع split میشه حل کرد. برای مشاهده کدی که من نوشتم هم میتونید به این لینک مراجعه کنید.

بخش دوم

نوبتی هم که باشه نوبت بخش دوم سوال هست که تو این مرحله از ما میخواد کمترین مقدار از رنگ که برای هر گوی لازمه تا بازی بدون مشکل انجام رو پیدا کنیم. بعد این اعداد رو در هم ضرب کنیم و این میشه امتیاز هر دست. سپس امتیاز تمام دست ها رو جمع کنیم ( واضح تر بگم اینه هر دور بزرگترین عدد هر دور برای هر رنگ رو ذخیره کنیم )

مثال

Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green

در دور اول کمترین گوی مورد نیاز برای قرمز ۴ و آبی ۶ و سبز ۲ است که ضرب اونها میشه ۴۸. دیگه این مرحله محدودیت های مرحله قبل رو نداریم.

کد

با توجه به روش مرحله اول تغییر زیادی لازم نیست اعمال بشه این تغییرات رو به ترتیب لیست کردم

1.آبجکتی که سه مقداری سبز و قرمز و آبی را ذخیره کند.

2.این آبجکت یا کلاس ساخته شده شامل دو متد زیر باشد

a.متد افزایش که یک رنگ و یک عدد میگیرد و اگر عدد وارد شده از عدد خود این آبجکت بزرگتر باشد جایگزین این عدد میشود

b.متد محاسبه امتیاز آبجکت که عدد سه آبجکت را در هم ضرب میکند

3.در ابتدای هر دور نمونه جدیدی از این آبجکت ساخته شود.

4.به جای شرط مرحله قبل عدد و رنگ به تابع افزایش آبجکت داده شود

5.در پایان هم به جای ریترن آی‌دی دور، خروجی تابع محاسبه امتیاز بازگشت داده شود.

با اعمال تغییرات بالا شما میتوانید سوال بخش دوم رو نیز حل کنید.( به همین راحتی )

برای مشاهده کدی که من نوشتم هم میتونید به این لینک مراجعه کنید.

مرسی از وقتی که گذاشتید.

سلامت و خندون باشید ✌️