Rubyで数独(ナンプレ)を解く(材料編)
4月 13th, 2008 admin Posted in Ruby, 今日のコード |
追記 解決編として正しいソースコードを掲載しました
毎日コードを書くというルールを決めたから酷いコードでもアップします
Rubyの本ももたずに15分ぐらいでやったんだという言い訳をさせてください
リファクタリングのやりがいがあるという意味では良コード
アルゴリズム
ナンプレを解くためのアルゴリズムとして以下のようなものを考えた。
(1)縦方向に調べて、調査中のマスに置ける数字の候補をリストする
(2)横方向にも同様に
(3)1と2の結果候補が1つならその数字を置く
んで、1~3をマスの数*マスの数やればOK
成果物
RUBY:
-
require 'pp'
-
-
def search_h(index,x,sheet)
-
offset = (index / 9) * 9
-
possible = Array.new
-
-
search_array = sheet.slice(offset..(offset+8))
-
(1..9).each do |i|
-
unless search_array.include?(i)
-
possible.push(i)
-
end
-
end
-
-
return possible
-
end
-
-
def search_v(index,x,sheet)
-
offset = index % 9
-
possible = Array.new
-
-
search_array = Array.new
-
(0..8).each do |i|
-
search_array.push(sheet[offset + 9 * i])
-
end
-
-
(1..9).each do |i|
-
unless search_array.include?(i)
-
possible.push(i)
-
end
-
end
-
-
return possible
-
end
-
-
sheet = Array.new
-
sheet.concat [3,7,0,6,2,0,0,0,1]
-
sheet.concat [0,0,8,0,5,0,0,6,9]
-
sheet.concat [4,0,0,0,7,0,0,8,0]
-
sheet.concat [0,6,0,0,0,4,0,3,8]
-
sheet.concat [8,0,0,0,3,0,0,0,6]
-
sheet.concat [5,2,0,0,8,6,0,9,0]
-
sheet.concat [0,4,0,0,1,0,0,0,3]
-
sheet.concat [9,3,0,0,6,0,8,0,0]
-
sheet.concat [6,0,0,0,4,2,0,7,5]
-
-
width = 9
-
height= 9
-
-
81.times do
-
index = 0
-
sheet.each do |x|
-
if x == 0
-
result = search_h(index,x,sheet) & search_v(index,x,sheet)
-
-
if(result.length == 1)
-
p index
-
pp result
-
sheet[index] = result.pop
-
end
-
end
-
index += 1
-
end
-
end
-
-
count = 1
-
sheet.each do |x|
-
print x
-
print "\n" unless count % 9> 0
-
count += 1
-
end
まとめ
・・・駄目らしい。このコードでは解けませんでしたw
で、ひさしぶりに頭を使ってコーディングした気がする。学生の頃を思い出して楽しかった。
明日には解けるようにしておきます。
4月 15th, 2008 at 0:11:46
候補リスト同士の比較も行わないといけないんだなー多分それでいける
4月 26th, 2008 at 1:38:31
[...] 前回はそもそもナンプレを1度しかやったことがないこともあってルールを間違えていたため解けませんでした。 今回やっとルールを把握したので解決編としてナンプレを解くコードを掲載します。 [...]