Tried simple Sieve of Eratosthenes in Ruby …
class MyPrime
attr_reader :primes # there we can read then
# compute prime numbers up to limit, default is 20
def initialize(limit = 20)
@primes = []
limit = limit.to_i
return if limit.to_i < 2
arr = Hash[*((2..limit).to_a*2).sort] # we can use .zip too
(2..Math.sqrt(limit)).each do |i|
next unless arr[i] # already removed
(i*i..limit).step(i).each{|k| arr.delete(k)}
end
@primes = arr.keys.sort # return just keys
end
end
we can add some tests
require 'test/unit'
require 'my_prime'
class TestMyPrime < Test::Unit::TestCase
def test_20_primes
primes = MyPrime.new(20)
assert_equal [2, 3, 5, 7, 11, 13, 17, 19], primes.primes
end
def test_wo_param
primes = MyPrime.new
assert_equal [2, 3, 5, 7, 11, 13, 17, 19], primes.primes
end
def test_less_than_2
primes = MyPrime.new(1)
assert_equal [], primes.primes
end
def test_limit_eq_2
primes = MyPrime.new(2)
assert_equal [2], primes.primes
end
def test_limit_is_string
primes = MyPrime.new('20')
assert_equal [2, 3, 5, 7, 11, 13, 17, 19], primes.primes
end
def test_limit_is_float
primes = MyPrime.new(20.50)
assert_equal [2, 3, 5, 7, 11, 13, 17, 19], primes.primes
end
end