Project Euler

Problem #35

The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime.

There are thirteen such primes below 100: 2, 3, 5, 7, 11, 13, 17, 31, 37, 71, 73, 79, and 97.

How many circular primes are there below one million?

Erlang: Running time = 9.1s
+%digit_split

+%echo

+%prime_list

p35()->
	A=prime_list(),
	A!{all_below,1000000,self()},
	Primes=lists:filter(fun(2)->true;(5)->true;
				(X)-> 
				DS=digit_split(X),
				L=length(DS),
				L==length(lists:subtract(DS,[0,2,5])) end,
			receive {primes_below,1000000,V}->V end),
	put(prime_set,sets:from_list(Primes)),
	put(circular,[]),
	put(done,sets:new()),
	p35(Primes),
	io:format("~w~n",[length(get(circular))]).
p35([])->ok;
p35([NextPrime|Others])->
	case sets:is_element(NextPrime,get(done)) of
		true->
			p35(Others);
		false->
			DS=digit_split(NextPrime),
			All=p35(DS,DS,[]),
			case lists:all(fun(X)->sets:is_element(X,get(prime_set)) end,All) of
				true->
					put(circular,lists:append(get(circular),All));
				false-> ok
			end,
			put(done,sets:union(get(done),sets:from_list(All))),
			p35(Others)
	end.
	
p35(OrigDigs,OrigDigs,All)when length(All)>0 ->All;
p35(OrigDigs,NextDigs,All)->
	N=list_to_integer(lists:append(lists:map(fun integer_to_list/1,NextDigs))),
	{First,Tail}=lists:split(length(NextDigs)-1,NextDigs),
	p35(OrigDigs,lists:append(Tail,First),[list_to_integer(lists:append(lists:map(fun integer_to_list/1,NextDigs)))|All]).

Ruby: Running time = 6.46s
+#PrimeList

def p35circle(n)
  s=[n.to_s]
  (s[0].length-1).times do
    t=s[-1]
    s.push(t[1..-1]+t[0..0])
  end
  s.map{|i|i.to_i}.uniq
end

def p35
  settled=Set.new
  sum=0
  ((1...1000000).reject{|i|s=i.to_s; i>9 and (s.include?("0") or s.include?("2") or s.include?("5"))}).each do |i|
    if settled.include?(i)
      settled.delete(i)
      next
    end
    circs=p35circle(i)
    circs[1..-1].each{|j|settled.add j}
    sum+=circs.length if(circs.all?{|j| PrimeList.isPrime? j})
  end
  puts sum
end