sublist
This commit is contained in:
22
elixir/sublist/lib/sublist.ex
Normal file
22
elixir/sublist/lib/sublist.ex
Normal file
@@ -0,0 +1,22 @@
|
||||
defmodule Sublist do
|
||||
@type result ::
|
||||
:sublist
|
||||
| :superlist
|
||||
| :unequal
|
||||
| :equal
|
||||
|
||||
@doc """
|
||||
Returns whether the first list is a sublist or a superlist of the second list
|
||||
and if not whether it is equal or unequal to the second list.
|
||||
"""
|
||||
def compare(a, a), do: :equal
|
||||
def compare(a, b) when length(a) > length(b), do: (if subset?(b, a), do: :superlist, else: :unequal)
|
||||
def compare(a, b) when length(a) < length(b), do: (if subset?(a, b), do: :sublist, else: :unequal)
|
||||
def compare(_, _), do: :unequal
|
||||
|
||||
defp subset?(a, b, index \\ 0)
|
||||
defp subset?([], _b, _index), do: true
|
||||
defp subset?(a, b, index) when index + length(a) > length(b), do: false
|
||||
defp subset?(a, b, index), do:
|
||||
(if Enum.slice(b, index, length(a)) === a, do: true, else: subset?(a, b, index + 1))
|
||||
end
|
||||
Reference in New Issue
Block a user