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:
// 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 88 ocasiones.
Esta extra aún no tiene comentarios.
Valoración de esta página: (extra.script.1001_sudokus)
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