Skip to content

Instantly share code, notes, and snippets.

@Dania02525
Last active August 29, 2015 14:25
Show Gist options
  • Select an option

  • Save Dania02525/89f4da3efe63e050ed0f to your computer and use it in GitHub Desktop.

Select an option

Save Dania02525/89f4da3efe63e050ed0f to your computer and use it in GitHub Desktop.
Brute force solution to try different possibilities simultaneously for the sublist challenge on excercism.io
defmodule Sublist do
@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, b) do
task1 = Task.async(fn -> is_equal(a, b) end)
task2 = Task.async(fn ->
case is_equal(a, b) do
:equal ->
:equal
:fail ->
is_sublist(a, b, Enum.count(a))
end
end)
task3 = Task.async(fn ->
case is_equal(a, b) do
:equal ->
:equal
:fail ->
is_sublist(Enum.reverse(a), Enum.reverse(b), Enum.count(a))
end
end)
task4 = Task.async(fn ->
case is_equal(a, b) do
:equal ->
:equal
:fail ->
is_superlist(a, b, Enum.count(b))
end
end)
task5 = Task.async(fn ->
case is_equal(a, b) do
:equal ->
:equal
:fail ->
is_superlist(Enum.reverse(a), Enum.reverse(b), Enum.count(b))
end
end)
await([task1, task2, task3, task4, task5])
end
def is_equal(a, b) do
if(a === b) do
:equal
else
:fail
end
end
def is_sublist(_a, [], _c) do
:fail
end
def is_sublist(a, [ head | tail], c) do
case is_equal(a, Enum.take([head | tail], c)) do
:equal ->
:sublist
:fail ->
if Enum.count(tail) < c do
:fail
else
is_sublist(a, tail, c)
end
end
end
def is_superlist(a, b, c) do
case is_sublist(b, a, c) do
:sublist ->
:superlist
:fail ->
:fail
end
end
def await([]) do
:unequal
end
def await(tasks) do
receive do
message ->
case Task.find(tasks, message) do
{:fail, task} ->
await(List.delete(tasks, task))
{reply, _task} ->
reply
nil ->
await(tasks)
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment