-module(solution). -export([main/0]). -compile(export_all). main () -> ets:new(?MODULE, [set, protected, named_table]), [_G, Queries] = %% Input parse_input(scan_input()), io:format(standard_error, "input parsed~n", []), {Time, Val} = timer:tc( fun () -> serve(Queries) end), io:format(standard_error, "done in ~f msec~n", [Time/1000]), io:format("~s", [Val]), ets:delete(?MODULE), true. %------------------------------------------------------------------------------- scan_input () -> Opts = io:getopts(), io:setopts([binary]), Data = scan_input(<<>>), io:setopts(Opts), Data. scan_input (Acc) -> case file:read_line(standard_io) of {ok, <<"eof\n">>} -> binary_to_list(Acc); {ok, Data} -> scan_input(<>); _ -> binary_to_list(Acc) end. %------------------------------------------------------------------------------- line_to_int_list (Str) -> lists:map(fun list_to_integer/1, string:tokens(Str, " ")). %------------------------------------------------------------------------------- parse_input (Str) -> Lines = string:tokens(Str, "\n"), [N | Rest] = Lines, [list_to_integer(N), lists:map(fun list_to_integer/1, Rest)]. %------------------------------------------------------------------------------- serve (Q) -> R = lists:foldl( fun (N, Reps) -> [solve(N) | Reps] end, [], Q), lists:reverse(R). solve (N) -> case length(lists:filter(fun prime/1, lists:seq(1, N))) of L when L rem 2 == 0 -> "Bob\n"; _ -> "Alice\n" end. %------------------------------------------------------------------------------- prime (1) -> false; prime (2) -> true; prime (3) -> true; prime (N) when N rem 2 == 0 -> false; prime (N) -> case ets:lookup(?MODULE, N) of [{N, Ret}] -> Ret; _ -> Ret = not lists:any( fun (D) -> N rem D == 0 end, lists:seq(2, trunc(math:sqrt(N))+1)), ets:insert(?MODULE, {N, Ret}), Ret end.