elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


  Mostrar Mensajes
Páginas: 1 ... 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 [373] 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 ... 432
3721  Programación / Java / Re: Ayuda con codigo en java en: 31 Julio 2017, 22:21 pm
Una imagen para hacernos una idea de qué hablamos...


En la imagen puedes apreciar:
A - Una fila
B - Una columna
C - Un bloque

Hay 9 filas, 9 columnas y 9 bloques, es fácil contrarlos.
Cuando digo que necesitamos 3 arrays, son uno para guardar los valores de una fila dada, otro para una columna dada y otro para un bloque dado... los 3 son de 9 elementos, porque 9 son las casillas que tienen, aunque el array va del 0 al 8.
------------------------------

Así cuando digo este pseudocodigo:
Código:
TmpFila = GetValoresEnFila(Entero Y)  
TmpColumna = GetValoresEnColumna(Entero X)
TmpBloque = GetValoresEnBloque(Entero X, Entero Y)

Me estoy refiriendo a 3 funciones distintas que reciben uno o dos parámetros y devuelven un array... en la siguiente imagen vemos que datos deberían devolver estas 3 funciones, con más claridad.


He marcado un circulito en la casilla que queremos rellenar, al caso es la posición:
X= 5
Y = 5

- Bien si llamo a la función GetvaloresEnFila (x), me debe devolver un array con los valores en la fila x (fila 5), el array siempre será de 9 elementos, y los valores (en este orden) serán: 3,7,8,1,4,0,0,0,0 y se almacena en el array tmpFila
- Cuando llame a la función GetValoresEncolumna(y), me debe devolver un array con los valores en la columna y (columna 5), el array siempre será de 9 elementos, y los valores (también en el orden en que aparecen) serán: 9,4,5,3,7,0,0,0,0 y se almacena en el array tmpColumna
- Finalmente cuando llame a la función GetValoresEnBloque(x,y), me debe devolver un array con los valores que contiene el bloque que contiene la casilla que le paso. La casilla puede ser cualquiera en el bloque. La función debe calcular cual es la posición dx y dy donde se localiza la primera casilla de dicho bloque, a partir de ahí lee 3 casillas, aumenta una fila y lee otras 3 aumenta otra fila y lee las 3 últimas... el bloque se compone de 3 filas de las cuales toma 3 columnas. Así los valores que devuelve en orden serán: 9,8,3,  6,2,7,  1,4,0 y se almacenan en el array tmpBloque

En la imagen he seleccionado, la fila, columna y bloques afectados, por tanto un modo de ver que las funciones operan bien es verificar que en efecto devuelven correctamente esos valores.  Nota también como los valores de las casillas vacías devuelve un 0, es la forma de identificar que una casilla está libre.
Lógicamente todos los valores que vamos alamcenando van a para a un array de 81 elementos (9x9), un array unidimensional, pero podrías hacerlo bidimensional (aunque las explicaciones del pseudocódigo dado están pensadas para un array unidimensional. al caso es lo mismo. Uno debe ser capaz de traducir de un array unidimensional a uno bidimensional y viceversa, son matemáticas de suma, resta, multiplicación y división, además de módulo.

Y para qué necesitamos estos arrays de valores. Bueno tu eliges al azar un valor del 1 al 9, y luego verificas que no esté en la fila, la columna y el bloque, pero las más de las veces ya estará, así que de nuevo tendrás que pedir otro valor al azar entre 1 y 9 y será muy lento, tanto más cuanto más cerca de estar completo esté el sudoku.

Aquí la forma de ser más inteligentes es primero recoger qué valores están... (ya lo hemos hecho con esas 3 funciones en sendos arrays), lo siguiente es unificar los 3 arrays en uno solo... es decir eliminar los valores repetidos, así la función UnificarCubiculos, hace esto mismo.
Y cómo lo hace. básicamente se crea un array cuyos índices 1,2,3,4,5,6,7,8,9 serán contadores del valor cuyo índice son. es decir cuando en uno de los arrays aparezca por ejemplo tmpFila(3) = 9 entonces en el unificado se hsumará uno al índice 9 tmpUnificado(9) +=1 pero no podemos poner directamente 9, ya que dicho valor está contenido en el array, o lo pasamosa  una variable:
v = tmpfila(3)  // 'v' vale 9 en este caso
tmpUnificado(v) +=1
o bien lo hacemos directamente sin una varible auxiliar:
tmpUnificado(tmpFila(3)) +=1
Haciendo lo mismo con todo el array tmpFila, tmpColumna, tmpBloque tendremos al final el array con estos valores de cuenta (valores reales obtenidos de la imagen):
tmp(1) = 2
tmp(2) = 1
tmp(3) = 3
tmp(4) = 3 //aparece 3 veces, una en la fila, otra en la columna y otra en el bloque.
tmp(5) = 1
tmp(6) = 1
tmp(7) = 3
tmp(8) = 2
tmp(9) = 2
Obviamente algunos están contados más de una vez, según que formen parte 8por ejemplo) de una fila y una columna, o una columna y un bloque o un bloque y la fila, o incluso de los 3 arrays. No importa, queremos saber cuales aparecen y si hay más de 1 vez aparecen.
Luego este array lo simplificamos para que no sea el índice, si no el valor quien refleje su presencia (al final el valor estará el el mismo índice, pero eso no nos importará luego).
Por eso se hace un bucle de reasignaciónde valores:
Código:
bucle para k desde 1 a 9
  si tmp(k) Es mayor que 0 luego
     tmp(k) = k // tmp(1) = 1 .... tmp(5)= 5 ... tmp(9) = 9
  fin si
