Курс по Raku / Приложение 🆕 / Всичко наедно / Смесени мини проекти / Exercises / Оценки от редове CSV
Решение: Оценки от редове CSV
Ето едно възможно решение на задачата.
Код
my @lines = 'Anna,90', 'Bob,72', 'Cara,84';
my %score;
for @lines -> $line {
my ($name, $mark) = $line.split(',');
%score{$name} = $mark.Int;
}
my $average = ([+] %score.values) / %score.elems;
say "average: $average";
say "above average:";
for %score.sort -> $pair {
say " {$pair.key}" if $pair.value > $average;
}🦋 Намерете програмата във файла csv-averages.raku.
Изход
average: 82
above average:
Anna
CaraКоментари
Разделянето на всеки ред по запетаята и присвояването на
($name, $mark)разопакова двете полета наведнъж;.Intпревръща текста на точките в число.Средното е сумата на стойностите, разделена на броя им; изреждат се всички, чиито точки го надминават. Тук средното излиза цялото
82.Онзи последен цикъл може да се запише като конвейер.
sortподрежда двойките,grepзапазва онези над средното, аmapсвежда всяка оцеляла двойка до името ѝ — така в тялото на цикъла не остава логика, а само печатане:say " $_" for %score.sort.grep(*.value > $average).map(*.key);
Четейки отляво надясно, това казва точно каквото прави: сортирай, запази онези над средното, вземи имената им. Всеки етап е малка самостоятелна стъпка, а
*.value/*.keyса звезди Whatever, които в движение изграждат блок от един аргумент.