grade_report.pl en Perl
Promedia los puntajes por estudiante de un hash de arreglos en una tabla con calificaciones.
use strict;
use warnings;
# grade_report: average per-student scores and print a table
my %scores = (
Alice => [92, 88, 95],
Bob => [75, 82, 79],
Cara => [88, 91, 84],
Dev => [60, 71, 68],
);
sub average {
my $sum = 0;
$sum += $_ for @_;
return $sum / @_;
}
my %avg = map { $_ => average(@{ $scores{$_} }) } keys %scores;
printf "%-8s %-12s %6s %s\n", "student", "scores", "avg", "grade";
print "-" x 34, "\n";
for my $name (sort { $avg{$b} <=> $avg{$a} } keys %scores) {
my $mean = $avg{$name};
my $grade = $mean >= 90 ? "A"
: $mean >= 80 ? "B"
: $mean >= 70 ? "C" : "D";
printf "%-8s %-12s %6.1f %s\n",
$name, join(" ", @{ $scores{$name} }), $mean, $grade;
}
my $class = average(map { @$_ } values %scores);
printf "class average: %.1f\n", $class;
Cómo funciona
%scoresasocia cada estudiante con un arrayref de puntajes;averagesuma@_.mapdesreferencia cada lista hacia la auxiliar y arma%avgen una pasada.- Los anchos de columna de
printfalinean la tabla; un ternario encadenado elige la calificación. map { @$_ } values %scoresaplana todo para el promedio del grupo.
Palabras clave y builtins usados aquí
forjoinkeysmapmyprintprintfreturnsortsubusevalues
El intento, en números
- Líneas
- 34
- Caracteres a escribir
- 764
- Tokens
- 243
- Ritmo de tres estrellas
- 80 tpm
Al ritmo de tres estrellas de 80 tokens por minuto, este intento toma unos 182 segundos.
Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.