0

私はこれで多くの問題を抱えていて、もうすぐ期限が切れます.誰かが私の問題を解決する方法を知っているかどうか疑問に思っていました. プログラムを作成する必要があります。「あなたの仕事は、二分探索の原理に基づいて機能する数値推測器を実装することです。各ステップで、コンピューターはクエリ間隔を半分にカットします。間隔に単一の数値が含まれている場合、それは次のように宣言します。プログラムのユーザーが 1 から 100 までの数字を選択すると、コンピューターはその数字を推測するよう求められます。

サンプル出力は次のようになります。

Is your number greater than 50? (computer is asking this)
no (user responds with yes or no)
Is your number greater than 25?
no
Is your number greater than 13?
no
Is your number greater than 7?
yes
Is your number greater than 10?
yes
Is your number greater than 12?
yes
Is your number 13?
yes
13 is the answer. (computer declares final answer)
Thank you for playing the guessing game.

対照的に、私のサンプル出力は次のようになります。

Is your number greater than 50?
no
Is your number greater than 25?
no
Is your number greater than 13?
no
Is your number greater than 7?
yes
Is your number greater than 10?
yes
Is your number greater than 11?
yes
Is your number greater than 12?
yes
Is your number 12?
yes
12 is the answer.
Thank you for playing the guessing game.

私が行った編集に基づいて、いくつかのバリエーションがあります。

コードは次のとおりです。

//import statements
import java.util.Scanner;
import java.util.ArrayList;
public class Numbers
{


//constant to initialize the ArrayList
private final int AT_MOST = 100;
//anArrayList of type ArrayList<Integer> which is to hold the values from 1 - 100 
private ArrayList<Integer> anArrayList;


/**
 * Constructor of the Numbers() class which initializes all of the instance fields
 */
public Numbers()
{
    anArrayList = new ArrayList<Integer>();
    int i =0;
    //while loop to initialize anArrayList with values from 1-100
    while(i < AT_MOST)
    {
        anArrayList.add(i+1);
        i++;
    }
}

public void search()
{
    int low = 0;
    int high = anArrayList.size();
    int i = 0;
    int j = 0;
    while(low <= high)
    {
        int mid = (low + high)/2;
        mid = anArrayList.get(mid - 1);
        Scanner in = new Scanner(System.in);
        System.out.println("Is your number greater than " + mid + "?");
        String answer = in.nextLine();
        if(answer.equalsIgnoreCase("yes"))
        {

            low = mid + 1;

        }
        else if (answer.equalsIgnoreCase("no"))
        {

            high = mid - 1;
            low++;
        }
        if(low == high+1)
        {
            Scanner in2 = new Scanner(System.in);
            System.out.println("Is your number " + mid + "?");
            String finalAnswer = in2.nextLine();
            if(finalAnswer.equalsIgnoreCase("yes"))
            {
                System.out.println(mid + " is the answer.");
                System.out.println("Thank you for playing the guessing game.");
                low = high + 1;;
            }
            else
            {
                System.out.println("Please play again, something went wrong!");
                low = high + 1;
            }
        }
    }
}
}

もちろん、これには比較的短いテスタークラスもあります。

 public class NumbersGuesser
 {
  public static void main(String[] args)
   {
    //creates a new numbers object
    Numbers newNumber = new Numbers();
    //run method is called, game is played.
    newNumber.search();
    }
}
4

1 に答える 1

0

あなたが問題を解決するために努力したので、私は先に進み、あなたの Numbers クラスを再構築しました。

私が最初にしたことは、ArrayList を取り除くことでした。ArrayList をトラバースするのと同じくらい簡単に、整数の算術演算を行うことができます。

いくつかの整数、距離、方向を追加しました。各推測の後、距離は半分にカットされます。コンピューターは、距離がゼロになるまで高低を推測します。その時点で、数値は低い値と高い値の間のどこかにあります。

方向は、次の推測のために、より低い (-1) またはより高い (+1) を推測する必要があるかどうかを示しているだけです。

ハイロースキャナーコードを独自のメソッドに取り込みました。最初は紛らわしいように見えますが、それは、より高い (真) またはより低い (偽) を推測するかどうかを教えてくれるだけです。このコードを独自のメソッドに移動することで、推測ロジックに集中できました。

最後に、処理の最後にスキャナーを閉じました。

//import statements
import java.util.Scanner;

public class Numbers {

    // constants to start the game
    private final int AT_LEAST = 0;
    private final int AT_MOST = 100;

    /**
     * Constructor of the Numbers() class
     */
    public Numbers() {

    }

    public void search() {
        int low = AT_LEAST;
        int high = AT_MOST;
        int guess = (low + high) / 2;
        int distance = guess / 2;
        int direction = 1;

        System.out.println("Guess a number between " + low + " and " + high
                + ".");

        Scanner in = new Scanner(System.in);

        do {
            boolean greaterThan = getHighLowResponse(in, direction, guess);
            if (greaterThan) {
                low = guess;
                guess += distance;
                direction = 1;

            } else {
                high = guess;
                guess -= distance;
                direction = -1;
            }
            distance /= 2;
        } while (distance != 0);

        for (int i = low; i <= high; i++) {
            System.out.println("Is your number " + i + "?");
            String finalAnswer = in.nextLine().toLowerCase();
            if (finalAnswer.equalsIgnoreCase("yes")) {
                System.out.println(i + " is the answer.");
                System.out.println("Thank you for playing the guessing game.");
                break;
            }
        }

        in.close();

    }

    private boolean getHighLowResponse(Scanner in, int direction, int guess) {
        do {
            System.out.println("Is your number " + getDirection(direction)
                    + " than " + guess + "?");
            String answer = in.nextLine().toLowerCase();
            if (direction < 0) {
                if (answer.equals("yes"))
                    return false;
                if (answer.equals("no"))
                    return true;
            } else {
                if (answer.equals("yes"))
                    return true;
                if (answer.equals("no"))
                    return false;
            }
        } while (true);
    }

    private String getDirection(int direction) {
        if (direction < 0) {
            return "less";
        } else {
            return "greater";
        }
    }
}
于 2013-03-28T02:03:54.043 に答える