typestar

grade_report.swift en Swift

Boletines desde un roster de structs, patrones de rango y format.

// Average each student's scores and print a letter-grade report card.

import Foundation

struct Student {
    let name: String
    let scores: [Int]

    var average: Double {
        Double(scores.reduce(0, +)) / Double(scores.count)
    }
}

let roster = [
    Student(name: "Ada", scores: [92, 88, 97]),
    Student(name: "Grace", scores: [84, 91, 78]),
    Student(name: "Alan", scores: [70, 66, 74]),
    Student(name: "Edsger", scores: [58, 67, 61]),
]

func letter(_ avg: Double) -> String {
    switch avg {
    case 90...: return "A"
    case 80...: return "B"
    case 70...: return "C"
    case 60...: return "D"
    default: return "F"
    }
}

print("student  avg grade")
for s in roster.sorted(by: { $0.name < $1.name }) {
    let name = s.name.padding(toLength: 8, withPad: " ", startingAt: 0)
    let avg = String(format: "%4.1f", s.average)
    print("\(name) \(avg)  \(letter(s.average))")
}

let allScores = roster.flatMap { $0.scores }
let classAvg = Double(allScores.reduce(0, +)) / Double(allScores.count)
print(String(format: "Class average: %.1f", classAvg))

Cómo funciona

  1. Student.average es una propiedad calculada sobre reduce.
  2. Los patrones de rango case 90...: gradúan la escalera.
  3. flatMap junta cada puntaje para el promedio del curso.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
40
Caracteres a escribir
1004
Tokens
309
Ritmo de tres estrellas
65 tpm

Al ritmo de tres estrellas de 65 tokens por minuto, este intento toma unos 285 segundos.

Escribe este fragmento

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

← Anterior Siguiente →