fin bucle
Esta parte no es estrictamente necesaria, pero es buena práctica a la hora de optimizar, uno puede hacer luego algo de 'código espagueti' siempre y cuando lo entienda... el array de salida, nos sería válido tanto antes como después de este último bcle, solo sería cuestión de en la siguiente función interpretarlo correctamente, para evitar equívocos, hacemos que el valor sea lo importante... por so el bucle final.

Ahora ya hemos únificado los 3 arrays en 1 sólo. y el resumen es que el array contiene todos los valores que están presentes en la fila, columna o bloque a la que la casilla x,y hace referencia.

Lo siguiente entonces es generar un array con los valores que faltan. Para ello con el array de salida de la función UnificarCubiculos (tu ponle el nombre que te dé la gana, siempre que te oriente con su significado), es el parámetro de entrada para la función: TomarAusentes
Da la casulaidad de que en este punto hemos llegado a una situación de bloqueo. Luego te explico por qué...

Ahora mismo tengo que hacer unas cosas, así que envío esto aunque no esté terminado y luego (2-3 horas) pongo otra imagen sin bloqueo y sigo explicando (a partir de ella) y detrás la situación de bloqueo, por qué se produce y la solución para salir adelante...


Editado para reponer las imágenes que parece que la página web las ha eliminado... (afortunadamente las guardaba en la misma carpeta donde hice el programa).
3722  Programación / Java / Re: Ayuda con codigo en java en: 31 Julio 2017, 15:19 pm
Ok, te lo explicaré más sencillo, con palabras ..y dibujitos, pero entonces será a la tarde, ahora(después de comer, tengo el tiempo muy justo) no tengo tiempo para hacer los dibujitos y escribir las explicaciones.
3723  Foros Generales / Noticias / Re: Primera sentencia contra un político por bloquear a un ciudadano en Facebook en: 31 Julio 2017, 02:20 am
A veces se les va "la pinza" a los jueces...

Una red social (como Facebook), ofrece perfiles y éstos seas cuales sean son personales incluso aunque se utilicen de forma profesional.

Si un político decide bloquear a un 'usuario', sus razones tendrá. Y desde luego no es 'atentar contra el derecho a expresión', toda vez que la red social no pertenece al gobierno, ni es una página que el gobierno mantenga o tenga contratada y luego cedida en uso al político en cuestión.

