Skip to content

Instantly share code, notes, and snippets.

@pazworld
Last active December 18, 2015 04:49
Show Gist options
  • Save pazworld/5728333 to your computer and use it in GitHub Desktop.
Save pazworld/5728333 to your computer and use it in GitHub Desktop.
-module(ifb).
-export([sample/0, find/1]).
sample() ->
write_ifb([fizz]),
write_ifb([buzz]),
write_ifb([fizz, buzz]),
write_ifb([buzz, fizz]),
write_ifb([fizz, buzz, fizz]),
write_ifb([fizz, fizz]),
write_ifb([fizz, fizz, buzz]),
write_ifb([fizz, fizzbuzz, fizz, buzz]),
write_ifb([buzz, fizz, buzz]).
write_ifb(List) -> io:fwrite("~w -> ~w~n", [List, find(List)]).
find(List) -> select_result(candidates(List)).
select_result([]) -> error;
select_result(List) ->
{_, Start, End} = lists:min([add_distance(X) || X <- List]),
lists:seq(Start, End).
add_distance({Start, End}) -> {End - Start, Start, End}.
candidates(List) ->
Len = 7 + length(List),
Words = [element(3, X) || X <- fb_list(Len)],
Is_prfx = fun(X) -> lists:prefix(List, lists:nthtail(X - 1, Words)) end,
[{num(X), num(X + length(List) - 1)} || X <- lists:seq(1, Len), Is_prfx(X)].
fb_list(Len) -> [fb(X) || X <- lists:seq(1, num(Len)), element(1, fb(X))].
num(N) -> num(N, 1).
num(0, X) -> X - 1;
num(N, X) -> num(N - boolean_to_integer(element(1, fb(X))), X + 1).
boolean_to_integer(B) -> case B of true -> 1; _Else -> 0 end.
fb(X) ->
case {X rem 3, X rem 5} of
{0, 0} -> {true, X, fizzbuzz};
{0, _} -> {true, X, fizz};
{_, 0} -> {true, X, buzz};
{_, _} -> {false, X, X}
end.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment