Foros del Web » Programando para Internet » Javascript »

Sudoku

Estas en el tema de Sudoku en el foro de Javascript en Foros del Web. Ultimamente por Microsiervos publican mucho un tipo de crucigrama numerico. El Sodoku. Empezó anunciándose en este articulo y ya ha tomado fama en la web: ...
  #1 (permalink)  
Antiguo 21/08/2005, 18:43
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años
Puntos: 45
Sudoku

Ultimamente por Microsiervos publican mucho un tipo de crucigrama numerico. El Sodoku.

Empezó anunciándose en este articulo y ya ha tomado fama en la web:
Han hecho consejos1 , consejos2, consejos3, y consejos4 para resolverlos.

La explicación de como se fabrican es facil para un humano. Para una maquina... He intentado hacer uno en javascript, pero me es algo complicado.
Cita:
Rellena la matriz de modo que:
cada fila,
cada columna
y cada caja de 3x3
contenga los números del 1 al 9.


Lo de los cuadrantes de 3x3 ya lo he pasado por alto, y ya me encuentro con dificultades. Es decir, mi script es solo para colocar numeros en un tablero. El numero en la casilla de columna Y y fila X no puede estar repetido ni en la columna Y, ni en la fila X. Tan sencillo como eso.

El script funciona, salvo en ciertas ocasiones, que se encuentra con casillas que no tiene la posibilidad de poner ningun numero.

El programa va fila por fila, y dentro de cada fila poniendo un numero en cada celda. Cuando va a empezar con la celda, tiene todas las posibilidades (si hablamos de un sodoku de 10x10 tiene las posibilidades 0,1,2,3,4,5,6,7,8,9). A partir de aqui elimina las no validas: Elimina todos los numeros que se encuentren en su fila, y todos los numeros que se encuentren en su columna. De manera que ya las posibilidades son por ejemplo 3,4,5,7,9. Aquí se escoge aleatoriamente un numero, se coloca y se pasa a la siguiente celda de la fila. Cuando acabemos con la fila, escogeremos otra fila para trabajar.

Hay ocasiones que el programa anula Todas las posibilidades, no puede poner numero, y entonces pone un '-1'.

Tengo la duda de qué hacer con esos -1. He pensado en intercambiar celdas, teniendo cuidado de no estropear nada pero... complicado.

El script es este:
Código PHP:
<style>
.
fila {
    
height:20px;
    
clear:both;
}
.
celda {
    
bordersolid 1px black;
    
text-align:center;
    
width20pxheight:20px;
    
font-size:10px;
    
font-family:tahoma;
    
float:left;
    
margin:2px;
}
</
style
Código PHP:
//dimension del Sodoku
var X=9;
//creamos el Sodoku rellenandolo con -1 todas sus casillas
var sodoku=new Array(X);
for(var 
a=0;a<X;a++) {
    
sodoku[a]=new Array(X);
    for(var 
b=0b<Xb++)
        
sodoku[a][b]=-1;
}

//inicializamos nums_posibles y filas. Serviran para escoger aleatoriamente las filas y los numeros
var nums_posibles=new Array(X);
for(var 
a=0a<Xa++) nums_posibles[a]=a;
var 
filas=new Array(X);
for(var 
a=0a<Xa++) filas[a]=a;

//busca un numero dentro de un array de numero
// y devuelve su indice. Si no lo encuentra devuelve -1
function numAt(arr,num,excepto) {
    for(var 
a=0a<arr.lengtha++)
        if( 
arr[a]==num )
            return 
a;
    return -
1;
}

//sin mas, mostrarlo por pantalla
function imprime_sodoku() {
    
document.write("<br>");
    for(var 
a=0;a<X;a++) {
        
document.write('<div class="fila">');
        for(var 
b=0;b<X;b++) {
            
document.write('<div class="celda" id="sodoku_'+a+'_'+b+'">'+sodoku[a][b]+'</div>');
        }
        
document.write('</div>');
    }
}

