配列で数独

数独を解くようなプログラムをいつか暇な時に描きたいなぁと思っていて,ちょっとその凄く初歩的な部分ですけど,実験的に.


とりあえず数独のマスを2次元配列で表現したら結構楽かも,と思いながら,とりあえずテスト.

> field = Array.new(9){|e| e = Array.new(9)}
=> [
[nil, nil, nil, nil, nil, nil, nil, nil, nil], 
[nil, nil, nil, nil, nil, nil, nil, nil, nil], 
[nil, nil, nil, nil, nil, nil, nil, nil, nil],
[nil, nil, nil, nil, nil, nil, nil, nil, nil], 
[nil, nil, nil, nil, nil, nil, nil, nil, nil], 
[nil, nil, nil, nil, nil, nil, nil, nil, nil], 
[nil, nil, nil, nil, nil, nil, nil, nil, nil], 
[nil, nil, nil, nil, nil, nil, nil, nil, nil], 
[nil, nil, nil, nil, nil, nil, nil, nil, nil]
] # 見易いように整形しています.
> field[0]
=> [nil, nil, nil, nil, nil, nil, nil, nil, nil]
> field[0][0]  
=> nil

ふむふむ,こりゃclass定義をした方が良いかも分からんね.


とりあえず適当に,形だけ作ってみました.

class Field < Array
  def init
    Array.new(9){|e| e = Array.new(9)}
  end
  
  def inputnums
    puts "\t123456789"
    (1 .. 9).each do |i|
      l = ""
      while l.size != 9
        print "line #{i}:\t"
        l = gets.chomp
      end
      self[i-1] = l.split(//)
    end
  end
  
  def put_result
    self.each do |e|
      print e
      puts
    end
  end
end

initで9*9の二次元配列を作成.inputnumsで数独の問題を入力,このとき,0は空のマスの意味で使われるとします.put_resultで二次元配列をゴソッと出力.以上.


irbで試す.

> f = Field.new
=> []
> f.init
=> [[nil, nil, nil, nil, nil, nil, nil, nil, nil],
(中略)
[nil, nil, nil, nil, nil, nil, nil, nil, nil]]
> f.inputnums
        123456789
line 1: 123456789
line 2: 234567890
line 3: 345678901
line 4: 456789012
line 5: 567890123
line 6: 678901234 
line 7: 789012345
line 8: 890123456
line 9: 901234567
=> 1..9
> f.put_result
123456789
234567890
345678901
456789012
567890123
678901234
789012345
890123456
901234567
=> 1..9

ん〜newしてついでにinitもしてくれると助かるんだけどなぁ.
とりあえずコレで基盤が出来たとして,また暇があったら続きを作っていきます.眠い.