Курс Raku / Додаток 🆕 / Збираємо все разом / Мішані міні-проєкти / Вправи / Оцінки з рядків 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, що на льоту будують блок від одного аргументу.