Project Euler Problem 29

Distinct powers.

Consider all integer combinations of a^b for 2 ≤ a ≤ 5 and 2 ≤ b ≤ 5:

2^2=4,  2^3=8,   2^4=16,  2^5=32
3^2=9,  3^3=27,  3^4=81,  3^5=243
4^2=16, 4^3=64,  4^4=256, 4^5=1024
5^2=25, 5^3=125, 5^4=625, 5^5=3125

If they are then placed in numerical order, with any repeats removed, we get the following sequence of 15 distinct terms:

    4, 8, 9, 16, 25, 27, 32, 64, 81, 125, 243, 256, 625, 1024, 3125

How many distinct terms are in the sequence generated by a^b for 2 ≤ a ≤ 100 and 2 ≤ b ≤ 100?

Link to original description
Source code examples on Github

Python version

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python

terms = {}
count = 0
for a in xrange(2,101):
    for b in xrange(2,101):
        c = pow(a,b)
        if not terms.get(c, 0):
            terms[c] = 1
            count = count + 1

print count

Erlang version

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env escript
%% -*- erlang -*-
%%! -smp enable -sname p29
% vim:syn=erlang

-mode(compile).

main(_) -> io:format("Answer ~p ~n", [t29()]).

t29() ->
    length(deduplicate(lists:flatten([ [math:pow(X, Y), math:pow(Y, X)] || X <- lists:seq(2,100), Y <- lists:seq(2,100)]), [])).
deduplicate([],L1) -> L1;
deduplicate([H|T], L1) ->
    case lists:member(H, L1) of
        true -> deduplicate(T,L1);
        _    -> deduplicate(T,[H] ++ L1)
    end.