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

#1381
CitarLa Red, al fin y al cabo, nunca fue diseñada para ser segura, cuenta Kaminsky en este vídeo. Solo querían que funcionase. «Era el terreno de juego de un puñado de frikis como nosotros y luego todos vosotros os apuntasteis», indica. Pero «ahora la responsabilidad de todo recae en nosotros porque la economía global depende de internet».
1 - No. Internet fue un diseño de la DARPA, al que luego dieron acceso, primero a las Univesidades y luego al resto del mundo...
2 - No. La responsabilidad recáe única y exlusivamente en aquellos que tiene el poder de hacer cambios en la red...

...y para aquellos que tienen tanto recelo a Microsoft, creo que ya es ahora de que cambien o al menos sumen a sus recelos a Google que actualmente es mil veces más monopolista de lo que jamás fuera Mocosoft...
#1382
Los números pseudoaleatorios, son eso, pseudoaleatorios. Tampoco implica que sean predecibles. No obstante cuando uno crea una función con números pseudoaleatorios, y especialmente cuando es con vistas a la seguridad, debe verificarse que lo son, es decir deberá crearse exprofeso otras funciones que pongan de manifiesto la aleatoriedad que arroja la función creada... por lo que habría que hacer como digo varias funciones de análisis para descubrirlo.

Al final todo ese trabajo extra puede o no merecer el esfuerzo de realizarlo, cada uno decide en que emplea su tiempo...

Por eso yo te he sugerido partir de funciones que en principio no poseen aleatoriedad (usan una tabla de traducción) pero que partiendo de su trabajo, dos funciones con 'funcionalidad' igual, generan para una misma clave valores distintos... pasado por un bucle amplía la clave lo suficiente, como para luego reunir una clave que ahora sí será pseudoaleatoria sin necesidad de perder tiempo en verificarlas al hacer un xor entre ambas escisiones de la clave...
Más aún si crees que partiendo de sendas funciones arrojaran similitudes que pudieran explotarse (ya digo yo que no, pero no voy a perder tiempo en demostrarlo), todavía podías partir de la misma clave para cada función pero en una con la inversión de la clave:


A = Base64(clave)
B = UUEncode(stringReverse(clave))  // 'Reverse' la clave...

Bucle 1 a 3
  A = Base64(A)
  B = UUEncode(B)
Siguiente
Key = f(A Xor B)    // esta expresión, denota una función que realiza el xor entre cada elemento del array como se explicaba más arriba.
ContenidoCifrado = f(ContenidoClaro xor Key)   //Idem "   "  "            "


Recuerda que la fuerza de un algoritmo, debe recaer en sus procedimientos, en el diseño y no en el secretismo del procedimiento, pues eso implicaría que conocido el procedmiento, la seguridad quedaría rota.
La operación "XOR" provee el secreto, la seguridad universal en programación... porque X xor Y, arroja 256 posibles distintas combinaciones entre 'X' e 'Y', exactamente las mismas combinaciones que hay de 'X' y de 'Y' sueltas. Luego, por cada carácter contenido, la combinaciones posibles se multiplican por 256. XOR, no ofrece facilidades ni pistas a ese respecto...
A pesar de los tan cacareados procesadores cuánticos, frente a un cifrado XOR, no tiene nada que hacer... serán incapaces de hacer nada más allá de lo que ya sabemos, que puede ser cualquiera de las 256 posibilidades, pero no sabrá por ningún medio cual de ellas es. Un ordenador cuántico podría eos si probar (por fuerza bruta en paralelo) chorrocientos millones de combinaciones pero sin resultados positivos... Si hemos interceptado un mensaje y el procesador cuántico ha trabajado sobre él, y sabemos (pongamos por espionaje) incluso que el contenido del mensaje tiene el nombre de uno que vende secretos de la empresa, el ordenador cuántico solo podrá ofrecer nombres, pongamos que todavía sabemos que el nombre es de tan solo 4 letras... ningún ordenador cuántico tendrá la capacidad de decibilidad sobre cual es la verdad, solo arrojaría resultados que alguien podría decir... si hay trabajadores en la empresa con ese nombre, luego lo añadiría a la lista de posibles: "Juan", Luis", "Pepe", "Coco", "Sara"... pero a fin de cuenta es algo que ya sabíamos sin usar el ordenador cuántico (el 'espía' dijo que: "...era el nombre de alguien de la empresa y que se compone de 4 letras..."), luego el uso de un ordenador cuántico, no nos revela nada que no supiéramos o pudiéramos obtener sin él...
...a la operación XOR, se la P3L4N los ordenadores cuánticos...
Lo mismo no es válido, ni aplicable para algoritmos basados por ejemplo en pesudo primos gigantes... pués ahí la fuerza radica casi exclusivamente en la fuerza de cálculo, algo que para un procesador cuántico, si estaría al alcance (siempre será cosas de más o menos potencia, de más o menos tiempo).

