2010-06-24 10 views
6

Por el momento, estoy tratando de crear un código que lea como cierta palabra hacia adelante y una palabra diferente hacia atrás. Un ejemplo (0,1,2 son los símbolos disponibles):Un código que es una palabra reenviada y una palabra diferente al revés

D = 02, E = 01, H = 201, L = 1, O = 211, R = 10, W = 11

Entonces el par "HOLA"/"mundo" sería

2010111211 HOLA
1121110102 WORLD

quisiera generar un código que se adapte a otros pares de palabras. Obviamente, no puedo forzar en bruto la solución (si existe para ese par). Todos los métodos de optimización/búsqueda que conozco (recocido simulado, alpinismo, algoritmo genético) me dan soluciones imperfectas solamente, si los pares de palabras son largos.

El ejemplo anterior se encontró en un algoritmo genético que escribí para resolver esto, pero después de muchas generaciones con diferentes parámetros y orden de palabras, etc., nunca llega al 100%.

¿Cómo puedo abordar esto de manera diferente? La longitud de cada palabra de código no es muy importante. debe tener menos de 10 símbolos por carácter, la cantidad de símbolos diferentes utilizados debe mantenerse por debajo de 5, y el código no necesita estar libre de prefijos.

Editar sección: Después de los comentarios, esto es lo que estoy tratando de hacer: Básicamente, quiero tener un collar con cuentas de diferentes formas (por símbolo) que codifican una palabra, y si lo tuerce, entonces codifica una palabra diferente. Por lo tanto, las palabras de código no deben ser extremadamente largas, y no puede haber demasiados símbolos diferentes.

Edición 2: Delanteros, debe decir FESTUNG DRESDEN (o FESTUNGDRESDEN), hacia atrás alguna combinación de genéricos "buenos deseos", es decir, amigos, fortuna, suerte, felicidad (o el equivalente alemán de estas palabras) o simplemente el nombre MARIA (sí, has acertado, es para una niña ...). No importa, si estas palabras forman pares (es decir, FESTUNG lee hacia atrás a FORTUNE, DRESDEN lee hacia atrás a FRIENDS) o si es la versión larga (es decir, FESTUNGDRESDEN lee hacia atrás a FRIENDS & FORTUNE).

¡Gracias de antemano!

+0

¿Qué quiere decir por el actual? –

+0

¿Quiere decir que necesita un código que funcione para cada par de palabras posibles? ¡Eso no será posible! –

+0

@Tom Gullen: un regalo de cumpleaños. Básicamente, quiero tener un collar con cuentas de formas diferentes que codifiquen una palabra, y si lo tuerces, codifica una palabra diferente. @Moron: no, solo un par específico (pero ambas palabras serán bastante largas [14 a 20 caracteres]). – Duddle

Respuesta

6

Traté de transformar FESTUNGDRESDEN en MARIA.

Encontré una posible codificación que no cumple todas las condiciones especificadas, ya que una de las letras necesita más de 10 símbolos.

Un procedimiento de "manual": Como ambas palabras comparten sólo una letra (la "R") que rompí ambas palabras de la siguiente manera

---------------> 
    FESTUNGD R ESDEN 
    A I R A M 
    <-------------- 

así, mantener el código de R como un palíndromo

cod(FESTUNGD) = cod*(IA) 
    and 
    cod(ESDEN) = cod*(MA) 

    where cod*() means "reading the code backwards" 

Luego divide el problema un paso más allá división los códigos para la e y T

-----------------------------------> 
    FES(T2) (T1)UNGD R ESD(E3) (E2)(E1)N 
    A  I  R  A  M 
    <---------------------------------- 

Creo que este podría ser un punto de partida para desarrollar un algoritmo "real" en el futuro.

De todos modos, al hacerlo pude escribir las ecuaciones para cada carácter codificado. La única parte difícil es la "A", ya que se repite. Esto lleva a la siguiente ecuación

cod("FES") & (T2) = cod("ESD") & (E3) 

Procediendo de una manera similar (dividir aún más los códigos de letra X en X (1) X (2) X (3)), Reescribí la ecuación anterior en sub-partes y lo resolvió No es difícil, pero tedioso.

