-module(dont). -export([dont/2]). search(Fun, List) -> search(Fun, List, length(List), length(List) - 1). search(_, _, Max, 0) -> Max; search(Fun, List, Max, Idx) -> case Fun(lists:nth(Max, List), lists:nth(Idx, List)) of true-> search(Fun, List, Idx, Idx - 1); false -> search(Fun, List, Max, Idx - 1) end. replace(List, Idx, Ele) -> lists:sublist(List, 1, Idx - 1) ++ [Ele] ++ lists:sublist(List, Idx + 1, length(List)). dont(Vote, Quorum) -> dont([{X, 1, X} || X <- Vote], lists:duplicate(length(Vote), 0), Quorum). dont(_, Seat, 0) -> Seat; dont(Vote, Seat, Quorum) -> Max = search(fun({X, _, _}, {Y, _, _}) -> X < Y end, Vote), {_, B, C} = lists:nth(Max, Vote), NewVote = replace(Vote, Max, {C / (B + 1), B + 1, C}), NewSeat = replace(Seat, Max, lists:nth(Max, Seat) + 1), dont(NewVote, NewSeat, Quorum - 1).