#!/usr/bin/ruby
@LIMIT=150_000@is_prime,@omega=Array.new(@LIMIT,false),Array.new(@LIMIT,0)defsieve@is_prime[2]=true1.step(@LIMIT,2){|x|@is_prime[x]=true}3.step(Math.sqrt(@LIMIT).to_i,2)do |i|if@is_prime[i](i**2).step(@LIMIT,2*i){|x|@is_prime[x]=false}endendenddefomega(x)return1if@is_prime[x]
current, i, factors =2, x,[]until@is_prime[i]if@is_prime[current]and i % current ==0and i != current
while i % current ==0and i != current do
factors << current
i /= current
endendunless@omega[i].zero? # Thus in lookup table.
@omega[x]= factors.uniq.size +@omega[i]return@omega[x]endbreakif i == current # Just in case
i +=1end
factors << x
@omega[x]= factors.uniq.size;return@omega[x]enddefcalculate
sieve
646.upto(@LIMIT)do |i|
done =true(0..4).each {|j| done = omega(i+j)<4?false: done }return i if done
endend
start =Time.now
puts "Answer: %d\nThat took %f seconds"%[calculate,Time.now - start]