سوالات هفته ششم لیگ مای‌کد به همراه پاسخ

سوالات هفته ششم لیگ مای‌کد به همراه پاسخ

سوالات چالشی هفته ششم لیگ مای‌کد به همراه پاسخ‌های مورد انتظار تست کیس‌ها جهت آشنایی بیشتر شرکت‌کنندگان در لیگ منتشر می‌گردد.

دریافت
عنوان: پنهان سازی درآمد
حجم: 394 کیلوبایت
توضیحات: سوال چالشی محاسبه میانگین با پنهان سازی درآمد


پاسخ تیم برنده


دریافت
عنوان: رمزگذاری rot13
حجم: 236 کیلوبایت
توضیحات: سوال چالشی رمزگذاری rot13

پاسخ تیم برنده 


دریافت
عنوان: صندلی طلایی در آمفی تئاتر
حجم: 338 کیلوبایت
توضیحات: سوال چالشی یافتن صندلی طلایی در آمفی تئاتر با استفاده از زاویه ی محاطی

پاسخ تیم برنده


تابع اصلی مرتبط با سوال اول

 // حلقه‌ای برای پردازش هر خط ورودی
                for (int i = 0; i < lines.Length; i++)
                {
                    string line = lines[i]; // دریافت خط فعلی از آرایه ورودی
                    string[] part1 = line.Split('$'); // تقسیم رشته ورودی به دو بخش با استفاده از علامت '$'

                    // ابتدا درامد هارو جدا میکند و سپس تبدیل به نوع عددی میکند و بعدش تبدیل به لیست
                    int[] Money = part1[0].Split(',').Select(int.Parse).ToArray();
                    int R = int.Parse(part1[1]); // R قرار دادن عدد تصادفی در متغیر

                    // مرحله 1: افزودن R به درآمد نفر اول
                    int sum = R + Money.Sum(); //Sum(): برای جمع بستن تمام اندیس های ارایه درامد

                    // مرحله 2 و 3: شبیه‌سازی انتقال مقادیر و بازگشت آن به نفر اول
                    int fullSum = sum; // در اینجا تغییری ایجاد نمی‌شود، اما برای فعال بودن منطق برنامه این مرحله را حفظ می‌کنیم

                    // مرحله 4: حذف R و محاسبه میانگین
                    int fullmoney = fullSum - R; // مقدار اولیه را از مجموع کل کم می‌کنیم
                    int Average = fullmoney / Money.Length; // محاسبه میانگین درآمدها

                    // مرحله 5: محاسبه کد تأیید
                    int verificationCode = fullSum % R; // مقدار کل باقی‌مانده را بر R تقسیم کرده و باقیمانده را به‌عنوان کد تأیید ذخیره می‌کنیم

                    // ذخیره نتیجه در خروجی
                    outputLines[i] = $"{Average}${verificationCode}"; // خروجی شامل میانگین درآمدها و کد تأیید است که با '$' جدا می‌شوند
                }  

تابع اصلی مرتبط با سوال دوم

        // متد تبدیل یک حرف به صورت ROT13
        static char nex13Char(char c) // تابع تبدیل یک حرف به روش nex13
        {
            if (c >= 'a' && c <= 'z')// برسی اینکه ایا کاراکتر حرف کوچیک انگلیسی است یا نه
            {
                // محاسبه جایگاه حرف در الفبا (0 تا 25)
                int offset = c - 'a'; 
                // اعمال انتقال ۱۳ موقعیت و چرخش به ابتدای الفبا در صورت نیاز
                offset = (offset + 13) % 26;

                return (char)('a' + offset);// برگرداندن حرف جدید
            }
            else if (c >= 'A' && c <= 'Z')// اگر حرف بزرگ باشد
            {
                int offset = c - 'A';
                offset = (offset + 13) % 26;
                return (char)('A' + offset);
            }
            else
            {
                // اگر حرف نباشد (مثلاً فاصله یا نماد) بدون تغییر برگردان
                return c;
            }
        }

        // متد تبدیل کل رشته به صورت nex13 or Rot13
        static string Rot13String(string input)
        {
            //StringBuilder به ما اجازه می‌دهد بدون ایجاد نسخه‌های جدید، رشته‌ی خود را در حافظه تغییر دهیم، که عملکرد برنامه را بهینه‌تر می‌کند.
            StringBuilder sb = new StringBuilder();


         //حلقه foreach برای پردازش هر کاراکتر
            //هر کاراکتر ورودی در حلقه foreach پردازش شده و به رشته جدید اضافه می‌شود.
            
            foreach (char c in input) //این حلقه، تمامی کاراکترهای موجود در رشته‌ی input را یک به یک پردازش می‌کند.
            { //در هر تکرار، یک کاراکتر (char c) از رشته ورودی خوانده شده و درون متغیر c ذخیره می‌شود.

                sb.Append(nex13Char(c)); //این تابع قرار است هر کاراکتر را پردازش کرده و در صورت نیاز آن را طبق الگوریتم nex13 تبدیل کند.
            }
            return sb.ToString(); //در نهایت، تمامی کاراکترهای پردازش‌شده که در StringBuilder ذخیره شده‌اند، به یک رشته‌ی معمولی (string) تبدیل می‌شوند.
            //سپس این رشته به عنوان خروجی تابع بازگردانده می‌شود.
        }

