Menu
Coddy logo textTech

集計レポート

CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 53/56。

最後の機能:1つのカテゴリではなく、クイズ全体を実行し、最後にカテゴリごとの要約を生成します。

これまでのすべての章の内容を一度に活用することになります。反復処理のためのタプルの非構造化、文字列の章の寛容な採点、辞書の章のデフォルトの添え字を持つ辞書、そして決定論的な出力のためのソートされた反復処理です。

カテゴリごとのカウンターを、2つの並行する辞書として構築します:

var totals: [String: Int] = [:]
var rights: [String: Int] = [:]

すべての質問に対して totals[cat, default: 0] += 1 を増加させ、正解の場合のみ rights[cat, default: 0] を増加させます。最後に、レポートを出力するためにカテゴリをアルファベット順に走査します。

challenge icon

チャレンジ

中級

前のレッスンと同じ6つの問題バンクを使用します。標準入力(stdin)から**6つ**の回答を、バンクと同じ順序で1行に1つずつ読み取ります。寛大な採点(lenient grading)を使用してください。

次の順序で出力してください:

  1. カテゴリごとに1行、アルファベット順にソートし、<category>: <right>/<total> の形式で出力します。
  2. 最後に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つの回答を読み込む。寛容な採点を行う。カテゴリごとの合計と正解数を集計する。
// ソートされた要約行と合計を表示する。
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

ロジックとフローのすべてのレッスン