array_2d_simple 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Guardfile +1 -1
- data/lib/array_2d_simple/array_2d.rb +41 -38
- data/lib/array_2d_simple/version.rb +1 -1
- data/spec/array_2d_simple_spec.rb +32 -9
- data/spec/normalized_array_2d_spec.rb +5 -1
- metadata +2 -2
data/Guardfile
CHANGED
@@ -2,6 +2,7 @@ require "array_2d_simple/version"
|
|
2
2
|
|
3
3
|
module Array2dSimple
|
4
4
|
class Array2d
|
5
|
+
include Enumerable
|
5
6
|
attr_reader :width, :height
|
6
7
|
|
7
8
|
def initialize params
|
@@ -19,93 +20,95 @@ module Array2dSimple
|
|
19
20
|
end
|
20
21
|
|
21
22
|
def get_by_rc r,c
|
22
|
-
|
23
|
-
|
24
|
-
@elements[r][c]
|
23
|
+
Printer.log 'Warning: #get_by_rc is depricated. Use get_by_xy. Note: arguments are reversed with get_by_xy'
|
24
|
+
get_by_xy(c,r)
|
25
25
|
end
|
26
26
|
|
27
27
|
def set_by_rc r,c, value
|
28
|
-
|
29
|
-
|
30
|
-
@elements[r][c] = value
|
28
|
+
Printer.log 'Warning: #set_by_rc is depricated. Use set_by_xy. Note: arguments are reversed with set_by_xy'
|
29
|
+
set_by_xy(c,r,value)
|
31
30
|
end
|
32
31
|
|
33
32
|
def get_by_xy x,y
|
34
|
-
|
33
|
+
raise 'x out of range' if x >= @width
|
34
|
+
raise 'y out of range' if y >= @height
|
35
|
+
@elements[y][x]
|
36
|
+
end
|
37
|
+
|
38
|
+
def set_by_xy(x,y,value)
|
39
|
+
raise 'x out of range' if x >= @width
|
40
|
+
raise 'y out of range' if y >= @height
|
41
|
+
@elements[y][x] = value
|
35
42
|
end
|
36
43
|
|
37
44
|
def [] x,y
|
38
|
-
|
45
|
+
get_by_xy(x,y)
|
39
46
|
end
|
40
47
|
|
41
48
|
def []= x,y, value
|
42
|
-
|
49
|
+
set_by_xy(x,y,value)
|
43
50
|
end
|
44
51
|
|
45
52
|
def output
|
46
53
|
size = format2(max.to_f).size
|
47
54
|
output = ''
|
55
|
+
|
48
56
|
(0..@height - 1).each do |r|
|
49
57
|
(0..@width - 1).each do |c|
|
50
58
|
output += "%#{ size + 4 }s" % format2(get_by_rc(r,c).to_f) if get_by_rc(r,c).respond_to? :to_f
|
51
59
|
end
|
52
60
|
output += "\n"
|
53
61
|
end
|
62
|
+
|
54
63
|
output
|
55
64
|
end
|
56
65
|
|
57
66
|
def max
|
58
|
-
max
|
59
|
-
(0..@height - 1).each do |r|
|
60
|
-
(0..@width - 1).each do |c|
|
61
|
-
value = get_by_rc(r,c).to_f if get_by_rc(r,c).respond_to?(:to_f)
|
62
|
-
max = [max, value].max if value and ! value.to_f.nan?
|
63
|
-
end
|
64
|
-
end
|
65
|
-
max
|
67
|
+
@elements.dup.flatten.max
|
66
68
|
end
|
67
69
|
|
68
70
|
def min
|
69
|
-
min
|
70
|
-
(0..@height - 1).each do |r|
|
71
|
-
(0..@width - 1).each do |c|
|
72
|
-
value = get_by_rc(r,c).to_f if value.respond_to?(:to_f)
|
73
|
-
min = [min, value].min if value and ! value.to_f.nan?
|
74
|
-
end
|
75
|
-
end
|
76
|
-
min
|
71
|
+
@elements.dup.flatten.min
|
77
72
|
end
|
78
73
|
|
79
74
|
def project &proc
|
80
75
|
new_array = self.class.new( width: @width, height: @height )
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
end
|
85
|
-
end
|
76
|
+
|
77
|
+
new_array.set_each{ |x, y| proc.call( get_by_xy( y,x ))}
|
78
|
+
|
86
79
|
new_array
|
87
80
|
end
|
88
81
|
|
89
82
|
def set_each &proc
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
83
|
+
each_with_index do |v,i|
|
84
|
+
x = i[0]
|
85
|
+
y = i[1]
|
86
|
+
@elements[x][y] = proc.call(x,y)
|
94
87
|
end
|
95
88
|
end
|
96
89
|
|
97
|
-
def
|
98
|
-
(0..@
|
99
|
-
(0..@
|
100
|
-
@elements[
|
90
|
+
def each_with_index
|
91
|
+
(0..@width - 1).each do |y|
|
92
|
+
(0..@height - 1).each do |x|
|
93
|
+
yield(@elements[x][y],[x,y])
|
101
94
|
end
|
102
95
|
end
|
103
96
|
end
|
104
97
|
|
98
|
+
def each &block
|
99
|
+
each_with_index &block
|
100
|
+
end
|
101
|
+
|
105
102
|
# Helper methods
|
106
103
|
def format2 value
|
107
104
|
"%0.2f" % value.round(2).to_s if value.finite?
|
108
105
|
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
109
|
|
110
|
+
class Printer
|
111
|
+
def self.log(message)
|
112
|
+
puts message
|
110
113
|
end
|
111
114
|
end
|
@@ -4,6 +4,10 @@ module Array2dSimple
|
|
4
4
|
describe Array2d do
|
5
5
|
let(:array_2d) { Array2d.new(width:8, height: 2) }
|
6
6
|
|
7
|
+
before do
|
8
|
+
Printer.stub( :log )
|
9
|
+
end
|
10
|
+
|
7
11
|
it 'creates' do
|
8
12
|
array_2d.class.should eq Array2d
|
9
13
|
end
|
@@ -13,26 +17,45 @@ module Array2dSimple
|
|
13
17
|
big_array.to_s.should include '30x100'
|
14
18
|
end
|
15
19
|
|
20
|
+
describe 'enumerable' do
|
21
|
+
it 'each calls the block with the current value' do
|
22
|
+
a2x2 = Array2d.new(width: 2, height: 2)
|
23
|
+
a2x2.set_by_xy(0,0,1)
|
24
|
+
a2x2.set_by_xy(0,1,2)
|
25
|
+
a2x2.set_by_xy(1,0,3)
|
26
|
+
a2x2.set_by_xy(1,1,4)
|
27
|
+
|
28
|
+
foo = []
|
29
|
+
a2x2.each { |element| foo << element }
|
30
|
+
foo.should == [1,2,3,4]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
16
34
|
context 'shared' do
|
35
|
+
let( :getter_warning ){ 'Warning: #get_by_rc is depricated. Use get_by_xy. Note: arguments are reversed with get_by_xy'}
|
36
|
+
let( :setter_warning ){ 'Warning: #set_by_rc is depricated. Use set_by_xy. Note: arguments are reversed with set_by_xy'}
|
37
|
+
|
17
38
|
before do
|
18
|
-
proc = Proc.new { |
|
39
|
+
proc = Proc.new { |x, y| x * 8 + y + 1}
|
19
40
|
array_2d.set_each &proc
|
20
41
|
end
|
21
42
|
|
22
43
|
it 'fills Array2d' do
|
23
|
-
array_2d.
|
24
|
-
array_2d.
|
25
|
-
array_2d.
|
26
|
-
array_2d.
|
27
|
-
array_2d.
|
44
|
+
array_2d.get_by_xy(0,0).should eq 1
|
45
|
+
array_2d.get_by_xy(7,0).should eq 8
|
46
|
+
array_2d.get_by_xy(1,1).should eq 10
|
47
|
+
array_2d.get_by_xy(3,1).should eq 12
|
48
|
+
array_2d.get_by_xy(7,1).should eq 16
|
28
49
|
end
|
29
50
|
|
30
|
-
it 'gets by rc' do
|
51
|
+
it 'gets by rc is deprecated' do
|
52
|
+
Printer.should_receive( :log ).with getter_warning
|
31
53
|
array_2d.get_by_rc(1,4).should eq 13
|
32
54
|
end
|
33
55
|
|
34
|
-
it '
|
35
|
-
|
56
|
+
it 'sets by rc is deprecated' do
|
57
|
+
Printer.should_receive( :log ).with setter_warning
|
58
|
+
array_2d.set_by_rc(1,4, 13).should eq 13
|
36
59
|
end
|
37
60
|
|
38
61
|
it 'gets_by_x_y' do
|
@@ -4,8 +4,12 @@ module Array2dSimple
|
|
4
4
|
describe NormalizedArray2d do
|
5
5
|
let(:array_2d) { Array2d.new(width:8, height:2) }
|
6
6
|
|
7
|
+
before do
|
8
|
+
Printer.stub( :log )
|
9
|
+
end
|
10
|
+
|
7
11
|
it 'gets normalized value' do
|
8
|
-
array_2d.set_each { |
|
12
|
+
array_2d.set_each { |x, y| x * 8 + y + 1}
|
9
13
|
normalized_array = NormalizedArray2d.new(array_2d)
|
10
14
|
normalized_array[0,0].should eq 0.0
|
11
15
|
normalized_array[3,0].should eq 0.2
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: array_2d_simple
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-09-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|