public
Description: deepblue's thoughts
Homepage: http://myruby.net/
Clone URL: git://github.com/deepblue/snippets.git
snippets / chalenge / trip / trip.erl
2c347fa5 » Bryan Kang 2008-08-24 3n+1, trip added 1 -module (trip).
2 -export ([minimum_transfer/1]).
3 -include_lib("eunit/include/eunit.hrl").
4
5 init(X) -> lists:sort( fun(A,B) -> A>B end,
6 lists:map( fun(N) -> trunc(N*100) end, X) ).
7
8 to_pay(X) ->
9 Avr = lists:sum(X) div length(X),
10 Rem = lists:sum(X) rem length(X),
11 lists:duplicate(Rem, Avr + 1) ++ lists:duplicate(length(X) - Rem, Avr).
12
13 subtract(A, B) -> subtract(A, B, []).
14 subtract([A|H], [B|T], L) -> subtract(H, T, L ++ [abs(A-B)]);
15 subtract([], [], L) -> L.
16
17 minimum_transfer(X) -> Input = init(X),
18 lists:sum(subtract(Input, to_pay(Input))) / 200.0.
19
20
21 init_test_() -> [
22 ?_assert([3000, 2000, 1000] == init([10.00, 20.00, 30.00]))
23 ].
24
25 to_pay_test_() -> [
26 ?_assert([2000, 2000, 2000] == to_pay([1000, 2000, 3000])),
27 ?_assert([901, 901, 900, 900] == to_pay([1501, 1500, 301, 300]))
28 ].
29
30 subtract_test_() -> [
31 ?_assert([1,2,3] == subtract([5,4,3], [4,6,6]))
32 ].
33
34 minimun_transfer_test_() -> [
35 ?_assert(10.00 == minimum_transfer([10.00, 20.00, 30.00])),
36 ?_assert(11.99 == minimum_transfer([15.00, 15.01, 3.00, 3.01]))
37 ].