Menu
Coddy logo textTech

差集合と対称差

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}

unionintersection を合わせれば、これら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"]
challenge icon

チャレンジ

簡単

2行の入力を読み込みます。各行はカンマ区切りの文字列リストです。それぞれを currentMembersrenewedMembers として扱ってください。

アルファベット順にソートし、, で結合した(該当するものがない場合は空の)3行を出力してください:

  1. Lapsed: <...> > current から renewed を引いたもの
  2. New: <...> > renewed から current を引いたもの
  3. 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) を出力する
quiz icon腕試し

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

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