sudokude 1.0.2 → 1.0.3

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