Skip to content

Instantly share code, notes, and snippets.

@silvadanilo
Last active August 29, 2015 14:15
Show Gist options
  • Save silvadanilo/da48e21671ffdc4bfe51 to your computer and use it in GitHub Desktop.
Save silvadanilo/da48e21671ffdc4bfe51 to your computer and use it in GitHub Desktop.
-module(fizzbuzz).
-export([evaluateV1/1]).
-export([evaluateV2/1]).
-export([evaluateV3/1]).
-export([evaluateV4/1]).
-include_lib("eunit/include/eunit.hrl").
divisorToWordMap() ->
#{
3 => "fizz",
5 => "buzz",
7 => "bazz"
}.
%%%%%% V4 %%%%%%
evaluateV4(Number) ->
case lists:concat(
lists:map(fun({Divisor, Word}) ->
case Number rem Divisor of
0 -> Word;
_ -> ""
end
end, maps:to_list(divisorToWordMap()))
) of
"" -> integer_to_list(Number);
Concat -> Concat
end.
%%%%%% V3 %%%%%%
evaluateV3({Number, List}) when 1 =:= length(List) ->
[Head | _Tail] = List,
wordForNumber(Number, Head);
evaluateV3({Number, List}) ->
[Head | Tail] = List,
string:concat(wordForNumber(Number, Head), evaluateV3({Number, Tail}));
evaluateV3(Number) ->
case evaluateV3({Number, maps:to_list(divisorToWordMap())}) of
"" -> integer_to_list(Number);
Result -> Result
end.
wordForNumber(Number, {Divisor, Word}) when 0 =:= Number rem Divisor ->
Word;
wordForNumber(_Number, {_Divisor, _Word}) ->
"".
%% Test %%
evaluate_with_a_number_that_not_match_any_rules_returns_number_itself_test() ->
?assertEqual("2", evaluateV4(2)).
evaluate_with_a_multiple_of_three_returns_fizz_test() ->
?assertEqual("fizz", evaluateV4(6)).
evaluate_with_a_multiple_of_five_returns_buzz_test() ->
?assertEqual("buzz", evaluateV4(5)).
evaluate_with_a_multiple_of_three_and_five_returns_fizzbuzz_test() ->
?assertEqual("fizzbuzz", evaluateV4(15)).
evaluate_with_a_multiple_of_three_and_seven_returns_fizzbazz_test() ->
?assertEqual("fizzbazz", evaluateV4(21)).
evaluate_with_a_multiple_of_three_and_five_and_seven_returns_fizzbuzzbazz_test() ->
?assertEqual("fizzbuzzbazz", evaluateV4(105)).
%%%%%% V1 %%%%%%
%%%%% UGLY %%%%%
evaluateV1(NUM) when 0 =:= NUM rem 15 ->
"fizzbuzz";
evaluateV1(NUM) when 0 =:= NUM rem 5 ->
"buzz";
evaluateV1(NUM) when 0 =:= NUM rem 3 ->
"fizz";
evaluateV1(NUM) ->
integer_to_list(NUM).
%%%%%% V2 %%%%%%
%%%%% UGLY %%%%%
evaluateV2(NUM) ->
Y = case {NUM rem 3, NUM rem 5} of
{ 0, 0 } -> "fizzbuzz";
{ 0, _ } -> "fizz";
{ _, 0 } -> "buzz";
{ _, _ } -> integer_to_list(NUM)
end,
Y.
@silvadanilo
Copy link
Author

try with List Comprehensions

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment