nonograms 0.2.1 → 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +20 -16
- data/lib/nonograms.rb +14 -38
- data/lib/nonograms/display.rb +40 -4
- data/lib/nonograms/logic.rb +53 -0
- data/lib/nonograms/version.rb +1 -1
- data/nonograms.gemspec +1 -1
- data/spec/logic_spec.rb +27 -0
- data/spec/nonograms_spec.rb +0 -16
- metadata +5 -2
data/README.md
CHANGED
@@ -27,9 +27,9 @@ For example:
|
|
27
27
|
+---+---+---+---+---+
|
28
28
|
2 1 | | | | | |
|
29
29
|
+---+---+---+---+---+
|
30
|
-
|
30
|
+
1 | | | | | |
|
31
31
|
+---+---+---+---+---+
|
32
|
-
|
32
|
+
1 1 | | | | | |
|
33
33
|
+---+---+---+---+---+
|
34
34
|
|
35
35
|
We should get result
|
@@ -41,9 +41,9 @@ We should get result
|
|
41
41
|
+---+---+---+---+---+
|
42
42
|
2 1 | | # | # | | # |
|
43
43
|
+---+---+---+---+---+
|
44
|
-
|
44
|
+
1 | # | | | | |
|
45
45
|
+---+---+---+---+---+
|
46
|
-
|
46
|
+
1 1 | | # | | | # |
|
47
47
|
+---+---+---+---+---+
|
48
48
|
|
49
49
|
in line result should be "01000"+"01101"+"10000"+"01001"
|
@@ -64,17 +64,21 @@ Check whether entered data are properly
|
|
64
64
|
Display result on the console
|
65
65
|
|
66
66
|
> @nonograms.display
|
67
|
+
|
67
68
|
#=> result: 0
|
68
|
-
#=>
|
69
|
-
#=>
|
70
|
-
#=>
|
71
|
-
#=> ■
|
72
|
-
#=> ■
|
73
|
-
#=>
|
74
|
-
#=>
|
75
|
-
#=>
|
76
|
-
#=> ■
|
77
|
-
#=> ■ ■ ■
|
78
|
-
#=> ■
|
79
|
-
#=> ■ ■
|
69
|
+
#=> 1 2 1 1
|
70
|
+
#=> 1 1
|
71
|
+
#=> ----------
|
72
|
+
#=> 1 | ■
|
73
|
+
#=> 2 1 | ■ ■ ■
|
74
|
+
#=> 1 |■
|
75
|
+
#=> 1 1 | ■ ■
|
80
76
|
|
77
|
+
#=> result: 1
|
78
|
+
#=> 1 2 1 1
|
79
|
+
#=> 1 1
|
80
|
+
#=> ----------
|
81
|
+
#=> 1 | ■
|
82
|
+
#=> 2 1 |■ ■ ■
|
83
|
+
#=> 1 | ■
|
84
|
+
#=> 1 1 | ■ ■
|
data/lib/nonograms.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
require "nonograms/version"
|
3
|
+
require "nonograms/logic"
|
3
4
|
require "nonograms/display"
|
4
5
|
require "nonograms/checker"
|
5
|
-
require "nonograms/matrix"
|
6
6
|
|
7
7
|
# class can solve the matrix game Nonograms
|
8
8
|
class Nonograms
|
@@ -12,7 +12,7 @@ class Nonograms
|
|
12
12
|
@horizontal = horizontal
|
13
13
|
@amount_row = horizontal.length
|
14
14
|
@amount_column = vertical.length
|
15
|
-
@
|
15
|
+
@logic = Nonograms::Logic.new(@horizontal, @vertical)
|
16
16
|
@results = []
|
17
17
|
end
|
18
18
|
|
@@ -25,60 +25,36 @@ class Nonograms
|
|
25
25
|
|
26
26
|
# display the result on console
|
27
27
|
def display
|
28
|
-
Nonograms::Display.new(@results, @
|
28
|
+
Nonograms::Display.new(@results, @horizontal, @vertical)
|
29
29
|
end
|
30
30
|
|
31
31
|
def properly_data_entered?
|
32
32
|
Nonograms::Checker.new(@vertical, @horizontal).properly_data_entered?
|
33
33
|
end
|
34
34
|
|
35
|
-
def vertical_acceptable?(row, column)
|
36
|
-
unless row == @amount_row-1
|
37
|
-
vector_acceptable?( @vertical[column], @matrix.count_vertical(column) )
|
38
|
-
else
|
39
|
-
return ( @vertical[column] == @matrix.count_vertical(column) )
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def horizontal_acceptable?(row, column)
|
44
|
-
unless column == @amount_column-1
|
45
|
-
vector_acceptable?( @horizontal[row], @matrix.count_horizontal(row) )
|
46
|
-
else
|
47
|
-
return ( @horizontal[row] == @matrix.count_horizontal(row))
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def vector_acceptable?(origin, piece)
|
52
|
-
return false if piece.length > origin.length
|
53
|
-
piece.each_with_index do |value, index|
|
54
|
-
if index == piece.length-1
|
55
|
-
return false unless origin[index] >= piece[index]
|
56
|
-
else
|
57
|
-
return false unless origin[index] == piece[index]
|
58
|
-
end
|
59
|
-
end
|
60
|
-
return true
|
61
|
-
end
|
62
|
-
|
63
35
|
private
|
64
36
|
|
65
37
|
# run recursion from fixed position row and column if @matrix is acceptable
|
66
38
|
def run_recursion(row = 0, column = 0)
|
67
|
-
return unless
|
68
|
-
if row
|
69
|
-
@results << Marshal.load(Marshal.dump(@matrix.get)).flatten.join("")
|
70
|
-
return nil
|
71
|
-
end
|
39
|
+
return unless @logic.cross_acceptable?(row, column)
|
40
|
+
return if last_cell?(row, column)
|
72
41
|
next_cell_set(0, row, column)
|
73
42
|
next_cell_set(1, row, column)
|
74
43
|
end
|
75
44
|
|
45
|
+
def last_cell?(row, column)
|
46
|
+
return false unless row == @amount_row-1 and column == @amount_column-1
|
47
|
+
@results << Marshal.load(Marshal.dump(@logic.matrix.get)).flatten.join("")
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
76
51
|
def next_cell_set(value, row, column)
|
77
52
|
new_row = (row*@amount_column + column + 1) / @amount_column
|
78
53
|
new_column = (row*@amount_column + column + 1) % @amount_column
|
79
|
-
|
54
|
+
|
55
|
+
@logic.matrix.set(new_row, new_column, value)
|
80
56
|
run_recursion(new_row, new_column)
|
81
|
-
@matrix.set(new_row, new_column, 0)
|
57
|
+
@logic.matrix.set(new_row, new_column, 0)
|
82
58
|
end
|
83
59
|
|
84
60
|
end
|
data/lib/nonograms/display.rb
CHANGED
@@ -2,12 +2,15 @@
|
|
2
2
|
|
3
3
|
class Nonograms
|
4
4
|
|
5
|
+
#Display result on the console
|
5
6
|
class Display
|
6
7
|
|
7
|
-
def initialize(results,
|
8
|
+
def initialize(results, horizontal, vertical)
|
8
9
|
@results = results
|
9
|
-
@
|
10
|
-
@
|
10
|
+
@horizontal = horizontal
|
11
|
+
@vertical = vertical
|
12
|
+
@amount_row = horizontal.length
|
13
|
+
@amount_column = vertical.length
|
11
14
|
show_results(results)
|
12
15
|
end
|
13
16
|
|
@@ -18,13 +21,46 @@ class Nonograms
|
|
18
21
|
end
|
19
22
|
end
|
20
23
|
|
24
|
+
def max_length(array)
|
25
|
+
array.inject(0) { |result, value| result = value.length if value.length > result; result}
|
26
|
+
end
|
27
|
+
|
21
28
|
def show_result(result)
|
29
|
+
print_header
|
22
30
|
result.split("").each_with_index do |value, index|
|
23
|
-
|
31
|
+
if index % @amount_column == 0
|
32
|
+
print "\n"
|
33
|
+
print_margin(index/@amount_column)
|
34
|
+
end
|
24
35
|
print "■ " if value == "1"
|
25
36
|
print " " if value == "0"
|
26
37
|
end
|
27
38
|
print "\n\n"
|
28
39
|
end
|
40
|
+
|
41
|
+
def print_header
|
42
|
+
max_length(@vertical).times.each do |index|
|
43
|
+
print_margin(-1)
|
44
|
+
@vertical.each do |element|
|
45
|
+
print element[index] || " "
|
46
|
+
print " "
|
47
|
+
end
|
48
|
+
print "\n"
|
49
|
+
end
|
50
|
+
print_margin(-1)
|
51
|
+
@vertical.length.times.each { |index| print "--" }
|
52
|
+
end
|
53
|
+
|
54
|
+
def print_margin(index)
|
55
|
+
if index == -1
|
56
|
+
print " "*max_length(@horizontal) + " "
|
57
|
+
else
|
58
|
+
max_length(@horizontal).times do |sub_index|
|
59
|
+
print @horizontal[index][sub_index] || " "
|
60
|
+
print " "
|
61
|
+
end
|
62
|
+
print "|"
|
63
|
+
end
|
64
|
+
end
|
29
65
|
end
|
30
66
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'nonograms/matrix'
|
3
|
+
|
4
|
+
class Nonograms
|
5
|
+
|
6
|
+
class Logic
|
7
|
+
|
8
|
+
def initialize(horizontal, vertical)
|
9
|
+
@vertical = vertical
|
10
|
+
@horizontal = horizontal
|
11
|
+
@amount_row = horizontal.length
|
12
|
+
@amount_column = vertical.length
|
13
|
+
@matrix = Nonograms::Matrix.new(@amount_row, @amount_column)
|
14
|
+
end
|
15
|
+
|
16
|
+
def matrix
|
17
|
+
@matrix
|
18
|
+
end
|
19
|
+
|
20
|
+
def cross_acceptable?(row, column)
|
21
|
+
vertical_acceptable?(row, column) and horizontal_acceptable?(row, column)
|
22
|
+
end
|
23
|
+
|
24
|
+
def vertical_acceptable?(row, column)
|
25
|
+
unless row == @amount_row-1
|
26
|
+
vector_acceptable?( @vertical[column], @matrix.count_vertical(column) )
|
27
|
+
else
|
28
|
+
return ( @vertical[column] == @matrix.count_vertical(column) )
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def horizontal_acceptable?(row, column)
|
33
|
+
unless column == @amount_column-1
|
34
|
+
vector_acceptable?( @horizontal[row], @matrix.count_horizontal(row) )
|
35
|
+
else
|
36
|
+
return ( @horizontal[row] == @matrix.count_horizontal(row))
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def vector_acceptable?(origin, piece)
|
41
|
+
return false if piece.length > origin.length
|
42
|
+
piece.each_with_index do |value, index|
|
43
|
+
if index == piece.length-1
|
44
|
+
return false unless origin[index] >= piece[index]
|
45
|
+
else
|
46
|
+
return false unless origin[index] == piece[index]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
data/lib/nonograms/version.rb
CHANGED
data/nonograms.gemspec
CHANGED
@@ -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-
|
9
|
+
gem.date = "2012-07-10"
|
10
10
|
gem.homepage = "https://github.com/raglub/nonograms"
|
11
11
|
|
12
12
|
gem.files = `git ls-files`.split($\)
|
data/spec/logic_spec.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'nonograms'
|
3
|
+
|
4
|
+
describe Nonograms::Logic do
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
vertical = [[1], [2, 1], [1], [], [1, 1]]
|
8
|
+
horizontal = [[1], [2, 1], [1], [1, 1]]
|
9
|
+
@logic = Nonograms::Logic.new(horizontal, vertical)
|
10
|
+
end
|
11
|
+
|
12
|
+
it "for vectors acceptable" do
|
13
|
+
origin = [3, 1, 2]
|
14
|
+
@logic.vector_acceptable?(origin, [3, 1]).should be_true
|
15
|
+
@logic.vector_acceptable?(origin, [3, 1, 2]).should be_true
|
16
|
+
@logic.vector_acceptable?(origin, [3, 1, 1]).should be_true
|
17
|
+
@logic.vector_acceptable?(origin, []).should be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "for vectors don't acceptable" do
|
21
|
+
origin = [3, 1, 2]
|
22
|
+
@logic.vector_acceptable?(origin, [4, 1]).should be_false
|
23
|
+
@logic.vector_acceptable?(origin, [3, 1, 2, 4]).should be_false
|
24
|
+
@logic.vector_acceptable?(origin, [3, 1, 3]).should be_false
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
data/spec/nonograms_spec.rb
CHANGED
@@ -15,20 +15,4 @@ describe Nonograms do
|
|
15
15
|
it "should properly entered data" do
|
16
16
|
@nonograms.properly_data_entered?.should be_true
|
17
17
|
end
|
18
|
-
|
19
|
-
it "for vectors acceptable" do
|
20
|
-
origin = [3, 1, 2]
|
21
|
-
@nonograms.vector_acceptable?(origin, [3, 1]).should be_true
|
22
|
-
@nonograms.vector_acceptable?(origin, [3, 1, 2]).should be_true
|
23
|
-
@nonograms.vector_acceptable?(origin, [3, 1, 1]).should be_true
|
24
|
-
@nonograms.vector_acceptable?(origin, []).should be_true
|
25
|
-
end
|
26
|
-
|
27
|
-
it "for vectors don't acceptable" do
|
28
|
-
origin = [3, 1, 2]
|
29
|
-
@nonograms.vector_acceptable?(origin, [4, 1]).should be_false
|
30
|
-
@nonograms.vector_acceptable?(origin, [3, 1, 2, 4]).should be_false
|
31
|
-
@nonograms.vector_acceptable?(origin, [3, 1, 3]).should be_false
|
32
|
-
end
|
33
|
-
|
34
18
|
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.
|
4
|
+
version: 0.2.2
|
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-
|
12
|
+
date: 2012-07-10 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -42,10 +42,12 @@ files:
|
|
42
42
|
- lib/nonograms.rb
|
43
43
|
- lib/nonograms/checker.rb
|
44
44
|
- lib/nonograms/display.rb
|
45
|
+
- lib/nonograms/logic.rb
|
45
46
|
- lib/nonograms/matrix.rb
|
46
47
|
- lib/nonograms/version.rb
|
47
48
|
- nonograms.gemspec
|
48
49
|
- spec/checker_spec.rb
|
50
|
+
- spec/logic_spec.rb
|
49
51
|
- spec/matrix_spec.rb
|
50
52
|
- spec/nonograms_spec.rb
|
51
53
|
homepage: https://github.com/raglub/nonograms
|
@@ -74,5 +76,6 @@ specification_version: 3
|
|
74
76
|
summary: Solve Nonograms.
|
75
77
|
test_files:
|
76
78
|
- spec/checker_spec.rb
|
79
|
+
- spec/logic_spec.rb
|
77
80
|
- spec/matrix_spec.rb
|
78
81
|
- spec/nonograms_spec.rb
|