每种组合都有各种长度的阵列

时间:2013-06-17 11:20:46

标签: ruby arrays combinations

我想要一个数组中的所有组合,也结合大写和全长(两种组合,三种组合等等)。

我的脚本如下:

我的数组

a = ["hello", "my", "world"]

这会为我们的数组添加大写单词,不想重复单词

b = a.map(&:capitalize)

这将单词与大写

组合在一起
c = [[a, b]]

这应该打印我的组合

puts c.first.product(*c[1..-1]).map(&:join)

结果是

hellomyworld

HelloMyWorld

这不是我想要的。我想要

hellomyworld
Hellomyworld
HelloMyworld
HelloMyWorld
helloMyworld
helloMyWorld
hellomyWorld
HellomyWorld

等等。 (不知道我是否错过了一个组合)是否有人有胶水?

2 个答案:

答案 0 :(得分:2)

这可以满足您的要求:

a.map { |word| [word, word.capitalize] }
 .reduce(&:product)
 .map { |sentence| sentence.flatten.join }

首先,我们将单词数组映射到单词对数组:原始单词和大写单词。然后我们通过将先前收集的句子与下一个单词对的乘积减少到句子数组中:这会产生不均匀的数组,如[[“hello”,“my”],“world”]但这不是问题因为在下一步中我们将每个句子展平并连接成一个单独的字符串。我希望这会有所帮助。


编辑:我刚刚意识到您的解决方案几乎也能正常运行:c = [[a, b]]的内容应该让它成为c = a.zip bzip将各个元素相互配对,而[]将给定的数组放入外部数组。

答案 1 :(得分:1)

["hello", "my", "world"]
.map{|w| [w, w.capitalize]}
.tap{|first, *rest| break first.product(*rest).map(&:join)}