DEV Community

Anton
Anton

Posted on

4

Solving MakeArrayConsecutive2 on CodeSignal

The challenge:

Input: [6, 2, 3, 8]
Output: 3

To explain better the input and output relationship I need to sort the numbers first
[2,3,6,8]

You see that the numbers that are missing are 4,5, and 7.
How many numbers are missing? Exactly, 3. 3 is the answer.

Input: [0, 3]
Output: 2

Input: [5, 4, 6]
Output: 0

Input: [2]
Output: 0

The link to the challenge
An invite link to join CodeSignal

My first attempt:

defmodule MakeArrayConsecutive do
  # statues = [6, 2, 3, 8]
  # makeArrayConsecutive2(statues) = 3
  def makeArrayConsecutive2(statues) do
    statues
    |> Enum.sort()
    |> 
  end


  # What am I trying to do here?
  defp number_of_holes(sorted_list) do
    Enum.reduce(list, [],
      fn(x, []) ->
        [x]
      end
      fn(x, [head | tail] = whole_list) -> 
        if x - head =
      end
    )
  end
end

My second attempt, still not the full solution, but very close. I didn't account the case [0,3].

defmodule MakeArrayConsecutive do
  # statues = [6, 2, 3, 8]
  # makeArrayConsecutive2(statues) = 3
  def makeArrayConsecutive2(statues) do
    case check_singleton(statues) do
      0 ->
        0
      list ->
        list
        |> Enum.sort()
        |> number_of_holes()
        |> return_difference()
    end
  end

  defp check_singleton(xs) do
    case xs do
      [x] -> 0
      list -> list
    end
  end

  defp return_difference({x, y}) do
    y
  end

  defp number_of_holes(sorted_list) do
    Enum.reduce(sorted_list, {0, 0}, fn(x, acc) ->
      case acc do
        {0,0} ->
          {x, 0}
        {number, difference} ->
          if x - number <= 1 do
            {x, difference}
          else
            {x, difference + (x - number - 1)}
          end
      end
    end)
  end
end

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (1)

Collapse
 
antonrich profile image
Anton • Edited

And final solution, which as admittedly very verbose.

defmodule MakeArrayConsecutive do
  # statues = [6, 2, 3, 8]
  # makeArrayConsecutive2(statues) = 3
  def makeArrayConsecutive2(statues) do
    case check_singleton_or_double(statues) do
      0 ->
        0
      [x, y] -> y - x - 1
      list ->
        list
        |> Enum.sort()
        |> number_of_holes()
        |> return_difference()
    end
  end

  # I rename the function and added a second case when the list has two items.
  defp check_singleton_or_double(xs) do
    case xs do
      [x] -> 0
      [x, y] -> Enum.sort([x, y])
      list -> list
    end
  end

  defp return_difference({x, y}) do
    y
  end

  defp number_of_holes(sorted_list) do
    Enum.reduce(sorted_list, {0, 0}, fn(x, acc) ->
      case acc do
        {0,0} ->
          {x, 0}
          |> IO.inspect()
        {number, difference} ->
          if x - number <= 1 do
            {x, difference}
            |> IO.inspect()
          else
            {x, difference + (x - number - 1)}
            |> IO.inspect()
          end
      end
    end)
  end
end

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay