Rubyで数独(ナンプレ)を解く(材料編)

4月 13th, 2008 admin Posted in Ruby, 今日のコード |

追記 解決編として正しいソースコードを掲載しました

毎日コードを書くというルールを決めたから酷いコードでもアップします
Rubyの本ももたずに15分ぐらいでやったんだという言い訳をさせてください
リファクタリングのやりがいがあるという意味では良コード

アルゴリズム

ナンプレを解くためのアルゴリズムとして以下のようなものを考えた。
(1)縦方向に調べて、調査中のマスに置ける数字の候補をリストする
(2)横方向にも同様に
(3)1と2の結果候補が1つならその数字を置く
んで、1~3をマスの数*マスの数やればOK

成果物

RUBY:
  1. require 'pp'
  2.  
  3. def search_h(index,x,sheet)
  4.   offset = (index / 9) * 9
  5.   possible = Array.new
  6.  
  7.   search_array = sheet.slice(offset..(offset+8))
  8.   (1..9).each do |i|
  9.     unless search_array.include?(i)
  10.       possible.push(i)
  11.     end
  12.   end
  13.  
  14.   return possible
  15. end
  16.  
  17. def search_v(index,x,sheet)
  18.   offset = index % 9
  19.   possible = Array.new
  20.  
  21.   search_array = Array.new
  22.   (0..8).each do |i|
  23.      search_array.push(sheet[offset + 9 * i])
  24.   end
  25.  
  26.   (1..9).each do |i|
  27.     unless search_array.include?(i)
  28.       possible.push(i)
  29.     end
  30.   end
  31.  
  32.   return possible
  33. end
  34.  
  35. sheet = Array.new
  36. sheet.concat [3,7,0,6,2,0,0,0,1]
  37. sheet.concat [0,0,8,0,5,0,0,6,9]
  38. sheet.concat [4,0,0,0,7,0,0,8,0]
  39. sheet.concat [0,6,0,0,0,4,0,3,8]
  40. sheet.concat [8,0,0,0,3,0,0,0,6]
  41. sheet.concat [5,2,0,0,8,6,0,9,0]
  42. sheet.concat [0,4,0,0,1,0,0,0,3]
  43. sheet.concat [9,3,0,0,6,0,8,0,0]
  44. sheet.concat [6,0,0,0,4,2,0,7,5]
  45.  
  46. width = 9
  47. height= 9
  48.  
  49. 81.times do
  50. index = 0
  51. sheet.each do |x|
  52.   if x == 0
  53.     result = search_h(index,x,sheet) & search_v(index,x,sheet)
  54.  
  55.     if(result.length == 1)
  56.         p index
  57.     pp result
  58.         sheet[index] = result.pop
  59.     end
  60.   end
  61.   index += 1
  62. end
  63. end
  64.  
  65. count = 1
  66. sheet.each do |x|
  67.   print x
  68.   print "\n" unless count % 9> 0
  69.   count += 1
  70. end

まとめ

・・・駄目らしい。このコードでは解けませんでしたw
で、ひさしぶりに頭を使ってコーディングした気がする。学生の頃を思い出して楽しかった。
明日には解けるようにしておきます。

2 Responses to “Rubyで数独(ナンプレ)を解く(材料編)”

  1. 候補リスト同士の比較も行わないといけないんだなー多分それでいける

  2. [...] 前回はそもそもナンプレを1度しかやったことがないこともあってルールを間違えていたため解けませんでした。 今回やっとルールを把握したので解決編としてナンプレを解くコードを掲載します。 [...]

Leave a Reply