namero 0.0.3 → 0.0.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d873a422ed56c6cd9838805394b1c2fb1ae7ad33f6eb65fb2338880f598fb427
4
- data.tar.gz: b71ec4d6319f4267142997c99a3f4ac85d987ef9e5526d837b31544c93eee75d
3
+ metadata.gz: 4ec3f119c8411016246a15c40422b349db2b79eda32597a34ed3bca564821311
4
+ data.tar.gz: f2e5c017ca3b45fa298607d83d5cc70b270bc139cda30ecb540c9f0fc8bf760d
5
5
  SHA512:
6
- metadata.gz: 71ee42cdf9509fd8daf2699a37f9979ee83ae4f70dbeaaed762f0c2eb1ee740bd8a901fe49699579183712e9485a7580205b3334823154d0e72dd896aad669e0
7
- data.tar.gz: 840f26d770194bb6d32e2243fe61f18d39bccd537fe1cc144e1935ac2ba804ca78d887b62e1c31c2603f45f01b2cbd199e5b9eaeb00fe00758a6ffe96ecd2ad6
6
+ metadata.gz: cca575989a770f0383c3fc62e3f95e3f663465b0a776f266110bfbd950f4142eae14dc4060c9d8431145597aeec5f64347f5d5cb19e1825820af9b899b33b914
7
+ data.tar.gz: 585ee296abb31a139033b7d4a062b4508d032f9039d376a3f18bb5e1b30613bedfb3b1d564d03190ec17157a962a37c1e23e49e964f75719291f22d57d02ec40
@@ -23,40 +23,22 @@ module Namero
23
23
  raise ArgumentError if values.size != n**2
24
24
  @n = n
25
25
  @values = values
26
- end
27
-
28
- # x, y: 0 based index
29
- # type: :single, :row, :column, :block, :index
30
- def []=(idx, type = :index, value)
31
- case type
32
- when :index
33
- @values[idx] = value
34
- when :row
35
- start = (idx / n) * n
36
- n.times do |i|
37
- @values[start+i] = value[i]
38
- end
39
- when :column
40
- x = idx % n
41
- n.times do |i|
42
- @values[i * n + x] = value[i]
43
- end
44
- when :block
45
- x = idx % n
46
- y = idx / n
47
- start_x = x / root_n * root_n
48
- start_y = y / root_n * root_n
49
-
50
- value_idx = 0
26
+ @rows = Array.new(n) do |i|
27
+ start = i * n
28
+ values[start...start+n]
29
+ end
30
+ @columns = Array.new(n) do |x|
31
+ Array.new(n) { |i| values[i * n + x] }
32
+ end
33
+ @blocks = Array.new(n) do |i|
34
+ idx = i % root_n * root_n + (i / root_n) * n * root_n
35
+ block = []
51
36
  root_n.times do |y_offset|
52
37
  root_n.times do |x_offset|
53
-
54
- self[start_x + x_offset + (start_y + y_offset) * n] = value[value_idx]
55
- value_idx += 1
38
+ block << values[idx + x_offset + y_offset * n]
56
39
  end
57
40
  end
58
- else
59
- raise "Unknown type: #{type}"
41
+ block
60
42
  end
61
43
  end
62
44
 
@@ -65,25 +47,12 @@ module Namero
65
47
  when :index
66
48
  @values[idx]
67
49
  when :row
68
- start = (idx / n ) * n
69
- @values[start...start+@n]
50
+ @rows[idx / n]
70
51
  when :column
71
52
  x = idx % n
72
- Array.new(n) { |i| @values[i * n + x] }
53
+ @columns[x]
73
54
  when :block
74
- x = idx % n
75
- y = idx / n
76
- start_x = x / root_n * root_n
77
- start_y = y / root_n * root_n
78
-
79
- [].tap do |res|
80
- root_n.times do |y_offset|
81
- root_n.times do |x_offset|
82
-
83
- res << self[start_x + x_offset + (start_y + y_offset) * n]
84
- end
85
- end
86
- end
55
+ @blocks[idx / n / root_n * root_n + idx % n / root_n]
87
56
  else
88
57
  raise "Unknown type: #{type}"
89
58
  end
@@ -101,14 +70,12 @@ module Namero
101
70
  end
102
71
  end
103
72
 
104
- def each_affected_group
73
+ def each_affected_group(&block)
105
74
  return enum_for(__method__) unless block_given?
106
75
 
107
- n.times do |i|
108
- yield self[i, :column]
109
- yield self[i * n, :row]
110
- yield self[(i % root_n) * root_n + (i / root_n) * n * root_n, :block]
111
- end
76
+ @rows.each(&block)
77
+ @columns.each(&block)
78
+ @blocks.each(&block)
112
79
  end
113
80
 
114
81
  def complete?
@@ -185,9 +152,7 @@ module Namero
185
152
  out
186
153
  end
187
154
 
188
- private
189
-
190
- def root_n
155
+ private def root_n
191
156
  Integer.sqrt(n)
192
157
  end
193
158
  end
@@ -38,20 +38,20 @@ module Namero
38
38
  def fill_candidate_for(v)
39
39
  board[v.index, :row].each do |v2|
40
40
  unless v2.value
41
- v2.candidates.delete(v.value)
42
- updated_candidate_queue << v2.index
41
+ changed = v2.candidates.delete(v.value)
42
+ updated_candidate_queue << v2.index if changed
43
43
  end
44
44
  end
45
45
  board[v.index, :column].each do |v2|
46
46
  unless v2.value
47
- v2.candidates.delete(v.value)
48
- updated_candidate_queue << v2.index
47
+ changed = v2.candidates.delete(v.value)
48
+ updated_candidate_queue << v2.index if changed
49
49
  end
50
50
  end
51
51
  board[v.index, :block].each do |v2|
52
52
  unless v2.value
53
- v2.candidates.delete(v.value)
54
- updated_candidate_queue << v2.index
53
+ changed = v2.candidates.delete(v.value)
54
+ updated_candidate_queue << v2.index if changed
55
55
  end
56
56
  end
57
57
  v.candidates = [v.value]
@@ -17,22 +17,22 @@ module Namero
17
17
 
18
18
  def solve
19
19
  board.each_affected_group do |group|
20
- (1..n).each do |v|
21
- box = nil
22
- group.each do |value|
23
- if !value.value && value.candidates.include?(v)
24
- if box
25
- box = nil
26
- break
27
- else
28
- box = value
29
- end
20
+ table = []
21
+ group.each do |value|
22
+ next if value.value
23
+ value.candidates.each do |c|
24
+ if table[c].nil?
25
+ table[c] = value
26
+ elsif table[c]
27
+ table[c] = false
30
28
  end
31
29
  end
30
+ end
32
31
 
33
- if box
34
- box.candidates = [v]
35
- queue << box.index
32
+ table.each.with_index do |value, idx|
33
+ if value
34
+ value.candidates = [idx]
35
+ queue << value.index
36
36
  end
37
37
  end
38
38
  end
@@ -1,3 +1,3 @@
1
1
  module Namero
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: namero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masataka Pocke Kuwabara
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-28 00:00:00.000000000 Z
11
+ date: 2020-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler