差集合と対称差
CoddyのSwiftジャーニー「ロジックとフロー」セクションの一部 — レッスン 20/56。
さらに2つの集合演算で、ツールキットは完成です。
subtracting は、最初の集合の要素のうち、2番目の集合に含まれないものを返します:
let a: Set = [1, 2, 3, 4]
let b: Set = [3, 4, 5]
a.subtracting(b) // {1, 2}symmetricDifference は、2つの集合のいずれか一方のみに含まれ、両方には含まれない要素を返します:
a.symmetricDifference(b) // {1, 2, 5}union と intersection を合わせれば、これら4つで日常的に遭遇するあらゆる集合代数の問題を網羅できます。
集合のメンバーシップは、フィルターとしても便利です。ある値が集合に含まれているかどうかをO(1)で確認できます:
let stopwords: Set = ["the", "a", "an"]
let words = ["the", "cat", "sat", "on", "a", "mat"]
let real = words.filter { !stopwords.contains($0) }
// ["cat", "sat", "on", "mat"]チャレンジ
簡単2行の入力を読み込みます。各行はカンマ区切りの文字列リストです。それぞれを currentMembers と renewedMembers として扱ってください。
アルファベット順にソートし、, で結合した(該当するものがない場合は空の)3行を出力してください:
Lapsed: <...>> current から renewed を引いたものNew: <...>> renewed から current を引いたものStayed: <...>> 両方の積集合(共通部分)
1行目の入力が alice,bob,cara で、2行目の入力が bob,cara,dan の場合、出力は以下のようになります:
Lapsed: alice
New: dan
Stayed: bob,caraチートシート
subtracting は、1つ目の集合に含まれ、2つ目の集合には含まれない要素を返します:
let a: Set = [1, 2, 3, 4]
let b: Set = [3, 4, 5]
a.subtracting(b) // {1, 2}symmetricDifference は、2つの集合のいずれか一方のみに含まれる要素を返します:
a.symmetricDifference(b) // {1, 2, 5}contains を使用して、集合を O(1) フィルタとして利用します:
let stopwords: Set = ["the", "a", "an"]
let words = ["the", "cat", "sat", "on", "a", "mat"]
let real = words.filter { !stopwords.contains($0) }
// ["cat", "sat", "on", "mat"]自分で試してみよう
let current = Set(readLine()!.components(separatedBy: ","))
let renewed = Set(readLine()!.components(separatedBy: ","))
// TODO: Lapsed (current - renewed)、New (renewed - current)、Stayed (intersection) を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。