数独つづき

Uchからの有り難いコメント

yu 『これからあの時間は『数独システム開発実践』ってことで,

9*9の2次元配列より, 3*3の2次元配列が9個あるってしたらどうなんやろ?

そのほうが, なんとなくキレイにできそうやけど・・・?』 (2006/05/23 03:13)

より,数独を改良.
ってか昨日書いてたコードは,寝ぼけた頭で書かれたせいか,糞みたいな挙動しか出来ない事に気づきました.

class Field
  
  def initialize
    @f = Array.new(9){|e| e = Array.new(9)}
  end
  
  attr_reader :f
  
  def inputnums
    puts "\t123456789"
    a = 0 # fの一次の添字
    (1 .. 9).each do |i|
      l = []
      while l.size != 9
        print "line #{i}:\t"
        l = gets.chomp.split(//)
        l.map!{|e| e.to_i}
      end
      if i % 3 == 1
        @f[a][0..2] = l[0..2]
        @f[a + 1][0..2] = l[3..5]
        @f[a + 2][0..2] = l[6..8]
      elsif i % 3 == 2
        @f[a][3..5] = l[0..2]
        @f[a + 1][3..5] = l[3..5]
        @f[a + 2][3..5] = l[6..8] 
      else
        @f[a][6..8] = l[0..2]
        @f[a + 1][6..8] = l[3..5]
        @f[a + 2][6..8] = l[6..8] 
        a += 3
      end
    end
  end
end

昨日のコードから更新された部分です.もうArrayクラスからの継承とか止めました.この方が簡単だし.ただ,fに入力の値を格納するとこが何とも見にくいなぁ.
実際にirbで試してみました.

> f = Field.new
=>(略)
> f.inputnums
        123456789
line 1: 123456789
(略)
line 9: 123456789
=> 1..9
> f.put_result
123123123
456456456
789789789
123123123
456456456
789789789
123123123
456456456
789789789
=>(略)

put_resultは昨日のままです.分かり易いように.これで,3*3が9個になったかしら.
それじゃput_resultを書き直します.

  def put_result
    a = 0
    (1 .. 9).each do |i|
      if i % 3 == 1
        print @f[a][0..2],@f[a + 1][0..2],@f[a + 2][0..2]
        puts
      elsif i % 3 == 2
        print @f[a][3..5],@f[a + 1][3..5],@f[a + 2][3..5]
        puts
      else
        print @f[a][6..8],@f[a + 1][6..8],@f[a + 2][6..8] 
        puts
        a += 3
      end
    end
  end

気持ち悪い.
実行.

> f.inputnums
        123456789
line 1: 123456789
line 2: 234567891
(略)
line 8: 891234567
line 9: 912345678
> f.put_result
123456789
234567891
(略)
891234567
912345678

ちゃんとできてる.そりゃこんなごり押しだもの.


あーしかし,数独の解法のアルゴリズムを考える気がしない.