grade_report.swift in Swift
Report cards from a struct roster, range patterns, and 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))
How it works
Student.averageis a computed property overreduce.case 90...:range patterns grade the ladder.flatMappools every score for the class average.
Keywords and builtins used here
DoubleFoundationIntStringStudentcasecountdefaultforfuncimportinletletterprintreducereturnsortedstructswitchvar
The run, in numbers
- Lines
- 40
- Characters to type
- 1004
- Tokens
- 309
- Three-star pace
- 65 tpm
At the three-star pace of 65 tokens a minute, this run takes about 285 seconds.
Step 2 of 3 in Encore, step 26 of 27 in Language basics.