配列で数独
数独を解くようなプログラムをいつか暇な時に描きたいなぁと思っていて,ちょっとその凄く初歩的な部分ですけど,実験的に.
とりあえず数独のマスを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もしてくれると助かるんだけどなぁ.
とりあえずコレで基盤が出来たとして,また暇があったら続きを作っていきます.眠い.