Descripción: Inicialización para el apunte "Sudokus de colores".
A continuación mostramos los apuntes asociados a este extra:
// 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 89 ocasiones.
Esta extra aún no tiene comentarios.
Valoración de esta página: (extra.script.sudoku_color)
Listados: imágenes, categorías, etiquetas, extras | Anuarios: 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024 | Otros enlaces: buscador