logoExtra: script.1001_sudokus

Descripción: Serie de funciones que ayudan a convertir un sudokus, obteniendo muchas variantes del mismo.


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

1001 sudokus
Empezamos con un sencillo ejemplo cuya miniatura hemos adjuntado a este párrafo de muy fácil resolución, y hemos terminado con una extensa lista de diferentes dificultades; pero hubiéramos podido obtener una lista mucho más amplia basándonos en ese primer ejemplo y simples modificaciones que iremos explicando.
// Descripción para sindicación:
/*
    [rss]Serie de funciones que ayudan a convertir un sudokus, obteniendo muchas variantes del mismo.[/rss]
*/
function inicio_1001_sudokus() {
    entrar_sudoku(sudo);
    poner_evento(tag("control_inverso"), "click", invertir);
    poner_evento(tag("control_traspuesta"), "click", trasponer);
    poner_evento(tag("control_izquierda"), "click", rotar_i);
    poner_evento(tag("control_derecha"), "click", rotar_d);
    poner_evento(tag("control_horizontal"), "click", reflejo_h);
    poner_evento(tag("control_vertical"), "click", reflejo_v);

    poner_evento(tag("CGF_1_2"), "click", CGF); // Cambio Grupo Filas
    poner_evento(tag("CGF_1_3"), "click", CGF); // Cambio Grupo Filas
    poner_evento(tag("CGF_2_3"), "click", CGF); // Cambio Grupo Filas
    poner_evento(tag("CGC_1_2"), "click", CGC); // Cambio Grupo Filas
    poner_evento(tag("CGC_1_3"), "click", CGC); // Cambio Grupo Filas
    poner_evento(tag("CGC_2_3"), "click", CGC); // Cambio Grupo Filas

    poner_evento(tag("CF_1_2"), "click", CF); // Cambio Grupo Filas
    poner_evento(tag("CF_1_3"), "click", CF); // Cambio Grupo Filas
    poner_evento(tag("CF_2_3"), "click", CF); // Cambio Grupo Filas
    poner_evento(tag("CC_1_2"), "click", CC); // Cambio Grupo Filas
    poner_evento(tag("CC_1_3"), "click", CC); // Cambio Grupo Filas
    poner_evento(tag("CC_2_3"), "click", CC); // Cambio Grupo Filas

    poner_evento(tag("CF_4_5"), "click", CF); // Cambio Grupo Filas
    poner_evento(tag("CF_4_6"), "click", CF); // Cambio Grupo Filas
    poner_evento(tag("CF_5_6"), "click", CF); // Cambio Grupo Filas
    poner_evento(tag("CC_4_5"), "click", CC); // Cambio Grupo Filas
    poner_evento(tag("CC_4_6"), "click", CC); // Cambio Grupo Filas
    poner_evento(tag("CC_5_6"), "click", CC); // Cambio Grupo Filas

    poner_evento(tag("CF_7_8"), "click", CF); // Cambio Grupo Filas
    poner_evento(tag("CF_7_9"), "click", CF); // Cambio Grupo Filas
    poner_evento(tag("CF_8_9"), "click", CF); // Cambio Grupo Filas
    poner_evento(tag("CC_7_8"), "click", CC); // Cambio Grupo Filas
    poner_evento(tag("CC_7_9"), "click", CC); // Cambio Grupo Filas
    poner_evento(tag("CC_8_9"), "click", CC); // Cambio Grupo Filas

    poner_evento(tag("resetear"), "click", reseteando);
    poner_evento(tag("comprobar"), "click", resolver_sudoku);
}

String.prototype.inverso = function()    {
    return this.split("").reverse().join("");
}

String.prototype.traspuesta = function()    {
    s = ["", "", "", "", "", "", "", "", ""];
    for (i = 0; i < 81; i++)
        s[i % 9] += this.charAt(i);
    return s.join("");
}

String.prototype.reflejo_horizontal = function()    {
    s = [];
    for (i = 0; i < 9; i++)
    s[i] = this.substr(i * 9, 9).inverso();
    return s.join("");
}

