Hey folks! Here is my ugly solution 
-module(day_2).
-export([task_1/0, task_2/0]).
task_1() ->
File = "input",
{ok, RawData} = file:read_file(File),
Raw = binary:split(RawData, <<"\n">>, [global, trim]),
Data = [[binary_to_integer(X) || X <- binary:split(R, <<" ">>, [global, trim]), X /= <<>>] || R <- Raw],
lists:foldl(fun sum/2, 0, Data).
sum(List, Sum) ->
case maybe_safe(List, none) of
descrise ->
Sum + 1;
increase ->
Sum + 1;
_ ->
Sum
end.
maybe_safe([], Acc) ->
Acc;
maybe_safe([H, H | _T], _Acc) ->
not_safe;
maybe_safe([X, Y | T], none) when X - Y > 0, abs(X - Y) < 4 ->
maybe_safe([Y | T], descrise);
maybe_safe([X, Y | T], descrise) when X - Y > 0, abs(X - Y) < 4 ->
maybe_safe([Y | T], descrise);
maybe_safe([X, Y | T], increase) when X - Y > 0, abs(X - Y) < 4 ->
maybe_safe([Y | T], not_safe);
maybe_safe([X, Y | T], descrise) when abs(X - Y) < 4 ->
maybe_safe([Y | T], not_safe);
maybe_safe([X, Y | T], none) when abs(X - Y) < 4 ->
maybe_safe([Y | T], increase);
maybe_safe([X, Y | T], increase) when abs(X - Y) < 4 ->
maybe_safe([Y | T], increase);
maybe_safe([_, _Y | _T], _Acc) ->
not_safe;
maybe_safe([_ | T], Acc) ->
maybe_safe(T, Acc).
task_2() ->
File = "input",
{ok, RawData} = file:read_file(File),
Raw = binary:split(RawData, <<"\n">>, [global, trim]),
Data = [[binary_to_integer(X) || X <- binary:split(R, <<" ">>, [global, trim]), X /= <<>>] || R <- Raw],
lists:foldl(fun sum2/2, 0, Data).
sum2(List, Sum) ->
case maybe_safe2(List, none) of
descrise ->
Sum + 1;
increase ->
Sum + 1;
_ ->
Sum
end.
maybe_safe2([], Data) ->
Data;
maybe_safe2([H, H | T], Data) ->
maybe_safe2([H | T], Data);
maybe_safe2([X, Y | T], none) when X - Y > 0, abs(X - Y) < 4 ->
maybe_safe2([Y | T], descrise);
maybe_safe2([X, Y | T], descrise) when X - Y > 0, abs(X - Y) < 4 ->
maybe_safe2([Y | T], descrise);
maybe_safe2([X, Y | T], increase) when X - Y > 0, abs(X - Y) < 4 ->
case maybe_safe2([X | T], none) of
not_safe->
not_safe;
Safe ->
maybe_safe2([Y | T], Safe)
end;
maybe_safe2([X, Y | T], none) when abs(X - Y) < 4 ->
maybe_safe2([Y | T], increase);
maybe_safe2([X, Y | T], increase) when abs(X - Y) < 4 ->
maybe_safe2([Y | T], increase);
maybe_safe2([X, Y | T], descrise) when abs(X - Y) < 4 ->
case maybe_safe2([X | T], none) of
not_safe->
not_safe;
_ ->
case maybe_safe2([Y | T], none) of
not_safe ->
not_safe;
Safe ->
maybe_safe2(T, Safe)
end
end;
maybe_safe2([_, _ | _], _) ->
not_safe;
maybe_safe2([_ | T], Data) ->
maybe_safe2(T, Data).
I can’t say I thoroughly enjoyed the process
, but it is what it is, and we’ve got the result we needed.