سلام دوست عزیز😃👋

به مسابقه «المپیک فناوری: PHP/Laravel» خوش آمدی!

لینک‌های مفید برای شرکت در مسابقه:

هرگونه ارتباط با سایر شرکت‌کنندگان و یا استفاده از ابزارهای تولید کد، مثل chatGPT و... در مسابقات کوئرا ممنوع است و بعد از شناسایی از لیست شرکت‌کنندگان مسابقه حذف می‌شوید.

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

در طول مسابقه، می‌توانید سؤالات خود را از قسمت «سوال بپرسید» مطرح کنید.

مشورت با هم‌تیمی اوکیه و اگر یکی از اعضای تیم ارسال کنند کافی است تا امتیاز برای کل تیم در نظر گرفته شود.

موفق باشید 😉✌

کنکور پردیس (PHP)


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

جزئیات پروژه🔗

شما می‌توانید پروژه‌ی اولیه را از این لینک دانلود کنید.

تابعی با نام evaluateQuiz پیاده‌سازی کنید که آرایه‌ای از پاسخ‌های داوطلبان در کنکور چهار‌گزینه‌ای پردیس را همراه با آرایه‌ای از پاسخ‌های درست آزمون دریافت می‌کند و طبق قوانین و شرایط زیر نمرات هر شخص را مشخص کرده و در نهایت نمرات را همراه با گزارش کاملی از سوالات خروجی می‌دهد. همچنین شما باید کلاسی به نام FraudDetection را پیاده‌سازی کنید که متقلبین را شناسایی کند!

ورودی‌های تابع evaluateQuiz

ورودی‌های تابع evaluateQuiz🔗

  • در اولین ورودی، این تابع آرایه‌ای دو‌بعدی (آرایه‌ای از آرایه‌های) پاسخ‌های مختلف داوطلبان را دریافت می‌کند.
  • هر کدام از این آرایه‌های پاسخ، شامل مقادیری به صورت عدد صحیح و یا nullnull هستند. پاسخ‌های داوطلبان به سوالات کنکور پردیس به صورت چهار‌گزینه‌ای است، پس هر خانه از آرایه پاسخ داوطلب باید عددی بین 11 تا 44 و یا بی‌پاسخ (nullnull) باشد.
  • در دومین ورودی، این تابع آرایه‌ای از اعداد صحیح را دریافت می‌کند که هر خانه از آن مشخص‌کننده گزینه‌ی درست برای سوالی است که شماره‌اش با اندیس آن خانه از آرایه برابر است. توجه داشته باشید که هر سوال دقیقا یک گزینه‌ی درست دارد. تضمین می‌شود که این مقدار درست برای هر سوال، عدد صحیحی بین 11 تا 44 می‌باشد.
  • در سومین ورودی، این تابع یک نمونه از کلاس کشف تقلب FraudDetectionرا مطابق با توضیحات بخش این کلاس دریافت می‌کند تا در بدنه کلاس از آن جهت شناسایی افراد متقلب استفاده کند.
خروجی‌ تابع evaluateQuiz

خروجی‌ تابع evaluateQuiz🔗

خروجی تابع evaluateQuiz به صورت رشته ای با ساختار زیر خواهد بود:

{
    "scores": [],
    "reports": {
        "max_score": ,
        "min_score": ,
        "average_score": ,
        "questions_average": [],
        "questions_labels": [],
        "invalid_answersheets": [],
        "cheating_examiners": []
    }
}
JSON
  • خروجی تابع باید به شکل Json باشد. توجه کنید که خروجی شما حتما باید مطابق با ساختار بالا باشد و در مقادیری مثل کوچگ و بزرگ بودن حروف کلید‌ها نباید تغییری ایجاد شود.

توضیحات مقادیر خروجی به شکل زیر است:

  • کلید scores: آرایه‌ای است از نمراتی که برای کاربران محاسبه شده است. این مقادیر به شکل اعداد صحیح هستند که خانه ii-ام مشخص کننده نمره کسب شده توسط نفر ii-ام است. (در صورتی که برگه‌ی فرد خراب باشد، این مقدار nullnull خواهد بود)
  • کلیدreports: این کلید شامل گزارش‌های کمی و کیفی آزمون به شکل زیر است:
    • کلید max_score: مقدار این کلید برابر با بیشترین نمره کسب شده در آزمون است.
    • کلید min_score: مقدار این کلید برابر با کمترین نمره کسب شده در آزمون است.
    • کلید average_score: مقدار این کلید برابر با میانگین نمرات کسب شده در آزمون است. این مقدار به صورت عدد اعشاری با دو رقم اعشار به صورت گرد شده است. (این مورد باید با استفاده از تابع round پیاده‌سازی شود)
    • کلید questions_average: مقدار این کلید به صورت آرایه‌ای از اعداد اعشاری با دو رقم اعشار به صورت گرد (این مورد باید با استفاده از تابع round پیاده‌سازی شود) شده است که میانگین نمره‌ای است که افراد مختلف شرکت کننده توانستند از هر کدام از این سوالات کسب کنند. برای مثال اگر پاسخ‌های افراد به سوال اول به شکل گزینه‌های 1 1 1 3 باشد و پاسخ سوال گزینه 1 باشد، میانگین نمره‌ای که کاربران توانستند از این سوال کسب کنند مقدار 2 خواهد بود. (این مورد به صورت ((3 * 3) - 1) / 4 = 2 خواهد بود)
    • کلید questions_labels: مقدار این کلید به صورت آرایه‌ای از رشته‌ها است که سطح سوال را مشخص می‌کند.
    • کلید invalid_answersheets: مقدار این کلید به صورت آرایه‌ای از اندیس کاربرانی است که پاسخ‌برگ آن‌‌ها خراب است. در صورتی که هیچ فردی به این شکل یافت نشد، این مقدار برابر آرایه‌ای خالی خواهد بود.
    • کلید cheating_examiners: مقدار این کلید به صورت آرایه‌ای از اندیس تمام کاربرانی (هم شامل افرادی که مراقب آن‌ها را متقلب شناسایی کرده و هم شامل افرادی که الگوریتم کشف تقلب پیاده‌سازی شده، آن‌ها را متقلب شناسایی کرده) است که متقلب شناسایی شدند. در صورتی که هیچ فردی به این شکل یافت نشد، این مقدار برابر آرایه‌ای خالی خواهد بود.
