مجموعه رویدادهای *المپیکفناوری* پردیس امسال هم رو به پایان است. این سری رویداد که امسال با شکوه بیشتری نسبت به تمام رویدادهای دیگر برگزار شد قرار است در پایان، مراسمی مجلل برای اهدای مدالها و جوایزی ویژه به نفرات برتر شرکتکننده داشته باشد. یونس مسئول هماهنگی این جشن بزرگ است و از شما که دستیار وی هستید برای انجام کارهای مربوط به جشن کمک میخواهد.
# جزئیات پروژه
شما میتوانید پروژهی اولیه را از [این لینک](/contest/assignments/71158/download_problem_initial_project/252157/) دانلود کنید.
تابعی با نام `handleCeremony` پیادهسازی کنید که آرایهای از افراد را که کلاس `Person` نمایندهای از آنهاست را تحویل میگیرد و سپس این افراد را **به صورت نزولی** مرتبسازی میکند تا لیستی برای مراسم اهدای جوایز آماده شود.
## توضیحات کلاس `Person`
این کلاس نمایندهی افراد شرکتکننده در رویداد *المپیکفناوری* است. ساختار متدها و ویژگیهای کلاس به شکل زیر تعریف میشود:
```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;
}
}
```
- ویژگی `personName`: این ویژگی به صورت رشتهای از نام فرد شرکتکننده در رویداد است.
- ویژگی `bootcampScore`: این ویژگی به صورت **عدد صحیح مثبت** بیانگر امتیازی است که فرد در بوتکمپهای المپیک فناوری کسب کرده است. **ضریب این ویژگی** $0.15$ **است.**
- ویژگی `onlineContestScore`: این ویژگی به صورت **عدد صحیح مثبت** بیانگر امتیازی است که فرد در مسابقات مجازی المپیک فناوری کسب کرده است. **ضریب این ویژگی** $0.25$ **است.**
- ویژگی `inpersonContestScore`: این ویژگی به صورت **عدد صحیح مثبت** بیانگر امتیازی است که فرد در مسابقات حضوری المپیک فناوری کسب کرده است. **ضریب این ویژگی** $0.5$ **است.**
-ویژگی `passionRate`: این ویژگی به صورت عددی اعشاری بیانگر میزان شور و اشتیاق فرد است که توسط داوران مسابقه تعیین میشود و مقداری بین $0$ تا $10$ دارد. **ضریب این ویژگی** $0.1$ **است.**
- متد `calculateTotalScore`: این متد مجموع وزندار امتیاز فرد را با توجه به ضرایب ویژگیها محاسبه میکند.
- متد `displayInfo`: این متد اطلاعات شرکتکننده را چاپ میکند.
---
شما باید تابع `handleCeremony` را به صورتی پیاده سازی کنید که افراد را بر اساس **مجموع وزندار** امتیازهایشان **به صورت نزولی** مرتبسازی کند. در این بین اگر مجموع وزندار امتیاز دو فرد با یکدیگر **برابر** شد، **اولویت در مقایسه** و رتبهدهی بر اساس ویژگی با **ضریب بیشتر** است. یعنی اگر دو فرد در مجموع امتیاز یکسانی داشته باشند، فردی در مرتبسازی قبلتر ظاهر میشود که امتیاز`inpersonContestScore` او **بزرگتر** باشد. *(در صورتی که این ویژگی نیز در هر دو فرد برابر بود به سراغ امتیاز* `onlineContestScore` *میرویم و به همین شکل...)*
پس از مرتب سازی صرفا باید اطلاعات $5$ **نفر برتر رویداد** *(*$5$ *نفر اول در مرتبسازی انجام شده)* توسط فراخوانی متد `displayInfo` دریافت و در قالب یک رشته خروجی داده شود.
**مقیاسبندی و اعتبارسنجی امتیاز افراد قبلا انجام شده است. همچنین تضمین میشود که تمام امتیازهای هیچ دو فردی با هم برابر نیست.**
امضای تابع `handleCeremony` بهصورت زیر خواهد بود:
```php
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)
]);
```
خروجی موردانتظار:
```plaintext
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
- - - - - - - - - - - - -
```
- همانطور که در خروجی مشاهده میکنید مجموع وزندار امتیاز دو فرد `Safar Ali` و `Ali Safar` با هم **برابر** است اما چون امتیاز `inpersonContestScore` فردی با نام `Safar Ali` **بیشتر** است پس در رتبهبندی **قبل** از فردی با نام `Ali Safar` قرار میگیرد.
# آنچه باید آپلود کنید
یک فایل _PHP_ که تابع `handleCeremony` در آن پیادهسازی شده است آپلود کنید.