Cursus Raku / Addendum 🆕 / Alles samenbrengen / Gemengde miniprojecten / Exercises / Scores uit CSV-regels
Oplossing: Scores uit CSV-regels
Hier is een mogelijke oplossing voor de taak.
Code
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;
}🦋 Je kunt de broncode vinden in het bestand csv-averages.raku.
Uitvoer
average: 82
above average:
Anna
CaraOpmerkingen
Elke regel op de komma splitsen en aan
($name, $mark)toekennen pakt de twee velden in één keer uit;.Intmaakt van de scoretekst een getal.Het gemiddelde is de som van de waarden gedeeld door hun aantal; iedereen wiens score er bovenuit komt wordt opgesomd. Hier komt het gemiddelde uit op een ronde
82.Die laatste lus kun je als pijplijn schrijven.
sortzet de paren op volgorde,grephoudt degene boven het gemiddelde, enmapbrengt elk overgebleven paar terug tot zijn naam — zodat de body van de lus geen logica draagt, alleen het afdrukken:say " $_" for %score.sort.grep(*.value > $average).map(*.key);
Van links naar rechts gelezen zegt dit precies wat het doet: sorteren, degene boven het gemiddelde houden, hun namen nemen. Elke fase is een kleine, op zichzelf staande stap, en
*.value/*.keyzijn Whatever-sterren die ter plekke een blok met één argument bouwen.