行列

The Ruby Programming Launguageの一章の数独のCode解読のために
行列の勉強.

describe "grid 3x3" do
  before(:each) do
    @grid = SquareMatrix.new([11,12,13,
                              21,22,23,
                              31,32,33])
  end
  
  it "should get column array by column num" do
    @grid.column(1).should == [11,21,31]
    @grid.column(2).should == [12,22,32]
    @grid.column(3).should == [13,23,33]    
  end
  
  it "should get row array by row num" do
    @grid.row(1).should == [11,12,13]
    @grid.row(2).should == [21,22,23]
    @grid.row(3).should == [31,32,33]    
  end
end

describe "grid 4x4" do
  before(:each) do
    @grid = SquareMatrix.new([11,12,13,14,
                              21,22,23,24,
                              31,32,33,34,
                              41,42,43,44])
  end
  
  it "should get column array by column num" do
    @grid.column(1).should == [11,21,31,41]
    @grid.column(2).should == [12,22,32,42]
    @grid.column(3).should == [13,23,33,43]    
    @grid.column(4).should == [14,24,34,44]    
  end
  
  it "should get row array by row num" do
    @grid.row(1).should == [11,12,13,14]
    @grid.row(2).should == [21,22,23,24]
    @grid.row(3).should == [31,32,33,34]
    @grid.row(4).should == [41,42,43,44]
  end
end

class SquareMatrix < Array
  def column(num)
      results = []
      num.step(self.size, Math.sqrt(self.size)) { |i|
        results << self[i-1]
      }
      results
  end
  def row(num)
    self[(num - 1) * Math.sqrt(self.size), Math.sqrt(self.size)]
  end
end