Duplicar el texto de investigación
-
21-08-2019 - |
Pregunta
Mi problema principal es tratar de encontrar una solución adecuada para desconectar automáticamente esto, por ejemplo:
d+c+d+f+d+c+d+f+d+c+d+f+d+c+d+f+
en esto:
[d+c+d+f+]4
es decir. duplicados para encontrar uno junto al otro, y luego hacer un "bucle" más corto de estos duplicados. Hasta el momento no he encontrado ninguna solución adecuada a este, y espero una respuesta. PD Para evitar confusiones, la muestra antes mencionada no es la única cosa que necesita "bucle", se diferencia de un archivo a otro. Oh, y esto está destinado a un programa de C ++ o C #, o bien está bien, aunque estoy abierto a otras sugerencias también. Además, la idea principal es que todo el trabajo se llevaría a cabo por el propio programa, sin intervención del usuario excepto para el propio archivo. Aquí está el archivo completo, para referencia, mis disculpas por la página de estirado: # 0 @ 16 y10 T76 V225 W250
l16
$ ED $ EF $ A9
p20,20
> Ecegb> d
/
L8
R1R1R1R1
f + f + g + cg + r4
a + c + a + g + cg + R4F + f + g + cg + r4
a + c + a + g + cg + R4F + f + g + cg + r4
a + c + a + g + cg + r4
f + f + g + cg + r4
a + c + a + g + r4g + 16f16c +
a + 2 ^ g + f + g + 4
f + FF + 4FD + f4
d + c + d + 4c + c C4d +
# 4 @ 22 y10 V250
L8 o3 rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + rg + / r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1
# 2 @ 4 y10 V155
L8 ED $ $ $ F8 8F O4 r1r1r1 d + 4f4f + 4g + 4 a + 4r1 ^ 4 ^ 2 / d + 4 ^ FR2 f + 4 ^ fr2d + 4 ^ FR2 f + 4 ^ fr2d + 4 ^ FR2 f + 4 ^ fr2d + 4 ^ FR2 f + 4 ^ FR2 > d + 4 ^ FR2 f + 4 ^ fr2d + 4 ^ FR2 f + 4 ^ FR2 < f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ fr2f + 4 ^ g + r2 f + 4 ^ FR2 > a + 4 ^ g + r2 f + 1a + 4 ^ g + r2 f + 1 f + 4 ^ FR2 d + 1 f + 4 ^ FR2 d + 2 ^ d + 4 ^ r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1
# 3 @ 10 y10 V210
r1 ^ 1
o3
c8r8d8r8
c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8c8r8
c8
@ @ 21 10d16d16
c8
@ @ 21 10d16d16
c8
@ @ 21 10d16d16
/
c4 @ 10d8 @ 21c8 # 7 @ 16 y10 V230 l16
$ ED $ EF $ A9
cceeggbbggeeccee
# 5 @ 4 y10 V155 L8
ED $ $ $ F8 8FO4
R1R1R1R1
d + 4r1 ^ 2 ^ 4
/
CR2
c + 4 ^ CR2 CR2
c + 4 ^ CR2 CR2
c + 4 ^ CR2 CR2
c + 4 ^ CR2
a + 4 ^> CR2
c + 4 ^ CR2
CR2
c + 4 ^ c
r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1r1
r2
f + 4 ^ FR2
d + 1f + 4 ^ FR2
d + 1
c + 4 ^ CR2
C + 4 ^ CR2
Solución
No estoy seguro si esto es lo que busca.
Tomé la cadena "testtesttesttest4notaduped + c + d + + + f + d + c + d f + d + c + d f + d + c + d + f + testtesttest" y se convierte en "[test] 4 4notadupe [d + c + d + f +] 4 [test] 3 "
Estoy seguro de que alguien va a llegar a una mejor solución más eficiente, ya que es un poco lento al procesar su archivo completo. Miro adelante a otras respuestas.
string stringValue = "testtesttesttest4notaduped+c+d+f+d+c+d+f+d+c+d+f+d+c+d+f+testtesttest";
for(int i = 0; i < stringValue.Length; i++)
{
for (int k = 1; (k*2) + i <= stringValue.Length; k++)
{
int count = 1;
string compare1 = stringValue.Substring(i,k);
string compare2 = stringValue.Substring(i + k, k);
//Count if and how many duplicates
while (compare1 == compare2)
{
count++;
k += compare1.Length;
if (i + k + compare1.Length > stringValue.Length)
break;
compare2 = stringValue.Substring(i + k, compare1.Length);
}
if (count > 1)
{
//New code. Added a space to the end to avoid [test]4
//turning using an invalid number ie: [test]44.
string addString = "[" + compare1 + "]" + count + " ";
//Only add code if we are saving space
if (addString.Length < compare1.Length * count)
{
stringValue = stringValue.Remove(i, count * compare1.Length);
stringValue = stringValue.Insert(i, addString);
i = i + addString.Length - 1;
}
break;
}
}
}
Otros consejos
Puede utilizar el algoritmo de Smith-Waterman hacer alineamiento local, comparando la cadena contra sí misma.
http://en.wikipedia.org/wiki/Smith-Waterman_algorithm
EDIT: Para adaptar el algoritmo de alineación de auto, es necesario obligar a los valores en la diagonal a cero - es decir, penalizar la solución trivial de la alineación de toda la cadena tal y consigo mismo. A continuación, el "segundo mejor" alineación saldrá en su lugar. Esto será más largas las dos subcadenas coincidentes. Repita el mismo tipo de cosas para encontrar progresivamente más cortos subcadenas coincidentes.
LZW pueden ayudar: utiliza prefijos diccionario para buscar patrones repetitivos y sustituye a dichos datos con referencias a entradas anteriores. Creo que no debería ser difícil para adaptarlo a sus necesidades.
¿Por qué no usar System.IO.Compression ?