院卒新人サラリーマンのメモ代わり

備忘としてのメモを記載

rubyで数独 実装2

前回のやつのSudoku_conditionクラスを少しリファクタリング
pをcur_cellにしたりほかも若干変えた

class Sudoku_condition
  def initialize
  end

  def no_violation?(grid, cur_cell, v)
    row_any?(grid, cur_cell, v) &&
    column_any?(grid, cur_cell, v) &&
    square_any?(grid, cur_cell, v)
  end

  private
  def row_any?(grid, cur_cell, v)
    r = cur_cell / 9
    (0..8).map { |k| grid[9 * r + k] }.one? { |num| num == v }
    # grid.each_slice(9).map(&:to_a)[r].one?{|num| num ==v}  #この方が読みやすいけどcolumnとかで使えないから却下
  end

  def column_any?(grid, cur_cell, v)
    c = cur_cell % 9
    (0..8).map { |k| grid[9 * k + c] }.one? { |num| num == v }
  end

  def square_any?(grid, cur_cell, v)
    r_base = (cur_cell / 9) / 3 * 3 #左上のマスの行と列
    c_base = (cur_cell % 9) / 3 * 3
    (0..8).map { |k| grid[9 * (r_base + (k / 3)) + c_base + (k % 3)] }.one? { |num| num == v }
  end
end