Raku kurss / Pielikums 🆕 / Viss kopā / Jaukti miniprojekti / Exercises / Vērtējumi no CSV rindām

Risinājums: Vērtējumi no CSV rindām

Šeit ir iespējams risinājums uzdevumam.

Kods

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;
}

🦋 Atrodiet programmu failā csv-averages.raku.

Izvade

average: 82
above average:
  Anna
  Cara

Komentāri

  1. Katras rindas sadalīšana pēc komata un piešķiršana ($name, $mark) abus laukus izsaiņo uzreiz; .Int vērtējuma tekstu pārvērš skaitlī.

  2. Vidējais ir vērtību summa, dalīta ar to skaitu; tiek uzskaitīts ikviens, kura vērtējums to pārspēj. Šeit vidējais iznāk apaļš 82.

  3. Šo pēdējo ciklu var uzrakstīt kā konveijeru. sort sakārto pārus, grep patur tos, kas ir virs vidējā, un map katru izdzīvojušo pāri sarauj līdz tā vārdam — tā cikla ķermenī nav nekādas loģikas, tikai izdrukāšana:

    say "  $_" for %score.sort.grep(*.value > $average).map(*.key);

    Lasot no kreisās uz labo, tas pasaka tieši to, ko dara: sakārto, paturi tos, kas virs vidējā, paņem to vārdus. Katrs posms ir mazs, patstāvīgs solis, un *.value / *.key ir Whatever zvaigznītes, kas uz vietas uzbūvē viena argumenta bloku.

Kursa navigācija

Vērtējumi no CSV rindām