Invertir una operación de cadena

Así que estaba jugando con mis algoritmos de cifrado cuando este problema me llamó la atención:

Suponga que tiene una operación de cadena dada por el siguiente pseudocódigo:

string go_wacky(string input, int reps)
{
    string result = input;
    foreach (0..reps)
    {
        result = insert_substring_at(result, input, random_from_to(0, length(result));
    }
    return result;
}

O, en terminología de apuntar y hacer clic, copie la cadena, luego los tiempos de repetición hacen lo siguiente: mueva el cursor a una posición aleatoria dentro de la cadena y presione pegar.

Dada la cadena de salida y las repeticiones, ¿cómo extraer la cadena de entrada (que no sea "fuerza bruta inversa" basada en la reconstrucción de la lista de caracteres de la cadena original usando repeticiones y longitud de salida)?

preguntado el 16 de mayo de 11 a las 19:05

No se puede resolver si la entrada contiene una subcadena, ya que no se puede decidir cuál de las subcadenas pertenecía originalmente a la entrada. Por lo tanto, debe especificar si eso es un problema. -

@Mel: si la cadena de entrada contiene un número exacto de repetición de una subcadena y ningún otro carácter, entonces el algoritmo encontrará la subcadena y no la cadena de entrada original. si hay algún otro carácter mezclado entre la subcadena, entonces el algoritmo debería ser posible (aunque bastante difícil). -

4 Respuestas

Podemos encontrar los caracteres de la cadena de entrada, contando las frecuencias de todos los caracteres y dividiendo por rep count + 1. Por ejemplo, si a es 12 veces en la salida y el recuento de repeticiones es 2. Entonces la cadena de entrada está contenida 2+1 veces en la salida y, por lo tanto, contiene 12/3 = 4 aes

A continuación, observe el primer carácter de la salida, que también es el primer carácter de la entrada. Reste uno de su frecuencia.

Para el siguiente carácter, hacemos una ramificación.

  • Es el inicio de la entrada: simplemente continúe.
  • or, es el segundo carácter de la entrada. Disminuya la frecuencia y continúe.

Prácticamente el mismo procedimiento para los siguientes caracteres.

Por ejemplo, si la salida comienza con aa.... Al leer el segundo a, la entrada puede ser a... y aa.... (A menos que, la frecuencia de a es 1.)

Creo que esto debería ser bastante rápido. En el caso de que las frecuencias sean todas una, este es O (n) con n tamaño de la cadena de salida.

contestado el 17 de mayo de 11 a las 01:05

Espero que esto no sea demasiado de fuerza bruta, pero no veo otra manera:

Tome el primer carácter de la salida (llámelo a) y el último carácter de la salida (llámelo b).

Busque en la salida subcadenas de longitud len (salida) / repeticiones que comiencen con ay terminen con b. Esto produce una lista de candidatos.

Para cada candidato, reemplace recursivamente dentro de la salida el candidato con una cadena vacía, es decir, salida = salida.replace (candidato, '')

Si después del último reemplazo, el resultado es una cadena vacía, encontró el texto sin formato.

contestado el 17 de mayo de 11 a las 00:05

solo algunos pensamientos al azar:

  • la entrada aparece completamente al menos una vez en la salida.
  • este problema puede resolverse al "subcadena más larga".

contestado el 17 de mayo de 11 a las 00:05

Longitud de la salida = N repeticiones * tamaño de la cadena de entrada.

No se garantiza que esto se pueda resolver sin una mejor pista sobre el tamaño de la cadena de entrada o el recuento de repeticiones.

contestado el 17 de mayo de 11 a las 00:05

"Dada la cadena de salida y las repeticiones", se da el recuento de repeticiones. - Ishtar

No tengo una prueba matemática sólida hasta ahora, pero tengo la fuerte sospecha de que siempre se puede resolver sin importar la entrada y el número de repeticiones. Si puede encontrar un ejemplo sin solución o un ejemplo ambiguo (como prueba negativa de mi teoría), sería muy apreciado. - Hiperbóreo

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.