Ruby on rails Ruby查找组合

Ruby on rails Ruby查找组合,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在尝试将输入作为字符串 然后我需要找到所有可能的组合和不同的组合,但我不能这样做 input = "aabb" 输出我需要打印所有组合= 'a','a','b','b','aa','ab','bb','aab','abb','aabb' 现在不同的组合 'a','b','aa','ab','bb','aab','abb','aabb' 然后我要数一数这些字母,然后求和 'a','a','b','b','aa','ab','bb','aab','abb','aabb' 为此 resul

我正在尝试将输入作为字符串

然后我需要找到所有可能的组合和不同的组合,但我不能这样做

input = "aabb"
输出我需要打印所有组合=

'a','a','b','b','aa','ab','bb','aab','abb','aabb'
现在不同的组合

'a','b','aa','ab','bb','aab','abb','aabb'
然后我要数一数这些字母,然后求和

'a','a','b','b','aa','ab','bb','aab','abb','aabb'
为此

result = 1+1+1+1+2+2+2+3+3+4
同样,对于其他组合,我需要求和。

您可以使用

要获取所有组合,请执行以下操作:

input = "aabb"
res = []
input.size.times { |n| res << input.chars.combination(n+1).map { |a| a.join } }
res.flatten
#=> ["a", "a", "b", "b", "aa", "ab", "ab", "ab", "ab", "bb", "aab", "aab", "abb", "abb", "aabb"]
res.flatten.uniq 
#=> ["a", "b", "aa", "ab", "bb", "aab", "abb", "aabb"]
要数一数字母并求和,请执行以下操作:

res.flatten.uniq.map(&:size)
#=> [1, 1, 2, 2, 2, 3, 3, 4]
res.flatten.uniq.map(&:size).reduce(:+)
# => 18
你可以用

要获取所有组合,请执行以下操作:

input = "aabb"
res = []
input.size.times { |n| res << input.chars.combination(n+1).map { |a| a.join } }
res.flatten
#=> ["a", "a", "b", "b", "aa", "ab", "ab", "ab", "ab", "bb", "aab", "aab", "abb", "abb", "aabb"]
res.flatten.uniq 
#=> ["a", "b", "aa", "ab", "bb", "aab", "abb", "aabb"]
要数一数字母并求和,请执行以下操作:

res.flatten.uniq.map(&:size)
#=> [1, 1, 2, 2, 2, 3, 3, 4]
res.flatten.uniq.map(&:size).reduce(:+)
# => 18

要获取
输入的所有子字符串
(或更一般地获取
可枚举的所有子序列
),您可以使用以下方法:

def subsequences(e)
  a = e.to_a
  indices = (0..a.length - 1).to_a
  indices.product(indices)
    .reject { |i, j| i > j }
    .map { |i, j| a[i..j] }
end
您可以在字符串上这样使用:
子序列(input.chars).map(&:join)
chars
join
是必需的,因为
字符串
s不可
枚举
,但是
子序列
函数实际上并不需要它。您可以只取出第一行,它仍然适用于字符串(任何具有“切片”下标运算符的操作,真的…)

还要注意的是,这不是实现这一点的唯一方法。这里的基本问题是迭代序列的所有有序索引对。您也可以使用基本循环来实现这一点。我只是碰巧发现笛卡尔积方法非常优雅

一旦变量中有了第一个列表,比如
list
,第二个任务就和
list.uniq
一样简单,第三个任务由

list.map(&:size).reduce(:+)

要获取
输入的所有子字符串
(或更一般地获取
可枚举的所有子序列
),您可以使用以下方法:

def subsequences(e)
  a = e.to_a
  indices = (0..a.length - 1).to_a
  indices.product(indices)
    .reject { |i, j| i > j }
    .map { |i, j| a[i..j] }
end
您可以在字符串上这样使用:
子序列(input.chars).map(&:join)
chars
join
是必需的,因为
字符串
s不可
枚举
,但是
子序列
函数实际上并不需要它。您可以只取出第一行,它仍然适用于字符串(任何具有“切片”下标运算符的操作,真的…)

还要注意的是,这不是实现这一点的唯一方法。这里的基本问题是迭代序列的所有有序索引对。您也可以使用基本循环来实现这一点。我只是碰巧发现笛卡尔积方法非常优雅

一旦变量中有了第一个列表,比如
list
,第二个任务就和
list.uniq
一样简单,第三个任务由

list.map(&:size).reduce(:+)


如果您想接收任何输入,请向我们展示您已经尝试过的内容。好的,我正在向您展示我的代码更新了我的问题请看这只是一个获取用户输入的代码,它甚至还没有接近设置解决方案。这看起来更像是您遇到的“编码挑战”,现在您正在寻找问题的完整解决方案。另外,请不要发布
我将发布
-
我已经发布了
评论,这是垃圾评论。这不是我在书中读到的编码挑战问题,但我无法解决问题,这就是为什么我在这里发布,如果你能帮我解决问题,那么请做如果你想收到任何意见,请告诉我们您已经尝试了什么。好的,我向您展示了我的代码更新了我的问题,请看这只是一个获取用户输入的代码,它甚至还没有接近设置解决方案。这看起来更像是您遇到的“编码挑战”,现在您正在寻找问题的完整解决方案。另外,请不要发布
我将发布
-
我已经发布了
评论,这不是我在书中读到的一个编码挑战问题,但我无法解决这个问题。这就是为什么我在这里贴了帖子,如果你能帮助我解决这个问题,那么请注意你的独特组合是正确的,但第一个组合不是正确的。使用
平面图
你可以避免需要
展平
。第一个代码片段还生成了“非CNONTIGUAUS组合”,我想这在这里是不需要的<代码>“aabb”
在这里是个坏例子,我想。让我们看看
“1234”
。例如,结果将包含字符串
“124”
。使用
flat\u map
可以避免
展平
。第一个片段还生成了“非CNONTIGUAUS组合”,我认为这里不需要这些组合<代码>“aabb”
在这里是个坏例子,我想。让我们看看
“1234”
。例如,结果将包含字符串
“124”
。一般来说,它可以是混合了
可枚举
的任何东西。最简单的例子是
Array
s,还有
Hash
es,尽管我不认为这对
Hash
;)有用(实际上,它更为通用,Ruby是一种动态类型语言:
e
可以是任何具有
to\u
方法的东西,该方法返回具有可处理范围的下标运算符的东西。)正如我所写的:对于您的用例,它将是
input.chars
。一般来说,它可以是混合了
可枚举
的任何东西。最简单的例子是
Array
s,还有
Hash
es,尽管我不认为这对
Hash
;)有用(实际上,它更为通用,Ruby是一种动态类型语言:
e
可以是任何具有
to\u
方法的东西,该方法返回的东西具有一个可以处理范围的下标运算符。)