// EMPEZAMOS A RELLENAR
// recorreremos cada fila aleatoriamente, y la eliminaremos de la lista hasta que no queden filas:
while(filas.length>0) {

    
//Escogemos la fila actual: indice aleatorio de 'filas'
    
var iparseInt(Math.random()*filas.length);
    var 
fila=filas[i];
    
    
//eliminamos la fila de la lista para que no se repita
    
filas.splice(i,1);
    
    
//en cada celda de la fila actual coloquemos un numero, aleatorio de una lista, que no se encuentre ni en su fila ni en su columna
    
for(var a=0;a<X;a++) {    //por cada celda
        //hacemos una copia de nums_posibles para ir quitandole elementos
        
var nums=new Array(X);
        for(var 
b=0;b<X;b++) nums[b]=nums_posibles[b];
        
        
//quitemosle a nums todos los elementos de esta misma FILA (son todos los de su izquierda, a la dcha no hay elementos)
        
for(var b=0b<ab++) {
            
//indice del numero que vamos mirando (celda a celda) en nums
            
var esta=numAt(numssodoku[fila][b]);
            
//si esta lo borramos de la lista nums
            
if(esta!=-1)
                
nums.splice(esta,1);
        }
        
        
//quitemosle a nums todos los elementos de esta misma COLUMNA
        
for(var b=0b<Xb++) {
            
//indice del numero que vamos mirando (celda a celda) en nums
            
var esta=numAt(numssodoku[b][a]);
            
//si esta lo borramos de la lista nums
            
if(esta!=-1)
                
nums.splice(esta,1);
        }
        
        
//ahora en nums estan todos los numeros que realmente se podrian poner. Escogemos uno al azar:
        
var numnumsparseInt(Math.random()*nums.length) ];
        if(
num==undefinednum=-1;        //es una coincidencia, un error de probabilidad que debemos paliar.
        
sodoku[fila][a]=num;
        
    }

}

imprime_sodoku();







