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
Student.averagees una propiedad calculada sobrereduce.- Los patrones de rango
case 90...:gradúan la escalera. flatMapjunta cada puntaje para el promedio del curso.
Palabras clave y builtins usados aquí
DoubleIntStringcasecountdefaultforfuncimportinletprintreducereturnsortedstructswitchvar
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.
Paso 2 de 3 en Bis; paso 26 de 27 en Fundamentos del lenguaje.