typestar

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

  1. Student.average is a computed property over reduce.
  2. case 90...: range patterns grade the ladder.
  3. flatMap pools every score for the class average.

Keywords and builtins used here

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.

Type this snippet

Step 2 of 3 in Encore, step 26 of 27 in Language basics.

← Previous Next →