4

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

这句话使用了两个a、两个c、两个d、二十八个e、五个f、三个g、八个h、十一个i、三个l、两个m、十三个n、九个o、两个p、五个r、二十五个s、23 个 t、6 个 v、10 个 w、2 个 x、5 个 y 和 1 个 z。

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

我并不是要您实际编写算法,尽管无论如何我很想看看您是否知道存在一个算法或想尝试编写一个算法;相反,我很好奇这个问题是否是可计算的。

4

2 回答 2

2

你在问两个不同的问题。

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

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

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

可计算意味着存在一种算法,对于给定的起始文本,要么输出解决方案,要么声明没有解决方案。上述算法不能做到这一点,穷举搜索是行不通的。因此我会说这个问题是不可计算的。然而,这是相当学术兴趣。在实践中,随机算法运行良好。

于 2014-06-26T19:21:26.150 回答
1

让我们暂时假设所有计数都小于或等于某个最大值 M,其中 M < 100。正如 OP 的链接中所述,这意味着我们只需要确定这些数字单词中出现的 16 个字母的计数,因为其他 10 个字母的计数已经由指定的前缀文本确定并且不能更改。

我认为值得利用的一个特性是,如果我们采用一些(可能不正确的)解决方案并重新排列其中的数字单词,那么总字母数不会改变。IOW,如果我们忽略用于“命名自己”的字母(例如cin two c's),那么总字母数仅取决于句子中实际出现的数字单词的多重集。这意味着我们不必考虑将 M 个数字词中的一个分配给 16 个字母中的每一个的所有可能方法,我们可以仅枚举所有大小为 16 或更少的数字词多集的(小得多的)集合,从大小为 M 的数字词的基本集合中提取元素,对于每个多重集合,看看我们是否可以拟合其元素的 16 个字母以每个多重集元素仅使用一次的方式。

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

一个字母“适合”一个多集是什么意思?假设我们有一个数字词的多重集 W;这确定了 16 个字母中每个字母的总字母数(对于每个字母,只需将该字母在 W 中所有数字单词中的计数相加;此外,还为每个数字单词的字母“S”添加 1 “一”,解释复数)。将这些字母计数 f["A"] 称为“A”的频率等。假设我们有一个函数 etoi(),它的操作类似于 C 的 atoi(),但返回一个数字字的数值。(这只是概念性的;当然在实践中,我们总是会从整数值(我们会保留它)生成数字字,而不是反过来。)然后字母 x 适合特定的数字字 w W 当且仅当 f[x] + 1 = etoi(w),

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

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

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

于 2014-06-02T04:55:01.203 回答