Piensa un número del 1 al 100... a ver si un ordenador cuántico puede decirte cual has pensado?. Eso es lo que hace XOR, básicamente. Desde el inicio se sabe que es un valor en el rango dado, peor nada ofrece capacidad para determinar de cual se trata, siempre podrá probarse por fuerza bruta las combinaciones una a una... claro siempre que tu dés por válido que el que tiene que adivinar el número que pensaste pueda darte 100 posibles respuestas...
Ahí es donde el diseños de los sistemas fallan, entre intento e intento debería existir siempre una espera forzada, una espera como un parpadeo que para un humano es tiempo inpreceptible, para un ordenador capacitado para procesar milooneso dentro de 10 años 100 veces más, haría que no hubiera diferencia entre operar con un ordenador de los 70 que pudiera procesar una combinación cada lapso, o 100 trillones de combinaciones en el mismo lapso, porque tras una combinación el sistema te hace esperar 300 ms. luego el tiempo empleado para probar por fuerza bruta x combinaciones sería para todos los equipos el mismo... sin importar la potencia de procesamiento del hardware.
es por ello que los algoritmos de verificación de cifrado, son (probablemente) los únicos, que deben ser diseñador sin eficiencia alguna, de hecho, como digo hasta debieran forzar (por hardware), una espera...

Mi recomendación es que uses XOR con claves pseudolaeatorias y te dejes de pamplinas que lo que harán solo es complicarte las cosas, perder tiempo en ello, para acabar no siendo más eficaces... Y al caso, dado que la seguridad final depende del propio usuario con la clave que introduzca, centra tus esfuerzos en los puntos 1a, 1b y 1c, que te señalé más arriba, que admeás es algo enormemente sencillo de acometer. Debajo te pongo un pseudocódigo para cometer esos 3 pasos... así lo tendrás más fácil aún.
...pero bueno, entiendo que a la gente le gusta seguir la corriente de moda... por eso los 'procesadores cuánticos', la 'biotecnología en materia de seguridad' comparten las mismas necedades que la 'inteligencia artificial', mucho bombo y platillo donde sacar tajada de los ingenuos con promesas, solo promesas... que se acaban estrellando contra la irrespetuosa realidad.



Esto es solo una muestra para 3 requisitos, puede ser más complejo, peor como mínimo habría que exigirse esto... queda a tu entera libertad modificarlo a justarlo a tus necesidades.

Rechazar y solicitar nueva clave mientras se cumpla alguno de estos 3 requisitos:
1 - No permitir una contraseña menor de x caracteres (tú decides el límite menor).
2 - Si el mínimo son x caracteres, no permitir menos de x/3 de caracteres distintos.
3 - No permitir la presencia deun carácter en la contraseña de más de 1/5 de veces del tamaño de la clave.

// constantes:
SIZE_CLAVE_MIN =10           //10 caracteres mínimo de largo?, para Requisito 1
ENTROPIA_MIN = 3               // 1/3 del largo de clave, para Requisito 2
REDUNDANCIA_MAX = 25      // 25% del largo de clave. 1/5, para Requisito 3

enumeracion ResultadoCheckeo
   CIFRADO_METODOS_IGUALES = -5        // Los 2 metodos elegidos deben ser distintos. Base64 y UUEncode (por ejemplo)
   CIFRADO_CLAVE_CORTA = -4            // La clave no alcanza el mínimo de caracteres requeridos.
   ' -3 es la suma de -1 y -2
   CIFRADO_REDUNDANCIA_EXCESIVA = -2   // Hay caracteres muy repetidos...
   CIFRADO_ENTROPIA_ESCASA = -1        // Hay poca diversidad de caracteres
   CIFRADO_AUSENTE = 0                 // La clave y/o el contenido están vacíos.
   CIFRADO_OK = 1                      // Cifrado procesado satisfactoriamente.
fin enumeracion