El resultado es:

F= 21243 
E= 2124 
S= 3212 
T= 125 
U= 1 

N = 4

G= 3 
D= 4321 
R= 33 
N= 2 

M= 24 
A= 212123421234212 --> Here is the looong one 
I= 12343215 

So, when you read 

     f  e s t u n g d r e s d e n 
     21243 2124 3212 125 1 2 3 4321 33 2124 3212 4321 2124 2 
    <-------------------------------------------------------- 
    v backwards is: 
    | 
    | M A    R I  A 
    | 24 212123421234212 33 12343215 212123421234212 
    -------------------------------------------------> 

Creo que esta solución no contribuye en el campo del desarrollo de algoritmos, pero espero que lo hace en el mejor causa de amor :)

EDIT> FRIENDSHIP

Siguiendo el mismo procedimiento que el anterior (y la sugerencia hecha por Justin L.), me trataron con la palabra "amistad", que parece estar alineado con la idea que se quiere comunicar.

Con la siguiente tabla:

f 434 
e 44 
s 543 
t 22 
u 1 
n 34 
g 5 
d 3 
r 43 

i 345 
h 122 
p 44434 

El resultado es

 f e s t u n g d r e s d e n 
     434 44 543 22 1 34 5 3 43 44 543 3 44 34 
    <----------------------------------------------------- 
    v and backwards is: 
    | 
    | f r i e n d s h i p 
    | 434 43 345 44 34 3 543 122 345 44434 
    ----------------------------------------------> 

Tenga en cuenta que las ecuaciones para "t" "u" y "h" son independientes del resto del sistema . Así que puedes elegir cualquier combinación no utilizada de {3,4,5} (de cualquier longitud) para ellos, posiblemente haciendo el collar con solo 3 símbolos. Para hacer esto, puedes probar

t -> 4 
u -> 54 

which results in 

h -> 454 

all 3 are unused and available codes 

¡No olvides subir una foto del collar!

Viel Glück!

Editar 1,5 años más tarde

Aquí hay dos maravillosas fotografías tomadas por el PO con los resultados:

enter image description here

enter image description here

+0

+1 porque funciona; ahora solo para encontrar una palabra correcta hacia atrás o una forma de codificar para que todas las teclas sean cortas = ( –

+0

@Justin L. ¡Gracias por la idea! Vea la edición anterior –

+0

¡Gracias! Esta respuesta es wunderbar. Tengo dos "N" en la primera solución, en el ejemplo es correcto. Intentaré ver cuál de los dos ejemplos funciona mejor y luego haré una foto. Gracias de nuevo. – Duddle

2

Si el código no necesita ser libre de prefijos y no le importa cuánto tiempo duran los códigos, ¡basta con un símbolo!

Codifica cada carácter por un número diferente de 1, de modo que, al final, el número total de 1 para una palabra es el mismo que el número total para el otro.

Para ello, elimine los caracteres comunes.

En el caso de HELLO y WORLD, te quedan HEL y WRD.

Ahora necesita seis enteros distintos que se pueden agrupar en dos grupos de 3, tal que suma de un grupo = suma de otros.

Una forma de hacerlo es seleccionar números impares mayores que 1 para un grupo y números pares para el otro (y posiblemente 1, dependiendo del número en cada grupo).

Para HEL y WRD que seleccione

{3,5,7} y {1,6,8}.

Para los más comunes, ahora puede seleccionar números que no estén en ninguno de los grupos y ¡listo! (Aunque es necesario tener cuidado con las palabras de longitud muy diferente).

Tengo la sensación de que no he entendido bien algo.

+0

Gracias por la respuesta, mis especificaciones no estaban muy bien definidas. Sí, no me importa mucho la longitud de la palabra de código, pero su aplicación en el mundo real (ver edición) solo permite una longitud máxima. Además, debe seguir siendo decodificable por el ser humano (con una tabla de codificación), por lo que un código "1 solo símbolo" es muy difícil de descodificar. Y no sería lo suficientemente bonito para el collar (ver edición) :) – Duddle

Cuestiones relacionadas