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

جزئیات پروژه

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

تابعی با نام handleCeremony پیاده‌سازی کنید که آرایه‌ای از افراد را که کلاس Person نماینده‌ای از آن‌هاست را تحویل می‌گیرد و سپس این افراد را به صورت نزولی مرتب‌سازی می‌کند تا لیستی برای مراسم اهدای جوایز آماده شود.

توضیحات کلاس Person

این کلاس نماینده‌ی افراد شرکت‌کننده در رویداد المپیک‌فناوری است. ساختار متد‌ها و ویژگی‌های کلاس به شکل زیر تعریف می‌شود:

<?php

class Person
{
    public function __construct(
        public string $personName,
        public int $bootcampScore,
        public int $onlineContestScore,
        public int $inpersonContestScore,
        public float $passionRate,
    ) {
    }

    public function calculateTotalScore(): float
    {
        return ($this->bootcampScore * 0.15) +
               ($this->onlineContestScore * 0.25) +
               ($this->inpersonContestScore * 0.5) +
               ($this->passionRate * 0.1);
    }

    public function displayInfo(): string
    {
        $result = "Person Name: " . $this->personName . "\n";
        $result .= "Bootcamp Score: " . $this->bootcampScore . "\n";
        $result .= "Online Contest Score: " . $this->onlineContestScore . "\n";
        $result .= "In-person Contest Score: " . $this->inpersonContestScore . "\n";
        $result .= "Passion Rate: " . $this->passionRate . "\n";
        $result .= "Total Weighted Score: " . $this->calculateTotalScore() . "\n";
        $result .= "- - - - - - - - - - - - -\n";

        return $result;
    }
}
PHP
  • ویژگی personName: این ویژگی به صورت رشته‌ای از نام فرد شرکت‌کننده در رویداد است.
  • ویژگی bootcampScore: این ویژگی به صورت عدد صحیح مثبت بیانگر امتیازی است که فرد در بوت‌کمپ‌های المپیک فناوری کسب کرده است. ضریب این ویژگی 0.150.15 است.
  • ویژگی onlineContestScore: این ویژگی به صورت عدد صحیح مثبت بیانگر امتیازی است که فرد در مسابقات مجازی المپیک فناوری کسب کرده است. ضریب این ویژگی 0.250.25 است.
  • ویژگی inpersonContestScore: این ویژگی به صورت عدد صحیح مثبت بیانگر امتیازی است که فرد در مسابقات حضوری المپیک فناوری کسب کرده است. ضریب این ویژگی 0.50.5 است. -ویژگی passionRate: این ویژگی به صورت عددی اعشاری بیانگر میزان شور و اشتیاق فرد است که توسط داوران مسابقه تعیین می‌شود و مقداری بین 00 تا 1010 دارد. ضریب این ویژگی 0.10.1 است.
  • متد calculateTotalScore: این متد مجموع وزن‌دار امتیاز فرد را با توجه به ضرایب ویژگی‌ها محاسبه می‌کند.
  • متد displayInfo: این متد اطلاعات شرکت‌کننده را چاپ می‌کند.

شما باید تابع handleCeremony را به صورتی پیاده سازی کنید که افراد را بر اساس مجموع وزن‌دار امتیازهایشان به صورت نزولی مرتب‌سازی کند. در این بین اگر مجموع وزن‌دار امتیاز دو فرد با یک‌دیگر برابر شد، اولویت در مقایسه و رتبه‌دهی بر اساس ویژگی با ضریب بیشتر است. یعنی اگر دو فرد در مجموع امتیاز یکسانی داشته باشند، فردی در مرتب‌سازی قبل‌تر ظاهر می‌شود که امتیازinpersonContestScore او بزرگ‌تر باشد. (در صورتی که این ویژگی نیز در هر دو فرد برابر بود به سراغ امتیاز onlineContestScore می‌رویم و به همین شکل...) پس از مرتب سازی صرفا باید اطلاعات 55 نفر برتر رویداد (55 نفر اول در مرتب‌سازی انجام شده) توسط فراخوانی متد displayInfo دریافت و در قالب یک رشته خروجی داده شود.

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

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

function handleCeremony(array $personsArray): string
{
	// TODO: Implement
}
PHP

مثال

<?php

class Person
{
    public function __construct(
        public string $personName,
        public int $bootcampScore,
        public int $onlineContestScore,
        public int $inpersonContestScore,
        public float $passionRate,
    ) {
    }

    public function calculateTotalScore(): float
    {
        return ($this->bootcampScore * 0.15) +
               ($this->onlineContestScore * 0.25) +
               ($this->inpersonContestScore * 0.5) +
               ($this->passionRate * 0.1);
    }

    public function displayInfo(): string
    {
        $result = "Person Name: " . $this->personName . "\n";
        $result .= "Bootcamp Score: " . $this->bootcampScore . "\n";
        $result .= "Online Contest Score: " . $this->onlineContestScore . "\n";
        $result .= "In-person Contest Score: " . $this->inpersonContestScore . "\n";
        $result .= "Passion Rate: " . $this->passionRate . "\n";
        $result .= "Total Weighted Score: " . $this->calculateTotalScore() . "\n";
        $result .= "- - - - - - - - - - - - -\n";

        return $result;
    }
}

function handleCeremony(array $personsArray): string
{
	// TODO: Implement
}

echo handleCeremony([
    new Person("Ali Gholi", 1000, 700, 700, 1.5),
    new Person("Gholi Ali", 12000, 200, 100, 3.8),
    new Person("Ali Phish", 9000, 900, 900, 9.9),
    new Person("Pish Ali", 8000, 900, 900, 8.9),
    new Person("Ali Reza", 100, 900, 900, 0.3),
    new Person("Reza Ali", 18000, 100, 0, 4.4),
    new Person("Ali Safar", 10000, 10000, 10000, 0),
    new Person("Safar Ali", 8000, 5000, 13100, 0)
]);
PHP

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

Person Name: Safar Ali        
Bootcamp Score: 8000
Online Contest Score: 5000    
In-person Contest Score: 13100
Passion Rate: 0
Total Weighted Score: 9000    
- - - - - - - - - - - - -     
Person Name: Ali Safar        
Bootcamp Score: 10000
Online Contest Score: 10000   
In-person Contest Score: 10000
Passion Rate: 0
Total Weighted Score: 9000    
- - - - - - - - - - - - -     
Person Name: Reza Ali
Bootcamp Score: 18000
Online Contest Score: 100     
In-person Contest Score: 0    
Passion Rate: 4.4
Total Weighted Score: 2725.44
- - - - - - - - - - - - -
Person Name: Ali Phish
Bootcamp Score: 9000
Online Contest Score: 900
In-person Contest Score: 900
Passion Rate: 9.9
Total Weighted Score: 2025.99
- - - - - - - - - - - - -
Person Name: Gholi Ali
Bootcamp Score: 12000
Online Contest Score: 200
In-person Contest Score: 100
Passion Rate: 3.8
Total Weighted Score: 1900.38
- - - - - - - - - - - - -
Plain text
  • همانطور که در خروجی مشاهده می‌کنید مجموع وزن‌دار امتیاز دو فرد Safar Ali و Ali Safar با هم برابر است اما چون امتیاز inpersonContestScore فردی با نام Safar Ali بیشتر است پس در رتبه‌بندی قبل از فردی با نام Ali Safar قرار می‌گیرد.

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

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


ارسال پاسخ برای این سؤال
فایلی انتخاب نشده است.