Last active
August 22, 2019 01:54
-
-
Save davidstosik/694d6320de3f81cae491489fb6e5de73 to your computer and use it in GitHub Desktop.
Prime calculator on Reddit: https://www.reddit.com/r/ruby/comments/ct3yop/just_started_coding_a_couple_months_ago_and_have
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class NewNewPrimesRetrievalService | |
def self.process(max) | |
new(max).process | |
end | |
def initialize(max) | |
@max = max | |
end | |
def process | |
(2..max).each do |number| | |
primes_so_far << number if prime?(number) | |
end | |
primes_so_far | |
end | |
private | |
attr_reader :max | |
def prime?(number) | |
primes_so_far.none? do |prime| | |
number % prime == 0 | |
end | |
end | |
def primes_so_far | |
@_primes_so_far ||= [] | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class NewPrimesRetrievalService | |
def self.process(max) | |
(2..max).each_with_object([]) do |number, primes| | |
if primes.all? { |divisor| number % divisor != 0 } | |
primes << number | |
end | |
end | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class PrimesRetrievalService | |
def self.process(options) | |
n = options['number'] | |
# 1 is NOT a prime number! | |
#all_numbers = [*1..n] | |
all_numbers = [*2..n] | |
primes = [] | |
all_numbers.each do |number| | |
solutions = [] | |
divisors = [*2..(number-1)] | |
divisors.each do |divisor| | |
solution = (number.to_f/divisor.to_f) | |
solution = 1 if solution - solution.to_i == 0 | |
solutions << solution | |
end | |
if solutions.all? {|i| i.is_a?(Float)} == true | |
primes << number | |
end | |
end | |
primes | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require "minitest/autorun" | |
require "benchmark" | |
require "prime" | |
require_relative "./primes_retrieval_service.rb" | |
require_relative "./new_primes_retrieval_service.rb" | |
require_relative "./new_new_primes_retrieval_service.rb" | |
module TestHelper | |
PRIMES_SAMPLE = Prime.first(10) | |
def primes_sample_before(n) | |
PRIMES_SAMPLE.select do |prime| | |
prime <= n | |
end | |
end | |
def test_primes_before_0 | |
test_primes_before(0) | |
end | |
def test_primes_before_1 | |
test_primes_before(1) | |
end | |
def test_primes_before_10 | |
test_primes_before(10) | |
end | |
def test_primes_before_30 | |
test_primes_before(30) | |
end | |
private | |
def test_primes_before(n) | |
assert_equal primes_sample_before(n), get_primes_before(n) | |
end | |
end | |
class TestPrimesRetrieval < Minitest::Test | |
include TestHelper | |
private | |
def get_primes_before(n) | |
PrimesRetrievalService.process("number" => n) | |
end | |
end | |
class TestNewPrimesRetrieval < Minitest::Test | |
include TestHelper | |
private | |
def get_primes_before(n) | |
NewPrimesRetrievalService.process(n) | |
end | |
end | |
class TestNewNewPrimesRetrieval < Minitest::Test | |
include TestHelper | |
private | |
def get_primes_before(n) | |
NewNewPrimesRetrievalService.process(n) | |
end | |
end | |
class TestBenchmark < Minitest::Test | |
def test_benchmark | |
Benchmark.bm(20) do |x| | |
max = 10000 | |
x.report("Original retriever: ") do | |
PrimesRetrievalService.process("number" => max) | |
end | |
x.report("New retriever: ") do | |
NewPrimesRetrievalService.process(max) | |
end | |
x.report("New New retriever: ") do | |
NewNewPrimesRetrievalService.process(max) | |
end | |
x.report("Trial division: ") do | |
Prime::TrialDivisionGenerator.new.each do |prime| | |
break if prime >= max | |
end | |
end | |
x.report("Eratosthenes' sieve: ") do | |
Prime::EratosthenesGenerator.new.each do |prime| | |
break if prime >= max | |
end | |
end | |
end | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ ruby -I:lib/test primes_test.rb | |
Run options: --seed 20111 | |
# Running: | |
user system total real | |
Original retriever: 8.261264 0.458415 8.719679 ( 8.806964) | |
New retriever: 0.046797 0.001929 0.048726 ( 0.049026) | |
New New retriever: 0.045379 0.000119 0.045498 ( 0.045645) | |
Trial division: 0.004188 0.000009 0.004197 ( 0.004240) | |
Eratosthenes' sieve: 0.000579 0.000008 0.000587 ( 0.000587) | |
............. | |
Finished in 8.909285s, 1.4592 runs/s, 1.3469 assertions/s. | |
13 runs, 12 assertions, 0 failures, 0 errors, 0 skips |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment