找出口味和浇头之间组合的总数

  • 本文关键字:组合 之间 出口 ruby
  • 更新时间 :
  • 英文 :


我正在做一个Ruby测试,要求我找到味道和浇头之间独特组合的总数,但我被一个特定的部分卡住了。其中一条规定是"巧克力片冰淇淋不能在上面放巧克力片"。或者类似的措辞。这不是真正的问题,但我尽了最大努力创造了一个类似的问题。我该如何解决这个问题?

def combinations(flavors, toppings)

end

flavors = ["fudge", "vanilla", "chocolate chip", "cookie dough"] # 11
toppings = ["chocolate chips", "sprinkles", "mint"]

我首先想做一个嵌套循环问题,但我卡住的那部分是"巧克力片"还有"巧克力片";不一样。

考虑一个类似的情况。使用#product查找所有组合,然后使用#reject消除不符合条件的组合。

在下面的例子中,第二个字符串不能包含第一个字符串。如果没有找到子字符串,#index将返回nil

x = ["a", "b", "c"]
y = ["as", "hello", "world"]
x.product(y).reject { |a, b| b.index(a) }
# => [["a", "hello"], ["a", "world"], ["b", "as"], 
#     ["b", "hello"], ["b", "world"], ["c", "as"], 
#     ["c", "hello"], ["c", "world"]]

如果它是一个测试问题,我不想完全给出它,但是在解决编程问题时,像往常一样,一个好的开始是将其分解为更小的步骤。我认为下面的内容应该会给你一个很好的提示。

  1. 定义两种口味相同的含义。是"巧克力片"one_answers"巧克力片"一样吗?(注意"s"是不同的)那"巧克力"呢?冰淇淋加"巧克力片"?一种说法是,如果一种口味是另一种口味的子串,那么两种口味是相等的。另一种稍微难一点的说法是,它们必须完全相同,将复数形式规范化。自己写一个函数,可以接受两种口味,并给出true/false的答案。

提示:如果您使用第一个定义,请查看String上的#include?方法的文档,并记住您可能无法提前知道哪个字符串是另一个字符串的子字符串。

  1. 当从两个数组中各取一个元素时,构建一个包含所有可能对的列表

提示:查看@jvx8ss提到的Array上的#product方法

  1. 根据第1步的定义删除所有元素相等的pair

提示:查看Array上的#reject方法

所有相关文档都可以在https://ruby-doc.org/3.1.3/

找到

以Chris的回答为基础,不仅考虑到第一个字符串不应该包含在第二个字符串中,而且考虑到另一个字符串不应该包含在第二个字符串中。我认为在使用reject进行检查之前先对数组进行排序可能会稍微好一些。

def combinations(flavors, toppings)
flavors.product(toppings).reject do |combo|
first, second = combo.sort
second.include?(first)
end.count
end

flavors = ["fudge", "vanilla", "chocolate chip", "cookie dough"]
toppings = ["chocolate chips", "sprinkles", "mint"]
pp combinations(flavors, toppings) # => 11

最新更新