Loading...
radostin.georgiev avatar radostin.georgiev 8 Точки

Associative Arrays More Exercises - Логика на решаване

Здравейте колеги!

Имам трудност с решаване на задачите от More exercises в асоциативните масиви и по-точно с 4.Snowwhite  и 5.Dragon Army. Предполагам тръгвам по грешен начин за решаване и за това не ми се получава.Сортировката също ми е проблемна. Ще може ли някой да пообясни малко как се действа при такива задачи.

->Условия: https://softuni.bg/trainings/resources/officedocument/47327/more-exercise-php-fundamentals-december-2019/2684

->Решение 50/100 задача Snowwhite : https://pastebin.com/crUqTG7n

->За следващата задача съхранявам данните за дракона по този начин и после проверката дали съществува такъв тип с такова име ми куца?

$dragons[] = [
    ['type' => $type, 'name' => $name, 'damage' => $damage, 'health' => $health, 'armor' => $armor]
];

Благодаря Ви!

 

Тагове:
0
PHP Fundamentals 09/03/2020 17:10:09
willystyle avatar willystyle 2472 Точки

Здравей, в случая нямаш нещо уникално, което да ползваш за ключ, затова по-добре използвай обикновен масив (иначе трябва да си създаваш уникален ключ от име + щапка, но после малко по-трудно се сортира).

<?php
$input = readline();
$dwarfs = [];
while ($input !== "Once upon a time") {
    $args = explode(" <:> ", $input);
    $name = $args[0];
    $hatColor = $args[1];
    $physics = intval($args[2]);
    $newDwarf = ['name' => $name, 'hatColor' => $hatColor, 'physics' => $physics];
    $found = false;
    foreach ($dwarfs as $index => $dwarf) {
        if ($dwarf['name'] === $name && $dwarf['hatColor'] === $hatColor) {
            if ($dwarf['physics'] >= $physics) {
                $found = true;
                break;
            } else {
                array_splice($dwarfs, $index, 1);
                break;
            }
        }
    }
    if (!$found) {
        $dwarfs[] = $newDwarf;
    }
    $input = readline();
}
usort($dwarfs, function ($dwarf1, $dwarf2) use ($dwarfs) {
    if ($dwarf2['physics'] === $dwarf1['physics']) {
        $countHats1 = count(array_filter($dwarfs, function($dwarf) use ($dwarf1) {return $dwarf['hatColor'] === $dwarf1['hatColor'];}));
        $countHats2 = count(array_filter($dwarfs, function($dwarf) use($dwarf2) {return $dwarf['hatColor'] === $dwarf2['hatColor'];}));
        return $countHats2 - $countHats1;
    }
    return $dwarf2['physics'] - $dwarf1['physics'];
});
foreach ($dwarfs as $dwarf) {
    echo "(${dwarf['hatColor']}) ${dwarf['name']} <-> ${dwarf['physics']}" . PHP_EOL;
}

Ако пуснеш докъдето си стигнал с драконите, ще опитам да ти я оправя и нея.

0
willystyle avatar willystyle 2472 Точки

Ето и драконите:

<?php
$n = readline();
$dragonsByType = [];
for ($i = 0; $i < $n; $i++) {
    $input = explode(" ", readline());
    $type = $input[0];
    $name = $input[1];
    $damage = $input[2] === 'null' ? 45 : intval($input[2]);
    $health = $input[3] === 'null' ? 250 : intval($input[3]);
    $armor = $input[4] === 'null' ? 10 : intval($input[4]);
    $dragonsByType[$type][$name]['damage'] = $damage;
    $dragonsByType[$type][$name]['health'] = $health;
    $dragonsByType[$type][$name]['armor'] = $armor;
}

foreach ($dragonsByType as $type => $dragons) {
    ksort($dragons);
    $sumDamage = 0;
    $sumHealth = 0;
    $sumArmor = 0;
    foreach ($dragons as $name => $dragon) {
        $sumDamage += $dragon['damage'];
        $sumHealth += $dragon['health'];
        $sumArmor += $dragon['armor'];
    }
    $count = count($dragons);
    $averageDamage = number_format($sumDamage / $count, 2, '.', '');
    $averageHealth = number_format($sumHealth / $count, 2, '.', '');
    $averageArmor = number_format($sumArmor / $count, 2, '.', '');
    echo "$type::($averageDamage/$averageHealth/$averageArmor)" . PHP_EOL;
    foreach ($dragons as $name => $dragon) {
        echo "-$name -> damage: ${dragon['damage']}, health: ${dragon['health']}, armor: ${dragon['armor']}" . PHP_EOL;
    }
}

 

0
radostin.georgiev avatar radostin.georgiev 8 Точки

Благодаря ти много! Така като гледам при драконите ми се поизнясниха нещата там. Ще може ли само да обясниш тези редове от горната задача? За пръв път срещам array_filter

$countHats1 = count(array_filter($dwarfs, function($dwarf) use ($dwarf1) {return $dwarf['hatColor'] === $dwarf1['hatColor'];}));

0
willystyle avatar willystyle 2472 Точки

това е като .filter() в JS или .where() в C#, филтрира масив по даден критерий предикат (това е функция която връща булева, като параметър автоматично се подава всеки елемент), например искаш да преброиш в масив положителните числа:

count(array_filter($arr, function($el) { return $el >=0 }));
или нечетните:
count(array_filter($arr, function($el) { return $el % 2 !==0 }));

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.