Skip to content

Instantly share code, notes, and snippets.

@pragdave
Created April 22, 2014 17:25
Show Gist options
  • Select an option

  • Save pragdave/11187581 to your computer and use it in GitHub Desktop.

Select an option

Save pragdave/11187581 to your computer and use it in GitHub Desktop.
#
# Given a list, return a new list with all occurrences of consecutive
# duplicated elements replaced by `{element, count}`
#
# compress [ 1,2,2,3,4,4,4,5,6,6]
# → [1, {2, 2}, 3, {4, 3}, 5, {6, 2}]
#
# This version uses the head of the result to give the effect of lookahead
defmodule Demo do
def compress(list), do: _compress(list, [])
def _compress([], result), do: Enum.reverse(result)
def _compress([a | list], [a | rest]) do
_compress(list, [{a, 2} | rest])
end
def _compress([a | list], [{a, n} | rest]) do
_compress(list, [ {a, n+1} | rest ])
end
def _compress([a | list], result) do
_compress(list, [ a | result ])
end
end
# this version instead peeks at two elements from the source
defmodule Demo1 do
def compress(list), do: _compress(list, [])
def _compress([], result), do: Enum.reverse(result)
def _compress([a, a | list], rest) do
_compress([ {a,2} | list ], rest)
end
def _compress([{a,n}, a | list], [rest]) do
_compress([ {a,n+1} | list], rest)
end
def _compress([a | list], result) do
_compress(list, [ a | result ])
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment