primegrid 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/primegrid +25 -0
- data/lib/primegrid.rb +3 -0
- data/lib/primegrid/matrix_printer.rb +83 -0
- data/lib/primegrid/prime.rb +57 -0
- data/lib/primegrid/version.rb +3 -0
- data/test/test_matrix_printer.rb +26 -0
- data/test/test_prime.rb +24 -0
- metadata +79 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 587ed20c6253dd126cd445f827947b4fe3cd9ee9
|
4
|
+
data.tar.gz: ea94f1b84a2a7532523bacfa1b169d80f079b8bd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 322447596aa2590174a0b1f2cfac4b270882566b0b5eb9f38b95c8c81e9fb3787ae28d1329d04e874f176de8538180f2d92f535ed01f5a5b0aed655704f33f01
|
7
|
+
data.tar.gz: 46c2519b8ef80f7e40fa579d1df5e932717ddc0a6b0aafd49e5e07981a9a7777bd52614c80211ad5aa7cb8d8faf8b58a0b90e1194aff66516c20e04bbe013935
|
data/bin/primegrid
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
require 'primegrid'
|
5
|
+
|
6
|
+
options = { :n => 10, :headers => true }
|
7
|
+
|
8
|
+
OptionParser.new do |opts|
|
9
|
+
opts.banner = "Usage: primegrid [options]"
|
10
|
+
|
11
|
+
opts.on("-n", "--num-primes [NUM]", Integer, "Number of primes to find") do |n|
|
12
|
+
options[:n] = n
|
13
|
+
end
|
14
|
+
|
15
|
+
opts.on("-h", "--no-headers", "Don't print row and column headers") do |h|
|
16
|
+
options[:headers] = false
|
17
|
+
end
|
18
|
+
|
19
|
+
end.parse!
|
20
|
+
|
21
|
+
primes = Primegrid::Prime.find(options[:n])
|
22
|
+
prime_prod = primes.product(primes).map { |x, y| x * y }
|
23
|
+
print_opts = if options[:headers] then { :col_header => primes, :row_header => primes } else {} end
|
24
|
+
|
25
|
+
Primegrid::MatrixPrinter.print(prime_prod, primes.length, print_opts)
|
data/lib/primegrid.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
module Primegrid
|
2
|
+
class MatrixPrinter
|
3
|
+
# Prints out an un-rolled matrix to $stdout
|
4
|
+
#
|
5
|
+
# Example:
|
6
|
+
# >> MatrixPrinter.print([1, 0, 0, 0, 1, 0, 0, 0, 1], 3)
|
7
|
+
# => 1 0 0
|
8
|
+
# => 0 1 0
|
9
|
+
# => 0 0 1
|
10
|
+
#
|
11
|
+
# Arguments:
|
12
|
+
# array: the unrolled matrix
|
13
|
+
# width: the number of columns in the matrix
|
14
|
+
# opts : a hash containing optional arrays for row and column headers
|
15
|
+
# e.g. { :col_header => [0, 1, 2], :row_header => [0, 1, 2] }
|
16
|
+
|
17
|
+
@@gutter_width = 2
|
18
|
+
@@h_border_char = "-"
|
19
|
+
@@v_border_char = "|"
|
20
|
+
|
21
|
+
def self.print(array, width, opts={})
|
22
|
+
matrix = self.build_matrix(array, width, opts)
|
23
|
+
if !matrix.empty?
|
24
|
+
$stdout.puts matrix
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.build_matrix(array, width, opts={})
|
29
|
+
if array.length == 0 then return "" end
|
30
|
+
|
31
|
+
padding = self.maxlen_in array
|
32
|
+
gutter = " " * @@gutter_width
|
33
|
+
has_header = opts.has_key? :col_header
|
34
|
+
has_row_header = opts.has_key? :row_header
|
35
|
+
buf = []
|
36
|
+
|
37
|
+
# Add an optional header row
|
38
|
+
if has_header
|
39
|
+
header_sep = "-"
|
40
|
+
padding = [padding, self.maxlen_in(opts[:col_header])].max
|
41
|
+
header_str = opts[:col_header].map{|h| h.to_s.rjust(padding)}.join(gutter)
|
42
|
+
buf.push "#{header_str}"
|
43
|
+
buf.push "#{@@h_border_char * header_str.length}"
|
44
|
+
end
|
45
|
+
|
46
|
+
# Build the body of the matrix
|
47
|
+
line = ""
|
48
|
+
array.each_with_index do |p, i|
|
49
|
+
line = "#{line}#{p.to_s.rjust(padding)}#{gutter}"
|
50
|
+
if (i+1) % width == 0
|
51
|
+
buf.push "#{line.rstrip}"
|
52
|
+
line = ""
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Add row headers
|
57
|
+
if has_row_header
|
58
|
+
padding = self.maxlen_in(opts[:row_header])
|
59
|
+
padded_headers = opts[:row_header].map{|r| r.to_s.rjust(padding)}
|
60
|
+
offset = 0
|
61
|
+
if has_header
|
62
|
+
offset = 2
|
63
|
+
buf[0] = "#{' ' * (padding+1)}#{buf[0]}"
|
64
|
+
buf[1] = "#{' ' * (padding+1)}#{buf[1]}"
|
65
|
+
end
|
66
|
+
|
67
|
+
padded_headers.each_with_index do |r, i|
|
68
|
+
if i + offset < buf.length
|
69
|
+
buf[i + offset] = "#{r}#{@@v_border_char}#{buf[i + offset]}"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
return buf.join("\n")
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.maxlen_in(array)
|
78
|
+
as_lengths = array.map {|x| x.to_s.length}
|
79
|
+
return as_lengths.max
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module Primegrid
|
2
|
+
class Prime
|
3
|
+
|
4
|
+
# Finds the first n primes
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
# >> Prime.find(10)
|
8
|
+
# => [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
9
|
+
#
|
10
|
+
# Arguments:
|
11
|
+
# n: an integer > 0
|
12
|
+
def self.find(n)
|
13
|
+
if n <= 0
|
14
|
+
return []
|
15
|
+
elsif n <= 10
|
16
|
+
return [2, 3, 5, 7, 11, 13, 17, 19, 23, 29].slice(0, n)
|
17
|
+
end
|
18
|
+
|
19
|
+
# (Over)estimate the nth prime: Pn/n < ln n + ln ln n for n >= 6
|
20
|
+
# See: http://en.wikipedia.org/wiki/Prime_number_theorem#Approximations_for_the_nth_prime_number
|
21
|
+
p = n * (Math.log(n) + Math.log(Math.log(n)))
|
22
|
+
return self.sieve(p).slice(0, n)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Finds all the primes less than or equal to n
|
26
|
+
#
|
27
|
+
# An implementation of the Sieve of Eratosthenes
|
28
|
+
# See: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
|
29
|
+
#
|
30
|
+
# Example:
|
31
|
+
# >> Prime.sieve(30)
|
32
|
+
# => [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
33
|
+
#
|
34
|
+
# Arguments:
|
35
|
+
# n: an integer > 1
|
36
|
+
def self.sieve(n)
|
37
|
+
if n < 2 then return [] end
|
38
|
+
n = n + 1
|
39
|
+
a = Array.new(n){|i| if i >= 2 then true else false end }
|
40
|
+
for i in 2..Math.sqrt(n)
|
41
|
+
if a[i]
|
42
|
+
i_sq = i * i
|
43
|
+
j = i_sq
|
44
|
+
count = 0
|
45
|
+
until j >= n
|
46
|
+
a[j] = false
|
47
|
+
j = i_sq + (count * i)
|
48
|
+
count = count + 1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
return a.each_with_index.map{ |x,i| if x then i end }.compact
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'primegrid'
|
3
|
+
|
4
|
+
class TestMatrixPrinter < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def test_should_find_maxlen
|
7
|
+
assert_equal(4, Primegrid::MatrixPrinter.maxlen_in([1000, 100, 10]))
|
8
|
+
assert_equal(4, Primegrid::MatrixPrinter.maxlen_in(["1000", "100", "10"]))
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_should_print_correctly
|
12
|
+
output = Primegrid::MatrixPrinter.build_matrix([1, 0, 0, 0, 1, 0, 0, 0, 1], 3)
|
13
|
+
assert_equal("1 0 0\n0 1 0\n0 0 1", output)
|
14
|
+
end
|
15
|
+
|
16
|
+
def test_should_have_header_row
|
17
|
+
output = Primegrid::MatrixPrinter.build_matrix([10, 0, 0, 0, 10, 0, 0, 0, 10], 3, { :col_header => [0, 1, 2] })
|
18
|
+
assert_equal(" 0 1 2\n----------\n10 0 0\n 0 10 0\n 0 0 10", output)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_should_have_col_and_row_headers
|
22
|
+
output = Primegrid::MatrixPrinter.build_matrix([10, 0, 0, 0, 10, 0, 0, 0, 10], 3, { :col_header => [10, 1000, 10000], :row_header => [100, 1000, 10000] })
|
23
|
+
assert_equal(" 10 1000 10000\n -------------------\n 100| 10 0 0\n 1000| 0 10 0\n10000| 0 0 10", output)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
data/test/test_prime.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'primegrid'
|
3
|
+
|
4
|
+
class TestPrime < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def test_should_find_primes
|
7
|
+
assert_equal([2, 3, 5, 7, 11, 13, 17, 19, 23, 29], Primegrid::Prime.find(10))
|
8
|
+
assert_equal([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71], Primegrid::Prime.find(20))
|
9
|
+
assert_equal([2], Primegrid::Prime.find(1))
|
10
|
+
assert_equal([2, 3], Primegrid::Prime.find(2))
|
11
|
+
assert_equal([], Primegrid::Prime.find(0))
|
12
|
+
assert_equal([], Primegrid::Prime.find(-1))
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_should_sieve_primes
|
16
|
+
assert_equal([2, 3, 5, 7, 11, 13, 17, 19, 23, 29], Primegrid::Prime.sieve(30))
|
17
|
+
assert_equal([2], Primegrid::Prime.sieve(2))
|
18
|
+
assert_equal([2, 3], Primegrid::Prime.sieve(4))
|
19
|
+
assert_equal([], Primegrid::Prime.sieve(1))
|
20
|
+
assert_equal([], Primegrid::Prime.sieve(0))
|
21
|
+
assert_equal([], Primegrid::Prime.sieve(-1))
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
metadata
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: primegrid
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- George Agnelli
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2013-11-04 00:00:00 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rdoc
|
16
|
+
prerelease: false
|
17
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
18
|
+
requirements:
|
19
|
+
- &id003
|
20
|
+
- ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: "0"
|
23
|
+
type: :development
|
24
|
+
version_requirements: *id001
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rake
|
27
|
+
prerelease: false
|
28
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.9.2
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id002
|
35
|
+
description:
|
36
|
+
email:
|
37
|
+
- george.agnelli@gmail.com
|
38
|
+
executables:
|
39
|
+
- primegrid
|
40
|
+
extensions: []
|
41
|
+
|
42
|
+
extra_rdoc_files: []
|
43
|
+
|
44
|
+
files:
|
45
|
+
- lib/primegrid.rb
|
46
|
+
- lib/primegrid/version.rb
|
47
|
+
- lib/primegrid/matrix_printer.rb
|
48
|
+
- lib/primegrid/prime.rb
|
49
|
+
- test/test_matrix_printer.rb
|
50
|
+
- test/test_prime.rb
|
51
|
+
- bin/primegrid
|
52
|
+
homepage: ""
|
53
|
+
licenses: []
|
54
|
+
|
55
|
+
metadata: {}
|
56
|
+
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options: []
|
59
|
+
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - ">="
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: "1.9"
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
68
|
+
requirements:
|
69
|
+
- *id003
|
70
|
+
requirements: []
|
71
|
+
|
72
|
+
rubyforge_project:
|
73
|
+
rubygems_version: 2.1.10
|
74
|
+
signing_key:
|
75
|
+
specification_version: 4
|
76
|
+
summary: Display an n x n matrix of prime products
|
77
|
+
test_files:
|
78
|
+
- test/test_matrix_printer.rb
|
79
|
+
- test/test_prime.rb
|