Por tanto su pagina es personal y tiene todo el derecho del mundo a bloquear a quien le salga de los GÜ3V05, y por la razón que le salga de los mismos GÜ3V05 ...que a fin de cuentas, vendrá a ser la misma razón que tiene cualquiera...
3724  Programación / Java / Re: Ayuda con codigo en java en: 30 Julio 2017, 23:20 pm
Sin revisar el código a fondo, parece que el problema del bucle infinito es porque en efecto trata de elegir 'al azar' un número donde solo existe una posibilidad de elección y resulta que esa elección ya está presente. Tal y como te comenta footer.

De entrada, no hace falta que busques el 9º número al azar, busca solo los 8 primeros, el 9º será el número que reste de la serie, así evitas el bucle infinito.
Y ahora que termina la segunda fila (y siguientes, pero no para la primera) debes verificar si verticalmente también existe conincidencia (y en cada uno de los 3 bloques implicados) en cuyo caso descarta de nuevo la fila actual y la regeneras al azar hasta que se valide, así vas avanzando con cada fila....

--------------------
Sin embargo el método, no es adecuado, vas a tirar mucho de azar para lograr cada Sudoku...
Un modo más inteligente es mantener con claridad 3 arrays para decidir entre qué números debe elegirse al azar.
tú ahora estás en la casilla x,y, pués rellenas 3 arrays (que serían Fila(), Columna(), Bloque()... (ver más abajo el pseudocódigo para la función de ejemplo para obtener el array de Fila: GetValoresEnFila))
Código:
TmpFila = GetValoresEnFila(Entero Y)  //solo pongo el psedocodigo para esta función, comprendiendo ésta es fácil deducir como han de ser las otras dos funciones...
TmpColumna = GetValoresEnColumna(Entero X)
TmpBloque = GetValoresEnBloque(Entero X, Entero Y)

