nonograms 0.2.0 → 0.2.1

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.
data/README.md CHANGED
@@ -18,7 +18,7 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- For example:
21
+ For example:
22
22
 
23
23
  2 1
24
24
  1 1 1 1
@@ -57,6 +57,9 @@ You can solve this example when you write the code below
57
57
  > @nonograms = Nonograms.new(horizontal, vertical)
58
58
  > @nonograms.solve #=> ["01000"+"01101"+"10000"+"01001", ...]
59
59
 
60
+ Check whether entered data are properly
61
+
62
+ > @nonograms.properly_data_entered? #=> true
60
63
 
61
64
  Display result on the console
62
65
 
@@ -2,8 +2,9 @@
2
2
  require "nonograms/version"
3
3
  require "nonograms/display"
4
4
  require "nonograms/checker"
5
+ require "nonograms/matrix"
5
6
 
6
- # class can solve the puzzle game Nonograms
7
+ # class can solve the matrix game Nonograms
7
8
  class Nonograms
8
9
 
9
10
  def initialize(horizontal, vertical)
@@ -11,7 +12,7 @@ class Nonograms
11
12
  @horizontal = horizontal
12
13
  @amount_row = horizontal.length
13
14
  @amount_column = vertical.length
14
- @puzzle = empty_puzzle
15
+ @matrix = Nonograms::Matrix.new(@amount_row, @amount_column)
15
16
  @results = []
16
17
  end
17
18
 
@@ -27,39 +28,23 @@ class Nonograms
27
28
  Nonograms::Display.new(@results, @amount_row, @amount_column)
28
29
  end
29
30
 
30
- # count amount values '1' in vector
31
- # for example:
32
- # * vector : [0, 1, 1, 0, 0, 1, 0]
33
- # * return: [2, 1]
34
- def count_vector(vector)
35
- vector.join("").scan(/[1]+/).map{|element| element.length}
36
- end
37
-
38
- # count amount values '1' in vertical vector
39
- def count_vertical(column)
40
- vertical_vector = @puzzle[0...@amount_row].map{|vector| vector[column]}
41
- count_vector(vertical_vector)
42
- end
43
-
44
- # count amount values '1' in vertical vector
45
- def count_horizontal(row)
46
- horizontal_vector = @puzzle[row][0...@amount_column]
47
- count_vector(horizontal_vector)
31
+ def properly_data_entered?
32
+ Nonograms::Checker.new(@vertical, @horizontal).properly_data_entered?
48
33
  end
49
34
 
50
35
  def vertical_acceptable?(row, column)
51
36
  unless row == @amount_row-1
52
- vector_acceptable?( @vertical[column], count_vertical(column) )
37
+ vector_acceptable?( @vertical[column], @matrix.count_vertical(column) )
53
38
  else
54
- return ( @vertical[column] == count_vertical(column) )
39
+ return ( @vertical[column] == @matrix.count_vertical(column) )
55
40
  end
56
41
  end
57
42
 
58
43
  def horizontal_acceptable?(row, column)
59
44
  unless column == @amount_column-1
60
- vector_acceptable?( @horizontal[row], count_horizontal(row) )
45
+ vector_acceptable?( @horizontal[row], @matrix.count_horizontal(row) )
61
46
  else
62
- return ( @horizontal[row] == count_horizontal(row))
47
+ return ( @horizontal[row] == @matrix.count_horizontal(row))
63
48
  end
64
49
  end
65
50
 
@@ -75,22 +60,13 @@ class Nonograms
75
60
  return true
76
61
  end
77
62
 
78
- # get the matrix with cells values zero
79
- def empty_puzzle
80
- result = []
81
- @amount_row.times do |index|
82
- result << [0]*@amount_column
83
- end
84
- result
85
- end
86
-
87
63
  private
88
64
 
89
- # run recursion from fixed position row and column if @puzzle is acceptable
65
+ # run recursion from fixed position row and column if @matrix is acceptable
90
66
  def run_recursion(row = 0, column = 0)
91
67
  return unless vertical_acceptable?(row, column) and horizontal_acceptable?(row, column)
92
68
  if row == @amount_row-1 and column == @amount_column-1
93
- @results << Marshal.load(Marshal.dump(@puzzle)).flatten.join("")
69
+ @results << Marshal.load(Marshal.dump(@matrix.get)).flatten.join("")
94
70
  return nil
95
71
  end
96
72
  next_cell_set(0, row, column)
@@ -100,9 +76,9 @@ private
100
76
  def next_cell_set(value, row, column)
101
77
  new_row = (row*@amount_column + column + 1) / @amount_column
102
78
  new_column = (row*@amount_column + column + 1) % @amount_column
103
- @puzzle[new_row][new_column] = value
79
+ @matrix.set(new_row, new_column, value)
104
80
  run_recursion(new_row, new_column)
105
- @puzzle[new_row][new_column] = 0
81
+ @matrix.set(new_row, new_column, 0)
106
82
  end
107
83
 
108
84
  end
@@ -1,6 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  class Nonograms
4
+
4
5
  class Display
5
6
 
6
7
  def initialize(results, amount_row, amount_column)
