معرفی Advent of Code

پس از وقفه‌ای یکساله که شاید در آینده درباره‌اش بنویسم برمی‌گردیم سروقت نوشتن. اینبار قصد دارم چالش Advent of Code را به خوانندگان عزیر معرفی کنم.

چیست این Advent؟

در عموم کشورهای مسیحی به ایامی که مؤمنین خود را برای جشن تولد مسیح آماده می‌کنند Advent گفته می‌شود. این ایام معمولا سه هفته اول ماه دسامبر است تا روز اول کریسمس (۲۵ دسامبر در آلمان). مثلا در کشور آلمان در این ایام بازارچه‌های سال نو برپا هستند (که همگی حداکثر یکی دو روز قبل از کریسمس تعطیل می‌کنند) و برنامه‌های مختلف سرگرم‌کننده برای کودکان و بزرگسالان در سراسر کشور برپاست. رایج است که در این کشورها مردم به شکل‌های مختلف به استقبال کریسمس می‌روند. یکی از رایج‌ترین اقلامی که در این ایام بویژه برای کودکان خریداری می‌شود یک تقویم ادونت است. یک تقویم ادونت بیست و پنج خانه دارد، یکی برای هر روز. معمولا این تقویم‌ها برای هر روز یک خانه دارند که می‌توان درب آن را باز کرد و داخل آن معمولا تصویر یا متن یا یک جایزه قرار دارد.

Advent of Code

برنامه‌نویس خوش‌قریحه‌ای بنام Eric Wastl از سال ۲۰۱۵ هر ساله در این ایام چالشی بنام Advent of Code منتشر می‌کند. این چالش از روز اول دسامبر شروع می‌شود و ۲۵ روز ادامه دارد. در بامداد هر روز او یک سوال روی سایت چالش منتشر می‌کند که دو بخش دارد. با حل هر بخش می‌توان یک ستاره دریافت کرد و در پایان ۲۵ روز حداکثر ۵۰ ستاره جمع‌آوری کرد.

ساختار چالش

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

ساختار چالش‌ها شبیه مسابقات ICPC است (زمان ما می‌گفتیم ACM). به این صورت که یک ورودی تست و یک خروجی تست به همراه یک ورودی اصلی برای هر قسمت ارائه می‌شود. گاهی قسمت دوم هم از همان ورودی قسمت اول استفاده می‌کند و ورودی جدیدی ندارد. برنامه‌نویس فقط کافیست که جواب صحیح را وارد کند و نیازی به سابمیت کردن کدی که نوشته است نیست. اصلا هم مهم نیست که به چه زبانی مسئله‌ها را حل می‌کنیم. در ضمن نیازی به حل تمام مسائل نیست. اگر سوالی وقت‌گیر یا مشکل بود می‌توان رفت سروقت بعدی و از ستاره‌ی سوال سخت صرف‌نظر کرد.

روش کار من

من سال گذشته تا روز ۱۹ را حل کردم. البته در روز ۱۹ گیر کردم و دیگر نتوانستم پیشروی کنم! البته سعی کرده بودم حتما هر روز را حل کنم تا بروم روز بعدی که توصیه می‌کنم شما اینکار را نکنید و اگر سوالی خیلی سخت بود بروید سروقت بعدی. در ضمن سعی کرده بودم که همه را با زبان برنامه‌نویسی Go بنویسم که آنهم کمی وقت گرفت ولی در مجموع خوب بود. پیشنهاد من اینست که در هر برنامه‌ای که می‌نویسید یک ساختار یکسان را رعایت کنید:

۱. ورودی را از فایل بخوانید (فایل‌ها را با یک ساختار خوب ذخیره کنید مثلا dayXinput و dayXtestinput).

۲. فایل را پارس کنید و در یک ساختار داده‌ی درست ذخیره کنید. مثلا اگر گراف است در یک ساختار گراف درست با جستجو و حذف و اضافه ذخیره کنید.

۳. چالش را برای ورودی تستی حل کنید.

۴. چالش را برای ورودی اصلی حل کنید.

کتابهای لازم

برای حل مسائل الگوریتمی اگر می‌توانید حتما دو کتاب را دم دست داشته باشید. هر دو کتاب رفرنس‌های بسیار معتبر و شناخته‌شده‌ای هستند.

Introduction to Algorithms by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein (aka CLRS)

The Algorithm Design Manual by Steve S. Skiena

گروه‌های پشتیانی

اگر به سایت چالش دقت کنید همانجا تعدادی گروه معمولا انگلیسی زبان برای پشتیبانی لیست شده. فعالترین آنها ساب‌ردیت خود چالش است. آنها اگر مثلا دنبال 2022 day 5 بگردید پست‌های مربوط به آن را پیدا می‌کنید. در ضمن می‌توانید از سایدبار بخوانید که چطور سوال بپرسید. چون پست‌ها انواع مختلفی دارند، مثلا بعضی افراد هر سال برای راه‌حل‌هایشان جلوه‌های بصری تولید می‌کنند و با بقیه به اشتراک می‌گذارند. در پست‌های خاصی هم جواب‌هایشان را منتشر و مقایسه می‌کنند. حتما سایدبار را بخوانید که بتوانید جواب درست بگیرید.

جدای از کامیونیتی انگلیسی زبان هم می‌توانید اینجا بپرسید (که طول می‌کشد منتشر بشود) یا ایمیل بزنید و یا روی اتاق ماتریکس یا آی‌آر‌سی بپرسید یا روش بهتری پیدا کنید یا یکی بسازید.

بیش از این روده‌درازی نمی‌کنم. این شما و این هم چالش ادونت آو کد سال ۲۰۲۳!

موفق باشید.