Esos 3 arrays con los valores actuales en la fila, columna y bloque (si un valor no está tendrán valor 0), se deben luego unificar en uno solo array resumen donde aparezcan cada valor existente una sola vez
Ver más abajo la función (aquí la llamada con los 3 arrays como parámetros y la devolución de uno resumido:
Código:
Tmp = UnificarCubiculos(TmpFila, TmpColumna, TmpBloque)

Entonces llamas a una función preguntan do para ser rellenado con los valores ausentes, pasándole como entrada ese array unificado:
Presentes, es el array resultado de 'unificarCubiculos'...
Código:
Array Byte = Funcion TomarAusentes(Array Byte Presentes(), Out Entero NumAusentes)
    Array tipo Byte V(0 a c_Ocho)
    Entero k

    NumAusentes=0
    Bucle para k desde 1 a c_Nueve
        Si (Presentes(k) = 0) luego   // El valor está vacío como casilla, en fila, columna y bloque... se añade
            V(NumAusentes) = k
            NumAusentes +=1
        Fin si
    Fin Bucle

    Devolver V        
Fin Funcion


Código:
Array Byte Sudoku(0 a 80)  //es el array que mantiene internamente los valores. 

Devuelve un array con los valores de la fila recibida.
Código:
Array Byte = Funcion GetValoresEnFila(Entero n)
    Array tipo Byte V(0 a c_Ocho)
    Entero Index, k

    Index= (n * c_Nueve)
    n = 0 // Reutilizamos n (se recibe por valor)
    Bucle para k desde Index a (Index + c_Ocho)
        V(n) = Sudoku(k)  //Aray que contiene los valores
        n +=1
    Fin Bucle
  
    Devolver V
Fin Funcion

l array 'resumen', simplemente toma todos los valores distintos presentes, sin repetición...
Unificando así los 3 arrays en uno de resumen...
Código:
Array Byte = Funcion UnificarCubiculos(Array Byte Fila(), Array Byte Columna(), Array Byte Bloque())
    Array tipo Byte V(0 a c_Nueve)

    // contar el número de presencias de cada valor...
    Bucle para k desde 0 a c_Ocho
        Si (Fila(k) > 0) luego   // Si no está vacía la casilla...
            V(Fila(k)) += 1
        fin si
        Si Columna(k) > 0 luego   // Si no está vacía la casilla...
            V(Columna(k)) += 1
        fin si
        Si (Bloque(k) > 0) luego   // Si no está vacía la casilla...
            V(Bloque(k)) += 1
        fin si
    Fin Bucle
  
    // Ahora se reagrupan arriba en el array (las ausencias (valor 0), quedan 'huecas' en la parte alta del array.
    V(0) = 0 //Realmente no es necesario, ya que no llevó la cuenta de 'ceros'
    Bucle para k desde 1 a c_Nueve
        Si (V(k) > 0) luego
            V(k) = k            
        Fin si
    Fin Bucle

    Devolver V        
Fin Funcion


Así el orden de estas funciones para tomar UN VALOR al azar sería, la siguiente función:
X,Y representan la casilla donde deseamos poner el valor
  no se verifica que x e y estén en el rango correcto, se supone que son correctos,
  que fueron verificados, antes de llamar aqui
Código:
Byte = funcion SeleccionarValorAzar(Entero X, Entero Y) 
    Array tipo Byte TmpFila()
    Array tipo Byte TmpColumna()
    Array tipo Byte TmpBloque()
    Array tipo Byte Tmp()
    Array tipo Byte Azar()

    // Primero consultamos que tenemos, en la 'vecindad' de esa casilla.
    //      Puede optimizarse si se mantienen en memoria 9 arrays de filas, 9 de columnas y los 9 de bloques y se actualizan convenientemente. Será mas veloz, pero más complejo y másgasto de memoria... Hacerlo, queda a tu esfuerzo si te interesa.
    // Recuérdese que las casillas 'vacías', tienen valor 0
    TmpFila = GetValoresEnFila(Entero Y)
    TmpColumna = GetValoresEnColumna(Entero X)
    TmpBloque = GetValoresEnBloque(Entero X, Entero Y)

    // Ya tenemos, los 3 cubículos con los que comparar el valor al azar... pero...
    // ya dije que no vamos a comparar, en su defecto, integraremos los 3 en 1 ( a modo de resumen, que simplica
    // por completo la verificación a un simple bucle).
    Tmp = UnificarCubiculos(TmpFila, TmpColumna, TmpBloque)

    // Ahora rellenamos otro array con los valores ausentes en el array resumen unificado.
    Byte n
    Azar = TomarAusentes(Tmp, n)

    // OJO: si el array queda vacío implica que hay que desecha los valores actuales de la fila y volver a reconstruirla entera
    Si (n=0) luego devolver 0

    // Finalmente se toma un valor al azar entre 0 y n-1, que representa el indice del array Azar. Este array tiene exclusivamente los números que no aparecen ni en la fila, ni en columna, ni en bloque.
    k = Aleatorio( entre 0 y n-1)

    Devolver Azar(k)
Fin Funcion

La función que rellena el sudoku entero sería algo como esto:
Código:
Funcion RellenarSudokuAlAzar()    
    Entero Fila, columna
    Byte Valor

    Fila=0 // la primera fila, la podrías obtener al azar completamente en ese caso marcar aquí 1, para comenzar en la fila 1, la 0 no va a requerir todas las comprobaciones que pueden requerir las siguientes.
    Hacer  '// esto es fila, puede ser un bucle que va de 0 a 8
        Columna = 0
        Hacer    
            Valor = SeleccionarValorAzar(Columna, Fila)  //la función que obtiene un valor de cada vez.
            Si (Valor>0) luego
                Sudoku((Fila * c_Nueve) + Columna) = valor //Sudoku() es el array que mantiene internamente los valores.    
                // Si el array es bidimensional se pondría así...    
                //Sudoku(Columna, Fila) = valor    
                Columna +=1
            Si no
                // Borra los valores de la fila actual
                Bucle para k desde 0 a columna
                    Sudoku((Fila * c_Nueve) + k) = 0
                Fin bucle
                Columna = 0
            Fin si
        Repetir Mientras (Columna <9)
        Fila +=1
    Repetir Mientra (Fila<9)
Fin Funcion

c_Ocho, c_Nueve son constantes con esos valores que en este juego se van a usar muy a menudo. Igualmente constantes para 2 y 3 podrían ser usadas, para las consultas en los bloques.



--------------------------------------------------------------------------------------------------------------
p.d.: Actualizo la funcion para rellenar el Sudoku, para salir del bache ante bloqueos...
Fijarse en los cambios añadidos para Intentos, cuando el valor devuelto es 0.
Si se va dibujando desde esta función cuando sale un valor y se borra cuando se anulan los valores, se ve sobre la marcha como opera , se detiene y rada un poco en algunas filas, y a veces borra también la previa y luego sale del bache y lo completa siempre...

La función que rellena el sudoku entero sería algo como esto:
Código:
 Funcion RellenarSudokuAlAzar()    
    Entero Fila, columna
    Byte Valor, Intentos

    Fila=0 // la primera fila, la podrías obtener al azar completamente en ese caso marcar aquí 1, para comenzar en la fila 1, la 0 no va a requerir todas las comprobaciones que pueden requerir las siguientes.
    Hacer  '// esto es fila, puede ser un bucle que va de 0 a 8
        Intentos = 0
        Columna = 0
        Hacer   
            Valor = SeleccionarValorAzar(Columna, Fila)  //la función que obtiene un valor de cada vez.
            Si (Valor>0) luego
                Sudoku((Fila * c_Nueve) + Columna) = valor   //Sudoku() es el array que mantiene internamente los valores.             
                Columna +=1
            Si no
                // Borra los valores de la fila actual
                Bucle para k desde 0 a columna
                    Sudoku((Fila * c_Nueve) + k) = 0
                Fin bucle

                // Tras 10 intentos en la misma fila, borramos también la fila previa
                Intentos += 1
                Si (Intentos = 10) luego
                    Si (Fila > 0) luego  // no podemos retroceder a filas más atrás que la primera.
                        Fila = (Fila - 1) // Borramos también la fila anterior (y si sucede otra vez, la previa, etc...)
                        Bucle para k desde 0 To c_Ocho
                            Sudoku((Fila * c_Nueve) + k) = 0                           
                        Fin Bucle
                    Fin si
                    Intentos = 0
                Fin si
                Columna = 0
            Fin si
        Repetir Mientras (Columna <9)
        Fila +=1
    Repetir Mientra (Fila<9)
Fin Funcion
// Al término de esta función se podría dibujar los valores en el tablero para verificar visualmente el resultado.
3725  Foros Generales / Noticias / Re: 48 millones robados en un mes: por qué Ethereum es el nuevo paraíso de los .... en: 30 Julio 2017, 03:25 am
Claro, las criptomonedas tienen dos grandes enemigos: Uno externo y otro interno.

- El externo, son claramente los bancos y los gobiernos que verían perder el control del movimiento del dinero...
- El interno, es precisamente la irreal seguridad que ofrece. Mientras la seguridad de las criptomonedas no sea infalible (o se aproxime), no debieran ver la luz más que de forma experimental (es decir monedas virtuales falsas, solo para ejecutar y probar, siendo un sandbox completo), también es la razón de que va a tardar en ser implantado masivamente por recelo precisamente de esto, de la seguridad... y cada noticia de robos de este tipo aleja o espanta a posibles interesados.

Hay problemas menores, pero no tienen la preocupación ni la problemática de estas dos mencionadas...
3726  Foros Generales / Noticias / Re: Apple se ve obligada a retirar las VPN de la App Store en China al ser .... en: 30 Julio 2017, 03:18 am
Para los chinos, parece ser que la solución habrá de ser 'satélites VPN', con conexión directa sin intermediación de ningún proveedor local...

Hay muchos chinos multimillonarios, incluso varios de ellos, podrían formar parte de la lista Forbes si no fueran tan 'ocultos'... falta saber si alguno de ellos también es un altruista librepensador, que por encima de todo busque la libertad de sus conciudadanos (y fabrique y ponga en órbita un satélite de comunicaciones para el caso).
3727  Foros Generales / Foro Libre / Re: Que ha pasado exactamente en Venezuela esta vez??? en: 30 Julio 2017, 03:12 am
Ok. Gracias engel lex... entonces es todavía peor.

Es equivalente a cuando en España se convocó un referéndum para decidir si España participaría en la OTAN o no (ya estaba dentro, así que era más bien para si alía o se quedaba), al final la pregunta no fue: ¿Quieres que España permanezca en la OTAN (ya estaba dentro)?, la pregunta era tendenciosa y finalmente fue (de memoria): ¿Aceptarías que España siga perteneciendo en la OTAN siempre y cuando no forme parte de su estructura militar?.
Es decir al final no se votaba si sí o si no, España saldría de la OTAN, se votaba por si 'te gustaba' los términos de participación.... una tomadura de pelo, llevada a cabo por el partido socialista...

Con el paso de los años, incluso se pasó por alto el resultado del referéndum, pués formó parte de la OTAN también en la estructura militar (en realidad para qué querría la OTAN a un país miembro de la OTAN si no formara parte de la estructura militar?)...
3728  Programación / Programación General / Re: ¿Que tipo de VPS seleccionar para ejecutar 100 hilos? en: 29 Julio 2017, 23:34 pm
En un procesador de sobremesa, es un error pretender arrancar 100 hilos simultáneos.

Dado la cantidad de cores del procesador, el resto será procesado paralelo simulado, es decir cesión de tiempos y recursos compartidos. Luego si no va a ser paralelo real, tampoco hay necesaidad de crear 100 hilos con sus respectivo consumo. es preferible que crees solo 2,4,6 y que internamente seas tú quien vaya rotando entre procesos. El resultado final será más óptimo de esta manera (salvo que lo programes muy mal), ya que en un momento dado, cada proceso en marcha tendrá a su disposición la casi totalidad de recursos (la memoria reservada por los procesos comenzados ya está ocupada). Incluso sería más óptimo realizarlos en serie, cuando uno acabe que inice otro, así si solo hay 4 hilos, la memoria está disponible para 'repartir' entre 4 procesos, no para 'repartir' entre 100...

Si existe la necesaidad real de que deban ser paralelos porque realizan tareas en tiempo real, entonces lo razonable es disponer de una red de ordenadores y que uno actúe de servidor repartiendo las tareas entre el resto....
3729  Foros Generales / Foro Libre / Re: Que ha pasado exactamente en Venezuela esta vez??? en: 29 Julio 2017, 23:25 pm
No sabe uno como acertar...

Lo ideal es que fuera un fracaso total. Pero en ese caso todavía podría ocurrir dos cosas, un tongo electoral o peor, sacar las tropas a la calle y aprobarlo por la fuerza.

Había un dicho antiguo que decía algo como: "el enemigo sin palabra, debe ser muerto o matado, porque no admite otra forma posible..."
3730  Foros Generales / Noticias / Re: iRobot afirma que podría vender los planos de casas obtenidos por los roomba en: 29 Julio 2017, 19:33 pm
Una empresqa eu fabrica maquinas para realizar un trabajo en casa de alguien, y precisa tomar ciertos datos para realizar su labor de forma óptima, no está legitimada de ninguna manera sobre la posesiónde esos datos. no digo ya siquiera meercadear con ellos.

No es distinto de alguien (pongamos un fontanero) que acude a la residencia de alguien a arreglar un problema con las tuberías y graba toda la casa con una cámara, supuestamente para localizar las tuberías, por donde van y tal y al terminar vende los planos de la casa a quien sea (pongamos un ladrón).

Incluso yo veo ilegal al hecho no de recopilar los datos por parte de la máquina, si no de que estos sean transferidos a parte alguna. Si la maquinita (me resulta imposible llamar robot a algo que deba ser programado), necesita recoger datos para hacer su labor, éstos jamás deberían salir del aparato, incluso estando internamente deberian ser inaccesibles o al menos cifrados...

Es obvio que si ese tipo está pensando en vender datos (que no son suyos, y nunco la han sido), es porque las maquinitas transfieren dichos datos al fabricante.

Si yo fuera juez, solo por ese anuncio, ya lo metía en la cárcel, porque al hacerlo está asumiendo el espionaje indiscriminado y sin permisos de ningún tipo.
Páginas: 1 ... 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 [373] 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 ... 432
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines