local function table2string(t)
    local myself = table2string
    local l = {}
    local n = 0
    for k, v in pairs(t) do
        n = n + 1
        if type(v) == "table" then
            l[n] = k .. ': ' .. myself(v)
        elseif type(v) == "string" then
            l[n] = k .. ': ' .. '"' .. v .. '"'
        else
            l[n] = k .. ': ' .. v
        end
    end
    return "{" .. table.concat(l, ", ") .. "}"
end

local function find(array, element)
    local index = 0
    for i = 1, #array do
        if array[i] == element then
            index = i
            break
        end
    end
    return index
end

local function createEmptyBoard()
    local b = {}
    for i = 1, 9 do
        b[i] = {}
        for j = 1, 9 do
            b[i][j] = 0
        end
    end
    return b
end

local function cloneBoard(b)
    local c = {}
    for i = 1, 9 do
        c[i] = {}
        for j = 1, 9 do
            c[i][j] = b[i][j]
        end
    end
    return c
end

local function loadBoard(fn)
    local boards = {}
    local r = 0
    local board = {}
    for line in io.lines(fn) do
        if line:gsub("%s+", "") == "" then
            table.insert(boards, board)
            board = {}
            r = 0
        else
            r = r + 1
            local c = 0
            board[r] = {}
            for item in line:gmatch("%w+") do
                c = c + 1
                board[r][c] = tonumber(item)
            end
        end
    end
    table.insert(boards, board)
    return boards
end

local function showBoard(board)
    for row = 1, 9 do
        print(table.concat(board[row], " "))
    end
end

return {
    createEmptyBoard = createEmptyBoard,
    cloneBoard = cloneBoard,
    loadBoard = loadBoard,
}