数组排列和比较:此数组是否包含任何这些数组?

时间:2012-08-21 20:59:07

标签: ruby arrays permutation

我一直在寻找答案,虽然我发现了一些类似的问题,但我还是无法解决问题。

我正在构建一个Mastermind游戏。现在我正在研究智能计算机猜测的算法。我已经读了很多这个,但作为一个相当新的编程人员,开发这个算法(我使用TDD)是一个挑战。

secret_code = %w(blue blue orange orange)
guess = %w(orange blue red yellow)
valid_colors = %w(blue green orange purple red yellow)
possible_secret_codes = valid_colors.repeated_permutation(4).to_a

我想根据我猜测后收到的反馈(得分)消除尽可能多的possible_secret_codes。

一种可能的方法(简单,尽管不是最有效)是首先关注找到正确的四种颜色,无论位置如何。

score = {exact: 1, close: 1}
total_score = score[:exact] + score[:close]
parts_of_secret_code = guess.repeated_permutation(total_score).to_a.uniq

parts_of_secret_code将返回一个数组数组。我们可以确定密码包括那些阵列的至少一个。我想从possible_secret_codes中删除任何不包含其中一个数组的代码。

使用我提供的示例信息(假设我提供的密码,我提供的猜测,我提供的分数等),这就是parts_of_secret_code:

parts_of_secret_code = [["orange", "orange"],
                        ["orange", "blue"],
                        ["orange", "red"],
                        ["orange", "yellow"],
                        ["blue", "orange"],
                        ["blue", "blue"],
                        ["blue", "red"],
                        ["blue", "yellow"],
                        ["red", "orange"],
                        ["red", "blue"],
                        ["red", "red"],
                        ["red", "yellow"],
                        ["yellow", "orange"],
                        ["yellow", "blue"],
                        ["yellow", "red"],
                        ["yellow", "yellow"]]

我想删除至少没有其中一个数组的代码。这样做会减少通过在有效颜色数组上调用repeated_permutation找到的possible_secret_codes(共1,296个)的原始列表(如上所示):

possible_secret_codes = valid_colors.repeated_permutation(4).to_a

有人能想出办法吗?我已经尝试了很多东西而且无法弄明白。

提前感谢您的帮助,如果我没有提供足够的信息,请告诉我们! (而且我知道标题可能很奇怪......不知道怎么说出来。)

1 个答案:

答案 0 :(得分:0)

“我想删除那些至少没有其中一个数组的代码。”

require 'set' 
possible_secret_codes.select do |ary|
  parts_of_secret_codes.any? {|part| part.to_set.subset? ary.to_set}
end

代码段的作用是select来自possible_secret_codes的满足条件的数组

parts_of_secret_codes.any? {|part| part.to_set.subset? ary.to_set}

条件表达partary的正确子集的事实。