قوانین و شرایط نمره‎دهی در تابع evaluateQuiz

قوانین و شرایط نمره‎دهی🔗

  • پاسخ صحیح به هر سوال +3+3 نمره و پاسخ غلط به هر سوال 1-1 نمره به همراه خواهد داشت. پاسخی صحیح است که برابر با پاسخی باشد که در آرایه پاسخ سوالات برای آن سوال مشخص شده است. تضمین می‌شود که هر فرد به حداکثر یک گزینه می‌تواند پاسخ دهد.
  • در صورتی که فرد به سوالی پاسخ نداده باشد (پاسخ او به این سوال nullnull باشد)، نمره‌ای برای او لحاظ نمی‌شود (نمره‌ی این سوال 00 لحاظ می‌گردد)
  • ممکن است به دلیل اشتباه دستگاه برگه‌خوان، مقدار پاسخ برای سوالی از بازه 11 تا 44 خارج باشد! برای مثال مقدار پاسخ فردی برای یک سوال مقدار 99 باشد. در این صورت حتی اگر این اتفاق برای یکی از پاسخ‌های یک فرد داوطلب رخ دهد، نمره‌ای برای او نباید محاسبه شود. نمره نهایی او به صورت nullnull لحاظ می‌شود تا بعدا مسئولین پارک پردیس، پاسخ‌برگ او را دوباره تصحیح کنند. به این پاسخ‌برگ‌ها پاسخ‌برگ‌های خراب گفته می‌شود.
  • پس از مشخص شدن افرادی که پاسخ‌برگ آنها خراب است، نوبت اجرای تابع checkResults برای یافتن افراد متقلب در آزمون است. این تابع باید مطابق با توضیحات داده شده در بخش پیاده‌سازی این کلاس، لیست افراد متقلب را شناسایی کند. پس از شناسایی افراد متقلب باید نمره نهایی آن‌ها نیز مانند پاسخ‌برگ‌های خراب nullnull در نظر گرقته شود.
  • افرادی با پاسخ‌برگ‌های خراب و یا افراد متقلب در گزارشات نهایی ارائه شده شرکت ندارند و آمار‌های بدست آمده از پاسخ‌های آن‌ها نباید در گزارش‌دهی نهایی محاسبه شوند.
  • سوالات در 44 سطح با توجه به نحوه پاسخ‌دهی داوطلبان به صورت زیر دسته‌بندی می‌شوند:
    • سطح Easy: بیش‌تر مساوی 7575 درصد شرکت‌کنندگان به آن سوال پاسخ درست داده‌اند.
    • سطح Medium: بین 2525 درصد تا 7575 درصد شرکت‌کنندگان به آن سوال پاسخ درست داده‌اند.
    • سطح Hard: کمتر مساوی 2525 درصد شرکت‌کنندگان به آن سوال پاسخ درست داده‌اند.
    • سطح Brilliant: هیچ فردی در آزمون به این سوال پاسخ درست نداده است.
  • اگر تمام پاسخ‌برگ‌ها خراب باشند و یا هیچ داده‌ای از پاسخ‌ها یافت نشود (پاسخ‌ها nullnull باشند) در این صورت مقادیر استفاده شده در گزارش مقدار 00 خواهند بود.
ساختار کلاس کشف تقلب FraudDetection

