週の比較
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 37/56。
最後の機能:2週間分のデータを取り込み、習慣ごとの変化を報告します。
各週は、それぞれの行に habit:day 操作の独自のリストとして記述されています。これまでと同じ方法で2つの辞書を作成し、それらを比較してください。
興味深い習慣のセットは、両方の週にわたるキーの和集合です(ある習慣が一方の週には現れ、もう一方には現れない場合があります)。その和集合をアルファベット順にソートして反復処理します。
let allKeys = Set(weekA.keys).union(weekB.keys).sorted()
for name in allKeys {
let a = weekA[name]?.count ?? 0
let b = weekB[name]?.count ?? 0
print("\(name): \(a) -> \(b)")
}?? 0 は、キーが存在しない場合を処理します。weekA[name]?.count は、最初にアンラップすることなくカウントを読み取るオプショナルチェーン(optional-chained)の方法です。キーが存在しない場合は nil を返し、それを ?? 0 が 0 に変換します。
チャレンジ
中級2行の入力を読み込みます。各行はカンマで区切られた habit:day エントリのリスト(1週間分)です。いずれかの週に現れるすべての習慣について、次の形式で1行ずつ出力してください:
<habit>: <a> -> <b> <arrow>ここで、a は1週目のユニークな日数の合計、b は2週目のユニークな日数の合計です。また、arrow は以下の通りです:
b > aのときはUPb < aのときはDOWNb == aのときはSAME
習慣はアルファベット順に出力してください。各習慣の行の後に、サマリーを1行出力してください:
Improved: <n>ここで、n は arrow が UP となった習慣の数です。
1行目の入力が read:1,read:3,workout:2 で、2行目の入力が read:1,read:2,read:5,yoga:7 の場合、出力は以下のようになります:
read: 2 -> 3 UP
workout: 1 -> 0 DOWN
yoga: 0 -> 1 UP
Improved: 2チートシート
2つの辞書からキーの和集合を取得し、アルファベット順に反復処理するには:
let allKeys = Set(weekA.keys).union(weekB.keys).sorted()
for name in allKeys {
let a = weekA[name]?.count ?? 0
let b = weekB[name]?.count ?? 0
print("\(name): \(a) -> \(b)")
}weekA[name]?.count はオプショナルチェイニングを使用して、アンラップせずにカウントを取得します。キーが存在しない場合は nil を返します。?? 0 はその nil を0に変換します。
自分で試してみよう
func parse(_ line: String) -> [String: [Int]] {
var habits: [String: [Int]] = [:]
if line.isEmpty { return habits }
for op in line.components(separatedBy: ",") {
let parts = op.components(separatedBy: ":")
let day = Int(parts[1])!
if !(habits[parts[0], default: []].contains(day)) {
habits[parts[0], default: []].append(day)
}
}
return habits
}
let weekA = parse(readLine()!)
let weekB = parse(readLine()!)
// TODO: キーの和集合、習慣ごとの '<name>: a -> b ARROW'、そして 'Improved: <n>'
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。