以下方法生成81个Cell
个对象,每个对象都有不同的row
,column
和blocks
。它使用一种算法,根据当前生成的Cell
更改这些属性。
当1.times do
为0时,实现if
部分以跳过until
循环内第一个循环上的cell_counter
语句块。如何制作这更优雅吗?
def initialize_default_cells
cell_counter, row, column = 0,0,0
block = 1
until cell_counter == 81
1.times do
break if cell_counter == 0
if cell_counter % 1 == 0
column += 1
end
if cell_counter % 3 == 0
block += 1
end
if cell_counter % 9 == 0
column -= 9
row += 1
block -= 3
end
if cell_counter % 27 == 0
block += 3
end
end
@cells << Cell.new(ROW_ID[row], COLUMN_ID[column], block)
cell_counter += 1
end
end
答案 0 :(得分:2)
我的结论是,对于每个row
,从头开始计算column
,block
和i = 0,..,80
最简单。
def initialize_default_cells
(0..80).each do |i|
@cells << Cell.new(ROW_ID[i/9], COLUMN_ID[i%9], 1 + (i%9)/3 + 3*(i/27))
end
end
COLUMN_ID
(i%9
)的密钥从i-9*(i/9)
减少,最后一个参数(1 + (i%9)/3 + 3*(i/27)
)从1 + i/3 - 3*(i/9) + 3*(i/27)
减少
考虑三个例子。
i=0
@cells << Cell.new(ROW_ID[0/9], COLUMN_ID[0%9], 1 + (0%9)/3 + 3*(0/27))
#=> << Cell.new(ROW_ID[0], COLUMN_ID[0], 1)
i=6
@cells << Cell.new(ROW_ID[6/9], COLUMN_ID[6%9], 1 + (6%9)/3 + 3*(6/27))
#=> << Cell.new(ROW_ID[0], COLUMN_ID[6], 3)
i=29
@cells << Cell.new(ROW_ID[29/9], COLUMN_ID[29%9], 1 + (29%9)/3 + 3*(29/27))
# << Cell.new(ROW_ID[3], COLUMN_ID[2], 4)
当i=6
时,6/3 #=> 2
是可以被3
整除的正数的数量,6/9 #=> 0
是可以被{{1}整除的正数的数量}和9
是可以被6/27 #=> 0
整除的正数的数量。然后使用这些值计算27
的参数。