function texto(txt) {return document.createTextNode(txt)};
poner_evento(window, "load", inicio_1001_sudokus);
var sudo = "014500032369001004000000010007604090690087020020300000100800070000000008802400603";
function invertir()    {
    cadena = tag("form_sudoku").inicio.value.inverso();
    tag("form_sudoku").inicio.value = cadena;
    entrar_sudoku(cadena);
}

function trasponer()    {
    cadena = tag("form_sudoku").inicio.value.traspuesta();
    tag("form_sudoku").inicio.value = cadena;
    entrar_sudoku(cadena);
}

function rotar_d()    {
    cadena = tag("form_sudoku").inicio.value.traspuesta().reflejo_horizontal();
    tag("form_sudoku").inicio.value = cadena;
    entrar_sudoku(cadena);
}

function rotar_i()    {
    cadena = tag("form_sudoku").inicio.value.reflejo_horizontal().traspuesta();
    tag("form_sudoku").inicio.value = cadena;
    entrar_sudoku(cadena);
}

function reflejo_h()    {
    cadena = tag("form_sudoku").inicio.value.reflejo_horizontal();
    tag("form_sudoku").inicio.value = cadena;
    entrar_sudoku(cadena);
}

function reflejo_v()    {
    rotar_d();
    cadena = tag("form_sudoku").inicio.value.reflejo_horizontal();
    tag("form_sudoku").inicio.value = cadena;
    rotar_i();
}

function cambiar_grupo_filas(cadena, orden) {
    s = [];
    for (i = 0; i < 9; i++)
        s[i] = cadena.substr(i * 9, 9);
    a = (parseInt(orden.pop()) - 1) * 3;
    b = (parseInt(orden.pop()) - 1) * 3;
    for (i = 0; i < 3; i++)    {
        temp = s[(i + a)];
        s[(i + a)] = s[(i + b)];
        s[(i + b)] = temp
    }
    return s.join("");
}

function cambiar_filas(cadena, orden) {
    s = [];
    for (i = 0; i < 9; i++)
        s[i] = cadena.substr(i * 9, 9);
    a = (parseInt(orden.pop()) - 1);
    b = (parseInt(orden.pop()) - 1);
        temp = s[a];
        s[a] = s[b];
        s[b] = temp
    return s.join("");
}

function CGF()    {
    orden = this.id.split("_");
    desechar = orden.unshift();
    cadena = cambiar_grupo_filas(tag("form_sudoku").inicio.value, orden);
    tag("form_sudoku").inicio.value = cadena;
    entrar_sudoku(cadena);
}

function CGC()    {
    orden = this.id.split("_");
    desechar = orden.unshift();
    cadena = cambiar_grupo_filas(tag("form_sudoku").inicio.value.traspuesta(), orden).traspuesta();
    tag("form_sudoku").inicio.value = cadena;
    entrar_sudoku(cadena);
}

function CF()    {
    orden = this.id.split("_");
    desechar = orden.unshift();
    cadena = cambiar_filas(tag("form_sudoku").inicio.value, orden);
    tag("form_sudoku").inicio.value = cadena;
    entrar_sudoku(cadena);
}

function CC()    {
    orden = this.id.split("_");
    desechar = orden.unshift();
    cadena = cambiar_filas(tag("form_sudoku").inicio.value.traspuesta(), orden).traspuesta();
    tag("form_sudoku").inicio.value = cadena;
    entrar_sudoku(cadena);
}

function entrar_sudoku(cadena) {
    sudos = cadena.split("");
    for (i = 0; i < 9; i++)    for (j = 0; j < 9; j++)    {
        n = sudos.shift();
        poner = ("123456789".indexOf(n) == -1) ? " ": n;
        txt = texto(poner);
        with(tag("txt_" + i + "_" + j))
            if (hasChildNodes())
                replaceChild(txt, tag("txt_" + i + "_" + j).firstChild)
            else
                appendChild(txt)
    }
}

function reseteando()    {
    tag("form_sudoku").reset();
    entrar_sudoku(sudo);
}

