typestar

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

  1. %scores asocia cada estudiante con un arrayref de puntajes; average suma @_.
  2. map desreferencia cada lista hacia la auxiliar y arma %avg en una pasada.
  3. Los anchos de columna de printf alinean la tabla; un ternario encadenado elige la calificación.
  4. map { @$_ } values %scores aplana todo para el promedio del grupo.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.

← Anterior Siguiente →