Solving MakeArrayConsecutive2 on CodeSignal Anton github logo Oct 9・1 min read

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: 
Output: 0

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
DISCUSS (1) Sore eyes?

dev.to now has dark mode.

Select night theme in the "misc" section of your settings ❤️ 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
Classic DEV Post from May 28

Those silly mistakes we all make  