ruby 查找风味和配料之间的组合总数

ibrsph3r  于 2022-12-22  发布在  Ruby
关注(0)|答案(3)|浏览(105)

我在Ruby中做了一个测验,要求我找出口味和配料之间的独特组合的总数,但我被困在了一个特定的部分。其中一个规则是“巧克力片冰淇淋不能有巧克力片配料”或类似的措辞。这不是确切的问题,但我尽了最大努力创造了一个类似的问题。我该如何解决这个问题?

def combinations(flavors, toppings)
  
end

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

我首先想到的是做一个嵌套循环的问题,但是我被困在了巧克力片和巧克力片是不一样的。

vfh0ocws

vfh0ocws1#

考虑类似的情况,使用#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"]]
kqqjbcuj

kqqjbcuj2#

如果这是一个测验题,我不想把它完全泄露出去,但是在解决编程问题时,一个好的开始是把它分解成更小的步骤。我认为下面的内容应该会给你一个很好的提示。
1.定义两种口味相同的含义。“巧克力片”和“巧克力片”是一样的吗?(注意"s"是不同的)“巧克力”冰淇淋加“巧克力片”怎么样?一种方法是说,如果一种是另一种的子串,那么两种口味是相等的。另一种稍微难一点的方法是说,它们必须完全相同,把复数形式规范化。给自己写一个可以接受两种口味的函数,然后给予你一个true/false的答案。
提示:如果您使用第一个定义,请查看String#include?方法的文档,并记住您可能事先不知道哪个字符串是另一个字符串的子字符串。
1.当从两个数组中的每一个取一个元素时,构建所有可能对的列表。
提示:查看@jvx8ss中提到的Array上的#product方法。
1.根据步骤1中的定义,删除两个元素相等的所有对。
提示:查看Array上的#reject方法。
所有相关文档均可在https://ruby-doc.org/3.1.3/中找到

yc0p9oo0

yc0p9oo03#

根据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

相关问题