logoExtra: script.sudoku_color

Descripción: Inicialización para el apunte "Sudokus de colores".


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

Sudokus de colores
¡Lo que faltaba...! Sudokus de colores...
// Descripción para sindicación:
/*
    [rss]Inicialización para el apunte "Sudokus de colores".[/rss]
*/

arr_sudoku = [];
function inicio_sudoku_colores() {
    cargar_sudokus_colores();
    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", comprobar_sudoku);
    poner_evento(tag("resolver"), "click", resolver_sudoku);

    poner_evento(tag("entrada_secreta"), "click", entrada_manual);

    for (i = 1; i < 10; i++)
        poner_evento(tag("color_" + i), "click", activar_color);
    for (i = 0; i < 9; i++)    for (j = 0; j < 9; j++)
        poner_evento(tag("casilla_" + i + "_" + j), "click", entrada_color);

}

function entrada_manual()    {
    entrada = prompt("entrar sudoku manualmente:");
    vale = sudokar(entrada);
    if (vale)    {
        entrar_sudoku(entrada);
        tag("form_sudoku").elements.inicio.value = entrada;
    }
    else    alert("El sudoku no es válido.");
}

function entrada_color() {
    id = this.id;
    coleta = id.substr(8);
    xy = coleta.split("_");
    sudoku = document.forms.form_sudoku.inicio.value;
    valores = sudoku.split("");
    posi = parseInt(xy[0]) * 9 + parseInt(xy[1]);
    valores[posi] = color_actual;
    document.forms.form_sudoku.inicio.value = valores.join("");
    tag("casilla_" + coleta).style.fill = paleta[color_actual - 1];
}

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_sudoku_colores);
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);
}

var paleta = ["red", "blue", "green", "yellow", "aqua", "lime", "pink", "darkorange", "magenta"];
color_actual = 1;
function entrar_sudoku(cadena) {
    casillas = cadena.split("");
    for (i = 0; i < 9; i++)    for (j = 0; j < 9; j++)    {
        n = casillas.shift();
        poner = ("123456789".indexOf(n));
        if (poner == -1)
            tag("casilla_" + i + "_" + j).style.fill =
                (((parseInt(i / 3) + parseInt(j / 3)) % 2) == 0) ? "white":"#abcabc"
        else
            tag("casilla_" + i + "_" + j).style.fill = paleta[poner];
    }
}

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

function activar_color(){
    color_actual = parseInt(this.id.substr(6));
    tag("color_activo").style.fill = paleta[color_actual - 1]
}

function comprobar_sudoku()    {
    sudoku = tag("form_sudoku").elements.inicio.value;
    vale = sudokar(sudoku);
    if (vale) alert("sudoku:\\n" + vale)
    else alert("El sudoku no es válido.");
}

function sudokar(cual)    {
    arr_sudoku = [];
    sudoku = cual;

    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);
                sudoku = arr_sudoku.join("");
                cambio = true;
            }
            else    {
                _descarte_.push({"x": i, "y": j, "números": candidatos});
            }
        }
        return cambio;
    } // function resolver_casilla(i, j)

    
    _marcas_ = [];
    terminado = false;
    if (sudoku.length > 81)
        sudoku = sudoku.substr(0, 81)
    else
        while (sudoku.length < 81)
            sudoku += "0";

    for (i = 0; i < 9; i++)
        arr_sudoku[i] = sudoku.substr(i * 9, 9);

    do    {
        _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;
            }
        }    while (cambios > 0);

        if (sudoku.indexOf("0") == -1)    {
            return sudoku;
        }
        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("");
                if (_ns_.length > 0)    {
                    _marcas_.push({"estado": estado, "x": i, "y": j, "números": _ns_});
                }
            }
            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("");
                    if (_ns_.length > 0)        
                        _marcas_.push({"estado": estado, "x": i, "y": j, "números": _ns_});
                    sudoku = estado;
                }
                else    {
                    return false;
                }
            }
        }
    }    while (!terminado);
}

function resolver_sudoku()    {
    vale = sudokar(tag("form_sudoku").elements.inicio.value);
    if (vale)    {
        tag("form_sudoku").elements.inicio.value = vale;
        entrar_sudoku(vale);
    }
    else    {
        alert("fracaso");
    }
}

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

Zona de comentarios

Esta extra aún no tiene comentarios.

Evaluación

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