1111 から 8888 までの値を持つ配列を作成する方法を考えています。各桁が 1 ~ 8 の範囲の 4 桁の数字のリストを生成する必要があるため、これを求めています。これをループ形式にしたいと思います。また、次のプログラムでは、関数のトリム、methodicalEliminate、guessAndEliminate、およびguessThreeThenEliminateで迷っています。道順は次のとおりです。
この割り当ては、関数へのパラメーターとして配列を使用するなど、プログラムでの配列の使用に焦点を当てています。
問題の説明 Mastermind のゲームでは、隠された組み合わせ (12 個の推測など) を特定するために、限られた数の推測しかプレイヤーに与えられません。多くの場合、それがゲームをプレイする上での唯一の制約です。しかし、一部のプレーヤーは、より少ない試行回数で相手の組み合わせを推測できるかどうかを競う場合があります。この場合、問題は、指定された制限内で答えを見つけることができる戦略を考え出すことだけでなく、最小数の推測を必要とする可能性が高い戦略を見つけることです.
ここでコンピューターの出番です。さまざまな推測戦略を試すプログラムを作成し、それらがどのように機能するかを確認できます。コンピューターは分析と計算を人間よりも迅速に行うことができるため、私たちが選択した戦略を使用して、私たちに代わってマスターマインドをプレイするふりをして、それを行うのにかかった時間を教えてくれる可能性があります.
全体的な解決策
もちろん、コンピュータに人間と同じように推論するように教えることは非常に難しいでしょう。たとえば、組み合わせ 1111 を推測し、1 つの黒のペグを取得した場合、答えには 1 が 1 つだけ含まれていることを心に留めてから、その 1 つの事実を念頭に置いて別の推測を行います。次に 1222 を推測し、1 つの白いペグを取得した場合、2 はなく、単一の 1 が最初の位置にないことがわかります。しかし、一連の推測の後でそのような情報を追跡する方法はかなり難しいでしょう。
幸いなことに、配列を使用したコンピューター シミュレーションでは、既知の事実をすべて別の方法で記録できます。考えられるすべての可能な答えのリストを維持し、リストから解ではなくなった数字を削除します。最初の推測で 1 桁が 1 つだけあることがわかった場合、その機能を持たないすべての数字を削除します。2 がないことがわかったら、2 を含むすべての値を削除します。最終的に残った数だけが正解となります。
いくつかの簡単な戦略
これは、多くのプレイヤーが使用する戦略であり、上で説明したものに似ています。単純な方法で系統的に可能性を調べただけです。1111 という最初の推測は、解に含まれる 1 の数を答えます。次の推測では、解に含まれる 2 の数がわかり、1 がどこにあるかなどもわかります。1111、1112、1113、1114 などの順序で多数の可能性を含むリスト アプローチでは、次の推測は常にリストの最初になります。
次の戦略は、もう少し興奮したい人向けです。より多くの情報が発見されることを期待して、推測は多かれ少なかれランダムに見えます。このアプローチのシミュレーションは驚くほど簡単です。数値のリストがある場合は、ランダムに 1 つを選択するだけです。配列から選択できる可能性が 837 ある場合は、0 から 836 の範囲でランダムな添字を選択するだけです。
この 3 番目の戦略は、与えられた推測に対して同様の結果を与える回答が、ある意味で互いに類似している可能性を考慮します。したがって、もう少し情報を取得しようとすると、評価方法に関係なくランダムにいくつかの数値を選択し、結果についてのみ考え始めます。これを実装するには、考えられる答えを 3 つ選んで推測してみましょう。一時的に、黒のペグと白のペグの数は無視します。これらの推測を行った後でのみ、可能性のリストを削除し、上記の 2 番目の戦略に進みます。
サンプル インターフェイス これらは、現在の実装からのサンプル結果です: 試す組み合わせを入力するか、ランダムな値の場合は 0 を入力してください: 0 2475 で推測
Guessing 1111...
Guessing 2222...
Guessing 2333...
Guessing 2444...
Guessing 2455...
Guessing 2456...
Guessing 2475...
必要な 7 回の試行を排除します。
Guessing 6452...
Guessing 2416...
Guessing 2485...
Guessing 2445...
Guessing 2435...
Guessing 2425...
Guessing 2475...
必要な7回の試行を推測して排除します。
Guessing 7872...
Guessing 6472...
Guessing 1784...
Guessing 2475...
3 つ当ててから、必要な 4 回の試行をなくします。
別のゲームをプレイしますか?(y/n) y 試行する組み合わせを入力するか、ランダム値の場合は 0 を入力してください: 0 4474 で推測
Guessing 1111...
Guessing 2222...
Guessing 3333...
Guessing 4444...
Guessing 4445...
Guessing 4464...
Guessing 4474...
必要な 7 回の試行を排除します。
Guessing 3585...
Guessing 7162...
Guessing 4474...
必要な3回の試行を推測して排除します。
Guessing 8587...
Guessing 1342...
Guessing 1555...
Guessing 7464...
Guessing 6764...
Guessing 4468...
Guessing 4474...
3 つ当ててから、必要な 7 回の試行をなくします。注: このプログラムでは、各桁を 6 ではなく 8 まで上げることができます。4096 の可能な答えがありますが、それでもかなり迅速にそれらを見つけます。
プログラムの仕様 割り当てられたプログラムは、次のすべての機能を実装する必要があります。追加のものは必要に応じて許可されます。以下は必須です。今後の課題では、以下のような関数の詳細は示されませんが、プログラムを作成する前に、学生は独自の関数記述を設計する必要があります。main: プログラムの全体的な動作を単に管理します。ターゲットの組み合わせとして数字が選択され、各戦略がそれを見つけようとします。呼び出し: generateAnswer、(3 つすべてを比較するには、同じ答えが必要です) methodicalEliminate、guessAndEliminate、guessThreeThenEliminate
generateAnswer: ユーザーがキーボードで謎の組み合わせを選択できるようにするか、コンピューターにランダムな組み合わせを生成させるオプションを提供します。(競争力のあるゲームでは、どのような組み合わせが最も推測しにくいかを知ることは興味深いかもしれません!) パラメータ: なし! 戻り値: 4 桁の組み合わせ、各桁は 1 から 8 の範囲
generateSearchSpace: 1 ~ 8 の範囲の 4 桁の値のすべての可能な組み合わせを配列に取り込みます。 パラメータ: 推測 (変更された int 配列) 推測のリスト 長さ (出力 int) リスト内の値の数4096 個以上の要素に割り当てられます。
trim : 特定の推測に対する応答を分析し、可能な回答でなくなった可能性のある値をリストから削除します。いずれの場合も、リスト内の値が答えであると想定し、それに応じて推測を評価します。黒ペグと白ペグの本数が規定数と異なる場合は不正解となります。 パラメータ: 推測 (変更された int 配列) 推測のリスト 長さ (変更された int) リスト内の値の数 推測 (入力 int) 評価された推測 黒 (入力 int) 獲得した白を推測する黒のペグの数 (入力 int) 方法獲得したと推測する多くの白いペグ 前提条件: 黒と白には実際に、推測と実際の回答を比較した結果が含まれて います呼び出し: 評価
methodicalEliminate : 可能性のあるすべての回答候補のリストから始めて、リストの最初の要素を継続的に推測し、回答が見つかるまでそれに応じて回答をトリミングします。 パラメータ: answer (input int) 実際の回答 (黒/白ペグを取得するために必要) : 答えを見つけるために必要な推測の回数 呼び出し: generateSearchSpace、evaluate、trim
gusssAndEliminate : 可能性のあるすべての回答候補のリストから始めて、リスト内のランダムな要素を継続的に推測し、回答が見つかるまでそれに応じて回答をトリミングします。 パラメータ: answer (input int) 実際の回答 戻り値: 回答を見つけるために必要な推測の数呼び出し: generateSearchSpace、評価、トリム
gusssThreeThenEliminate : 可能性のあるすべての回答候補のリストから始めて、最初に 3 つの回答をランダムに推測してから、可能性のリストをトリミングします。次に、一度に 1 つのランダムな推測で回答を絞り込みます パラメータ: 回答 (int を入力) 実際の回答 戻り値: の数答えを見つけるために必要な推測 呼び出し: generateSearchSpace、evaluate、trim
注: これらの最後の関数は、正解を使用して各推測を評価し、推測戦略に黒/白ペグを使用します。なし これらの戦略の 1 つは、次に何をすべきかを決定するために答えをのぞく可能性があります。
また、次の機能は、以前の課題からこのプログラムにも表示されるはずですが、それら自体はこの課題の成績の一部ではありません.
評価: 組み合わせを答えと比較して評価します 正しさは黒いペグ (正しい位置にある正しい数字) と白いペグ (間違った位置にある正しい数字) で示されます パラメータ: answer (input int) 正しい組み合わせ 推測 (input int) the現在の推測値 black (output int) 黒色のペグの数 white (output int) 白色のペグの数 前提条件: 答えと推測はどちらも 0 桁のない 4 桁の数 事後条件: 黒と白は両方とも > 0 であり、合計は <= 4 呼び出し: nthDigit、clearNthDigit
nthDigit: 桁数が左から右または右から左のいずれであるかが指定されていない、組み合わせの n 番目の桁を識別します パラメータ: 組み合わせ (input int) 位置を調べる組み合わせ (input int) 調べる桁 (返される) (output int)実際の桁の値 事前条件: 組み合わせに適切な桁数があり、かつ 0 < 位置 <= 桁数 事後条件: 0 <= 返される桁 <= 9 (1 桁)
clearNthDigit: 組み合わせの n 番目の桁をゼロにするため、桁が一致しなくなり、上記の nthDigit と同じ方法でカウントする必要があります。パラメータ: 組み合わせ (in/out int) 位置を変更する組み合わせ (input int) どの桁を 0 に設定するか 前提条件: 上記の nthDigit と同じ 事後条件: 対応する桁をゼロに設定する 呼び出し: nthDigit (オプション、場合によっては実装について)
このような長い質問を読んでいただきありがとうございます。配列について教えていただければ幸いです。