sudokude 1.0.2 → 1.0.3

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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/sudokude.rb +33 -40
  3. metadata +21 -40
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a8909ccbb963c1bbfdec6378f89df4d6bacd71ad
4
+ data.tar.gz: cb46616694e3af4dadd3b8aab9b8507878888188
5
+ SHA512:
6
+ metadata.gz: bedba99fe4ca0f3b449f53bb91802c0161050ec2486845f02711eb529a6be166472db9ce8862d1f2aba5a05d53cfa14ea1670eb5994c2d6da36d58e64ad4459e
7
+ data.tar.gz: b21c271a91e4f54c8976bc12b30e6f7c6af077976afcfafaea6d22d2e094b533832dab53c46e195a1f4afdee6b7712d164f0a34b891a9f785dbad492df6d13bf
data/lib/sudokude.rb CHANGED
@@ -1,14 +1,35 @@
1
+ class Hash
2
+ def sudoku_row(i)
3
+ self.select { |key, value| key[1].to_i == i }.values
4
+ end
5
+
6
+ def sudoku_column(i)
7
+ self.select { |key, value| key[0].to_i == i }.values
8
+ end
9
+
10
+ def sudoku_box(i)
11
+ self.select { |key, value| key[2].to_i == i }.values
12
+ end
13
+ end
14
+
15
+ class Array
16
+ def has_naked_multiple?(item)
17
+ self.select { |e| (e - item).empty? }.size == item.size
18
+ end
19
+ end
20
+
1
21
  module Sudokude
2
22
  class Sudoku
3
23
  def initialize(sudoku)
4
- raise "This is not the proper size" if sudoku.map {|e| e.size } != [9,9,9,9,9,9,9,9,9]
24
+ raise TypeError, "Sudoku needs to be initialized with an array" if sudoku.class != Array
25
+ raise StandardError, "This is not the proper size" if sudoku.map {|e| e.size }.uniq != [9]
5
26
  @sudoku = {}
6
27
  j = 0
7
28
 
8
29
  # This code creates a hash table with key indexes for each value.
9
30
  # The key is made up of three digits and shows the exact location
10
31
  # of the number.
11
- sudoku.each do |row|
32
+ sudoku.each do |sudoku_row|
12
33
  9.times do |i|
13
34
  if i <= 2 && j <= 2
14
35
  b = 0
@@ -29,26 +50,17 @@ module Sudokude
29
50
  else
30
51
  b = 8
31
52
  end
32
- @sudoku[i.to_s + j.to_s + b.to_s] = row[i]
53
+ @sudoku[i.to_s + j.to_s + b.to_s] = sudoku_row[i]
33
54
  end
34
55
  j += 1
35
56
  end
36
57
  end
37
58
 
38
- def print
39
- self.each do |row|
40
- row.map! do |e|
41
- if e.nil?
42
- "n"
43
- else
44
- e
45
- end
46
- end
47
- puts row.join(" ")
48
- end
59
+ def to_s
60
+ @sudoku.values.each_slice(9).to_a.to_s
49
61
  end
50
62
 
51
- def solve!
63
+ def solve
52
64
  unsolved = {}
53
65
  @keysizes = []
54
66
  @sudoku.each do |key, value|
@@ -62,7 +74,7 @@ module Sudokude
62
74
  # Simple elimination method
63
75
  unsolved.each do |key, value|
64
76
  value.reject! do |number|
65
- (@sudoku.row(key[1].to_i) + @sudoku.column(key[0].to_i) + @sudoku.box(key[2].to_i)).include?(number)
77
+ (@sudoku.sudoku_row(key[1].to_i) + @sudoku.sudoku_column(key[0].to_i) + @sudoku.sudoku_box(key[2].to_i)).include?(number)
66
78
  end
67
79
  @sudoku[key] = value[0] if value.size == 1
68
80
  unsolved.delete_if { |key, value| value.empty? }
@@ -71,17 +83,17 @@ module Sudokude
71
83
 
72
84
  # Naked multiples method
73
85
  unsolved.each do |key, value|
