logo-favicon

گروه فناوری اطلاعات شریف

مسابقات کد نویسی مبهم Spaghetti Contest

کاربر گرامی؛ ثبت نام این رویداد در بهمن ماه ۱۴۰۴ انجام خواهد شد.

مقدمه

در طول تاریخ برنامه نویسی، سبک های مختلفی برای برنامه نویسی ابداع شدند. روشهای برنامه نویسی ساخت یافته، پیمانه ای و شی گرا از معروفترین سبک های برنامه نویسی بشمار می آیند. اما پیش از همه آنها نخستین سبک برنامه نویسی، برنامه نویسی اسپاگتی نامیده می شد. دورانی که دستور Go to رواج داشت و برنامه ها به شدت ناخوانا بودند. زیرا ترتیب اجرای سطرهای برنامه، به دلیل استفاده مکرر از دستور Go to همچون رشته های اسپاگتی تو درتو و سردرگم بود. به همین دلیل برنامه ها عموما کم حجم و پر از خطا بودند. هنگامی که برنامه نویسان برای نجات از این وضع، دستور Go to را منع کردند و سعی کردند بجای آن از حلقه های for و while و متغیرهای منطقی (Boolean) استفاده کنند دوران این سبک برنامه نویسی به پایان رسید و سبک برنامه نویسی ساخت یافته آغاز گشت.

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

قوانین مسابقات

سوال مسابقه

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

هدف مسابقه

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

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

مسابقه برنامه نویسی اسپاگتی نیاز به رعایت برخی نکات و اصول شخصی و اخلاقی دارد.

  1. شما در روز مسابقه در صورتی که سوالی دارید کافی ست دست خود را بالا گرفته تا یکی از داوران به سمت شما آمده و سوال شما را پاسخ دهد. همچنین در صورتی که میخواهید پاسخی را ارائه دهید نیز همین کار را انجام دهید.
  2. داوران به ترتیب دیدن بلند شدن دستها به سوالات پاسخ میدهند، بنابراین دست خود را بالا نگه داشته و صبور باشید.
  3. در هنگام مسابقه میبایست جهت مشورت با هم گروهی خود، به آرامی صحبت کنید تا مزاحم دیگر تیم ها نشوید. فرض کنید، به یک کتابخانه رفته اید.
  4. در هنگام مسابقه با تلفن همراه صحبت نکنید.
  5. حق استفاده از ماشین حساب هایی که امکان برنامه نویسی دارند، یا گوشی های هوشمند، تبلت و لپتاپ نخواهید داشت.
  6. در صورتی که نیاز به برگه های سفید جهت بررسی روند کدها دارید، دست خود را بالا بگیرید، تیم اجرایی آنها را در اختیار شما قرار میدهند.
  7. در رفت و آمد ها سکوت را رعایت کنید.
  8. شما نمیتوانید با سایر تیم ها مشورت کنید.
  9. این یک رقابت سالم است، بنابراین از تقلب، ارائه پاسخ به دیگر تیم ها و مواردی از این دست بپرهیزید. این موارد باعث حذف تیم ها خواهد شد.
  10. اگر داوری پاسخ شما را نادرست ثبت کرد، با او وارد بحث نشوید، زیرا پاسخ داده شده باید کاملا مطابق خروجی کد باشد، وگرنه داور اعلام پاسخ نادرست خواهد کرد.
  11. اینکه از داورها بخواهید بگویند کجای پاسخ نادرست است و یا چه کاراکترهایی را نادرست حدس زده اید، تنها باعث همهمه و مزاحمت برای دیگران میشود، زیرا داوران به هیچ وجه به چنین سوالاتی پاسخ نخواهند داد. پاسخ آنها در این موارد، تنها کلمه “درست” یا “نادرست” خواهد بود.
  12. اعضای تیم، به محض خروج از محوطه ی مجاز مسابقه که توسط تیم اجرایی اعلام میشود، امکان بازگشت نخواهند داشت.
  13. اگر موردی از کد هست که شما به دلیل آشنا نبودن به آن نمیتوانید آن کد را بررسی کنید، دست خود را بالا گرفته تا داوران این مورد را برای شما توضیح دهند. داوران به طور خلاصه مورد را برای شما توضیح خواهند داد، بنابراین انتظار نداشته باشید چند بار تکرار کرده، یا مانند یک کلاس دو ساعته، همه ی جوانب را توضیح دهند، اما حداکثر سعی خود را خواهند کرد تا در مدت زمان کم، بهترین پاسخ که انتظار دارید را ارائه دهند.
  14. سایر قوانین در روز مسابقه به صورت شفاهی ارائه میشود.

مشتاق دیدار شما در روز مسابقه هستیم.

مرحله مقدماتی

مرحله مقدماتی : در مرحله نخست، کلیه تیم های شرکت کننده با قرعه کشی در چند گروه تقسیم میشوند. در این مرحله هر تیم، برنامه سایر تیم های هم گروهش را در اختیار می گیرد تا در فرصت مسابقه، خروجی این برنامه ها را حدس بزنددر پایان این مرحله، تیمی که خروجی برنامه اش توسط تیم های کمتری کشف شود تیم برنده گروه است. در بین تیم هایی که برنامه هایشان از این نظر امتیاز مساوی دارند تیمی برنده است که تعداد کد بیشتری را شکافته باشد و در صورت مساوی بودن تعداد مسائل حل شده، تیمی برنده است که مجموع زمان حل مسائلش کمتر باشد. در مدت مسابقه، هر تیمی که خروجی یک برنامه را حدس بزند باید حدسش را با داور گروه در میان بگذارد تا داور درستی یا نادرستی حدس را اعلام کند.

در پایان مرحله نخست مسابقه، تیمهای دارای بیشترین امتیاز از هر گروه به مرحله نهایی راه می یابند. به همین دلیل تیم ها بهتر است در هنگام اعلام خروجی یک برنامه دقت کنند زیرا به ازای هر حدس نادرست، مجموع زمان حل مسائلشان ده دقیقه افزوده میشود!

پس از پایان زمان یک ساعته صرف غذا، نتایج مسابقات صبح اعلام می شود و تیم های برگزیده هر گروه برای شرکت در دور نهایی مسابقه به سالن مسابقه باز میگردند.

مرحله نهایی

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

 

هدف از برگزاری مسابقه کدنویسی مبهم

Spaghetti Contest   یک مسابقه برنامه‌نویسی است. هدف از برگزاری این مسابقه صرفاً یک رقابت فنی بین افراد نیست، بلکه قرار است در این رویداد دانش و مهارت برنامه‌نویسی شرکت‌کنندگان افزایش یابد و مهارت و دانش کسب شده در صنعت فناوری اطلاعات کشور مورد استفاده قرار گیرد و شرکت کنندگان مسابقه بعد از این رویداد وارد بازار کار کشور شوند. به این منظور سعی کردیم مسابقه را به سمتی سوق دهیم که حداکثر تعداد مخاطبین را از جامعه‌ی فنی و برنامه‌نویسان کشور داشته باشیم.

مخاطبین برنامه

دانشجویان و برنامه نویسان جهت شرکت در مسابقه

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

شرکت و سازمان های فعال در حوزه فناوری اطلاعات جهت استفاده از خروجی های مسابقات

مزایای شرکت در مسابقات برای برنامه نویسان

مزایای مشارکت مجموعه ها و سازمان ها در برگزاری مسابقات کد نویسی مبهم