柔軟な採点
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 51/56。
厳密な等価判定は厳しいものです。実際のクイズでは、paris、Paris、そして PARIS を同じ回答として受け入れます。
第1章のレシピ:空白を削除し、両方を小文字にして比較します:
func grade(_ given: String, _ answer: String) -> Bool {
let g = given.trimmingCharacters(in: .whitespaces).lowercased()
let a = answer.trimmingCharacters(in: .whitespaces).lowercased()
return g == a
}これは、独自の関数として切り出す価値のあるヘルパーです。クイズのループは1問につき1行にすることでよりスッキリと読みやすくなり、将来のバグ修正も1箇所で行えるようになります。
チャレンジ
簡単2つの文字列の両端の空白を削除し、小文字に変換した後に一致する場合に true を返す関数 grade(_ given: String, _ answer: String) -> Bool を定義してください。
questions バンクが与えられています。stdin から3行を読み込み、各質問に対して以下を出力してください:
- 質問のテキスト
- 寛容な比較に基づいた
correctまたはwrong
実行後、Score: <n>/3 を出力してください。
入力が 4 / PARIS / Green の場合、出力は以下のようになります:
2 + 2?
correct
Capital of France?
correct
Color of grass?
correct
Score: 3/3チートシート
寛容な文字列比較:比較する前に、両端の空白を削除し、小文字に変換します。
func grade(_ given: String, _ answer: String) -> Bool {
let g = given.trimmingCharacters(in: .whitespaces).lowercased()
let a = answer.trimmingCharacters(in: .whitespaces).lowercased()
return g == a
}自分で試してみよう
let questions: [(String, String, String)] = [
("math", "2 + 2?", "4"),
("geo", "Capital of France?", "Paris"),
("science", "Color of grass?", "green")
]
// TODO: trim + 小文字変換による比較を行う func grade(_:_:)->Bool
// その後ループし、質問を表示、回答を読み取り、正解/不正解を表示する;
// 最後に 'Score: <n>/3' で終了する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。