function resolver_sudoku()    {

    function exito()    {
        alert("éxito");
        entrar_sudoku(sudoku);
        tag("form_sudoku").elements.inicio.value = sudoku;
    }

    function fracaso()    {
        alert("fracaso");
        entrar_sudoku(sudoku);
        tag("form_sudoku").elements.inicio.value = sudoku;
    }

    function resolver_casilla(i, j)    {
        cambio = false;
        s = arr_sudoku;

        fila = s[i];
        valor = fila.charAt(j);
        if ("123456789".indexOf(valor) == -1)    {
            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.push("123456789".charAt(_i));
            if (candidatos.length == 1)    {
                n = candidatos[0];
                arr_sudoku[i] = s[i].substr(0, j) + candidatos + s[i].substr(j + 1);
                tag("form_sudoku").elements.inicio.value = arr_sudoku.join("");
                tag("txt_" + i + "_" + j).replaceChild(document.createTextNode(n), tag("txt_" + i + "_" + j).firstChild);
                cambio = true;
                _solucion_.push({"x": i, "y": j, "números": candidatos});
            }
            else    {
                _descarte_.push({"x": i, "y": j, "números": candidatos});
            }
        }
        return cambio;
    } // function resolver_casilla(i, j)

    // resolver_sudoku()
    _marcas_ = [];

    terminado = false;
    sudoku = cadena = tag("form_sudoku").elements.inicio.value;
    arr_sudoku = [];
    for (i = 0; i < 9; i++)
        arr_sudoku[i] = cadena.substr(i * 9, 9);
    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    {
        _solucion_ = [];
        _descarte_ = [];
        do    {
            cambios = 0;
            for (i = 0; i < 9; i++)
                for (j = 0; j < 9; j++)    {
                    cambio = resolver_casilla(i, j);
                    cambios += (cambio) ? 1 : 0;
                    //terminado = terminado || cambio;
            }
        }    while (cambios > 0);
        if (tag("form_sudoku").elements.inicio.value.indexOf("0") == -1)    {
            terminado = true;
            exito();
        }
        else    {
            vale = true;
            for (i = 0, total = _descarte_.length; i < total; i++)
                if (_descarte_[i]["números"].length == 0)
                    vale = false;
            if (vale)    {
                _prueba_ = _descarte_.pop();
                _ns_ = _prueba_["números"];
                _n_ = _ns_.pop();
                s = arr_sudoku;
                i = _prueba_.x;
                j = _prueba_.y;
                arr_sudoku[i] = s[i].substr(0, j) + _n_ + s[i].substr(j + 1);
                estado = arr_sudoku.join("");
                tag("form_sudoku").elements.inicio.value = estado;
                tag("txt_" + i + "_" + j).replaceChild(document.createTextNode(_n_), tag("txt_" + i + "_" + j).firstChild);
                //alert("probando en (" + i + "," + j + ") valor: " + _n_);
                if (_ns_.length > 0)    {
                    _marcas_.push({"estado": estado, "x": i, "y": j, "números": _ns_});
                    //alert("i: " + i + "\nj: " + j);
                }
            }
            else    {
                if (_marcas_.length > 0)    { // probamos con otro candidato
                    _prueba_ = _marcas_.pop();
                    _ns_ = _prueba_["números"];
                    _n_ = _ns_.pop();
                    estado = _prueba_.estado;
                    for (i = 0; i < 9; i++)
                        arr_sudoku[i] = estado.substr(i * 9, 9);

                    s = arr_sudoku;
                    i = _prueba_.x;
                    j = _prueba_.y;
                    arr_sudoku[i] = s[i].substr(0, j) + _n_ + s[i].substr(j + 1);
                    estado = arr_sudoku.join("");

                    entrar_sudoku(estado);

                    if (_ns_.length > 0)        
                        _marcas_.push({"estado": estado, "x": i, "y": j, "números": _ns_});

                    tag("form_sudoku").elements.inicio.value = estado;
                    //terminado = confirm("Sudoku tal vez no válido...\ni: " + i + "\nj: " + j);
                }
                else    {
                    fracaso();
                    terminado = true;            }
                }
            }

    }    while (!terminado);
}

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

Zona de comentarios

Esta extra aún no tiene comentarios.

Evaluación

Valoración de esta página: (extra.script.1001_sudokus) 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