Como implementar una función que haga esto?

Iniciado por @XSStringManolo, 26 Noviembre 2019, 00:41 AM

0 Miembros y 1 Visitante están viendo este tema.

@XSStringManolo

Quiero reorganizar un texto en base a la posición alfabética de cada caracter de otro texto programáticamente.

Tengo un array que contiene caracteres random:
array1 = ["H", "o", "l", "a", " "];

Y otro array que contiene el mismo número de caracteres:
array2 = ["a", "d", "m", "i", "n"];

En base al array2 quiero ordenar el array1 de la siguiente forma:

array2 = ["1", "4", "13", "9", "14"]

a = primeraPosicion
d = segundaPosicion
m = cuartaPosicion
i = terceraPosicion
m = quintaPosicion

ResultadoQueQuiero = ["H", "o", "a", "l", " "];

No consigo implementarlo.

Tachikomaia

#1
Me entreveré mucho, sorry, creo que es así:

Una vez obtenido esto
array2 = ["1", "4", "13", "9", "14"]
hacemos:
Si array2[0] > array2[1]
   intercambiar array1[0] y array1[1]
findelsi
Si array2[1] > array2[2]
   intercambiar array1[1] y array1[2]
findelsi
Si array2[2] > array2[3]
   intercambiar array1[2] y array1[3]
findelsi
Si array2[3] > array2[4]
   intercambiar array1[3] y array1[4]
findelsi
Repites eso 4 o 5 veces, aunque cada vez se requieren menos ifs.

Hacerlo prolijo y usando sólo 1 repetición o 2, te lo dejo a ti xD

engel lex

primero reduce los numeros a su minima expresion organizativa... es decir

de ["1", "4", "13", "9", "14"]
a  [0,1,3,2,4]


la forma mas simple de hacer eso es organizar el array de manor a mayor y luego ver en que posicion estan ubicados en el original...

luego simplemente ubicar en relacion al segundo array (la letra en
  • va en
  • , la letra en [1] a [1], la letra en [2] va a [3]... etc)
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

@XSStringManolo

Cita de: Tachikomaia en 26 Noviembre 2019, 02:38 AM
Me entreveré mucho, sorry, creo que es así:

Una vez obtenido esto
array2 = ["1", "4", "13", "9", "14"]
hacemos:
Si array2[0] > array2[1]
   intercambiar array1[0] y array1[1]
findelsi
Si array2[1] > array2[2]
   intercambiar array1[1] y array1[2]
findelsi
Si array2[2] > array2[3]
   intercambiar array1[2] y array1[3]
findelsi
Si array2[3] > array2[4]
   intercambiar array1[3] y array1[4]
findelsi
Repites eso 4 o 5 veces, aunque cada vez se requieren menos ifs.

Hacerlo prolijo y usando sólo 1 repetición o 2, te lo dejo a ti xD
Muchas gracias, lo implementé de esta forma que me pareció sencilla. Lo implementé en js de forma un poco cutre jaja. Ya lo mejoraré:
Código (javascript) [Seleccionar]
function SMOA(TextCif, Contrasenha)
{
var temp = "";
var temp2 = 0;
var ct = Contrasenha.length;

    for(var j = 0;  j < TextCif.length; ++j)
   {
      for(var i = 0;  i < TextCif.length-1; ++i)
      {
       temp2 = i;
       ++temp2;
         if ( temp2 < ct || temp2 == ct)
         {
            if (Contrasenha[i] > Contrasenha[temp2])
            {
            temp += TextCif[temp2];         
            TextCif[temp2]=TextCif[i];           
            TextCif[i]=temp[0];
            temp = "";
            }   
         }     
      }
   }
return TextCif;
}


Estaba intentando implementarlo como dices engel lex antes de crear el tema en el foro pero me quedaba mucho código y un batiburrillo.

Es parte de una librería sencilla en javascript que estoy creando con un cifrado que quiero que sea irrompible basándome en el principio de que todas las posibilidades son igual de frecuentes estadísticamente.

Por ejemplo "hola que tal" 12 caracteres dara un resultado que al intentar romperlo dará todas las combinaciones posibles de caracteres de 12 caracteres. Es decir, el texto original podría ser:
"aaaaaaaaaaaa" o "qbfkwusbwp1;$" o "adios amigos", etc.

Ahora estoy mirando de que forma fixear el tamaño a un tamaño concreto sin limitar la cantidad de entrada sin rompear la equidad estadística.

Los cifrados actuales basan su seguridad en capacidad de cómputo, y no me convence ya que teóricamente todos puede romperse dada X capacidad de cómputo e Y tiempo.

engel lex

