Софтуерно Инженерство
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 1792 Точки

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

<?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 1792 Точки

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

<?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 1792 Точки

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

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

0