تابع اصلی مرتبط با سوال سوم

 // پردازش هر خط از ورودی
                for (int i = 0; i < inputLines.Length; i++)
                {
                    // حذف فضای اضافی از ابتدا و انتهای خط
                    string line = inputLines[i].Trim();
                    // اگر خط خالی بود، خروجی هم خالی می‌شود
                    if (string.IsNullOrEmpty(line))
                    {
                        outputLines[i] = "";
                        continue;
                    }

                    // تقسیم خط به اجزای عددی بر اساس فضای خالی (انتظار: ۴ عدد)
                    string[] parts = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    if (parts.Length != 4)
                    {
                        outputLines[i] = "خطای ورودی";
                        continue;
                    }

                    // تبدیل رشته‌ها به اعداد صحیح؛ در صورت عدم موفقیت، خطا ثبت می‌شود
                    if (!int.TryParse(parts[0], out int L) ||
                        !int.TryParse(parts[1], out int Xsys) ||
                        !int.TryParse(parts[2], out int Ysys) ||
                        !int.TryParse(parts[3], out int N))
                    {
                        outputLines[i] = "خطای ورودی";
                        continue;
                    }

                    // محاسبه مربع فاصله هدف (targetSquared)
                    // به این صورت: (Xsys)^2 + (Ysys)^2
                    int targetSquared = Xsys * Xsys + Ysys * Ysys;

                    // ایجاد لیست برای ذخیره مختصات صندلی‌های طلایی
                    List<(int x, int y)> goldenSeats = new List<(int, int)>();

                    // بررسی صندلی‌ها: ردیف‌ها از y = -N تا y = -1
                    for (int y = -N; y <= -1; y++)
                    {
                        // ستون‌ها از x = 0 تا x = L
                        for (int x = 0; x <= L; x++)
                        {
                            // محاسبه اختلاف افقی و عمودی نسبت به نقطه‌ی خاص
                            int dx = x - Xsys;
                            int dy = y - Ysys;
                            // محاسبه مربع فاصله: (dx)^2 + (dy)^2
                            int dSquared = dx * dx + dy * dy;
                            // اگر مربع فاصله برابر با targetSquared شود، صندلی طلایی است
                            if (dSquared == targetSquared)
                            {
                                goldenSeats.Add((x, y));
                            }
                        }
                    }

                    // اگر هیچ صندلی طلایی پیدا نشد، مقدار خروجی 404 خواهد بود
                    if (goldenSeats.Count == 0)
                    {
                        outputLines[i] = "404";
                    }
                    else
                    {
                        // مرتب‌سازی صندلی‌های طلایی:
                        // ابتدا بر اساس y به صورت نزولی (یعنی ردیف نزدیک به -1 ابتدا)
                        // سپس بر اساس x به صورت صعودی (از چپ به راست)
                        var sortedSeats = goldenSeats
                            .OrderBy(seat => seat.y * -1)  // مرتب‌سازی نزولی بر اساس y
                            .ThenBy(seat => seat.x)         // مرتب‌سازی صعودی بر اساس x
                            .ToList();

                        // ساخت رشته خروجی: هر صندلی با فرمت (x,y) و جدا شده با کاما
                        string output = string.Join(",", sortedSeats.Select(seat => $"({seat.x},{seat.y})"));
                        outputLines[i] = output;
                    }
                }


دریافت
عنوان: پاسخ تیم برنده به سوالات هفته ششم
حجم: 1.75 مگابایت
توضیحات: با توضیحات کامل

۰ ۰ ۰ دیدگاه

دیدگاه‌ها

هیچ نظری هنوز ثبت نشده است.
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی

لیگ دانش‌آموزی ACM - مای‌کُد

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

دسته‌بندی
آخرین مطلب
پیوندها
بایگانی