function 
rojo_los_menosUno() {
    for(var 
a=0;a<X;a++) {
        for(var 
b=0;b<X;b++) {
            if(
sodoku[a][b]==-1
                
document.getElementById("sodoku_"+a+"_"+b).style.backgroundColor="red";
        }
    }
}
rojo_los_menosUno(); 
Lo que hago al final con rojo_los_menosUno(), es colorear los '-1' para que se vean mejor, simplemente.


Está comentado, si hay alguna duda, posteadla.

¿Alguna idea para los '-1'? Y, mas importante, ¿Alguna idea para los cuadrantes de 3x3?

Es complicado... ¿verdad?
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #2 (permalink)  
Antiguo 22/08/2005, 17:40
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años
Puntos: 45
Mientras el script anterior me genera una pagina asi:

He conseguido crear esto:

A simple vista no tiene mucha diferencia. Pero en cuanto a programación sí. Éste ya diferencia los cuadros de 3x3, y además no deja utilizar el mismo numero en el mismo cuadrante. La piedra angular consiste en la creación del array. En vez de dos dimensiones, el array sodoku tiene cuatro dimensiones. Es decir, dos pares de coordenadas.

sodoku[caja_fila][caja_columna][celda_fila][celda_columna]

Asi es mas facil controlar en qué cuadrante nos encontramos.

Como sé que a nadie le apetece leerse un script de 500 paginas, lo he partido en cachitos mas entendibles:

Código PHP:
<style>
.
fila_celdas {
    
height:20px;
    
clear:both;
}
.
fila_cuadrantes {
    
height:62px;
    
clear:both;
    
text-align:center;
}
.
celda {
    
bordersolid 1px black;
    
text-align:center;
    
width20pxheight:20px;
    
font-size:10px;
    
font-family:tahoma;
    
float:left;
    
margin:0px;
}
.
caja {
    
width75pxheight:75px;
    
float:left;
    
text-align:center;
    
margin:0px;
}
</
style
La declaración de estilo CSS:
Es más engorrosa, pero define todo lo necesario para que queden formateados los divs sin necesidad de HTML de más. 'fila_cuadrantes' contiene un fila de 'caja', y 'caja' contiene 3 capas de 'fila_celdas', y 'fila_celdas' contiene a su vez 3 divs de 'celda'; creando asi la estructura deseada.

Código PHP:
var X=9;    // celdas de lado


//INICIALIZACION DEL ARRAY SODOKU (Array de 4 dimensiones)
var sodoku=new Array();        //contiene todas las cajas (X cajas)
for(var x=0;x<X/3;x++) {        //cajaX
    
sodoku[x]=new Array(X/3);
    for(var 
y=0;y<X/3;y++) {    //cajaY
        
sodoku[x][y]=new Array(X/3);
        for(var 
i=0n=0;i<3;i++) {        //celdaX
            
sodoku[x][y][i]=new Array(3);
            for(var 
j=0;j<3;j++) {    //celdaY
                
sodoku[x][y][i][j]=new Array(3);
                
sodoku[x][y][i][j]= -1//(n++)+x+y;
            
}
        }
    }
}
// asi el array queda sodoku[cajaX][cajaY][celdaX][celdaY]



//funcion document.write, no tan engorrosa y con opcion de salto <br />
function e(q,salto) { document.write(q); if(saltodocument.write("<br />"); }



// imprimimos la estructura HTML de divs para luego solo tener que poner los valores
for(var x=0x<X/3x++) {        //cajaX
    
e('<div class="fila_cuadrantes">');
    for(var 
y=0y<X/3y++) {    //cajaY
        
e('<div class="caja" id="caja_'+x+'_'+y+'">');
        for(var 
i=0;i<3;i++) {        //celdaX
            
e('<div class="fila_cajas">');
            for(var 
j=0;j<3;j++) {    //celdaY
                
e('<div class="celda" id="sodoku_'+x+'_'+y+'_'+i+'_'+j+'"></div>');
            }
            
e('</div>');
        }
        
e('</div>');
    }
    
e('</div>');
}
e("&nbsp;",1);


//actualiza los valores del array sodoku en la estructura de divs
function imprime_sodoku() {
    for(var 
x=0;x<X/3;x++)         //cajaX
        
for(var y=0;y<X/3;y++)     //cajaY
                
for(var i=0;i<3;i++)        //celdaX
                    
for(var j=0;j<3;j++)    //celdaY
                        
document.getElementById("sodoku_"+x+"_"+y+"_"+i+"_"+j).innerHTML=sodoku[x][y][i][j];

Inicialización, estructura HTML y funciones básicas:
Inicializa las variables y el array multidimensional 'sodoku'. Crea el HTML necesario (un par de divs) sin contenido. Define la funcion 'e' (para comodidad solamente (debug)), y la funcion 'imprime_sodoku' que se encarga de rellenar la estructura.

Código PHP:
/**************************************************************************/
// FUNCIONES GET_____

//nos devuelve un array con todos los elementos de una fila respecto a una celda
function getFila(x,y,i,j) {
    var 
dev=new Array();
    for(
_y=0_y<X/3_y++)        //fila de cajas
        
for(_j=0_j<X/3_j++)
            
dev.splice(dev.length0sodoku[x][_y][i][_j]);    //cogemos la fila entera de celdas
    
return dev;
}

//nos devuelve un array con todos los elementos de una columna respecto a una celda
function getColumna(x,y,i,j) {
    var 
dev=new Array();
    for(
_x=0_x<X/3_x++)        //columna de cajas
        
for(_i=0_i<3_i++)        // cada celda en la columna _j
            
dev.splice(dev.length0sodoku[_x][y][_i][j]);
    return 
dev;
}

//nos devuelve un solo array con la caja de la celda dada (solo tiene una dimension)
function getCaja(x,y) {
    var 
dev=new Array();
    for(
_i=0_i<3_i++)
        for(
_j=0_j<X/3_j++)
            
dev.splice(dev.length0sodoku[x][y][_i][_j]);
    return 
dev;

Funciones get___:
Las funciones get___ devuelven un array unidimensional de lo que se le pida. Asi es mas facil trabajar con los numeros que debemos excluir a la hora de colocarlos aleatoriamente en la estructura.

Código PHP:
/**************************************************************************/
// RELLENAR EL SODOKU


var nums_posibles=new Array(X);
for(var 
a=0;a<X;a++) nums_posibles[a]=a;

//busca un numero dentro de un array de numero
// y devuelve su indice. Si no lo encuentra devuelve -1
function numAt(arr,num) {
    for(var 
a=0a<arr.lengtha++)
        if( 
arr[a]==num )
            return 
a;
    return -
1;
}

//elimina del array 'total' todos los numeros del array 'posibilidades', y devuelve el nuevo 'total'
function eliminaPosibilidades(totalposibilidades) {
    for(var 
a=0a<posibilidades.lengtha++) {
        var 
esta=numAt(total,posibilidades[a])
        if( 
esta!=-1)
            
total.splice(esta,1);
    }
    return 
total;
}

//copia un array y lo devuelve
function copia(arr) {
    var 
dev=new Array();
    for(var 
a=0;a<arr.lengtha++)
        
dev[dev.length]=arr[a];
    return 
dev;
}




//rellenamos celda a celda
for(var x=0;x<X/3;x++)         //cajaX
    
for(var y=0;y<X/3;y++)  //cajaY
            
for(var i=0;i<3;i++)        //celdaX
                
for(var j=0;j<3;j++) {    //celdaY
                    
                    
e('sodoku['+x+']['+y+']['+i+']['+j+']: ');
                    var 
nums=copia(nums_posibles);
                    
nums=eliminaPosibilidades(numsgetFila(x,y,i,j) );
                    
nums=eliminaPosibilidades(numsgetColumna(x,y,i,j) );
                    
nums=eliminaPosibilidades(numsgetCaja(x,y) );
                    if(
nums.length!=0)    //nos hemos quedado sin numeros para poder poner
                        
sodoku[x][y][i][j]=numsparseInt(Math.random()*nums.length) ];
                    else
                        
sodoku[x][y][i][j]=-1;
                    
e("Posibilidades: "+nums+" --> <b>"+sodoku[x][y][i][j]+"</b>",1);
                    
                } 
Relleno aleatorio:
Como antes, nums_posibles es una matriz con todos los numeros del 0 al 9. La funcion 'numAt' es la que busca un numero en un array y devuelve su indice si lo encuentra. 'eliminaPosibilidades' borra del array total todos los elementos de 'posibilidades' si los encuentra (para excluir numeros posibles). La funcion 'copia' devuelve una copia del array pasado por argumento.
Después, [b]rellenamos[b]: Esto se hace mas legible que antes: Por cada celda se dan todas las posibilidades. A estas posibilidades iremos quitando los numeros que encontremos en su fila, su columna, y su cuadrante. Si nos quedamos sin numero por poner, colocamos el dichoso "-1".

Con un
Código PHP:
imprime_sodoku(); 
podremos ver el sodoku en pantalla, y ademas si hacemos al final
Código PHP:
//en rojo los "-1"
for(var x=0;x<X/3;x++)         //cajaX
    
for(var y=0;y<X/3;y++)  //cajaY
            
for(var i=0;i<3;i++)        //celdaX
                
for(var j=0;j<3;j++)    //celdaY
                    
if(sodoku[x][y][i][j]==-1)
                        
document.getElementById("sodoku_"+x+"_"+y+"_"+i+"_"+j).style.backgroundColor="red"
colorearemos de rojo los divs que contengan -1 para "cazarlos" mejor.


Bueno, el resultado lo he puesto antes:

Ahora me queda arreglar el "-1", que creo que lo voy a intentar por atributos HTML. A ver si me sale y lo puedo postear completo.

__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #3 (permalink)  
Antiguo 22/08/2005, 17:46
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años
Puntos: 45
Una ultima interrupción, me he dado cuenta que en este script si se refrescan muchas veces puede darse la remota casualidad de no existir fallos, no haber "-1", consiguiendo el Sodoku perfectamente generado:



Pero bueno, como el objetivo es que cada generación sea perfecta, intentare perfeccionar el script.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #4 (permalink)  
Antiguo 22/08/2005, 19:57
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años
Puntos: 45
Mmm, veo cuasi-imposible arreglar esos "-1", y mucho menos evitarlos. Asi que como he visto que tras varios intentos el sodoku sale perfecto (tras muuchos intentos, a veces puede que 20 o más), pues he decidido hacer un bucle iterativo: hasta que el Sodoku no salga perfecto, que lo vuelva a intentar.

El codigo completo es el siguiente:

Código PHP:
<html>

<
head>
<
title>SODOKU (version final)</title>

<
style>
.
fila_celdas {
    
height:20px;
    
clear:both;
}
.
fila_cuadrantes {
    
height:62px;
    
clear:both;
    
text-align:center;
}
.
celda {
    
bordersolid 1px black;
    
text-align:center;
    
width20pxheight:20px;
    
font-size:10px;
    
font-family:tahoma;
    
float:left;
    
margin:0px;
}
.
caja {
    
width75pxheight:75px;
    
float:left;
    
text-align:center;
    
margin:0px;
}
</
style>

</
head>
<
body>

<
script>


var 
X=9;    // celdas de lado


//INICIALIZACION DEL ARRAY SODOKU (Array de 4 dimensiones)
var sodoku=new Array();        //contiene todas las cajas (X cajas)
for(var x=0;x<X/3;x++) {        //cajaX
    
sodoku[x]=new Array(X/3);
    for(var 
y=0;y<X/3;y++) {    //cajaY
        
sodoku[x][y]=new Array(X/3);
        for(var 
i=0n=0;i<3;i++) {        //celdaX
            
sodoku[x][y][i]=new Array(3);
            for(var 
j=0;j<3;j++) {    //celdaY
                
sodoku[x][y][i][j]=new Array(3);
            }
        }
    }
}
// asi el array queda sodoku[cajaX][cajaY][celdaX][celdaY]



//funcion document.write, no tan engorrosa y con opcion de salto <br />
function e(q,salto) { document.write(q); if(saltodocument.write("<br />"); }



// imprimimos la estructura HTML de divs para luego solo tener que poner los valores
e('<div id="estado"><h2>Generando...</h2> Espere unos instantes...<br><br></div>');
for(var 
x=0x<X/3x++) {        //cajaX
    
e('<div class="fila_cuadrantes">');
    for(var 
y=0y<X/3y++) {    //cajaY
        
e('<div class="caja" id="caja_'+x+'_'+y+'">');
        for(var 
i=0;i<3;i++) {        //celdaX
            
e('<div class="fila_cajas">');
            for(var 
j=0;j<3;j++) {    //celdaY
                
e('<div class="celda" id="sodoku_'+x+'_'+y+'_'+i+'_'+j+'"></div>');
            }
            
e('</div>');
        }
        
e('</div>');
    }
    
e('</div>');
}
e("&nbsp;",1);


//actualiza los valores del array sodoku en la estructura de divs
function imprime_sodoku() {
    for(var 
x=0;x<X/3;x++)         //cajaX
        
for(var y=0;y<X/3;y++)     //cajaY
                
for(var i=0;i<3;i++)        //celdaX
                    
for(var j=0;j<3;j++)    //celdaY
                        
if( (c=sodoku[x][y][i][j])==-1)
                            
document.getElementById("sodoku_"+x+"_"+y+"_"+i+"_"+j).innerHTML="-";
                        else
                            
document.getElementById("sodoku_"+x+"_"+y+"_"+i+"_"+j).innerHTML=c;
}

/**************************************************************************/
// FUNCIONES GET_____

//nos devuelve un array con todos los elementos de una fila respecto a una celda
function getFila(x,y,i,j) {
    var 
dev=new Array();
    for(
_y=0_y<X/3_y++)        //fila de cajas
        
for(_j=0_j<X/3_j++)
            
dev.splice(dev.length0sodoku[x][_y][i][_j]);    //cogemos la fila entera de celdas
    
return dev;
}

//nos devuelve un array con todos los elementos de una columna respecto a una celda
function getColumna(x,y,i,j) {
    var 
dev=new Array();
    for(
_x=0_x<X/3_x++)        //columna de cajas
        
for(_i=0_i<3_i++)        // cada celda en la columna _j
            
dev.splice(dev.length0sodoku[_x][y][_i][j]);
    return 
dev;
}

//nos devuelve un solo array con la caja de la celda dada (solo tiene una dimension)
function getCaja(x,y) {
    var 
dev=new Array();
    for(
_i=0_i<3_i++)
        for(
_j=0_j<X/3_j++)
            
dev.splice(dev.length0sodoku[x][y][_i][_j]);
    return 
dev;
}

/**************************************************************************/
// RELLENAR EL SODOKU


var nums_posibles=new Array(X);
for(var 
a=0;a<X;a++) nums_posibles[a]=a;

//busca un numero dentro de un array de numero
// y devuelve su indice. Si no lo encuentra devuelve -1
function numAt(arr,num) {
    for(var 
a=0a<arr.lengtha++)
        if(
arr[a]==num)
            return 
a;
    return -
1;
}

//elimina del array 'total' todos los numeros del array 'posibilidades', y devuelve el nuevo 'total'
// si posibilidades es un numero, no un array, tambien puede hacerlo
function eliminaPosibilidades(totalposibilidades) {
    if(
typeof posibilidades=="number") {
        var 
esta=numAt(total,posibilidades);
        if(
esta!=-1)
            
total.splice(esta,1);
    }
    else {
        for(var 
a=0a<posibilidades.lengtha++) {
            var 
esta=numAt(total,posibilidades[a]);
            if(
esta!=-1)
                
total.splice(esta,1);
        }
    }
    return 
total;
}

//copia un array y lo devuelve
function copia(arr) {
    var 
dev=new Array();
    for(var 
a=0;a<arr.lengtha++)
        
dev[dev.length]=arr[a];
    return 
dev;
}



function 
relleno() {

    var 
hayMenosUno=false;
    
    
//rellenamos de "-1":
    
for(var x=0;x<X/3;x++)         //cajaX
        
for(var y=0;y<X/3;y++)  //cajaY
                
for(var i=0;i<3;i++)        //celdaX
                    
for(var j=0;j<3;j++)    //celdaY
                        
sodoku[x][y][i][j]= -1;
    
    
//rellenamos celda a celda
    
for(var x=0;x<X/&& !hayMenosUno;x++)         //cajaX
        
for(var y=0;y<X/&& !hayMenosUno;y++)  //cajaY
                
for(var i=0;i<&& !hayMenosUno;i++)        //celdaX
                    
for(var j=0;j<&& !hayMenosUno;j++) {    //celdaY
                        
                        
var nums=copia(nums_posibles);
                        
nums=eliminaPosibilidades(numsgetFila(x,y,i,j) );
                        
nums=eliminaPosibilidades(numsgetColumna(x,y,i,j) );
                        
nums=eliminaPosibilidades(numsgetCaja(x,y) );
                        if(
nums.length!=0)    //nos hemos quedado sin numeros para poder poner
                            
sodoku[x][y][i][j]=numsparseInt(Math.random()*nums.length) ];
                        else
                            
hayMenosUno=true;
                        
                    }
                    
    
imprime_sodoku();
        
    if(
hayMenosUno) {
        
document.getElementById("estado").innerHTML="<h2>Generando...</h2> Espere unos instantes...<br><br>";
        
setTimeout("relleno()"50);
    }
    else {
        
document.getElementById("estado").innerHTML="<h2>Su sodoku</h2>Su Sodoku esta listo.";
    }
    
}
relleno();


</script>


</body>

</html> 
Se irá generando (lo he agilizado mucho creo, en cuanto detecta el error ya no sigue) hasta conseguir el perfecto.

Mi idea es una vez este generado el sodoku, dar la opcion de jugar a esa tabla en una nueva ventana. Se pasaria el juego entero mediante un formulario (metodo POST, supongo) a una ventana nueva.

El caso es que no tengo ni idea de cuántas celdas tengo que ocultar ni mostrar para que sea posible su resolución


Un saludete!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:04.