【问题标题】:Array permutations and comparisons: Does this array contain any of these arrays?数组排列和比较:这个数组是否包含这些数组中的任何一个?
【发布时间】:2012-08-21 20:59:06
【问题描述】:

我已经到处寻找答案,虽然我发现了一些类似的问题,但我一直无法解决我的问题。

我正在开发一个 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

我想根据猜测后收到的反馈(分数)尽可能多地消除可能的_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"]]

我想消除至少没有这些数组之一的代码。这样做将减少通过在有效颜色数组上调用重复排列找到的可能_secret_codes 的原始列表(总共 1,296 个)(如上所示):

possible_secret_codes = valid_colors.repeated_permutation(4).to_a

谁能想到办法做到这一点?我已经尝试了很多东西,但无法弄清楚。

提前感谢您的帮助,如果我没有提供足够的信息,请告诉我! (而且我知道这个标题可能很奇怪......不知道如何措辞。)

【问题讨论】:

    标签: ruby arrays permutation


    【解决方案1】:

    “我想消除至少没有这些数组之一的代码。”

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

    sn-p 代码所做的是select 来自possible_secret_codes 的满足条件的数组

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

    条件表示partary 的真子集。

    【讨论】:

    • 这不太行。例如,假设 possible_secret_codes 是:[%w(blue red orange orange), %w(red orange blue yellow), %w(yellow purple yellow yellow)] 而parts_of_secret_codes 是:[%w(orange red), %w(blue yellow), %w(purple orange)] 您的代码应该选择(或保留)possible_secret_codes%w(blue red orange orange)%w(red orange blue yellow) 中的两个然而,实际上只保留这个:%w(red orange blue yellow) 它错误地拒绝了%w(blue red orange orange) *注意:我无法让换行符工作。
    • 更新了我的答案以使用 Ruby std-lib 中可用的 Set 类。我试图模仿子集?使用 (ary & part) == part 的行为,但如果交集的元素顺序错误,它将不起作用。 HTH。
    • 这个问题也可能有帮助:stackoverflow.com/questions/7387937/…
    • 啊,好的。几个小时前我也刚刚发现了“设置”。我无法找到不需要“设置”的方法。
    • 如果我写(part & ary) == part 而不是(ary & part) == part,之前的解决方案会起作用。Array#& 方法在结果中保留其接收者的元素顺序。
    猜你喜欢
    • 2019-08-12
    • 2018-03-17
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2013-05-17
    • 2023-03-08
    相关资源
    最近更新 更多