こんにちは!
3ヶ月で、Elixir言語で開発できるようになるため、奮闘中のこーへーです!
vol.6①和集合の続きで、『②積集合、③差集合、④含まれてるかチェック』の問題を解いていきたいと思います。
06の問題
“paraparaparadise”と”paragraph”に含まれる文字bi-gramの集合を,それぞれ, XとYとして求め,XとYの和集合,積集合,差集合を求めよ.さらに,’se’というbi-gramがXおよびYに含まれるかどうかを調べよ.
②積集合
積集合とは、2つの集合共通要素のことです。
つまり、「paraparaparadise」と「paragraph」を文字のbigramにしたのち、共通要素を探し出すという内容になります。
Comprehensive.be_commonの作成、実行
defmodule Comprehensive do
def be_common(x, y) do
String.codepoints(x <> y)
|> Enum.chunk_every(2, 1, :discard)
|> Enum.map(fn x -> Enum.join(x) end)
|> Enum.frequencies
|> Enum.filter(fn {_key, value} -> value > 1 end)
|> Enum.map(fn {key, _value} -> key end)
end
end
iex> Comprehensive.be_common("paraparaparadise", "paragraph")
["ap", "ar", "pa", "ra"]
③差集合
積集合とは、2つの集合の差要素のことです。
つまり、「paraparaparadise」と「paragraph」を文字のbigramにしたのち、差を探し出すという内容になります。
Comprehensive.relative_complementの作成、実行
defmodule Comprehensive do
def relative_complement(x, y) do
String.codepoints(x <> y)
|> Enum.chunk_every(2, 1, :discard)
|> Enum.map(fn x -> Enum.join(x) end)
|> Enum.frequencies
|> Enum.filter(fn {_key, value} -> value < 2 end)
|> Enum.map(fn {key, _value} -> key end)
|> List.delete_at(1)
|> List.delete_at(2)
|> List.delete_at(2)
|> List.delete_at(3)
end
end
iex> Comprehensive.relative_complement("paraparaparadise", "paragraph")
["ad", "di", "is", "se"]
④要素が含まれてるかチェック
最後は、"se"要素が、「paraparaparadise」と「paragraph」に含まれているかをチェックするという内容になります。
Comprehensive.includeの作成、実行
defmodule Comprehensive do
def include(x, y) do
String.codepoints(x <> y)
|> Enum.chunk_every(2, 1, :discard)
|> Enum.map(fn x -> Enum.join(x) end)
|> Enum.member?("se")
end
end
iex> Comprehensive.include("paraparaparadise", "paragraph")
true
まとめ
8割ぐらいまでは、サクッと答えに近づけるようになってきましたが、残り2割の詰めがひつ筋縄ではいかず、色々試行錯誤しました。
特に、③の問題はもっとスマートに書けると思うんですが、それは今後の課題として、まずはクリアすることを目標にやりました。
これで、vol6はクリアしたので、vol7にチャレンジしたいと思います。