-module(beust4). -export([challenge/1, test/0]). %% Use built-in functions %% Use a direct function call, rather than fun application unique_list([]) -> true; unique_list([H|T]) -> case lists:member(H,T) of true -> false; false -> unique_list(T) end. count(Upto, Upto, State) -> State; count(From, Upto, State) when From < Upto -> case unique_list(integer_to_list(From)) of true -> count(From + 1, Upto, finder(State,From)); false -> count(From + 1, Upto, State) end. finder({RunStart,MaxGap,Counter},Element) when Element - RunStart >= MaxGap -> {Element,Element - RunStart,Counter + 1}; finder({_RunStart,MaxGap,Counter},Element) -> {Element,MaxGap,Counter + 1}. challenge([Max]) -> challenge(list_to_integer(Max)); challenge(Max) -> statistics(wall_clock), {_,BiggestJump,CountOfNumbers} = count(1,Max+1,{0,0,0}), {_, Elapsed} = statistics(wall_clock), io:format("~p ms elapsed to complete count to ~p~n", [Elapsed, Max]), {BiggestJump, CountOfNumbers}. test_challenge() -> {1,10} = challenge(10), {2,90} = challenge(100), {11,738} = challenge(1000), {105,5274} = challenge(10000), {1047,32490} = challenge(100000). test() -> test_unique_list(), test_challenge(), ok. test_unique_list() -> false = unique_list([1,1]), true = unique_list([1,2]), true = unique_list([1]), false = unique_list([1,2,1]), false = unique_list([2,1,1]), false = unique_list([1,1,2]), true = unique_list([1,2,3]).