集計レポート
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 53/56。
最後の機能:1つのカテゴリではなく、クイズ全体を実行し、最後にカテゴリごとの要約を生成します。
これまでのすべての章の内容を一度に活用することになります。反復処理のためのタプルの非構造化、文字列の章の寛容な採点、辞書の章のデフォルトの添え字を持つ辞書、そして決定論的な出力のためのソートされた反復処理です。
カテゴリごとのカウンターを、2つの並行する辞書として構築します:
var totals: [String: Int] = [:]
var rights: [String: Int] = [:]すべての質問に対して totals[cat, default: 0] += 1 を増加させ、正解の場合のみ rights[cat, default: 0] を増加させます。最後に、レポートを出力するためにカテゴリをアルファベット順に走査します。
チャレンジ
中級前のレッスンと同じ6つの問題バンクを使用します。標準入力(stdin)から**6つ**の回答を、バンクと同じ順序で1行に1つずつ読み取ります。寛大な採点(lenient grading)を使用してください。
次の順序で出力してください:
- カテゴリごとに1行、アルファベット順にソートし、
<category>: <right>/<total>の形式で出力します。 - 最後に1行:全体の実行結果を
Total: <right>/<total>の形式で出力します。
入力が 4 / 3.14 / Paris / Atlantic / green / WATER の場合、出力は次のようになります:
geo: 1/2
math: 2/2
science: 2/2
Total: 5/6チートシート
2つの並列辞書を使用して、カテゴリごとのスコアを追跡します:
var totals: [String: Int] = [:]
var rights: [String: Int] = [:]
// カテゴリcatの各質問について:
totals[cat, default: 0] += 1
// 正解の場合:
rights[cat, default: 0] += 1決定論的な出力のために、sorted()を使用してカテゴリをアルファベット順に走査します:
for cat in totals.keys.sorted() {
let r = rights[cat, default: 0]
let t = totals[cat]!
print("\(cat): \(r)/\(t)")
}辞書の値を合計することで、すべてのカテゴリにわたる合計を計算します:
let totalRight = rights.values.reduce(0, +)
let totalAll = totals.values.reduce(0, +)
print("Total: \(totalRight)/\(totalAll)")自分で試してみよう
let questions: [(String, String, String)] = [
("math", "2 + 2?", "4"),
("math", "Value of pi to 2 decimals?", "3.14"),
("geo", "Capital of France?", "Paris"),
("geo", "Largest ocean?", "Pacific"),
("science", "Color of grass?", "green"),
("science", "H2O is?", "water")
]
// TODO: 6つの回答を読み込む。寛容な採点を行う。カテゴリごとの合計と正解数を集計する。
// ソートされた要約行と合計を表示する。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。