Sudoku tester

by russau

JavaScript

var block = [[5,3,4,6,7,8,9,1,2],
             [6,7,2,1,9,5,3,4,8],
             [1,9,8,3,4,2,5,6,7],
             [8,5,9,7,6,1,4,2,3],
             [4,2,6,8,5,3,7,9,1],
             [7,1,3,9,2,4,8,5,6],
             [9,6,1,5,3,7,2,8,4],
             [2,8,7,4,1,9,6,3,5],
             [3,4,5,2,8,6,1,7,9]];

sodukuTest(block);

function sodukuTest(block)
{
    for (var i=0; i<block.length; i++)
    {
        var a = lineTest(block, i, true );
        $('body').append("row " + i +  (a ? " y<br>" : " n<br>"));
        a = lineTest(block, i, false );
        $('body').append("column " + i +  (a ? " y<br>" : " n<br>"));        
    }
    

    for (var x=0; x<3; x++)
    {
        for (var y=0; y<3; y++)
        {
            var a = blockTest(block, x*3, y*3);
            $('body').append(' ' + x*3 + ' ' +  y*3);
            $('body').append(a ? " y<br>" : " n<br>");
        }
    }
}

function blockTest(block, startX, startY)
{
    var sum = 0;
    var lowerb = 1;
    var upperb = 9;
    var dupes = {};
    
    for (var i=0; i<9; i++)
    {
        x = startX + (i % 3);
        y = startY + Math.floor(i/3)
        
        var val = block[y][x];
        //$('body').append("x " + x);
        //$('body').append(", y " + y);        
        //$('body').append(", val " + val + "<br>");
        
        sum += val;
        if (val < lowerb || val > upperb) {
            return false;
        }
        if (dupes[val] == null) dupes[val] = 1
        else{ 
            return false;
        }   
    }
    return (sum == 45);
}

function lineTest(block, pos, isRow)
{
    var sum = 0;
    var lowerb = 1;
    var upperb = 9;
    var dupes = {};
    for (var i=0; i<block[pos].length; i++)
    {
        var val = isRow ? block[pos][i] : block[i][pos];
        sum += val;
        if (val < lowerb || val > upperb) {
            
            return false;
        }
        if (dupes[val] == null) dupes[val] = 1
        else return false;
    }
    return (sum == 45);
}