سوال مسابقه
هر تیم برای شرکت در مسابقه باید به ناخواناترین شکل ممکن، برنامهای به زبان c++ بنویسد که با هر بار اجرا شدن، رشتهای معین به طول حداقل یک و حداکثر سه کاراکتر را روی صفحه نمایش چاپ کند.
توجه : این رشته میبایست همواره ثابت باشد، نه آنکه در هر بار اجرا رشته ای متفاوت چاپ کند، و یا اینکه با انتقال به کامپیوتری دیگر، خروجی متفاوتی بدهد.
توجه : تمام کاراکترهای این رشته باید روی صفحه کلید موجود و قابل تایپ باشند.
هدف مسابقه
با توجه به اینکه در زبان سی پلاس پلاس، بسیاری از دستورات به صورت کاملا شفاف وجود دارد و به دلیل عدم وجود ابزار محدود کننده آنها به صورت کاملا قدرتمند قابل استفاده هستند، بنابراین کسانی که به این زبان تسلط دارند، مفاهیم آرایه ها، اشاره گرها، روش های ذخیره سازی و بازیابی اطلاعات، فراخوانی توابع و اکثر دستورات پایه ای که ممکن است در زبانهای سطح بالا حذف شده باشند یا پشت دستورات دیگر پنهان شده باشد و یا محدود شده باشند را به صورت کاملا پایه ای مسلط هستند.
در این مسابقه میتوان توانمندی افراد را در این زمینه ها را کشف کرد.
آنچه این مسابقه در پی نمایش آن نیست، توانمندی کار تیمی، اصول مهندسی نرم افزار و توانمندی برنامه نویسی اصولی ست که در مسابقات دیگر به آن پرداخته خواهد شد.
قوانین کد نویسی
- برنامه باید تحت کامپایلر Dev C++ Version 6.3 و تحت سیستم عامل ویندوز قابل اجرا باشد
(فایل مربوط به این کامپایلر، با امکان اجرا در ویندوز ۷،۸ و ۱۰ در اختیار تیمها قرار داده میشود. شما میتوانید از هر کامپایلر دیگری استفاده کنید ولی توجه کنید که کد شما میبایست در این کامپایلر اجرا شود.).
هر برنامه از نظر حجم سه محدودیت دارد. اول اینکه برنامه باید حداکثر ۲۱ سطر داشتهباشد. دوم اینکه در هر سطر برنامه نباید بیش از ۷۸ حرف وجود داشته باشد.
(هر کاراکتر Tab، معادل ۸ حرف به حساب میآید.) این دو محدودیت برای اینست که وقتی در محیط ادیتور C++ برنامه باز میشود، کل دستورات برنامه در محدوده یک صفحه بگنجد. محدودیت سوم اینست که تعداد سمیکالنهای موجود در برنامه نباید از ۴۰ تا بیشتر شود!
(در این زمینه دور زدن مجاز نیست مثلا نباید دستورات مختلفی را در میان حلقه for با ویرگول از هم جدا کنید یا با دستور #define نام سمی کالن را در برنامه عوض کنید.) - حروف مجاز در رشته خروجی برنامه شامل حروف کوچک و بزرگ الفبای انگلیسی، اعداد و علامتهایی که روی صفحه کلید وجود دارند محسوب میشود.
(مثلا علامتهایی چون | و @ و ” مجازند اما علائمی چون α و ∑ و ¥ یا حروف فارسی ممنوعند. چاپ کاراکتر Enter و ابتدای خط غیر مجاز است اما کاراکترهایی چون space، Tab و Backspace که چاپ آنها، موجب جابجایی حروف در خروجی برنامه میشود مجاز هستند به شرطی که اولا آنقدر چاپ نشوند که صفحه scroll شود و ثانیا برنامه در نهایت تمامی حروف رشته را بهم چسبیده و در گوشه سمت چپ بالای صفحه چاپ نماید.) - از آنجائی که در روز مسابقه کامپیوتری در اختیار تیمها قرار داده نمیشود و در عین حال، هر تیم باید معنای تک تک دستورات برنامه های سایر تیمها را بدانند،
هر تیم محدودیتهایی در دستورات قابل استفاده در برنامهاش دارد. استفاده از دستورات معمول C++ مجاز است مثلا کلیه دستورات انتساب، شرطها و عملگرهای شرطی و منطقی، حلقه ها، آرایه ها، اشارهگرها و متغیرهای محلی و سراسری و صد البته دستور goto مجاز است اما در عوض، استفاده از دستورهای اسمبلی در برنامه، کلیه عملگرهای بیتی، کلاسها (class) و کلیه توابع کتابخانهای C++ (بجز دستور cout که برای چاپ رشته خروجی مورد نیاز است) ممنوع میباشد.
(یعنی حتی حق استفاده از دستوراتی از قبیل cin، gotoxy، clrscr، printf، puts و حتی getch را هم ندارید!) از بین دستورات پیش پردازنده که در C++ با عملگر # آغاز میشوند تنها دستور #include و #define قابل استفاده هستند. (البته دستور #include هم تنها یکبار در آغاز برنامه برای فراخوانی فایل h میتواند بکارگرفته شود تا دستور cout در برنامه قابل استفاده باشد.) با تمام این اوصاف، اگر در نوشتن یک برنامه از دستوری استفاده شدهباشد که اعضای تیم مقابل معنای آنرا ندانند در حین مسابقه میتوانند معنای آن دستور را از داوران بپرسند! - کلیه اطلاعات مورد نیاز برنامه باید در درون متغیرهای خودش قرار داشته باشد و نباید از اطلاعات سیستم عامل یا اطلاعات سختافزاری و نرمافزاری کامپیوتر بهره گرفت. مثلا کار با وقفه ها، محتویات یک فایل یا محتویات آدرس خاصی از حافظه Ram در برنامه ممنوع است. تنها استثناء این قانون، مقدار اولیهایست که زبان C++ به طور پیش فرض در هنگام تعریف متغیرها، درونشان قرار میدهد. شما حق استفاده از این مقدار در محاسبات را دارید که عملا در هر اجرای برنامه یک مقدار تصادفی خواهد بود که سیستم عامل درون متغیرهای برنامه قرار میدهد! توجه کنید که این موارد در صورتی میتوانند استفاده شوند، که خروجی برنامه همواره ثابت باشد، مثلا شما میتوانید این مقدار را به متغیری اضافه کرده و در جایی دیگر کسر کنید، و این مقدار نباید در خروجی نهایی برنامه دخیل باشد. به علاوه برای مثال خواندن بایت ۱۳ فایل exe که ثابت است، در برنامه مجاز نیست. شما تنها حق استفاده از متغیرهای برنامه خود و مقادیر اولیه آن را دارید.
- تکیه بر معماها، قضایا و بسط های ریاضی و هندسی مجاز نیست.
- همچنین شما نمیتوانید با تکیه بر الگوریتم های پیچیده ی برنامه نویسی، مانند الگوریتم های پیمایش درخت، الگوریتم برج هانوی و … برنامه خود را سخت کنید. الگوریتم های معمولی و ساده قابل قبول است. بنابراین لطفا به این توجه داشته باشید، کدها باید نامفهوم باشد، نه الگوریتم ها پیچیده.
- برخی معیارها کیفی هستند و حتما باید صحتشان تحت نظارت داوران تائید گردد. مثلا اگر چه پیچاندن مسیر اجرایی برنامه با استفاده از عملگرهای ریاضی و حلقهها مجاز است اما تیم ها مجاز نیستند بجای درهم پیچیدن رشتههای اسپاگتی برنامه، آنها را طولانی ببافند تا رقبا از دنبالکردنشان خسته شوند! برای مثال برنامه های که مجموع صد جمله نخست دنباله فیبوناچی را محاسبه کرده و سپس رقم یکان این عدد بسیار بزرگ را چاپ کند غیر مجاز محسوب میشود! اینکه تا چندبار تکرار حلقهها مجاز است و دقیقا چند متغیر قابل استفاده است و وقتی دو عدد در هم ضرب میشوند باید حداکثر چند رقمی باشند و تا چند بار میتوان در یک برنامه، از عملگر جمع و تفریق، ضرب و تقسیم یا حلقه استفاده کرد همه و همه معیارهایی کیفی هستند نه کمی. به همین دلیل لطفا برنامههای خود را پس از پیادهسازی اولیه، به داوران ارائه دهید تا ایراداتشان را خاطرنشان نمایند.
قوانین روز مسابقه
مسابقه برنامه نویسی اسپاگتی نیاز به رعایت برخی نکات و اصول شخصی و اخلاقی دارد.
- شما در روز مسابقه در صورتی که سوالی دارید کافی ست دست خود را بالا گرفته تا یکی از داوران به سمت شما آمده و سوال شما را پاسخ دهد. همچنین در صورتی که میخواهید پاسخی را ارائه دهید نیز همین کار را انجام دهید.
- داوران به ترتیب دیدن بلند شدن دستها به سوالات پاسخ میدهند، بنابراین دست خود را بالا نگه داشته و صبور باشید.
- در هنگام مسابقه میبایست جهت مشورت با هم گروهی خود، به آرامی صحبت کنید تا مزاحم دیگر تیم ها نشوید. فرض کنید، به یک کتابخانه رفته اید.
- در هنگام مسابقه با تلفن همراه صحبت نکنید.
- حق استفاده از ماشین حساب هایی که امکان برنامه نویسی دارند، یا گوشی های هوشمند، تبلت و لپتاپ نخواهید داشت.
- در صورتی که نیاز به برگه های سفید جهت بررسی روند کدها دارید، دست خود را بالا بگیرید، تیم اجرایی آنها را در اختیار شما قرار میدهند.
- در رفت و آمد ها سکوت را رعایت کنید.
- شما نمیتوانید با سایر تیم ها مشورت کنید.
- این یک رقابت سالم است، بنابراین از تقلب، ارائه پاسخ به دیگر تیم ها و مواردی از این دست بپرهیزید. این موارد باعث حذف تیم ها خواهد شد.
- اگر داوری پاسخ شما را نادرست ثبت کرد، با او وارد بحث نشوید، زیرا پاسخ داده شده باید کاملا مطابق خروجی کد باشد، وگرنه داور اعلام پاسخ نادرست خواهد کرد.
- اینکه از داورها بخواهید بگویند کجای پاسخ نادرست است و یا چه کاراکترهایی را نادرست حدس زده اید، تنها باعث همهمه و مزاحمت برای دیگران میشود، زیرا داوران به هیچ وجه به چنین سوالاتی پاسخ نخواهند داد. پاسخ آنها در این موارد، تنها کلمه “درست” یا “نادرست” خواهد بود.
- اعضای تیم، به محض خروج از محوطه ی مجاز مسابقه که توسط تیم اجرایی اعلام میشود، امکان بازگشت نخواهند داشت.
- اگر موردی از کد هست که شما به دلیل آشنا نبودن به آن نمیتوانید آن کد را بررسی کنید، دست خود را بالا گرفته تا داوران این مورد را برای شما توضیح دهند. داوران به طور خلاصه مورد را برای شما توضیح خواهند داد، بنابراین انتظار نداشته باشید چند بار تکرار کرده، یا مانند یک کلاس دو ساعته، همه ی جوانب را توضیح دهند، اما حداکثر سعی خود را خواهند کرد تا در مدت زمان کم، بهترین پاسخ که انتظار دارید را ارائه دهند.
- سایر قوانین در روز مسابقه به صورت شفاهی ارائه میشود.
مشتاق دیدار شما در روز مسابقه هستیم.
مرحله مقدماتی
مرحله مقدماتی : در مرحله نخست، کلیه تیم های شرکت کننده با قرعه کشی در چند گروه تقسیم میشوند. در این مرحله هر تیم، برنامه سایر تیم های هم گروهش را در اختیار می گیرد تا در فرصت مسابقه، خروجی این برنامه ها را حدس بزند. در پایان این مرحله، تیمی که خروجی برنامه اش توسط تیم های کمتری کشف شود تیم برنده گروه است. در بین تیم هایی که برنامه هایشان از این نظر امتیاز مساوی دارند تیمی برنده است که تعداد کد بیشتری را شکافته باشد و در صورت مساوی بودن تعداد مسائل حل شده، تیمی برنده است که مجموع زمان حل مسائلش کمتر باشد. در مدت مسابقه، هر تیمی که خروجی یک برنامه را حدس بزند باید حدسش را با داور گروه در میان بگذارد تا داور درستی یا نادرستی حدس را اعلام کند.
در پایان مرحله نخست مسابقه، تیمهای دارای بیشترین امتیاز از هر گروه به مرحله نهایی راه می یابند. به همین دلیل تیم ها بهتر است در هنگام اعلام خروجی یک برنامه دقت کنند زیرا به ازای هر حدس نادرست، مجموع زمان حل مسائلشان ده دقیقه افزوده میشود!
پس از پایان زمان یک ساعته صرف غذا، نتایج مسابقات صبح اعلام می شود و تیم های برگزیده هر گروه برای شرکت در دور نهایی مسابقه به سالن مسابقه باز میگردند.
مرحله نهایی
پس از صرف ناهار و استراحتی کوتاه، مرحله نهایی مسابقه بین تیم های برگزیده گروه ها آغاز می گردد. در این مرحله هم مانند مرحله نخست به هر تیم، کد برنامه های تیم های دیگر داده میشود تا در پایان این مرحله، تیم برنده مسابقه تعیین شود. بخاطر داشته باشید که اعضای هر تیم در حین مسابقه حق مشورت با یکدیگر یا استفاده از انواع کتاب، جزوه، ماشین حساب و خط کش و … را دارند اما استفاده از هرگونه کامپیوتر یا موبایل در حین مسابقه ممنوع میباشد. البته جدول کدهای اسکی معادل کاراکترها در اختیار هر تیم قرار میگیرد. همچنین از آنجایی که مسابقه برای کشف کدهایی است که با دستورات آشنا به طرز مبهمی نوشته شده اند میباشد، بنابراین اگر دستوری نا آشنا در کد و جود دارد، میتوانید از داوران بپرسید، تا پاسخ آن را به شما ارائه دهند.