diff options
author | Nathan Lasseter <nathan.je.lasseter@googlemail.com> | 2009-10-04 00:56:56 +0100 |
---|---|---|
committer | Nathan Lasseter <nathan.je.lasseter@googlemail.com> | 2009-10-04 00:56:56 +0100 |
commit | 0248ed34ce3d05228bc5084669c3a27933be0c2e (patch) | |
tree | b9c4990344b0863a2af851b5917c49f3a5f03e6b /p45c.erl | |
parent | 00686037d57eb0a0d5eba6eeb6fcc9692e8b59f6 (diff) |
first commit
Diffstat (limited to 'p45c.erl')
-rwxr-xr-x | p45c.erl | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/p45c.erl b/p45c.erl new file mode 100755 index 0000000..57b680a --- /dev/null +++ b/p45c.erl @@ -0,0 +1,55 @@ +-module(p45c). +-export([solve/1]). + +triangles(F,M) -> F ! {1, [ (N * (N + 1)) div 2 || N <- lists:seq(1,M) ]}. +pentagons(F,M) -> F ! {2, [ (N * ((3 * N) - 1)) div 2 || N <- lists:seq(1,M) ]}. +hexagons(F,M) -> F ! {3, [ N * ((2 * N) + 1) || N <- lists:seq(1,M) ]}. + +max(M) -> M * ((2 * M) + 1). + +nums(M) -> + spawn(fun() -> triangles(self(),M) end), + spawn(fun() -> pentagons(self(),M) end), + spawn(fun() -> hexagons(self(),M) end), + {T, P, H} = receive + {1, X} -> + receive + {2, Y} -> + receive + {3, Z} -> {X, Y, Z} + end; + {3, Y} -> + receive + {2, Z} -> {X, Z, Y} + end + end; + {2, X} -> + receive + {1, Y} -> + receive + {3, Z} -> {Y, X, Z} + end; + {3, Y} -> + receive + {1, Z} -> {Z, X, Y} + end + end; + {3, X} -> + receive + {1, Y} -> + receive + {2, Z} -> {Y, Z, X} + end; + {2, Y} -> + receive + {1, Z} -> {Z, Y, X} + end + end + end, + [ E || E <- lists:seq(1,max(M)), lists:member(E,T), lists:member(E, P), lists:member(E,H) ]. + +getnext([_]) -> "Keep trying."; +getnext([40755,X|_]) -> X; +getnext([_|T]) -> getnext(T). + +solve(M) -> getnext(nums(M)). |