rmaze 2.0.0 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +9 -0
- data/bin/rmaze +24 -4
- data/lib/algorithm/backtrace.rb +1 -1
- data/lib/maze/maze.rb +19 -2
- data/rmaze.gemspec +2 -1
- data/spec/maze/maze_cell_spec.rb +2 -2
- data/spec/maze/maze_spec.rb +38 -12
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6cd11260d180ed896e3d6c195868dba17329769c
|
4
|
+
data.tar.gz: 4f226f575426c669a51370872b4748dfa901cbf7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dd1c214c397c6f513f5a7d1fe0b8ebe06803593def2dac27690800bfdf12851f7d61c056e88ee3b3b916fa9b7161c6759c095aa5b242f589fbac2b26ff762be
|
7
|
+
data.tar.gz: 7e77ace8be06484d318a4dcaf47637defa0744459ca3a7c23455026dac6388f38df1bcb9ade840b5e16942d295aacfc6b5e6ffa6b711918c526f608db36c89b3
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,6 +2,7 @@ GEM
|
|
2
2
|
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
4
|
OptionParser (0.5.1)
|
5
|
+
coderay (1.1.0)
|
5
6
|
coveralls (0.8.10)
|
6
7
|
json (~> 1.8)
|
7
8
|
rest-client (>= 1.6.8, < 2)
|
@@ -16,8 +17,13 @@ GEM
|
|
16
17
|
http-cookie (1.0.2)
|
17
18
|
domain_name (~> 0.5)
|
18
19
|
json (1.8.1)
|
20
|
+
method_source (0.8.2)
|
19
21
|
mime-types (2.99)
|
20
22
|
netrc (0.11.0)
|
23
|
+
pry (0.10.3)
|
24
|
+
coderay (~> 1.1.0)
|
25
|
+
method_source (~> 0.8.1)
|
26
|
+
slop (~> 3.4)
|
21
27
|
rake (10.1.0)
|
22
28
|
rest-client (1.8.0)
|
23
29
|
http-cookie (>= 1.0.2, < 2.0)
|
@@ -43,6 +49,7 @@ GEM
|
|
43
49
|
json (~> 1.8)
|
44
50
|
simplecov-html (~> 0.10.0)
|
45
51
|
simplecov-html (0.10.0)
|
52
|
+
slop (3.6.0)
|
46
53
|
structured_warnings (0.1.4)
|
47
54
|
term-ansicolor (1.3.2)
|
48
55
|
tins (~> 1.0)
|
@@ -58,6 +65,8 @@ PLATFORMS
|
|
58
65
|
DEPENDENCIES
|
59
66
|
OptionParser (~> 0.5.1)
|
60
67
|
coveralls
|
68
|
+
json (~> 1.8.1)
|
69
|
+
pry
|
61
70
|
rake (~> 10.1.0)
|
62
71
|
rspec (~> 3.1.0)
|
63
72
|
rubytree (~> 0.9.4)
|
data/bin/rmaze
CHANGED
@@ -6,6 +6,7 @@ require 'optparse'
|
|
6
6
|
options = {
|
7
7
|
:width => 10,
|
8
8
|
:height => 10,
|
9
|
+
:format => :ascii,
|
9
10
|
:algorithm => :backtrace
|
10
11
|
}
|
11
12
|
OptionParser.new do |opts|
|
@@ -19,6 +20,12 @@ OptionParser.new do |opts|
|
|
19
20
|
opts.on("-h", "--height height", "Specify the maze height (default: #{options[:height]})") do |height|
|
20
21
|
options[:height] = height
|
21
22
|
end
|
23
|
+
opts.on("-d", "--depth depth", "Specify the maze depth (default: #{options[:depth]})") do |depth|
|
24
|
+
options[:depth] = depth
|
25
|
+
end
|
26
|
+
opts.on("-f", "--format format", "Specify the format output (default: #{options[:format]})") do |format|
|
27
|
+
options[:format] = format.to_sym
|
28
|
+
end
|
22
29
|
|
23
30
|
opts.separator ""
|
24
31
|
opts.separator "Algorithms:"
|
@@ -27,7 +34,12 @@ OptionParser.new do |opts|
|
|
27
34
|
end
|
28
35
|
end.parse!
|
29
36
|
|
30
|
-
|
37
|
+
if not options[:depth]
|
38
|
+
maze = Maze.new options[:width], options[:height]
|
39
|
+
else
|
40
|
+
maze = Maze.new options[:width], options[:height], options[:depth]
|
41
|
+
end
|
42
|
+
|
31
43
|
maze.set_raw_value_all 1
|
32
44
|
|
33
45
|
case options[:algorithm]
|
@@ -36,9 +48,17 @@ when :backtrace
|
|
36
48
|
backtrace.generate
|
37
49
|
else
|
38
50
|
$stderr.puts "Error: the algorithm must be set."
|
39
|
-
exit
|
51
|
+
exit -1
|
40
52
|
end
|
41
53
|
|
42
|
-
|
43
|
-
|
54
|
+
case options[:format]
|
55
|
+
when :ascii
|
56
|
+
maze.matrix.each do |row|
|
57
|
+
row = [row] if maze.dimensions.length == 2
|
58
|
+
row.each do |depth|
|
59
|
+
puts depth.map(&:to_s).join(' ').gsub('0', ' ').gsub('1', '#')
|
60
|
+
end
|
61
|
+
end
|
62
|
+
when :json
|
63
|
+
puts maze.to_json
|
44
64
|
end
|
data/lib/algorithm/backtrace.rb
CHANGED
@@ -18,7 +18,7 @@ class Backtrace
|
|
18
18
|
@maze.set_value *cell.coords.clone.push(0)
|
19
19
|
end
|
20
20
|
|
21
|
-
current_cell =
|
21
|
+
current_cell = all_cells[rand(all_cells.length)]
|
22
22
|
visited_cells.push current_cell
|
23
23
|
|
24
24
|
while visited_cells.size != @maze.total_cells
|
data/lib/maze/maze.rb
CHANGED
@@ -11,7 +11,7 @@ class Maze
|
|
11
11
|
axis = [value] * dr
|
12
12
|
else
|
13
13
|
(0...dr).each do
|
14
|
-
axis << axis_before
|
14
|
+
axis << Marshal.load(Marshal.dump(axis_before)) # deep clone
|
15
15
|
end
|
16
16
|
end
|
17
17
|
axis_before = axis
|
@@ -48,7 +48,8 @@ class Maze
|
|
48
48
|
end
|
49
49
|
|
50
50
|
public
|
51
|
-
|
51
|
+
attr_accessor :matrix
|
52
|
+
attr_reader :dimensions
|
52
53
|
|
53
54
|
def initialize(*dimensions)
|
54
55
|
@dimensions = dimensions.map { |d| d.to_i }.freeze
|
@@ -57,6 +58,18 @@ class Maze
|
|
57
58
|
@hash = @dimensions.reduce(""){ |accum, d| "#{accum}#{d}" }.to_i
|
58
59
|
end
|
59
60
|
|
61
|
+
def self.from_array(matrix)
|
62
|
+
dimensions = []
|
63
|
+
matrix_aux = matrix
|
64
|
+
while matrix_aux.is_a? Array
|
65
|
+
dimensions.push matrix_aux.length
|
66
|
+
matrix_aux = matrix_aux[0]
|
67
|
+
end
|
68
|
+
maze = Maze.new *dimensions
|
69
|
+
maze.matrix = Marshal.load(Marshal.dump(matrix)) # deep clone
|
70
|
+
maze
|
71
|
+
end
|
72
|
+
|
60
73
|
def total_cells
|
61
74
|
dimensions.reduce(1) { |accum, d| accum*d }
|
62
75
|
end
|
@@ -126,6 +139,10 @@ class Maze
|
|
126
139
|
set_between_cells cell_a, cell_b, 1
|
127
140
|
end
|
128
141
|
|
142
|
+
def to_json
|
143
|
+
JSON.unparse @matrix
|
144
|
+
end
|
145
|
+
|
129
146
|
def hash
|
130
147
|
@hash
|
131
148
|
end
|
data/rmaze.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = 'rmaze'
|
3
|
-
s.version = '2.
|
3
|
+
s.version = '2.1.0'
|
4
4
|
s.date = '2014-10-01'
|
5
5
|
s.licenses = ["MIT"]
|
6
6
|
s.platform = Gem::Platform::RUBY
|
@@ -15,4 +15,5 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.require_paths = ["lib"]
|
16
16
|
s.add_runtime_dependency 'rubytree', '~> 0.9'
|
17
17
|
s.add_runtime_dependency 'OptionParser', '~> 0.5.1'
|
18
|
+
s.add_runtime_dependency 'json', '~> 1.8.1'
|
18
19
|
end
|
data/spec/maze/maze_cell_spec.rb
CHANGED
@@ -81,7 +81,7 @@ describe MazeCell do
|
|
81
81
|
expect(maze_cell.has_wall_backward(1)).to be_truthy
|
82
82
|
end
|
83
83
|
|
84
|
-
it '#connected?' do
|
84
|
+
it '#connected? (0)' do
|
85
85
|
coords = [0, 0]
|
86
86
|
@maze.set_raw_value_all 0
|
87
87
|
maze_cell = @maze.cell *coords
|
@@ -99,7 +99,7 @@ describe MazeCell do
|
|
99
99
|
expect(maze_cell).to be_connected
|
100
100
|
end
|
101
101
|
|
102
|
-
it '#connected? (
|
102
|
+
it '#connected? (1)' do
|
103
103
|
maze = Maze.new 3, 3
|
104
104
|
maze.set_raw_value_all 1
|
105
105
|
maze_cell1 = maze.cell 1, 1
|
data/spec/maze/maze_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
describe Maze do
|
2
2
|
it '#initialize 2d' do
|
3
|
-
width = rand(
|
4
|
-
height = rand(
|
3
|
+
width = rand(3) + 15
|
4
|
+
height = rand(3) + 15
|
5
5
|
maze = Maze.new(width, height)
|
6
6
|
expect(maze.dimensions[0]).to eq(width)
|
7
7
|
expect(maze.dimensions[1]).to eq(height)
|
@@ -10,7 +10,7 @@ describe Maze do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it '#initialize Nd' do
|
13
|
-
dimensions = ([nil]*(rand(
|
13
|
+
dimensions = ([nil]*(rand(3)+3)).map { |_| 1 + rand(4) }
|
14
14
|
maze = Maze.new *dimensions
|
15
15
|
matrix_iter = maze.matrix
|
16
16
|
dimensions.each_with_index do |d, d_index|
|
@@ -20,13 +20,25 @@ describe Maze do
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
+
it '#self.from_array 2d' do
|
24
|
+
maze = Maze.new 4, 8
|
25
|
+
maze.set_raw_value_all 1
|
26
|
+
maze.set_value 1, 1, 0
|
27
|
+
maze_clone = Maze.from_array maze.matrix
|
28
|
+
expect(maze.matrix).to eq(maze_clone.matrix)
|
29
|
+
maze_clone.set_value 1, 1, 1
|
30
|
+
expect(maze.matrix).not_to eq(maze_clone.matrix)
|
31
|
+
maze_clone.set_raw_value_all 0
|
32
|
+
expect(maze.matrix).not_to eq(maze_clone.matrix)
|
33
|
+
end
|
34
|
+
|
23
35
|
it '#total_cells 2d' do
|
24
36
|
maze = Maze.new 4, 8
|
25
37
|
expect(maze.total_cells).to eq(32)
|
26
38
|
end
|
27
39
|
|
28
40
|
it '#total_cells Nd' do
|
29
|
-
dimensions = ([nil]*(rand(
|
41
|
+
dimensions = ([nil]*(rand(3)+3)).map { |_| 1 + rand(4) }
|
30
42
|
maze = Maze.new *dimensions
|
31
43
|
expect(maze.total_cells).to eq(maze.dimensions.reduce(1) { |accum, d| accum*d })
|
32
44
|
end
|
@@ -63,7 +75,7 @@ describe Maze do
|
|
63
75
|
end
|
64
76
|
|
65
77
|
it '#coords_to_indices Nd' do
|
66
|
-
dimensions = ([nil]*(rand(
|
78
|
+
dimensions = ([nil]*(rand(3)+3)).map { |_| 1 + rand(4) }
|
67
79
|
maze = Maze.new *dimensions
|
68
80
|
coords = dimensions.map { |d| rand(d) }
|
69
81
|
indices = maze.coords_to_indices *coords
|
@@ -76,7 +88,7 @@ describe Maze do
|
|
76
88
|
end
|
77
89
|
|
78
90
|
it '#get_raw_value Nd' do
|
79
|
-
dimensions = ([nil]*(rand(
|
91
|
+
dimensions = ([nil]*(rand(3)+3)).map { |_| 1 + rand(4) }
|
80
92
|
maze = Maze.new *dimensions
|
81
93
|
coords = dimensions.map { |d| rand(d) }
|
82
94
|
indices = maze.coords_to_indices *coords
|
@@ -92,7 +104,7 @@ describe Maze do
|
|
92
104
|
end
|
93
105
|
|
94
106
|
it '#set_raw_value Nd' do
|
95
|
-
dimensions = ([nil]*(rand(
|
107
|
+
dimensions = ([nil]*(rand(3)+3)).map { |_| 1 + rand(4) }
|
96
108
|
maze = Maze.new *dimensions
|
97
109
|
coords = dimensions.map { |d| rand(d) }
|
98
110
|
value = rand(99) + 1
|
@@ -112,7 +124,7 @@ describe Maze do
|
|
112
124
|
end
|
113
125
|
|
114
126
|
it '#set_raw_value_all Nd' do
|
115
|
-
dimensions = ([nil]*(rand(
|
127
|
+
dimensions = ([nil]*(rand(3)+3)).map { |_| 1 + rand(4) }
|
116
128
|
maze = Maze.new *dimensions
|
117
129
|
maze.set_raw_value_all 11
|
118
130
|
coords = maze.dimensions.map { |d| rand(d) }
|
@@ -126,7 +138,7 @@ describe Maze do
|
|
126
138
|
end
|
127
139
|
|
128
140
|
it '#get_value Nd' do
|
129
|
-
dimensions = ([nil]*(rand(
|
141
|
+
dimensions = ([nil]*(rand(3)+3)).map { |_| 1 + rand(4) }
|
130
142
|
maze = Maze.new *dimensions
|
131
143
|
coords = dimensions.map { |d| rand(d) }
|
132
144
|
expect(maze.get_value(*coords)).to eq(0)
|
@@ -141,7 +153,7 @@ describe Maze do
|
|
141
153
|
end
|
142
154
|
|
143
155
|
it '#set_value Nd' do
|
144
|
-
dimensions = ([nil]*(rand(
|
156
|
+
dimensions = ([nil]*(rand(3)+3)).map { |_| 1 + rand(4) }
|
145
157
|
maze = Maze.new *dimensions
|
146
158
|
coords = dimensions.map { |d| rand(d) }
|
147
159
|
value = rand(99) + 1
|
@@ -161,7 +173,7 @@ describe Maze do
|
|
161
173
|
end
|
162
174
|
|
163
175
|
it '#cell Nd' do
|
164
|
-
dimensions = ([nil]*(rand(
|
176
|
+
dimensions = ([nil]*(rand(3)+3)).map { |_| 1 + rand(4) }
|
165
177
|
maze = Maze.new *dimensions
|
166
178
|
coords = dimensions.map { |d| rand(d) }
|
167
179
|
cell = maze.cell *coords
|
@@ -200,13 +212,27 @@ describe Maze do
|
|
200
212
|
expect(maze.get_raw_value(*indices)).to eq(1)
|
201
213
|
end
|
202
214
|
|
215
|
+
it '#to_json 2d' do
|
216
|
+
maze = Maze.new 4, 8
|
217
|
+
maze.set_raw_value_all 1
|
218
|
+
maze.set_value 1, 1, 0
|
219
|
+
expect(maze.to_json).to eq('[[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]')
|
220
|
+
end
|
221
|
+
|
222
|
+
it '#to_json 3d' do
|
223
|
+
maze = Maze.new 2, 2, 2
|
224
|
+
maze.set_raw_value_all 1
|
225
|
+
maze.set_value 1, 1, 1, 0
|
226
|
+
expect(maze.to_json).to eq('[[[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1]],[[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1]],[[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1]],[[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,0,1],[1,1,1,1,1]],[[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1]]]')
|
227
|
+
end
|
228
|
+
|
203
229
|
it '#hash 2d' do
|
204
230
|
maze = Maze.new 4, 8
|
205
231
|
expect(maze.hash).to eq(48)
|
206
232
|
end
|
207
233
|
|
208
234
|
it '#hash Nd' do
|
209
|
-
dimensions = ([nil]*(rand(
|
235
|
+
dimensions = ([nil]*(rand(3)+3)).map { |_| 1 + rand(4) }
|
210
236
|
maze = Maze.new *dimensions
|
211
237
|
expect(maze.hash).to eq(dimensions.reduce(""){ |accum, d| "#{accum}#{d}" }.to_i)
|
212
238
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rmaze
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Pedro Lira
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.5.1
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: json
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.8.1
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.8.1
|
41
55
|
description: Ruby library for maze generation
|
42
56
|
email: pedrohml@gmail.com
|
43
57
|
executables:
|
@@ -89,7 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
89
103
|
version: '0'
|
90
104
|
requirements: []
|
91
105
|
rubyforge_project:
|
92
|
-
rubygems_version: 2.4.
|
106
|
+
rubygems_version: 2.4.8
|
93
107
|
signing_key:
|
94
108
|
specification_version: 4
|
95
109
|
summary: RMaze
|