namero 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
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