74
- if unsolved.row(key[1].to_i).has_naked_multiple?(value)
86
+ if unsolved.sudoku_row(key[1].to_i).has_naked_multiple?(value)
75
87
  unsolved.each do |nkey, nvalue|
76
88
  nvalue.reject! { |n| value.include?(n) } if (!(nvalue-value).empty? && key[1] == nkey[1])
77
89
  end
78
90
  end
79
- if unsolved.column(key[0].to_i).has_naked_multiple?(value)
91
+ if unsolved.sudoku_column(key[0].to_i).has_naked_multiple?(value)
80
92
  unsolved.each do |nkey, nvalue|
81
93
  nvalue.reject! { |n| value.include?(n) } if (!(nvalue-value).empty? && key[0] == nkey[0])
82
94
  end
83
95
  end
84
- if unsolved.box(key[2].to_i).has_naked_multiple?(value)
96
+ if unsolved.sudoku_box(key[2].to_i).has_naked_multiple?(value)
85
97
  unsolved.each do |nkey, nvalue|
86
98
  nvalue.reject! { |n| value.include?(n) } if (!(nvalue-value).empty? && key[2] == nkey[2])
87
99
  end
@@ -93,8 +105,9 @@ module Sudokude
93
105
 
94
106
  if unsolvable
95
107
  puts "Impossible to solve. Best solution (n if no solution):"
108
+ sudoku.to_s
96
109
  break
97
- end
110
+ end
98
111
  end
99
112
 
100
113
  return @sudoku.values.each_slice(9).to_a
@@ -118,24 +131,4 @@ module Sudokude
118
131
  end
119
132
 
120
133
  end
121
-
122
- class Hash
123
- def row(i)
124
- self.select { |key, value| key[1].to_i == i }.values
125
- end
126
-
127
- def column(i)
128
- self.select { |key, value| key[0].to_i == i }.values
129
- end
130
-
131
- def box(i)
132
- self.select { |key, value| key[2].to_i == i }.values
133
- end
134
- end
135
-
136
- class Array
137
- def has_naked_multiple?(item)
138
- self.select { |e| (e - item).empty? }.size == item.size
139
- end
140
- end
141
134
  end
metadata CHANGED
@@ -1,62 +1,43 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: sudokude
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 1
7
- - 0
8
- - 2
9
- version: 1.0.2
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.3
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Dan Chao
13
8
  autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
-
17
- date: 2013-09-19 00:00:00 -07:00
18
- default_executable:
11
+ date: 2013-12-22 00:00:00.000000000 Z
19
12
  dependencies: []
20
-
21
- description: This program solves Sudoku puzzles in the form of nested arrays
13
+ description: This program solves Sudoku puzzles in the form of matrices
22
14
  email: daniel.h.chao@gmail.com
23
15
  executables: []
24
-
25
16
  extensions: []
26
-
27
17
  extra_rdoc_files: []
28
-
29
- files:
18
+ files:
30
19
  - lib/sudokude.rb
31
- has_rdoc: true
32
20
  homepage:
33
21
  licenses: []
34
-
22
+ metadata: {}
35
23
  post_install_message:
36
24
  rdoc_options: []
37
-
38
- require_paths:
25
+ require_paths:
39
26
  - lib
40
- required_ruby_version: !ruby/object:Gem::Requirement
41
- requirements:
42
- - - ">="
43
- - !ruby/object:Gem::Version
44
- segments:
45
- - 0
46
- version: "0"
47
- required_rubygems_version: !ruby/object:Gem::Requirement
48
- requirements:
49
- - - ">="
50
- - !ruby/object:Gem::Version
51
- segments:
52
- - 0
53
- version: "0"
27
+ required_ruby_version: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
32
+ required_rubygems_version: !ruby/object:Gem::Requirement
33
+ requirements:
34
+ - - '>='
35
+ - !ruby/object:Gem::Version
36
+ version: '0'
54
37
  requirements: []
55
-
56
38
  rubyforge_project:
57
- rubygems_version: 1.3.6
39
+ rubygems_version: 2.0.6
58
40
  signing_key:
59
- specification_version: 3
41
+ specification_version: 4
60
42
  summary: Solve sudoku puzzles
61
43
  test_files: []
62
-