【问题标题】:A code that is a word forwards & a different word backwards一个向前的单词和向后的不同单词的代码
【发布时间】:2011-03-07 20:15:32
【问题描述】:

作为礼物,我正在尝试创建一个代码,将某个单词向前读取,将另一个单词向后读取。一个例子(0,1,2 是可用的符号):

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

那么“HELLO”/“WORLD”对就是

2010111211 你好
1121110102 世界

我想生成一个适合其他单词对的代码。显然,我不能蛮力解决方案(如果该对存在一个)。如果单词对很长,我所知道的所有优化/搜索方法(模拟退火、爬山、遗传算法)只会给我不完美的解决方案。

上面的例子是在我为解决这个问题而编写的遗传算法中找到的,但是经过许多代不同的参数和词序等之后,它从未完全达到 100%。

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

编辑: 在 cmets 之后,这就是我真正想要做的事情:基本上,我想要一条项链,上面有不同形状的珠子(每个符号),可以编码一个单词,如果你扭曲它然后它编码一个不同的词。所以码字不能太长,不同的符号不能太多。

编辑 2: 向前,它应该是 FESTUNG DRESDEN(或 FESTUNGDRESDEN),向后是一些通用“美好愿望”的组合,即 FRIENDS、FORTUNE、LUCK、HAPPINESS(或这些的德语等价物)词)或只是名字 MARIA(是的,你猜对了,它是为一个女孩......)。没关系,这些词是成对的(即 FESTUNG 倒读为 FORTUNE,DRESDEN 倒读为 FRIENDS)还是长版本(即 FESTUNGDRESDEN 倒读为 FRIENDS&FORTUNE)。

提前致谢!

【问题讨论】:

  • 您的意思是您需要一个适用于所有可能的单词对的代码吗?这是不可能的!
  • @Tom Gullen:生日礼物。基本上,我想要一条项链,上面有不同形状的珠子,可以编码一个词,如果你扭动它,它就会编码一个不同的词。 @Moron:不,只有一对特定的词(但两个词都会很长 [14 到 20 个字符])。
  • 啊,非常聪明和好主意!
  • @Duddle:好主意!这意味着您至少需要两个符号?我建议你编辑这个问题来这么说。另外,您还在考虑哪些其他类型的“扭曲”?也许您应该在问题中提及项链!会引起更多的兴趣...
  • 如果您只考虑一个应用程序,那么也许您可以提供您打算编码的两个单词?当然,如果这在我的要求范围内。

标签: language-agnostic encode


【解决方案1】:

我试图将 FESTUNGDRESDEN 变成 MARIA。

我发现一个可能的编码不满足所有指定条件,因为其中一个字母需要超过 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

别忘了上传项链的照片!

维尔格吕克!

1.5 年后编辑

以下是 OP 拍摄的两张精彩照片和结果:

【讨论】:

  • +1 因为它有效;现在只是为了找到一个适当的反向单词或编码方式,以便所有的键都是短的 =(
  • @Justin L. 感谢您的想法!请参阅上面的编辑
  • 谢谢!这个答案很神奇。刚刚注意到您在第一个解决方案中有两个“N”,但在示例中它是正确的。我会尝试看看这两个例子中哪一个效果最好,然后拍一张照片。再次感谢。
  • @Duddle 之前的解决方案编码表中有一个虚假的“n”。当然可以通过整理答案来解决问题,但是编码是正确的(至少我相信如此)。我要编辑它。非常感谢您的指正。
  • 21243和2124不会导致冲突吗?原帖是把代码混在一起的,你怎么知道字符串“2124321243”中是“2124 3 2124 3”还是“21243 21243”?
【解决方案2】:

如果代码不需要无前缀并且您不在乎代码有多长,那么只需一个符号就足够了!

您用不同数量的 1 对每个字符进行编码,因此最终,一个单词的 1 总数与另一个单词的总数相同。

为此,请删除常用字符。

如果是 HELLO 和 WORLD,则剩下 HEL 和 WRD。

现在你需要六个不同的整数,它们可以分成两组,每组 3,这样一组的总和 = 另一组的总和。

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

对于 HEL 和 WRD,您选择

{3,5,7} 和 {1,6,8}。

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

我有一种感觉,我误解了一些东西。

【讨论】:

  • 感谢您的回答,我的规格不是很明确。是的,我不太关心码字长度,但它的实际应用(见编辑)只允许最大长度。此外,它应该保持人类可解码(使用编码表),因此“仅 1 个符号”代码很难解码。而且项链还不够漂亮(见编辑):)
猜你喜欢
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多