کلاس FraudDetection برای کشف تقلب‌های آزمون ساخته شده است. این کلاس در سازنده خود به ترتیب درصد حساسیت sensitivity_percentage را که عددی بین 00 و 100100 است را همراه با آرایه‌ای از اعداد صحیح که اندیس‌های افرادی هستند که مراقب آزمون، آن‌ها را متقلب شناسایی کرده است، دریافت می‌کند. همچنین این کلاس تابعی به نام checkResults دارد که با دریافت آرایه‌ای دو‌بعدی از پاسخ‌برگ‌های افراد مختلف، با برسی این پاسخ‌برگ‌ها، در صورتی که شخصی وجود داشته باشد که بیشتر مساوی درصد حساسیت مشخص شده از پاسخ‌هایش دقیقا با حداقل یگی از این افراد متقلب یکسان باشد، آن فرد نیز متقلب شناخته خواهد شد. تابع checkResults در نهایت آرایه‌ای از اعداد صحیح که اندیس تمامی افراد متقلب (هم شامل افرادی که مراقب آن‌ها را متقلب شناسایی کرده و هم شامل افرادی که الگوریتم کشف تقلب پیاده‌سازی شده، آن‌ها را متقلب شناسایی کرده) می‌باشد را خروجی می‌دهد.

  • کلاس FraudDetection به صورت تزریق وابستگی (Dependency Injection) به تابع نمره‌دهی evaluateQuiz به عنوان ورودی داده خواهد شد.

به مثال‌های زیر از شیوه کارکرد این کلاس، توجه کنید:

مثال نمونه ۱🔗

$fraud_detector = new FraudDetection(70, [1]);

$answers = [
    [1, 1, 1, 1],
    [1, 2, null, 2],
    [1, 9, 3, 4],
    [1, 2, 3, 2],
    [1, 2, 3, 1]
];

print_r($fraud_detector->checkResults($answers));
PHP
Array
(
    [0] => 1
    [1] => 3
)
Plain text
  • در این مثال درصد حساسیت برابر با 70 است و فردی که به عنوان متقلب شناخته شده است فردی با اندیس شماره 1 است. پس از فراخوانی تابع checkResults و انجام بررسی‌های لازم، به دلیل اینکه پاسخ فردی با اندیس شماره 3 با پاسخ [1, 2, 3, 2] در سه چهارم (یا به عبارتی در 75 درصد) پاسخ‌برگ با پاسخ فرد با اندیس 1 مشابهت دارد پس متقلب شناخته می‌شود.

مثال نمونه ۲🔗

$fraud_detector = new FraudDetection(90, [0]);

$answers = [
    [1, 2, 3, 4],
    [1, 2, 3, 2],
    [1, 2, 3, 1]
];

print_r($fraud_detector->checkResults($answers));
PHP
Array
(
    [0] => 0
)
Plain text
  • در مثال بالا به دلیل اینکه هیچ فردی وجود ندارد که در بیشتر مساوی 90 درصد پاسخ‌برگ با پاسخ‌برگ فرد مختلف با اندیس شماره 0 برابر باشد پس تنها فرد متقلب همان اندیس شماره 0 خواهد بود. (هر دو فرد دیگر در 75 درصد از پاسخ‌برگ‌هایشان با فرد متقلب مشابهت دارند که این مقدار از درصد حساسیت کمتر است)

امضای تابع evaluateQuiz به‌صورت زیر خواهد بود:

function evaluateQuiz(array $answers_array, array $key_array, FraudDetection $fraudDetector): string
{
    // TODO: Implement
}
PHP

امضای کلاس FraudDetection به صورت زیر خواهد بود:

class FraudDetection
{

    public function __construct()
    {
        // TODO: Implement
    }

    public function checkResults(array $answers_array): array
    {
        // TODO: Implement
    }

}
PHP
مثال و خروجی مورد انتظار (حتما مطالعه شود)

مثال🔗

<?php

class FraudDetection
{

    public function __construct()
    {
        // TODO: Implement
    }

    public function checkResults(array $answers_array): array
    {
        // TODO: Implement
    }

}

function evaluateQuiz(array $answers_array, array $key_array, FraudDetection $fraudDetector): string
{
    // TODO: Implement
}

$answers = [
    [1, 1, 1, 1],
    [1, 2, null, 2],
    [1, 9, 3, 4],
    [1, 2, 3, 2],
    [1, 2, 3, 1]
];

$keys = [1, 2, 3, 4];

echo evaluateQuiz($answers, $keys, new FraudDetection(70, [1]));
PHP

خروجی موردانتظار:

{
    "scores": [
        0,
        null,
        null,
        null,
        8
    ],
    "reports": {
        "max_score": 8,       
        "min_score": 0,       
        "average_score": 4,   
        "questions_average": [
            3,
            1,
            1,
            -1
        ],
        "questions_labels": [
            "Easy",
            "Medium",
            "Medium",
            "Brilliant"
        ],
        "invalid_answersheets": [
            2
        ],
        "cheating_examiners": [
            1,
            3
        ]
    }
}
Plain text
  • پاسخ‌برگ داوطلب با اندیس 22 به دلیل اینکه در یکی از سوالات پاسخی برابر با 99 دارد به عنوان پاسخ‌برگ خراب در نظر گرفته شده و در محاسبه آمار‌ها نیز سایر پاسخ‌های این فرد در نظر گرفته نشده است.

آن‌چه باید آپلود کنید🔗

یک فایل PHP که تابع evaluateQuiz و کلاس FraudDetection در آن پیاده‌سازی شده است آپلود کنید.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.