logoExtra: script.sudoku_resolutor

Descripción: Inicialización para asignar función de resolución al botón correspondiente.


A continuación mostramos los apuntes asociados a este extra:

Resolviendo sencillos sudokus
Cuando publicamos el apunte SVG: crear sudokus, pensamos como podríamos resolverlo; pero debíamos dar unos pasos previos que nos servirán de introducción.
// Descripción para sindicación:
/*
    [rss]Inicialización para asignar función de resolución al botón correspondiente.[/rss]
*/

poner_evento(window, "load", iniciar_sudoku);

function iniciar_sudoku()    {
    poner_evento(tag("estudiator"), "click", estudiar_sudoku);
    poner_evento(tag("resolutor"), "click", resolver_sudoku_facil);
    poner_evento(tag("sudoku_alternativo"), "click", poner_sudoku_facil);
    tag("sudoku_alternativo").style.cursor = "pointer";
    poner_evento(tag("form_sudoku"), "reset", reseteo);
}

function reseteo()    {
window.frames.nuevo_sudoku.location.href =
    "diario.jocker.php?extra=sudoku&inicio=000020087003090006806100000100000000470080200000054073097000000500040000000260005";
}
    arr_sudoku = [];
    solucion = [];

function estudiar_casilla(i, j)    {
    s = arr_sudoku;
    fila = s[i];
    valor = fila.charAt(j);
    if ("123456789".indexOf(valor) > -1)    {
        solucion.push("casilla [" + i + ", " + j + "] resuelta: " + valor);
    }
    else    {
        cadena = "";
        for (_i = 0; _i < 9; _i++)
            if ("123456789".indexOf(fila.charAt(_i)) > -1)
                cadena += fila.charAt(_i);
        for (_i = 0; _i < 9; _i++)
            if ((_i != i) && "123456789".indexOf(s[_i].charAt(j)) > -1)
                if (cadena.indexOf(s[_i].charAt(j)) == -1)
                    cadena += s[_i].charAt(j);
        baseX = 3 * parseInt(i / 3);
        baseY = 3 * parseInt(j / 3);
        for (_i = 0; _i < 3; _i++) for (_j = 0; _j < 3; _j++)
            if (((baseX + _i != i) && (baseY + _j != j)) && "123456789".indexOf(s[baseX + _i].charAt(baseY + _j)) > -1)
                if (cadena.indexOf(s[baseX + _i].charAt(baseY + _j)) == -1)
                cadena += s[baseX + _i].charAt(baseY + _j);
        candidatos = "";
        for (_i = 0; _i < 9; _i++)
            if (cadena.indexOf("123456789".charAt(_i)) == -1)
                candidatos += "123456789".charAt(_i);
        solucion.push("casilla[" + i + ", " + j + "]\\nnúmeros: " + cadena + "\\ncandidatos: " + candidatos);
    }
}

function estudiar_sudoku()    {
    solucion = [];
    cadena = tag("form_sudoku").elements.inicio.value;
    if (cadena.length > 81)
        cadena = cadena.substr(0, 81)
    else
        while (cadena.length < 81)
            cadena += "0";

    for (i = 0; i < 9; i++)
        arr_sudoku[i] = cadena.substr(i * 9, 9);
    //alert(arr_sudoku.join("\\n"));

    for (i = 0; i < 9; i++)
        for (j = 0; j < 9; j++)    {
            estudiar_casilla(i, j);
    }
    tag("resolviendo").innerHTML = solucion.join("\\n<br/>");
}

function resolver_casilla_facil(i, j)    {
cambio = false;
    s = arr_sudoku;
    fila = s[i];
    valor = fila.charAt(j);
    if ("123456789".indexOf(valor) > -1)    {
        //solucion.push("casilla [" + i + ", " + j + "] resuelta: " + valor);
    }
    else    {
        cadena = "";
        for (_i = 0; _i < 9; _i++)
            if ("123456789".indexOf(fila.charAt(_i)) > -1)
                cadena += fila.charAt(_i);
        for (_i = 0; _i < 9; _i++)
            if ((_i != i) && "123456789".indexOf(s[_i].charAt(j)) > -1)
                if (cadena.indexOf(s[_i].charAt(j)) == -1)
                    cadena += s[_i].charAt(j);
        baseX = 3 * parseInt(i / 3);
        baseY = 3 * parseInt(j / 3);
        for (_i = 0; _i < 3; _i++) for (_j = 0; _j < 3; _j++)
            if (((baseX + _i != i) && (baseY + _j != j)) && "123456789".indexOf(s[baseX + _i].charAt(baseY + _j)) > -1)
                if (cadena.indexOf(s[baseX + _i].charAt(baseY + _j)) == -1)
                cadena += s[baseX + _i].charAt(baseY + _j);
        candidatos = "";
        for (_i = 0; _i < 9; _i++)
            if (cadena.indexOf("123456789".charAt(_i)) == -1)
                candidatos += "123456789".charAt(_i);
        if (candidatos.length == 1)    {
            arr_sudoku[i] = s[i].substr(0, j) + candidatos + s[i].substr(j + 1);
            tag("form_sudoku").elements.inicio.value = arr_sudoku.join("");
            tag("form_sudoku").submit();
            //alert(arr_sudoku[i]);
            cambio = true;
        solucion.push("casilla[" + i + ", " + j + "]\\nnúmeros: " + cadena + "\\ncandidatos: " + candidatos);
        }
    }
    return cambio;
}

function poner_sudoku_facil()    {
    tag("form_sudoku").elements.inicio.value = "014500032369001004000000010007604090690087020020300000100800070000000008802400603";
    tag("form_sudoku").submit();
}

function resolver_sudoku_facil()    {
    solucion = [];
    //cambios = 0;
    terminado = false;
    cadena = tag("form_sudoku").elements.inicio.value;
    if (cadena.length > 81)
        cadena = cadena.substr(0, 81)
    else
        while (cadena.length < 81)
            cadena += "0";

    for (i = 0; i < 9; i++)
        arr_sudoku[i] = cadena.substr(i * 9, 9);
    do    {
        cambios = 0;
        for (i = 0; i < 9; i++)
            for (j = 0; j < 9; j++)    {
                //cambio = (cambio || resolver_casilla_facil(i, j));
                cambio = resolver_casilla_facil(i, j);
                cambios += (cambio) ? 1:0;
                terminado = terminado || cambio;
        }
//        terminado = true;
    }    while (cambios > 0);
//    mensaje = (cambio) ? "hubo cambios":"sin cambios";
//    tag("resolviendo").innerHTML = mensaje + "<br/>" + solucion.join("\\n<br/>");
    tag("resolviendo").innerHTML = solucion.join("\\n<br/>");
}

Este código ha sido leído en 63 ocasiones.

Zona de comentarios

Esta extra aún no tiene comentarios.

Evaluación

Valoración de esta página: (extra.script.sudoku_resolutor) valor

Valoración evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar evaluar

Respuesta: Zona de mensajes (proceso de evaluación)

Listados: imágenes, categorías, etiquetas, extras | Anuarios: 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 | Otros enlaces: buscador