Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Serapis

#3221
Java / Re: Ayuda con codigo en java
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))
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:
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'...
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



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

Devuelve un array con los valores de la fila recibida.
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...
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
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:
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:
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.
#3222
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...
#3223
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).
#3224
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?)...
#3225
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....
#3226
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..."
#3227
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.
#3228

¿Qué día es el que está programado ir a las urnas, para 'fabricar' la "Madurocracia"?
#3229
Cita de: Orubatosu en 28 Julio 2017, 13:11 PM
y desde luego siempre, siempre pondría un cable, ya sea rojo o azul que si lo cortas desactivas la bomba.
Jajaja... a mi me han llegado a preguntar por esto mismo, algunos amigos y amigas (también estudié electrónica), si es que "hay alguna normativa que exija que los aparatos deban llevar los cables de esos colores", porque salvo ésa, no cabía otra posible explicación razonable...

Se lo debemos a la predecibilidad de los estadounidenses, causada por los 'formatos' que les gusta crear y seguir para abaratar costes, y así compran 'packs' a base de formatos... la retahila de tópicos es extensísima, desde el poli 'agresivo' divorciado de su mujer y con problemas de alcohol y compañerismo, hasta el "hay que proteger al presidente..."  :laugh: :laugh: :laugh: :laugh: :laugh: :laugh: :laugh: :laugh: :laugh:
#3230
Siiiii... no paran de subir precios... como legalmente no puede hacerse, sino someterse al contrato... la excusa de más gigas, es un cambio, una 'mejora' que si justifica legalmente un cambio de tarifa...

Ahora la lógica esclarece que el incremento de la subida, no está justificada (resulta desproporcionado) por subir 1,2,3 gigas más al mes.

...y así van tensando la goma hasta que reviente...

En fin es ridículo que gocemos de tarifa plana con la red en un PC o con wifi, por ejemplo, y en cambio los móviles, fuera de casa para los 'datos móviles' se rijan por límites ridículos a precios disparatados... total 10Gb. equivale poco más o menos a ver en streaming media docena de películas....