resultadoCheckeo  = Funcion VerificarClave(array de bytes Clave)
   arrayde bytes Chars(0 a 255)
   entero i, n  
   resultadoCheckeo rc = CIFRADO_AUSENTE  // = 0

   i = Clave.Tamaño
   Si (i > 0)
       Si (i >= SIZE_CLAVE_MIN)              // Verificación del requisito: 1
           // contar la presencia de cada carácter... en la clave
           bucle para k desde 0 hasta i-1
               n = Clave(k)
               Chars(n) += 1        
           Next
           
           Si CheckDistintos(Chars, i) = FALSO         // Verificación del requisito: 2
               rc = CIFRADO_ENTROPIA_ESCASA
           Fin si

           // nótese que estos 2 requisitos no son excluyentes entre sí, si no que se aunan, pueden darse los dos casos a la vez... por eso están seriados y no de forma alternativa.
           Si CheckRedundancia(Chars, i) = FALSO             // Verificación del requisito: 3
               rc = (rc + CIFRADO_REDUNDANCIA_EXCESIVA)
           Fin si
           
           Si (rc = CIFRADO_AUSENTE)   // pasó los requisitos ?
               rc = CIFRADO_OK
           Fin si
       sino
           rc = CIFRADO_CLAVE_CORTA
       fin si
   // sino:  devolver valor 0
   //    rc = CIFRADO_AUSENTE
   fin si

   devolver rc
fin funccion


// Cuenta cuantos valores distintos hay y verifica si más o menos de 1/3 del total de 'size'.
//  Size indica el tamaño original de la clave.
// Por ejemplo si la clave tiene 9 caracteres, debe estar compuesta por al menos 4 caracteres distintos.
buleano = Funccion CheckDistintos(array de bytes Chars(), entero Size)
   entero k, distintos
   
   Bucle para k desde 0 hasta 255
       Si (Chars(k) > 0)
           distintos +=  1
       Fin si
   Siguiente
   
   Devolver ((distintos > (Size \ ENTROPIA_MIN)))
fin funcion

// Verifica si hay algún carácter que aparezca más de un 25% del total de 'size'.
//  Size indica el tamaño original de la clave.
// Por ejemplo si la clave tiene 16 caracteres ningún carácter puede aparecer más de 4 veces (pero si 4).
buleano = funccion CheckRedundancia(array de bytes Chars(), entero Size)
   entero k,  repes
   
   // hay que redondear al entero superior... revisar el redondeo pués es dependiente del lenguaje usado.
   // Asegurarse con claves de por ejemplo 10 caracteres, el 25% serían 2'5, si redonde a 2 en vez de a 3, sería (quizás) muy exigente... con claves más largas ese redondeo arriba o abajo no resulta tan tiquismiquis.
   repes = (Size / (100 / REDUNDANCIA_MAX) + 1)
   Bucle para k desde 0 hasta 255
       Si (Chars(k) > repes) devolver FALSO
   Siguiente
   
   Devolver TRUE
fin Funcion


Si la funcion 'VerificarClave' devuelve el valor CIFRADO_OK (1), ha pasado los requisitos exigidos, proceder al cifrado, si no enviar un mensaje acorde al valor devuelto...

Funcion MensajeDeError(resultadoCheckeo Codigo)
   string s

   Seleccion de caso para Codigo
       Caso 1; s = "Cifrado procesado satisfactoriamente."
       caso 0; s = "La clave y/o el contenido están vacíos."
       caso -1; s = "Hay poca diversidad de caracteres (por ejemplo: 'perrppeeperr')."
       Caso -2; s = "Hay caracteres muy repetidos (por ejemplo: 'lacalabazafantasma')."
       caso -3; s = "Hay poca diversidad de caracteres (por ejemplo: 'perrppeeperr').
                    Y También hay caracteres muy repetidos (por ejemplo: 'lacalabazafantasma')."
       Caso -4; s = "La clave no alcanza el mínimo de caracteres requeridos (" + SIZE_CLAVE_MIN + ")."
       caso -5; s = "Los 2 métodos elegidos deben ser distintos."
       Resto de casos // No hay mensajes de error para otros códigos.
   fin seleccion
   
   mostrar al usuario el mensaje s
fin Funcion


...ya tienes casi la mitad del código hecho...  :silbar: :silbar: :silbar: :silbar:

por cierto, esta conversación no pinta nada en la sección de foro libre, trata un tema que versa el foro, de programación y más concretamente sobre seguridad, así que debería moverse a la sección de seguridad o mejor al de programación.