@@ -0,0 +1,60 @@
1
+ # encoding: utf-8
2
+
3
+ class Nonograms
4
+
5
+ class Matrix
6
+
7
+ def initialize(height, width)
8
+ @height = height
9
+ @width = width
10
+ @matrix = create_matrix
11
+ end
12
+
13
+ # set cell of position row and column some value
14
+ def set(row, column, value)
15
+ @matrix[row][column] = value
16
+ end
17
+
18
+ # get the matrix
19
+ def get
20
+ @matrix
21
+ end
22
+
23
+ # count amount values '1' in vector
24
+ # for example:
25
+ # * vector : [0, 1, 1, 0, 0, 1, 0]
26
+ # * return: [2, 1]
27
+ def count_vector(vector)
28
+ vector.join("").scan(/[1]+/).map{|element| element.length}
29
+ end
30
+
31
+ # get vector from index of column
32
+ def vertical_vector(index)
33
+ @matrix[0...@height].map{|vector| vector[index]}
34
+ end
35
+
36
+ # count amount values '1' in vertical vector
37
+ def count_vertical(column)
38
+ count_vector(vertical_vector(column))
39
+ end
40
+
41
+ # get vector from index of row
42
+ def horizontal_vector(index)
43
+ @matrix[index][0...@width]
44
+ end
45
+
46
+ # count amount values '1' in horizontal vector
47
+ def count_horizontal(row)
48
+ count_vector(horizontal_vector(row))
49
+ end
50
+
51
+ # get the matrix with cells values zero
52
+ def create_matrix
53
+ result = []
54
+ @height.times do |index|
55
+ result << [0]*@width
56
+ end
57
+ result
58
+ end
59
+ end
60
+ end
@@ -1,3 +1,3 @@
1
1
  class Nonograms
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -6,7 +6,7 @@ Gem::Specification.new do |gem|
6
6
  gem.email = ["raglub.ruby@gmail.com"]
7
7
  gem.description = %q{solve the puzzle game nonograms.}
8
8
  gem.summary = %q{Solve Nonograms.}
9
- gem.date = "2012-07-07"
9
+ gem.date = "2012-07-08"
10
10
  gem.homepage = "https://github.com/raglub/nonograms"
11
11
 
12
12
  gem.files = `git ls-files`.split($\)
@@ -0,0 +1,25 @@
1
+ require 'nonograms'
2
+
3
+ describe Nonograms::Matrix do
4
+
5
+ before(:each) do
6
+ @matrix = Nonograms::Matrix.new(5, 6)
7
+ end
8
+
9
+ it "should properly count amount of numbers 1 in vector" do
10
+ vector = [0, 0, 1, 1, 1, 0, 1]
11
+ @matrix.count_vector(vector).should eql([3, 1])
12
+ end
13
+
14
+ it "should properly count amount of numbers 1 in vertical vector" do
15
+ @matrix.set(0, 2, 1)
16
+ @matrix.set(4, 2, 1)
17
+ @matrix.count_vertical(2).should eql([1, 1])
18
+ end
19
+
20
+ it "should properly count amount of numbers 1 in horizontal vector" do
21
+ @matrix.set(2, 1, 1)
22
+ @matrix.set(2, 5, 1)
23
+ @matrix.count_horizontal(2).should eql([1, 1])
24
+ end
25
+ end
@@ -1,6 +1,6 @@
1
1
  require 'nonograms'
2
2
 
3
- describe "Nonograms" do
3
+ describe Nonograms do
4
4
 
5
5
  before(:each) do
6
6
  vertical = [[1], [2, 1], [1], [], [1, 1]]
@@ -12,9 +12,8 @@ describe "Nonograms" do
12
12
  @nonograms.solve.should include("01000"+"01101"+"10000"+"01001")
13
13
  end
14
14
 
15
- it "should properly count amount of numbers 1 in vector" do
16
- vector = [0, 0, 1, 1, 1, 0, 1]
17
- @nonograms.count_vector(vector).should eql([3, 1])
15
+ it "should properly entered data" do
16
+ @nonograms.properly_data_entered?.should be_true
18
17
  end
19
18
 
20
19
  it "for vectors acceptable" do
@@ -31,4 +30,5 @@ describe "Nonograms" do
31
30
  @nonograms.vector_acceptable?(origin, [3, 1, 2, 4]).should be_false
32
31
  @nonograms.vector_acceptable?(origin, [3, 1, 3]).should be_false
33
32
  end
33
+
34
34
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nonograms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
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: 2012-07-07 00:00:00.000000000 Z
12
+ date: 2012-07-08 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -42,9 +42,11 @@ files:
42
42
  - lib/nonograms.rb
43
43
  - lib/nonograms/checker.rb
44
44
  - lib/nonograms/display.rb
45
+ - lib/nonograms/matrix.rb
45
46
  - lib/nonograms/version.rb
46
47
  - nonograms.gemspec
47
48
  - spec/checker_spec.rb
49
+ - spec/matrix_spec.rb
48
50
  - spec/nonograms_spec.rb
49
51
  homepage: https://github.com/raglub/nonograms
50
52
  licenses: []
@@ -72,4 +74,5 @@ specification_version: 3
72
74
  summary: Solve Nonograms.
73
75
  test_files:
74
76
  - spec/checker_spec.rb
77
+ - spec/matrix_spec.rb
75
78
  - spec/nonograms_spec.rb