کدفورسس یا codeforces یا به اختصار cf یک سایت برنامه نویسی رقابتی و جاج آنلاین است که در سال ۲۰۰۹ توسط آقای میخاییل میرزایانوف و رفقا از دانشگاه ITMO طراحی شد. یک سایت با بک-اند خیلی قوی و فرانت-اند خیلی ساده.
با اینکه تا الان بیش از ۱۰ سال از تولد این سایت میگذره اما ظاهر اون دست نخورده. شاید هم از قاعده if it works, don't touch anything پیروی میکند.
در سال ۲۰۱۳ این سایت مدعی شد که با بیش از ۶۰۰ هزار کاربر فعال از سایت topcoder پیشی گرفته است. این سایت توسط برنامهنویسان برتر رقابتی همچون Gennady Korotkevich و Petr Mitrichev مورد استفاده قرار میگیرد.
اما همه برنامهنویسها هم سطح نیستند. برای این که کانتستها عادلانه برگزار بشه division تعریف کردن. طبق جدول پایین همه شرکت کنندهها با توجه به امتیاز (rating) ای که دارند مشابه سیستم ELO به ۳ دیویژن مختلف تقسیم میشن. div-1 سخت ترین و div-2 آسون ترین سوالات رو دارن:
این سایت توسط بسیاری از دانشگاههای جهان برای درک بهتر انواع الگوریتمها توصیه میشود. همچنین این سایت هنوز در حال توسعه است.
ابتدا وارد سایت codeforces.com شوید. سپس Register را بزنید.
در مرحله بعد هم یک یوزرنیم و ایمیل و پسورد مناسب وارد میکنیم. به ایمیل ما لینک تایید ارسال میشود پس باید واقعی باشد. در confirm password هم باید همان رمز را دوباره انتخاب کنیم.
شاید کمک کند: آموزش ساخت جیمیل + | آموزش انتخاب رمز ایمن +
سپس دکمه Register را میزنیم.
همچنین میتوانستیم از پایین همین فرم گزینه Use Gmail را میزدیم و با استفاده از حساب گوگل خود اقدام به پر کردن فرم میکردیم.
در نهایت یک ایمیل ارسال میشود که باید وارد لینک مربوطه شوید تا ایمیلتان تایید شود. (ممکن است ایمیل ارسالی در پوشه اسپم شما یا لیبل تبلیغات هم باشد.)
با زدن روی فرم به داشبورد خود در کدفورسس وارد میشوید و عملا ثبت نام تمام شده است.
در این صفحه تبهای زیادی وجود دارد که در ادامه به توضیحات آنها خواهیم پرداخت.
برای این کار با توجه به نامکاربری یا همان یوزرنیمی که برای خود انتخاب کردیم لینک زیر را تکمیل میکنیم. برای این کار به جای [USERNAME] یوزرنیم خود را وارد میکنیم:
https://codeforces.com/profile/[USERNAME]
برای دیدن صفحه کدفورسس من از این لینک + استفاده کنید.
ابتدا به بررسی نوار اصلی سایت میپردازیم. با این نوار به جاهای مختلف سایت میرویم.
صفحه HOME: در این صفحه پستهای حمایت شده codeforces و اعلانهای رسمی قرار دارند. همچنین گهگاهی ویژگیهای جدید بروزرسانیها نمایش داده میشوند. در این صفحه وبلاگهای اعلان مسابقههم اطلاعاتی همچون نویسنده و زمان مسابقه و مدت برگزاری و . . . هم قرار دارد.
صفحه HELP: در این صفحه قوانین و تقسیم بندی ها و سیستم کلی کدفورسس تشریح شده و به بسیاری از سوالات پاسخ داده شده است.
صفحه TOP: این صفحه شامل محبوبترین وبلاگها و نظرات میباشد. با کلیک در نوار فرعی آن میتوانید در این دو صفحه جابهجا شوید.
صفحه CATALOG: این یک صفحه مبتنی بر جامعه است که حاوی وبلاگهای نوشته شده توسط انجمنها است که بر اساس موضوعات مرتب شدهاند.
صفحه CONTESTS: در این صفحه که شاید مهمترین صفحه کدفورسس باشد میتوانید تمام مسابقات برنامه ریزی شده را که بر اساس تاریخ مرتب شده پیدا کنید. این مسابقات شامل اطلاعات کوتاهی همانند عنوان آنها و نویسندگان و زمان شروع و مدت مسابقه است. میتوانید با استفاده از دکمه Register که چند روز قبل از مسابقه ظاهر میشود اقدام به ثبت نام در مسابقه بکنید. شما نمیتوانید بدون ثبت نام در مسابقه شرکت کنید و اگر ثبت نام کنید و چیزی ارسال نکنید هم امتیازی به شما بابت مسابقه اضافه نمیشود.
این صفحه همچنین شامل تمام مسابقاتی که در سایت رخ داده و با توجه به تاریخ برگزاری مرتب شده نیز میباشد. بنابراین جدیدترین مسابقه در بالای صفحه نمایش داده میشود. از طرفی صفحه تقویم برای مشاهده تمام مسابقات آینده از تقویم نیز استفاده میشود. صفحه تقویم اطلاعات مربوط به مسابقات گذشته و آینده را به شکل مختصرتر و سازماندهی شده نشان میدهد. این تقویم بر اساس تقویم گوگل میباشد. شما به راحتی میتوانید بر تقویم خود را بر اساس سال یا ماه یا هفته نمایش دهید.
در بالای صفحه مسابقه میتوانید به جدول رده بندی نیز دسترسی داشته باشید که به ترتیب مکان شرکت کنندگان است. رتبه اول بالاترین جایگاه میباشد. جدول رده بندی دوستانه نیز وجود دارد که میتوانید رتبه افرادی که دنبال میکنید را مشاهده کنید. بهتر است تنها عملکرد افرادی که برایتان مهم است را دنبال کنید.
در بالا چند تب مختلف را در این صفحه نمایش دادهام. یکی از گزینه ها برای ما در همان صفحه PROBLEMS گزینه Ask a question میباشد. میتوانید در مورد مشکلات خاصی که در درک بخشی از بیانیه دارید توضیح بخواهید. از این دکمه برای درخواست کمک برای رفع اشکال کد یا درخواست راهحل یا درخواستهای نامربوط استفاده نکنید.
صفحه GYM: در این صفحه مجموعه وسیعی از gym ها را داریم. همچنین با زد بر روی هر مسابقه اطلاعات مفیدی در باره آن به شما نمایش داده میشود. همه این مسابقات نوشته شده توسط انجمنها هستند و در رتبه بندی و rating محاسبه نمیشود.
صفحه PROBLEMSET: در این صفحه در نوار آن میتوانید به بخشهای مختلف این صفحه بروید. این سوالات بر اساس شماره شناسه آنها مرتب شده اند. بنابراین سوالاتی که به تازگی منتشر شده اند در بالای صفحه قراردارند. در جدول برای هر مشکل یک شناسه و نام و تعدادی برچسب هست. در کنار اینها گزینههای ارسال و ستاره نیز وجود دارند. با زدن گزینه ارسال که به شکل هواپیمای کاغذی میباشد شما به صفحه ارسال کد هدایت میشوید. با کلیک بر روی ستاره هم سوال را به موارد دلخواه اضافه میکنید. در ادامه هم درجه سختی سوال را داریم که از 800 تا 3500 داریم و همینطور تعداد افرادی که آن سوال را پاسخ داده اند. میتوان با زدن بر روی علامت رعد و برق یا تیک سبز آنها را بر اساس درجه سختی یا تعداد افرادی که حل کردهاند مرتب کرد. (یک بار کلیک نزولی و بار دیگر صعودی)
چگونه سوالات را حل کنیم؟
هنگامی که مشکلی را انتخاب میکنیم مشخصات آن از جمله عنوان و موقعیت آن در مسابقه و محدودیت زمانی و محدودیت حافظه و فرمت ورودی و خروجی و نمونهها و یادداشتهای مشکل را داریم.
محدودیت زمان بیشترین زمانی است که راه حل شما در یک تست اجرا میشود. اگر راه حل شما از محدودیت تعیین شده زمان بیشتری بطلبد مردود است.
محدودیت حافظه بیشترین مقدار حافظه است که برنامه شما میتواند مصرف کند. در صورتی که حافظه مصرفی شما بیشتر باشد جواب مردود است.
برچسبهای مسائل موضوعات/الگوریتمهایی هستند که میتوان از آنها برای حل مسئله استفاده کرد. اگر برچسب خاصی وجود داشته باشد به این معنی نیست که راه حل باید با آن راه حل مرتبط باشد. اما راه حلی با استفاده از آن موضوع خاص وجود داردو برچسبها ممکن است توسط اعضای انجمنی که به رتبه 1900 یا بالاتر دست یافته اند قرار دهند.
در صورت تمرین میتوانید تعیین کنید که آیا میخواهید برچسب ها را ببینید یا خیر. فقط کافیست روی کادر show tags در سمت راست صفحه PROBLEMSET کلیک کنید. در آنجا میتوانید مشکلات حل شده را نیز پنهان کنید.
صفحه GROUPS: صفحه گروهها به شما این امکان را میدهد گروههایی را که در آنها عضو هستید ببینید. شما همچنین میتوانید تمام گروههای موجود را لیست کنید و گروه خود را ایجاد کنید. برای هر گروه شما نقش متفاوتی دارید. participant و Manager و Creator انواع نقش ها در گروه میباشد. هر نقش به موارد مختلفی دسترسی دارد که مهمترین آنها نقش creator یا سازنده گروه است. پیوستن به برخی گروهها مستلزم آن است که مدیرگروه (manager) یا سازنده درخواست شما را بپذیرد. هنگامی که یک گروه خصوصی باشد از شما خواسته میشود تا خط مشی ثبت نام را مشخص کنید که بر اساس آن اعضا میتوانند به گروه بپیوندند.
صفحه RATING: این صفحه یک صفحه نسبتا ساده است و هدف اصلی آن تحسین عملکرد دیگران است. فیلترهایی مثل انتخاب کشور و شهر یا سازمان هم وجود دارد. شما همچنین میتوانید به رتبه بندیهای دوستان خود نگاه کنید، به استثنای دیگران. در صفحه رتبه بندی میتوانید نام کاربر و تعداد مسابقاتی که شخص در آن شرکت کرده و امتیاز فعلی او را ببینید. (معمولا بعد از انتشار تغییرات رتبه بندی یک دور، به روزرسانی کمی طول بکشد.)
صفحه EDU: در این صفحه لیستی از دورههایی است که توسط کدفورسس و . . . ارائه داده شده است. شما میتوانید در این دورهها شرکت کنید. معمولا دوره ها شامل بخش تئوری و عملی است. بخش تئوری معمولا شامل یک ویدیو است که حاوی توضیح کوتاه اما مختصر درباره موضوع است. بخش تمرین هم معمولا شامل برخی مسائل است که در آنها میتوانید الگوریتم و دانشی را که در تکمیل نظریه به درست آوردهاید اعمال کنید. این دوره همچنین شامل یک بخش نظرات است که میتوانید نظرات خود را درباره دوره به اشتراک بگذارید یا در آن مورد سوال بپرسید.
صفحه CALENDAR: در این صفحه به طور فشرده زمان مسابقات را داریم.
صفحه API: در این صفحه کدفورسس به شما یک API ارائه میکند. شما میتوانید با کلیدهای POST و GET رابط API خود را مدل کنید. این صفحه شامل تمام اطلاعاتی است که هنگام ساخت یک API از این سایت نیاز داریم قرار دارد. این روش نسبت به روشهای قدیمی بهتر است.
صفحه Profile: همانطور که در تصویر نشان داده شده است در سمت راست صفحه میتوانید با کلیک روی تصویر یا نام خود وارد صفحه پروفایل شوید.
فعالیت بازیکن و Rating آن در یک نمودار و یک جدول نشان داده شده است.
در صفحه CONTESTS مستقیما به مسابقات دسترسی پیدا میکنید اما همچنین میتوانید با زدن Enter در سمت راست سایت هم به مسابقه وارد شوید.
ابتدا باید وارد پروفایل خود شوید و سپس تب submission را انتخاب کنید.
در این صفحه ارسالها و وضعیتشان به ترتیب زمان کاهش مییابد (آخرین ارسال بالاترین) همچنین میتوانید موارد ارسالی را بر اساس نوع نتیجه یا زبان برنامه نویسی و مسابقات فیلتر کنید.
برای اینکار باید به صفحه مسابقه مشکل بروید و از این صفحه status را انتخاب کنید.
در اینجا تمامی ارسال ها برای این مسابقه وجود دارند. شما میتوانید با استفاده از فیلتر کردن (مثلا تنها سوال یک و موارد accept شده) با زدن روی شناسه ارسال (در ستونی که بالای آن # قرار دارد) جوابی که Accept شده را ببینید.
راههای مختلفی برای اینکار وجود دارد. اگر در صفحه مشکل هستید میتوانید به سمت راست پایین صفحه که در آن آخرین ارسالهای مشکل وجود دارد را نگاه کنید. برای مشاهده آن کافی است که روی شناسه ارسالی که در ستون اول جدول است کلیک کنید.
راه دیگر رفتن به صفحه مسابقه است و همانطور که به سوال چگونه ارسالهای دیگران را مشاهده کنیم پاسخ دادیم اینبار روی دکمه My submissions کلیک میکنیم.
با رفتن به پروفایل یک نفر و زدن ستاره نزدیک نام او این شخص را دوست معرفی میکنید. اساسا به این معنی است که شما اکنون فعالیت این شخص را دنبال میکنید. بنابراین با مشاهده وضعیت و انتخاب گزینه friends only فقط موارد ارسالی کسانی را که دنبال میکنید مشاهده خواهید کرد. در مورد رتبه بندی در یک مسابقه در قسمت about contest هم همینطور است.
دوستی در کدفورسس یک رابطه یکطرفه است و غیرممکن است که ببینید چه کسی با شما دوست شده است.
شماره مشارکت مبلغی است که شما به جامعه کمک میکنید. شما با ایجاد وبلاگها و یا نظراتی که رای مثبت (upvotes) دریافت میکنند، مشارکت یا همان contribution دریافت خواهید کرد. همچنین downvotes (رایهای منفی) contribution شما را کاهش میدهد. سهم وبلاگهای قدیمی شما پس از مدتی کمتر میشود و به طور خاص پس از ۶ ماه رایهایی که بدست میآورید بسیار کمتر از رایهایی است که هم اکنون میگیرید.
هر کسی میتواند در کدفورسس وبلاگ بنویسد. اگر پستی را دوست دارید میتوانید با کلیک کردن روی مثلث سبز به آن رای مثبت دهید یا با زدن مثلث قرمز به آن رای منفی دهید.
هر وبلاگ زیر خود نظراتی دارد. هر کسی میتواند در وبلاگهای شخص نظر دهد. مانند وبلاگها، میتوانید به نظرات هم رای مثبت یا منفی دهید. همچنین میتوانید نظرات خود را ویرایش کنید هر چند که با زدن دکمه rev ویرایشهای قبلی برای دیگران قابل دسترس خواهد بود.
رایهای موافق مختلف میزان متفاوتی از رایهای موافق را به همراه دارند. بنابراین در حالی که برای یک مبتدی (newbie's) این رای به عنوان یک محاسبه میشود اما برای یک متخصص (expert's) این مقدار ۳ است. این عدد مدتی پس از رای موافق تغییر میکند نه فورا، بنابراین هنگامی که شما رای موافق دادید فقط یک تغییر میکند اما مقدار بعدا به مقدار رای مثبت مربوطه تغییر میکند.
برای اینکار میتوان در سمت راست وسط صفحه پنچره Find user را پیدا کرد و در فیلد Handle نام کاربری آنها را نوشت.
اکثر دورها نوشته شده توسط انجمنها هستند. وقتی به الزامات خاصی رسیدید دکمه Propose a contest/problems زیر پروفایل شما ظاهر میشود. در این مورد در این لینک + بیشتر بخوانید.
در حال حاضر ۵ نوع راند وجود دارد:
نکته: div.4 هم برای ریتینگ 1399=> وجود دارد که احتمالا دیگر وجود ندارد برای همین در اینجا لیست نکردیمش!
پس از هر مسابقه یک Editorials منتشر میشود. سرمقاله وبلاگی است که توسط نویسندگان راند نوشته شده است که حاوی راه حلهایی برای تمام مشکلات مسابقه است، گاهی اوقات با کد. با کلیک بر روی دکمه tutorial در سمت راست پایین صفحه مشکل در قسمت contest materials به آن دسترسی دارید.
مسابقات مجازی یک راه عالی برای تمرین میباشد. آنها محیط مسابقه را کاملا شبیهسازی میکنند. در طول یک مسابقه مجازی میتوانید ببینید که اگر در مسابقه شرکت کردهاید مکان شما چقدر خواهد بود و مکان خود را طوری محاسبه کنید که انگار واقعا در آن مسابقه شرکت کردهاید. با رفتن به صفحه مسابقه و کلیک بر روی دکمه شورع مسابقه مجازی میتوانید یک virtual contest راه اندازی کنید.
برای اینکار بای روی نماد قفل برای قفل کردن یک مشکل کلیک کنید. توجه کنید که پس از قفل کردن مشکل، نمیتوانید راه حل خود را برای آن ارسال کنید. سپس به اتاق نتایج بروید. جایی که میتوانید کدهای هم اتاقیها برای مشکلاتی که قبلا قفل کردهاید را ببینید (با دوبار کلیک روی آن در جدول نتاجی اتاق میتوانید راه حل خاصی را ببینید) بعد از اینکه راه حل شخصی را باز کردید میتوانید آن را در نظر بگیرید و سپس آن را هک کنید. هنگام هک کردن یک کد شما در حال وارد کردن تستی هستید که در آن کد به احتمال زیاد شکست میخورد. (ممکن است پاسخ اشتباه باشد یا با محدودیت زمان یا حافظه تمام شده باشد) هنگامی که میخواهید یک تست بزرگ وارد کنید میتوانید به جای تایپ مولد تست را ارسال کنید. مولد تست باید برنامه شما باشد که یک فایل تست در آن تولید میکند. پس از هک یک کد میتوانید نتیجه را مشاهده کنید. نتیجه ممکن است Successful hack باشد که با اینکار شما ۱۰۰ امتیاز دریافت میکنید. در غیر اینصورت Unsuccessful hack است که کد شکست نمیخورد و شما 50 امتیاز منفی دریافت میکنید.
این قابلیت برای این است که راه حلهایی که صرفا بر اساس شانس و تست کیس ها Accept شده اند مردود اعلام شوند.
نکته مهم:
یکی از مهمترین چیزهایی که باید به خاطر بسپارید این است که هرگز اعتماد به نفس خود را از دست ندهید زیرا گاهی اوقات ممکن است برخی از سوالات را پیدا کنید که برای شما دشوار به نظر میرسد و هیچ ایدهای در مورد نحوه حل آنها نخواهید داشت اما هرگز از آنها نترسید. بریا حل مشکل زمان کافی بگذارید و به دنبال سرمقالهها باشید یا اگر در دام مشکل خاصی گرفتار شدید از قدیمیترهای این حرفه کمک بگیرید. اما بیانگیزه نشوید و هرگز فکر نکنید که نمیتوانید سوالات را انجام دهید زیرا هیچ چیز غیر ممکن نیست.
موفق باشید ❤