P.DA: Para el interés general...
Darse cuenta lo que hace una simples y conocidas funciones:
La clave de entrada son 12 caracteres A, se pone un bucle recibiendo como entrada la salida anterior:

BASE 64:
AAAAAAAAAAAA
QUFBQUFBQUFBQUFB
UVVGQlFVRkJRVUZCUVVGQg==
VVZWR1FsRlZSa0pSVlVaQ1VWVkdRZz09
5E9:5U(Q1G-2;%I383!P4U9L5F%1,5975FMD4EIZ,#D`


UUENCODE:
AAAAAAAAAAAA
04%!04%!04%!04%!
,#0E(3 T)2$P-"4A,#0E(0``
+",P12@S(%0I,B10+2(T02PC,$4H,&!@
*R(L4#$R0%,H)3!)+$(Q,"LR*%0P,E!#+"0T2"PF(4 `


Como se ve, después de la primera codificación, va perdiendo la redundancia (y ganando entropía), luego un XOR al final entre ambas salidas, no puede ofrecer pista alguna de que originalmente fueren 12 'A's...
Todavía el algoritmo siempre puede complicarse tanto como se quiera, a base de usar más funciones distintas o usarlo de forma ligeramente diferente, por ejemplo:
... pude hacerse 3 codificados con una función y una última vez con otro... he aquí el resultado y el pseudocódigo de este ejemplo:

Base 64:
...
VVZWR1FsRlZSa0pSVlVaQ1VWVkdRZz09
y ahora esta salida con UUencode:
5E9:5U(Q1G-2;%I383!P4U9L5F%1,5975FMD4EIZ,#D`

UUEncode:
...
+",P12@S(%0I,B10+2(T02PC,$4H,&!@
y ahora esta salida con Base64:
KyIsUDEyQFMoJTBJLEIxMCsyKFQwMlBDLCQ0SCwmIUA=


A= Base64(clave)
A = Base64(A)
A = Base64(A)
A = UUEncode(A)

B = UUEncode(reverseString(clave))
B = UUEncode(B)
B = UUEncode(B)
B = Base64(B)

Key = f(A Xor B)    // esta expresión, denota una función que realiza el xor entre cada elemento del array como se explicaba en un mensaje más arriba.


Incluso cada ampliación podría ser aplicada con un algoritno distinto...
Por ejemplo si la primera fuera un:
A = HEX(clave)
Ya tendríamos una clave del doble de largo, luego un hex como primera fase, si la clave es menor de x caracteres no sería mala idea...
#1383
De entrada, como la gente suele arrojar contraseñas demasiado cortas y a veces tontas, recomiendo una primera etapa de requisitos:

Rechazar y solicitar nueva clave mientras se cumpla alguno de estos 3 requisitos:
1a No permitir una contraseña menor de x caracteres (tú decides el límite menor).
1b Si el mínimo son x caracteres, no permitir menos de x/3 de caracteres distintos.
1c No permitir la presencia de más de 3 veces para un carácter en la contraseña.



2a Usar un algoritmo de ampliación de la contraseña. al caso suele ser útil una fase de 'binario a texto', es decir considerar la contraseña entrada como si fuera binario y convertirlo a texto.. básicamente se está pidiendo usar funciones del tipo Base64, Base85, etc... que para una contraseña de x tamaño el resultado es una contraseña de un 133% más larga (caso del Base64 o UUEnconde, por ejemplo).
2b Desordenar la contraseña. Usa dos caracteres (los dos iniciales, dle medio, si osn del final asegúrate que no son predecibles, por ejemplo los algoritmos binario a texto, suelene usar padding al final, con lo que esos caracteres suelen repeirse con cierta frecuencia) del resultado previo. Y haz una resta entre ellos y modulas así el comienzo de la clave. Esto es, se trata de cortar (como si fueran cartas cortando el mazo), para no empezar con el primer carácter de la clave. Ejemplo (supongamos que como resultado de 2a tenemos): Aguila  (largo clave=6 caracteres) l-a (si sale negativo la resta, ignora el signo antes de calcular el modulo.
ix inicio = ((108-97) modulo 6) = (11 mdulo 6) =5
Así ahora es como si la contraseña fuera laAgui



3a Al llegar aquí digamos que tenemos la contraseña A. ahora partiendo del punto 1c, aplicar a ese valor en 1c, un algoritmo distinto para 2a, tras 2b tendríamos la contraseña B
3b Ahora metería una etapa XOR, entre A y B (dos claves distintas que en origen eran la misma).
Y listo, no tienes que hacer nada más, incluso aunque una contraseña originalmente fuere: "abcdefghijklmn", quedará rota...



4a Ahora cifra con Xor el texto en claro con la contraseña que sale de 3b. Si el contenido a cifrar es demasiado largo, yo ampliaría (paso 2a) la clave para obtener una contraseña aún más larga...
yo por ejemplo, en mis cifrados suelo crear una clave ampliada de al menos 1Mb. (en realidad es elegible y nunca tiene ese tamaño exacto, simplemente es un algoritmo recursivo que para cuando supera dicha cantidad, el cortado no lo hago físicamente simplemente 'recuerda' el índice como punto de comienzo para el paso 4).
4b Si el destino es fichero toca guardarlo a fichero, si el destino es un lugar para imprimir, hay que tener en cuenta que la salida es en binario (XOR, lo fuerza), luego procede una fase final Binario a texto.



Un sencillo ejemplo:
Omito los requisitos 1a,1b y 1c para ilustrar el ejemplo.
Texto a cifrar: "aaaaaaaaaaaa bbbbbbbbbb ccccccccc abcdefghijklmn"
Clave: "aaabbbccc"
A: (paso 2a aplicando base64 a la clave): YWFhYmJiY2Nj
B: (paso 2a aplicando UUEncode a la clave): 86%A8F)B8V-C
Repito el paso 2a 2 veces más a cada resutado:
ciclo2:
A2: YWFhYmJiY2Nj ---> WVdGaFltSmlZMk5q
B2: 86%A8F)B8V-C ---> .#8E03A&*4(X5BU#
ciclo3:
A3: WVdGaFltSmlZMk5q ---> V1ZkR2FGbHRTbWxaTWs1cQ==
B3: .#8E03A&*4(X5BU# ---> +B,X13 S028J-"A8-4)5(P``

Así finalmente quedan: 24 caracteres de clave (si no son simétricas las funciones 2a, es decir que son algoritmos que crean diferente tamaño, toma el tamaño de la menor y cortas el excedente de la más grande antes de seguir)...
Nota que A y B a quí son A3 y B3, ya qye el subíndice solo era indicativo del ciclo aplicado un bucle...
Es decir sería algo como:

A = clave
B = clave
bucle 1 a 3
  A = Base64(A)  
  B = UUEncode(B)
siguiente

A = V1ZkR2FGbHRTbWxaTWs1cQ==
B = +B,X13 S028J-"A8-4)5(P``

Aplicamos paso 2b sobre los caracteres iniciales:
Indice para A: j = (('V' - '1') modulo 24) = ((86 - 49 ) mod 24 ) = 13
Indice para B: k = (('+' - 'B') modulo 24) = ((43 - 66) mod 24 ) = 23

A = xaTWs1cQ==V1ZkR2FGbHRTbW
B = `+B,X13 S028J-"A8-4)5(P`
(corto, pero solo por claridad, no es preciso hacerlo físicamente porque luego se opera en un bucle al que puedes indicarle el punto de inicio de cada una):

En estos bucles haces un xor con ambas claves. Posiblemente arroje valores binarios, por lo que poner aquí el resultado al no ser valores imprimibles, no se vería bien... lo omito pues.

size = clave.largo  (24 en el ejemplo)
j = 13
k = 23
bucle para x desde 0 hasta size -1
   clave(x) = A(j) xor B(k)
   j = (j+1) mod size
   k = (k+1) mod size
siguiente


El resultado es la clave para aplicar finalmente al texto en claro mediante xor, la clave se aplica repetidamente si se alcanza su final hasta completar el cifrado de todo el texto (o de un fichero)....  

size2 = texto.largo
j = 0
bucle para k desde 0 hasta size2-1
   texto(k) = texto(k) xor clave(j)
   j = (j +1) mod size
siguiente


Ya tienes el texto cifrado... será binario, por lo que procede es guardarlo a fichero si se ha de imprimir, pués por contener caracteres no imprimibles, debería pasar por una fase final binarytotext


string = Funcion BinaryToText( array bytes X, tipofuncion y)
  Si y=0 //aume por ejemplo Base64
       devolver Base64(x)
  Si y= 1 // asume por ejemplo UUencode
       devolver UUEncode(x)
  Si y = ...
       .... otras funciones que tuvieres...
  fin si
fin funcion


p.d.: Pequeña corrección:
Había puesto: clave(x) = clave(j) xor clave(k)
Cuando debiera ser: clave(x) = A(j) xor B(k)
#1384
El tema es más complejo...

Yo soy zurdo, doblemente surdo...

Por ejemplo, no me basta con usar los botones del ratón intercambiados, como le pasa a la mayoría de zurdos, yo además necesito cambiar el movimiento de la marcha... cuando desplazo físicamente el ratón a la izquierda el puntero debe avanzar a la derecha y viceversa, (lo mismo si es en vertical).

En mi opinión esto tiene que ver con el momento del nacimiento (no me refiero al momento del alumbramiento, si no al del desarrollo antes de considerarse siquiera un feto)... durante el proceso de división celular... cuando se van duplicando como un papel que está enormemente doblado y se va desplegando... considero que de alguna manera los individuos (y no necesariamente y exclsuivamente los zurdos), detienen la división celular en algún punto, pero puede que otros en uno o dos despliegues más (seguramente en zonas específicas)... aunque quizás la razon sea más primitiva, y suceda que en alguna fase un despligue quede rotado (vertical y/o horizontalemente), luego el resto de despliegues se harán 'normal' lo que lleva a que algunas cosas queden reflejadas en la parte opuesta (hay gente que tiene el corazón a la derecha en vez de a la izquierda).
Un modo de sensarlo es doblar un papel perfectamente a la mitad varias veces, luego hacer un agujero en alguna parte del papel... y luego cuando se despliega, se verá el agujero atravesando por cada pliegue (original)... reflejando que dichas zonas estuvieron en algún momento ubicadas en un punto bidimensional equivalente...

... con "ésto", además explicaría el rollo ese de la acupuntura que suponen también una reflexología en diferentes partes del cuerpo.
Yo a veces he posido comprobar como al arrascarte en una zona muy precisa tengo una sensación en otra parte alejada del cuerpo, cesas y cesa la sensación continúas y contínua... pero lamentablemente no es cada vez que me dé la gana probarlo, solo determinados momentos, sin control de ello...(o quizás sea cosa d euna precisión zonal muy concreta)
Supongo que si alguien se tomara la gran molestia de ir anotando a lo largo de su vida todo ello, después de muchos años podrían sacarse conclusiones más o menos fidedignas, aunque todavía quedaría la duda de si las mismas zonas serían aplicables para todos o son particulares para cada uno, o un punto intermedio ciertas znas serían comunes para todos y otros particulares a cada uno, o bien ser general pero cada cual tener sus propias excepciones distintas al resto.
#1385
Java / Re: Recorrer array
23 Septiembre 2019, 00:50 AM
Te pongo una sencilla solucion en pseudocodigo, a ti te toca pasarlo luego al lenguaje de tu interés, lo que solo te será posible si alcanzas a entenderlo correctamente (espero que si). con culaquier duda, pregunta...

entero = funcion X(array entero Valores, entero Valor)
   entero indice, suma, resultados

   indice =0
   suma = 0
   bucle para k desde 0 hasta valores.fin
       suma += valores(k)

       Hacer mientras (suma > valor)
           suma -= valores(indice)  // retira el valor sumado por el indice inicial
           indice +=1  
       Repetir

       Hacer mientras (suma = valor)  // ok, imprimir indices
           imprimir indice y k
           suma -= valores(indice)  // retira el valor sumado por el indice inicial
           indice +=1                    // indice 'consumido', se pasa al siguiente.
           resultados +=1
       repetir
   siguiente

   devolver resultados
fin funcion


Ejemplo para el array: (5, 5, 2, 3, 7, 0, 7, 8, 7, 0, 4, 8, 7, 3, 9, 8, 0, 9, 3, 5, 7, 3, 5, 4, 2)
con valor: 27
Resultados: 7
02-07 ::::  2 + 3 + 7 + 0 + 7 + 8  = 27
07-11 ::::  8 + 7 + 0 + 4 + 8  = 27
11-14 ::::  8 + 7 + 3 + 9  = 27
12-15 ::::  7 + 3 + 9 + 8  = 27
16-21 ::::  0 + 9 + 3 + 5 + 7 + 3  = 27
17-21 ::::  9 + 3 + 5 + 7 + 3  = 27
18-23 ::::  3 + 5 + 7 + 3 + 5 + 4  = 27



Con tu array: (6, 7, 5, 4, 3, 1, 2, 3, 5, 6, 7, 9, 0, 0, 1, 2, 4, 1, 2, 3, 5, 1, 2)
y el valor que diste: 13
Resultados: 8
00-01 ::::  6 + 7  = 13
02-05 ::::  5 + 4 + 3 + 1  = 13
03-07 ::::  4 + 3 + 1 + 2 + 3  = 13
09-10 ::::  6 + 7  = 13
12-19 ::::  0 + 0 + 1 + 2 + 4 + 1 + 2 + 3  = 13
13-19 ::::  0 + 1 + 2 + 4 + 1 + 2 + 3  = 13
14-19 ::::  1 + 2 + 4 + 1 + 2 + 3  = 13
18-22 ::::  2 + 3 + 5 + 1 + 2  = 13



Este algoritmo a diferencia del que ofrece EdePC, no precisa volver a sumar todo cada vez... es lineal, solo suma vada indice del array una vez, por tanto es más óptimo en cuanto a rendimiento.

p.d.: Me acabo de acordar que hace 2-4 días, dijsktra publicó en el foro de C, un problema muy similar, solo que aquél versaba de la diferencia entre pares de valores en un array (ordenado)... a dicha solución puede llegarse modificando el presente algoritmo... aunque es lo suficientemente distinto, como para empezar desde cero.
#1386
Citar... por que no vas a un centro de alquiler de maquinas de obras y alquilas esta máquina que necesitas por un día o dos, o los que la necesites???
Es lo que te iba a decir...

Cuando necesitas una máquina que sea efectiva, pero no quieres comprarla orque no vas a darle un uso intensivo, ni extensivo (en el tiempo), la opción de alquiler es la mejor de todas...
Seguramente por tu zona habrá multitud de empresas de "alquiler de maquinaria", aunque claro, una herramienta como esa, posiblemente no esté disponible en todas partes, así que tocaría armarse de paciencia, hacerse con una lista de empresas de alquler de maquinaria, e ir llamando para preguntar si la tienen...

Mejor al preguntar llámala "máquina eléctrica que es como una espátula 'gigante' para retirar baldosas de plástico y moquetas que están pegadas al suelo", para ir sobre seguro... la que te señale que la tiene le pides precio de alquiler por día, calcula al menos 1 o 2 días por cada habitación sin ser un experto...

Lo mejor sería alquilarla una fin de semana (un viernes tarde, por ejemplo), probar en una habitación y si te da tiempo para las dos, mejor, y si no... pués te tocará volverla a alquilar otro fin de semana para la otra habitación... eso si, primero prueba con la habitación que 'menos te interese', así cuando le cojas la habilidad de uso, te quedará mejor la que necesites que quede mejor..

Seguramente no quede al 100% perfecto, pero sin duda es el primer paso...
#1387
Scripting / Re: Es posible traducir .mp3 a .txt?
20 Septiembre 2019, 19:44 PM
Lo que yo entiendo es que pretende tomar los bytes de un fichero (*.mp3), y codificarlos (por ejemplo en base-64, UUEncode, BinHex, etc..), y guardar el contenido así convertido en un *.txt ...luego lo que haga con el fichero, será lo que sea. Tarde o temprano, se supone que tendrá que hacer la operación inversa.

Los lenguajes de script, suelen ser mas o menos limitados, así que dependerá de cual se elija para que sea más sencillo o más complicado.
La idea es ir leyendo y reconociendo los bytes, 3 bytes (3*8=24bits), se codifican en 4 caracteres (4+6=24 bits). Esos 4 caracteres cuando se guarden ocuparán 32 bits, por lo que el tamaño del fichero resultante aumentará 1/3 en tamaño. Así el tamaño total del nuevo fichero será x = ((x /3) * 4)

Si al final el lenguaje elegido es tan limitado que no permite ciertas cosas, como leer un fichero y procesar en un bucle, todavía desde ellos puede invocarse alguna funcionalidad externa... Esto es, un programa externo que recibe algunos parámetros, como comando (entre ellos la ruta del fichero y la operación deseada 'code/decode'...) y que lleva a cabo la tarea deseada, constando en el script, simplemente la llamada a dicha funcionalidad... en fin, no es insalvable...



Mmmmm... ahora releyendo, creo que lo que en realidad intenta es convertir la voz (letra) de las canciones a texto (TextToSpeech , más bien SongToSpeech) a un fichero de texto...
Si resulta ser esto... Decir que yo no conozco ningún programa que sea capaz de hacer eso bien, la voz es una cosa, cantando es otro 'cantar', algo muy distinto... hay veces que ni un humano alcanza a entender alguna palabra cantada incluso en su propio idioma.
Lo que si hay es multitud de sitios en la red, donde puedes localizar las letras de tal o cual canción e incluso del álbum completo...
#1388
Qué chistoso... "Trump ANALIZA" 
:laugh: :laugh: :laugh: :laugh: :laugh: :laugh:
:laugh: :laugh: :laugh: :laugh: :laugh:
:laugh: :laugh: :laugh: :laugh:
:laugh: :laugh: :laugh:
:laugh: :laugh:
:laugh:

...ese descerebrado solo tiene dos neuronas, cuando usa una la otra borra lo que contenía, luego nunca recuerda nada ni puede procesar nada. Solo escupe, bazofia...
Ese hombre en su vida habrá analizado nada.
#1389
Foro Libre / Re: Xenofobia (Editorial)
16 Septiembre 2019, 16:20 PM
No he leído los comentarios que se señalan (ni voy a perder tiempo en buscarlos).
Cuando a alguien se le dice que 'aprenda a hablar español', lo que se suele razonar (no digo yo que siempre), no es el acento (que además escrito no se oye), si no la enorme cantidad de faltas de ortografía donde casi no hay palabra que no tenga 1 o 2 faltas de ortografía... 

...pero no basta con eso (a veces por usar el teclado es fácil pulsar la tecla de al lado (casos de 'v' y 'b', o de 'n' y 'm' que están juntas), o presionar una tecla que está un poco atascada y a veces no sale y otras se repite... no, es que a veces algo que son 2 o 3 palabras quedan unidas como una dando a entender que el interlocutor no la conoce o entiende, o al revés una sola palabra que se separa en 2-3 partes, con el mismo efecto, el que escribe no entiende su propio idioma... en tales circunstancias decirle a alguien que aprenda a 'hablar/escribir' español, es solo el resultado de tan oscura lectura, sin tanta queja de 'racismo' que tantos se empeñan en encontrar bajo cualquier piedra...

Como ejemplo: Puede verse a veces escrita la palabra 'aunque' así: 'a un que', que al repetirse varias veces en un mismo texto, denota que el que escribe, no conoce claramente el significado de 'aunque' (a pesar de), al escribirlo como 'a un que' (a uno que...). Es decir quizás entienda su significado pero al escribirlo así denota que da un significado distinto a 'a un que', del que por sí mismo tiene, para asumir el significado d ela propia palabra que parece desconocer su existencia o que cuando la vea escrita (aunque), quizás crea que es porque la escribieron mal.
Lamentablemente hoy en medio de tanta tecnología donde ya hay, diría que media docena de cachivaches electrónicos o más por persona, hay más analfabetos que hace 40 años, cuando solo había calculadoras de bolsillo y los pocos (micro) ordenadores estaban solo en manos de los pocos 'friquis' que por entonces habíamos...

...pero bueno, hay gente buscando y persiguiendo racismo, casi que por hobbie o moda... tu solo abre la boca y pronuncia dos frases y ya ellos le darán la vuelta para alegar que eres racista, machista o cualquier otro ..ista
#1390
J0D35, tiran agua desde un avión y osmostrais tan reticentes, recelosos... el agua arrojada, puede alguien decir que causará daño a algún tercero...? ..70 litros de agua en quizás un viaje de media-una hora de vuelo?

...en cambio otros arrojan sustancias desde luego no inertes, con ideales diversos y con frecuencia no menos absurdos o por lo menos inútiles y nadie se queja de nada... incluyo desde avionetas para fumigación de cosechas, hasta aviones despidiendo gases de colores para un 'espectáculo aéreo', pasando por esas otras que arrojan nitratos de plata (y otras sustancias diversas) para dispersar nubes, o por aquellos que lanzan propaganda (hoy no tan legal como en tiempos pasados), sin olvidar los tan famosos y a la vez dudosos 'chemtrails', y a buen seguro tampoco habrán faltado quien haya arrojado las cenizas de algún familiar o amigo por el mismo medio desde algún aparato volador...

Desde luego de todos los que han arrojado algo desde el aire (sean curas, deportistas, políticos o payasos), arrojar agua, es lo menos nocivo que puede lanzarse, pero ahí estáis para quejaros como tontos, por un hecho sin absolutamente ninguna importancia... del resto de 'casos', que como mínimo siempre podrá afirmarse que más nocivo que el agua es, seguro que ni le dedicais un pensamiento.