代码之家  ›  专栏  ›  技术社区  ›  Duddle

向前一个字和向后一个不同的字的代码

  •  6
  • Duddle  · 技术社区  · 16 年前

    就目前而言,我正在尝试创建一个代码,它将某个单词向前读,另一个单词向后读。示例(0,1,2是可用的符号):

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

    那么这对“你好”/“世界”应该是

    201011211你好
    1121110102世界

    我想生成一个适合其他单词对的代码。显然,我不能强行解决这个问题(如果这对人有一个解决方案的话)。我所知道的所有优化/搜索方法(模拟退火、爬山、遗传算法)只在单词对较长的情况下给出不完美的解。

    上面的例子是在我为解决这个问题而写的一个遗传算法中发现的,但是经过许多代人的不同参数和词序,它从来没有达到100%。

    我如何才能以不同的方式处理这个问题?每个代码字的长度 不是很重要 每个字符应少于10个符号,使用的不同符号的数量应保持在5以下,并且代码不需要前缀自由。

    编辑: 在评论之后,我要做的是:基本上,我想要一条项链,上面有不同形状的珠子(每个符号),可以编码一个单词,如果你扭曲它,它就会编码另一个单词。因此,码字不能太长,也不能有太多不同的符号。

    编辑2: 向前看,它应该读到festung dresden(或festung dresden),向后看一些通用的“美好愿望”的组合,即朋友、财富、运气、幸福(或这些词的德语等价物)或只是名字玛丽亚(是的,你猜对了,是为一个女孩…)。如果这些词是成对的(例如,Festung倒读到fortune,Dresden倒读到friends),或者如果是长版本(例如,Festungdresden倒读到friends&fortune),则无所谓。

    事先谢谢!

    2 回复  |  直到 14 年前
        1
  •  6
  •   Dr. belisarius    14 年前

    我试图把费斯顿德累斯顿变成玛丽亚。

    我发现可能的编码不满足所有指定的条件,因为其中一个字母需要10个以上的符号。

    a“manual”procedure: as two words share only one letter(the“r”)I breaked up both words as follows

    ---------------->
    费斯顿
    A,A,M
    <----------
    < /代码> 
    
    

    所以,保留R的代码作为回文。

    cod(festungd)=cod*(ia)
    和
    COD(Esden)=COD*(MA)
    
    其中cod*()表示“向后读取代码”
    < /代码> 
    
    

    然后我把这个问题进一步分了一步,把E和T的代码分开。

    ————————————————————————gt;
    FES(T2)(T1)UNGD R ESD(E3)(E2)(E1)N
    A I R A M
    <-------------------------------
    < /代码> 
    
    

    我认为这可能是未来开发“真实”算法的起点。

    总之,通过这样做,我可以为每个编码字符写下方程。唯一困难的部分是“A”,因为它是重复的。这就得出了以下方程

    cod(“fes”)&(t2)=cod(“esd”)&(e3)
    < /代码> 
    
    

    以类似的方式(进一步将x(1)x(2)x(3)中字母x的代码拆分),我将上述方程重新编写为子部分,并将其求解。不难,但很乏味。

    结果是:

    f=21243
    e=2124
    S=3212
    t=125
    U=1
    < /代码> 
    
    

    n=4

    < Prime>代码> g=3 d=4321 r=33 n=2 M=24 A=21212342112412——>这是龙牌的 i=12343215 所以,当你读到 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向后是: γ | M A R I A | 24 212123421234212 33 12343215 212123421234212 ————————————————————————————gt; < /代码>

    我认为这个解决方案在算法开发领域没有贡献,但希望它能在更好的爱情事业中发挥作用:)

    < Buff行情>

    edit>friendship

    < /块引用>

    按照与上述相同的程序(以及Justin L.提出的建议),我尝试使用“友谊”这个词,它似乎与你想要交流的想法一致。

    下表:

    f 434
    E 44
    S 543
    T 22
    U 1
    N 34
    G 5
    D 3
    R 43
    
    我345
    H 122
    P 44434
    < /代码> 
    
    

    结果是

    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和倒是:
    γ
    | F R I E N D S H I P
    | 434 43 345 44 34 3 543 122 345 44434
    ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
    < /代码> 
    
    

    请注意,“t”、“u”和“h”的方程独立于系统的其余部分。因此,您可以为它们选择任何未使用的3,4,5(任何长度)组合,可能只需要用3个符号来制作项链。为此你可以尝试

    t->4
    U & GT;54
    
    结果是
    
    H & GT;454
    
    所有3个都是未使用和可用的代码
    < /代码> 
    
    

    别忘了上传项链的照片!

    祝你好运!

    编辑1.5年后

    这是OP拍的两张非常好的照片,结果是:

    不满足所有指定条件的编码,因为其中一个字母需要10个以上的符号。

    “手动”程序:由于这两个词只共用一个字母(“r”),我将这两个词拆分如下

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

    所以,保留R的代码作为回文。

       cod(FESTUNGD) = cod*(IA)
       and
       cod(ESDEN) = cod*(MA)
    
       where cod*() means "reading the code backwards"
    

    然后我把这个问题进一步分了一步,把E和T的代码分开。

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

    我认为这可能是未来开发“真实”算法的起点。

    总之,通过这样做,我可以为每个编码字符写下方程。唯一困难的部分是“A”,因为它是重复的。这就得出了以下方程

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

    以类似的方式进行(进一步将x(1)x(2)x(3)中字母x的代码拆分),我将上述方程重写为子部分并求解。不难,但很乏味。

    结果是:

    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
       ------------------------------------------------->
    

    我认为这个解决方案在算法开发领域没有贡献,但希望它能在更好的爱情事业中发挥作用:)

    编辑友谊

    按照与上述相同的程序(以及Justin L.提出的建议),我尝试使用“友谊”这个词,这似乎与你想要交流的想法一致。

    下表:

    f 434
    e 44
    s 543
    t 22
    u 1
    n 34
    g 5
    d 3
    r 43
    
    i 345
    h 122
    p 44434
    

    结果是

           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
       ---------------------------------------------->
    

    请注意,“t”、“u”和“h”的方程独立于系统的其余部分。因此,您可以为它们选择任何未使用的3,4,5(任何长度)组合,可能只需要用3个符号来制作项链。为此你可以尝试

     t -> 4
     u -> 54
    
     which results in
    
     h -> 454
    
     all 3 are unused and available codes
    

    别忘了上传项链的照片!

    Viel Gl!

    1.5年后编辑

    Here are two wonderful photographs taken by the OP with the results:

    enter image description here

    enter image description here

        2
  •  2
  •   Aryabhatta    16 年前

    如果代码不需要前缀自由,而您不关心代码有多长,那么只需一个符号就足够了!

    你用不同的1的数字对每个字符进行编码,这样,最后,一个单词的1总数与另一个单词的1总数相同。

    要执行此操作,请删除常用字符。

    在“你好”和“世界”的情况下,您只剩下hel和wrd。

    现在您需要六个不同的整数,可以分为两组3,这样一组的和=另一组的和。

    一种方法是为一组选择大于1的奇数,为另一组选择偶数(可能为1,取决于每组中的数字)。

    对于HEL和WRD,您选择

    _3,5,7和1,6,8。

    对于常见的数字,现在您可以选择不在任何一组中的数字,这样就完成了!(尽管对于长度不同的单词需要注意)。

    不过,我觉得我误解了一些事情。

    推荐文章