Valid Sudoku

Este problema consiste en dado un sudoku regresar si el sudoku es válido, es decir no existe ningún número repetido en las columnas, filas y cuadrados de 3x3

Solución

# @param {Character[][]} board
# @return {Boolean}
def is_valid_sudoku(board)
    cols=Hash.new{|h,k| h[k]= []}
    rows=Hash.new{|h,k| h[k]= []}
    sqr=Hash.new{|h,k| h[k]= []}
    board.each_with_index do |row,i| 
        row.each_with_index  do |col,j|
        next if col=='.'
        if cols[j].include?(col) || rows[i].include?(col) || sqr[[i/3,j/3]].include?(col)
            return false
        end
        cols[j]<<col
        rows[i]<<col 
        sqr[[i/3,j/3]]<<col
        end
    end
    true
end

Este programa los resolví teniendo un hashmap para cada fila, columna y cuadro de 3x3, y preguntando si el elemento que se está procesando actualmente se encuentra dentro de los valores del hashmap que se está evaluando.

Este fue mi primer intento, pero ver las soluciones más rápidas encontré una fórmula que mejora la memoria y velocidad del que ya tenía con solo una línea, salva memoria al no guardar la llave del hashmap de cuadrados 3x3 como un array con dos elementos y en su lugar lo guarda como un solo índice, esta es la versión final:

# @param {Character[][]} board
# @return {Boolean}
def is_valid_sudoku(board)
    cols=Hash.new{|h,k| h[k]= []}
    rows=Hash.new{|h,k| h[k]= []}
    sqr=Hash.new{|h,k| h[k]= []}
    board.each_with_index do |row,i| 
        row.each_with_index  do |col,j|
        next if col=='.'
        grid_index = (i/3)*3 + (j/3)
        if cols[j].include?(col) || rows[i].include?(col) || sqr[grid_index].include?(col)
            return false
        end
        cols[j]<<col
        rows[i]<<col 
        sqr[grid_index]<<col
        end
    end
    true
end