Mathematica,72 65 61字节
Print@@@Tuples@{a=##/(b=#5#9#15#21#25#)&@@Alphabet[],b,a,b,a}
为了测试,我建议更换Print@@@
用""<>#&/@
。然后,Mathematica将显示一个截断的表格,显示前几个单词和最后几个单词,而不是永远花费288,000行。
说明
我终于找到了分割字符串的用途。:)
一段时间内添加或乘法字符串的可能性使我很感兴趣,但是实际用例非常有限。要点是,类似"foo"+"bar"
或的东西"foo"*"bar"
(因此简称为"foo""bar"
)在Mathematica中是完全有效的。但是,它并不真正知道如何处理算术表达式中的字符串,因此这些事情仍未得到评估。尽管Mathematica 确实适用于普遍适用的简化。特别是,字符串将按规范顺序排序(一旦开始对包含各种大小写字母,数字和非字母的字符串进行排序,在Mathematica中就相当混乱了),这通常是一个大问题,但在这里并不重要。此外,"abc""abc"
将简化为"abc"^2
(当您重复字符串时,这是一个问题,但是我们也没有),并且类似的东西"abc"/"abc"
实际上会取消(我们甚至会利用它)。
那么我们要在这里打高尔夫吗?我们需要一个元音列表和辅音列表,因此我们可以提供它们Tuples
以生成所有可能的组合。我的第一种方法是幼稚的解决方案:
Characters@{a="bcdfghjklmnpqrstvwxz",b="aeiouy",a,b,a}
硬编码的辅音列表确实有点痛。Mathematica确实具有Alphabet
内置功能,如果我能够以便宜的方式删除元音,则可以避免使用。这是棘手的地方。删除元素的最简单方法是Complement
,但是使用以下选项之一,最终会变得更长:
{a=Complement[Alphabet[],b=Characters@"aeiouy"],b,a,b,a}
{a=Complement[x=Alphabet[],b=x[[{1,5,9,15,21,25}]]],b,a,b,a}
(请注意Characters
,由于Alphabet[]
给出的是字母列表,而不是字符串,因此我们不再需要将其应用于整个内容。)
因此,让我们尝试一下算术业务。如果我们将整个字母表示为字母的乘积而不是列表,那么由于取消规则,我们可以通过简单的除法来删除字母。这样可以节省很多字节,因为我们不需要Complement
。此外,"a""e""i""o""u""y"
实际上比短一个字节Characters@"aeiouy"
。因此,我们这样做:
a=##/(b="a""e""i""o""u""y")&@@Alphabet[]
我们分别在a
和中存储辅音和元音产品的位置b
。这是通过编写一个函数来实现的,该函数将其所有自变量与乘以##
元音的乘积并相除。此功能适用于字母列表,该列表将每个字母作为单独的参数传递。
到目前为止一切顺利,但现在我们有了
{a=##/(b="a""e""i""o""u""y")&@@Alphabet[],b,a,b,a}
作为的参数Tuples
,这些东西仍然是产品,而不是列表。通常,最短的修复方法是将a List@@@
放在最前面,这会将产品再次变成列表。不幸的是,添加这7个字节使其比幼稚的方法更长。
但是,事实证明,Tuples
根本不关心内部列表的开头。如果你这样做
Tuples[{f[1, 2], f[3, 4]}]
(是的,对于未定义f
。)您将获得:
{{1, 3}, {1, 4}, {2, 3}, {2, 4}}
就像您使用List
而不是一样f
。因此,我们实际上可以直接将这些产品传递给您,Tuples
并仍然获得正确的结果。与使用两个硬编码字符串的天真的方法相比,这节省了5个字节。
现在"a""e""i""o""u""y"
仍然相当烦人。但是,等等,我们也可以在此处保存一些字节!我们函数的参数是单个字母。因此,如果我们只选择正确的参数,则可以重用这些参数,而不是使用字符串常量,因为三个字符串都较短。我们要争论#
(简称#1
)#5
,#9
,#15
,#21
和#25
。如果放在#
最后,那么我们也不需要添加任何东西*
来将它们相乘,因为(regex)#\d+
是一个完整的令牌,不能附加任何非数字。因此,我们最后得到#5#9#15#21#25#
,又节省了4个字节。