Skip to content

Instantly share code, notes, and snippets.

@yuchunc
Last active July 24, 2019 14:18
Show Gist options
  • Save yuchunc/32b22be4ee0958fe45fdbcacd9bc6187 to your computer and use it in GitHub Desktop.
Save yuchunc/32b22be4ee0958fe45fdbcacd9bc6187 to your computer and use it in GitHub Desktop.
Grindr Interview Question
defmodule CombineInterval do
def merge_interval([]), do: []
def merge_interval([h | t]), do: merge_interval(t, [h])
def merge_interval([], acc), do: Enum.reverse(acc)
def merge_interval([h | t], acc = [acc_h | acc_t]) do
{start, _leng} = h
{acc_h_start, acc_h_leng} = acc_h
cond do
end_pos(acc_h) < start -> merge_interval(t, [h | acc])
acc_h_start <= start and end_pos(h) <= end_pos(acc_h) -> merge_interval(t, acc)
acc_h_start <= start and end_pos(h) > end_pos(acc_h) ->
leng_diff = end_pos(h) - end_pos(acc_h)
merge_interval(t, [{acc_h_start, acc_h_leng + leng_diff} | acc_t])
end
end
defp end_pos({start, leng}), do: start + leng
end
data = [{1, 3}, {2, 4}, {6, 1}, {10, 4}]
# result [{1, 6}, {10, 4}]
# assume data has been sorted
# execute with `elixir combine_interval.exs`
CombineInterval.merge_interval(data)
|> IO.inspect(label: "result")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment