是否可以创建一个生成自动图的算法?

时间:2014-06-01 13:35:27

标签: algorithm language-agnostic computability

autogram是一个描述它包含的字符的句子,通常枚举字母表中的每个字母,但也可能是它包含的标点符号。以下是维基页面中给出的示例。

  

这句话使用两个a,两个c,两个d,二十八个e,五个f,三个g,八个h,十一个,三个l,两个m,十三个n,九个o,两个p,五个r,二十五个s,二十三个t,六个v,十个w,两个x,五个y和一个z。

提出一个很难,因为在完成句子之前你不知道它包含多少个字母。这是什么促使我问:是否有可能编写一个可以创建自动图的算法?例如,给定参数将是句子的开头作为输入,例如"This sentence employs",并假设它使用与上述"x a's, ... y z's"相同的格式。

我并没有要求你实际编写算法,尽管我很乐意看到你是否知道一个存在或者想要写一个算法;相反,我很好奇这个问题是否可以计算出来。

2 个答案:

答案 0 :(得分:2)

你问的是两个不同的问题。

"is it possible to write an algorithm which could create an autogram?"

有算法可以找到自动图。据我所知,他们使用随机化,这意味着这样的算法可能会找到给定开始文本的解决方案,但如果它没有找到一个,那么这并不意味着没有&#39一个。这将我们带到第二个问题。

"I'm curious as to whether the problem is computable in the first place."

Computable意味着存在一种算法,对于给定的开始文本或者输出解决方案,或者说没有解决方案。上述算法不能这样做,并且穷举搜索是不可行的。因此,我说这个问题是不可计算的。然而,这是学术上的兴趣。在实践中,随机算法运作良好。

答案 1 :(得分:1)

让我们暂时假设所有计数都小于或等于某个最大值M,其中M

我认为值得利用的一个属性是,如果我们采取一些(可能是不正确的)解决方案并重新排列其中的数字,那么总字母数不会改变。如果我们忽略所花的字母和#34;命名自己" (例如c中的two c's)则总字母数仅取决于句子中实际存在的数字单词的 multiset 。这意味着,我们不必考虑将所有M个字中的一个分配给16个字母中的每一个的所有可能方式,而是可以枚举所有多个数字字符集(小得多)的大小为16或更小的字符集。具有从大小为M的数字字的地面集合中取出的元素,并且对于每个多集合,查看我们是否能够以完全使用每个多集元素的方式将16个字母拟合其元素一次。

请注意,多个数字可以唯一地表示为非递减的数字列表,这使得它们易于枚举。

给#34; fit"的信是什么意思?多重集?假设我们有一个多字节W的数字;这确定了16个字母中每个字母的总字母数(对于每个字母,只是将该字母的数量加到W中所有数字中的总和;还要为字母添加1的计数" S"对于每个数字 - 除了"一个",以说明复数)。将这些字母计数f [" A"]称为" A"等的频率。假设我们有一个功能etoi(),其操作类似于C' atoi(),但返回数字的数值。 (这只是概念性的;当然在实践中我们总是会从整数值(我们会保留)生成数字 - 而不是反过来。)然后字母x适合特定的数字 - 字w W当且仅当f [x] + 1 = etoi(w)时,因为将字母x本身写入句子会使其频率增加1,从而使等式的两边相等。

这还没有解决这样一个事实,即如果多个字母符合数字,则只能分配其中一个字母。但事实证明,很容易确定给定的多字节W数字单词(表示为非递减的整数列表)是否同时符合任何字母集:

  • 计算W暗示的总字母频率f []。
  • 对这些频率进行排序。
  • 跳过任何零频率字母。假设有k个。
  • 对于每个剩余的字母,检查其频率是否等于相应位置中数字的数值。即检查f [k] + 1 == etoi(W [0]),f [k + 1] + 1 == etoi(W [1])等。
  • 当且仅当所有这些频率都一致时,我们才有赢家!

上述方法很幼稚,因为它假设我们选择从大小为M的地面集中放入多集的单词。对于M> 20这个集合中有很多结构可以被利用,但代价是算法稍微复杂化。特别是,不是枚举所有允许数字的地面集的直接多集,而是枚举{" one"," two",...,&的多重集合。 #34;十九","二十","三十","四十","五十","六十&# 34;,"七十","八十","九十"},然后允许"拟合检测"步骤将10的倍数的数字与单位数字组合。