1

私はこれに対する答えをSO全体で探しました、そして私はいくつかの同様の問題を見つけましたが、私は自分の問題を解決することができませんでした。

私はマスターマインドゲームを構築しています。現在、私はインテリジェントなコンピューター推測のアルゴリズムに取り組んでいます。私はこれについてたくさん読んだことがありますが、プログラミングにかなり慣れていない人として、このアルゴリズムを開発することは少し挑戦的でした(私は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を削除したいと思います。

考えられるアプローチの1つ(最も効率的ではありませんが、単純です)は、場所に関係なく、最初に正しい4色を見つけることに焦点を当てることです。

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は、配列の配列を返します。シークレットコードには、これらの配列の少なくとも1つが含まれていることを確認できます。これらの配列の少なくとも1つを含まないコードを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"]]

それらの配列の少なくとも1つを持たないコードを排除したいと思います。これを行うと、有効な色の配列でrepated_permutationを呼び出すことによって検出されたpossible_secret_codesの元のリスト(合計1,296)が削減されます(上記で示したように)。

possible_secret_codes = valid_colors.repeated_permutation(4).to_a

誰かがそれを行う方法を考えることができますか?私はたくさんのことを試しましたが、それを理解することができませんでした。

事前に助けてくれてありがとう、そして私が十分な情報を提供しなかったなら私に知らせてください!(そして、タイトルが奇妙かもしれないことを私は知っています...それをどのように表現するかがわかりませんでした。)

4

1 に答える 1

0

「これらの配列の少なくとも1つを持たないコードを排除したい。」

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}

part条件は、がの適切なサブセットであるという事実を表しaryます。

于 2012-08-22T16:51:12.457 に答える