#4
de haber dicho en js :P es corto...


Código (javascript) [Seleccionar]

var original = ["H", "o", "l", "a", " "];
var orden = ["a", "d", "m", "i", "n"];
var copia = orden.slice();
copia.sort();

var salida = [];

copia.forEach(function(item){
 salida.push(original[orden.indexOf(item)] )
})



El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Serapis

St..Man... Eso es implementar una tabla indexado por otra.

Sea el ASCII. que como sabes va de 0 a 255 (que se supone es el punto de partida), donde (por ejemplo) la 'A' ocupa la posiciópn 65, pero en tu caso ocuparía la posición 0...

MiTabla(0) = ASCII(65)
igual para el resto...

Si van contíguos, podría usarse un bucle, por ejemplo supuesto el caso de una tabla con las 26 mayúsculas:

bucle para k desde 65 hastas 65 + 26
   MiTabla(n) = ASCII(k)
   n +=1
siguiente


Ahora 'Mitabla(7)' tendrá la 8ª letra, osea la 'H', el valor 72.
Posteriormente puede usarse en la forma: ASCII(Mitabla(7))



@XSStringManolo

Cita de: engel lex en 26 Noviembre 2019, 16:59 PM
de haber dicho en js :P es corto...


Código (javascript) [Seleccionar]

var original = ["H", "o", "l", "a", " "];
var orden = ["a", "d", "m", "i", "n"];
var copia = orden.slice();
copia.sort();

var salida = [];

copia.forEach(function(item){
 salida.push(original[orden.indexOf(item)] )
})




Tengo que probar este código, el que implementé yo no me sirvetras hacer unos cambios.

Cita de: NEBIRE en 27 Noviembre 2019, 16:02 PM
St..Man... Eso es implementar una tabla indexado por otra.

Sea el ASCII. que como sabes va de 0 a 255 (que se supone es el punto de partida), donde (por ejemplo) la 'A' ocupa la posiciópn 65, pero en tu caso ocuparía la posición 0...

MiTabla(0) = ASCII(65)
igual para el resto...

Si van contíguos, podría usarse un bucle, por ejemplo supuesto el caso de una tabla con las 26 mayúsculas:

bucle para k desde 65 hastas 65 + 26
   MiTabla(n) = ASCII(k)
   n +=1
siguiente


Ahora 'Mitabla(7)' tendrá la 8ª letra, osea la 'H', el valor 72.
Posteriormente puede usarse en la forma: ASCII(Mitabla(7))
Esto es una tabla de equivalencias. Yo lo que quiero es desordernar en base al contenido de un array. No tiene nada que ver.


Serapis

Tiene todo que ver... si cada valor en el array tiene siempre la misma equivalencia en el otro (perdona pero la explicación dada al comienzo es demasiado parca, como para terminar de entender su propósito).

Y si es siempre cambiante, o debe serlo, entonces usa el algoritmo de Fisher-Yates que es esa precisamente su funcionalidad.

@XSStringManolo

#8
Ese algoritmo de barajado utiliza un algoritmo aleatorio asique no puedo reversarlo. En caso de ser un algoritmo pseudoaleatorio no es un CSRNG y podría reversarse y romperse el cifrado.
Yo necesito desordenar en base a la contraseña para reducir los resultados estadísticos de análisis de frecuencia. Se da por hecho que el atacante no conoce la contraseña. Quiero desordenar antes de pasarle vector de inicialización. También tengo que fixear el tamaño a tamaño fijo. Mejorar la implementación, quitar código inútil, ampliar el diccionario de input y cambiar los caracteres de output para que no necesite base64.
Cifrado Live
Si se os ocurre algo mejor comentarlo.

engel lex

Cita de: @?0!,5^34 en 27 Noviembre 2019, 21:54 PM
Ese algoritmo de barajado utiliza un algoritmo aleatorio asique no puedo reversarlo. En caso de ser un algoritmo pseudoaleatorio no es un CSRNG y podría reversarse y romperse el cifrado.
Yo necesito desordenar en base a la contraseña para reducir los resultados estadísticos de análisis de frecuencia. Se da por hecho que el atacante no conoce la contraseña. Quiero desordenar antes de pasarle vector de inicialización. También tengo que fixear el tamaño a tamaño fijo. Mejorar la implementación, quitar código inútil, ampliar el diccionario de input y cambiar los caracteres de output para que no necesite base64.
Cifrado Live[url]
Si se os ocurre algo mejor comentarlo.

te recomiendo leer sobre como funcinoa rijandel (la base de aes) para no tener que depender de aleatorios... especialmente de aleatorios de "alto nivel"
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.