LoginSignup
3
1

Elixirで言語処理100本ノックやってみた!vol.6②積集合、③差集合、④含まれてるかチェック

Last updated at Posted at 2024-04-21

こんにちは!
3ヶ月で、Elixir言語で開発できるようになるため、奮闘中のこーへーです!

vol.6①和集合の続きで、『②積集合、③差集合、④含まれてるかチェック』の問題を解いていきたいと思います。

①和集合の記事はこちら
100本ノックの記事はこちら

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にチャレンジしたいと思います。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1