Curso de Raku / Apéndice 🆕 / Poniéndolo todo junto / Miniproyectos variados / Exercises / Notas a partir de líneas CSV
Solución: Notas a partir de líneas CSV
Aquí tienes una posible solución para la tarea.
Código
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;
}🦋 Puedes encontrar el código fuente en el archivo csv-averages.raku.
Salida
average: 82
above average:
Anna
CaraComentarios
Dividir cada línea por la coma y asignar a
($name, $mark)desempaqueta los dos campos de una vez;.Intconvierte el texto de la puntuación en un número.La media es la suma de los valores entre su recuento; se enumera a todo aquel cuya puntuación la supere. Aquí la media sale un
82entero.Ese bucle final se puede escribir como una tubería.
sortordena los pares,grepconserva los que están por encima de la media ymapreduce cada par superviviente a su nombre, de modo que el cuerpo del bucle no lleva lógica, solo la impresión:say " $_" for %score.sort.grep(*.value > $average).map(*.key);
Leído de izquierda a derecha, esto dice exactamente lo que hace: ordena, conserva los que están por encima de la media, toma sus nombres. Cada etapa es un paso pequeño y autónomo, y
*.value/*.keyson estrellas Whatever que construyen sobre la marcha un bloque de un argumento.